ncurses-6.4-20240113/0000755000000000000000000000000014550614020012432 5ustar rootrootncurses-6.4-20240113/Ada95/0000755000000000000000000000000014546070641013307 5ustar rootrootncurses-6.4-20240113/Ada95/make-tar.sh0000755000000000000000000001310514331543665015352 0ustar rootroot#!/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 ncurses-6.4-20240113/Ada95/configure.in0000644000000000000000000004572414374256571015643 0ustar rootrootdnl*************************************************************************** dnl Copyright 2018-2022,2023 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.91 2023/02/18 23:21:29 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.91 $) AC_INIT(gen/gen.c) AC_CONFIG_HEADER(include/ncurses_cfg.h:include/ncurses_cfg.hin) AC_DEFUN([AC_PATH_XTRA],[])dnl ignore dependencies on this PACKAGE="AdaCurses" AC_SUBST(PACKAGE) CF_TOP_BUILDDIR CF_HELP_MESSAGE(General Options:) CF_WITH_SYSTYPE ### Save the given $CFLAGS to allow user-override. cf_user_CFLAGS="$CFLAGS" ### Default install-location CF_CFG_DEFAULTS ### Checks for programs. CF_PROG_CC(gnatgcc gcc cc) AC_PROG_CPP AC_PROG_GCC_TRADITIONAL CF_PROG_CC_C_O(CC,[$CFLAGS $CPPFLAGS]) AC_ARG_PROGRAM CF_PROG_AWK CF_PROG_EGREP AC_PROG_INSTALL CF_PROG_LN_S CF_PROG_INSTALL CF_INSTALL_OPTS AC_SYS_LONG_FILE_NAMES # if we find pkg-config, check if we should install the ".pc" files. CF_PKG_CONFIG CF_WITH_PKG_CONFIG_LIBDIR AC_MSG_CHECKING(if you want to build test-programs) AC_ARG_WITH(tests, [ --without-tests suppress build with test-programs], [cf_with_tests=$withval], [cf_with_tests=yes]) AC_MSG_RESULT($cf_with_tests) AC_MSG_CHECKING(if we should assume mixed-case filenames) AC_ARG_ENABLE(mixed-case, [ --enable-mixed-case tic should assume mixed-case filenames], [enable_mixedcase=$enableval], [enable_mixedcase=auto]) AC_MSG_RESULT($enable_mixedcase) if test "$enable_mixedcase" = "auto" ; then CF_MIXEDCASE_FILENAMES else cf_cv_mixedcase=$enable_mixedcase if test "$enable_mixedcase" = "yes" ; then AC_DEFINE(MIXEDCASE_FILENAMES) fi fi # do this after mixed-case option (tags/TAGS is not as important as tic). AC_PROG_MAKE_SET CF_MAKE_PHONY CF_MAKE_TAGS CF_MAKEFLAGS dnl These are standard among *NIX systems, but not when cross-compiling AC_CHECK_TOOL(RANLIB, ranlib, ':') AC_CHECK_TOOL(LD, ld, ld) AC_CHECK_TOOL(AR, ar, ar) CF_AR_FLAGS CF_PATHSEP dnl Special option for use by system-builders: the install-prefix is used to dnl adjust the location into which the actual install is done, so that an dnl archive can be built without modifying the host system's configuration. AC_MSG_CHECKING(if you have specified an install-prefix) AC_ARG_WITH(install-prefix, [ --with-install-prefix prefixes actual install-location ($DESTDIR)], [case "$withval" in (yes|no) ;; (*) DESTDIR="$withval" ;; esac]) AC_MSG_RESULT($DESTDIR) AC_SUBST(DESTDIR) ############################################################################### CF_HELP_MESSAGE(Build-Tools Needed to Compile Temporary Applications for Cross-compiling:) # If we're cross-compiling, allow the user to override the tools and their # options. The configure script is oriented toward identifying the host # compiler, etc., but we need a build compiler to generate parts of the source. CF_BUILD_CC ############################################################################### CF_HELP_MESSAGE(Options to Specify the Libraries Built/Used:) ### Options to allow the user to specify the set of libraries which are used. ### Use "--without-normal --with-shared" to allow the default model to be ### shared, for example. cf_list_models="" AC_MSG_CHECKING(if you want to build shared C-objects) AC_ARG_WITH(shared, [ --with-shared generate shared C-objects (needed for --with-ada-sharedlib)], [with_shared=$withval], [with_shared=no]) AC_MSG_RESULT($with_shared) test "$with_shared" = "yes" && cf_list_models="$cf_list_models shared" AC_MSG_CHECKING(for specified models) test -z "$cf_list_models" && cf_list_models=normal AC_MSG_RESULT($cf_list_models) ### Use the first model as the default, and save its suffix for use in building ### up test-applications. AC_MSG_CHECKING(for default model) DFT_LWR_MODEL=`echo "$cf_list_models" | $AWK '{print $1}'` AC_MSG_RESULT($DFT_LWR_MODEL) CF_UPPER(DFT_UPR_MODEL,$DFT_LWR_MODEL)dnl AC_SUBST(DFT_LWR_MODEL)dnl the default model ("normal") AC_SUBST(DFT_UPR_MODEL)dnl the default model ("NORMAL") CF_NCURSES_ADDON CF_WITH_LIB_PREFIX(cf_prefix) LIB_SUFFIX= AC_SUBST(LIB_SUFFIX) ############################################################################### dnl Not all ports of gcc support the -g option if test X"$CC_G_OPT" = X"" ; then CC_G_OPT='-g' test -n "$GCC" && test "${ac_cv_prog_cc_g}" != yes && CC_G_OPT='' fi AC_SUBST(CC_G_OPT) AC_MSG_CHECKING(for default loader flags) case $DFT_LWR_MODEL in (normal) LD_MODEL='' ;; (debug) LD_MODEL=$CC_G_OPT ;; (profile) LD_MODEL='-pg';; (shared) LD_MODEL='' ;; esac AC_SUBST(LD_MODEL)dnl the type of link (e.g., -g or -pg) AC_MSG_RESULT($LD_MODEL) CF_SHARED_OPTS # The test/sample programs in the original tree link using rpath option. # Make it optional for packagers. if test -n "$LOCAL_LDFLAGS" then AC_MSG_CHECKING(if you want to link sample programs with rpath option) AC_ARG_ENABLE(rpath-link, [ --enable-rpath-link link sample programs with rpath option], [with_rpath_link=$enableval], [with_rpath_link=yes]) AC_MSG_RESULT($with_rpath_link) if test "$with_rpath_link" = no then LOCAL_LDFLAGS= LOCAL_LDFLAGS2= fi fi ############################################################################### CF_HELP_MESSAGE(Fine-Tuning Your Configuration:) ### use option --enable-broken-linker to force on use of broken-linker support CF_ENABLE_BROKEN_LINKER # Check to define _XOPEN_SOURCE "automatically" CF_XOPEN_SOURCE(600) 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 CF_ADD_CFLAGS(-DTRACE) else ADA_TRACE=FALSE fi AC_SUBST(ADA_TRACE) CF_DISABLE_GNAT_PROJECTS ### Checks for libraries. case $cf_cv_system_name in (*mingw32*) CF_CHECK_LIBSSP ;; (*) 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 CF_PROG_GNAT if test "$cf_cv_prog_gnat_correct" = yes; then CF_FIXUP_ADAFLAGS CF_GNATPREP_OPT_T CF_GNAT_GENERICS CF_GNAT_SIGINT CF_GNAT_PROJECTS CF_WITH_ADA_COMPILER cf_ada_package=terminal_interface AC_SUBST(cf_ada_package) CF_WITH_ADA_INCLUDE CF_WITH_ADA_OBJECTS CF_WITH_ADA_SHAREDLIB # allow the Ada binding to be renamed CF_WITH_ADA_LIBNAME(AdaCurses) else AC_MSG_ERROR(No usable Ada compiler found) fi else AC_MSG_ERROR(The Ada compiler is needed for this package) fi ################################################################################ # not needed TINFO_LDFLAGS2= AC_SUBST(TINFO_LDFLAGS2) TINFO_LIBS= AC_SUBST(TINFO_LIBS) ### Construct the list of include-directories to be generated CF_INCLUDE_DIRS CF_ADA_INCLUDE_DIRS ### Build up pieces for makefile rules AC_MSG_CHECKING(default library suffix) CF_LIB_TYPE($DFT_LWR_MODEL,DFT_ARG_SUFFIX)dnl AC_SUBST(DFT_ARG_SUFFIX)dnl the string to append to "-lncurses" ("") AC_MSG_RESULT($DFT_ARG_SUFFIX) AC_MSG_CHECKING(default library-dependency suffix) CF_LIB_SUFFIX($DFT_LWR_MODEL,DFT_LIB_SUFFIX,DFT_DEP_SUFFIX)dnl AC_SUBST(DFT_DEP_SUFFIX)dnl the corresponding library-suffix (".a") AC_MSG_RESULT($DFT_DEP_SUFFIX) AC_MSG_CHECKING(default object directory) CF_OBJ_SUBDIR($DFT_LWR_MODEL,DFT_OBJ_SUBDIR)dnl AC_SUBST(DFT_OBJ_SUBDIR)dnl the default object-directory ("obj") AC_MSG_RESULT($DFT_OBJ_SUBDIR) ### Set up low-level terminfo dependencies for makefiles. if test "$DFT_LWR_MODEL" = shared ; then case $cf_cv_system_name in (cygwin*) # "lib" files have ".dll.a" suffix, "cyg" files have ".dll" ;; (msys*) # "lib" files have ".dll.a" suffix, "msys-" files have ".dll" ;; esac fi USE_ARG_SUFFIX=${DFT_ARG_SUFFIX} AC_SUBST(USE_ARG_SUFFIX) USE_LIB_SUFFIX=${DFT_ARG_SUFFIX} AC_SUBST(USE_LIB_SUFFIX) USE_CFG_SUFFIX=${DFT_ARG_SUFFIX} AC_SUBST(USE_CFG_SUFFIX) ### Construct the list of subdirectories for which we'll customize makefiles ### with the appropriate compile-rules. SUB_MAKEFILES="gen/adacurses${USE_ARG_SUFFIX}-config:gen/adacurses-config.in" AC_DEFINE_UNQUOTED(NCURSES_PATHSEP,'$PATH_SEPARATOR',[Define to override ':' as the library path-separator]) ################################################################################ TEST_ARG2= AC_SUBST(TEST_ARG2) TEST_LIBS2= AC_SUBST(TEST_LIBS2) dnl for separate build, this is good enough for "sh $(top_srcdir)/misc/shlib" NCURSES_SHLIB2="sh -c" AC_SUBST(NCURSES_SHLIB2) ADA_SUBDIRS="include gen src doc" if test "x$cf_with_tests" != "xno" ; then ADA_SUBDIRS="$ADA_SUBDIRS samples" fi for cf_dir in $ADA_SUBDIRS do SUB_MAKEFILES="$SUB_MAKEFILES $cf_dir/Makefile" done AC_SUBST(ADA_SUBDIRS) NCURSES_TREE="#" AC_SUBST(NCURSES_TREE) EXTERNAL_TREE= AC_SUBST(EXTERNAL_TREE) # match layout used by make-tar.sh ADAHTML_DIR=../doc/ada AC_SUBST(ADAHTML_DIR) if test "x$cross_compiling" = xyes ; then ADAGEN_LDFLAGS='$(CROSS_LDFLAGS)' else ADAGEN_LDFLAGS='$(NATIVE_LDFLAGS)' fi AC_SUBST(ADAGEN_LDFLAGS) AC_OUTPUT( \ $SUB_MAKEFILES \ src/library.gpr:src/library.gpr.in \ doc/adacurses${DFT_ARG_SUFFIX}-config.1:doc/MKada_config.in \ Makefile,[ $AWK -v PACKAGE=$PACKAGE -f $srcdir/mk-pkg.awk > 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 ncurses-6.4-20240113/Ada95/mk-1st.awk0000644000000000000000000000674013615656212015136 0ustar rootroot# $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 "" } ncurses-6.4-20240113/Ada95/doc/0000755000000000000000000000000014070103035014036 5ustar rootrootncurses-6.4-20240113/Ada95/doc/Makefile.in0000644000000000000000000000740414070103035016110 0ustar rootroot# $Id: Makefile.in,v 1.9 2021/07/03 15:45:33 tom Exp $ ############################################################################## # Copyright 2019-2020,2021 Thomas E. Dickey # # Copyright 2011-2015,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey # # Makefile for AdaCurses manual pages. SHELL = @SHELL@ VPATH = @srcdir@ DESTDIR = @DESTDIR@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ mandir = @mandir@ INSTALL = @INSTALL@ @INSTALL_OPT_O@ INSTALL_DATA = @INSTALL_DATA@ DFT_ARG_SUFFIX = @DFT_ARG_SUFFIX@ THIS = @ADA_LIBNAME@ DOCDIR = $(DESTDIR)$(datadir)/doc/$(THIS) MANDIR = $(DESTDIR)$(mandir)/man1 ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : check @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.html @MAKE_PHONY@.PHONY : install.man @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : lint @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.html @MAKE_PHONY@.PHONY : uninstall.man all \ sources \ tags : $(DOCDIR) \ $(MANDIR) : mkdir -p $@ install install.man : $(MANDIR) $(INSTALL_DATA) adacurses${DFT_ARG_SUFFIX}-config.1 $(MANDIR) uninstall uninstall.man : -rm -f $(MANDIR)/adacurses${DFT_ARG_SUFFIX}-config.1 # HTML documentation is optional, usually in a separate package. install.html : $(DOCDIR) ( cd $(srcdir) && tar -cf - *.htm* ada | tar -C $(DOCDIR) -xf - ) uninstall.html : -rm -rf $(DOCDIR) mostlyclean : -rm -f core tags TAGS *~ *.bak *.ln *.atac trace clean: mostlyclean distclean realclean: clean -rm -f Makefile *-config.1 ncurses-6.4-20240113/Ada95/mk-pkg.awk0000644000000000000000000001026614347451636015214 0ustar rootroot# $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 $@" } ncurses-6.4-20240113/Ada95/TODO0000644000000000000000000000612314114005471013767 0ustar rootroot------------------------------------------------------------------------------- -- 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. ncurses-6.4-20240113/Ada95/package/0000755000000000000000000000000014546070641014702 5ustar rootrootncurses-6.4-20240113/Ada95/package/debian/0000755000000000000000000000000014546070641016124 5ustar rootrootncurses-6.4-20240113/Ada95/package/debian/copyright0000644000000000000000000000736614546070641020073 0ustar rootrootUpstream 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 ncurses-6.4-20240113/Ada95/package/debian/docs0000644000000000000000000000000711411671635016772 0ustar rootrootREADME ncurses-6.4-20240113/Ada95/package/debian/compat0000644000000000000000000000000314336245005017316 0ustar rootroot12 ncurses-6.4-20240113/Ada95/package/debian/rules0000755000000000000000000000455514347452756017227 0ustar rootroot#!/usr/bin/make -f # MAde with the aid of dh_make, by Craig Small # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. # Some lines taken from debmake, by Cristoph Lameter. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) TARGET_DIR = $(CURDIR)/debian/adacurses SAMPLE_DIR = $(TARGET_DIR)/usr/libexec/AdaCurses CFLAGS = $(shell dpkg-buildflags --get CFLAGS) $(CC_NORMAL) CPPFLAGS = $(shell dpkg-buildflags --get CPPFLAGS) LDFLAGS = $(shell dpkg-buildflags --get LDFLAGS) ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif configure: configure-stamp configure-stamp: dh_testdir CFLAGS="$(CFLAGS)" \ CPPFLAGS="$(CPPFLAGS)" \ LDFLAGS="$(LDFLAGS)" ./configure \ --host=$(DEB_HOST_GNU_TYPE) \ --build=$(DEB_BUILD_GNU_TYPE) \ --prefix=/usr \ --disable-rpath-link \ --with-shared \ --with-ada-sharedlib \ --without-pkg-config touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir $(MAKE) touch build-stamp clean: dh_testdir dh_testroot [ ! -f makefile ] || $(MAKE) distclean rm -f configure-stamp build-stamp install-stamp dh_clean install: install-stamp install-stamp: build-stamp dh_testdir dh_testroot dh_prep dh_installdirs $(MAKE) install DESTDIR=$(TARGET_DIR) # FIXME: it would be nice to make these into separate packages ( cd samples && $(MAKE) install.examples DESTDIR=$(TARGET_DIR) BINDIR=$(SAMPLE_DIR) ) ( cd doc && $(MAKE) install.html DESTDIR=$(TARGET_DIR) ) touch install-stamp # Build architecture-independent files here. binary-indep: build install # No binary-indep target. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installdocs dh_installexamples dh_installchangelogs NEWS dh_strip dh_compress dh_fixperms dh_installdeb dh_makeshlibs dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install install-stamp ncurses-6.4-20240113/Ada95/package/debian/control0000644000000000000000000000115614336245125017530 0ustar rootrootSource: 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. ncurses-6.4-20240113/Ada95/package/debian/source/0000755000000000000000000000000012525715155017425 5ustar rootrootncurses-6.4-20240113/Ada95/package/debian/source/format0000644000000000000000000000001512525715155020634 0ustar rootroot3.0 (native) ncurses-6.4-20240113/Ada95/package/debian/watch0000644000000000000000000000015413213045176017150 0ustar rootrootversion=3 opts=passive ftp://ftp.invisible-island.net/AdaCurses/AdaCurses-([\d.]+)\.tgz \ debian uupdate ncurses-6.4-20240113/Ada95/package/AdaCurses.spec0000644000000000000000000000744014347454761017445 0ustar rootrootSummary: Ada95 binding for ncurses %define AppProgram AdaCurses %define AppVersion MAJOR.MINOR %define AppRelease YYYYMMDD # $Id: AdaCurses.spec,v 1.31 2022/12/18 00:08:17 tom Exp $ Name: %{AppProgram} Version: %{AppVersion} Release: %{AppRelease} License: MIT Group: Applications/Development URL: ftp://ftp.invisible-island.net/%{AppProgram} Source0: %{AppProgram}-%{AppRelease}.tgz Packager: Thomas Dickey %description This is the Ada95 binding from the ncurses MAJOR.MINOR distribution, for patch-date YYYYMMDD. In addition to a library, this package installs sample programs in "bin/%{AppProgram}" to avoid conflict with other packages. %prep %global is_mandriva %(test -f /etc/mandriva-release && echo 1 || echo 0) %global is_redhat %(test -f /etc/redhat-release && echo 1 || echo 0) %global is_suse %(if grep -E -i '(opensuse)' /etc/issue >/dev/null; then echo 1; else echo 0; fi) %define debug_package %{nil} %define need_filter %(if grep -E -i '(red hat|fedora)' /etc/issue >/dev/null; then echo 1; elif test -f /etc/fedora-release; then echo 1; else echo 0; fi) %if %{need_filter} == 1 # http://fedoraproject.org/wiki/EPEL:Packaging_Autoprovides_and_Requires_Filtering %filter_from_requires /lib%{AppProgram}.so.1/d %filter_setup %endif %setup -q -n %{AppProgram}-%{AppRelease} %build %define ada_libdir %{_libdir}/ada/adalib %define ada_include %{_prefix}/share/ada/adainclude %if %{is_mandriva} # Mageia 8 lacks gprbuild, needed for building shared libraries. %define ada_model --without-shared --without-ada-sharedlib --with-ada-objects=%{_libdir}/adalib %else # OpenSUSE actually lacks gprbuild, but there is a workable "community" package. %define ada_model --with-shared --with-ada-sharedlib %if %{is_redhat} # Fedora 36 LTO does not work with gprbuild system configuration. unset CFLAGS unset LDFLAGS unset LT_SYS_LIBRARY_PATH %endif %endif INSTALL_PROGRAM='${INSTALL}' \ ./configure %{ada_model} \ --target %{_target_platform} \ --prefix=%{_prefix} \ --bindir=%{_bindir} \ --libdir=%{_libdir} \ --libexecdir=%{_libexecdir} \ --with-ada-include=%{ada_include} \ --with-ada-objects=%{ada_libdir} \ --mandir=%{_mandir} \ --datadir=%{_datadir} \ --disable-rpath-link \ --disable-echo \ --verbose \ --enable-warnings make %install [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT make install.examples DESTDIR=$RPM_BUILD_ROOT %clean if rm -rf $RPM_BUILD_ROOT; then echo OK else find $RPM_BUILD_ROOT -type f | grep -F -v /.nfs && exit 1 fi exit 0 %files %defattr(-,root,root) %{_bindir}/%{AppProgram} %{_bindir}/adacurses*-config %{_libexecdir}/%{AppProgram}/* %{ada_libdir}/ %if %{need_filter} == 1 %{_libdir}/lib%{AppProgram}.* %endif %if %{is_suse} %{_libdir}/lib%{AppProgram}.* %endif %{_mandir}/man1/adacurses*-config.1* %{_datadir}/%{AppProgram}/* %{ada_include}/ %changelog # each patch should add its ChangeLog entries here * Sat Dec 17 2022 Thomas Dickey - install sample programs in libexec * Sat Nov 19 2022 Thomas Dickey - use static libraries for Mageia. * Sat Nov 12 2022 Thomas Dickey - unset environment variables to work around Fedora LTO bugs. - build-fix for OpenSUSE with gprbuild. * Sat Nov 16 2019 Thomas Dickey - modify clean-rule to work around Fedora NFS bugs. * Sat Sep 14 2019 Thomas Dickey - build-fixes for Fedora29, OpenSUSE * Sat Sep 07 2019 Thomas Dickey - use AppProgram to replace "AdaCurses" globally - amend install-paths to work with Fedora30 * Thu Mar 31 2011 Thomas Dickey - use --with-shared option for consistency with --with-ada-sharelib - ensure that MY_DATADIR is set when installing examples - add ada_libdir symbol to handle special case where libdir is /usr/lib64 - use --disable-rpath-link to link sample programs without rpath * Fri Mar 25 2011 Thomas Dickey - initial version ncurses-6.4-20240113/Ada95/package/AdaCurses-doc.spec0000644000000000000000000000264613566320611020177 0ustar rootrootSummary: AdaCurses - Ada95 binding documentation for ncurses %define AppProgram AdaCurses %define AppVersion MAJOR.MINOR %define AppRelease YYYYMMDD %define AppPackage %{AppProgram}-doc # $Id: AdaCurses-doc.spec,v 1.7 2019/11/23 21:15:53 tom Exp $ Name: %{AppPackage} Version: %{AppVersion} Release: %{AppRelease} License: MIT Group: Applications/Development URL: ftp://ftp.invisible-island.net/%{AppProgram} Source0: %{AppProgram}-%{AppRelease}.tgz Packager: Thomas Dickey %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 ncurses-6.4-20240113/Ada95/include/0000755000000000000000000000000014264567577014752 5ustar rootrootncurses-6.4-20240113/Ada95/include/ncurses_cfg.hin0000644000000000000000000000662413615656212017743 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 2005-2017,2018 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey 1997 * ****************************************************************************/ /* * $Id: ncurses_cfg.hin,v 1.11 2020/02/02 23:34:34 tom Exp $ * * This is a template-file used to generate the "ncurses_cfg.h" file. * * Rather than list every definition, the configuration script substitutes the * definitions that it finds using 'sed'. You need a patch (original date * 971222) to autoconf 2.12 or 2.13 to do this. * * See: * https://invisible-island.net/autoconf/ * ftp://ftp.invisible-island.net/autoconf/ */ #ifndef NC_CONFIG_H #define NC_CONFIG_H @DEFS@ #include /* 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 */ ncurses-6.4-20240113/Ada95/include/MKncurses_def.sh0000755000000000000000000000641314264567577020045 0ustar rootroot#! /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 ############################################################################### ncurses-6.4-20240113/Ada95/include/ncurses_defs0000644000000000000000000001140114152772333017335 0ustar rootroot# $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 ncurses-6.4-20240113/Ada95/README0000644000000000000000000000452514062736236014177 0ustar rootroot------------------------------------------------------------------------------- -- 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 ncurses-6.4-20240113/Ada95/Makefile.in0000644000000000000000000000770714347450715015372 0ustar rootroot# $Id: Makefile.in,v 1.30 2022/12/17 23:33:33 tom Exp $ ############################################################################## # Copyright 2020-2021,2022 Thomas E. Dickey # # Copyright 1998-2010,2015 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Juergen Pfeifer, 1996 # # Version Control # $Revision: 1.30 $ # SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ datarootdir = @datarootdir@ datadir = @datadir@ libdir = @libdir@ libexecdir = @libexecdir@ includedir = @includedir@ BINDIR = $(DESTDIR)$(bindir) DATADIR = $(DESTDIR)$(datadir) LIBDIR = $(DESTDIR)$(libdir) LIBEXECDIR = $(DESTDIR)$(libexecdir) SUBDIRS = @ADA_SUBDIRS@ INSTALL = @INSTALL@ @INSTALL_OPT_O@ INSTALL_SCRIPT = @INSTALL@ TOP_MFLAGS = @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" RPATH_LIST="$(RPATH_LIST)" @SET_MAKE@ ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : depend @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.libs @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.libs all \ libs \ sources \ install \ install.libs \ uninstall \ uninstall.libs :: for d in $(SUBDIRS); do \ ( cd $$d && $(MAKE) $(TOP_MFLAGS) $@ ) ;\ done clean \ mostlyclean :: for d in $(SUBDIRS); do \ ( cd $$d && $(MAKE) $(TOP_MFLAGS) $@ ) ;\ done distclean \ realclean :: for d in $(SUBDIRS); do \ ( cd $$d && $(MAKE) $(TOP_MFLAGS) $@ ) ;\ done rm -rf lib for lib_kind in static dynamic; do \ rm -rf $${lib_kind}-ali; \ rm -rf $${lib_kind}-obj; \ done -rm -f config.cache config.log config.status include/ncurses_cfg.h -rm -f Makefile depend : @ check : @echo "The test-programs are interactive" tags : @ preinstall : @ install.data : @ ncurses-6.4-20240113/Ada95/gen/0000755000000000000000000000000014342723510014052 5ustar rootrootncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-mouse.ads.m40000644000000000000000000002240313615656212023354 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/table.m40000644000000000000000000000476613615656212015426 0ustar rootrootdnl*************************************************************************** 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)') ncurses-6.4-20240113/Ada95/gen/adacurses-config.in0000644000000000000000000000654514264625273017643 0ustar rootroot#! /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 ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-forms-field_types.ads.m40000644000000000000000000002656113615656212025670 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses.adb.m40000644000000000000000000024272713615656212022222 0ustar rootroot-- -*- ada -*- define(`HTMLNAME',`terminal_interface-curses__adb.htm')dnl include(M4MACRO)------------------------------------------------------------------------------ -- -- -- GNAT ncurses Binding -- -- -- -- Terminal_Interface.Curses -- -- -- -- B O D Y -- -- -- ------------------------------------------------------------------------------ -- Copyright 2018,2020 Thomas E. Dickey -- -- Copyright 2007-2011,2014 Free Software Foundation, Inc. -- -- -- -- Permission is hereby granted, free of charge, to any person obtaining a -- -- copy of this software and associated documentation files (the -- -- "Software"), to deal in the Software without restriction, including -- -- without limitation the rights to use, copy, modify, merge, publish, -- -- distribute, distribute with modifications, sublicense, and/or sell -- -- copies of the Software, and to permit persons to whom the Software is -- -- furnished to do so, subject to the following conditions: -- -- -- -- The above copyright notice and this permission notice shall be included -- -- in all copies or substantial portions of the Software. -- -- -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- -- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- -- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- -- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- -- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- -- -- -- Except as contained in this notice, the name(s) of the above copyright -- -- holders shall not be used in advertising or otherwise to promote the -- -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------ -- Author: Juergen Pfeifer, 1996 -- Version Control: -- $Revision: 1.16 $ -- $Date: 2020/02/02 23:34:34 $ -- Binding Version 01.00 ------------------------------------------------------------------------------ with System; with Terminal_Interface.Curses.Aux; with Interfaces.C; use Interfaces.C; with Interfaces.C.Strings; use Interfaces.C.Strings; with Ada.Characters.Handling; use Ada.Characters.Handling; with Ada.Strings.Fixed; package body Terminal_Interface.Curses is use Aux; package ASF renames Ada.Strings.Fixed; type chtype_array is array (size_t range <>) of aliased Attributed_Character; pragma Convention (C, chtype_array); ------------------------------------------------------------------------------ function Key_Name (Key : Real_Key_Code) return String is function Keyname (K : C_Int) return chars_ptr; pragma Import (C, Keyname, "keyname"); Ch : Character; begin if Key <= Character'Pos (Character'Last) then Ch := Character'Val (Key); if Is_Control (Ch) then return Un_Control (Attributed_Character'(Ch => Ch, Color => Color_Pair'First, Attr => Normal_Video)); elsif Is_Graphic (Ch) then declare S : String (1 .. 1); begin S (1) := Ch; return S; end; else return ""; end if; else return Fill_String (Keyname (C_Int (Key))); end if; end Key_Name; procedure Key_Name (Key : Real_Key_Code; Name : out String) is begin ASF.Move (Key_Name (Key), Name); end Key_Name; ------------------------------------------------------------------------------ procedure Init_Screen is function Initscr return Window; pragma Import (C, Initscr, "initscr"); W : Window; begin W := Initscr; if W = Null_Window then raise Curses_Exception; end if; end Init_Screen; procedure End_Windows is function Endwin return C_Int; pragma Import (C, Endwin, "endwin"); begin if Endwin = Curses_Err then raise Curses_Exception; end if; end End_Windows; function Is_End_Window return Boolean is function Isendwin return Curses_Bool; pragma Import (C, Isendwin, "isendwin"); begin if Isendwin = Curses_Bool_False then return False; else return True; end if; end Is_End_Window; ------------------------------------------------------------------------------ procedure Move_Cursor (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position) is function Wmove (Win : Window; Line : C_Int; Column : C_Int ) return C_Int; pragma Import (C, Wmove, "wmove"); begin if Wmove (Win, C_Int (Line), C_Int (Column)) = Curses_Err then raise Curses_Exception; end if; end Move_Cursor; ------------------------------------------------------------------------------ procedure Add (Win : Window := Standard_Window; Ch : Attributed_Character) is function Waddch (W : Window; Ch : Attributed_Character) return C_Int; pragma Import (C, Waddch, "waddch"); begin if Waddch (Win, Ch) = Curses_Err then raise Curses_Exception; end if; end Add; procedure Add (Win : Window := Standard_Window; Ch : Character) is begin Add (Win, Attributed_Character'(Ch => Ch, Color => Color_Pair'First, Attr => Normal_Video)); end Add; procedure Add (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Ch : Attributed_Character) is function mvwaddch (W : Window; Y : C_Int; X : C_Int; Ch : Attributed_Character) return C_Int; pragma Import (C, mvwaddch, "mvwaddch"); begin if mvwaddch (Win, C_Int (Line), C_Int (Column), Ch) = Curses_Err then raise Curses_Exception; end if; end Add; procedure Add (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Ch : Character) is begin Add (Win, Line, Column, Attributed_Character'(Ch => Ch, Color => Color_Pair'First, Attr => Normal_Video)); end Add; procedure Add_With_Immediate_Echo (Win : Window := Standard_Window; Ch : Attributed_Character) is function Wechochar (W : Window; Ch : Attributed_Character) return C_Int; pragma Import (C, Wechochar, "wechochar"); begin if Wechochar (Win, Ch) = Curses_Err then raise Curses_Exception; end if; end Add_With_Immediate_Echo; procedure Add_With_Immediate_Echo (Win : Window := Standard_Window; Ch : Character) is begin Add_With_Immediate_Echo (Win, Attributed_Character'(Ch => Ch, Color => Color_Pair'First, Attr => Normal_Video)); end Add_With_Immediate_Echo; ------------------------------------------------------------------------------ function Create (Number_Of_Lines : Line_Count; Number_Of_Columns : Column_Count; First_Line_Position : Line_Position; First_Column_Position : Column_Position) return Window is function Newwin (Number_Of_Lines : C_Int; Number_Of_Columns : C_Int; First_Line_Position : C_Int; First_Column_Position : C_Int) return Window; pragma Import (C, Newwin, "newwin"); W : Window; begin W := Newwin (C_Int (Number_Of_Lines), C_Int (Number_Of_Columns), C_Int (First_Line_Position), C_Int (First_Column_Position)); if W = Null_Window then raise Curses_Exception; end if; return W; end Create; procedure Delete (Win : in out Window) is function Wdelwin (W : Window) return C_Int; pragma Import (C, Wdelwin, "delwin"); begin if Wdelwin (Win) = Curses_Err then raise Curses_Exception; end if; Win := Null_Window; end Delete; function Sub_Window (Win : Window := Standard_Window; Number_Of_Lines : Line_Count; Number_Of_Columns : Column_Count; First_Line_Position : Line_Position; First_Column_Position : Column_Position) return Window is function Subwin (Win : Window; Number_Of_Lines : C_Int; Number_Of_Columns : C_Int; First_Line_Position : C_Int; First_Column_Position : C_Int) return Window; pragma Import (C, Subwin, "subwin"); W : Window; begin W := Subwin (Win, C_Int (Number_Of_Lines), C_Int (Number_Of_Columns), C_Int (First_Line_Position), C_Int (First_Column_Position)); if W = Null_Window then raise Curses_Exception; end if; return W; end Sub_Window; function Derived_Window (Win : Window := Standard_Window; Number_Of_Lines : Line_Count; Number_Of_Columns : Column_Count; First_Line_Position : Line_Position; First_Column_Position : Column_Position) return Window is function Derwin (Win : Window; Number_Of_Lines : C_Int; Number_Of_Columns : C_Int; First_Line_Position : C_Int; First_Column_Position : C_Int) return Window; pragma Import (C, Derwin, "derwin"); W : Window; begin W := Derwin (Win, C_Int (Number_Of_Lines), C_Int (Number_Of_Columns), C_Int (First_Line_Position), C_Int (First_Column_Position)); if W = Null_Window then raise Curses_Exception; end if; return W; end Derived_Window; function Duplicate (Win : Window) return Window is function Dupwin (Win : Window) return Window; pragma Import (C, Dupwin, "dupwin"); W : constant Window := Dupwin (Win); begin if W = Null_Window then raise Curses_Exception; end if; return W; end Duplicate; procedure Move_Window (Win : Window; Line : Line_Position; Column : Column_Position) is function Mvwin (Win : Window; Line : C_Int; Column : C_Int) return C_Int; pragma Import (C, Mvwin, "mvwin"); begin if Mvwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then raise Curses_Exception; end if; end Move_Window; procedure Move_Derived_Window (Win : Window; Line : Line_Position; Column : Column_Position) is function Mvderwin (Win : Window; Line : C_Int; Column : C_Int) return C_Int; pragma Import (C, Mvderwin, "mvderwin"); begin if Mvderwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then raise Curses_Exception; end if; end Move_Derived_Window; procedure Set_Synch_Mode (Win : Window := Standard_Window; Mode : Boolean := False) is function Syncok (Win : Window; Mode : Curses_Bool) return C_Int; pragma Import (C, Syncok, "syncok"); begin if Syncok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then raise Curses_Exception; end if; end Set_Synch_Mode; ------------------------------------------------------------------------------ procedure Add (Win : Window := Standard_Window; Str : String; Len : Integer := -1) is function Waddnstr (Win : Window; Str : char_array; Len : C_Int := -1) return C_Int; pragma Import (C, Waddnstr, "waddnstr"); Txt : char_array (0 .. Str'Length); Length : size_t; begin To_C (Str, Txt, Length); if Waddnstr (Win, Txt, C_Int (Len)) = Curses_Err then raise Curses_Exception; end if; end Add; procedure Add (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : String; Len : Integer := -1) is begin Move_Cursor (Win, Line, Column); Add (Win, Str, Len); end Add; ------------------------------------------------------------------------------ procedure Add (Win : Window := Standard_Window; Str : Attributed_String; Len : Integer := -1) is function Waddchnstr (Win : Window; Str : chtype_array; Len : C_Int := -1) return C_Int; pragma Import (C, Waddchnstr, "waddchnstr"); Txt : chtype_array (0 .. Str'Length); begin for Length in 1 .. size_t (Str'Length) loop Txt (Length - 1) := Str (Natural (Length)); end loop; Txt (Str'Length) := Default_Character; if Waddchnstr (Win, Txt, C_Int (Len)) = Curses_Err then raise Curses_Exception; end if; end Add; procedure Add (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : Attributed_String; Len : Integer := -1) is begin Move_Cursor (Win, Line, Column); Add (Win, Str, Len); end Add; ------------------------------------------------------------------------------ procedure Border (Win : Window := Standard_Window; Left_Side_Symbol : Attributed_Character := Default_Character; Right_Side_Symbol : Attributed_Character := Default_Character; Top_Side_Symbol : Attributed_Character := Default_Character; Bottom_Side_Symbol : Attributed_Character := Default_Character; Upper_Left_Corner_Symbol : Attributed_Character := Default_Character; Upper_Right_Corner_Symbol : Attributed_Character := Default_Character; Lower_Left_Corner_Symbol : Attributed_Character := Default_Character; Lower_Right_Corner_Symbol : Attributed_Character := Default_Character) is function Wborder (W : Window; LS : Attributed_Character; RS : Attributed_Character; TS : Attributed_Character; BS : Attributed_Character; ULC : Attributed_Character; URC : Attributed_Character; LLC : Attributed_Character; LRC : Attributed_Character) return C_Int; pragma Import (C, Wborder, "wborder"); begin if Wborder (Win, Left_Side_Symbol, Right_Side_Symbol, Top_Side_Symbol, Bottom_Side_Symbol, Upper_Left_Corner_Symbol, Upper_Right_Corner_Symbol, Lower_Left_Corner_Symbol, Lower_Right_Corner_Symbol) = Curses_Err then raise Curses_Exception; end if; end Border; procedure Box (Win : Window := Standard_Window; Vertical_Symbol : Attributed_Character := Default_Character; Horizontal_Symbol : Attributed_Character := Default_Character) is begin Border (Win, Vertical_Symbol, Vertical_Symbol, Horizontal_Symbol, Horizontal_Symbol); end Box; procedure Horizontal_Line (Win : Window := Standard_Window; Line_Size : Natural; Line_Symbol : Attributed_Character := Default_Character) is function Whline (W : Window; Ch : Attributed_Character; Len : C_Int) return C_Int; pragma Import (C, Whline, "whline"); begin if Whline (Win, Line_Symbol, C_Int (Line_Size)) = Curses_Err then raise Curses_Exception; end if; end Horizontal_Line; procedure Vertical_Line (Win : Window := Standard_Window; Line_Size : Natural; Line_Symbol : Attributed_Character := Default_Character) is function Wvline (W : Window; Ch : Attributed_Character; Len : C_Int) return C_Int; pragma Import (C, Wvline, "wvline"); begin if Wvline (Win, Line_Symbol, C_Int (Line_Size)) = Curses_Err then raise Curses_Exception; end if; end Vertical_Line; ------------------------------------------------------------------------------ function Get_Keystroke (Win : Window := Standard_Window) return Real_Key_Code is function Wgetch (W : Window) return C_Int; pragma Import (C, Wgetch, "wgetch"); C : constant C_Int := Wgetch (Win); begin if C = Curses_Err then return Key_None; else return Real_Key_Code (C); end if; end Get_Keystroke; procedure Undo_Keystroke (Key : Real_Key_Code) is function Ungetch (Ch : C_Int) return C_Int; pragma Import (C, Ungetch, "ungetch"); begin if Ungetch (C_Int (Key)) = Curses_Err then raise Curses_Exception; end if; end Undo_Keystroke; function Has_Key (Key : Special_Key_Code) return Boolean is function Haskey (Key : C_Int) return C_Int; pragma Import (C, Haskey, "has_key"); begin if Haskey (C_Int (Key)) = Curses_False then return False; else return True; end if; end Has_Key; function Is_Function_Key (Key : Special_Key_Code) return Boolean is L : constant Special_Key_Code := Special_Key_Code (Natural (Key_F0) + Natural (Function_Key_Number'Last)); begin if (Key >= Key_F0) and then (Key <= L) then return True; else return False; end if; end Is_Function_Key; function Function_Key (Key : Real_Key_Code) return Function_Key_Number is begin if Is_Function_Key (Key) then return Function_Key_Number (Key - Key_F0); else raise Constraint_Error; end if; end Function_Key; function Function_Key_Code (Key : Function_Key_Number) return Real_Key_Code is begin return Real_Key_Code (Natural (Key_F0) + Natural (Key)); end Function_Key_Code; ------------------------------------------------------------------------------ procedure Standout (Win : Window := Standard_Window; On : Boolean := True) is function wstandout (Win : Window) return C_Int; pragma Import (C, wstandout, "wstandout"); function wstandend (Win : Window) return C_Int; pragma Import (C, wstandend, "wstandend"); Err : C_Int; begin if On then Err := wstandout (Win); else Err := wstandend (Win); end if; if Err = Curses_Err then raise Curses_Exception; end if; end Standout; procedure Switch_Character_Attribute (Win : Window := Standard_Window; Attr : Character_Attribute_Set := Normal_Video; On : Boolean := True) is function Wattron (Win : Window; C_Attr : Attributed_Character) return C_Int; pragma Import (C, Wattron, "wattr_on"); function Wattroff (Win : Window; C_Attr : Attributed_Character) return C_Int; pragma Import (C, Wattroff, "wattr_off"); -- In Ada we use the On Boolean to control whether or not we want to -- switch on or off the attributes in the set. Err : C_Int; AC : constant Attributed_Character := (Ch => Character'First, Color => Color_Pair'First, Attr => Attr); begin if On then Err := Wattron (Win, AC); else Err := Wattroff (Win, AC); end if; if Err = Curses_Err then raise Curses_Exception; end if; end Switch_Character_Attribute; procedure Set_Character_Attributes (Win : Window := Standard_Window; Attr : Character_Attribute_Set := Normal_Video; Color : Color_Pair := Color_Pair'First) is function Wattrset (Win : Window; C_Attr : Attributed_Character) return C_Int; pragma Import (C, Wattrset, "wattrset"); -- ??? wattr_set begin if Wattrset (Win, (Ch => Character'First, Color => Color, Attr => Attr)) = Curses_Err then raise Curses_Exception; end if; end Set_Character_Attributes; function Get_Character_Attribute (Win : Window := Standard_Window) return Character_Attribute_Set is function Wattrget (Win : Window; Atr : access Attributed_Character; Col : access C_Short; Opt : System.Address) return C_Int; pragma Import (C, Wattrget, "wattr_get"); Attr : aliased Attributed_Character; Col : aliased C_Short; Res : constant C_Int := Wattrget (Win, Attr'Access, Col'Access, System.Null_Address); begin if Res = Curses_Ok then return Attr.Attr; else raise Curses_Exception; end if; end Get_Character_Attribute; function Get_Character_Attribute (Win : Window := Standard_Window) return Color_Pair is function Wattrget (Win : Window; Atr : access Attributed_Character; Col : access C_Short; Opt : System.Address) return C_Int; pragma Import (C, Wattrget, "wattr_get"); Attr : aliased Attributed_Character; Col : aliased C_Short; Res : constant C_Int := Wattrget (Win, Attr'Access, Col'Access, System.Null_Address); begin if Res = Curses_Ok then return Attr.Color; else raise Curses_Exception; end if; end Get_Character_Attribute; procedure Set_Color (Win : Window := Standard_Window; Pair : Color_Pair) is function Wset_Color (Win : Window; Color : C_Short; Opts : C_Void_Ptr) return C_Int; pragma Import (C, Wset_Color, "wcolor_set"); begin if Wset_Color (Win, C_Short (Pair), C_Void_Ptr (System.Null_Address)) = Curses_Err then raise Curses_Exception; end if; end Set_Color; procedure Change_Attributes (Win : Window := Standard_Window; Count : Integer := -1; Attr : Character_Attribute_Set := Normal_Video; Color : Color_Pair := Color_Pair'First) is function Wchgat (Win : Window; Cnt : C_Int; Attr : Attributed_Character; Color : C_Short; Opts : System.Address := System.Null_Address) return C_Int; pragma Import (C, Wchgat, "wchgat"); begin if Wchgat (Win, C_Int (Count), (Ch => Character'First, Color => Color_Pair'First, Attr => Attr), C_Short (Color)) = Curses_Err then raise Curses_Exception; end if; end Change_Attributes; procedure Change_Attributes (Win : Window := Standard_Window; Line : Line_Position := Line_Position'First; Column : Column_Position := Column_Position'First; Count : Integer := -1; Attr : Character_Attribute_Set := Normal_Video; Color : Color_Pair := Color_Pair'First) is begin Move_Cursor (Win, Line, Column); Change_Attributes (Win, Count, Attr, Color); end Change_Attributes; ------------------------------------------------------------------------------ procedure Beep is function Beeper return C_Int; pragma Import (C, Beeper, "beep"); begin if Beeper = Curses_Err then raise Curses_Exception; end if; end Beep; procedure Flash_Screen is function Flash return C_Int; pragma Import (C, Flash, "flash"); begin if Flash = Curses_Err then raise Curses_Exception; end if; end Flash_Screen; ------------------------------------------------------------------------------ procedure Set_Cbreak_Mode (SwitchOn : Boolean := True) is function Cbreak return C_Int; pragma Import (C, Cbreak, "cbreak"); function NoCbreak return C_Int; pragma Import (C, NoCbreak, "nocbreak"); Err : C_Int; begin if SwitchOn then Err := Cbreak; else Err := NoCbreak; end if; if Err = Curses_Err then raise Curses_Exception; end if; end Set_Cbreak_Mode; procedure Set_Raw_Mode (SwitchOn : Boolean := True) is function Raw return C_Int; pragma Import (C, Raw, "raw"); function NoRaw return C_Int; pragma Import (C, NoRaw, "noraw"); Err : C_Int; begin if SwitchOn then Err := Raw; else Err := NoRaw; end if; if Err = Curses_Err then raise Curses_Exception; end if; end Set_Raw_Mode; procedure Set_Echo_Mode (SwitchOn : Boolean := True) is function Echo return C_Int; pragma Import (C, Echo, "echo"); function NoEcho return C_Int; pragma Import (C, NoEcho, "noecho"); Err : C_Int; begin if SwitchOn then Err := Echo; else Err := NoEcho; end if; if Err = Curses_Err then raise Curses_Exception; end if; end Set_Echo_Mode; procedure Set_Meta_Mode (Win : Window := Standard_Window; SwitchOn : Boolean := True) is function Meta (W : Window; Mode : Curses_Bool) return C_Int; pragma Import (C, Meta, "meta"); begin if Meta (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then raise Curses_Exception; end if; end Set_Meta_Mode; procedure Set_KeyPad_Mode (Win : Window := Standard_Window; SwitchOn : Boolean := True) is function Keypad (W : Window; Mode : Curses_Bool) return C_Int; pragma Import (C, Keypad, "keypad"); begin if Keypad (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then raise Curses_Exception; end if; end Set_KeyPad_Mode; function Get_KeyPad_Mode (Win : Window := Standard_Window) return Boolean is function Is_Keypad (W : Window) return Curses_Bool; pragma Import (C, Is_Keypad, "is_keypad"); begin return (Is_Keypad (Win) /= Curses_Bool_False); end Get_KeyPad_Mode; procedure Half_Delay (Amount : Half_Delay_Amount) is function Halfdelay (Amount : C_Int) return C_Int; pragma Import (C, Halfdelay, "halfdelay"); begin if Halfdelay (C_Int (Amount)) = Curses_Err then raise Curses_Exception; end if; end Half_Delay; procedure Set_Flush_On_Interrupt_Mode (Win : Window := Standard_Window; Mode : Boolean := True) is function Intrflush (Win : Window; Mode : Curses_Bool) return C_Int; pragma Import (C, Intrflush, "intrflush"); begin if Intrflush (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then raise Curses_Exception; end if; end Set_Flush_On_Interrupt_Mode; procedure Set_Queue_Interrupt_Mode (Win : Window := Standard_Window; Flush : Boolean := True) is procedure Qiflush; pragma Import (C, Qiflush, "qiflush"); procedure No_Qiflush; pragma Import (C, No_Qiflush, "noqiflush"); begin if Win = Null_Window then raise Curses_Exception; end if; if Flush then Qiflush; else No_Qiflush; end if; end Set_Queue_Interrupt_Mode; procedure Set_NoDelay_Mode (Win : Window := Standard_Window; Mode : Boolean := False) is function Nodelay (Win : Window; Mode : Curses_Bool) return C_Int; pragma Import (C, Nodelay, "nodelay"); begin if Nodelay (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then raise Curses_Exception; end if; end Set_NoDelay_Mode; procedure Set_Timeout_Mode (Win : Window := Standard_Window; Mode : Timeout_Mode; Amount : Natural) is procedure Wtimeout (Win : Window; Amount : C_Int); pragma Import (C, Wtimeout, "wtimeout"); Time : C_Int; begin case Mode is when Blocking => Time := -1; when Non_Blocking => Time := 0; when Delayed => if Amount = 0 then raise Constraint_Error; end if; Time := C_Int (Amount); end case; Wtimeout (Win, Time); end Set_Timeout_Mode; procedure Set_Escape_Timer_Mode (Win : Window := Standard_Window; Timer_Off : Boolean := False) is function Notimeout (Win : Window; Mode : Curses_Bool) return C_Int; pragma Import (C, Notimeout, "notimeout"); begin if Notimeout (Win, Curses_Bool (Boolean'Pos (Timer_Off))) = Curses_Err then raise Curses_Exception; end if; end Set_Escape_Timer_Mode; ------------------------------------------------------------------------------ procedure Set_NL_Mode (SwitchOn : Boolean := True) is function NL return C_Int; pragma Import (C, NL, "nl"); function NoNL return C_Int; pragma Import (C, NoNL, "nonl"); Err : C_Int; begin if SwitchOn then Err := NL; else Err := NoNL; end if; if Err = Curses_Err then raise Curses_Exception; end if; end Set_NL_Mode; procedure Clear_On_Next_Update (Win : Window := Standard_Window; Do_Clear : Boolean := True) is function Clear_Ok (W : Window; Flag : Curses_Bool) return C_Int; pragma Import (C, Clear_Ok, "clearok"); begin if Clear_Ok (Win, Curses_Bool (Boolean'Pos (Do_Clear))) = Curses_Err then raise Curses_Exception; end if; end Clear_On_Next_Update; procedure Use_Insert_Delete_Line (Win : Window := Standard_Window; Do_Idl : Boolean := True) is function IDL_Ok (W : Window; Flag : Curses_Bool) return C_Int; pragma Import (C, IDL_Ok, "idlok"); begin if IDL_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idl))) = Curses_Err then raise Curses_Exception; end if; end Use_Insert_Delete_Line; procedure Use_Insert_Delete_Character (Win : Window := Standard_Window; Do_Idc : Boolean := True) is procedure IDC_Ok (W : Window; Flag : Curses_Bool); pragma Import (C, IDC_Ok, "idcok"); begin IDC_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idc))); end Use_Insert_Delete_Character; procedure Leave_Cursor_After_Update (Win : Window := Standard_Window; Do_Leave : Boolean := True) is function Leave_Ok (W : Window; Flag : Curses_Bool) return C_Int; pragma Import (C, Leave_Ok, "leaveok"); begin if Leave_Ok (Win, Curses_Bool (Boolean'Pos (Do_Leave))) = Curses_Err then raise Curses_Exception; end if; end Leave_Cursor_After_Update; procedure Immediate_Update_Mode (Win : Window := Standard_Window; Mode : Boolean := False) is procedure Immedok (Win : Window; Mode : Curses_Bool); pragma Import (C, Immedok, "immedok"); begin Immedok (Win, Curses_Bool (Boolean'Pos (Mode))); end Immediate_Update_Mode; procedure Allow_Scrolling (Win : Window := Standard_Window; Mode : Boolean := False) is function Scrollok (Win : Window; Mode : Curses_Bool) return C_Int; pragma Import (C, Scrollok, "scrollok"); begin if Scrollok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then raise Curses_Exception; end if; end Allow_Scrolling; function Scrolling_Allowed (Win : Window := Standard_Window) return Boolean is function Is_Scroll_Ok (W : Window) return Curses_Bool; pragma Import (C, Is_Scroll_Ok, "is_scrollok"); begin return (Is_Scroll_Ok (Win) /= Curses_Bool_False); end Scrolling_Allowed; procedure Set_Scroll_Region (Win : Window := Standard_Window; Top_Line : Line_Position; Bottom_Line : Line_Position) is function Wsetscrreg (Win : Window; Lin : C_Int; Col : C_Int) return C_Int; pragma Import (C, Wsetscrreg, "wsetscrreg"); begin if Wsetscrreg (Win, C_Int (Top_Line), C_Int (Bottom_Line)) = Curses_Err then raise Curses_Exception; end if; end Set_Scroll_Region; ------------------------------------------------------------------------------ procedure Update_Screen is function Do_Update return C_Int; pragma Import (C, Do_Update, "doupdate"); begin if Do_Update = Curses_Err then raise Curses_Exception; end if; end Update_Screen; procedure Refresh (Win : Window := Standard_Window) is function Wrefresh (W : Window) return C_Int; pragma Import (C, Wrefresh, "wrefresh"); begin if Wrefresh (Win) = Curses_Err then raise Curses_Exception; end if; end Refresh; procedure Refresh_Without_Update (Win : Window := Standard_Window) is function Wnoutrefresh (W : Window) return C_Int; pragma Import (C, Wnoutrefresh, "wnoutrefresh"); begin if Wnoutrefresh (Win) = Curses_Err then raise Curses_Exception; end if; end Refresh_Without_Update; procedure Redraw (Win : Window := Standard_Window) is function Redrawwin (Win : Window) return C_Int; pragma Import (C, Redrawwin, "redrawwin"); begin if Redrawwin (Win) = Curses_Err then raise Curses_Exception; end if; end Redraw; procedure Redraw (Win : Window := Standard_Window; Begin_Line : Line_Position; Line_Count : Positive) is function Wredrawln (Win : Window; First : C_Int; Cnt : C_Int) return C_Int; pragma Import (C, Wredrawln, "wredrawln"); begin if Wredrawln (Win, C_Int (Begin_Line), C_Int (Line_Count)) = Curses_Err then raise Curses_Exception; end if; end Redraw; ------------------------------------------------------------------------------ procedure Erase (Win : Window := Standard_Window) is function Werase (W : Window) return C_Int; pragma Import (C, Werase, "werase"); begin if Werase (Win) = Curses_Err then raise Curses_Exception; end if; end Erase; procedure Clear (Win : Window := Standard_Window) is function Wclear (W : Window) return C_Int; pragma Import (C, Wclear, "wclear"); begin if Wclear (Win) = Curses_Err then raise Curses_Exception; end if; end Clear; procedure Clear_To_End_Of_Screen (Win : Window := Standard_Window) is function Wclearbot (W : Window) return C_Int; pragma Import (C, Wclearbot, "wclrtobot"); begin if Wclearbot (Win) = Curses_Err then raise Curses_Exception; end if; end Clear_To_End_Of_Screen; procedure Clear_To_End_Of_Line (Win : Window := Standard_Window) is function Wcleareol (W : Window) return C_Int; pragma Import (C, Wcleareol, "wclrtoeol"); begin if Wcleareol (Win) = Curses_Err then raise Curses_Exception; end if; end Clear_To_End_Of_Line; ------------------------------------------------------------------------------ procedure Set_Background (Win : Window := Standard_Window; Ch : Attributed_Character) is procedure WBackground (W : Window; Ch : Attributed_Character); pragma Import (C, WBackground, "wbkgdset"); begin WBackground (Win, Ch); end Set_Background; procedure Change_Background (Win : Window := Standard_Window; Ch : Attributed_Character) is function WChangeBkgd (W : Window; Ch : Attributed_Character) return C_Int; pragma Import (C, WChangeBkgd, "wbkgd"); begin if WChangeBkgd (Win, Ch) = Curses_Err then raise Curses_Exception; end if; end Change_Background; function Get_Background (Win : Window := Standard_Window) return Attributed_Character is function Wgetbkgd (Win : Window) return Attributed_Character; pragma Import (C, Wgetbkgd, "getbkgd"); begin return Wgetbkgd (Win); end Get_Background; ------------------------------------------------------------------------------ procedure Change_Lines_Status (Win : Window := Standard_Window; Start : Line_Position; Count : Positive; State : Boolean) is function Wtouchln (Win : Window; Sta : C_Int; Cnt : C_Int; Chg : C_Int) return C_Int; pragma Import (C, Wtouchln, "wtouchln"); begin if Wtouchln (Win, C_Int (Start), C_Int (Count), C_Int (Boolean'Pos (State))) = Curses_Err then raise Curses_Exception; end if; end Change_Lines_Status; procedure Touch (Win : Window := Standard_Window) is Y : Line_Position; X : Column_Position; begin Get_Size (Win, Y, X); pragma Warnings (Off, X); -- unreferenced Change_Lines_Status (Win, 0, Positive (Y), True); end Touch; procedure Untouch (Win : Window := Standard_Window) is Y : Line_Position; X : Column_Position; begin Get_Size (Win, Y, X); pragma Warnings (Off, X); -- unreferenced Change_Lines_Status (Win, 0, Positive (Y), False); end Untouch; procedure Touch (Win : Window := Standard_Window; Start : Line_Position; Count : Positive) is begin Change_Lines_Status (Win, Start, Count, True); end Touch; function Is_Touched (Win : Window := Standard_Window; Line : Line_Position) return Boolean is function WLineTouched (W : Window; L : C_Int) return Curses_Bool; pragma Import (C, WLineTouched, "is_linetouched"); begin if WLineTouched (Win, C_Int (Line)) = Curses_Bool_False then return False; else return True; end if; end Is_Touched; function Is_Touched (Win : Window := Standard_Window) return Boolean is function WWinTouched (W : Window) return Curses_Bool; pragma Import (C, WWinTouched, "is_wintouched"); begin if WWinTouched (Win) = Curses_Bool_False then return False; else return True; end if; end Is_Touched; ------------------------------------------------------------------------------ procedure Copy (Source_Window : Window; Destination_Window : Window; Source_Top_Row : Line_Position; Source_Left_Column : Column_Position; Destination_Top_Row : Line_Position; Destination_Left_Column : Column_Position; Destination_Bottom_Row : Line_Position; Destination_Right_Column : Column_Position; Non_Destructive_Mode : Boolean := True) is function Copywin (Src : Window; Dst : Window; Str : C_Int; Slc : C_Int; Dtr : C_Int; Dlc : C_Int; Dbr : C_Int; Drc : C_Int; Ndm : C_Int) return C_Int; pragma Import (C, Copywin, "copywin"); begin if Copywin (Source_Window, Destination_Window, C_Int (Source_Top_Row), C_Int (Source_Left_Column), C_Int (Destination_Top_Row), C_Int (Destination_Left_Column), C_Int (Destination_Bottom_Row), C_Int (Destination_Right_Column), Boolean'Pos (Non_Destructive_Mode) ) = Curses_Err then raise Curses_Exception; end if; end Copy; procedure Overwrite (Source_Window : Window; Destination_Window : Window) is function Overwrite (Src : Window; Dst : Window) return C_Int; pragma Import (C, Overwrite, "overwrite"); begin if Overwrite (Source_Window, Destination_Window) = Curses_Err then raise Curses_Exception; end if; end Overwrite; procedure Overlay (Source_Window : Window; Destination_Window : Window) is function Overlay (Src : Window; Dst : Window) return C_Int; pragma Import (C, Overlay, "overlay"); begin if Overlay (Source_Window, Destination_Window) = Curses_Err then raise Curses_Exception; end if; end Overlay; ------------------------------------------------------------------------------ procedure Insert_Delete_Lines (Win : Window := Standard_Window; Lines : Integer := 1) -- default is to insert one line above is function Winsdelln (W : Window; N : C_Int) return C_Int; pragma Import (C, Winsdelln, "winsdelln"); begin if Winsdelln (Win, C_Int (Lines)) = Curses_Err then raise Curses_Exception; end if; end Insert_Delete_Lines; procedure Delete_Line (Win : Window := Standard_Window) is begin Insert_Delete_Lines (Win, -1); end Delete_Line; procedure Insert_Line (Win : Window := Standard_Window) is begin Insert_Delete_Lines (Win, 1); end Insert_Line; ------------------------------------------------------------------------------ procedure Get_Size (Win : Window := Standard_Window; Number_Of_Lines : out Line_Count; Number_Of_Columns : out Column_Count) is function GetMaxY (W : Window) return C_Int; pragma Import (C, GetMaxY, "getmaxy"); function GetMaxX (W : Window) return C_Int; pragma Import (C, GetMaxX, "getmaxx"); Y : constant C_Int := GetMaxY (Win); X : constant C_Int := GetMaxX (Win); begin Number_Of_Lines := Line_Count (Y); Number_Of_Columns := Column_Count (X); end Get_Size; procedure Get_Window_Position (Win : Window := Standard_Window; Top_Left_Line : out Line_Position; Top_Left_Column : out Column_Position) is function GetBegY (W : Window) return C_Int; pragma Import (C, GetBegY, "getbegy"); function GetBegX (W : Window) return C_Int; pragma Import (C, GetBegX, "getbegx"); Y : constant C_Short := C_Short (GetBegY (Win)); X : constant C_Short := C_Short (GetBegX (Win)); begin Top_Left_Line := Line_Position (Y); Top_Left_Column := Column_Position (X); end Get_Window_Position; procedure Get_Cursor_Position (Win : Window := Standard_Window; Line : out Line_Position; Column : out Column_Position) is function GetCurY (W : Window) return C_Int; pragma Import (C, GetCurY, "getcury"); function GetCurX (W : Window) return C_Int; pragma Import (C, GetCurX, "getcurx"); Y : constant C_Short := C_Short (GetCurY (Win)); X : constant C_Short := C_Short (GetCurX (Win)); begin Line := Line_Position (Y); Column := Column_Position (X); end Get_Cursor_Position; procedure Get_Origin_Relative_To_Parent (Win : Window; Top_Left_Line : out Line_Position; Top_Left_Column : out Column_Position; Is_Not_A_Subwindow : out Boolean) is function GetParY (W : Window) return C_Int; pragma Import (C, GetParY, "getpary"); function GetParX (W : Window) return C_Int; pragma Import (C, GetParX, "getparx"); Y : constant C_Int := GetParY (Win); X : constant C_Int := GetParX (Win); begin if Y = -1 then Top_Left_Line := Line_Position'Last; Top_Left_Column := Column_Position'Last; Is_Not_A_Subwindow := True; else Top_Left_Line := Line_Position (Y); Top_Left_Column := Column_Position (X); Is_Not_A_Subwindow := False; end if; end Get_Origin_Relative_To_Parent; ------------------------------------------------------------------------------ function New_Pad (Lines : Line_Count; Columns : Column_Count) return Window is function Newpad (Lines : C_Int; Columns : C_Int) return Window; pragma Import (C, Newpad, "newpad"); W : Window; begin W := Newpad (C_Int (Lines), C_Int (Columns)); if W = Null_Window then raise Curses_Exception; end if; return W; end New_Pad; function Sub_Pad (Pad : Window; Number_Of_Lines : Line_Count; Number_Of_Columns : Column_Count; First_Line_Position : Line_Position; First_Column_Position : Column_Position) return Window is function Subpad (Pad : Window; Number_Of_Lines : C_Int; Number_Of_Columns : C_Int; First_Line_Position : C_Int; First_Column_Position : C_Int) return Window; pragma Import (C, Subpad, "subpad"); W : Window; begin W := Subpad (Pad, C_Int (Number_Of_Lines), C_Int (Number_Of_Columns), C_Int (First_Line_Position), C_Int (First_Column_Position)); if W = Null_Window then raise Curses_Exception; end if; return W; end Sub_Pad; procedure Refresh (Pad : Window; Source_Top_Row : Line_Position; Source_Left_Column : Column_Position; Destination_Top_Row : Line_Position; Destination_Left_Column : Column_Position; Destination_Bottom_Row : Line_Position; Destination_Right_Column : Column_Position) is function Prefresh (Pad : Window; Source_Top_Row : C_Int; Source_Left_Column : C_Int; Destination_Top_Row : C_Int; Destination_Left_Column : C_Int; Destination_Bottom_Row : C_Int; Destination_Right_Column : C_Int) return C_Int; pragma Import (C, Prefresh, "prefresh"); begin if Prefresh (Pad, C_Int (Source_Top_Row), C_Int (Source_Left_Column), C_Int (Destination_Top_Row), C_Int (Destination_Left_Column), C_Int (Destination_Bottom_Row), C_Int (Destination_Right_Column)) = Curses_Err then raise Curses_Exception; end if; end Refresh; procedure Refresh_Without_Update (Pad : Window; Source_Top_Row : Line_Position; Source_Left_Column : Column_Position; Destination_Top_Row : Line_Position; Destination_Left_Column : Column_Position; Destination_Bottom_Row : Line_Position; Destination_Right_Column : Column_Position) is function Pnoutrefresh (Pad : Window; Source_Top_Row : C_Int; Source_Left_Column : C_Int; Destination_Top_Row : C_Int; Destination_Left_Column : C_Int; Destination_Bottom_Row : C_Int; Destination_Right_Column : C_Int) return C_Int; pragma Import (C, Pnoutrefresh, "pnoutrefresh"); begin if Pnoutrefresh (Pad, C_Int (Source_Top_Row), C_Int (Source_Left_Column), C_Int (Destination_Top_Row), C_Int (Destination_Left_Column), C_Int (Destination_Bottom_Row), C_Int (Destination_Right_Column)) = Curses_Err then raise Curses_Exception; end if; end Refresh_Without_Update; procedure Add_Character_To_Pad_And_Echo_It (Pad : Window; Ch : Attributed_Character) is function Pechochar (Pad : Window; Ch : Attributed_Character) return C_Int; pragma Import (C, Pechochar, "pechochar"); begin if Pechochar (Pad, Ch) = Curses_Err then raise Curses_Exception; end if; end Add_Character_To_Pad_And_Echo_It; procedure Add_Character_To_Pad_And_Echo_It (Pad : Window; Ch : Character) is begin Add_Character_To_Pad_And_Echo_It (Pad, Attributed_Character'(Ch => Ch, Color => Color_Pair'First, Attr => Normal_Video)); end Add_Character_To_Pad_And_Echo_It; ------------------------------------------------------------------------------ procedure Scroll (Win : Window := Standard_Window; Amount : Integer := 1) is function Wscrl (Win : Window; N : C_Int) return C_Int; pragma Import (C, Wscrl, "wscrl"); begin if Wscrl (Win, C_Int (Amount)) = Curses_Err then raise Curses_Exception; end if; end Scroll; ------------------------------------------------------------------------------ procedure Delete_Character (Win : Window := Standard_Window) is function Wdelch (Win : Window) return C_Int; pragma Import (C, Wdelch, "wdelch"); begin if Wdelch (Win) = Curses_Err then raise Curses_Exception; end if; end Delete_Character; procedure Delete_Character (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position) is function Mvwdelch (Win : Window; Lin : C_Int; Col : C_Int) return C_Int; pragma Import (C, Mvwdelch, "mvwdelch"); begin if Mvwdelch (Win, C_Int (Line), C_Int (Column)) = Curses_Err then raise Curses_Exception; end if; end Delete_Character; ------------------------------------------------------------------------------ function Peek (Win : Window := Standard_Window) return Attributed_Character is function Winch (Win : Window) return Attributed_Character; pragma Import (C, Winch, "winch"); begin return Winch (Win); end Peek; function Peek (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position) return Attributed_Character is function Mvwinch (Win : Window; Lin : C_Int; Col : C_Int) return Attributed_Character; pragma Import (C, Mvwinch, "mvwinch"); begin return Mvwinch (Win, C_Int (Line), C_Int (Column)); end Peek; ------------------------------------------------------------------------------ procedure Insert (Win : Window := Standard_Window; Ch : Attributed_Character) is function Winsch (Win : Window; Ch : Attributed_Character) return C_Int; pragma Import (C, Winsch, "winsch"); begin if Winsch (Win, Ch) = Curses_Err then raise Curses_Exception; end if; end Insert; procedure Insert (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Ch : Attributed_Character) is function Mvwinsch (Win : Window; Lin : C_Int; Col : C_Int; Ch : Attributed_Character) return C_Int; pragma Import (C, Mvwinsch, "mvwinsch"); begin if Mvwinsch (Win, C_Int (Line), C_Int (Column), Ch) = Curses_Err then raise Curses_Exception; end if; end Insert; ------------------------------------------------------------------------------ procedure Insert (Win : Window := Standard_Window; Str : String; Len : Integer := -1) is function Winsnstr (Win : Window; Str : char_array; Len : Integer := -1) return C_Int; pragma Import (C, Winsnstr, "winsnstr"); Txt : char_array (0 .. Str'Length); Length : size_t; begin To_C (Str, Txt, Length); if Winsnstr (Win, Txt, Len) = Curses_Err then raise Curses_Exception; end if; end Insert; procedure Insert (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : String; Len : Integer := -1) is function Mvwinsnstr (Win : Window; Line : C_Int; Column : C_Int; Str : char_array; Len : C_Int) return C_Int; pragma Import (C, Mvwinsnstr, "mvwinsnstr"); Txt : char_array (0 .. Str'Length); Length : size_t; begin To_C (Str, Txt, Length); if Mvwinsnstr (Win, C_Int (Line), C_Int (Column), Txt, C_Int (Len)) = Curses_Err then raise Curses_Exception; end if; end Insert; ------------------------------------------------------------------------------ procedure Peek (Win : Window := Standard_Window; Str : out String; Len : Integer := -1) is function Winnstr (Win : Window; Str : char_array; Len : C_Int) return C_Int; pragma Import (C, Winnstr, "winnstr"); N : Integer := Len; Txt : char_array (0 .. Str'Length); Cnt : Natural; begin if N < 0 then N := Str'Length; end if; if N > Str'Length then raise Constraint_Error; end if; Txt (0) := Interfaces.C.char'First; if Winnstr (Win, Txt, C_Int (N)) = Curses_Err then raise Curses_Exception; end if; To_Ada (Txt, Str, Cnt, True); if Cnt < Str'Length then Str ((Str'First + Cnt) .. Str'Last) := (others => ' '); end if; end Peek; procedure Peek (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : out String; Len : Integer := -1) is begin Move_Cursor (Win, Line, Column); Peek (Win, Str, Len); end Peek; ------------------------------------------------------------------------------ procedure Peek (Win : Window := Standard_Window; Str : out Attributed_String; Len : Integer := -1) is function Winchnstr (Win : Window; Str : chtype_array; -- out Len : C_Int) return C_Int; pragma Import (C, Winchnstr, "winchnstr"); N : Integer := Len; Txt : constant chtype_array (0 .. Str'Length) := (0 => Default_Character); Cnt : Natural := 0; begin if N < 0 then N := Str'Length; end if; if N > Str'Length then raise Constraint_Error; end if; if Winchnstr (Win, Txt, C_Int (N)) = Curses_Err then raise Curses_Exception; end if; for To in Str'Range loop exit when Txt (size_t (Cnt)) = Default_Character; Str (To) := Txt (size_t (Cnt)); Cnt := Cnt + 1; end loop; if Cnt < Str'Length then Str ((Str'First + Cnt) .. Str'Last) := (others => (Ch => ' ', Color => Color_Pair'First, Attr => Normal_Video)); end if; end Peek; procedure Peek (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : out Attributed_String; Len : Integer := -1) is begin Move_Cursor (Win, Line, Column); Peek (Win, Str, Len); end Peek; ------------------------------------------------------------------------------ procedure Get (Win : Window := Standard_Window; Str : out String; Len : Integer := -1) is function Wgetnstr (Win : Window; Str : char_array; Len : C_Int) return C_Int; pragma Import (C, Wgetnstr, "wgetnstr"); N : Integer := Len; Txt : char_array (0 .. Str'Length); Cnt : Natural; begin if N < 0 then N := Str'Length; end if; if N > Str'Length then raise Constraint_Error; end if; Txt (0) := Interfaces.C.char'First; if Wgetnstr (Win, Txt, C_Int (N)) = Curses_Err then raise Curses_Exception; end if; To_Ada (Txt, Str, Cnt, True); if Cnt < Str'Length then Str ((Str'First + Cnt) .. Str'Last) := (others => ' '); end if; end Get; procedure Get (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : out String; Len : Integer := -1) is begin Move_Cursor (Win, Line, Column); Get (Win, Str, Len); end Get; ------------------------------------------------------------------------------ procedure Init_Soft_Label_Keys (Format : Soft_Label_Key_Format := Three_Two_Three) is function Slk_Init (Fmt : C_Int) return C_Int; pragma Import (C, Slk_Init, "slk_init"); begin if Slk_Init (Soft_Label_Key_Format'Pos (Format)) = Curses_Err then raise Curses_Exception; end if; end Init_Soft_Label_Keys; procedure Set_Soft_Label_Key (Label : Label_Number; Text : String; Fmt : Label_Justification := Left) is function Slk_Set (Label : C_Int; Txt : char_array; Fmt : C_Int) return C_Int; pragma Import (C, Slk_Set, "slk_set"); Txt : char_array (0 .. Text'Length); Len : size_t; begin To_C (Text, Txt, Len); if Slk_Set (C_Int (Label), Txt, C_Int (Label_Justification'Pos (Fmt))) = Curses_Err then raise Curses_Exception; end if; end Set_Soft_Label_Key; procedure Refresh_Soft_Label_Keys is function Slk_Refresh return C_Int; pragma Import (C, Slk_Refresh, "slk_refresh"); begin if Slk_Refresh = Curses_Err then raise Curses_Exception; end if; end Refresh_Soft_Label_Keys; procedure Refresh_Soft_Label_Keys_Without_Update is function Slk_Noutrefresh return C_Int; pragma Import (C, Slk_Noutrefresh, "slk_noutrefresh"); begin if Slk_Noutrefresh = Curses_Err then raise Curses_Exception; end if; end Refresh_Soft_Label_Keys_Without_Update; procedure Get_Soft_Label_Key (Label : Label_Number; Text : out String) is function Slk_Label (Label : C_Int) return chars_ptr; pragma Import (C, Slk_Label, "slk_label"); begin Fill_String (Slk_Label (C_Int (Label)), Text); end Get_Soft_Label_Key; function Get_Soft_Label_Key (Label : Label_Number) return String is function Slk_Label (Label : C_Int) return chars_ptr; pragma Import (C, Slk_Label, "slk_label"); begin return Fill_String (Slk_Label (C_Int (Label))); end Get_Soft_Label_Key; procedure Clear_Soft_Label_Keys is function Slk_Clear return C_Int; pragma Import (C, Slk_Clear, "slk_clear"); begin if Slk_Clear = Curses_Err then raise Curses_Exception; end if; end Clear_Soft_Label_Keys; procedure Restore_Soft_Label_Keys is function Slk_Restore return C_Int; pragma Import (C, Slk_Restore, "slk_restore"); begin if Slk_Restore = Curses_Err then raise Curses_Exception; end if; end Restore_Soft_Label_Keys; procedure Touch_Soft_Label_Keys is function Slk_Touch return C_Int; pragma Import (C, Slk_Touch, "slk_touch"); begin if Slk_Touch = Curses_Err then raise Curses_Exception; end if; end Touch_Soft_Label_Keys; procedure Switch_Soft_Label_Key_Attributes (Attr : Character_Attribute_Set; On : Boolean := True) is function Slk_Attron (Ch : Attributed_Character) return C_Int; pragma Import (C, Slk_Attron, "slk_attron"); function Slk_Attroff (Ch : Attributed_Character) return C_Int; pragma Import (C, Slk_Attroff, "slk_attroff"); Err : C_Int; Ch : constant Attributed_Character := (Ch => Character'First, Attr => Attr, Color => Color_Pair'First); begin if On then Err := Slk_Attron (Ch); else Err := Slk_Attroff (Ch); end if; if Err = Curses_Err then raise Curses_Exception; end if; end Switch_Soft_Label_Key_Attributes; procedure Set_Soft_Label_Key_Attributes (Attr : Character_Attribute_Set := Normal_Video; Color : Color_Pair := Color_Pair'First) is function Slk_Attrset (Ch : Attributed_Character) return C_Int; pragma Import (C, Slk_Attrset, "slk_attrset"); Ch : constant Attributed_Character := (Ch => Character'First, Attr => Attr, Color => Color); begin if Slk_Attrset (Ch) = Curses_Err then raise Curses_Exception; end if; end Set_Soft_Label_Key_Attributes; function Get_Soft_Label_Key_Attributes return Character_Attribute_Set is function Slk_Attr return Attributed_Character; pragma Import (C, Slk_Attr, "slk_attr"); Attr : constant Attributed_Character := Slk_Attr; begin return Attr.Attr; end Get_Soft_Label_Key_Attributes; function Get_Soft_Label_Key_Attributes return Color_Pair is function Slk_Attr return Attributed_Character; pragma Import (C, Slk_Attr, "slk_attr"); Attr : constant Attributed_Character := Slk_Attr; begin return Attr.Color; end Get_Soft_Label_Key_Attributes; procedure Set_Soft_Label_Key_Color (Pair : Color_Pair) is function Slk_Color (Color : C_Short) return C_Int; pragma Import (C, Slk_Color, "slk_color"); begin if Slk_Color (C_Short (Pair)) = Curses_Err then raise Curses_Exception; end if; end Set_Soft_Label_Key_Color; ------------------------------------------------------------------------------ procedure Enable_Key (Key : Special_Key_Code; Enable : Boolean := True) is function Keyok (Keycode : C_Int; On_Off : Curses_Bool) return C_Int; pragma Import (C, Keyok, "keyok"); begin if Keyok (C_Int (Key), Curses_Bool (Boolean'Pos (Enable))) = Curses_Err then raise Curses_Exception; end if; end Enable_Key; ------------------------------------------------------------------------------ procedure Define_Key (Definition : String; Key : Special_Key_Code) is function Defkey (Def : char_array; Key : C_Int) return C_Int; pragma Import (C, Defkey, "define_key"); Txt : char_array (0 .. Definition'Length); Length : size_t; begin To_C (Definition, Txt, Length); if Defkey (Txt, C_Int (Key)) = Curses_Err then raise Curses_Exception; end if; end Define_Key; ------------------------------------------------------------------------------ procedure Un_Control (Ch : Attributed_Character; Str : out String) is function Unctrl (Ch : Attributed_Character) return chars_ptr; pragma Import (C, Unctrl, "unctrl"); begin Fill_String (Unctrl (Ch), Str); end Un_Control; function Un_Control (Ch : Attributed_Character) return String is function Unctrl (Ch : Attributed_Character) return chars_ptr; pragma Import (C, Unctrl, "unctrl"); begin return Fill_String (Unctrl (Ch)); end Un_Control; procedure Delay_Output (Msecs : Natural) is function Delayoutput (Msecs : C_Int) return C_Int; pragma Import (C, Delayoutput, "delay_output"); begin if Delayoutput (C_Int (Msecs)) = Curses_Err then raise Curses_Exception; end if; end Delay_Output; procedure Flush_Input is function Flushinp return C_Int; pragma Import (C, Flushinp, "flushinp"); begin if Flushinp = Curses_Err then -- docu says that never happens, but... raise Curses_Exception; end if; end Flush_Input; ------------------------------------------------------------------------------ function Baudrate return Natural is function Baud return C_Int; pragma Import (C, Baud, "baudrate"); begin return Natural (Baud); end Baudrate; function Erase_Character return Character is function Erasechar return C_Int; pragma Import (C, Erasechar, "erasechar"); begin return Character'Val (Erasechar); end Erase_Character; function Kill_Character return Character is function Killchar return C_Int; pragma Import (C, Killchar, "killchar"); begin return Character'Val (Killchar); end Kill_Character; function Has_Insert_Character return Boolean is function Has_Ic return Curses_Bool; pragma Import (C, Has_Ic, "has_ic"); begin if Has_Ic = Curses_Bool_False then return False; else return True; end if; end Has_Insert_Character; function Has_Insert_Line return Boolean is function Has_Il return Curses_Bool; pragma Import (C, Has_Il, "has_il"); begin if Has_Il = Curses_Bool_False then return False; else return True; end if; end Has_Insert_Line; function Supported_Attributes return Character_Attribute_Set is function Termattrs return Attributed_Character; pragma Import (C, Termattrs, "termattrs"); Ch : constant Attributed_Character := Termattrs; begin return Ch.Attr; end Supported_Attributes; procedure Long_Name (Name : out String) is function Longname return chars_ptr; pragma Import (C, Longname, "longname"); begin Fill_String (Longname, Name); end Long_Name; function Long_Name return String is function Longname return chars_ptr; pragma Import (C, Longname, "longname"); begin return Fill_String (Longname); end Long_Name; procedure Terminal_Name (Name : out String) is function Termname return chars_ptr; pragma Import (C, Termname, "termname"); begin Fill_String (Termname, Name); end Terminal_Name; function Terminal_Name return String is function Termname return chars_ptr; pragma Import (C, Termname, "termname"); begin return Fill_String (Termname); end Terminal_Name; ------------------------------------------------------------------------------ procedure Init_Pair (Pair : Redefinable_Color_Pair; Fore : Color_Number; Back : Color_Number) is function Initpair (Pair : C_Short; Fore : C_Short; Back : C_Short) return C_Int; pragma Import (C, Initpair, "init_pair"); begin if Integer (Pair) >= Number_Of_Color_Pairs then raise Constraint_Error; end if; if Integer (Fore) >= Number_Of_Colors or else Integer (Back) >= Number_Of_Colors then raise Constraint_Error; end if; if Initpair (C_Short (Pair), C_Short (Fore), C_Short (Back)) = Curses_Err then raise Curses_Exception; end if; end Init_Pair; procedure Pair_Content (Pair : Color_Pair; Fore : out Color_Number; Back : out Color_Number) is type C_Short_Access is access all C_Short; function Paircontent (Pair : C_Short; Fp : C_Short_Access; Bp : C_Short_Access) return C_Int; pragma Import (C, Paircontent, "pair_content"); F, B : aliased C_Short; begin if Paircontent (C_Short (Pair), F'Access, B'Access) = Curses_Err then raise Curses_Exception; else Fore := Color_Number (F); Back := Color_Number (B); end if; end Pair_Content; function Has_Colors return Boolean is function Hascolors return Curses_Bool; pragma Import (C, Hascolors, "has_colors"); begin if Hascolors = Curses_Bool_False then return False; else return True; end if; end Has_Colors; procedure Init_Color (Color : Color_Number; Red : RGB_Value; Green : RGB_Value; Blue : RGB_Value) is function Initcolor (Col : C_Short; Red : C_Short; Green : C_Short; Blue : C_Short) return C_Int; pragma Import (C, Initcolor, "init_color"); begin if Initcolor (C_Short (Color), C_Short (Red), C_Short (Green), C_Short (Blue)) = Curses_Err then raise Curses_Exception; end if; end Init_Color; function Can_Change_Color return Boolean is function Canchangecolor return Curses_Bool; pragma Import (C, Canchangecolor, "can_change_color"); begin if Canchangecolor = Curses_Bool_False then return False; else return True; end if; end Can_Change_Color; procedure Color_Content (Color : Color_Number; Red : out RGB_Value; Green : out RGB_Value; Blue : out RGB_Value) is type C_Short_Access is access all C_Short; function Colorcontent (Color : C_Short; R, G, B : C_Short_Access) return C_Int; pragma Import (C, Colorcontent, "color_content"); R, G, B : aliased C_Short; begin if Colorcontent (C_Short (Color), R'Access, G'Access, B'Access) = Curses_Err then raise Curses_Exception; else Red := RGB_Value (R); Green := RGB_Value (G); Blue := RGB_Value (B); end if; end Color_Content; ------------------------------------------------------------------------------ procedure Save_Curses_Mode (Mode : Curses_Mode) is function Def_Prog_Mode return C_Int; pragma Import (C, Def_Prog_Mode, "def_prog_mode"); function Def_Shell_Mode return C_Int; pragma Import (C, Def_Shell_Mode, "def_shell_mode"); Err : C_Int; begin case Mode is when Curses => Err := Def_Prog_Mode; when Shell => Err := Def_Shell_Mode; end case; if Err = Curses_Err then raise Curses_Exception; end if; end Save_Curses_Mode; procedure Reset_Curses_Mode (Mode : Curses_Mode) is function Reset_Prog_Mode return C_Int; pragma Import (C, Reset_Prog_Mode, "reset_prog_mode"); function Reset_Shell_Mode return C_Int; pragma Import (C, Reset_Shell_Mode, "reset_shell_mode"); Err : C_Int; begin case Mode is when Curses => Err := Reset_Prog_Mode; when Shell => Err := Reset_Shell_Mode; end case; if Err = Curses_Err then raise Curses_Exception; end if; end Reset_Curses_Mode; procedure Save_Terminal_State is function Savetty return C_Int; pragma Import (C, Savetty, "savetty"); begin if Savetty = Curses_Err then raise Curses_Exception; end if; end Save_Terminal_State; procedure Reset_Terminal_State is function Resetty return C_Int; pragma Import (C, Resetty, "resetty"); begin if Resetty = Curses_Err then raise Curses_Exception; end if; end Reset_Terminal_State; procedure Rip_Off_Lines (Lines : Integer; Proc : Stdscr_Init_Proc) is function Ripoffline (Lines : C_Int; Proc : Stdscr_Init_Proc) return C_Int; pragma Import (C, Ripoffline, "_nc_ripoffline"); begin if Ripoffline (C_Int (Lines), Proc) = Curses_Err then raise Curses_Exception; end if; end Rip_Off_Lines; procedure Set_Cursor_Visibility (Visibility : in out Cursor_Visibility) is function Curs_Set (Curs : C_Int) return C_Int; pragma Import (C, Curs_Set, "curs_set"); Res : C_Int; begin Res := Curs_Set (Cursor_Visibility'Pos (Visibility)); if Res /= Curses_Err then Visibility := Cursor_Visibility'Val (Res); end if; end Set_Cursor_Visibility; procedure Nap_Milli_Seconds (Ms : Natural) is function Napms (Ms : C_Int) return C_Int; pragma Import (C, Napms, "napms"); begin if Napms (C_Int (Ms)) = Curses_Err then raise Curses_Exception; end if; end Nap_Milli_Seconds; ------------------------------------------------------------------------------ function Lines return Line_Count is function LINES_As_Function return Interfaces.C.int; pragma Import (C, LINES_As_Function, "LINES_as_function"); begin return Line_Count (LINES_As_Function); end Lines; function Columns return Column_Count is function COLS_As_Function return Interfaces.C.int; pragma Import (C, COLS_As_Function, "COLS_as_function"); begin return Column_Count (COLS_As_Function); end Columns; function Tab_Size return Natural is function TABSIZE_As_Function return Interfaces.C.int; pragma Import (C, TABSIZE_As_Function, "TABSIZE_as_function"); begin return Natural (TABSIZE_As_Function); end Tab_Size; function Number_Of_Colors return Natural is function COLORS_As_Function return Interfaces.C.int; pragma Import (C, COLORS_As_Function, "COLORS_as_function"); begin return Natural (COLORS_As_Function); end Number_Of_Colors; function Number_Of_Color_Pairs return Natural is function COLOR_PAIRS_As_Function return Interfaces.C.int; pragma Import (C, COLOR_PAIRS_As_Function, "COLOR_PAIRS_as_function"); begin return Natural (COLOR_PAIRS_As_Function); end Number_Of_Color_Pairs; ------------------------------------------------------------------------------ procedure Transform_Coordinates (W : Window := Standard_Window; Line : in out Line_Position; Column : in out Column_Position; Dir : Transform_Direction := From_Screen) is type Int_Access is access all C_Int; function Transform (W : Window; Y, X : Int_Access; Dir : Curses_Bool) return C_Int; pragma Import (C, Transform, "wmouse_trafo"); X : aliased C_Int := C_Int (Column); Y : aliased C_Int := C_Int (Line); D : Curses_Bool := Curses_Bool_False; R : C_Int; begin if Dir = To_Screen then D := 1; end if; R := Transform (W, Y'Access, X'Access, D); if R = Curses_False then raise Curses_Exception; else Line := Line_Position (Y); Column := Column_Position (X); end if; end Transform_Coordinates; ------------------------------------------------------------------------------ procedure Use_Default_Colors is function C_Use_Default_Colors return C_Int; pragma Import (C, C_Use_Default_Colors, "use_default_colors"); Err : constant C_Int := C_Use_Default_Colors; begin if Err = Curses_Err then raise Curses_Exception; end if; end Use_Default_Colors; procedure Assume_Default_Colors (Fore : Color_Number := Default_Color; Back : Color_Number := Default_Color) is function C_Assume_Default_Colors (Fore : C_Int; Back : C_Int) return C_Int; pragma Import (C, C_Assume_Default_Colors, "assume_default_colors"); Err : constant C_Int := C_Assume_Default_Colors (C_Int (Fore), C_Int (Back)); begin if Err = Curses_Err then raise Curses_Exception; end if; end Assume_Default_Colors; ------------------------------------------------------------------------------ function Curses_Version return String is function curses_versionC return chars_ptr; pragma Import (C, curses_versionC, "curses_version"); Result : constant chars_ptr := curses_versionC; begin return Fill_String (Result); end Curses_Version; ------------------------------------------------------------------------------ procedure Curses_Free_All is procedure curses_freeall; pragma Import (C, curses_freeall, "_nc_freeall"); begin -- Use this only for testing: you cannot use curses after calling it, -- so it has to be the "last" thing done before exiting the program. -- This will not really free ALL of memory used by curses. That is -- because it cannot free the memory used for stdout's setbuf. The -- _nc_free_and_exit() procedure can do that, but it can be invoked -- safely only from C - and again, that only as the "last" thing done -- before exiting the program. curses_freeall; end Curses_Free_All; ------------------------------------------------------------------------------ function Use_Extended_Names (Enable : Boolean) return Boolean is function use_extended_namesC (e : Curses_Bool) return C_Int; pragma Import (C, use_extended_namesC, "use_extended_names"); Res : constant C_Int := use_extended_namesC (Curses_Bool (Boolean'Pos (Enable))); begin if Res = C_Int (Curses_Bool_False) then return False; else return True; end if; end Use_Extended_Names; ------------------------------------------------------------------------------ procedure Screen_Dump_To_File (Filename : String) is function scr_dump (f : char_array) return C_Int; pragma Import (C, scr_dump, "scr_dump"); Txt : char_array (0 .. Filename'Length); Length : size_t; begin To_C (Filename, Txt, Length); if Curses_Err = scr_dump (Txt) then raise Curses_Exception; end if; end Screen_Dump_To_File; procedure Screen_Restore_From_File (Filename : String) is function scr_restore (f : char_array) return C_Int; pragma Import (C, scr_restore, "scr_restore"); Txt : char_array (0 .. Filename'Length); Length : size_t; begin To_C (Filename, Txt, Length); if Curses_Err = scr_restore (Txt) then raise Curses_Exception; end if; end Screen_Restore_From_File; procedure Screen_Init_From_File (Filename : String) is function scr_init (f : char_array) return C_Int; pragma Import (C, scr_init, "scr_init"); Txt : char_array (0 .. Filename'Length); Length : size_t; begin To_C (Filename, Txt, Length); if Curses_Err = scr_init (Txt) then raise Curses_Exception; end if; end Screen_Init_From_File; procedure Screen_Set_File (Filename : String) is function scr_set (f : char_array) return C_Int; pragma Import (C, scr_set, "scr_set"); Txt : char_array (0 .. Filename'Length); Length : size_t; begin To_C (Filename, Txt, Length); if Curses_Err = scr_set (Txt) then raise Curses_Exception; end if; end Screen_Set_File; ------------------------------------------------------------------------------ procedure Resize (Win : Window := Standard_Window; Number_Of_Lines : Line_Count; Number_Of_Columns : Column_Count) is function wresize (win : Window; lines : C_Int; columns : C_Int) return C_Int; pragma Import (C, wresize); begin if wresize (Win, C_Int (Number_Of_Lines), C_Int (Number_Of_Columns)) = Curses_Err then raise Curses_Exception; end if; end Resize; ------------------------------------------------------------------------------ end Terminal_Interface.Curses; ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-forms-field_user_data.ads.m40000644000000000000000000000760213615656212026466 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-trace.ads.m40000644000000000000000000001453113615656212023325 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-menus.ads.m40000644000000000000000000005370013615656212023357 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-panels.ads.m40000644000000000000000000001330713615656212023511 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-forms.ads.m40000644000000000000000000007207613615656212023365 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses.ads.m40000644000000000000000000022405513615656212022235 0ustar rootroot-- -*- ada -*- define(`HTMLNAME',`terminal_interface-curses__ads.htm')dnl include(M4MACRO)------------------------------------------------------------------------------ -- -- -- GNAT ncurses Binding -- -- -- -- Terminal_Interface.Curses -- -- -- -- S P E C -- -- -- ------------------------------------------------------------------------------ -- Copyright 2020 Thomas E. Dickey -- -- Copyright 1998-2011,2014 Free Software Foundation, Inc. -- -- -- -- Permission is hereby granted, free of charge, to any person obtaining a -- -- copy of this software and associated documentation files (the -- -- "Software"), to deal in the Software without restriction, including -- -- without limitation the rights to use, copy, modify, merge, publish, -- -- distribute, distribute with modifications, sublicense, and/or sell -- -- copies of the Software, and to permit persons to whom the Software is -- -- furnished to do so, subject to the following conditions: -- -- -- -- The above copyright notice and this permission notice shall be included -- -- in all copies or substantial portions of the Software. -- -- -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- -- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- -- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- -- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- -- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- -- -- -- Except as contained in this notice, the name(s) of the above copyright -- -- holders shall not be used in advertising or otherwise to promote the -- -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------ -- Author: Juergen Pfeifer, 1996 -- Version Control: -- $Revision: 1.48 $ -- $Date: 2020/02/02 23:34:34 $ -- Binding Version 01.00 ------------------------------------------------------------------------------ with System.Storage_Elements; with Interfaces.C; -- We need this for some assertions. with Terminal_Interface.Curses_Constants; package Terminal_Interface.Curses is pragma Preelaborate (Terminal_Interface.Curses); pragma Linker_Options ("-lncurses" & Curses_Constants.DFT_ARG_SUFFIX); Major_Version : constant := Curses_Constants.NCURSES_VERSION_MAJOR; Minor_Version : constant := Curses_Constants.NCURSES_VERSION_MINOR; NC_Version : String renames Curses_Constants.Version; type Window is private; Null_Window : constant Window; type Line_Position is new Integer; -- line coordinate type Column_Position is new Integer; -- column coordinate subtype Line_Count is Line_Position range 1 .. Line_Position'Last; -- Type to count lines. We do not allow null windows, so must be positive subtype Column_Count is Column_Position range 1 .. Column_Position'Last; -- Type to count columns. We do not allow null windows, so must be positive type Key_Code is new Integer; -- That is anything including real characters, special keys and logical -- request codes. -- FIXME: The "-1" should be Curses_Err subtype Real_Key_Code is Key_Code range -1 .. Curses_Constants.KEY_MAX; -- This are the codes that potentially represent a real keystroke. -- Not all codes may be possible on a specific terminal. To check the -- availability of a special key, the Has_Key function is provided. subtype Special_Key_Code is Real_Key_Code range Curses_Constants. KEY_MIN - 1 .. Real_Key_Code'Last; -- Type for a function- or special key number subtype Normal_Key_Code is Real_Key_Code range Character'Pos (Character'First) .. Character'Pos (Character'Last); -- This are the codes for regular (incl. non-graphical) characters. -- For those who like to use the original key names we produce them were -- they differ from the original. -- Constants for function- and special keys Key_None : constant Special_Key_Code := Curses_Constants.KEY_MIN - 1; Key_Min : constant Special_Key_Code := Curses_Constants.KEY_MIN; Key_Break : constant Special_Key_Code := Curses_Constants.KEY_BREAK; KEY_DOWN : constant Special_Key_Code := Curses_Constants.KEY_DOWN; Key_Cursor_Down : Special_Key_Code renames KEY_DOWN; KEY_UP : constant Special_Key_Code := Curses_Constants.KEY_UP; Key_Cursor_Up : Special_Key_Code renames KEY_UP; KEY_LEFT : constant Special_Key_Code := Curses_Constants.KEY_LEFT; Key_Cursor_Left : Special_Key_Code renames KEY_LEFT; KEY_RIGHT : constant Special_Key_Code := Curses_Constants.KEY_RIGHT; Key_Cursor_Right : Special_Key_Code renames KEY_RIGHT; Key_Home : constant Special_Key_Code := Curses_Constants.KEY_HOME; Key_Backspace : constant Special_Key_Code := Curses_Constants.KEY_BACKSPACE; Key_F0 : constant Special_Key_Code := Curses_Constants.KEY_F0; Key_F1 : constant Special_Key_Code := Curses_Constants.KEY_F1; Key_F2 : constant Special_Key_Code := Curses_Constants.KEY_F2; Key_F3 : constant Special_Key_Code := Curses_Constants.KEY_F3; Key_F4 : constant Special_Key_Code := Curses_Constants.KEY_F4; Key_F5 : constant Special_Key_Code := Curses_Constants.KEY_F5; Key_F6 : constant Special_Key_Code := Curses_Constants.KEY_F6; Key_F7 : constant Special_Key_Code := Curses_Constants.KEY_F7; Key_F8 : constant Special_Key_Code := Curses_Constants.KEY_F8; Key_F9 : constant Special_Key_Code := Curses_Constants.KEY_F9; Key_F10 : constant Special_Key_Code := Curses_Constants.KEY_F10; Key_F11 : constant Special_Key_Code := Curses_Constants.KEY_F11; Key_F12 : constant Special_Key_Code := Curses_Constants.KEY_F12; Key_F13 : constant Special_Key_Code := Curses_Constants.KEY_F13; Key_F14 : constant Special_Key_Code := Curses_Constants.KEY_F14; Key_F15 : constant Special_Key_Code := Curses_Constants.KEY_F15; Key_F16 : constant Special_Key_Code := Curses_Constants.KEY_F16; Key_F17 : constant Special_Key_Code := Curses_Constants.KEY_F17; Key_F18 : constant Special_Key_Code := Curses_Constants.KEY_F18; Key_F19 : constant Special_Key_Code := Curses_Constants.KEY_F19; Key_F20 : constant Special_Key_Code := Curses_Constants.KEY_F20; Key_F21 : constant Special_Key_Code := Curses_Constants.KEY_F21; Key_F22 : constant Special_Key_Code := Curses_Constants.KEY_F22; Key_F23 : constant Special_Key_Code := Curses_Constants.KEY_F23; Key_F24 : constant Special_Key_Code := Curses_Constants.KEY_F24; KEY_DL : constant Special_Key_Code := Curses_Constants.KEY_DL; Key_Delete_Line : Special_Key_Code renames KEY_DL; KEY_IL : constant Special_Key_Code := Curses_Constants.KEY_IL; Key_Insert_Line : Special_Key_Code renames KEY_IL; KEY_DC : constant Special_Key_Code := Curses_Constants.KEY_DC; Key_Delete_Char : Special_Key_Code renames KEY_DC; KEY_IC : constant Special_Key_Code := Curses_Constants.KEY_IC; Key_Insert_Char : Special_Key_Code renames KEY_IC; KEY_EIC : constant Special_Key_Code := Curses_Constants.KEY_EIC; Key_Exit_Insert_Mode : Special_Key_Code renames KEY_EIC; KEY_CLEAR : constant Special_Key_Code := Curses_Constants.KEY_CLEAR; Key_Clear_Screen : Special_Key_Code renames KEY_CLEAR; KEY_EOS : constant Special_Key_Code := Curses_Constants.KEY_EOS; Key_Clear_End_Of_Screen : Special_Key_Code renames KEY_EOS; KEY_EOL : constant Special_Key_Code := Curses_Constants.KEY_EOL; Key_Clear_End_Of_Line : Special_Key_Code renames KEY_EOL; KEY_SF : constant Special_Key_Code := Curses_Constants.KEY_SF; Key_Scroll_1_Forward : Special_Key_Code renames KEY_SF; KEY_SR : constant Special_Key_Code := Curses_Constants.KEY_SR; Key_Scroll_1_Backward : Special_Key_Code renames KEY_SR; KEY_NPAGE : constant Special_Key_Code := Curses_Constants.KEY_NPAGE; Key_Next_Page : Special_Key_Code renames KEY_NPAGE; KEY_PPAGE : constant Special_Key_Code := Curses_Constants.KEY_PPAGE; Key_Previous_Page : Special_Key_Code renames KEY_PPAGE; KEY_STAB : constant Special_Key_Code := Curses_Constants.KEY_STAB; Key_Set_Tab : Special_Key_Code renames KEY_STAB; KEY_CTAB : constant Special_Key_Code := Curses_Constants.KEY_CTAB; Key_Clear_Tab : Special_Key_Code renames KEY_CTAB; KEY_CATAB : constant Special_Key_Code := Curses_Constants.KEY_CATAB; Key_Clear_All_Tabs : Special_Key_Code renames KEY_CATAB; KEY_ENTER : constant Special_Key_Code := Curses_Constants.KEY_ENTER; Key_Enter_Or_Send : Special_Key_Code renames KEY_ENTER; KEY_SRESET : constant Special_Key_Code := Curses_Constants.KEY_SRESET; Key_Soft_Reset : Special_Key_Code renames KEY_SRESET; Key_Reset : constant Special_Key_Code := Curses_Constants.KEY_RESET; Key_Print : constant Special_Key_Code := Curses_Constants.KEY_PRINT; KEY_LL : constant Special_Key_Code := Curses_Constants.KEY_LL; Key_Bottom : Special_Key_Code renames KEY_LL; KEY_A1 : constant Special_Key_Code := Curses_Constants.KEY_A1; Key_Upper_Left_Of_Keypad : Special_Key_Code renames KEY_A1; KEY_A3 : constant Special_Key_Code := Curses_Constants.KEY_A3; Key_Upper_Right_Of_Keypad : Special_Key_Code renames KEY_A3; KEY_B2 : constant Special_Key_Code := Curses_Constants.KEY_B2; Key_Center_Of_Keypad : Special_Key_Code renames KEY_B2; KEY_C1 : constant Special_Key_Code := Curses_Constants.KEY_C1; Key_Lower_Left_Of_Keypad : Special_Key_Code renames KEY_C1; KEY_C3 : constant Special_Key_Code := Curses_Constants.KEY_C3; Key_Lower_Right_Of_Keypad : Special_Key_Code renames KEY_C3; KEY_BTAB : constant Special_Key_Code := Curses_Constants.KEY_BTAB; Key_Back_Tab : Special_Key_Code renames KEY_BTAB; KEY_BEG : constant Special_Key_Code := Curses_Constants.KEY_BEG; Key_Beginning : Special_Key_Code renames KEY_BEG; Key_Cancel : constant Special_Key_Code := Curses_Constants.KEY_CANCEL; Key_Close : constant Special_Key_Code := Curses_Constants.KEY_CLOSE; Key_Command : constant Special_Key_Code := Curses_Constants.KEY_COMMAND; Key_Copy : constant Special_Key_Code := Curses_Constants.KEY_COPY; Key_Create : constant Special_Key_Code := Curses_Constants.KEY_CREATE; Key_End : constant Special_Key_Code := Curses_Constants.KEY_END; Key_Exit : constant Special_Key_Code := Curses_Constants.KEY_EXIT; Key_Find : constant Special_Key_Code := Curses_Constants.KEY_FIND; Key_Help : constant Special_Key_Code := Curses_Constants.KEY_HELP; Key_Mark : constant Special_Key_Code := Curses_Constants.KEY_MARK; Key_Message : constant Special_Key_Code := Curses_Constants.KEY_MESSAGE; Key_Move : constant Special_Key_Code := Curses_Constants.KEY_MOVE; Key_Next : constant Special_Key_Code := Curses_Constants.KEY_NEXT; Key_Open : constant Special_Key_Code := Curses_Constants.KEY_OPEN; Key_Options : constant Special_Key_Code := Curses_Constants.KEY_OPTIONS; Key_Previous : constant Special_Key_Code := Curses_Constants.KEY_PREVIOUS; Key_Redo : constant Special_Key_Code := Curses_Constants.KEY_REDO; Key_Reference : constant Special_Key_Code := Curses_Constants.KEY_REFERENCE; Key_Refresh : constant Special_Key_Code := Curses_Constants.KEY_REFRESH; Key_Replace : constant Special_Key_Code := Curses_Constants.KEY_REPLACE; Key_Restart : constant Special_Key_Code := Curses_Constants.KEY_RESTART; Key_Resume : constant Special_Key_Code := Curses_Constants.KEY_RESUME; Key_Save : constant Special_Key_Code := Curses_Constants.KEY_SAVE; KEY_SBEG : constant Special_Key_Code := Curses_Constants.KEY_SBEG; Key_Shift_Begin : Special_Key_Code renames KEY_SBEG; KEY_SCANCEL : constant Special_Key_Code := Curses_Constants.KEY_SCANCEL; Key_Shift_Cancel : Special_Key_Code renames KEY_SCANCEL; KEY_SCOMMAND : constant Special_Key_Code := Curses_Constants.KEY_SCOMMAND; Key_Shift_Command : Special_Key_Code renames KEY_SCOMMAND; KEY_SCOPY : constant Special_Key_Code := Curses_Constants.KEY_SCOPY; Key_Shift_Copy : Special_Key_Code renames KEY_SCOPY; KEY_SCREATE : constant Special_Key_Code := Curses_Constants.KEY_SCREATE; Key_Shift_Create : Special_Key_Code renames KEY_SCREATE; KEY_SDC : constant Special_Key_Code := Curses_Constants.KEY_SDC; Key_Shift_Delete_Char : Special_Key_Code renames KEY_SDC; KEY_SDL : constant Special_Key_Code := Curses_Constants.KEY_SDL; Key_Shift_Delete_Line : Special_Key_Code renames KEY_SDL; Key_Select : constant Special_Key_Code := Curses_Constants.KEY_SELECT; KEY_SEND : constant Special_Key_Code := Curses_Constants.KEY_SEND; Key_Shift_End : Special_Key_Code renames KEY_SEND; KEY_SEOL : constant Special_Key_Code := Curses_Constants.KEY_SEOL; Key_Shift_Clear_End_Of_Line : Special_Key_Code renames KEY_SEOL; KEY_SEXIT : constant Special_Key_Code := Curses_Constants.KEY_SEXIT; Key_Shift_Exit : Special_Key_Code renames KEY_SEXIT; KEY_SFIND : constant Special_Key_Code := Curses_Constants.KEY_SFIND; Key_Shift_Find : Special_Key_Code renames KEY_SFIND; KEY_SHELP : constant Special_Key_Code := Curses_Constants.KEY_SHELP; Key_Shift_Help : Special_Key_Code renames KEY_SHELP; KEY_SHOME : constant Special_Key_Code := Curses_Constants.KEY_SHOME; Key_Shift_Home : Special_Key_Code renames KEY_SHOME; KEY_SIC : constant Special_Key_Code := Curses_Constants.KEY_SIC; Key_Shift_Insert_Char : Special_Key_Code renames KEY_SIC; KEY_SLEFT : constant Special_Key_Code := Curses_Constants.KEY_SLEFT; Key_Shift_Cursor_Left : Special_Key_Code renames KEY_SLEFT; KEY_SMESSAGE : constant Special_Key_Code := Curses_Constants.KEY_SMESSAGE; Key_Shift_Message : Special_Key_Code renames KEY_SMESSAGE; KEY_SMOVE : constant Special_Key_Code := Curses_Constants.KEY_SMOVE; Key_Shift_Move : Special_Key_Code renames KEY_SMOVE; KEY_SNEXT : constant Special_Key_Code := Curses_Constants.KEY_SNEXT; Key_Shift_Next_Page : Special_Key_Code renames KEY_SNEXT; KEY_SOPTIONS : constant Special_Key_Code := Curses_Constants.KEY_SOPTIONS; Key_Shift_Options : Special_Key_Code renames KEY_SOPTIONS; KEY_SPREVIOUS : constant Special_Key_Code := Curses_Constants.KEY_SPREVIOUS; Key_Shift_Previous_Page : Special_Key_Code renames KEY_SPREVIOUS; KEY_SPRINT : constant Special_Key_Code := Curses_Constants.KEY_SPRINT; Key_Shift_Print : Special_Key_Code renames KEY_SPRINT; KEY_SREDO : constant Special_Key_Code := Curses_Constants.KEY_SREDO; Key_Shift_Redo : Special_Key_Code renames KEY_SREDO; KEY_SREPLACE : constant Special_Key_Code := Curses_Constants.KEY_SREPLACE; Key_Shift_Replace : Special_Key_Code renames KEY_SREPLACE; KEY_SRIGHT : constant Special_Key_Code := Curses_Constants.KEY_SRIGHT; Key_Shift_Cursor_Right : Special_Key_Code renames KEY_SRIGHT; KEY_SRSUME : constant Special_Key_Code := Curses_Constants.KEY_SRSUME; Key_Shift_Resume : Special_Key_Code renames KEY_SRSUME; KEY_SSAVE : constant Special_Key_Code := Curses_Constants.KEY_SSAVE; Key_Shift_Save : Special_Key_Code renames KEY_SSAVE; KEY_SSUSPEND : constant Special_Key_Code := Curses_Constants.KEY_SSUSPEND; Key_Shift_Suspend : Special_Key_Code renames KEY_SSUSPEND; KEY_SUNDO : constant Special_Key_Code := Curses_Constants.KEY_SUNDO; Key_Shift_Undo : Special_Key_Code renames KEY_SUNDO; Key_Suspend : constant Special_Key_Code := Curses_Constants.KEY_SUSPEND; Key_Undo : constant Special_Key_Code := Curses_Constants.KEY_UNDO; Key_Mouse : constant Special_Key_Code := Curses_Constants.KEY_MOUSE; Key_Resize : constant Special_Key_Code := Curses_Constants.KEY_RESIZE; Key_Max : constant Special_Key_Code := Special_Key_Code'Last; subtype User_Key_Code is Key_Code range (Key_Max + 129) .. Key_Code'Last; -- This is reserved for user defined key codes. The range between Key_Max -- and the first user code is reserved for subsystems like menu and forms. -------------------------------------------------------------------------- type Color_Number is range -1 .. Integer (Interfaces.C.short'Last); for Color_Number'Size use Interfaces.C.short'Size; -- (n)curses uses a short for the color index -- The model is, that a Color_Number is an index into an array of -- (potentially) definable colors. Some of those indices are -- predefined (see below), although they may not really exist. Black : constant Color_Number := Curses_Constants.COLOR_BLACK; Red : constant Color_Number := Curses_Constants.COLOR_RED; Green : constant Color_Number := Curses_Constants.COLOR_GREEN; Yellow : constant Color_Number := Curses_Constants.COLOR_YELLOW; Blue : constant Color_Number := Curses_Constants.COLOR_BLUE; Magenta : constant Color_Number := Curses_Constants.COLOR_MAGENTA; Cyan : constant Color_Number := Curses_Constants.COLOR_CYAN; White : constant Color_Number := Curses_Constants.COLOR_WHITE; type RGB_Value is range 0 .. Integer (Interfaces.C.short'Last); for RGB_Value'Size use Interfaces.C.short'Size; -- Some system may allow to redefine a color by setting RGB values. type Color_Pair is range 0 .. 255; for Color_Pair'Size use 8; subtype Redefinable_Color_Pair is Color_Pair range 1 .. 255; -- (n)curses reserves 1 Byte for the color-pair number. Color Pair 0 -- is fixed (Black & White). A color pair is simply a combination of -- two colors described by Color_Numbers, one for the foreground and -- the other for the background type Character_Attribute_Set is record Stand_Out : Boolean; Under_Line : Boolean; Reverse_Video : Boolean; Blink : Boolean; Dim_Character : Boolean; Bold_Character : Boolean; Protected_Character : Boolean; Invisible_Character : Boolean; Alternate_Character_Set : Boolean; Horizontal : Boolean; Left : Boolean; Low : Boolean; Right : Boolean; Top : Boolean; Vertical : Boolean; end record; for Character_Attribute_Set use record Stand_Out at 0 range Curses_Constants.A_STANDOUT_First - Curses_Constants.Attr_First .. Curses_Constants.A_STANDOUT_Last - Curses_Constants.Attr_First; Under_Line at 0 range Curses_Constants.A_UNDERLINE_First - Curses_Constants.Attr_First .. Curses_Constants.A_UNDERLINE_Last - Curses_Constants.Attr_First; Reverse_Video at 0 range Curses_Constants.A_REVERSE_First - Curses_Constants.Attr_First .. Curses_Constants.A_REVERSE_Last - Curses_Constants.Attr_First; Blink at 0 range Curses_Constants.A_BLINK_First - Curses_Constants.Attr_First .. Curses_Constants.A_BLINK_Last - Curses_Constants.Attr_First; Dim_Character at 0 range Curses_Constants.A_DIM_First - Curses_Constants.Attr_First .. Curses_Constants.A_DIM_Last - Curses_Constants.Attr_First; Bold_Character at 0 range Curses_Constants.A_BOLD_First - Curses_Constants.Attr_First .. Curses_Constants.A_BOLD_Last - Curses_Constants.Attr_First; Protected_Character at 0 range Curses_Constants.A_PROTECT_First - Curses_Constants.Attr_First .. Curses_Constants.A_PROTECT_Last - Curses_Constants.Attr_First; Invisible_Character at 0 range Curses_Constants.A_INVIS_First - Curses_Constants.Attr_First .. Curses_Constants.A_INVIS_Last - Curses_Constants.Attr_First; Alternate_Character_Set at 0 range Curses_Constants.A_ALTCHARSET_First - Curses_Constants.Attr_First .. Curses_Constants.A_ALTCHARSET_Last - Curses_Constants.Attr_First; Horizontal at 0 range Curses_Constants.A_HORIZONTAL_First - Curses_Constants.Attr_First .. Curses_Constants.A_HORIZONTAL_Last - Curses_Constants.Attr_First; Left at 0 range Curses_Constants.A_LEFT_First - Curses_Constants.Attr_First .. Curses_Constants.A_LEFT_Last - Curses_Constants.Attr_First; Low at 0 range Curses_Constants.A_LOW_First - Curses_Constants.Attr_First .. Curses_Constants.A_LOW_Last - Curses_Constants.Attr_First; Right at 0 range Curses_Constants.A_RIGHT_First - Curses_Constants.Attr_First .. Curses_Constants.A_RIGHT_Last - Curses_Constants.Attr_First; Top at 0 range Curses_Constants.A_TOP_First - Curses_Constants.Attr_First .. Curses_Constants.A_TOP_Last - Curses_Constants.Attr_First; Vertical at 0 range Curses_Constants.A_VERTICAL_First - Curses_Constants.Attr_First .. Curses_Constants.A_VERTICAL_Last - Curses_Constants.Attr_First; end record; Normal_Video : constant Character_Attribute_Set := (others => False); type Attributed_Character is record Attr : Character_Attribute_Set; Color : Color_Pair; Ch : Character; end record; pragma Convention (C_Pass_By_Copy, Attributed_Character); -- This is the counterpart for the chtype in C. for Attributed_Character use record Ch at 0 range Curses_Constants.A_CHARTEXT_First .. Curses_Constants.A_CHARTEXT_Last; Color at 0 range Curses_Constants.A_COLOR_First .. Curses_Constants.A_COLOR_Last; pragma Warnings (Off); Attr at 0 range Curses_Constants.Attr_First .. Curses_Constants.Attr_Last; pragma Warnings (On); end record; for Attributed_Character'Size use Curses_Constants.chtype_Size; Default_Character : constant Attributed_Character := (Ch => Character'First, Color => Color_Pair'First, Attr => (others => False)); -- preelaboratable Normal_Video type Attributed_String is array (Positive range <>) of Attributed_Character; pragma Convention (C, Attributed_String); -- In this binding we allow strings of attributed characters. ------------------ -- Exceptions -- ------------------ Curses_Exception : exception; Wrong_Curses_Version : exception; -- Those exceptions are raised by the ETI (Extended Terminal Interface) -- subpackets for Menu and Forms handling. -- Eti_System_Error : exception; Eti_Bad_Argument : exception; Eti_Posted : exception; Eti_Connected : exception; Eti_Bad_State : exception; Eti_No_Room : exception; Eti_Not_Posted : exception; Eti_Unknown_Command : exception; Eti_No_Match : exception; Eti_Not_Selectable : exception; Eti_Not_Connected : exception; Eti_Request_Denied : exception; Eti_Invalid_Field : exception; Eti_Current : exception; -------------------------------------------------------------------------- -- External C variables -- Conceptually even in C this are kind of constants, but they are -- initialized and sometimes changed by the library routines at runtime -- depending on the type of terminal. I believe the best way to model -- this is to use functions. -------------------------------------------------------------------------- function Lines return Line_Count; pragma Inline (Lines); function Columns return Column_Count; pragma Inline (Columns); function Tab_Size return Natural; pragma Inline (Tab_Size); function Number_Of_Colors return Natural; pragma Inline (Number_Of_Colors); function Number_Of_Color_Pairs return Natural; pragma Inline (Number_Of_Color_Pairs); subtype ACS_Index is Character range Character'Val (0) .. Character'Val (127); function ACS_Map (Index : ACS_Index) return Attributed_Character; pragma Import (C, ACS_Map, "acs_map_as_function"); -- Constants for several characters from the Alternate Character Set -- You must use these constants as indices into the ACS_Map function -- to get the corresponding attributed character at runtime ACS_Upper_Left_Corner : constant ACS_Index := Character'Val (Curses_Constants.ACS_ULCORNER); ACS_Lower_Left_Corner : constant ACS_Index := Character'Val (Curses_Constants.ACS_LLCORNER); ACS_Upper_Right_Corner : constant ACS_Index := Character'Val (Curses_Constants.ACS_URCORNER); ACS_Lower_Right_Corner : constant ACS_Index := Character'Val (Curses_Constants.ACS_LRCORNER); ACS_Left_Tee : constant ACS_Index := Character'Val (Curses_Constants.ACS_LTEE); ACS_Right_Tee : constant ACS_Index := Character'Val (Curses_Constants.ACS_RTEE); ACS_Bottom_Tee : constant ACS_Index := Character'Val (Curses_Constants.ACS_BTEE); ACS_Top_Tee : constant ACS_Index := Character'Val (Curses_Constants.ACS_TTEE); ACS_Horizontal_Line : constant ACS_Index := Character'Val (Curses_Constants.ACS_HLINE); ACS_Vertical_Line : constant ACS_Index := Character'Val (Curses_Constants.ACS_VLINE); ACS_Plus_Symbol : constant ACS_Index := Character'Val (Curses_Constants.ACS_PLUS); ACS_Scan_Line_1 : constant ACS_Index := Character'Val (Curses_Constants.ACS_S1); ACS_Scan_Line_9 : constant ACS_Index := Character'Val (Curses_Constants.ACS_S9); ACS_Diamond : constant ACS_Index := Character'Val (Curses_Constants.ACS_DIAMOND); ACS_Checker_Board : constant ACS_Index := Character'Val (Curses_Constants.ACS_CKBOARD); ACS_Degree : constant ACS_Index := Character'Val (Curses_Constants.ACS_DEGREE); ACS_Plus_Minus : constant ACS_Index := Character'Val (Curses_Constants.ACS_PLMINUS); ACS_Bullet : constant ACS_Index := Character'Val (Curses_Constants.ACS_BULLET); ACS_Left_Arrow : constant ACS_Index := Character'Val (Curses_Constants.ACS_LARROW); ACS_Right_Arrow : constant ACS_Index := Character'Val (Curses_Constants.ACS_RARROW); ACS_Down_Arrow : constant ACS_Index := Character'Val (Curses_Constants.ACS_DARROW); ACS_Up_Arrow : constant ACS_Index := Character'Val (Curses_Constants.ACS_UARROW); ACS_Board_Of_Squares : constant ACS_Index := Character'Val (Curses_Constants.ACS_BOARD); ACS_Lantern : constant ACS_Index := Character'Val (Curses_Constants.ACS_LANTERN); ACS_Solid_Block : constant ACS_Index := Character'Val (Curses_Constants.ACS_BLOCK); ACS_Scan_Line_3 : constant ACS_Index := Character'Val (Curses_Constants.ACS_S3); ACS_Scan_Line_7 : constant ACS_Index := Character'Val (Curses_Constants.ACS_S7); ACS_Less_Or_Equal : constant ACS_Index := Character'Val (Curses_Constants.ACS_LEQUAL); ACS_Greater_Or_Equal : constant ACS_Index := Character'Val (Curses_Constants.ACS_GEQUAL); ACS_PI : constant ACS_Index := Character'Val (Curses_Constants.ACS_PI); ACS_Not_Equal : constant ACS_Index := Character'Val (Curses_Constants.ACS_NEQUAL); ACS_Sterling : constant ACS_Index := Character'Val (Curses_Constants.ACS_STERLING); -- MANPAGE(`curs_initscr.3x') -- | Not implemented: newterm, set_term, delscreen -- ANCHOR(`stdscr',`Standard_Window') function Standard_Window return Window; -- AKA pragma Import (C, Standard_Window, "stdscr_as_function"); pragma Inline (Standard_Window); -- ANCHOR(`curscr',`Current_Window') function Current_Window return Window; -- AKA pragma Import (C, Current_Window, "curscr_as_function"); pragma Inline (Current_Window); -- ANCHOR(`initscr()',`Init_Screen') procedure Init_Screen; -- ANCHOR(`initscr()',`Init_Windows') procedure Init_Windows renames Init_Screen; -- AKA pragma Inline (Init_Screen); -- pragma Inline (Init_Windows); -- ANCHOR(`endwin()',`End_Windows') procedure End_Windows; -- AKA procedure End_Screen renames End_Windows; pragma Inline (End_Windows); -- pragma Inline (End_Screen); -- ANCHOR(`isendwin()',`Is_End_Window') function Is_End_Window return Boolean; -- AKA pragma Inline (Is_End_Window); -- MANPAGE(`curs_move.3x') -- ANCHOR(`wmove()',`Move_Cursor') procedure Move_Cursor (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position); -- AKA -- ALIAS(`move()') pragma Inline (Move_Cursor); -- MANPAGE(`curs_addch.3x') -- ANCHOR(`waddch()',`Add') procedure Add (Win : Window := Standard_Window; Ch : Attributed_Character); -- AKA -- ALIAS(`addch()') procedure Add (Win : Window := Standard_Window; Ch : Character); -- Add a single character at the current logical cursor position to -- the window. Use the current windows attributes. -- ANCHOR(`mvwaddch()',`Add') procedure Add (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Ch : Attributed_Character); -- AKA -- ALIAS(`mvaddch()') procedure Add (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Ch : Character); -- Move to the position and add a single character into the window -- There are more Add routines, so the Inline pragma follows later -- ANCHOR(`wechochar()',`Add_With_Immediate_Echo') procedure Add_With_Immediate_Echo (Win : Window := Standard_Window; Ch : Attributed_Character); -- AKA -- ALIAS(`echochar()') procedure Add_With_Immediate_Echo (Win : Window := Standard_Window; Ch : Character); -- Add a character and do an immediate refresh of the screen. pragma Inline (Add_With_Immediate_Echo); -- MANPAGE(`curs_window.3x') -- Not Implemented: wcursyncup -- ANCHOR(`newwin()',`Create') function Create (Number_Of_Lines : Line_Count; Number_Of_Columns : Column_Count; First_Line_Position : Line_Position; First_Column_Position : Column_Position) return Window; -- Not Implemented: Default Number_Of_Lines, Number_Of_Columns -- the C version lets them be 0, see the man page. -- AKA pragma Inline (Create); function New_Window (Number_Of_Lines : Line_Count; Number_Of_Columns : Column_Count; First_Line_Position : Line_Position; First_Column_Position : Column_Position) return Window renames Create; -- pragma Inline (New_Window); -- ANCHOR(`delwin()',`Delete') procedure Delete (Win : in out Window); -- AKA -- Reset Win to Null_Window pragma Inline (Delete); -- ANCHOR(`subwin()',`Sub_Window') function Sub_Window (Win : Window := Standard_Window; Number_Of_Lines : Line_Count; Number_Of_Columns : Column_Count; First_Line_Position : Line_Position; First_Column_Position : Column_Position) return Window; -- AKA pragma Inline (Sub_Window); -- ANCHOR(`derwin()',`Derived_Window') function Derived_Window (Win : Window := Standard_Window; Number_Of_Lines : Line_Count; Number_Of_Columns : Column_Count; First_Line_Position : Line_Position; First_Column_Position : Column_Position) return Window; -- AKA pragma Inline (Derived_Window); -- ANCHOR(`dupwin()',`Duplicate') function Duplicate (Win : Window) return Window; -- AKA pragma Inline (Duplicate); -- ANCHOR(`mvwin()',`Move_Window') procedure Move_Window (Win : Window; Line : Line_Position; Column : Column_Position); -- AKA pragma Inline (Move_Window); -- ANCHOR(`mvderwin()',`Move_Derived_Window') procedure Move_Derived_Window (Win : Window; Line : Line_Position; Column : Column_Position); -- AKA pragma Inline (Move_Derived_Window); -- ANCHOR(`wsyncup()',`Synchronize_Upwards') procedure Synchronize_Upwards (Win : Window); -- AKA pragma Import (C, Synchronize_Upwards, "wsyncup"); -- ANCHOR(`wsyncdown()',`Synchronize_Downwards') procedure Synchronize_Downwards (Win : Window); -- AKA pragma Import (C, Synchronize_Downwards, "wsyncdown"); -- ANCHOR(`syncok()',`Set_Synch_Mode') procedure Set_Synch_Mode (Win : Window := Standard_Window; Mode : Boolean := False); -- AKA pragma Inline (Set_Synch_Mode); -- MANPAGE(`curs_addstr.3x') -- ANCHOR(`waddnstr()',`Add') procedure Add (Win : Window := Standard_Window; Str : String; Len : Integer := -1); -- AKA -- ALIAS(`waddstr()') -- ALIAS(`addnstr()') -- ALIAS(`addstr()') -- ANCHOR(`mvwaddnstr()',`Add') procedure Add (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : String; Len : Integer := -1); -- AKA -- ALIAS(`mvwaddstr()') -- ALIAS(`mvaddnstr()') -- ALIAS(`mvaddstr()') -- MANPAGE(`curs_addchstr.3x') -- ANCHOR(`waddchnstr()',`Add') procedure Add (Win : Window := Standard_Window; Str : Attributed_String; Len : Integer := -1); -- AKA -- ALIAS(`waddchstr()') -- ALIAS(`addchnstr()') -- ALIAS(`addchstr()') -- ANCHOR(`mvwaddchnstr()',`Add') procedure Add (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : Attributed_String; Len : Integer := -1); -- AKA -- ALIAS(`mvwaddchstr()') -- ALIAS(`mvaddchnstr()') -- ALIAS(`mvaddchstr()') pragma Inline (Add); -- MANPAGE(`curs_border.3x') -- | Not implemented: mvhline, mvwhline, mvvline, mvwvline -- | use Move_Cursor then Horizontal_Line or Vertical_Line -- ANCHOR(`wborder()',`Border') procedure Border (Win : Window := Standard_Window; Left_Side_Symbol : Attributed_Character := Default_Character; Right_Side_Symbol : Attributed_Character := Default_Character; Top_Side_Symbol : Attributed_Character := Default_Character; Bottom_Side_Symbol : Attributed_Character := Default_Character; Upper_Left_Corner_Symbol : Attributed_Character := Default_Character; Upper_Right_Corner_Symbol : Attributed_Character := Default_Character; Lower_Left_Corner_Symbol : Attributed_Character := Default_Character; Lower_Right_Corner_Symbol : Attributed_Character := Default_Character ); -- AKA -- ALIAS(`border()') pragma Inline (Border); -- ANCHOR(`box()',`Box') procedure Box (Win : Window := Standard_Window; Vertical_Symbol : Attributed_Character := Default_Character; Horizontal_Symbol : Attributed_Character := Default_Character); -- AKA pragma Inline (Box); -- ANCHOR(`whline()',`Horizontal_Line') procedure Horizontal_Line (Win : Window := Standard_Window; Line_Size : Natural; Line_Symbol : Attributed_Character := Default_Character); -- AKA -- ALIAS(`hline()') pragma Inline (Horizontal_Line); -- ANCHOR(`wvline()',`Vertical_Line') procedure Vertical_Line (Win : Window := Standard_Window; Line_Size : Natural; Line_Symbol : Attributed_Character := Default_Character); -- AKA -- ALIAS(`vline()') pragma Inline (Vertical_Line); -- MANPAGE(`curs_getch.3x') -- Not implemented: mvgetch, mvwgetch -- ANCHOR(`wgetch()',`Get_Keystroke') function Get_Keystroke (Win : Window := Standard_Window) return Real_Key_Code; -- AKA -- ALIAS(`getch()') -- Get a character from the keyboard and echo it - if enabled - to the -- window. -- If for any reason (i.e. a timeout) we could not get a character the -- returned keycode is Key_None. pragma Inline (Get_Keystroke); -- ANCHOR(`ungetch()',`Undo_Keystroke') procedure Undo_Keystroke (Key : Real_Key_Code); -- AKA pragma Inline (Undo_Keystroke); -- ANCHOR(`has_key()',`Has_Key') function Has_Key (Key : Special_Key_Code) return Boolean; -- AKA pragma Inline (Has_Key); -- | -- | Some helper functions -- | function Is_Function_Key (Key : Special_Key_Code) return Boolean; -- Return True if the Key is a function key (i.e. one of F0 .. F63) pragma Inline (Is_Function_Key); subtype Function_Key_Number is Integer range 0 .. 63; -- (n)curses allows for 64 function keys. function Function_Key (Key : Real_Key_Code) return Function_Key_Number; -- Return the number of the function key. If the code is not a -- function key, a CONSTRAINT_ERROR will be raised. pragma Inline (Function_Key); function Function_Key_Code (Key : Function_Key_Number) return Real_Key_Code; -- Return the key code for a given function-key number. pragma Inline (Function_Key_Code); -- MANPAGE(`curs_attr.3x') -- | Not implemented attr_off, wattr_off, -- | attr_on, wattr_on, attr_set, wattr_set -- PAIR_NUMBER -- PAIR_NUMBER(c) is the same as c.Color -- ANCHOR(`standout()',`Standout') procedure Standout (Win : Window := Standard_Window; On : Boolean := True); -- ALIAS(`wstandout()') -- ALIAS(`wstandend()') -- ANCHOR(`wattron()',`Switch_Character_Attribute') procedure Switch_Character_Attribute (Win : Window := Standard_Window; Attr : Character_Attribute_Set := Normal_Video; On : Boolean := True); -- if False we switch Off. -- Switches those Attributes set to true in the list. -- AKA -- ALIAS(`wattroff()') -- ALIAS(`attron()') -- ALIAS(`attroff()') -- ANCHOR(`wattrset()',`Set_Character_Attributes') procedure Set_Character_Attributes (Win : Window := Standard_Window; Attr : Character_Attribute_Set := Normal_Video; Color : Color_Pair := Color_Pair'First); -- AKA -- ALIAS(`attrset()') pragma Inline (Set_Character_Attributes); -- ANCHOR(`wattr_get()',`Get_Character_Attributes') function Get_Character_Attribute (Win : Window := Standard_Window) return Character_Attribute_Set; -- AKA -- ALIAS(`attr_get()') -- ANCHOR(`wattr_get()',`Get_Character_Attribute') function Get_Character_Attribute (Win : Window := Standard_Window) return Color_Pair; -- AKA pragma Inline (Get_Character_Attribute); -- ANCHOR(`wcolor_set()',`Set_Color') procedure Set_Color (Win : Window := Standard_Window; Pair : Color_Pair); -- AKA -- ALIAS(`color_set()') pragma Inline (Set_Color); -- ANCHOR(`wchgat()',`Change_Attributes') procedure Change_Attributes (Win : Window := Standard_Window; Count : Integer := -1; Attr : Character_Attribute_Set := Normal_Video; Color : Color_Pair := Color_Pair'First); -- AKA -- ALIAS(`chgat()') -- ANCHOR(`mvwchgat()',`Change_Attributes') procedure Change_Attributes (Win : Window := Standard_Window; Line : Line_Position := Line_Position'First; Column : Column_Position := Column_Position'First; Count : Integer := -1; Attr : Character_Attribute_Set := Normal_Video; Color : Color_Pair := Color_Pair'First); -- AKA -- ALIAS(`mvchgat()') pragma Inline (Change_Attributes); -- MANPAGE(`curs_beep.3x') -- ANCHOR(`beep()',`Beep') procedure Beep; -- AKA pragma Inline (Beep); -- ANCHOR(`flash()',`Flash_Screen') procedure Flash_Screen; -- AKA pragma Inline (Flash_Screen); -- MANPAGE(`curs_inopts.3x') -- | Not implemented : typeahead -- -- ANCHOR(`cbreak()',`Set_Cbreak_Mode') procedure Set_Cbreak_Mode (SwitchOn : Boolean := True); -- AKA -- ALIAS(`nocbreak()') pragma Inline (Set_Cbreak_Mode); -- ANCHOR(`raw()',`Set_Raw_Mode') procedure Set_Raw_Mode (SwitchOn : Boolean := True); -- AKA -- ALIAS(`noraw()') pragma Inline (Set_Raw_Mode); -- ANCHOR(`echo()',`Set_Echo_Mode') procedure Set_Echo_Mode (SwitchOn : Boolean := True); -- AKA -- ALIAS(`noecho()') pragma Inline (Set_Echo_Mode); -- ANCHOR(`meta()',`Set_Meta_Mode') procedure Set_Meta_Mode (Win : Window := Standard_Window; SwitchOn : Boolean := True); -- AKA pragma Inline (Set_Meta_Mode); -- ANCHOR(`keypad()',`Set_KeyPad_Mode') procedure Set_KeyPad_Mode (Win : Window := Standard_Window; SwitchOn : Boolean := True); -- AKA pragma Inline (Set_KeyPad_Mode); function Get_KeyPad_Mode (Win : Window := Standard_Window) return Boolean; -- This has no pendant in C. There you've to look into the WINDOWS -- structure to get the value. Bad practice, not repeated in Ada. type Half_Delay_Amount is range 1 .. 255; -- ANCHOR(`halfdelay()',`Half_Delay') procedure Half_Delay (Amount : Half_Delay_Amount); -- AKA pragma Inline (Half_Delay); -- ANCHOR(`intrflush()',`Set_Flush_On_Interrupt_Mode') procedure Set_Flush_On_Interrupt_Mode (Win : Window := Standard_Window; Mode : Boolean := True); -- AKA pragma Inline (Set_Flush_On_Interrupt_Mode); -- ANCHOR(`qiflush()',`Set_Queue_Interrupt_Mode') procedure Set_Queue_Interrupt_Mode (Win : Window := Standard_Window; Flush : Boolean := True); -- AKA -- ALIAS(`noqiflush()') pragma Inline (Set_Queue_Interrupt_Mode); -- ANCHOR(`nodelay()',`Set_NoDelay_Mode') procedure Set_NoDelay_Mode (Win : Window := Standard_Window; Mode : Boolean := False); -- AKA pragma Inline (Set_NoDelay_Mode); type Timeout_Mode is (Blocking, Non_Blocking, Delayed); -- ANCHOR(`wtimeout()',`Set_Timeout_Mode') procedure Set_Timeout_Mode (Win : Window := Standard_Window; Mode : Timeout_Mode; Amount : Natural); -- in Milliseconds -- AKA -- ALIAS(`timeout()') -- Instead of overloading the semantic of the sign of amount, we -- introduce the Timeout_Mode parameter. This should improve -- readability. For Blocking and Non_Blocking, the Amount is not -- evaluated. -- We do not inline this procedure. -- ANCHOR(`notimeout()',`Set_Escape_Time_Mode') procedure Set_Escape_Timer_Mode (Win : Window := Standard_Window; Timer_Off : Boolean := False); -- AKA pragma Inline (Set_Escape_Timer_Mode); -- MANPAGE(`curs_outopts.3x') -- ANCHOR(`nl()',`Set_NL_Mode') procedure Set_NL_Mode (SwitchOn : Boolean := True); -- AKA -- ALIAS(`nonl()') pragma Inline (Set_NL_Mode); -- ANCHOR(`clearok()',`Clear_On_Next_Update') procedure Clear_On_Next_Update (Win : Window := Standard_Window; Do_Clear : Boolean := True); -- AKA pragma Inline (Clear_On_Next_Update); -- ANCHOR(`idlok()',`Use_Insert_Delete_Line') procedure Use_Insert_Delete_Line (Win : Window := Standard_Window; Do_Idl : Boolean := True); -- AKA pragma Inline (Use_Insert_Delete_Line); -- ANCHOR(`idcok()',`Use_Insert_Delete_Character') procedure Use_Insert_Delete_Character (Win : Window := Standard_Window; Do_Idc : Boolean := True); -- AKA pragma Inline (Use_Insert_Delete_Character); -- ANCHOR(`leaveok()',`Leave_Cursor_After_Update') procedure Leave_Cursor_After_Update (Win : Window := Standard_Window; Do_Leave : Boolean := True); -- AKA pragma Inline (Leave_Cursor_After_Update); -- ANCHOR(`immedok()',`Immediate_Update_Mode') procedure Immediate_Update_Mode (Win : Window := Standard_Window; Mode : Boolean := False); -- AKA pragma Inline (Immediate_Update_Mode); -- ANCHOR(`scrollok()',`Allow_Scrolling') procedure Allow_Scrolling (Win : Window := Standard_Window; Mode : Boolean := False); -- AKA pragma Inline (Allow_Scrolling); function Scrolling_Allowed (Win : Window := Standard_Window) return Boolean; -- There is no such function in the C interface. pragma Inline (Scrolling_Allowed); -- ANCHOR(`wsetscrreg()',`Set_Scroll_Region') procedure Set_Scroll_Region (Win : Window := Standard_Window; Top_Line : Line_Position; Bottom_Line : Line_Position); -- AKA -- ALIAS(`setscrreg()') pragma Inline (Set_Scroll_Region); -- MANPAGE(`curs_refresh.3x') -- ANCHOR(`doupdate()',`Update_Screen') procedure Update_Screen; -- AKA pragma Inline (Update_Screen); -- ANCHOR(`wrefresh()',`Refresh') procedure Refresh (Win : Window := Standard_Window); -- AKA -- There is an overloaded Refresh for Pads. -- The Inline pragma appears there -- ALIAS(`refresh()') -- ANCHOR(`wnoutrefresh()',`Refresh_Without_Update') procedure Refresh_Without_Update (Win : Window := Standard_Window); -- AKA -- There is an overloaded Refresh_Without_Update for Pads. -- The Inline pragma appears there -- ANCHOR(`redrawwin()',`Redraw') procedure Redraw (Win : Window := Standard_Window); -- AKA -- ANCHOR(`wredrawln()',`Redraw') procedure Redraw (Win : Window := Standard_Window; Begin_Line : Line_Position; Line_Count : Positive); -- AKA pragma Inline (Redraw); -- MANPAGE(`curs_clear.3x') -- ANCHOR(`werase()',`Erase') procedure Erase (Win : Window := Standard_Window); -- AKA -- ALIAS(`erase()') pragma Inline (Erase); -- ANCHOR(`wclear()',`Clear') procedure Clear (Win : Window := Standard_Window); -- AKA -- ALIAS(`clear()') pragma Inline (Clear); -- ANCHOR(`wclrtobot()',`Clear_To_End_Of_Screen') procedure Clear_To_End_Of_Screen (Win : Window := Standard_Window); -- AKA -- ALIAS(`clrtobot()') pragma Inline (Clear_To_End_Of_Screen); -- ANCHOR(`wclrtoeol()',`Clear_To_End_Of_Line') procedure Clear_To_End_Of_Line (Win : Window := Standard_Window); -- AKA -- ALIAS(`clrtoeol()') pragma Inline (Clear_To_End_Of_Line); -- MANPAGE(`curs_bkgd.3x') -- ANCHOR(`wbkgdset()',`Set_Background') -- TODO: we could have Set_Background(Window; Character_Attribute_Set) -- because in C it is common to see bkgdset(A_BOLD) or -- bkgdset(COLOR_PAIR(n)) procedure Set_Background (Win : Window := Standard_Window; Ch : Attributed_Character); -- AKA -- ALIAS(`bkgdset()') pragma Inline (Set_Background); -- ANCHOR(`wbkgd()',`Change_Background') procedure Change_Background (Win : Window := Standard_Window; Ch : Attributed_Character); -- AKA -- ALIAS(`bkgd()') pragma Inline (Change_Background); -- ANCHOR(`wbkgdget()',`Get_Background') -- ? wbkgdget is not listed in curs_bkgd, getbkgd is thpough. function Get_Background (Win : Window := Standard_Window) return Attributed_Character; -- AKA -- ALIAS(`bkgdget()') pragma Inline (Get_Background); -- MANPAGE(`curs_touch.3x') -- ANCHOR(`untouchwin()',`Untouch') procedure Untouch (Win : Window := Standard_Window); -- AKA pragma Inline (Untouch); -- ANCHOR(`touchwin()',`Touch') procedure Touch (Win : Window := Standard_Window); -- AKA -- ANCHOR(`touchline()',`Touch') procedure Touch (Win : Window := Standard_Window; Start : Line_Position; Count : Positive); -- AKA pragma Inline (Touch); -- ANCHOR(`wtouchln()',`Change_Line_Status') procedure Change_Lines_Status (Win : Window := Standard_Window; Start : Line_Position; Count : Positive; State : Boolean); -- AKA pragma Inline (Change_Lines_Status); -- ANCHOR(`is_linetouched()',`Is_Touched') function Is_Touched (Win : Window := Standard_Window; Line : Line_Position) return Boolean; -- AKA -- ANCHOR(`is_wintouched()',`Is_Touched') function Is_Touched (Win : Window := Standard_Window) return Boolean; -- AKA pragma Inline (Is_Touched); -- MANPAGE(`curs_overlay.3x') -- ANCHOR(`copywin()',`Copy') procedure Copy (Source_Window : Window; Destination_Window : Window; Source_Top_Row : Line_Position; Source_Left_Column : Column_Position; Destination_Top_Row : Line_Position; Destination_Left_Column : Column_Position; Destination_Bottom_Row : Line_Position; Destination_Right_Column : Column_Position; Non_Destructive_Mode : Boolean := True); -- AKA pragma Inline (Copy); -- ANCHOR(`overwrite()',`Overwrite') procedure Overwrite (Source_Window : Window; Destination_Window : Window); -- AKA pragma Inline (Overwrite); -- ANCHOR(`overlay()',`Overlay') procedure Overlay (Source_Window : Window; Destination_Window : Window); -- AKA pragma Inline (Overlay); -- MANPAGE(`curs_deleteln.3x') -- ANCHOR(`winsdelln()',`Insert_Delete_Lines') procedure Insert_Delete_Lines (Win : Window := Standard_Window; Lines : Integer := 1); -- default is to insert one line above -- AKA -- ALIAS(`insdelln()') pragma Inline (Insert_Delete_Lines); -- ANCHOR(`wdeleteln()',`Delete_Line') procedure Delete_Line (Win : Window := Standard_Window); -- AKA -- ALIAS(`deleteln()') pragma Inline (Delete_Line); -- ANCHOR(`winsertln()',`Insert_Line') procedure Insert_Line (Win : Window := Standard_Window); -- AKA -- ALIAS(`insertln()') pragma Inline (Insert_Line); -- MANPAGE(`curs_getyx.3x') -- ANCHOR(`getmaxyx()',`Get_Size') procedure Get_Size (Win : Window := Standard_Window; Number_Of_Lines : out Line_Count; Number_Of_Columns : out Column_Count); -- AKA pragma Inline (Get_Size); -- ANCHOR(`getbegyx()',`Get_Window_Position') procedure Get_Window_Position (Win : Window := Standard_Window; Top_Left_Line : out Line_Position; Top_Left_Column : out Column_Position); -- AKA pragma Inline (Get_Window_Position); -- ANCHOR(`getyx()',`Get_Cursor_Position') procedure Get_Cursor_Position (Win : Window := Standard_Window; Line : out Line_Position; Column : out Column_Position); -- AKA pragma Inline (Get_Cursor_Position); -- ANCHOR(`getparyx()',`Get_Origin_Relative_To_Parent') procedure Get_Origin_Relative_To_Parent (Win : Window; Top_Left_Line : out Line_Position; Top_Left_Column : out Column_Position; Is_Not_A_Subwindow : out Boolean); -- AKA -- Instead of placing -1 in the coordinates as return, we use a Boolean -- to return the info that the window has no parent. pragma Inline (Get_Origin_Relative_To_Parent); -- MANPAGE(`curs_pad.3x') -- ANCHOR(`newpad()',`New_Pad') function New_Pad (Lines : Line_Count; Columns : Column_Count) return Window; -- AKA pragma Inline (New_Pad); -- ANCHOR(`subpad()',`Sub_Pad') function Sub_Pad (Pad : Window; Number_Of_Lines : Line_Count; Number_Of_Columns : Column_Count; First_Line_Position : Line_Position; First_Column_Position : Column_Position) return Window; -- AKA pragma Inline (Sub_Pad); -- ANCHOR(`prefresh()',`Refresh') procedure Refresh (Pad : Window; Source_Top_Row : Line_Position; Source_Left_Column : Column_Position; Destination_Top_Row : Line_Position; Destination_Left_Column : Column_Position; Destination_Bottom_Row : Line_Position; Destination_Right_Column : Column_Position); -- AKA pragma Inline (Refresh); -- ANCHOR(`pnoutrefresh()',`Refresh_Without_Update') procedure Refresh_Without_Update (Pad : Window; Source_Top_Row : Line_Position; Source_Left_Column : Column_Position; Destination_Top_Row : Line_Position; Destination_Left_Column : Column_Position; Destination_Bottom_Row : Line_Position; Destination_Right_Column : Column_Position); -- AKA pragma Inline (Refresh_Without_Update); -- ANCHOR(`pechochar()',`Add_Character_To_Pad_And_Echo_It') procedure Add_Character_To_Pad_And_Echo_It (Pad : Window; Ch : Attributed_Character); -- AKA procedure Add_Character_To_Pad_And_Echo_It (Pad : Window; Ch : Character); pragma Inline (Add_Character_To_Pad_And_Echo_It); -- MANPAGE(`curs_scroll.3x') -- ANCHOR(`wscrl()',`Scroll') procedure Scroll (Win : Window := Standard_Window; Amount : Integer := 1); -- AKA -- ALIAS(`scroll()') -- ALIAS(`scrl()') pragma Inline (Scroll); -- MANPAGE(`curs_delch.3x') -- ANCHOR(`wdelch()',`Delete_Character') procedure Delete_Character (Win : Window := Standard_Window); -- AKA -- ALIAS(`delch()') -- ANCHOR(`mvwdelch()',`Delete_Character') procedure Delete_Character (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position); -- AKA -- ALIAS(`mvdelch()') pragma Inline (Delete_Character); -- MANPAGE(`curs_inch.3x') -- ANCHOR(`winch()',`Peek') function Peek (Win : Window := Standard_Window) return Attributed_Character; -- ALIAS(`inch()') -- AKA -- ANCHOR(`mvwinch()',`Peek') function Peek (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position) return Attributed_Character; -- AKA -- ALIAS(`mvinch()') -- More Peek's follow, pragma Inline appears later. -- MANPAGE(`curs_insch.3x') -- ANCHOR(`winsch()',`Insert') procedure Insert (Win : Window := Standard_Window; Ch : Attributed_Character); -- AKA -- ALIAS(`insch()') -- ANCHOR(`mvwinsch()',`Insert') procedure Insert (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Ch : Attributed_Character); -- AKA -- ALIAS(`mvinsch()') -- MANPAGE(`curs_insstr.3x') -- ANCHOR(`winsnstr()',`Insert') procedure Insert (Win : Window := Standard_Window; Str : String; Len : Integer := -1); -- AKA -- ALIAS(`winsstr()') -- ALIAS(`insnstr()') -- ALIAS(`insstr()') -- ANCHOR(`mvwinsnstr()',`Insert') procedure Insert (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : String; Len : Integer := -1); -- AKA -- ALIAS(`mvwinsstr()') -- ALIAS(`mvinsnstr()') -- ALIAS(`mvinsstr()') pragma Inline (Insert); -- MANPAGE(`curs_instr.3x') -- ANCHOR(`winnstr()',`Peek') procedure Peek (Win : Window := Standard_Window; Str : out String; Len : Integer := -1); -- AKA -- ALIAS(`winstr()') -- ALIAS(`innstr()') -- ALIAS(`instr()') -- ANCHOR(`mvwinnstr()',`Peek') procedure Peek (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : out String; Len : Integer := -1); -- AKA -- ALIAS(`mvwinstr()') -- ALIAS(`mvinnstr()') -- ALIAS(`mvinstr()') -- MANPAGE(`curs_inchstr.3x') -- ANCHOR(`winchnstr()',`Peek') procedure Peek (Win : Window := Standard_Window; Str : out Attributed_String; Len : Integer := -1); -- AKA -- ALIAS(`winchstr()') -- ALIAS(`inchnstr()') -- ALIAS(`inchstr()') -- ANCHOR(`mvwinchnstr()',`Peek') procedure Peek (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : out Attributed_String; Len : Integer := -1); -- AKA -- ALIAS(`mvwinchstr()') -- ALIAS(`mvinchnstr()') -- ALIAS(`mvinchstr()') -- We do not inline the Peek procedures -- MANPAGE(`curs_getstr.3x') -- ANCHOR(`wgetnstr()',`Get') procedure Get (Win : Window := Standard_Window; Str : out String; Len : Integer := -1); -- AKA -- ALIAS(`wgetstr()') -- ALIAS(`getnstr()') -- ALIAS(`getstr()') -- actually getstr is not supported because that results in buffer -- overflows. -- ANCHOR(`mvwgetnstr()',`Get') procedure Get (Win : Window := Standard_Window; Line : Line_Position; Column : Column_Position; Str : out String; Len : Integer := -1); -- AKA -- ALIAS(`mvwgetstr()') -- ALIAS(`mvgetnstr()') -- ALIAS(`mvgetstr()') -- Get is not inlined -- MANPAGE(`curs_slk.3x') -- Not Implemented: slk_attr_on, slk_attr_off, slk_attr_set type Soft_Label_Key_Format is (Three_Two_Three, Four_Four, PC_Style, -- ncurses specific PC_Style_With_Index); -- " type Label_Number is new Positive range 1 .. 12; type Label_Justification is (Left, Centered, Right); -- ANCHOR(`slk_init()',`Init_Soft_Label_Keys') procedure Init_Soft_Label_Keys (Format : Soft_Label_Key_Format := Three_Two_Three); -- AKA pragma Inline (Init_Soft_Label_Keys); -- ANCHOR(`slk_set()',`Set_Soft_Label_Key') procedure Set_Soft_Label_Key (Label : Label_Number; Text : String; Fmt : Label_Justification := Left); -- AKA -- We do not inline this procedure -- ANCHOR(`slk_refresh()',`Refresh_Soft_Label_Key') procedure Refresh_Soft_Label_Keys; -- AKA pragma Inline (Refresh_Soft_Label_Keys); -- ANCHOR(`slk_noutrefresh()',`Refresh_Soft_Label_Keys_Without_Update') procedure Refresh_Soft_Label_Keys_Without_Update; -- AKA pragma Inline (Refresh_Soft_Label_Keys_Without_Update); -- ANCHOR(`slk_label()',`Get_Soft_Label_Key') procedure Get_Soft_Label_Key (Label : Label_Number; Text : out String); -- AKA -- ANCHOR(`slk_label()',`Get_Soft_Label_Key') function Get_Soft_Label_Key (Label : Label_Number) return String; -- AKA -- Same as function pragma Inline (Get_Soft_Label_Key); -- ANCHOR(`slk_clear()',`Clear_Soft_Label_Keys') procedure Clear_Soft_Label_Keys; -- AKA pragma Inline (Clear_Soft_Label_Keys); -- ANCHOR(`slk_restore()',`Restore_Soft_Label_Keys') procedure Restore_Soft_Label_Keys; -- AKA pragma Inline (Restore_Soft_Label_Keys); -- ANCHOR(`slk_touch()',`Touch_Soft_Label_Keys') procedure Touch_Soft_Label_Keys; -- AKA pragma Inline (Touch_Soft_Label_Keys); -- ANCHOR(`slk_attron()',`Switch_Soft_Label_Key_Attributes') procedure Switch_Soft_Label_Key_Attributes (Attr : Character_Attribute_Set; On : Boolean := True); -- AKA -- ALIAS(`slk_attroff()') pragma Inline (Switch_Soft_Label_Key_Attributes); -- ANCHOR(`slk_attrset()',`Set_Soft_Label_Key_Attributes') procedure Set_Soft_Label_Key_Attributes (Attr : Character_Attribute_Set := Normal_Video; Color : Color_Pair := Color_Pair'First); -- AKA pragma Inline (Set_Soft_Label_Key_Attributes); -- ANCHOR(`slk_attr()',`Get_Soft_Label_Key_Attributes') function Get_Soft_Label_Key_Attributes return Character_Attribute_Set; -- AKA -- ANCHOR(`slk_attr()',`Get_Soft_Label_Key_Attributes') function Get_Soft_Label_Key_Attributes return Color_Pair; -- AKA pragma Inline (Get_Soft_Label_Key_Attributes); -- ANCHOR(`slk_color()',`Set_Soft_Label_Key_Color') procedure Set_Soft_Label_Key_Color (Pair : Color_Pair); -- AKA pragma Inline (Set_Soft_Label_Key_Color); -- MANPAGE(`keybound.3x') -- Not Implemented: keybound -- MANPAGE(`keyok.3x') -- ANCHOR(`keyok()',`Enable_Key') procedure Enable_Key (Key : Special_Key_Code; Enable : Boolean := True); -- AKA pragma Inline (Enable_Key); -- MANPAGE(`define_key.3x') -- ANCHOR(`define_key()',`Define_Key') procedure Define_Key (Definition : String; Key : Special_Key_Code); -- AKA pragma Inline (Define_Key); -- MANPAGE(`curs_util.3x') -- | Not implemented : filter, use_env -- | putwin, getwin are in the child package PutWin -- -- ANCHOR(`keyname()',`Key_Name') procedure Key_Name (Key : Real_Key_Code; Name : out String); -- AKA -- The external name for a real keystroke. -- ANCHOR(`keyname()',`Key_Name') function Key_Name (Key : Real_Key_Code) return String; -- AKA -- Same as function -- We do not inline this routine -- ANCHOR(`unctrl()',`Un_Control') procedure Un_Control (Ch : Attributed_Character; Str : out String); -- AKA -- ANCHOR(`unctrl()',`Un_Control') function Un_Control (Ch : Attributed_Character) return String; -- AKA -- Same as function pragma Inline (Un_Control); -- ANCHOR(`delay_output()',`Delay_Output') procedure Delay_Output (Msecs : Natural); -- AKA pragma Inline (Delay_Output); -- ANCHOR(`flushinp()',`Flush_Input') procedure Flush_Input; -- AKA pragma Inline (Flush_Input); -- MANPAGE(`curs_termattrs.3x') -- ANCHOR(`baudrate()',`Baudrate') function Baudrate return Natural; -- AKA pragma Inline (Baudrate); -- ANCHOR(`erasechar()',`Erase_Character') function Erase_Character return Character; -- AKA pragma Inline (Erase_Character); -- ANCHOR(`killchar()',`Kill_Character') function Kill_Character return Character; -- AKA pragma Inline (Kill_Character); -- ANCHOR(`has_ic()',`Has_Insert_Character') function Has_Insert_Character return Boolean; -- AKA pragma Inline (Has_Insert_Character); -- ANCHOR(`has_il()',`Has_Insert_Line') function Has_Insert_Line return Boolean; -- AKA pragma Inline (Has_Insert_Line); -- ANCHOR(`termattrs()',`Supported_Attributes') function Supported_Attributes return Character_Attribute_Set; -- AKA pragma Inline (Supported_Attributes); -- ANCHOR(`longname()',`Long_Name') procedure Long_Name (Name : out String); -- AKA -- ANCHOR(`longname()',`Long_Name') function Long_Name return String; -- AKA -- Same as function pragma Inline (Long_Name); -- ANCHOR(`termname()',`Terminal_Name') procedure Terminal_Name (Name : out String); -- AKA -- ANCHOR(`termname()',`Terminal_Name') function Terminal_Name return String; -- AKA -- Same as function pragma Inline (Terminal_Name); -- MANPAGE(`curs_color.3x') -- COLOR_PAIR -- COLOR_PAIR(n) in C is the same as -- Attributed_Character(Ch => Nul, Color => n, Attr => Normal_Video) -- In C you often see something like c = c | COLOR_PAIR(n); -- This is equivalent to c.Color := n; -- ANCHOR(`start_color()',`Start_Color') procedure Start_Color; -- AKA pragma Import (C, Start_Color, "start_color"); -- ANCHOR(`init_pair()',`Init_Pair') procedure Init_Pair (Pair : Redefinable_Color_Pair; Fore : Color_Number; Back : Color_Number); -- AKA pragma Inline (Init_Pair); -- ANCHOR(`pair_content()',`Pair_Content') procedure Pair_Content (Pair : Color_Pair; Fore : out Color_Number; Back : out Color_Number); -- AKA pragma Inline (Pair_Content); -- ANCHOR(`has_colors()',`Has_Colors') function Has_Colors return Boolean; -- AKA pragma Inline (Has_Colors); -- ANCHOR(`init_color()',`Init_Color') procedure Init_Color (Color : Color_Number; Red : RGB_Value; Green : RGB_Value; Blue : RGB_Value); -- AKA pragma Inline (Init_Color); -- ANCHOR(`can_change_color()',`Can_Change_Color') function Can_Change_Color return Boolean; -- AKA pragma Inline (Can_Change_Color); -- ANCHOR(`color_content()',`Color_Content') procedure Color_Content (Color : Color_Number; Red : out RGB_Value; Green : out RGB_Value; Blue : out RGB_Value); -- AKA pragma Inline (Color_Content); -- MANPAGE(`curs_kernel.3x') -- | Not implemented: getsyx, setsyx -- type Curses_Mode is (Curses, Shell); -- ANCHOR(`def_prog_mode()',`Save_Curses_Mode') procedure Save_Curses_Mode (Mode : Curses_Mode); -- AKA -- ALIAS(`def_shell_mode()') pragma Inline (Save_Curses_Mode); -- ANCHOR(`reset_prog_mode()',`Reset_Curses_Mode') procedure Reset_Curses_Mode (Mode : Curses_Mode); -- AKA -- ALIAS(`reset_shell_mode()') pragma Inline (Reset_Curses_Mode); -- ANCHOR(`savetty()',`Save_Terminal_State') procedure Save_Terminal_State; -- AKA pragma Inline (Save_Terminal_State); -- ANCHOR(`resetty();',`Reset_Terminal_State') procedure Reset_Terminal_State; -- AKA pragma Inline (Reset_Terminal_State); type Stdscr_Init_Proc is access function (Win : Window; Columns : Column_Count) return Integer; pragma Convention (C, Stdscr_Init_Proc); -- N.B.: the return value is actually ignored, but it seems to be -- a good practice to return 0 if you think all went fine -- and -1 otherwise. -- ANCHOR(`ripoffline()',`Rip_Off_Lines') procedure Rip_Off_Lines (Lines : Integer; Proc : Stdscr_Init_Proc); -- AKA -- N.B.: to be more precise, this uses a ncurses specific enhancement of -- ripoffline(), in which the Lines argument absolute value is the -- number of lines to be ripped of. The official ripoffline() only -- uses the sign of Lines to remove a single line from bottom or top. pragma Inline (Rip_Off_Lines); type Cursor_Visibility is (Invisible, Normal, Very_Visible); -- ANCHOR(`curs_set()',`Set_Cursor_Visibility') procedure Set_Cursor_Visibility (Visibility : in out Cursor_Visibility); -- AKA pragma Inline (Set_Cursor_Visibility); -- ANCHOR(`napms()',`Nap_Milli_Seconds') procedure Nap_Milli_Seconds (Ms : Natural); -- AKA pragma Inline (Nap_Milli_Seconds); -- |===================================================================== -- | Some useful helpers. -- |===================================================================== type Transform_Direction is (From_Screen, To_Screen); procedure Transform_Coordinates (W : Window := Standard_Window; Line : in out Line_Position; Column : in out Column_Position; Dir : Transform_Direction := From_Screen); -- This procedure transforms screen coordinates into coordinates relative -- to the window and vice versa, depending on the Dir parameter. -- Screen coordinates are the position information for the physical device. -- An Curses_Exception will be raised if Line and Column are not in the -- Window or if you pass the Null_Window as argument. -- We do not inline this procedure -- MANPAGE(`default_colors.3x') Default_Color : constant Color_Number := -1; -- ANCHOR(`use_default_colors()',`Use_Default_Colors') procedure Use_Default_Colors; -- AKA pragma Inline (Use_Default_Colors); -- ANCHOR(`assume_default_colors()',`Assume_Default_Colors') procedure Assume_Default_Colors (Fore : Color_Number := Default_Color; Back : Color_Number := Default_Color); -- AKA pragma Inline (Assume_Default_Colors); -- MANPAGE(`curs_extend.3x') -- ANCHOR(`curses_version()',`Curses_Version') function Curses_Version return String; -- AKA -- ANCHOR(`use_extended_names()',`Use_Extended_Names') -- The returnvalue is the previous setting of the flag function Use_Extended_Names (Enable : Boolean) return Boolean; -- AKA -- MANPAGE(`curs_trace.3x') -- ANCHOR(`_nc_freeall()',`Curses_Free_All') procedure Curses_Free_All; -- AKA -- MANPAGE(`curs_scr_dump.3x') -- ANCHOR(`scr_dump()',`Screen_Dump_To_File') procedure Screen_Dump_To_File (Filename : String); -- AKA -- ANCHOR(`scr_restore()',`Screen_Restore_From_File') procedure Screen_Restore_From_File (Filename : String); -- AKA -- ANCHOR(`scr_init()',`Screen_Init_From_File') procedure Screen_Init_From_File (Filename : String); -- AKA -- ANCHOR(`scr_set()',`Screen_Set_File') procedure Screen_Set_File (Filename : String); -- AKA -- MANPAGE(`curs_print.3x') -- Not implemented: mcprint -- MANPAGE(`curs_printw.3x') -- Not implemented: printw, wprintw, mvprintw, mvwprintw, vwprintw, -- vw_printw -- Please use the Ada style Text_IO child packages for formatted -- printing. It does not make a lot of sense to map the printf style -- C functions to Ada. -- MANPAGE(`curs_scanw.3x') -- Not implemented: scanw, wscanw, mvscanw, mvwscanw, vwscanw, vw_scanw -- MANPAGE(`resizeterm.3x') -- Not Implemented: resizeterm -- MANPAGE(`wresize.3x') -- ANCHOR(`wresize()',`Resize') procedure Resize (Win : Window := Standard_Window; Number_Of_Lines : Line_Count; Number_Of_Columns : Column_Count); -- AKA private type Window is new System.Storage_Elements.Integer_Address; Null_Window : constant Window := 0; -- The next constants are generated and may be different on your -- architecture. -- Sizeof_Bool : constant := Curses_Constants.Sizeof_Bool; type Curses_Bool is mod 2 ** Sizeof_Bool; Curses_Bool_False : constant Curses_Bool := 0; end Terminal_Interface.Curses; ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-panels-user_data.ads.m40000644000000000000000000000754513615656212025465 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-menus-item_user_data.ads.m40000644000000000000000000001012213615656212026331 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-forms-form_user_data.ads.m40000644000000000000000000000756213615656212026353 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-aux.ads.m40000644000000000000000000001372713615656212023032 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/Makefile.in0000644000000000000000000003100214342723510016113 0ustar rootroot############################################################################## # Copyright 2019-2021,2022 Thomas E. Dickey # # Copyright 1998-2015,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Juergen Pfeifer, 1996 # and: Thomas E. Dickey, 1997 # # $Id: Makefile.in,v 1.101 2022/12/03 19:45:12 Nicolas.Boulenguez Exp $ # .SUFFIXES: SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile x = @EXEEXT@ top_srcdir = @top_srcdir@ DESTDIR = @DESTDIR@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ includedir = @includedir@ INSTALL = @INSTALL@ @INSTALL_OPT_O@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_DATA = @INSTALL_DATA@ AWK = @AWK@ LN_S = @LN_S@ CC = @CC@ HOST_CC = @BUILD_CC@ CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ HOST_CFLAGS = @BUILD_CFLAGS@ CPPFLAGS = @CPPFLAGS@ HOST_CPPFLAGS = @ACPPFLAGS@ @BUILD_CPPFLAGS@ \ -DHAVE_CONFIG_H -I$(srcdir) CCFLAGS = $(HOST_CPPFLAGS) $(HOST_CFLAGS) CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) REL_VERSION = @cf_cv_rel_version@ ABI_VERSION = @cf_cv_abi_version@ LOCAL_LIBDIR = @top_builddir@/lib LINK = $(HOST_CC) LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ # For the wide-character configuration combined with broken_linker, we need # addresses of ACS_xxx constants, which requires linking with the newly built # ncurses library. If cross-compiling, the developer has to fill in a workable # native library for this purpose. NATIVE_LDFLAGS = @LD_MODEL@ $(LOCAL_LIBS) @TINFO_LDFLAGS2@ $(LDFLAGS) @LIBS@ @LOCAL_LDFLAGS2@ $(LDFLAGS) @TINFO_LIBS@ CROSS_LDFLAGS = @BUILD_LDFLAGS@ @BUILD_LIBS@ ACTUAL_LDFLAGS = @ADAGEN_LDFLAGS@ RANLIB = @RANLIB@ M4 = m4 M4FLAGS = -DNCURSES_EXT_FUNCS=@NCURSES_EXT_FUNCS@ ADACURSES_CONFIG = adacurses@USE_CFG_SUFFIX@-config WRAPPER = @NCURSES_SHLIB2@ PROG_GENERATE = ./generate$x GENERATE = $(PROG_GENERATE) '@USE_ARG_SUFFIX@' DEL_ADAMODE = sed -e '/^\-\-\ \ \-\*\-\ ada\ \-\*\-.*/d' GNATHTML = `command -v gnathtml || command -v gnathtml.pl` ################################################################################ ALIB = @cf_ada_package@ ABASE = $(ALIB)-curses ADA_SRCDIR = ../src GEN_TARGETS = $(ADA_SRCDIR)/$(ABASE).ads \ $(ADA_SRCDIR)/$(ABASE).adb \ $(ADA_SRCDIR)/$(ABASE)-aux.ads \ $(ADA_SRCDIR)/$(ABASE)-trace.ads \ $(ADA_SRCDIR)/$(ABASE)-menus.ads \ $(ADA_SRCDIR)/$(ABASE)-forms.ads \ $(ADA_SRCDIR)/$(ABASE)-mouse.ads \ $(ADA_SRCDIR)/$(ABASE)-panels.ads \ $(ADA_SRCDIR)/$(ABASE)-menus-menu_user_data.ads \ $(ADA_SRCDIR)/$(ABASE)-menus-item_user_data.ads \ $(ADA_SRCDIR)/$(ABASE)-forms-form_user_data.ads \ $(ADA_SRCDIR)/$(ABASE)-forms-field_types.ads \ $(ADA_SRCDIR)/$(ABASE)-forms-field_user_data.ads \ $(ADA_SRCDIR)/$(ABASE)-panels-user_data.ads \ $(ADA_SRCDIR)/$(ABASE)_constants.ads GEN_SRC = $(srcdir)/$(ABASE).ads.m4 \ $(srcdir)/$(ABASE).adb.m4 \ $(srcdir)/$(ABASE)-aux.ads.m4 \ $(srcdir)/$(ABASE)-trace.ads.m4 \ $(srcdir)/$(ABASE)-menus.ads.m4 \ $(srcdir)/$(ABASE)-forms.ads.m4 \ $(srcdir)/$(ABASE)-mouse.ads.m4 \ $(srcdir)/$(ABASE)-panels.ads.m4 \ $(srcdir)/$(ABASE)-menus-menu_user_data.ads.m4 \ $(srcdir)/$(ABASE)-menus-item_user_data.ads.m4 \ $(srcdir)/$(ABASE)-forms-form_user_data.ads.m4 \ $(srcdir)/$(ABASE)-forms-field_types.ads.m4 \ $(srcdir)/$(ABASE)-forms-field_user_data.ads.m4 \ $(srcdir)/$(ABASE)-panels-user_data.ads.m4 ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.libs @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.libs all \ libs : $(GEN_TARGETS) @echo made $@ sources: $(DESTDIR)$(bindir) : mkdir -p $@ install \ install.libs :: $(DESTDIR)$(bindir) $(ADACURSES_CONFIG) $(INSTALL_SCRIPT) $(ADACURSES_CONFIG) $(DESTDIR)$(bindir)/$(ADACURSES_CONFIG) uninstall \ uninstall.libs :: -rm -f $(DESTDIR)$(bindir)/$(ADACURSES_CONFIG) $(PROG_GENERATE): gen.o @ECHO_LD@ $(LINK) $(CFLAGS_NORMAL) gen.o $(ACTUAL_LDFLAGS) -o $@ gen.o: $(srcdir)/gen.c $(HOST_CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/gen.c $(ADA_SRCDIR)/$(ABASE)_constants.ads: $(PROG_GENERATE) $(WRAPPER) "$(GENERATE) $@" ################################################################################ $(ADA_SRCDIR)/$(ABASE).ads: $(srcdir)/$(ABASE).ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE).ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE).adb: $(srcdir)/$(ABASE).adb.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE).adb.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-aux.ads: $(srcdir)/$(ABASE)-aux.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-aux.ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-trace.ads: $(srcdir)/$(ABASE)-trace.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-trace.ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-menus.ads: $(srcdir)/$(ABASE)-menus.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-menus.ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-forms.ads: $(srcdir)/$(ABASE)-forms.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-forms.ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-mouse.ads: $(srcdir)/$(ABASE)-mouse.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-mouse.ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-panels.ads: $(srcdir)/$(ABASE)-panels.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-panels.ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-menus-menu_user_data.ads: \ $(srcdir)/$(ABASE)-menus-menu_user_data.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-menus-menu_user_data.ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-menus-item_user_data.ads: \ $(srcdir)/$(ABASE)-menus-item_user_data.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-menus-item_user_data.ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-forms-form_user_data.ads: \ $(srcdir)/$(ABASE)-forms-form_user_data.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-forms-form_user_data.ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-forms-field_types.ads: \ $(srcdir)/$(ABASE)-forms-field_types.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-forms-field_types.ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-forms-field_user_data.ads: \ $(srcdir)/$(ABASE)-forms-field_user_data.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-forms-field_user_data.ads.m4 |\ $(DEL_ADAMODE) >$@ $(ADA_SRCDIR)/$(ABASE)-panels-user_data.ads: \ $(srcdir)/$(ABASE)-panels-user_data.ads.m4 \ $(srcdir)/normal.m4 $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ $(srcdir)/$(ABASE)-panels-user_data.ads.m4 |\ $(DEL_ADAMODE) >$@ install.progs :: tags: ctags *.[ch] @MAKE_UPPER_TAGS@TAGS: @MAKE_UPPER_TAGS@ etags *.[ch] mostlyclean :: -rm -f a.out core $(PROG_GENERATE) *.o clean :: mostlyclean -rm -f $(GEN_TARGETS) instab.tmp *.ad[bs] *.html *.ali *.tmp distclean :: clean -rm -f $(ADACURSES_CONFIG) -rm -f Makefile realclean :: distclean HTML_DIR = @ADAHTML_DIR@ instab.tmp : table.m4 $(GEN_SRC) @rm -f $@ @for f in $(GEN_SRC) ; do \ $(M4) $(M4FLAGS) -DM4MACRO=table.m4 $$f | $(DEL_ADAMODE) >> $@ ;\ done; TABLE_TITLE=Correspondence between ncurses C and Ada functions $(HTML_DIR)/table.html : instab.tmp @-touch $@ @-chmod +w $@ @echo '' > $@ @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 ############################################################################### ncurses-6.4-20240113/Ada95/gen/terminal_interface-curses-menus-menu_user_data.ads.m40000644000000000000000000000756213615656212026355 0ustar rootroot-- -*- 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; ncurses-6.4-20240113/Ada95/gen/gen.c0000644000000000000000000004720014155211031014762 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2014,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1996 * * and: Thomas E. Dickey, 1998 * * and: Nicolas Boulenguez, 2011 * ****************************************************************************/ /* Version Control $Id: gen.c,v 1.78 2021/12/11 21:03:21 tom Exp $ --------------------------------------------------------------------------*/ /* This program prints on its standard output the source for the Terminal_Interface.Curses_Constants Ada package specification. This pure package only exports C constants to the Ada compiler. */ #ifdef HAVE_CONFIG_H #include #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); PRINT_NAMED_CONSTANT(KEY_RESIZE); print_comment(fp, "alternate character codes (ACS) from addch(3NCURSES)"); #define PRINT_ACS(name) print_size_of (fp, #name, (size_t)(&name - &acs_map[0])) PRINT_ACS(ACS_ULCORNER); PRINT_ACS(ACS_LLCORNER); PRINT_ACS(ACS_URCORNER); PRINT_ACS(ACS_LRCORNER); PRINT_ACS(ACS_LTEE); PRINT_ACS(ACS_RTEE); PRINT_ACS(ACS_BTEE); PRINT_ACS(ACS_TTEE); PRINT_ACS(ACS_HLINE); PRINT_ACS(ACS_VLINE); PRINT_ACS(ACS_PLUS); PRINT_ACS(ACS_S1); PRINT_ACS(ACS_S9); PRINT_ACS(ACS_DIAMOND); PRINT_ACS(ACS_CKBOARD); PRINT_ACS(ACS_DEGREE); PRINT_ACS(ACS_PLMINUS); PRINT_ACS(ACS_BULLET); PRINT_ACS(ACS_LARROW); PRINT_ACS(ACS_RARROW); PRINT_ACS(ACS_DARROW); PRINT_ACS(ACS_UARROW); PRINT_ACS(ACS_BOARD); PRINT_ACS(ACS_LANTERN); PRINT_ACS(ACS_BLOCK); PRINT_ACS(ACS_S3); PRINT_ACS(ACS_S7); PRINT_ACS(ACS_LEQUAL); PRINT_ACS(ACS_GEQUAL); PRINT_ACS(ACS_PI); PRINT_ACS(ACS_NEQUAL); PRINT_ACS(ACS_STERLING); print_comment(fp, "Menu_Options from opts(3MENU)"); PRINT_NAMED_BITMASK(Menu_Options, O_ONEVALUE); PRINT_NAMED_BITMASK(Menu_Options, O_SHOWDESC); PRINT_NAMED_BITMASK(Menu_Options, O_ROWMAJOR); PRINT_NAMED_BITMASK(Menu_Options, O_IGNORECASE); PRINT_NAMED_BITMASK(Menu_Options, O_SHOWMATCH); PRINT_NAMED_BITMASK(Menu_Options, O_NONCYCLIC); print_size_of(fp, "Menu_Options_Size", 8 * sizeof(Menu_Options)); print_comment(fp, "Item_Options from menu_opts(3MENU)"); PRINT_NAMED_BITMASK(Item_Options, O_SELECTABLE); print_size_of(fp, "Item_Options_Size", 8 * sizeof(Item_Options)); print_comment(fp, "Field_Options from field_opts(3FORM)"); PRINT_NAMED_BITMASK(Field_Options, O_VISIBLE); PRINT_NAMED_BITMASK(Field_Options, O_ACTIVE); PRINT_NAMED_BITMASK(Field_Options, O_PUBLIC); PRINT_NAMED_BITMASK(Field_Options, O_EDIT); PRINT_NAMED_BITMASK(Field_Options, O_WRAP); PRINT_NAMED_BITMASK(Field_Options, O_BLANK); PRINT_NAMED_BITMASK(Field_Options, O_AUTOSKIP); PRINT_NAMED_BITMASK(Field_Options, O_NULLOK); PRINT_NAMED_BITMASK(Field_Options, O_PASSOK); PRINT_NAMED_BITMASK(Field_Options, O_STATIC); print_size_of(fp, "Field_Options_Size", 8 * sizeof(Field_Options)); print_comment(fp, "Field_Options from opts(3FORM)"); PRINT_NAMED_BITMASK(Field_Options, O_NL_OVERLOAD); PRINT_NAMED_BITMASK(Field_Options, O_BS_OVERLOAD); /* Field_Options_Size is defined below */ print_comment(fp, "MEVENT structure from mouse(3NCURSES)"); STRUCT_OFFSET(MEVENT, id); STRUCT_OFFSET(MEVENT, x); STRUCT_OFFSET(MEVENT, y); STRUCT_OFFSET(MEVENT, z); STRUCT_OFFSET(MEVENT, bstate); print_size_of(fp, "MEVENT_Size", 8 * sizeof(MEVENT)); print_comment(fp, "mouse events from mouse(3NCURSES)"); { mmask_t all_events; #define PRINT_MOUSE_EVENT(event) \ print_constant (fp, #event, event); \ all_events |= event all_events = 0; PRINT_MOUSE_EVENT(BUTTON1_RELEASED); PRINT_MOUSE_EVENT(BUTTON1_PRESSED); PRINT_MOUSE_EVENT(BUTTON1_CLICKED); PRINT_MOUSE_EVENT(BUTTON1_DOUBLE_CLICKED); PRINT_MOUSE_EVENT(BUTTON1_TRIPLE_CLICKED); #ifdef BUTTON1_RESERVED_EVENT PRINT_MOUSE_EVENT(BUTTON1_RESERVED_EVENT); #endif print_constant(fp, "all_events_button_1", (UINT) all_events); all_events = 0; PRINT_MOUSE_EVENT(BUTTON2_RELEASED); PRINT_MOUSE_EVENT(BUTTON2_PRESSED); PRINT_MOUSE_EVENT(BUTTON2_CLICKED); PRINT_MOUSE_EVENT(BUTTON2_DOUBLE_CLICKED); PRINT_MOUSE_EVENT(BUTTON2_TRIPLE_CLICKED); #ifdef BUTTON2_RESERVED_EVENT PRINT_MOUSE_EVENT(BUTTON2_RESERVED_EVENT); #endif print_constant(fp, "all_events_button_2", (UINT) all_events); all_events = 0; PRINT_MOUSE_EVENT(BUTTON3_RELEASED); PRINT_MOUSE_EVENT(BUTTON3_PRESSED); PRINT_MOUSE_EVENT(BUTTON3_CLICKED); PRINT_MOUSE_EVENT(BUTTON3_DOUBLE_CLICKED); PRINT_MOUSE_EVENT(BUTTON3_TRIPLE_CLICKED); #ifdef BUTTON3_RESERVED_EVENT PRINT_MOUSE_EVENT(BUTTON3_RESERVED_EVENT); #endif print_constant(fp, "all_events_button_3", (UINT) all_events); all_events = 0; PRINT_MOUSE_EVENT(BUTTON4_RELEASED); PRINT_MOUSE_EVENT(BUTTON4_PRESSED); PRINT_MOUSE_EVENT(BUTTON4_CLICKED); PRINT_MOUSE_EVENT(BUTTON4_DOUBLE_CLICKED); PRINT_MOUSE_EVENT(BUTTON4_TRIPLE_CLICKED); #ifdef BUTTON4_RESERVED_EVENT PRINT_MOUSE_EVENT(BUTTON4_RESERVED_EVENT); #endif print_constant(fp, "all_events_button_4", (UINT) all_events); } PRINT_NAMED_CONSTANT(BUTTON_CTRL); PRINT_NAMED_CONSTANT(BUTTON_SHIFT); PRINT_NAMED_CONSTANT(BUTTON_ALT); PRINT_NAMED_CONSTANT(REPORT_MOUSE_POSITION); PRINT_NAMED_CONSTANT(ALL_MOUSE_EVENTS); print_comment(fp, "trace selection from trace(3NCURSES)"); PRINT_NAMED_BITMASK(UINT, TRACE_TIMES); PRINT_NAMED_BITMASK(UINT, TRACE_TPUTS); PRINT_NAMED_BITMASK(UINT, TRACE_UPDATE); PRINT_NAMED_BITMASK(UINT, TRACE_MOVE); PRINT_NAMED_BITMASK(UINT, TRACE_CHARPUT); PRINT_NAMED_BITMASK(UINT, TRACE_CALLS); PRINT_NAMED_BITMASK(UINT, TRACE_VIRTPUT); PRINT_NAMED_BITMASK(UINT, TRACE_IEVENT); PRINT_NAMED_BITMASK(UINT, TRACE_BITS); PRINT_NAMED_BITMASK(UINT, TRACE_ICALLS); PRINT_NAMED_BITMASK(UINT, TRACE_CCALLS); PRINT_NAMED_BITMASK(UINT, TRACE_DATABASE); PRINT_NAMED_BITMASK(UINT, TRACE_ATTRS); print_size_of(fp, "Trace_Size", 8 * sizeof(UINT)); fprintf(fp, "end Terminal_Interface.Curses_Constants;\n"); exit(EXIT_SUCCESS); } ncurses-6.4-20240113/Ada95/gen/html.m40000644000000000000000000000535413615656212015275 0ustar rootrootdnl*************************************************************************** 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 ncurses-6.4-20240113/Ada95/gen/normal.m40000644000000000000000000000510213615656212015610 0ustar rootrootdnl*************************************************************************** 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 ncurses-6.4-20240113/Ada95/samples/0000755000000000000000000000000014443365667014766 5ustar rootrootncurses-6.4-20240113/Ada95/samples/sample-keyboard_handler.ads0000644000000000000000000000677013615656212022232 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-curses_demo-attributes.adb0000644000000000000000000001313713615656212023403 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-attr_test.ads0000644000000000000000000000605213615656212021222 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-getch.ads0000644000000000000000000000600113615656212020275 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-form_demo-handler.ads0000644000000000000000000000735113615656212022313 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-form_demo.adb0000644000000000000000000001343313615656212020655 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-menu_demo.adb0000644000000000000000000003512513615656212020660 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-function_key_setting.adb0000644000000000000000000001742113615656212023141 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-explanation.ads0000644000000000000000000000704413615656212021252 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-menu_demo-aux.adb0000644000000000000000000002146114443365667021464 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-genericputs.adb0000644000000000000000000001224413615656212021520 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-form_demo-aux.adb0000644000000000000000000002476413615656212021461 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-attr_test.adb0000644000000000000000000003367413615656212021213 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-manifest.ads0000644000000000000000000001007513615656212020534 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/status.ads0000644000000000000000000000706013615656212016772 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-form_demo.ads0000644000000000000000000000603113615656212020672 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/rain.ads0000644000000000000000000000614313615656212016401 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-header_handler.adb0000644000000000000000000001756613615656212021646 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-demo_pad.adb0000644000000000000000000005776213615656212020756 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-acs_and_scroll.adb0000644000000000000000000006356113615656212022146 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-menu_demo-handler.ads0000644000000000000000000000735113615656212022314 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-trace_set.adb0000644000000000000000000004166614443365653021161 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/rain.adb0000644000000000000000000001433013615656212016355 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample.adb0000644000000000000000000002054613615656212016713 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-overlap_test.adb0000644000000000000000000001545714114650007021677 0ustar rootroot------------------------------------------------------------------------------ -- -- -- GNAT ncurses Binding Samples -- -- -- -- ncurses -- -- -- -- B O D Y -- -- -- ------------------------------------------------------------------------------ -- Copyright 2020,2021 Thomas E. Dickey -- -- Copyright 2000-2014,2015 Free Software Foundation, Inc. -- -- -- -- Permission is hereby granted, free of charge, to any person obtaining a -- -- copy of this software and associated documentation files (the -- -- "Software"), to deal in the Software without restriction, including -- -- without limitation the rights to use, copy, modify, merge, publish, -- -- distribute, distribute with modifications, sublicense, and/or sell -- -- copies of the Software, and to permit persons to whom the Software is -- -- furnished to do so, subject to the following conditions: -- -- -- -- The above copyright notice and this permission notice shall be included -- -- in all copies or substantial portions of the Software. -- -- -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- -- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- -- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- -- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- -- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- -- -- -- Except as contained in this notice, the name(s) of the above copyright -- -- holders shall not be used in advertising or otherwise to promote the -- -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------ -- Author: Eugene V. Melaragno 2000 -- Version Control -- $Revision: 1.9 $ -- $Date: 2021/09/04 10:52:55 $ -- Binding Version 01.00 ------------------------------------------------------------------------------ with ncurses2.util; use ncurses2.util; with Terminal_Interface.Curses; use Terminal_Interface.Curses; -- test effects of overlapping windows procedure ncurses2.overlap_test is procedure fillwin (win : Window; ch : Character); procedure crosswin (win : Window; ch : Character); procedure fillwin (win : Window; ch : Character) is y1 : Line_Position; x1 : Column_Position; begin Get_Size (win, y1, x1); for y in 0 .. y1 - 1 loop Move_Cursor (win, y, 0); for x in 0 .. x1 - 1 loop Add (win, Ch => ch); end loop; end loop; exception when Curses_Exception => null; -- write to lower right corner end fillwin; procedure crosswin (win : Window; ch : Character) is y1 : Line_Position; x1 : Column_Position; begin Get_Size (win, y1, x1); for y in 0 .. y1 - 1 loop for x in 0 .. x1 - 1 loop if ((x > (x1 - 1) / 3) and (x <= (2 * (x1 - 1)) / 3)) or (((y > (y1 - 1) / 3) and (y <= (2 * (y1 - 1)) / 3))) then Move_Cursor (win, y, x); Add (win, Ch => ch); end if; end loop; end loop; end crosswin; -- In a 24x80 screen like some xterms are, the instructions will -- be overwritten. ch : Character; win1 : Window := New_Window (9, 20, 3, 3); win2 : Window := New_Window (9, 20, 9, 16); begin Set_Raw_Mode (SwitchOn => True); Refresh; Move_Cursor (Line => 0, Column => 0); Add (Str => "This test shows the behavior of wnoutrefresh() with " & "respect to"); Add (Ch => newl); Add (Str => "the shared region of two overlapping windows A and B. " & "The cross"); Add (Ch => newl); Add (Str => "pattern in each window does not overlap the other."); Add (Ch => newl); Move_Cursor (Line => 18, Column => 0); Add (Str => "a = refresh A, then B, then doupdate. b = refresh B, " & "then A, then doupdate"); Add (Ch => newl); Add (Str => "c = fill window A with letter A. d = fill window B " & "with letter B."); Add (Ch => newl); Add (Str => "e = cross pattern in window A. f = cross pattern " & "in window B."); Add (Ch => newl); Add (Str => "g = clear window A. h = clear window B."); Add (Ch => newl); Add (Str => "i = overwrite A onto B. j = overwrite " & "B onto A."); Add (Ch => newl); Add (Str => "^Q/ESC = terminate test."); loop ch := Code_To_Char (Getchar); exit when ch = CTRL ('Q') or ch = CTRL ('['); -- QUIT or ESCAPE case ch is when 'a' => -- refresh window A first, then B Refresh_Without_Update (win1); Refresh_Without_Update (win2); Update_Screen; when 'b' => -- refresh window B first, then A Refresh_Without_Update (win2); Refresh_Without_Update (win1); Update_Screen; when 'c' => -- fill window A so it is visible fillwin (win1, 'A'); when 'd' => -- fill window B so it is visible fillwin (win2, 'B'); when 'e' => -- cross test pattern in window A crosswin (win1, 'A'); when 'f' => -- cross test pattern in window B crosswin (win2, 'B'); when 'g' => -- clear window A Clear (win1); Move_Cursor (win1, 0, 0); when 'h' => -- clear window B Clear (win2); Move_Cursor (win2, 0, 0); when 'i' => -- overwrite A onto B Overwrite (win1, win2); when 'j' => -- overwrite B onto A Overwrite (win2, win1); when others => null; end case; end loop; Delete (win2); Delete (win1); Erase; End_Windows; end ncurses2.overlap_test; ncurses-6.4-20240113/Ada95/samples/ncurses2-getopt.adb0000644000000000000000000001566213615656212020501 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-acs_display.adb0000644000000000000000000002502513615656212021464 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-util.ads0000644000000000000000000000764113615656212020173 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-menu_demo.ads0000644000000000000000000000603113615656212020673 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses.adb0000644000000000000000000000615313615656212017112 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-slk_test.adb0000644000000000000000000001730413615656212021022 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-menu_test.ads0000644000000000000000000000601113615656212021207 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-acs_and_scroll.ads0000644000000000000000000000601613615656212022157 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2.ads0000644000000000000000000000605113615656212017212 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-curses_demo-mouse.adb0000644000000000000000000002143213615656212022342 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-getopt.ads0000644000000000000000000000721713615656212020517 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-color_edit.adb0000644000000000000000000002431313615656212021313 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-my_field_type.ads0000644000000000000000000000716513615656212021565 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-getch_test.adb0000644000000000000000000002401113615656212021314 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/tour.adb0000644000000000000000000000602713615656212016421 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-keyboard_handler.adb0000644000000000000000000002021513615656212022177 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-color_test.adb0000644000000000000000000001503413615656212021345 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-my_field_type.adb0000644000000000000000000000734413615656212021543 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-genericputs.ads0000644000000000000000000001003713615656212021537 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-function_key_setting.ads0000644000000000000000000001111413615656212023153 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-color_test.ads0000644000000000000000000000601213615656212021362 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-acs_display.ads0000644000000000000000000000601313615656212021501 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/README0000644000000000000000000000505513615656212015640 0ustar rootroot------------------------------------------------------------------------------- -- 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. ncurses-6.4-20240113/Ada95/samples/sample-menu_demo-aux.ads0000644000000000000000000001030413615656212021464 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-curses_demo.ads0000644000000000000000000000603513615656212021237 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-color_edit.ads0000644000000000000000000000601213615656212021330 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-demo_pad.ads0000644000000000000000000000601013615656212020753 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/Makefile.in0000644000000000000000000001317114070103035017005 0ustar rootroot############################################################################## # Copyright 2018-2020,2021 Thomas E. Dickey # # Copyright 1998-2015,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Juergen Pfeifer, 1996 # # $Id: Makefile.in,v 1.64 2021/07/03 15:45:33 tom Exp $ # .SUFFIXES: SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile x = @EXEEXT@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ datarootdir = @datarootdir@ datadir = @datadir@ libdir = @libdir@ includedir = @includedir@ INSTALL = @INSTALL@ @INSTALL_OPT_O@ INSTALL_DATA = @INSTALL_DATA@ AWK = @AWK@ LN_S = @LN_S@ CC = @CC@ CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ CPPFLAGS = @ACPPFLAGS@ \ -DHAVE_CONFIG_H -I$(srcdir) CCFLAGS = $(CPPFLAGS) $(CFLAGS) CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) REL_VERSION = @cf_cv_rel_version@ ABI_VERSION = @cf_cv_abi_version@ LOCAL_LIBDIR = @top_builddir@/lib LINK = $(CC) LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@ RANLIB = @RANLIB@ ################################################################################ BINDIR = $(DESTDIR)$(bindir) DATADIR = $(DESTDIR)$(datadir) LIBDIR = $(DESTDIR)$(libdir) MY_DATADIR = $(DATADIR)/@ADA_LIBNAME@ THIS_DATADIR = $(datadir)/@ADA_LIBNAME@ ################################################################################ ada_srcdir = ../src LD_FLAGS = @LD_MODEL@ $(LOCAL_LIBS) @LDFLAGS@ @LIBS@ @LOCAL_LDFLAGS2@ $(LDFLAGS) ADA = @cf_ada_compiler@ ADAPREP = gnatprep ADAFLAGS = @ADAFLAGS@ -I$(srcdir) ADAMAKE = @cf_ada_make@ ADAMAKEFLAGS = -a \ -A$(srcdir) \ -A$(ada_srcdir) \ -A$(srcdir)/$(ada_srcdir) ALIB = @cf_ada_package@ ABASE = $(ALIB)-curses THISLIB = sample CARGS = -cargs $(ADAFLAGS) LARGS = -largs -L../lib -l@ADA_LIBNAME@ @TEST_ARG2@ $(LD_FLAGS) @TEST_LIBS2@ PROGS = tour$x ncurses$x @USE_GNAT_SIGINT@ rain$x ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.examples @MAKE_PHONY@.PHONY : install.libs @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.examples @MAKE_PHONY@.PHONY : uninstall.libs all :: $(PROGS) @echo made $@ sources : @echo made $@ libs \ install \ install.libs :: @echo made $@ uninstall \ uninstall.libs :: @echo made $@ install.examples :: $(BINDIR) $(PROGS) $(INSTALL) $(PROGS) $(BINDIR) install.examples :: $(MY_DATADIR) $(INSTALL_DATA) explain.txt $(MY_DATADIR) uninstall.examples :: -( cd $(BINDIR) && rm -f $(PROGS) ) -rmdir $(BINDIR) -rm -f $(MY_DATADIR)/explain.txt -rmdir $(MY_DATADIR) $(BINDIR) \ $(MY_DATADIR) : mkdir -p $@ AUTO_SRC = $(THISLIB)-explanation.adb ncurses$x : $(AUTO_SRC) $(ADAMAKE) $(ADAMAKEFLAGS) ncurses $(CARGS) $(LARGS) tour$x : $(AUTO_SRC) $(ADAMAKE) $(ADAMAKEFLAGS) tour $(CARGS) $(LARGS) rain$x : $(AUTO_SRC) $(ADAMAKE) $(ADAMAKEFLAGS) rain $(CARGS) $(LARGS) mostlyclean: @echo made $@ clean :: mostlyclean rm -f *.o *.ali b_t*.* *.s $(PROGS) a.out core b_*_test.c *.xr[bs] \ rm -f $(AUTO_SRC) rm -f trace screendump b~*.ad[bs] distclean :: clean rm -f Makefile realclean :: distclean @echo made $@ $(THISLIB)-explanation.adb : $(srcdir)/$(THISLIB)-explanation.adb_p rm -f $@ $(AWK) -v this_datadir=$(THIS_DATADIR) -f $(srcdir)/split-path.awk < $(srcdir)/$(THISLIB)-explanation.adb_p >$@ ncurses-6.4-20240113/Ada95/samples/sample-form_demo-aux.ads0000644000000000000000000001175113615656212021472 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-trace_set.ads0000644000000000000000000000601113615656212021155 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-text_io_demo.ads0000644000000000000000000000603713615656212021410 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-test_sgr_attributes.adb0000644000000000000000000001762013615656212023273 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-flushinp_test.ads0000644000000000000000000000612713615656212022103 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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); ncurses-6.4-20240113/Ada95/samples/sample-curses_demo-attributes.ads0000644000000000000000000000606313615656212023424 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-explanation.adb_p0000644000000000000000000003506613615656212021555 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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 ncurses-6.4-20240113/Ada95/samples/ncurses2-menu_test.adb0000644000000000000000000001516613615656212021201 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-demo_panels.ads0000644000000000000000000000604113615656212021475 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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); ncurses-6.4-20240113/Ada95/samples/ncurses2-overlap_test.ads0000644000000000000000000000601413615656212021716 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-m.adb0000644000000000000000000003633713615656212017435 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-header_handler.ads0000644000000000000000000000650713615656212021660 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-getch_test.ads0000644000000000000000000000601213615656212021336 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-m.ads0000644000000000000000000000606213615656212017446 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-text_io_demo.adb0000644000000000000000000001570413615656212021370 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/explain.txt0000644000000000000000000001702414114005443017145 0ustar rootroot#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 ncurses-6.4-20240113/Ada95/samples/sample-form_demo-handler.adb0000644000000000000000000001101613615656212022263 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-test_sgr_attributes.ads0000644000000000000000000000602313615656212023307 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-helpers.ads0000644000000000000000000000652313615656212020373 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/split-path.awk0000644000000000000000000000546014340522514017542 0ustar rootroot############################################################################## # 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; } ncurses-6.4-20240113/Ada95/samples/sample-menu_demo-handler.adb0000644000000000000000000001204713615656212022271 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-slk_test.ads0000644000000000000000000000601013615656212021033 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-util.adb0000644000000000000000000001553213615656212020150 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/status.adb0000644000000000000000000000664313615656212016757 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/tour.ads0000644000000000000000000000574213615656212016445 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-curses_demo.adb0000644000000000000000000001430713615656212021217 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-curses_demo-mouse.ads0000644000000000000000000000605113615656212022363 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-demo_forms.ads0000644000000000000000000000601213615656212021337 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample-helpers.adb0000644000000000000000000000721713615656212020353 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-demo_forms.adb0000644000000000000000000004171014114650007021311 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-flushinp_test.adb0000644000000000000000000001277513615656212022070 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/sample.ads0000644000000000000000000000600313615656212016724 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/samples/ncurses2-demo_panels.adb0000644000000000000000000003100713615656212021454 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/0000755000000000000000000000000014334037045014072 5ustar rootrootncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-float_io.adb0000644000000000000000000000754113615656212025155 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-termcap.ads0000644000000000000000000001020513615656212023353 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-regexp.adb0000644000000000000000000000713613615656212026633 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-menus-item_user_data.adb0000644000000000000000000000762413615656212026024 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/ncurses_compat.c0000644000000000000000000001022113615656212017263 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 2011,2015 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey, 2011 * ****************************************************************************/ /* Version Control $Id: ncurses_compat.c,v 1.4 2020/02/02 23:34:34 tom Exp $ --------------------------------------------------------------------------*/ /* * Provide compatibility with older versions of ncurses. */ #include #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 ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-aux.adb0000644000000000000000000001224713615656212022504 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_user_data.adb0000644000000000000000000001023513615656212026140 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io.ads0000644000000000000000000001377613615656212023413 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types.adb0000644000000000000000000002544213615656212025343 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-putwin.adb0000644000000000000000000000775513615656212023245 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-aux.adb0000644000000000000000000001254313615656212024154 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io.adb0000644000000000000000000002316413615656212023362 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/c_varargs_to_ada.h0000644000000000000000000000666613615656212017543 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-decimal_io.adb0000644000000000000000000000754413615656212025451 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-complex_io.adb0000644000000000000000000000742213615656212025515 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-enumeration_io.ads0000644000000000000000000000673113615656212026417 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.ads0000644000000000000000000000666013615656212030033 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-decimal_io.ads0000644000000000000000000000704613615656212025467 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-termcap.adb0000644000000000000000000001564713615656212023351 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-intfield.adb0000644000000000000000000000750513615656212027137 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-menus.adb0000644000000000000000000007472313615656212023045 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-terminfo.adb0000644000000000000000000001554313615656212023534 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.adb0000644000000000000000000001243113615656212027661 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-intfield.ads0000644000000000000000000000671313615656212027160 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.ads0000644000000000000000000000734713615656212030437 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-alpha.ads0000644000000000000000000000661013615656212026443 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/library.gpr.in0000644000000000000000000000775113675730154016677 0ustar rootroot------------------------------------------------------------------------------ -- Copyright 2019,2020 Thomas E. Dickey -- -- -- -- Permission is hereby granted, free of charge, to any person obtaining a -- -- copy of this software and associated documentation files (the -- -- "Software"), to deal in the Software without restriction, including -- -- without limitation the rights to use, copy, modify, merge, publish, -- -- distribute, distribute with modifications, sublicense, and/or sell -- -- copies of the Software, and to permit persons to whom the Software is -- -- furnished to do so, subject to the following conditions: -- -- -- -- The above copyright notice and this permission notice shall be included -- -- in all copies or substantial portions of the Software. -- -- -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- -- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- -- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- -- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- -- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- -- -- -- Except as contained in this notice, the name(s) of the above copyright -- -- holders shall not be used in advertising or otherwise to promote the -- -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------ -- $Id: library.gpr.in,v 1.3 2020/06/27 20:47:40 tom Exp $ -- http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Library-Projects.html -- http://www.adaworld.com/debian/debian-ada-policy.html project AdaCurses is Build_Dir := External ("BUILD_DIR"); Source_Dir := External ("SOURCE_DIR"); Source_Dir2 := External ("SOURCE_DIR2"); Kind := External ("LIB_KIND"); for Library_Name use External ("LIB_NAME"); for Library_Version use External ("SONAME"); for Library_Kind use Kind; for Library_Dir use Build_Dir & "/lib"; for Object_Dir use Build_Dir & "/" & Kind & "-obj"; for Library_ALI_Dir use Build_Dir & "/" & Kind & "-ali"; for Source_Dirs use (Source_Dir & "/src", Source_Dir2, Build_Dir & "/src"); -- for Library_Options use ("-lncurses@USE_LIB_SUFFIX@", "-lpanel@USE_LIB_SUFFIX@", "-lmenu@USE_LIB_SUFFIX@", "-lform@USE_LIB_SUFFIX@"); package Compiler is for Default_Switches ("Ada") use ("-g", "-O2", "-Wall", "-gnatafno", "-gnatVa", -- All validity checks "-gnatwa"); -- Activate all optional errors -- for Default_Switches ("C") use (CFLAGS) end Compiler; for Languages use ("C", "Ada"); package Install is for Install_Name use "adacurses"; -- for Artifacts ("share/doc/adacurses") use ("../doc/Ada95.html", "../doc/ada"); -- for Artifacts ("share/doc/adacurses/adacurses_rm") use ("../" & Kind & "-obj" & "/gnatdoc/*"); for Artifacts ("lib/ada/adalib") use ("../src/*.ali"); for Artifacts ("share/ada/adainclude") use ("../src/*.ad?"); -- for Artifacts ("share/examples/adacurses") use -- ("../samples/*.ad?", "../samples/explain.txt", "../samples/Makefile", "../samples/README"); -- for Artifacts ("share/man/man1") use ("../doc/adacurses-config.1"); for Artifacts ("bin") use ("../gen/adacurses-config"); end Install; end AdaCurses; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-complex_io.ads0000644000000000000000000000723313615656212025536 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-mouse.adb0000644000000000000000000002055113675712404023036 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-putwin.ads0000644000000000000000000000626013615656212023254 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-integer_io.adb0000644000000000000000000000730413615656212025502 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-regexp.ads0000644000000000000000000000672113615656212026653 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-alpha.adb0000644000000000000000000000712313615656212026422 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/c_varargs_to_ada.c0000644000000000000000000000765013615656212017530 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-integer_io.ads0000644000000000000000000000672313615656212025527 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-aux.ads0000644000000000000000000000712013615656212024170 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-float_io.ads0000644000000000000000000000703113615656212025170 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-numeric.ads0000644000000000000000000000670413615656212027024 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.adb0000644000000000000000000001051613615656212030406 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.ads0000644000000000000000000001207713615656212027570 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-fixed_io.adb0000644000000000000000000000754213615656212025150 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-user.ads0000644000000000000000000001233513615656212026335 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.ads0000644000000000000000000001223513615656212027704 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-enumeration_io.adb0000644000000000000000000001010413615656212026363 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.ads0000644000000000000000000000660213615656212027746 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-modular_io.ads0000644000000000000000000000672113615656212025533 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/modules0000644000000000000000000001006013615656212015466 0ustar rootroot# $Id: modules,v 1.4 2020/02/02 23:34:34 tom Exp $ ############################################################################## # Copyright 2020 Thomas E. Dickey # # Copyright 2010 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 2010 # # Library objects # rootname depend-spec depend-body unit $(ALIB) $(srcdir) none spec $(ABASE)-aux none $(srcdir) body $(ABASE) none . body $(ABASE)-terminfo $(srcdir) $(srcdir) body $(ABASE)-termcap $(srcdir) $(srcdir) body $(ABASE)-putwin $(srcdir) $(srcdir) body $(ABASE)-trace . . body $(ABASE)-mouse . $(srcdir) body $(ABASE)-panels . $(srcdir) body $(ABASE)-menus . $(srcdir) body $(ABASE)-forms . $(srcdir) body $(ABASE)-forms-field_types . $(srcdir) body $(ABASE)-forms-field_types-alpha $(srcdir) $(srcdir) body $(ABASE)-forms-field_types-alphanumeric $(srcdir) $(srcdir) body $(ABASE)-forms-field_types-intfield $(srcdir) $(srcdir) body $(ABASE)-forms-field_types-numeric $(srcdir) $(srcdir) body $(ABASE)-forms-field_types-regexp $(srcdir) $(srcdir) body $(ABASE)-forms-field_types-enumeration $(srcdir) $(srcdir) body $(ABASE)-forms-field_types-ipv4_address $(srcdir) $(srcdir) body $(ABASE)-forms-field_types-user $(srcdir) $(srcdir) body $(ABASE)-forms-field_types-user-choice $(srcdir) $(srcdir) body $(ABASE)-text_io $(srcdir) $(srcdir) body $(ABASE)-text_io-aux $(srcdir) $(srcdir) body $(ABASE)-menus-menu_user_data . $(srcdir) body $(ABASE)-menus-item_user_data . $(srcdir) body $(ABASE)-forms-form_user_data . $(srcdir) body $(ABASE)-forms-field_user_data . $(srcdir) body $(ABASE)-forms-field_types-enumeration-ada $(srcdir) $(srcdir) body $(ABASE)-panels-user_data . $(srcdir) body $(ABASE)-text_io-integer_io $(srcdir) $(srcdir) body $(ABASE)-text_io-float_io $(srcdir) $(srcdir) body $(ABASE)-text_io-fixed_io $(srcdir) $(srcdir) body $(ABASE)-text_io-decimal_io $(srcdir) $(srcdir) body $(ABASE)-text_io-enumeration_io $(srcdir) $(srcdir) body $(ABASE)-text_io-modular_io $(srcdir) $(srcdir) body $(ABASE)-text_io-complex_io $(srcdir) $(srcdir) body ncurses-6.4-20240113/Ada95/src/Makefile.in0000644000000000000000000003622514070103035016135 0ustar rootroot############################################################################## # Copyright 2018-2020,2021 Thomas E. Dickey # # Copyright 1999-2016,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Juergen Pfeifer, 1996 # # $Id: Makefile.in,v 1.96 2021/07/03 15:45:33 tom Exp $ # .SUFFIXES: SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile ADA_MFLAGS = @cf_cv_makeflags@ @SET_MAKE@ MODEL = ../../@DFT_OBJ_SUBDIR@ DESTDIR = @DESTDIR@ top_srcdir = @top_srcdir@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ includedir = @includedir@ libdir = @libdir@ LIBDIR = $(DESTDIR)$(libdir) ADA_INCLUDE = $(DESTDIR)@ADA_INCLUDE@ ADA_OBJECTS = $(DESTDIR)@ADA_OBJECTS@ INSTALL = @INSTALL@ @INSTALL_OPT_O@ INSTALL_LIB = @INSTALL@ @INSTALL_LIB@ AR = @AR@ ARFLAGS = @ARFLAGS@ AWK = @AWK@ LN_S = @LN_S@ CC = @CC@ CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ CPPFLAGS = @ACPPFLAGS@ @CPPFLAGS@ \ -DHAVE_CONFIG_H -I$(srcdir) CCFLAGS = $(CPPFLAGS) $(CFLAGS) CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) LINK = $(CC) LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@ RANLIB = @RANLIB@ ################################################################################ ADA = @cf_ada_compiler@ ADAPREP = gnatprep ADAFLAGS = @ADAFLAGS@ -I. -I$(srcdir) LIB_NAME = @ADA_LIBNAME@ SONAME = @ADA_SHAREDLIB@ GNAT_PROJECT = @ADA_LIBNAME@.gpr # build/source are the Ada95 tree BUILD_DIR = .. SOURCE_DIR = .. BUILD_DIR_LIB = $(BUILD_DIR)/lib SOURCE_DIR_SRC = $(SOURCE_DIR)/src ADAMAKE = @cf_ada_make@ ADAMAKEFLAGS = \ -P$(GNAT_PROJECT) \ -XBUILD_DIR=`cd $(BUILD_DIR);pwd` \ -XSOURCE_DIR=`cd $(SOURCE_DIR);pwd` \ -XSOURCE_DIR2=`cd $(srcdir);pwd` \ -XLIB_NAME=$(LIB_NAME) \ -XSONAME=$(SONAME) CARGS = -cargs $(ADAFLAGS) LARGS = STATIC_LIBNAME = lib$(LIB_NAME).a SHARED_LIBNAME = $(SONAME) SHARED_SYMLINK = lib$(LIB_NAME).so ALIB = @cf_ada_package@ ABASE = $(ALIB)-curses ################################################################################ GENERATED_SOURCES=$(ABASE).ads \ $(ABASE).adb \ $(ABASE)-aux.ads \ $(ABASE)-trace.ads \ $(ABASE)-menus.ads \ $(ABASE)-forms.ads \ $(ABASE)-mouse.ads \ $(ABASE)-panels.ads \ $(ABASE)-menus-menu_user_data.ads \ $(ABASE)-menus-item_user_data.ads \ $(ABASE)-forms-form_user_data.ads \ $(ABASE)-forms-field_types.ads \ $(ABASE)-forms-field_user_data.ads \ $(ABASE)-panels-user_data.ads ################################################################################ LIBOBJS=$(ALIB).o \ $(ABASE)-aux.o \ $(ABASE).o \ $(ABASE)-terminfo.o \ $(ABASE)-termcap.o \ $(ABASE)-putwin.o \ $(ABASE)-trace.o \ $(ABASE)-mouse.o \ $(ABASE)-panels.o \ $(ABASE)-menus.o \ $(ABASE)-forms.o \ $(ABASE)-forms-field_types.o \ $(ABASE)-forms-field_types-alpha.o \ $(ABASE)-forms-field_types-alphanumeric.o \ $(ABASE)-forms-field_types-intfield.o \ $(ABASE)-forms-field_types-numeric.o \ $(ABASE)-forms-field_types-regexp.o \ $(ABASE)-forms-field_types-enumeration.o \ $(ABASE)-forms-field_types-ipv4_address.o \ $(ABASE)-forms-field_types-user.o \ $(ABASE)-forms-field_types-user-choice.o \ $(ABASE)-text_io.o \ $(ABASE)-text_io-aux.o # Ada object files for generic packages. Since gnat 3.10 they are # also compiled GENOBJS=$(ABASE)-menus-menu_user_data.o \ $(ABASE)-menus-item_user_data.o \ $(ABASE)-forms-form_user_data.o \ $(ABASE)-forms-field_user_data.o \ $(ABASE)-forms-field_types-enumeration-ada.o \ $(ABASE)-panels-user_data.o \ $(ABASE)-text_io-integer_io.o \ $(ABASE)-text_io-float_io.o \ $(ABASE)-text_io-fixed_io.o \ $(ABASE)-text_io-decimal_io.o \ $(ABASE)-text_io-enumeration_io.o \ $(ABASE)-text_io-modular_io.o \ $(ABASE)-text_io-complex_io.o ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.libs @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.libs all :: $(BUILD_DIR_LIB)/$(STATIC_LIBNAME) @echo done $(ADA_INCLUDE) \ $(ADA_OBJECTS) \ $(LIBDIR) \ $(BUILD_DIR_LIB) : mkdir -p $@ $(GENERATED_SOURCES) : ( cd ../gen; $(MAKE) $(ADA_MFLAGS) ) sources : $(GENERATED_SOURCES) @echo made $@ libs \ install \ install.libs :: \ $(BUILD_DIR_LIB)/$(STATIC_LIBNAME) @echo made $(STATIC_LIBNAME) #OLD:BEGIN install \ install.libs :: \ $(BUILD_DIR_LIB)/$(STATIC_LIBNAME) \ $(ADA_OBJECTS) @$(INSTALL_LIB) \ $(BUILD_DIR_LIB)/$(STATIC_LIBNAME) \ $(ADA_OBJECTS) uninstall \ uninstall.libs :: @rm -f $(ADA_OBJECTS)/$(STATIC_LIBNAME) #OLD:END mostlyclean :: rm -f *.o *.ali b_t*.* *.s $(PROGS) a.out core b_*_test.c *.xr[bs] *.a clean :: mostlyclean rm -f $(ABASE)-trace.adb distclean :: clean rm -f Makefile library.gpr realclean :: distclean BASEDEPS=$(ABASE).ads $(ABASE)-aux.ads $(ABASE).adb $(ABASE)-trace.adb : $(srcdir)/$(ABASE)-trace.adb_p rm -f $@ $(ADAPREP) -DADA_TRACE=@ADA_TRACE@ @GNATPREP_OPTS@ $(srcdir)/$(ABASE)-trace.adb_p $@ ############################################################################### # Use these definitions when building a shared library. SHARED_C_OBJS = c_varargs_to_ada.o c_threaded_variables.o ncurses_compat.o SHARED_OBJS = $(SHARED_C_OBJS) @USE_OLD_MAKERULES@$(LIBOBJS) @cf_generic_objects@ c_varargs_to_ada.o : $(srcdir)/c_varargs_to_ada.c $(CC) $(CFLAGS_DEFAULT) -c -o $@ $(srcdir)/c_varargs_to_ada.c c_threaded_variables.o : $(srcdir)/c_threaded_variables.c $(CC) $(CFLAGS_DEFAULT) -c -o $@ $(srcdir)/c_threaded_variables.c ncurses_compat.o : $(srcdir)/ncurses_compat.c $(CC) $(CFLAGS_DEFAULT) -c -o $@ $(srcdir)/ncurses_compat.c ############################################################################### # Use these definitions when building a static library. STATIC_C_OBJS = static_c_varargs_to_ada.o static_c_threaded_variables.o static_ncurses_compat.o STATIC_OBJS = $(STATIC_C_OBJS) @USE_OLD_MAKERULES@$(LIBOBJS) @cf_generic_objects@ static_c_varargs_to_ada.o : $(srcdir)/c_varargs_to_ada.c $(CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/c_varargs_to_ada.c static_c_threaded_variables.o : $(srcdir)/c_threaded_variables.c $(CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/c_threaded_variables.c static_ncurses_compat.o : $(srcdir)/ncurses_compat.c $(CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/ncurses_compat.c ############################################################################### @USE_OLD_MAKERULES@$(BUILD_DIR_LIB)/$(STATIC_LIBNAME) :: \ @USE_OLD_MAKERULES@ $(BUILD_DIR_LIB) \ @USE_OLD_MAKERULES@ $(STATIC_OBJS) @USE_OLD_MAKERULES@ $(AR) $(ARFLAGS) $@ $(STATIC_OBJS) $(BUILD_DIR)/static-ali : ; mkdir -p $@ $(BUILD_DIR)/static-obj : ; mkdir -p $@ STATIC_DIRS = \ $(BUILD_DIR_LIB) \ $(BUILD_DIR)/static-ali \ $(BUILD_DIR)/static-obj @USE_GNAT_PROJECTS@$(BUILD_DIR_LIB)/$(STATIC_LIBNAME) :: \ @USE_GNAT_PROJECTS@ $(ABASE)-trace.adb \ @USE_GNAT_PROJECTS@ $(STATIC_C_OBJS) \ @USE_GNAT_PROJECTS@ $(STATIC_DIRS) @USE_GNAT_PROJECTS@ @cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@ @USE_GNAT_PROJECTS@ -rm -f $(GNAT_PROJECT) @USE_GNAT_PROJECTS@ $(SHELL) $(srcdir)/library-cfg.sh static library.gpr $(CFLAGS_NORMAL) >$(GNAT_PROJECT) @USE_GNAT_PROJECTS@ @echo "Using GNAT Project:" @USE_GNAT_MAKE_GPR@ @-$(SHELL) -c "diff -c $(srcdir)/library.gpr $(GNAT_PROJECT); exit 0" @USE_GNAT_MAKE_GPR@ $(ADAMAKE) $(ADAMAKEFLAGS) -XLIB_KIND=static @USE_GNAT_MAKE_GPR@ $(AR) $(ARFLAGS) $@ $(STATIC_C_OBJS) @USE_GNAT_MAKE_GPR@ -rm -f $(GNAT_PROJECT) @USE_GNAT_GPRBUILD@ @-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0" @USE_GNAT_GPRBUILD@ gprbuild -p $(ADAMAKEFLAGS) -XLIB_KIND=static @USE_GNAT_GPRBUILD@ -rm -f $(GNAT_PROJECT) #OLD:BEGIN @USE_GNAT_LIBRARIES@install \ @USE_GNAT_LIBRARIES@install.libs :: \ @USE_GNAT_LIBRARIES@ $(ADA_OBJECTS) @USE_GNAT_LIBRARIES@ $(INSTALL_LIB) \ @USE_GNAT_LIBRARIES@ $(BUILD_DIR)/static-ali/*.ali \ @USE_GNAT_LIBRARIES@ $(ADA_OBJECTS) #OLD:END # While gprinstall is the "recommended" tool, it is rather brittle, with # hardcoded assumptions about the use of the install-name which prevent using # that tool to make the directory layout of older versions of the AdaCurses # package. # # In principle, one might just do # --install-name="" # and in dry-run mode, gprinstall pretends to handle it properly (trimming the # empty directory level), but without the dry-run option, it fails (tested # with gnat 10.1.1). #NEW:BEGIN #@USE_GNAT_LIBRARIES@install \ #@USE_GNAT_LIBRARIES@install.libs :: #@USE_GNAT_LIBRARIES@ @cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@ #@USE_GNAT_LIBRARIES@ -rm -f $(GNAT_PROJECT) #@USE_GNAT_LIBRARIES@ $(SHELL) $(srcdir)/library-cfg.sh static library.gpr $(CFLAGS_NORMAL) >$(GNAT_PROJECT) #@USE_GNAT_LIBRARIES@ @echo "Using GNAT Project:" #@USE_GNAT_LIBRARIES@ @-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0" #@USE_GNAT_LIBRARIES@ #@USE_GNAT_LIBRARIES@ gprinstall -m -v -f -p \ #@USE_GNAT_LIBRARIES@ --prefix="$(DESTDIR)$(prefix)" \ #@USE_GNAT_LIBRARIES@ $(ADAMAKEFLAGS) -XLIB_KIND=static \ #@USE_GNAT_LIBRARIES@ --lib-subdir="$(DESTDIR)$(prefix)"/lib \ #@USE_GNAT_LIBRARIES@ --ali-subdir="$(DESTDIR)$(prefix)"/lib/ada/adalib \ #@USE_GNAT_LIBRARIES@ --sources-subdir="$(DESTDIR)$(prefix)"/share/ada/adainclude #@USE_GNAT_LIBRARIES@ #@USE_GNAT_LIBRARIES@ -rm -f $(GNAT_PROJECT) #NEW:END #OLD:BEGIN uninstall \ uninstall.libs :: @rm -f $(ADA_OBJECTS)/$(STATIC_LIBNAME) #OLD:END #NEW:BEGIN #@USE_GNAT_LIBRARIES@uninstall \ #@USE_GNAT_LIBRARIES@uninstall.libs :: #@USE_GNAT_LIBRARIES@ @cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@ #@USE_GNAT_LIBRARIES@ -rm -f $(GNAT_PROJECT) #@USE_GNAT_LIBRARIES@ $(SHELL) $(srcdir)/library-cfg.sh static library.gpr $(CFLAGS_NORMAL) >$(GNAT_PROJECT) #@USE_GNAT_LIBRARIES@ @echo "Using GNAT Project:" #@USE_GNAT_LIBRARIES@ @-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0" #@USE_GNAT_LIBRARIES@ #@USE_GNAT_LIBRARIES@ gprinstall -v -f --prefix="$(DESTDIR)$(prefix)" --uninstall $(ADAMAKEFLAGS) -XLIB_KIND=static #@USE_GNAT_LIBRARIES@ #@USE_GNAT_LIBRARIES@ -rm -f $(GNAT_PROJECT) #NEW:END @USE_GNAT_LIBRARIES@uninstall \ @USE_GNAT_LIBRARIES@uninstall.libs :: @USE_GNAT_LIBRARIES@ @$(SHELL) -c 'for name in $(BUILD_DIR)/static-ali/*.ali ; do rm -f $(ADA_OBJECTS)/`basename $$name`; done' $(BUILD_DIR)/dynamic-ali : ; mkdir -p $@ $(BUILD_DIR)/dynamic-obj : ; mkdir -p $@ SHARED_DIRS = \ $(BUILD_DIR_LIB) \ $(BUILD_DIR)/dynamic-ali \ $(BUILD_DIR)/dynamic-obj @MAKE_ADA_SHAREDLIB@all :: $(BUILD_DIR_LIB)/$(SHARED_LIBNAME) @MAKE_ADA_SHAREDLIB@$(BUILD_DIR_LIB)/$(SHARED_LIBNAME) :: \ @MAKE_ADA_SHAREDLIB@ $(ABASE)-trace.adb \ @MAKE_ADA_SHAREDLIB@ $(SHARED_DIRS) \ @MAKE_ADA_SHAREDLIB@ $(SHARED_OBJS) @MAKE_ADA_SHAREDLIB@ cp $(SHARED_OBJS) $(BUILD_DIR)/dynamic-obj/ @MAKE_ADA_SHAREDLIB@ @cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@ @MAKE_ADA_SHAREDLIB@ -rm -f $(GNAT_PROJECT) @MAKE_ADA_SHAREDLIB@ $(SHELL) $(srcdir)/library-cfg.sh dynamic library.gpr $(CFLAGS_SHARED) >$(GNAT_PROJECT) @MAKE_ADA_SHAREDLIB@ @echo "Making Ada shared-lib:" @MAKE_ADA_SHAREDLIB@ @-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0" @MAKE_ADA_SHAREDLIB@ $(ADAMAKE) $(ADAMAKEFLAGS) -XLIB_KIND=dynamic @MAKE_ADA_SHAREDLIB@ -rm -f $(GNAT_PROJECT) install \ install.libs :: $(ADA_INCLUDE) $(INSTALL_LIB) \ $(SOURCE_DIR_SRC)/*.ad[sb] \ $(ADA_INCLUDE) install \ install.libs :: $(ADA_INCLUDE) $(INSTALL_LIB) \ $(GENERATED_SOURCES) \ $(ADA_INCLUDE) uninstall \ uninstall.libs :: $(SHELL) -c 'for name in $(SOURCE_DIR_SRC)/*.ad[sb] $(GENERATED_SOURCES); do rm -f $(ADA_INCLUDE)/`basename $$name`; done' @MAKE_ADA_SHAREDLIB@install \ @MAKE_ADA_SHAREDLIB@install.libs :: $(ADA_OBJECTS) $(LIBDIR) @MAKE_ADA_SHAREDLIB@ $(INSTALL_LIB) \ @MAKE_ADA_SHAREDLIB@ $(BUILD_DIR)/dynamic-ali/* \ @MAKE_ADA_SHAREDLIB@ $(ADA_OBJECTS) @MAKE_ADA_SHAREDLIB@ $(INSTALL_LIB) \ @MAKE_ADA_SHAREDLIB@ $(BUILD_DIR_LIB)/$(SHARED_LIBNAME) \ @MAKE_ADA_SHAREDLIB@ $(LIBDIR) @MAKE_ADA_SHAREDLIB@ ( cd $(LIBDIR) && $(LN_S) $(SHARED_LIBNAME) $(SHARED_SYMLINK) ) @MAKE_ADA_SHAREDLIB@ @MAKE_ADA_SHAREDLIB@uninstall \ @MAKE_ADA_SHAREDLIB@uninstall.libs :: @MAKE_ADA_SHAREDLIB@ $(SHELL) -c 'for name in $(BUILD_DIR)/dynamic-ali/* ; do rm -f $(ADA_OBJECTS)/`basename $$name`; done' @MAKE_ADA_SHAREDLIB@ @MAKE_ADA_SHAREDLIB@uninstall \ @MAKE_ADA_SHAREDLIB@uninstall.libs :: @MAKE_ADA_SHAREDLIB@ rm -f $(LIBDIR)/$(SHARED_SYMLINK) @MAKE_ADA_SHAREDLIB@ rm -f $(LIBDIR)/$(SHARED_LIBNAME) #rm-docs : # gnatdoc --enable-build $(ADAMAKEFLAGS) -XLIB_KIND=static clean :: -rm -f default.cgpr -rm -rf $(BUILD_DIR)/*-ali -rm -rf $(BUILD_DIR)/*-obj -rm -rf $(BUILD_DIR_LIB) #@USE_GNAT_PROJECTS@ gprclean $(ADAMAKEFLAGS) -XLIB_KIND=static #@MAKE_ADA_SHAREDLIB@ gprclean $(ADAMAKEFLAGS) -XLIB_KIND=dynamic ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.adb0000644000000000000000000001237613615656212027551 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.adb0000644000000000000000000000715013615656212030005 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-panels.adb0000644000000000000000000001430113615656212023162 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/library-cfg.sh0000755000000000000000000000601514264567577016660 0ustar rootroot#!/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 < 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; ncurses-6.4-20240113/Ada95/src/c_threaded_variables.h0000644000000000000000000000547613615656212020375 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-fixed_io.ads0000644000000000000000000000703013615656212025161 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms.adb0000644000000000000000000010065213615656212023033 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-text_io-modular_io.adb0000644000000000000000000000730413615656212025510 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/c_threaded_variables.c0000644000000000000000000000551114334037045020352 0ustar rootroot/**************************************************************************** * 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* */ ncurses-6.4-20240113/Ada95/src/terminal_interface.ads0000644000000000000000000000617213615656212020430 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-terminfo.ads0000644000000000000000000001037213615656212023550 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/src/terminal_interface-curses-forms-field_types-numeric.adb0000644000000000000000000000756513615656212027011 0ustar rootroot------------------------------------------------------------------------------ -- -- -- 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; ncurses-6.4-20240113/Ada95/aclocal.m40000644000000000000000000047650414533214327015164 0ustar rootrootdnl*************************************************************************** dnl Copyright 2018-2022,2023 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.207 2023/12/04 00:09:59 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: 11 updated: 2022/12/04 15:40:08 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_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: 2 updated: 2023/02/25 08:45:56 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],[ AC_CACHE_CHECK(for clock_gettime,cf_cv_func_clock_gettime,[ AC_TRY_LINK([#include ], [struct timespec ts; int rc = clock_gettime(CLOCK_REALTIME, &ts); (void) rc; (void)ts], [cf_cv_func_clock_gettime=yes], [cf_cv_func_clock_gettime=no]) ]) 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_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: 6 updated: 2021/01/04 19:33:05 dnl ---------------- dnl Configure an ncurses add-on, built outside the ncurses tree. AC_DEFUN([CF_NCURSES_ADDON],[ AC_REQUIRE([CF_NCURSES_CONFIG]) AC_PROVIDE([CF_SUBST_NCURSES_VERSION]) AC_MSG_CHECKING(if you want wide-character code) AC_ARG_ENABLE(widec, [ --enable-widec compile with wide-char/UTF-8 code], [with_widec=$enableval], [with_widec=no]) AC_MSG_RESULT($with_widec) if test "$with_widec" = yes ; then CF_UTF8_LIB CF_NCURSES_CONFIG(ncursesw) else CF_NCURSES_CONFIG(ncurses) fi if test "$NCURSES_CONFIG_PKG" != none ; then cf_version=`$PKG_CONFIG --modversion $NCURSES_CONFIG_PKG 2>/dev/null` NCURSES_MAJOR=`echo "$cf_version" | sed -e 's/\..*//'` NCURSES_MINOR=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.//' -e 's/\..*//'` NCURSES_PATCH=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\.//'` cf_cv_abi_version=`$PKG_CONFIG --variable=abi_version $NCURSES_CONFIG_PKG 2>/dev/null` if test -z "$cf_cv_abi_version" then cf_cv_abi_version=`$PKG_CONFIG --variable=major_version $NCURSES_CONFIG_PKG 2>/dev/null` fi elif test "$NCURSES_CONFIG" != none ; then cf_version=`$NCURSES_CONFIG --version 2>/dev/null` NCURSES_MAJOR=`echo "$cf_version" | sed -e 's/\..*//'` NCURSES_MINOR=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.//' -e 's/\..*//'` NCURSES_PATCH=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\.//'` # ABI version is not available from headers cf_cv_abi_version=`$NCURSES_CONFIG --abi-version 2>/dev/null` else for cf_name in MAJOR MINOR PATCH do cat >conftest.$ac_ext < AUTOCONF_$cf_name NCURSES_VERSION_$cf_name CF_EOF cf_try="$ac_cpp conftest.$ac_ext 2>&5 | fgrep AUTOCONF_$cf_name >conftest.out" AC_TRY_EVAL(cf_try) if test -f conftest.out ; then cf_result=`sed -e "s/^.*AUTOCONF_${cf_name}[[ ]][[ ]]*//" conftest.out` eval NCURSES_$cf_name=\"$cf_result\" # cat conftest.$ac_ext # cat conftest.out fi done cf_cv_abi_version=${NCURSES_MAJOR} fi cf_cv_rel_version=${NCURSES_MAJOR}.${NCURSES_MINOR} dnl Show the computed version, for logging cf_cv_timestamp=`date` AC_MSG_RESULT(Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp)) dnl We need these values in the generated headers AC_SUBST(NCURSES_MAJOR) AC_SUBST(NCURSES_MINOR) AC_SUBST(NCURSES_PATCH) dnl We need these values in the generated makefiles AC_SUBST(cf_cv_rel_version) AC_SUBST(cf_cv_abi_version) dnl FIXME - not needed for Ada95 AC_SUBST(cf_cv_builtin_bool) AC_SUBST(cf_cv_header_stdbool_h) AC_SUBST(cf_cv_type_of_bool)dnl ]) dnl --------------------------------------------------------------------------- dnl CF_NCURSES_CC_CHECK version: 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: 17 updated: 2023/01/05 18:54:02 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 make an error # endif #endif ${cf_cv_main_return:-return}(0); }],[ cf_cv_ncurses_version=`cat $cf_tempfile`],,[ # This will not work if the preprocessor splits the line after the # Autoconf token. The 'unproto' program does that. cat > "conftest.$ac_ext" < #undef Autoconf #ifdef NCURSES_VERSION Autoconf NCURSES_VERSION #else #ifdef __NCURSES_H Autoconf "old" #endif ; #endif EOF cf_try="$ac_cpp conftest.$ac_ext 2>&AC_FD_CC | grep '^Autoconf ' >conftest.out" AC_TRY_EVAL(cf_try) if test -f conftest.out ; then cf_out=`sed -e 's%^Autoconf %%' -e 's%^[[^"]]*"%%' -e 's%".*%%' conftest.out` test -n "$cf_out" && cf_cv_ncurses_version="$cf_out" rm -f conftest.out fi ]) rm -f "$cf_tempfile" ]) test "$cf_cv_ncurses_version" = no || AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries]) ])dnl dnl --------------------------------------------------------------------------- dnl CF_OBJ_SUBDIR version: 8 updated: 2021/01/01 13:31:04 dnl ------------- dnl Compute the object-directory name from the given model name AC_DEFUN([CF_OBJ_SUBDIR], [ case $1 in (libtool) $2='obj_lo' ;; (normal) $2='objects' ;; (debug) $2='obj_g' ;; (profile) $2='obj_p' ;; (shared) case "$cf_cv_system_name" in (cygwin|msys) $2='objects' ;; (*) $2='obj_s' ;; esac esac ])dnl dnl --------------------------------------------------------------------------- dnl CF_PATHSEP version: 8 updated: 2021/01/01 13:31:04 dnl ---------- dnl Provide a value for the $PATH and similar separator (or amend the value dnl as provided in autoconf 2.5x). AC_DEFUN([CF_PATHSEP], [ AC_MSG_CHECKING(for PATH separator) case "$cf_cv_system_name" in (os2*) PATH_SEPARATOR=';' ;; (*) ${PATH_SEPARATOR:=':'} ;; esac ifelse([$1],,,[$1=$PATH_SEPARATOR]) AC_SUBST(PATH_SEPARATOR) AC_MSG_RESULT($PATH_SEPARATOR) ])dnl dnl --------------------------------------------------------------------------- dnl CF_PATH_SYNTAX version: 18 updated: 2020/12/31 18:40:20 dnl -------------- dnl Check the argument to see that it looks like a pathname. Rewrite it if it dnl begins with one of the prefix/exec_prefix variables, and then again if the dnl result begins with 'NONE'. This is necessary to work around autoconf's dnl delayed evaluation of those symbols. AC_DEFUN([CF_PATH_SYNTAX],[ if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".[$]$1" in (.\[$]\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[[a-zA-Z]]:[[\\/]]*) # OS/2 EMX ;; (.\[$]\{*prefix\}*|.\[$]\{*dir\}*) eval $1="[$]$1" case ".[$]$1" in (.NONE/*) $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` ;; (*) ifelse([$2],,[AC_MSG_ERROR([expected a pathname, not \"[$]$1\"])],$2) ;; esac ])dnl dnl --------------------------------------------------------------------------- dnl CF_PKG_CONFIG version: 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: 10 updated: 2021/01/04 19:33:05 dnl --------------- dnl Force $INSTALL to be an absolute-path. Otherwise, edit_man.sh and the dnl misc/tabset install won't work properly. Usually this happens only when dnl using the fallback mkinstalldirs script AC_DEFUN([CF_PROG_INSTALL], [AC_PROG_INSTALL case $INSTALL in (/*) ;; (*) CF_DIRNAME(cf_dir,$INSTALL) test -z "$cf_dir" && cf_dir=. INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" ;; esac ])dnl dnl --------------------------------------------------------------------------- dnl CF_PROG_LN_S version: 2 updated: 2010/08/14 18:25:37 dnl ------------ dnl Combine checks for "ln -s" and "ln -sf", updating $LN_S to include "-f" dnl option if it is supported. AC_DEFUN([CF_PROG_LN_S],[ AC_PROG_LN_S AC_MSG_CHECKING(if $LN_S -f options work) rm -f conf$$.src conf$$dst echo >conf$$.dst echo first >conf$$.src if $LN_S -f conf$$.src conf$$.dst 2>/dev/null; then cf_prog_ln_sf=yes else cf_prog_ln_sf=no fi rm -f conf$$.dst conf$$src AC_MSG_RESULT($cf_prog_ln_sf) test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f" ])dnl dnl --------------------------------------------------------------------------- dnl CF_REMOVE_CFLAGS version: 3 updated: 2021/09/05 17:25:40 dnl ---------------- dnl Remove a given option from CFLAGS/CPPFLAGS dnl $1 = option to remove dnl $2 = variable to update dnl $3 = nonempty to allow verbose message define([CF_REMOVE_CFLAGS], [ cf_tmp_cflag=`echo "x$1" | sed -e 's/^.//' -e 's/=.*//'` while true do cf_old_cflag=`echo "x[$]$2" | sed -e 's/^.//' -e 's/[[ ]][[ ]]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[[^ ]][[^ ]]*\\)\?%%" -e 's/^[[ ]]*//' -e 's%[[ ]][[ ]]*-D% -D%g' -e 's%[[ ]][[ ]]*-I% -I%g'` test "[$]$2" != "$cf_old_cflag" || break ifelse([$3],,,[CF_VERBOSE(removing old option $1 from $2)]) $2="$cf_old_cflag" done ])dnl dnl --------------------------------------------------------------------------- dnl CF_REMOVE_DEFINE version: 3 updated: 2010/01/09 11:05:50 dnl ---------------- dnl Remove all -U and -D options that refer to the given symbol from a list dnl of C compiler options. This works around the problem that not all dnl compilers process -U and -D options from left-to-right, so a -U option dnl cannot be used to cancel the effect of a preceding -D option. dnl dnl $1 = target (which could be the same as the source variable) dnl $2 = source (including '$') dnl $3 = symbol to remove define([CF_REMOVE_DEFINE], [ $1=`echo "$2" | \ sed -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[[ ]]/ /g' \ -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[$]//g'` ])dnl dnl --------------------------------------------------------------------------- dnl CF_REMOVE_LIB version: 1 updated: 2007/02/17 14:11:52 dnl ------------- dnl Remove the given library from the symbol dnl dnl $1 = target (which could be the same as the source variable) dnl $2 = source (including '$') dnl $3 = library to remove define([CF_REMOVE_LIB], [ # remove $3 library from $2 $1=`echo "$2" | sed -e 's/-l$3[[ ]]//g' -e 's/-l$3[$]//'` ])dnl dnl --------------------------------------------------------------------------- dnl CF_RESTORE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:47:45 dnl --------------------- dnl Restore flags saved in CF_SAVE_XTRA_FLAGS dnl $1 = name of current macro define([CF_RESTORE_XTRA_FLAGS], [ LIBS="$cf_save_LIBS_$1" CFLAGS="$cf_save_CFLAGS_$1" CPPFLAGS="$cf_save_CPPFLAGS_$1" ])dnl dnl --------------------------------------------------------------------------- dnl CF_SAVE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:46:44 dnl ------------------ dnl Use this macro to save CFLAGS/CPPFLAGS/LIBS before checks against X headers dnl and libraries which do not update those variables. dnl dnl $1 = name of current macro define([CF_SAVE_XTRA_FLAGS], [ cf_save_LIBS_$1="$LIBS" cf_save_CFLAGS_$1="$CFLAGS" cf_save_CPPFLAGS_$1="$CPPFLAGS" LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" for cf_X_CFLAGS in $X_CFLAGS do case "x$cf_X_CFLAGS" in x-[[IUD]]*) CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" ;; *) CFLAGS="$CFLAGS $cf_X_CFLAGS" ;; esac done ])dnl dnl --------------------------------------------------------------------------- dnl CF_SHARED_OPTS version: 109 updated: 2023/12/03 09:21:34 dnl -------------- dnl -------------- dnl Attempt to determine the appropriate CC/LD options for creating a shared dnl library. dnl dnl Notes: dnl a) ${LOCAL_LDFLAGS} is used to link executables that will run within dnl the build-tree, i.e., by making use of the libraries that are compiled in dnl $rel_builddir/lib We avoid compiling-in a $rel_builddir/lib path for the dnl shared library since that can lead to unexpected results at runtime. dnl b) ${LOCAL_LDFLAGS2} has the same intention but assumes that the shared dnl libraries are compiled in ../../lib dnl dnl The variable 'cf_cv_do_symlinks' is used to control whether we configure dnl to install symbolic links to the rel/abi versions of shared libraries. dnl dnl The variable 'cf_cv_shlib_version' controls whether we use the rel or abi dnl version when making symbolic links. dnl dnl The variable 'cf_cv_shlib_version_infix' controls whether shared library dnl version numbers are infix (ex: libncurses..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 -h '$cf_cv_shared_soname' -o $[@]' else MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -h '$cf_cv_shared_soname' -o $[@]' fi ;; (sysv5uw7*|unix_sv*) # tested with UnixWare 7.1.0 (gcc 2.95.2 and cc) if test "$GCC" != yes; then CC_SHARED_OPTS='-KPIC' fi MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o [$]@' ;; (*) CC_SHARED_OPTS='unknown' MK_SHARED_LIB='echo unknown' ;; esac # This works if the last tokens in $MK_SHARED_LIB are the -o target. case "$cf_cv_shlib_version" in (rel|abi) case "$MK_SHARED_LIB" in (*'-o $[@]') test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes ;; (*) AC_MSG_WARN(ignored --with-shlib-version) ;; esac ;; esac if test -n "$cf_try_cflags" then cat > conftest.$ac_ext < 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: 10 updated: 2023/01/11 04:05:23 dnl ----------- dnl Check for multibyte support, and if not found, utf8 compatibility library AC_DEFUN([CF_UTF8_LIB], [ AC_HAVE_HEADERS(wchar.h) AC_CACHE_CHECK(for multibyte character support,cf_cv_utf8_lib,[ cf_save_LIBS="$LIBS" AC_TRY_LINK([ $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_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: 23 updated: 2023/11/22 20:48:30 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],[ 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/*\ *) PKG_CONFIG_LIBDIR= ;; (x/*) PKG_CONFIG_LIBDIR="$cf_search_path" AC_MSG_RESULT($PKG_CONFIG_LIBDIR) cf_search_path= ;; (xyes|xauto) AC_MSG_RESULT(auto) cf_search_path= # Look for the library directory using the same prefix as the executable AC_MSG_CHECKING(for search-list) if test "x$PKG_CONFIG" != xnone then # works for pkg-config since version 0.24 (2009) # works for pkgconf since version 0.8.3 (2012) for cf_pkg_program in \ `echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \ pkg-config \ pkgconf do cf_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null | tr : ' '` test -n "$cf_search_path" && break done # works for pkg-config since import in 2005 of original 2001 HP code. test -z "$cf_search_path" && \ cf_search_path=` "$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\ /^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \ sub(\"^[[^']]*'\",\"\"); \ sub(\"'.*\",\"\"); \ printf \" %s\", \\[$]0; } \ { next; } \ "` fi AC_MSG_RESULT($cf_search_path) ;; (*) AC_MSG_ERROR(Unexpected option value: $cf_search_path) ;; esac if test -n "$cf_search_path" then AC_MSG_CHECKING(for first directory) cf_pkg_config_path=none for cf_config in $cf_search_path do if test -d "$cf_config" then cf_pkg_config_path=$cf_config break fi done AC_MSG_RESULT($cf_pkg_config_path) if test "x$cf_pkg_config_path" != xnone ; then # limit this to the first directory found PKG_CONFIG_LIBDIR="$cf_pkg_config_path" fi if test -z "$PKG_CONFIG_LIBDIR" && test -n "$cf_search_path" then AC_MSG_CHECKING(for workaround) if test "$prefix" = "NONE" ; then cf_prefix="$ac_default_prefix" else cf_prefix="$prefix" fi eval cf_libdir=$libdir cf_libdir=`echo "$cf_libdir" | sed -e "s,^NONE,$cf_prefix,"` cf_backup= for cf_config in $cf_search_path do case $cf_config in $cf_libdir/pkgconfig) PKG_CONFIG_LIBDIR=$cf_libdir/pkgconfig break ;; *) test -z "$cf_backup" && cf_backup=$cf_config ;; esac done test -z "$PKG_CONFIG_LIBDIR" && PKG_CONFIG_LIBDIR=$cf_backup AC_MSG_RESULT($PKG_CONFIG_LIBDIR) fi fi AC_SUBST(PKG_CONFIG_LIBDIR) ])dnl dnl --------------------------------------------------------------------------- dnl CF_WITH_PTHREAD version: 7 updated: 2015/04/18 08:56:57 dnl --------------- dnl Check for POSIX thread library. AC_DEFUN([CF_WITH_PTHREAD], [ AC_MSG_CHECKING(if you want to link with the pthread library) AC_ARG_WITH(pthread, [ --with-pthread use POSIX thread library], [with_pthread=$withval], [with_pthread=no]) AC_MSG_RESULT($with_pthread) if test "$with_pthread" != no ; then AC_CHECK_HEADER(pthread.h,[ AC_DEFINE(HAVE_PTHREADS_H,1,[Define to 1 if we have pthreads.h header]) for cf_lib_pthread in pthread c_r do AC_MSG_CHECKING(if we can link with the $cf_lib_pthread library) cf_save_LIBS="$LIBS" CF_ADD_LIB($cf_lib_pthread) AC_TRY_LINK([ #include ],[ 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 ]) ncurses-6.4-20240113/Ada95/configure0000755000000000000000000202142614535171431015222 0ustar rootroot#! /bin/sh # From configure.in Revision: 1.91 . # Guess values for system-dependent variables and create Makefiles. # Generated by Autoconf 2.52.20230903. # # 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 ;; -*) { 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:950: 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:961: 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:969: 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:985: 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:989: 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:995: 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:997: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:999: 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:1018: 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:1020: 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:1049: PATH=\".;.\"; conftest.sh") >&5 (PATH=".;."; conftest.sh) 2>&5 ac_status=$? echo "$as_me:1052: \$? = $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:1084: 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:1094: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:1098: 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:1107: 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:1111: 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:1116: 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:1123: 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:1132: 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:1137: 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:1145: 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:1154: 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:1159: 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:1191: 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:1195: 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:1197: 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:1205: 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:1220: 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:1235: found $ac_dir/$ac_word" >&5 break done fi fi GREP=$ac_cv_prog_GREP if test -n "$GREP"; then echo "$as_me:1243: result: $GREP" >&5 echo "${ECHO_T}$GREP" >&6 else echo "$as_me:1246: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$GREP" && break done test -n "$GREP" || GREP=": " echo "$as_me:1254: 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:1266: 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:1283: found $ac_dir/$ac_word" >&5 break fi done ;; esac fi FGREP=$ac_cv_path_FGREP if test -n "$FGREP"; then echo "$as_me:1294: result: $FGREP" >&5 echo "${ECHO_T}$FGREP" >&6 else echo "$as_me:1297: 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:1305: error: cannot find workable fgrep" >&5 echo "$as_me: error: cannot find workable fgrep" >&2;} { (exit 1); exit 1; }; } fi fi echo "$as_me:1310: result: $ac_cv_path_FGREP" >&5 echo "${ECHO_T}$ac_cv_path_FGREP" >&6 FGREP="$ac_cv_path_FGREP" echo "$as_me:1314: 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:1326: result: $prefix" >&5 echo "${ECHO_T}$prefix" >&6 if test "x$prefix" = "xNONE" ; then echo "$as_me:1330: 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:1353: result: $includedir" >&5 echo "${ECHO_T}$includedir" >&6 fi ### Checks for programs. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_main_return="return" if test -n "$ac_tool_prefix"; then for ac_prog in gnatgcc gcc cc do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:1370: 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:1385: found $ac_dir/$ac_word" >&5 break done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:1393: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:1396: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in gnatgcc gcc cc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:1409: 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:1424: 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:1432: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:1435: 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:1445: 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:1450:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo "$2"` { (eval echo "$as_me:1453: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:1456: \$? = $ac_status" >&5 (exit "$ac_status"); } { (eval echo "$as_me:1458: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:1461: \$? = $ac_status" >&5 (exit "$ac_status"); } { (eval echo "$as_me:1463: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:1466: \$? = $ac_status" >&5 (exit "$ac_status"); } cat >"conftest.$ac_ext" <<_ACEOF #line 1470 "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:1486: 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:1489: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:1492: \$? = $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:1515: 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:1521: 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:1526: 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:1532: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1535: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:1542: 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:1550: 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:1557: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:1559: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:1562: checking for executable suffix" >&5 echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6 if { (eval echo "$as_me:1564: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:1567: \$? = $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:1583: 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:1589: 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:1595: 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 1601 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:1613: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1616: \$? = $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:1628: 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:1635: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:1639: 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 1645 "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:1660: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1663: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1666: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1669: \$? = $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:1681: 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:1687: 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 1693 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:1705: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1708: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1711: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1714: \$? = $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:1724: 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:1751: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1754: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1757: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1760: \$? = $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 1772 "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:1785: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1788: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1791: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1794: \$? = $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 1804 "configure" #include "confdefs.h" $ac_declaration int main (void) { exit (42); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:1816: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1819: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1822: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1825: \$? = $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:1855: 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:1859: 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:1868: 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 1873 "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:1890: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1893: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1896: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1899: \$? = $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:1910: result: $INTEL_COMPILER" >&5 echo "${ECHO_T}$INTEL_COMPILER" >&6 ;; esac fi CLANG_COMPILER=no if test "$GCC" = yes ; then echo "$as_me:1919: 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 1923 "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:1940: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1943: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1946: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1949: \$? = $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:1959: 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:1968: 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:1975: 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:1979: 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:1986: 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 1991 "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:2005: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:2008: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:2011: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2014: \$? = $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:2025: 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}:2031: testing adding option $cf_clang_opt ..." 1>&5 test -n "$CFLAGS" && CFLAGS="$CFLAGS " CFLAGS="${CFLAGS}$cf_clang_opt" fi done fi echo "$as_me:2040: 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 2048 "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:2095: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2098: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:2101: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2104: \$? = $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:2121: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:2124: 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:2132: checking \$CFLAGS variable" >&5 echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6 case "x$CFLAGS" in (*-[IUD]*) echo "$as_me:2136: result: broken" >&5 echo "${ECHO_T}broken" >&6 { echo "$as_me:2138: 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:2246: result: ok" >&5 echo "${ECHO_T}ok" >&6 ;; esac echo "$as_me:2251: checking \$CC variable" >&5 echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6 case "$CC" in (*[\ \ ]-*) echo "$as_me:2255: result: broken" >&5 echo "${ECHO_T}broken" >&6 { echo "$as_me:2257: 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}:2374: testing resulting CC: '$CC' ..." 1>&5 test -n "$verbose" && echo " resulting CFLAGS: '$CFLAGS'" 1>&6 echo "${as_me:-configure}:2378: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5 test -n "$verbose" && echo " resulting CPPFLAGS: '$CPPFLAGS'" 1>&6 echo "${as_me:-configure}:2382: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5 ;; (*) echo "$as_me:2386: result: ok" >&5 echo "${ECHO_T}ok" >&6 ;; esac echo "$as_me:2391: 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:2403: 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:2420: found $ac_dir/$ac_word" >&5 break fi done ;; esac fi EGREP=$ac_cv_path_EGREP if test -n "$EGREP"; then echo "$as_me:2431: result: $EGREP" >&5 echo "${ECHO_T}$EGREP" >&6 else echo "$as_me:2434: 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:2442: error: cannot find workable egrep" >&5 echo "$as_me: error: cannot find workable egrep" >&2;} { (exit 1); exit 1; }; } fi fi echo "$as_me:2447: 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:2457: 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 2478 "configure" #include "confdefs.h" #include Syntax error _ACEOF if { (eval echo "$as_me:2483: \"$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:2489: \$? = $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 2512 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:2516: \"$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:2522: \$? = $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:2559: 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 2569 "configure" #include "confdefs.h" #include Syntax error _ACEOF if { (eval echo "$as_me:2574: \"$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:2580: \$? = $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 2603 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:2607: \"$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:2613: \$? = $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:2641: 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:2654: 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 2661 "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 2676 "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:2689: 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:2696: 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:2714: \$? = $ac_status" >&5 (exit "$ac_status"); } && test -f conftest2.$ac_objext && { (eval echo "$as_me:2716: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2719: \$? = $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:2730: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:2733: 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:2754: 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:2769: found $ac_dir/$ac_word" >&5 break done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:2777: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:2780: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done test -z "$AWK" && { { echo "$as_me:2787: error: No awk program found" >&5 echo "$as_me: error: No awk program found" >&2;} { (exit 1); exit 1; }; } echo "$as_me:2791: 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:2801: 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:2805: 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:2821: 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:2870: 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:2881: 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:2885: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:2888: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6 fi echo "$as_me:2892: 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:2904: result: $cf_prog_ln_sf" >&5 echo "${ECHO_T}$cf_prog_ln_sf" >&6 test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:2921: 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:2970: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' case $INSTALL in (/*) ;; (*) cf_dir=`echo "$INSTALL" | sed -e 's%/[^/]*$%%'` test -z "$cf_dir" && cf_dir=. INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" ;; esac echo "$as_me:2991: 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:3008: 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:3019: 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:3050: result: $cf_cv_install_p" >&5 echo "${ECHO_T}$cf_cv_install_p" >&6 echo "$as_me:3053: 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:3064: 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:3075: 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:3085: result: $with_strip_program" >&5 echo "${ECHO_T}$with_strip_program" >&6 if test "$with_strip_program" != no then echo "$as_me:3089: 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:3110: result: $check_install_strip" >&5 echo "${ECHO_T}$check_install_strip" >&6 case "$check_install_strip" in (no) { echo "$as_me:3114: 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}:3129: testing created $INSTALL ..." 1>&5 ;; (option) INSTALL_OPT_S="$INSTALL_OPT_S --strip-program=\"$with_strip_program\"" ;; esac fi fi echo "$as_me:3139: 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:3178: 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:3190: 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:3200: 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:3212: 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:3229: 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:3240: result: $PKG_CONFIG" >&5 echo "${ECHO_T}$PKG_CONFIG" >&6 else echo "$as_me:3243: 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:3252: 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:3269: 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:3281: result: $ac_pt_PKG_CONFIG" >&5 echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6 else echo "$as_me:3284: result: no" >&5 echo "${ECHO_T}no" >&6 fi PKG_CONFIG=$ac_pt_PKG_CONFIG else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi ;; (*) PKG_CONFIG=$withval ;; esac test -z "$PKG_CONFIG" && PKG_CONFIG=none if test "$PKG_CONFIG" != none ; then if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$PKG_CONFIG" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval PKG_CONFIG="$PKG_CONFIG" case ".$PKG_CONFIG" in (.NONE/*) PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:3327: 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:3334: 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:3340: checking for pkg-config library directory" >&5 echo $ECHO_N "checking for pkg-config library directory... $ECHO_C" >&6 ;; (*) echo "$as_me:3344: 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:3371: result: $PKG_CONFIG_LIBDIR" >&5 echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 cf_search_path= ;; (x) ;; (x/*\ *) PKG_CONFIG_LIBDIR= ;; (x/*) PKG_CONFIG_LIBDIR="$cf_search_path" echo "$as_me:3382: result: $PKG_CONFIG_LIBDIR" >&5 echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 cf_search_path= ;; (xyes|xauto) echo "$as_me:3387: 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:3391: checking for search-list" >&5 echo $ECHO_N "checking for search-list... $ECHO_C" >&6 if test "x$PKG_CONFIG" != xnone then # works for pkg-config since version 0.24 (2009) # works for pkgconf since version 0.8.3 (2012) for cf_pkg_program in \ `echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \ pkg-config \ pkgconf do cf_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null | tr : ' '` test -n "$cf_search_path" && break done # works for pkg-config since import in 2005 of original 2001 HP code. test -z "$cf_search_path" && \ cf_search_path=` "$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\ /^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \ sub(\"^[^']*'\",\"\"); \ sub(\"'.*\",\"\"); \ printf \" %s\", \\$0; } \ { next; } \ "` fi echo "$as_me:3418: result: $cf_search_path" >&5 echo "${ECHO_T}$cf_search_path" >&6 ;; (*) { { echo "$as_me:3422: 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:3430: 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:3441: 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:3451: 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:3474: result: $PKG_CONFIG_LIBDIR" >&5 echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 fi fi echo "$as_me:3479: 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:3489: result: $cf_with_tests" >&5 echo "${ECHO_T}$cf_with_tests" >&6 echo "$as_me:3492: 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:3502: result: $enable_mixedcase" >&5 echo "${ECHO_T}$enable_mixedcase" >&6 if test "$enable_mixedcase" = "auto" ; then echo "$as_me:3506: 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:3533: 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:3551: 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:3571: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:3575: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi echo "$as_me:3580: 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:3635: 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:3646: 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:3661: found $ac_dir/$ac_word" >&5 break done fi fi CTAGS=$ac_cv_prog_CTAGS if test -n "$CTAGS"; then echo "$as_me:3669: result: $CTAGS" >&5 echo "${ECHO_T}$CTAGS" >&6 else echo "$as_me:3672: 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:3683: 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:3698: found $ac_dir/$ac_word" >&5 break done fi fi ETAGS=$ac_cv_prog_ETAGS if test -n "$ETAGS"; then echo "$as_me:3706: result: $ETAGS" >&5 echo "${ECHO_T}$ETAGS" >&6 else echo "$as_me:3709: 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:3718: 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:3733: 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:3742: result: $MAKE_LOWER_TAGS" >&5 echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6 else echo "$as_me:3745: 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:3752: 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:3767: 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:3776: result: $MAKE_UPPER_TAGS" >&5 echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6 else echo "$as_me:3779: 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:3799: 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}:3829: testing given option \"$cf_option\",no match \"$cf_result\" ..." 1>&5 ;; esac done rm -f cf_makeflags.tmp fi echo "$as_me:3837: 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:3843: 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:3858: found $ac_dir/$ac_word" >&5 break done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:3866: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:3869: 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:3878: 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:3893: 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:3902: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:3905: 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:3917: 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:3932: found $ac_dir/$ac_word" >&5 break done fi fi LD=$ac_cv_prog_LD if test -n "$LD"; then echo "$as_me:3940: result: $LD" >&5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:3943: 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:3952: 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:3967: 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:3976: result: $ac_ct_LD" >&5 echo "${ECHO_T}$ac_ct_LD" >&6 else echo "$as_me:3979: 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:3991: 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:4006: found $ac_dir/$ac_word" >&5 break done fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then echo "$as_me:4014: result: $AR" >&5 echo "${ECHO_T}$AR" >&6 else echo "$as_me:4017: 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:4026: 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:4041: 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:4050: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6 else echo "$as_me:4053: 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:4065: 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:4080: found $ac_dir/$ac_word" >&5 break done fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then echo "$as_me:4088: result: $AR" >&5 echo "${ECHO_T}$AR" >&6 else echo "$as_me:4091: 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:4100: 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:4115: 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:4124: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6 else echo "$as_me:4127: result: no" >&5 echo "${ECHO_T}no" >&6 fi AR=$ac_ct_AR else AR="$ac_cv_prog_AR" fi echo "$as_me:4136: 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:4179: \$? = $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}:4190: 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:4200: 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:4211: 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:4218: result: $PATH_SEPARATOR" >&5 echo "${ECHO_T}$PATH_SEPARATOR" >&6 echo "$as_me:4221: checking if you have specified an install-prefix" >&5 echo $ECHO_N "checking if you have specified an install-prefix... $ECHO_C" >&6 # Check whether --with-install-prefix or --without-install-prefix was given. if test "${with_install_prefix+set}" = set; then withval="$with_install_prefix" case "$withval" in (yes|no) ;; (*) DESTDIR="$withval" ;; esac fi; echo "$as_me:4234: result: $DESTDIR" >&5 echo "${ECHO_T}$DESTDIR" >&6 ############################################################################### # If we're cross-compiling, allow the user to override the tools and their # options. The configure script is oriented toward identifying the host # compiler, etc., but we need a build compiler to generate parts of the source. if test "$cross_compiling" = yes ; then # defaults that we might want to override : ${BUILD_CFLAGS:=''} : ${BUILD_CPPFLAGS:=''} : ${BUILD_LDFLAGS:=''} : ${BUILD_LIBS:=''} : ${BUILD_EXEEXT:='$x'} : ${BUILD_OBJEXT:='o'} # Check whether --with-build-cc or --without-build-cc was given. if test "${with_build_cc+set}" = set; then withval="$with_build_cc" BUILD_CC="$withval" else for ac_prog in gcc clang c99 c89 cc cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:4262: 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:4277: 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:4285: result: $BUILD_CC" >&5 echo "${ECHO_T}$BUILD_CC" >&6 else echo "$as_me:4288: 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:4297: checking for native build C compiler" >&5 echo $ECHO_N "checking for native build C compiler... $ECHO_C" >&6 echo "$as_me:4299: result: $BUILD_CC" >&5 echo "${ECHO_T}$BUILD_CC" >&6 echo "$as_me:4302: 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:4312: result: $BUILD_CPP" >&5 echo "${ECHO_T}$BUILD_CPP" >&6 echo "$as_me:4315: 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:4323: result: $BUILD_CFLAGS" >&5 echo "${ECHO_T}$BUILD_CFLAGS" >&6 echo "$as_me:4326: 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:4334: result: $BUILD_CPPFLAGS" >&5 echo "${ECHO_T}$BUILD_CPPFLAGS" >&6 echo "$as_me:4337: 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:4345: result: $BUILD_LDFLAGS" >&5 echo "${ECHO_T}$BUILD_LDFLAGS" >&6 echo "$as_me:4348: 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:4356: 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:4365: 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 4379 "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:4389: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:4392: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:4394: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4397: \$? = $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:4412: 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:4417: 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:4442: 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:4452: result: $with_shared" >&5 echo "${ECHO_T}$with_shared" >&6 test "$with_shared" = "yes" && cf_list_models="$cf_list_models shared" echo "$as_me:4456: 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:4459: 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:4464: 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:4467: 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:4472: 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:4482: result: $cf_cv_curses_dir" >&5 echo "${ECHO_T}$cf_cv_curses_dir" >&6 if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" then if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$withval" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval withval="$withval" case ".$withval" in (.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:4513: 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 4549 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:4561: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4564: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4567: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4570: \$? = $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}:4587: 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}:4623: 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:4638: 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:4641: result: yes" >&5 echo "${ECHO_T}yes" >&6 echo "$as_me:4644: 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 4777 "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:4789: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:4792: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:4795: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4798: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then if test "$cross_compiling" = yes; then cf_test_ncuconfig=maybe else cat >"conftest.$ac_ext" <<_ACEOF #line 4804 "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:4811: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:4814: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:4816: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4819: \$? = $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 4993 "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:5005: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:5008: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:5011: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5014: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then if test "$cross_compiling" = yes; then cf_have_ncuconfig=maybe else cat >"conftest.$ac_ext" <<_ACEOF #line 5020 "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:5027: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:5030: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:5032: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5035: \$? = $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:5052: 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:5068: 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 5086 "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:5101: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5104: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5107: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5110: \$? = $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:5126: 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:5161: 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:5177: 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:5192: 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:5200: result: $NCURSES_CONFIG" >&5 echo "${ECHO_T}$NCURSES_CONFIG" >&6 else echo "$as_me:5203: 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:5216: 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:5231: 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:5239: result: $ac_ct_NCURSES_CONFIG" >&5 echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6 else echo "$as_me:5242: 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:5399: 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 5411 "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:5423: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5426: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5429: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5432: \$? = $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:5443: 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:5447: 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:5457: 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 5463 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:5467: \"$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:5473: \$? = $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:5492: 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 5548 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:5560: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5563: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5566: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5569: \$? = $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}:5586: 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:5605: 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 5617 "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:5641: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5644: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5647: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5650: \$? = $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:5665: 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:5672: 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 5793 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:5805: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5808: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5811: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5814: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then : 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}:5831: 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 5854 "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:5878: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5881: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5884: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5887: \$? = $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:5908: error: not found" >&5 echo "$as_me: error: not found" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:5913: 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 5949 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:5961: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5964: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5967: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5970: \$? = $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}:5987: 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:6035: 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 6053 "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:6068: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6071: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6074: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6077: \$? = $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:6093: 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:6131: 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:6157: \"$cf_try\"") >&5 (eval $cf_try) 2>&5 ac_status=$? echo "$as_me:6160: \$? = $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 6170 "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 make an error # endif #endif ${cf_cv_main_return:-return}(0); } _ACEOF rm -f "conftest$ac_exeext" if { (eval echo "$as_me:6197: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6200: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:6202: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6205: \$? = $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:6219: 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:6232: 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 6240 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char Gpm_Open (); int main (void) { Gpm_Open (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:6259: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6262: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6265: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6268: \$? = $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:6279: 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:6282: 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 6290 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char initscr (); int main (void) { initscr (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:6309: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6312: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6315: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6318: \$? = $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:6329: 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:6344: 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 6352 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char tgoto (); int main (void) { tgoto (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:6371: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6374: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6377: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6380: \$? = $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:6391: 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:6440: 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 6446 "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:6477: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6480: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6483: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6486: \$? = $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:6496: 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:6503: 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 6507 "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:6519: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6522: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6525: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6528: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:6530: 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:6537: 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:6605: 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 6609 "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:6621: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6624: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6627: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6630: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:6632: 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:6639: 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:6654: 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:6662: 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 6672 "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:6684: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6687: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6690: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6693: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:6695: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 echo "$as_me:6700: 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 if you want wide-character code... $ECHO_C" >&6 # Check whether --enable-widec or --disable-widec was given. if test "${enable_widec+set}" = set; then enableval="$enable_widec" with_widec=$enableval else with_widec=no fi; echo "$as_me:6728: result: $with_widec" >&5 echo "${ECHO_T}$with_widec" >&6 if test "$with_widec" = yes ; then for ac_header in wchar.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:6735: 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 6741 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:6745: \"$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:6751: \$? = $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:6770: 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 6788 "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:6805: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6808: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6811: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6814: \$? = $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}:6826: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5 cf_save_LIBS="$LIBS" cat >"conftest.$ac_ext" <<_ACEOF #line 6831 "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:6844: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6847: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6850: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6853: \$? = $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 6867 "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:6880: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6883: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6886: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6889: \$? = $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}:6906: testing find linkage for utf8 library ..." 1>&5 echo "${as_me:-configure}:6908: 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}:6999: 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 7007 "configure" #include "confdefs.h" #include int main (void) { putwc(0,0); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:7020: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:7023: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:7026: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7029: \$? = $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}:7034: 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}:7052: 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}:7127: 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 7133 "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:7146: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7149: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7152: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7155: \$? = $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}:7160: 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:7202: 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 7240 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:7252: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:7255: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:7258: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7261: \$? = $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}:7278: 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}:7314: testing adding $cf_add_libdir to library-path ..." 1>&5 LDFLAGS="-L$cf_add_libdir $LDFLAGS" fi fi done fi cf_add_libs="$LIBS" # reverse order cf_add_0lib= for cf_add_1lib in $cf_cv_library_file_utf8; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done # filter duplicates for cf_add_1lib in $cf_add_0lib; do for cf_add_2lib in $cf_add_libs; do if test "x$cf_add_1lib" = "x$cf_add_2lib"; then cf_add_1lib= break fi done test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" done LIBS="$cf_add_libs" fi cf_ncuconfig_root=ncursesw cf_have_ncuconfig=no if test "x${PKG_CONFIG:=none}" != xnone; then echo "$as_me:7344: 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:7347: result: yes" >&5 echo "${ECHO_T}yes" >&6 echo "$as_me:7350: 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 7483 "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:7495: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7498: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7501: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7504: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then if test "$cross_compiling" = yes; then cf_test_ncuconfig=maybe else cat >"conftest.$ac_ext" <<_ACEOF #line 7510 "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:7517: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7520: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:7522: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7525: \$? = $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 7699 "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:7711: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7714: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7717: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7720: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then if test "$cross_compiling" = yes; then cf_have_ncuconfig=maybe else cat >"conftest.$ac_ext" <<_ACEOF #line 7726 "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:7733: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7736: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:7738: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7741: \$? = $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:7758: 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:7774: 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 7792 "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:7807: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:7810: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:7813: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7816: \$? = $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:7832: 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:7867: 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:7883: 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:7898: 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:7906: result: $NCURSES_CONFIG" >&5 echo "${ECHO_T}$NCURSES_CONFIG" >&6 else echo "$as_me:7909: 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:7922: 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:7937: 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:7945: result: $ac_ct_NCURSES_CONFIG" >&5 echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6 else echo "$as_me:7948: 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:8105: checking if we have identified curses headers" >&5 echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6 if test "${cf_cv_ncurses_header+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cf_cv_ncurses_header=none for cf_header in \ ncurses.h ncursesw/ncurses.h \ curses.h ncursesw/curses.h do cat >"conftest.$ac_ext" <<_ACEOF #line 8117 "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:8129: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8132: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:8135: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8138: \$? = $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:8149: 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:8153: 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:8163: 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 8169 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:8173: \"$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:8179: \$? = $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:8198: 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 8254 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:8266: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8269: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:8272: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8275: \$? = $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}:8292: 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:8311: 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 8323 "configure" #include "confdefs.h" #define _XOPEN_SOURCE_EXTENDED #undef HAVE_LIBUTF8_H /* in case we used CF_UTF8_LIB */ #define HAVE_LIBUTF8_H /* to force ncurses' header file to use cchar_t */ #include <$cf_header> int main (void) { #ifdef NCURSES_VERSION #ifndef WACS_BSSB #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 ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:8355: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8358: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:8361: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8364: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then 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:8379: 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:8386: 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 8507 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:8519: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8522: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:8525: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8528: \$? = $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}:8545: 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 8568 "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:8592: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8595: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:8598: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8601: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then cf_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:8622: error: not found" >&5 echo "$as_me: error: not found" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:8627: 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 8663 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:8675: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8678: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:8681: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8684: \$? = $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}:8701: 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:8749: 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 8767 "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:8782: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8785: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:8788: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8791: \$? = $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:8807: 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:8845: 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:8871: \"$cf_try\"") >&5 (eval $cf_try) 2>&5 ac_status=$? echo "$as_me:8874: \$? = $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 8884 "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 make an error # endif #endif ${cf_cv_main_return:-return}(0); } _ACEOF rm -f "conftest$ac_exeext" if { (eval echo "$as_me:8911: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8914: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:8916: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8919: \$? = $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:8933: result: $cf_cv_ncurses_version" >&5 echo "${ECHO_T}$cf_cv_ncurses_version" >&6 test "$cf_cv_ncurses_version" = no || cat >>confdefs.h <<\EOF #define NCURSES 1 EOF cf_nculib_root=ncursesw # This works, except for the special case where we find gpm, but # ncurses is in a nonstandard location via $LIBS, and we really want # to link gpm. cf_ncurses_LIBS="" cf_ncurses_SAVE="$LIBS" echo "$as_me:8946: 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 8954 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char Gpm_Open (); int main (void) { Gpm_Open (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:8973: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8976: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:8979: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8982: \$? = $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:8993: 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:8996: 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 9004 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char initscr (); int main (void) { initscr (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:9023: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:9026: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:9029: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9032: \$? = $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:9043: 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:9058: 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 9066 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char tgoto (); int main (void) { tgoto (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:9085: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:9088: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:9091: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9094: \$? = $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:9105: 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:9154: 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 9160 "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:9191: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:9194: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:9197: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9200: \$? = $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:9210: 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:9217: 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 9221 "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:9233: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:9236: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:9239: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9242: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:9244: 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:9251: 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:9319: 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 9323 "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:9335: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:9338: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:9341: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9344: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:9346: 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:9353: 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:9368: 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:9376: 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 9386 "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:9398: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:9401: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:9404: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9407: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:9409: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 echo "$as_me:9414: 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:9441: result: yes" >&5 echo "${ECHO_T}yes" >&6 echo "$as_me:9444: 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 9577 "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:9589: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:9592: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:9595: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9598: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then if test "$cross_compiling" = yes; then cf_test_ncuconfig=maybe else cat >"conftest.$ac_ext" <<_ACEOF #line 9604 "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:9611: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:9614: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:9616: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9619: \$? = $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 9793 "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:9805: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:9808: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:9811: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9814: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then if test "$cross_compiling" = yes; then cf_have_ncuconfig=maybe else cat >"conftest.$ac_ext" <<_ACEOF #line 9820 "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:9827: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:9830: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:9832: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9835: \$? = $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:9852: 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:9868: 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 9886 "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:9901: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:9904: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:9907: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9910: \$? = $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:9926: 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:9961: 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:9977: 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:9992: 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:10000: result: $NCURSES_CONFIG" >&5 echo "${ECHO_T}$NCURSES_CONFIG" >&6 else echo "$as_me:10003: 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:10016: 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:10031: 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:10039: result: $ac_ct_NCURSES_CONFIG" >&5 echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6 else echo "$as_me:10042: 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:10199: 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 10211 "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:10223: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10226: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10229: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10232: \$? = $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:10243: 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:10247: 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:10257: 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 10263 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:10267: \"$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:10273: \$? = $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:10292: 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 10348 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:10360: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10363: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10366: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10369: \$? = $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}:10386: 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:10405: 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 10417 "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:10441: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10444: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10447: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10450: \$? = $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:10465: 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:10472: 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 10593 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:10605: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10608: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10611: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10614: \$? = $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}:10631: 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 10654 "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:10678: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10681: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10684: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10687: \$? = $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:10708: error: not found" >&5 echo "$as_me: error: not found" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:10713: 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 10749 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:10761: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10764: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10767: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10770: \$? = $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}:10787: 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:10835: 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 10853 "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:10868: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10871: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10874: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10877: \$? = $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:10893: 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:10931: 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:10957: \"$cf_try\"") >&5 (eval $cf_try) 2>&5 ac_status=$? echo "$as_me:10960: \$? = $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 10970 "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 make an error # endif #endif ${cf_cv_main_return:-return}(0); } _ACEOF rm -f "conftest$ac_exeext" if { (eval echo "$as_me:10997: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:11000: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:11002: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11005: \$? = $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:11019: 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:11032: 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 11040 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char Gpm_Open (); int main (void) { Gpm_Open (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:11059: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:11062: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:11065: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11068: \$? = $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:11079: 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:11082: 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 11090 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char initscr (); int main (void) { initscr (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:11109: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:11112: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:11115: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11118: \$? = $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:11129: 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:11144: 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 11152 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char tgoto (); int main (void) { tgoto (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:11171: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:11174: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:11177: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11180: \$? = $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:11191: 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:11240: 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 11246 "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:11277: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:11280: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:11283: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11286: \$? = $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:11296: 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:11303: 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 11307 "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:11319: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:11322: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:11325: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11328: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:11330: 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:11337: 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:11405: 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 11409 "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:11421: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:11424: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:11427: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11430: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:11432: 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:11439: 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:11454: 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:11462: 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 11472 "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:11484: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:11487: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:11490: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11493: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:11495: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 echo "$as_me:11500: 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 </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:11553: \"$cf_try\"") >&5 (eval $cf_try) 2>&5 ac_status=$? echo "$as_me:11556: \$? = $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:11574: 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:11577: 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:11587: 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:11625: 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:11633: 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:11639: 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:11670: result: $LD_RPATH_OPT" >&5 echo "${ECHO_T}$LD_RPATH_OPT" >&6 case "x$LD_RPATH_OPT" in (x-R*) echo "$as_me:11675: 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 11696 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:11708: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:11711: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:11714: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11717: \$? = $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:11727: 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:11749: 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:11764: result: $withval" >&5 echo "${ECHO_T}$withval" >&6 { { echo "$as_me:11766: 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:11775: 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:11798: 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 11805 "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:11817: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11820: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11823: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11826: \$? = $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:11835: 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:11906: 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 11915 "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:11927: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:11930: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:11933: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11936: \$? = $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:11947: 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 12297 "configure" #include "confdefs.h" #include int main (void) { printf("Hello\\n"); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:12309: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12312: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (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 break else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 fi rm -f "conftest.$ac_objext" "conftest.$ac_ext" done CFLAGS="$cf_save_CFLAGS" CC_SHARED_OPTS=$cf_shared_opts MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dy -G -h '$cf_cv_shared_soname' -o $@' else MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -h '$cf_cv_shared_soname' -o $@' fi ;; (sysv5uw7*|unix_sv*) # tested with UnixWare 7.1.0 (gcc 2.95.2 and cc) if test "$GCC" != yes; then CC_SHARED_OPTS='-KPIC' fi MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o $@' ;; (*) CC_SHARED_OPTS='unknown' MK_SHARED_LIB='echo unknown' ;; esac # This works if the last tokens in $MK_SHARED_LIB are the -o target. case "$cf_cv_shlib_version" in (rel|abi) case "$MK_SHARED_LIB" in (*'-o $@') test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes ;; (*) { echo "$as_me:12355: 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:12377: 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:12379: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12382: \$? = $ac_status" >&5 (exit "$ac_status"); }; then echo "$as_me:12384: result: yes" >&5 echo "${ECHO_T}yes" >&6 cf_save_CFLAGS="$CFLAGS" else echo "$as_me:12388: 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}:12403: 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}:12407: 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:12413: 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:12423: 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:12436: 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:12446: 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:12461: 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 12468 "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:12487: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12490: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12493: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12496: \$? = $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:12507: 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:12549: 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 12556 "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:12575: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12578: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12581: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12584: \$? = $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:12595: 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:12603: 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 12615 "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:12634: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12637: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12640: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12643: \$? = $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:12655: 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:12660: 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 12765 "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:12785: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12788: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12791: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12794: \$? = $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:12805: 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:12814: 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 12821 "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:12836: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12839: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12842: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12845: \$? = $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 12952 "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:12967: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12970: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12973: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12976: \$? = $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:12991: 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:12996: 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 13006 "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:13021: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13024: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13027: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13030: \$? = $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:13041: 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:13078: 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}:13084: testing if the symbol is already defined go no further ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 13087 "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:13102: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13105: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13108: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13111: \$? = $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 13132 "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:13147: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13150: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13153: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13156: \$? = $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}:13167: 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}:13175: testing if the second compile does not leave our definition intact error ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 13178 "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:13193: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13196: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13199: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13202: \$? = $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:13218: 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:13335: 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:13367: 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 13374 "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:13392: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13395: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13398: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13401: \$? = $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 13413 "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:13431: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13434: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13437: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13440: \$? = $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:13455: 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:13615: 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}:13621: testing if the symbol is already defined go no further ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 13624 "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:13639: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13642: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13645: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13648: \$? = $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 13669 "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:13684: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13687: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13690: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13693: \$? = $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}:13704: 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}:13712: testing if the second compile does not leave our definition intact error ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 13715 "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:13730: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13733: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13736: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13739: \$? = $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:13755: 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}:13868: testing checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 13871 "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:13889: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13892: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13895: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13898: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then : else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 { echo "$as_me:13905: 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}:13928: 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}:13940: 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}:14028: 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}:14038: 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}:14048: 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:14060: 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 14063 "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: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_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:14096: 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 14101 "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:14116: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14119: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (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_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:14136: WARNING: _XOPEN_SOURCE is lower than requested" >&5 echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;} fi else echo "$as_me:14141: 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 14148 "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:14166: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14169: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14172: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14175: \$? = $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 14187 "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:14205: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14208: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14211: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14214: \$? = $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:14229: 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:14376: 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 14382 "configure" #include "confdefs.h" #include #include #include #include _ACEOF if { (eval echo "$as_me:14390: \"$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:14396: \$? = $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 14418 "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 14436 "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 14457 "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:14483: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:14486: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:14488: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14491: \$? = $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:14504: 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:14520: 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 14526 "configure" #include "confdefs.h" $ac_includes_default #include <$ac_header> _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:14532: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14535: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14538: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14541: \$? = $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:14551: 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 14567 "configure" #include "confdefs.h" $ac_includes_default int main (void) { #ifndef exit char *p = (char *) exit; (void) p; #endif ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:14582: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14585: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14588: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14591: \$? = $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:14601: 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:14611: 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 14623 "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:14643: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14646: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14649: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14652: \$? = $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:14662: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14665: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14668: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14671: \$? = $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:14685: 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:14691: 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 14699 "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:14719: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14722: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14725: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14728: \$? = $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 14737 "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:14758: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14761: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14764: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14767: \$? = $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:14778: 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 14796 "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:14816: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14819: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14822: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14825: \$? = $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 14834 "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:14855: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14858: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14861: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14864: \$? = $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:14875: 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 14896 "configure" #include "confdefs.h" #include int main (void) { return !fseeko; ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:14908: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14911: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14914: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14917: \$? = $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 14926 "configure" #include "confdefs.h" #define _LARGEFILE_SOURCE 1 #include int main (void) { return !fseeko; ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:14939: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14942: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14945: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14948: \$? = $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:14959: 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 14979 "configure" #include "confdefs.h" #include int main (void) { return fseeko && fseeko (stdin, 0, 0); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:14991: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:14994: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:14997: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15000: \$? = $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:15010: 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:15049: 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 15056 "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:15083: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:15086: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:15089: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15092: \$? = $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:15103: 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:15113: 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:15123: 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:15133: 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:15143: 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:15161: 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:15171: 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:15181: 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:15191: 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:15200: 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:15210: result: $with_pthread" >&5 echo "${ECHO_T}$with_pthread" >&6 if test "$with_pthread" != no ; then echo "$as_me:15214: 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 15220 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:15224: \"$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:15230: \$? = $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:15249: 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:15259: 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 15280 "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:15297: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:15300: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:15303: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15306: \$? = $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:15316: 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:15344: 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:15353: 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:15363: result: $use_weak_symbols" >&5 echo "${ECHO_T}$use_weak_symbols" >&6 if test "$use_weak_symbols" = yes ; then echo "$as_me:15367: 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 15374 "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:15400: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:15403: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:15406: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15409: \$? = $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:15420: 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:15449: 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 15455 "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:15486: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:15489: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:15492: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15495: \$? = $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:15505: 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:15517: 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:15527: 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:15550: 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:15560: 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:15608: result: $enableval" >&5 echo "${ECHO_T}$enableval" >&6 echo "$as_me:15611: 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:15628: result: $enable_stdnoreturn" >&5 echo "${ECHO_T}$enable_stdnoreturn" >&6 if test $enable_stdnoreturn = yes; then echo "$as_me:15632: 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 15638 "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:15654: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:15657: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:15660: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15663: \$? = $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:15674: 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}:15730: testing repairing CFLAGS: $CFLAGS ..." 1>&5 CFLAGS="$cf_temp_flags" test -n "$verbose" && echo " ... fixed $CFLAGS" 1>&6 echo "${as_me:-configure}:15735: testing ... fixed $CFLAGS ..." 1>&5 test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 echo "${as_me:-configure}:15739: 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}:15778: testing repairing CPPFLAGS: $CPPFLAGS ..." 1>&5 CPPFLAGS="$cf_temp_flags" test -n "$verbose" && echo " ... fixed $CPPFLAGS" 1>&6 echo "${as_me:-configure}:15783: testing ... fixed $CPPFLAGS ..." 1>&5 test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 echo "${as_me:-configure}:15787: 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}:15826: testing repairing LDFLAGS: $LDFLAGS ..." 1>&5 LDFLAGS="$cf_temp_flags" test -n "$verbose" && echo " ... fixed $LDFLAGS" 1>&6 echo "${as_me:-configure}:15831: testing ... fixed $LDFLAGS ..." 1>&5 test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 echo "${as_me:-configure}:15835: testing ... extra $EXTRA_CFLAGS ..." 1>&5 fi ;; esac fi echo "$as_me:15842: 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:15859: 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 15883 "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:15898: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:15901: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:15904: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15907: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:15910: 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 15917 "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:15935: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:15938: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:15941: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15944: \$? = $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:15959: 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:16020: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:16023: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:16025: 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:16033: 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:16056: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:16059: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:16061: 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}:16069: 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}:16079: 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:16168: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:16170: 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:16238: 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:16248: 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:16301: 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:16311: result: $cf_with_trace" >&5 echo "${ECHO_T}$cf_with_trace" >&6 if test "$cf_with_trace" = yes ; then ADA_TRACE=TRUE cf_fix_cppflags=no cf_new_cflags= cf_new_cppflags= cf_new_extra_cppflags= for cf_add_cflags in -DTRACE do case "$cf_fix_cppflags" in (no) case "$cf_add_cflags" in (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) case "$cf_add_cflags" in (-D*) cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ && test -z "${cf_tst_cflags}" \ && cf_fix_cppflags=yes if test "$cf_fix_cppflags" = yes ; then test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" continue elif test "${cf_tst_cflags}" = "\"'" ; then test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" continue fi ;; esac case "$CPPFLAGS" in (*$cf_add_cflags) ;; (*) case "$cf_add_cflags" in (-D*) cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` CPPFLAGS=`echo "$CPPFLAGS" | \ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` ;; esac test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" ;; esac ;; (*) test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " cf_new_cflags="${cf_new_cflags}$cf_add_cflags" ;; esac ;; (yes) test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ && test -z "${cf_tst_cflags}" \ && cf_fix_cppflags=no ;; esac done if test -n "$cf_new_cflags" ; then test -n "$CFLAGS" && CFLAGS="$CFLAGS " CFLAGS="${CFLAGS}$cf_new_cflags" fi if test -n "$cf_new_cppflags" ; then test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" fi if test -n "$cf_new_extra_cppflags" ; then test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" fi else ADA_TRACE=FALSE fi echo "$as_me:16419: 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:16436: 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:16443: 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 16450 "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:16467: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16470: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16473: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16476: \$? = $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 16486 "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:16503: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16506: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16509: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16512: \$? = $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:16526: result: $cf_cv_need_libssp" >&5 echo "${ECHO_T}$cf_cv_need_libssp" >&6 if test "x$cf_cv_need_libssp" = xyes then cf_add_libs="$LIBS" # reverse order cf_add_0lib= for cf_add_1lib in -lssp; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done # filter duplicates for cf_add_1lib in $cf_add_0lib; do for cf_add_2lib in $cf_add_libs; do if test "x$cf_add_1lib" = "x$cf_add_2lib"; then cf_add_1lib= break fi done test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" done LIBS="$cf_add_libs" fi ;; (*) echo "$as_me:16553: checking for clock_gettime" >&5 echo $ECHO_N "checking for clock_gettime... $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 16560 "configure" #include "confdefs.h" #include int main (void) { struct timespec ts; int rc = clock_gettime(CLOCK_REALTIME, &ts); (void) rc; (void)ts ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:16573: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16576: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16579: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16582: \$? = $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:16593: result: $cf_cv_func_clock_gettime" >&5 echo "${ECHO_T}$cf_cv_func_clock_gettime" >&6 if test "$cf_cv_func_clock_gettime" = yes then cat >>confdefs.h <<\EOF #define HAVE_CLOCK_GETTIME 1 EOF else echo "$as_me:16604: 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 16610 "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:16641: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16644: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16647: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16650: \$? = $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:16660: 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:16670: 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 16678 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gettimeofday (); int main (void) { gettimeofday (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:16697: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16700: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16703: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16706: \$? = $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:16717: 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:16750: 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 16756 "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:16771: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:16774: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:16777: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16780: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then ac_cv_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:16790: result: $ac_cv_type_signed_char" >&5 echo "${ECHO_T}$ac_cv_type_signed_char" >&6 echo "$as_me:16793: 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 16802 "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:16814: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:16817: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:16820: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16823: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then ac_lo=0 ac_mid=0 while :; do cat >"conftest.$ac_ext" <<_ACEOF #line 16828 "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:16840: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:16843: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:16846: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16849: \$? = $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 16865 "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:16877: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:16880: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:16883: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16886: \$? = $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 16902 "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:16914: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:16917: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:16920: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16923: \$? = $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:16936: 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 16941 "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:16957: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16960: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:16962: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16965: \$? = $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:16981: 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 16996 "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:17011: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17014: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:17017: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17020: \$? = $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:17030: 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 17051 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main (void) { opendir (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:17070: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17073: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:17076: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17079: \$? = $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:17090: 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:17097: 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 17105 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main (void) { opendir (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:17124: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17127: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:17130: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17133: \$? = $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:17144: 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:17152: 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 17158 "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:17174: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17177: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:17180: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17183: \$? = $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:17193: 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:17211: 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 17217 "configure" #include "confdefs.h" int main (void) { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset x; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; ccp = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++ccp; p = (char**) ccp; ccp = (char const *const *) p; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } #endif ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:17275: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17278: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:17281: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17284: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then 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:17294: 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:17306: 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:17320: \$? = $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:17347: \$? = $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 17360 "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:17371: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17374: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:17376: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17379: \$? = $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:17394: 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:17413: 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 17419 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:17423: \"$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:17429: \$? = $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:17448: 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 17469 "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:17504: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17507: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:17509: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17512: \$? = $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:17527: 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:17530: 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 17536 "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:17567: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17570: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:17573: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17576: \$? = $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:17586: result: $ac_cv_func_mkstemp" >&5 echo "${ECHO_T}$ac_cv_func_mkstemp" >&6 fi if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then cat >>confdefs.h <<\EOF #define HAVE_MKSTEMP 1 EOF fi if test -z "$cf_user_CFLAGS" && test "$with_no_leaks" = no ; then CFLAGS=`echo "${CFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[ ]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'` CXXFLAGS=`echo "${CXXFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[ ]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'` fi cf_with_ada=yes if test "$cf_with_ada" != "no" ; then for cf_prog_gnat in gnat gnatmake gprconfig gprbuild do cf_upper_prog_gnat=`echo "${cf_prog_gnat}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` unset ac_cv_path_cf_TEMP_gnat unset cf_TEMP_gnat # Extract the first word of "$cf_prog_gnat", so it can be a program name with args. set dummy $cf_prog_gnat; ac_word=$2 echo "$as_me:17615: 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:17632: 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:17644: result: $cf_TEMP_gnat" >&5 echo "${ECHO_T}$cf_TEMP_gnat" >&6 else echo "$as_me:17647: 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:17657: 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:17668: 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:17697: 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:17716: result: $cf_gprconfig_value" >&5 echo "${ECHO_T}$cf_gprconfig_value" >&6 else echo "$as_me:17719: 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:17732: 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:17743: 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:17752: 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:17760: 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:17775: 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:17784: result: $M4_exists" >&5 echo "${ECHO_T}$M4_exists" >&6 else echo "$as_me:17787: 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:17793: 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:17797: 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:17825: result: $cf_cv_prog_gnat_correct" >&5 echo "${ECHO_T}$cf_cv_prog_gnat_correct" >&6 fi else cf_cv_prog_gnat_correct=no fi fi if test "$cf_cv_prog_gnat_correct" = yes; then echo "$as_me:17835: 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:17852: result: $ADAFLAGS" >&5 echo "${ECHO_T}$ADAFLAGS" >&6 echo "$as_me:17855: 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:17865: 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:17869: 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:17879: 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:17891: 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:17939: 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:17952: 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:18015: 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:18021: checking if GNAT supports libraries" >&5 echo $ECHO_N "checking if GNAT supports libraries... $ECHO_C" >&6 echo "$as_me:18023: 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:18043: 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:18055: 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:18066: result: $cf_ada_compiler" >&5 echo "${ECHO_T}$cf_ada_compiler" >&6 cf_ada_package=terminal_interface echo "$as_me:18071: 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 ".$withval" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval withval="$withval" case ".$withval" in (.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:18107: 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:18116: result: $ADA_INCLUDE" >&5 echo "${ECHO_T}$ADA_INCLUDE" >&6 echo "$as_me:18119: 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 ".$withval" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval withval="$withval" case ".$withval" in (.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:18155: 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:18164: result: $ADA_OBJECTS" >&5 echo "${ECHO_T}$ADA_OBJECTS" >&6 echo "$as_me:18167: 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:18188: result: $with_ada_sharedlib" >&5 echo "${ECHO_T}$with_ada_sharedlib" >&6 if test "x$cf_ada_sharedlib_warn" != xno then { echo "$as_me:18192: 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:18210: 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:18226: result: $ADA_LIBNAME" >&5 echo "${ECHO_T}$ADA_LIBNAME" >&6 else { { echo "$as_me:18230: 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:18235: 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:18275: 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:18286: result: $DFT_ARG_SUFFIX" >&5 echo "${ECHO_T}$DFT_ARG_SUFFIX" >&6 echo "$as_me:18289: 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:18372: result: $DFT_DEP_SUFFIX" >&5 echo "${ECHO_T}$DFT_DEP_SUFFIX" >&6 echo "$as_me:18375: 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:18391: 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 overriden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if cmp -s $cache_file confcache; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi DEFS=-DHAVE_CONFIG_H : "${CONFIG_STATUS=./config.status}" ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:18533: 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:18714: 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:18733: 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.20230903, 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:18808: 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,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t s,@CPP@,$CPP,;t t s,@EGREP@,$EGREP,;t t s,@AWK@,$AWK,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@LN_S@,$LN_S,;t t s,@INSTALL_OPT_S@,$INSTALL_OPT_S,;t t s,@INSTALL_OPT_O@,$INSTALL_OPT_O,;t t s,@PKG_CONFIG@,$PKG_CONFIG,;t t s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t s,@PKG_CONFIG_LIBDIR@,$PKG_CONFIG_LIBDIR,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@MAKE_NO_PHONY@,$MAKE_NO_PHONY,;t t s,@MAKE_PHONY@,$MAKE_PHONY,;t t s,@CTAGS@,$CTAGS,;t t s,@ETAGS@,$ETAGS,;t t s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t s,@cf_cv_makeflags@,$cf_cv_makeflags,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@LD@,$LD,;t t s,@ac_ct_LD@,$ac_ct_LD,;t t s,@AR@,$AR,;t t s,@ac_ct_AR@,$ac_ct_AR,;t t s,@ARFLAGS@,$ARFLAGS,;t t s,@DESTDIR@,$DESTDIR,;t t s,@BUILD_CC@,$BUILD_CC,;t t s,@BUILD_CPP@,$BUILD_CPP,;t t s,@BUILD_CFLAGS@,$BUILD_CFLAGS,;t t s,@BUILD_CPPFLAGS@,$BUILD_CPPFLAGS,;t t s,@BUILD_LDFLAGS@,$BUILD_LDFLAGS,;t t s,@BUILD_LIBS@,$BUILD_LIBS,;t t s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t s,@BUILD_OBJEXT@,$BUILD_OBJEXT,;t t s,@DFT_LWR_MODEL@,$DFT_LWR_MODEL,;t t s,@DFT_UPR_MODEL@,$DFT_UPR_MODEL,;t t s,@NCURSES_CONFIG@,$NCURSES_CONFIG,;t t s,@ac_ct_NCURSES_CONFIG@,$ac_ct_NCURSES_CONFIG,;t t s,@NCURSES_MAJOR@,$NCURSES_MAJOR,;t t s,@NCURSES_MINOR@,$NCURSES_MINOR,;t t s,@NCURSES_PATCH@,$NCURSES_PATCH,;t t s,@cf_cv_rel_version@,$cf_cv_rel_version,;t t s,@cf_cv_abi_version@,$cf_cv_abi_version,;t t s,@cf_cv_builtin_bool@,$cf_cv_builtin_bool,;t t s,@cf_cv_header_stdbool_h@,$cf_cv_header_stdbool_h,;t t s,@cf_cv_type_of_bool@,$cf_cv_type_of_bool,;t t s,@LIB_PREFIX@,$LIB_PREFIX,;t t s,@LIB_SUFFIX@,$LIB_SUFFIX,;t t s,@CC_G_OPT@,$CC_G_OPT,;t t s,@LD_MODEL@,$LD_MODEL,;t t s,@shlibdir@,$shlibdir,;t t s,@MAKE_DLLS@,$MAKE_DLLS,;t t s,@CC_SHARED_OPTS@,$CC_SHARED_OPTS,;t t s,@LD_RPATH_OPT@,$LD_RPATH_OPT,;t t s,@LD_SHARED_OPTS@,$LD_SHARED_OPTS,;t t s,@MK_SHARED_LIB@,$MK_SHARED_LIB,;t t s,@RM_SHARED_OPTS@,$RM_SHARED_OPTS,;t t s,@LINK_PROGS@,$LINK_PROGS,;t t s,@LINK_TESTS@,$LINK_TESTS,;t t s,@EXTRA_LDFLAGS@,$EXTRA_LDFLAGS,;t t s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t s,@LOCAL_LDFLAGS2@,$LOCAL_LDFLAGS2,;t t s,@INSTALL_LIB@,$INSTALL_LIB,;t t s,@RPATH_LIST@,$RPATH_LIST,;t t s,@BROKEN_LINKER@,$BROKEN_LINKER,;t t s,@NCURSES_EXT_FUNCS@,$NCURSES_EXT_FUNCS,;t t s,@NCURSES_CONST@,$NCURSES_CONST,;t t s,@PTHREAD@,$PTHREAD,;t t s,@cf_cv_enable_reentrant@,$cf_cv_enable_reentrant,;t t s,@NCURSES_WRAP_PREFIX@,$NCURSES_WRAP_PREFIX,;t t s,@ECHO_LT@,$ECHO_LT,;t t s,@ECHO_LD@,$ECHO_LD,;t t s,@RULE_CC@,$RULE_CC,;t t s,@SHOW_CC@,$SHOW_CC,;t t s,@ECHO_CC@,$ECHO_CC,;t t s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t s,@HAVE_STDNORETURN_H@,$HAVE_STDNORETURN_H,;t t s,@STDC_NORETURN@,$STDC_NORETURN,;t t s,@ADAFLAGS@,$ADAFLAGS,;t t s,@ADA_TRACE@,$ADA_TRACE,;t t s,@cf_TEMP_gnat@,$cf_TEMP_gnat,;t t s,@M4_exists@,$M4_exists,;t t s,@cf_ada_make@,$cf_ada_make,;t t s,@cf_ada_config@,$cf_ada_config,;t t s,@cf_ada_config_Ada@,$cf_ada_config_Ada,;t t s,@cf_ada_config_C@,$cf_ada_config_C,;t t s,@GNATPREP_OPTS@,$GNATPREP_OPTS,;t t s,@cf_compile_generics@,$cf_compile_generics,;t t s,@cf_generic_objects@,$cf_generic_objects,;t t s,@USE_GNAT_SIGINT@,$USE_GNAT_SIGINT,;t t s,@USE_OLD_MAKERULES@,$USE_OLD_MAKERULES,;t t s,@USE_GNAT_PROJECTS@,$USE_GNAT_PROJECTS,;t t s,@USE_GNAT_LIBRARIES@,$USE_GNAT_LIBRARIES,;t t s,@USE_GNAT_MAKE_GPR@,$USE_GNAT_MAKE_GPR,;t t s,@USE_GNAT_GPRBUILD@,$USE_GNAT_GPRBUILD,;t t s,@cf_ada_compiler@,$cf_ada_compiler,;t t s,@cf_ada_package@,$cf_ada_package,;t t s,@ADA_INCLUDE@,$ADA_INCLUDE,;t t s,@ADA_OBJECTS@,$ADA_OBJECTS,;t t s,@ADA_SHAREDLIB@,$ADA_SHAREDLIB,;t t s,@MAKE_ADA_SHAREDLIB@,$MAKE_ADA_SHAREDLIB,;t t s,@ADA_LIBNAME@,$ADA_LIBNAME,;t t s,@TINFO_LDFLAGS2@,$TINFO_LDFLAGS2,;t t s,@TINFO_LIBS@,$TINFO_LIBS,;t t s,@ACPPFLAGS@,$ACPPFLAGS,;t t s,@DFT_ARG_SUFFIX@,$DFT_ARG_SUFFIX,;t t s,@DFT_DEP_SUFFIX@,$DFT_DEP_SUFFIX,;t t s,@DFT_OBJ_SUBDIR@,$DFT_OBJ_SUBDIR,;t t s,@USE_ARG_SUFFIX@,$USE_ARG_SUFFIX,;t t s,@USE_LIB_SUFFIX@,$USE_LIB_SUFFIX,;t t s,@USE_CFG_SUFFIX@,$USE_CFG_SUFFIX,;t t s,@TEST_ARG2@,$TEST_ARG2,;t t s,@TEST_LIBS2@,$TEST_LIBS2,;t t s,@NCURSES_SHLIB2@,$NCURSES_SHLIB2,;t t s,@ADA_SUBDIRS@,$ADA_SUBDIRS,;t t s,@NCURSES_TREE@,$NCURSES_TREE,;t t s,@EXTERNAL_TREE@,$EXTERNAL_TREE,;t t s,@ADAHTML_DIR@,$ADAHTML_DIR,;t t s,@ADAGEN_LDFLAGS@,$ADAGEN_LDFLAGS,;t t CEOF EOF cat >>"$CONFIG_STATUS" <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while "$ac_more_lines"; do if test "$ac_beg" -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag else sed "${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag fi if test ! -s "$tmp"/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat "$tmp"/subs.frag) >"$tmp"/subs-$ac_sed_frag.sed # It is possible to make a multiline substitution using escaped newlines. # Ensure that we do not split the substitution between script fragments. ac_BEG=$ac_end ac_END=`expr "$ac_end" + "$ac_max_sed_lines"` sed "1,${ac_BEG}d; ${ac_END}p; q" "$tmp"/subs.sed >"$tmp"/subs.next if test -s "$tmp"/subs.next; then grep '^s,@[^@,][^@,]*@,.*\\$' "$tmp"/subs.next >"$tmp"/subs.edit if test ! -s "$tmp"/subs.edit; then grep "^s,@[^@,][^@,]*@,.*,;t t$" "$tmp"/subs.next >"$tmp"/subs.edit if test ! -s "$tmp"/subs.edit; then if test "$ac_beg" -gt 1; then ac_end=`expr "$ac_end" - 1` continue fi fi fi fi if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f \"$tmp\"/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f \"$tmp\"/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr "$ac_sed_frag" + 1` ac_beg=$ac_end ac_end=`expr "$ac_end" + "$ac_max_sed_lines"` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds="cat" fi fi # test -n "$CONFIG_FILES" EOF cat >>"$CONFIG_STATUS" <<\EOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in - | *:- | *:-:* ) # input from stdin cat >"$tmp"/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then { case "$ac_dir" in [\\/]* | ?:[\\/]* ) as_incr_dir=;; *) as_incr_dir=.;; esac as_dummy="$ac_dir" for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do case $as_mkdir_dir in # Skip DOS drivespec ?:) as_incr_dir=$as_mkdir_dir ;; *) as_incr_dir=$as_incr_dir/$as_mkdir_dir test -d "$as_incr_dir" || mkdir "$as_incr_dir" ;; esac done; } ac_dir_suffix="/`echo "$ac_dir"|sed 's,^\./,,'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'` else ac_dir_suffix= ac_dots= fi case "$srcdir" in .) ac_srcdir=. if test -z "$ac_dots"; then ac_top_srcdir=. else ac_top_srcdir=`echo "$ac_dots" | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) ac_srcdir="$srcdir$ac_dir_suffix"; ac_top_srcdir="$srcdir" ;; *) # Relative path. ac_srcdir="$ac_dots$srcdir$ac_dir_suffix" ac_top_srcdir="$ac_dots$srcdir" ;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_dots$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:19169: 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:19187: 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:19200: 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:19216: 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:19225: 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:19270: 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:19281: 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:19330: 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:19341: 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:19354: 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:19412: $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 ncurses-6.4-20240113/announce.html.in0000644000000000000000000013414614544105240015546 0ustar rootroot 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 December 31, 2022.

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

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

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

Library improvements

New features

There are no new features in this release.

Other improvements

These are improvements to existing features:

  • modify delscreen to more effectively delete all windows on the given screen.

  • modify wnoutrefresh to call pnoutrefresh if its parameter is a pad, rather than treating it as an error, and modify new_panel to permit its window-parameter to be a pad

  • modify curses_trace() to show the trace-mask as symbols, e.g., TRACE_ORDINARY, DEBUG_LEVEL(3).

  • improve checks for valid mouse events when an intermediate mouse state is not part of the mousemask specified by the caller

  • allow extended-color number in opts parameter of wattr_on.

  • improve _tracecchar_t2 formatting of base+combining character.

  • trim out some unwanted linker options from ncurses*config and .pc files seen in Fedora 36+.

  • improve shell-scripts with shellcheck

  • improve use of "trap" in shell scripts, using a script.

  • modify make-tar.sh scripts to make timestamps more predictable.

These are corrections to existing features:

  • modify misc/gen-pkgconfig.in to allow for the case where the library directory does not yet exist, since this is processed before doing an install

  • set trailing null on string passed from winsnstr to wins_nwstr.

  • modify waddch_literal to allow for double-width base character when merging a combining character

Program improvements

Several improvements were made to the utility programs:

infocmp
  • rewrite canonical_name function of infocmp to ensure buffer size
  • improve readability of long parameterized expressions with the infocmp “-f” option by allowing split before a “%p” marker.
  • modify verbose-option of infocmp, tic, toe to enable debug-tracing if that is configured.
tabs
limit tab-stop values to max-columns
tic
add consistency check in tic for u6/u7/u8/u9 and NQ capabilities.
tput
corrected use of original tty-modes in init/reset subcommands

Examples

Along with the library and utilities, improvements were made to the ncurses-examples. Most of this activity aimed at improving the test-packages:

  • add minimal -h (usage) and -V (version) getopt logic to all ncurses-examples programs.

  • fix an error in "@" command in test/ncurses.c F-menu

  • add curses_trace to ifdef's for START_TRACE in test/test.priv.h

  • improve pthread-configuration for test/worm.c

  • add setlocale call to several test-programs.

  • workaround in test/picsmap.c for use of floating point for rgb values by ImageMagick 6.9.11, which appears to use the wrong upper limit.

  • use static libraries for AdaCurses test-package for Mageia, since no gprbuild package is available.

  • install Ada95 sample programs in libexecdir, adding a wrapper script to invoke those.

  • install ncurses-examples programs in libexecdir, adding a wrapper script to invoke those.

There are other new demo/test programs and reusable examples:

test/combine
demonstrate combining characters
test/test_delwin
demonstrate deleting a window
test/test_mouse
observe mouse events in the raw terminal or parsed ncurses modes
test/test_unget_wch
demonstrate the unget_wch and unget functions

Terminal database

There are several new terminal descriptions:

There are many changes to existing terminal descriptions. Some were updates to several descriptions:

while others affected specific descriptions. These were retested, to take into account changes by their developers:

while these are specific fixes based on reviewing documentation, user reports, or warnings from tic:

att610+cvis0
amended note as per documentation for att610, att620, att730
kon, kon2, jfbterm
revise to undo "linux2.6" change to smacs/rmacs/enacs
st-0.6
add dim, ecma+strikeout
foot+base
add xterm+sl-alt
dec+sl
correct dsl in dec+sl
mintty and tmux
correct setal in mintty/tmux entries, add to vte-2018
nsterm
modify nsterm to use xterm+alt1049
putty
modify putty to use xterm+alt1049
vte-2018
add blink and setal

A few entries use extensions (user-defined terminal capabilities):

  • use ansi+enq and decid+cpr in cases where the terminal probably supported the u6-u9 extension

  • remove u6-u9 from teken-2018

  • use NQ to flag entries where the terminal does not support query and response

  • add/use bracketed+paste to help identify terminals supporting this xterm feature

  • modify samples for xterm mouse 1002/1003 modes to use 1006 mode, and also provide for focus in/out responses

  • xterm patch #371 supports DEC-compatible status-line. add dec+sl to xterm-new, per xterm #371, add xterm-p371, add xterm-p370, for use in older terminals, and set “xterm-new” to “xterm-p370” (to ease adoption).

Documentation

As usual, this release

  • improves documentation by describing new features,

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

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

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

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

Interesting bug-fixes

While there were many bugs fixed during development of ncurses 6.4, only a few (the reason for this release) were both important and interesting. Most of the bug-fixes were for local issues which did not affect compatibility across releases. Since those are detailed in the NEWS file no elaboration is needed here.

The interesting bugs were those dealing with memory leaks and buffer overflows. Although the utilities are designed for text files (which they do properly), some choose to test them with non-text files.

  • Text files contain no embedded nulls. Also, they end with a newline. Feeding tic non-text files exposed a few cases where the program did not check for those issues. As a result, further processing of the input found limit-checks whose assumptions were invalid.

  • Fixing the limit-checks (first) found a problem with tic managing the list of strings in a terminal description. In merging two terminal descriptions (i.e., the “use=” feature), tic was not allocating a complete copy. A quick repair for that introduced a memory leak.

  • The checks for non-text files are improved (i.e., embedded nulls in the input file will cause tic to reject it rather than attempting to process it).

  • The string allocations in tic are likewise improved.

Configuration changes

Major changes

There are no major changes. No new options were added. Several improvements were made to configure checks.

Configuration options

There are a few new/modified configure options:

--with-abi-version

add ABI 7 defaults to configure script.

--with-caps

add warning in configure script if file specified for “--with-caps” does not exist.

--with-manpage-format

bzip2 and xz compression are now supported

--with-xterm-kbs

add check/warning in configure script if option “--with-xterm-kbs” is missing or inconsistent

Portability

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

  • amend configure option's auto-search to account for systems where none of the directories known to pkg-config exist

  • corrected regex needed for older pkg-config used in Solaris 10

  • improve handling of --with-pkg-config-libdir option, allowing for the case where either $PKG_CONFIG_LIBDIR or the option value has a colon-separated list of directories

  • if the --with-pkg-config-libdir option is not given, use ${libdir}/pkgconfig as a default

  • improve search-path check for pkg-config, e.g., for Debian testing which installs pkg-config with architecture-prefixes.

  • build-fix for cross-compiling to MingW, conditionally add -lssp

  • improve configure check for getttynam

  • fixes to build with dietlibc:

    • add configure check for fpathconf
    • add configure check for math sine/cosine, needed in test/tclock, and eliminate pow() from test/hanoi
    • use wcsnlen as an alternative to wmemchr if it is not found
  • modify configure macro CF_BUILD_CC to check if the build-compiler works, rather than that it is different from the cross-compiler, e.g., to accommodate a compiler which can be used for either purpose with different flags

  • modify configure/scripts to work around interference by GNU grep 3.8

Here are some of the other portability fixes:

  • change man_db.renames to template, to handle ncurses*-config script with the --extra-suffix configure option.

  • update CF_XOPEN_SOURCE macro, adding variants “gnueabi" and “gnueabihf" to get _DEFAULT_SOURCE special case, as well as adding GNU libc suffixes for “abi64”, “abin32”, “x32” to distinguish it from other libc flavors.

  • work around musl's nonstandard use of feature test macros by adding a definition for NCURSES_WIDECHAR to the generated “.pc” and *-config files.

  • use “command -v” rather than “type” in Ada95/gen/Makefile.in to fix a portability issue.


Features of ncurses

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

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

  • ncurses supports 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 most EXTENDED features). It includes many function calls not supported under SVr4 curses (but portability of all calls is documented so you can use the SVr4 subset only).

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

  • Ada95 and C++ bindings.

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

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

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

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

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

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

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

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

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

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

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

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

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

  • A BSD-like tset utility is provided.

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

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

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

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

  • The library meets the X/Open Curses requirement that every function declared in a header file has a macro equivalent. If the macro definition is disabled with #undef, 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/vi

ranger

A console file manager with VI key bindings in Python.

https://ranger.github.io/

tin

newsreader, supporting color, MIME

http://www.tin.org/

vifm

File manager with vi like keybindings

https://vifm.info/

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

minicom

terminal emulator for serial modem connections

https://alioth.debian.org/projects/minicom/

mosh

a replacement for ssh.

https://mosh.org/

tack

terminfo action checker

@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.3/ and
https://invisible-mirror.net/archives/ncurses/6.3/ .

There is an archive of the mailing list here:

http://lists.gnu.org/archive/html/bug-ncurses (also https)

Related resources

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

Other resources

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

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

ncurses-6.4-20240113/README.MinGW0000644000000000000000000001520413725260464014310 0ustar rootroot------------------------------------------------------------------------------- -- 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 ncurses-6.4-20240113/mk-hdr.awk0000644000000000000000000001007314062736236014335 0ustar rootroot# $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 ncurses-6.4-20240113/configure.in0000644000000000000000000024002414533060555014756 0ustar rootrootdnl*************************************************************************** dnl Copyright 2018-2022,2023 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.773 2023/12/03 11:07:25 tom Exp $ dnl Process this file with autoconf to produce a configure script. dnl dnl For additional information, see dnl https://invisible-island.net/autoconf/ dnl https://invisible-island.net/autoconf/my-autoconf.html dnl dnl --------------------------------------------------------------------------- AC_PREREQ(2.52.20210101) AC_REVISION($Revision: 1.773 $) 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. AC_ARG_WITH(ada, [ --without-ada suppress check for Ada compiler, don't build demo], [cf_with_ada=$withval], [cf_with_ada=yes]) if test "x$cf_with_ada" = xyes then cf_prog_cc="gnatgcc gcc cc" else cf_prog_cc="gcc cc" fi CF_PROG_CC($cf_prog_cc) AC_PROG_CPP AC_PROG_GCC_TRADITIONAL CF_PROG_CC_C_O(CC,[$CFLAGS $CPPFLAGS]) CF_PROG_LDCONFIG dnl DEFECT in autoconf 2.12: an attempt to set policy, this breaks the dnl configure script by not letting us test if C++ dnl is present, making this option necessary. AC_MSG_CHECKING(if you want to ensure bool is consistent with C++) AC_ARG_WITH(cxx, [ --without-cxx do not adjust ncurses bool to match C++], [cf_with_cxx=$withval], [cf_with_cxx=yes]) AC_MSG_RESULT($cf_with_cxx) if test "X$cf_with_cxx" = Xno ; then CXX="" GXX="" else # with autoconf 2.13, we can change the error to a warning: pushdef([AC_MSG_ERROR], [AC_MSG_RESULT(no) AC_MSG_WARN([You don't have any C++ compiler, too bad]) cf_with_cxx=no; CXX=""; GXX="";])dnl AC_PROG_CXX popdef([AC_MSG_ERROR])dnl AC_LANG_PUSH(C++) if test "x$cf_with_cxx" != xno then # Several of the C++ configurations do not work, particularly when # cross-compiling (20140913 -TD) AC_MSG_CHECKING(if $CXX works) save_CPPFLAGS="$CPPFLAGS" eval cf_includedir=${includedir} CPPFLAGS="$CPPFLAGS -I${cf_includedir}" AC_TRY_COMPILE([ #include #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 dnl Special option for use by system-builders: the install-prefix is used to dnl adjust the location into which the actual install is done, so that an dnl archive can be built without modifying the host system's configuration. AC_MSG_CHECKING(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) ############################################################################### 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 test "x$with_ext_funcs" = xyes || cf_dft_ext_spfuncs=no else NCURSES_EXT_FUNCS=0 GENERATED_EXT_FUNCS= fi AC_SUBST(NCURSES_EXT_FUNCS) AC_SUBST(GENERATED_EXT_FUNCS) AC_MSG_CHECKING(if you want to build with SCREEN extensions) AC_ARG_ENABLE(sp-funcs, [ --enable-sp-funcs enable SCREEN-extensions], [with_sp_funcs=$enableval], [with_sp_funcs=$cf_dft_ext_spfuncs]) AC_MSG_RESULT($with_sp_funcs) if test "x$with_sp_funcs" = xyes ; then NCURSES_SP_FUNCS=1 AC_DEFINE(NCURSES_SP_FUNCS,1,[Define to 1 to enable SCREEN-extensions]) AC_DEFINE(HAVE_TPUTS_SP,1,[Define to 1 to enable tputs_sp() function in test-programs]) GENERATED_SP_FUNCS=generated else NCURSES_SP_FUNCS=0 GENERATED_SP_FUNCS= fi AC_SUBST(NCURSES_SP_FUNCS) AC_SUBST(GENERATED_SP_FUNCS) AC_MSG_CHECKING(if you want to build with terminal-driver) AC_ARG_ENABLE(term-driver, [ --enable-term-driver enable terminal-driver], [with_term_driver=$enableval], [with_term_driver=no]) AC_MSG_RESULT($with_term_driver) if test "x$with_term_driver" = xyes ; then AC_DEFINE(USE_TERM_DRIVER,1,[Define to 1 to enable terminal-driver]) if test "x$with_termlib" != xno ; then AC_MSG_ERROR(The term-driver option conflicts with the termlib option) fi if test "x$with_sp_funcs" != xyes ; then AC_MSG_ERROR(The term-driver option relies upon sp-funcs) fi fi ### use option --enable-const to turn on use of const beyond that in XSI. AC_MSG_CHECKING(for extended use of const keyword) AC_ARG_ENABLE(const, [ --enable-const compile with extra/non-standard const], [with_ext_const=$enableval], [with_ext_const=$cf_dft_ext_const]) AC_MSG_RESULT($with_ext_const) NCURSES_CONST='/*nothing*/' if test "x$with_ext_const" = xyes ; then NCURSES_CONST=const fi AC_SUBST(NCURSES_CONST) ### use option --enable-ext-colors to turn on use of colors beyond 16. AC_MSG_CHECKING(if you want to use extended colors) AC_ARG_ENABLE(ext-colors, [ --enable-ext-colors compile for 256-color support], [with_ext_colors=$enableval], [with_ext_colors=$cf_dft_ext_colors]) AC_MSG_RESULT($with_ext_colors) NCURSES_EXT_COLORS=0 if test "x$with_ext_colors" = xyes ; then if test "x$with_widec" != xyes ; then AC_MSG_WARN(This option applies only to wide-character library) else # cannot be ABI 5 since it changes sizeof(cchar_t) CF_NCURSES_ABI_6 NCURSES_EXT_COLORS=1 AC_DEFINE(NCURSES_EXT_COLORS,1,[Define to 1 to compile for 256-color support]) AC_DEFINE(HAVE_ALLOC_PAIR,1,[Define to 1 to enable alloc_pair() function]) AC_DEFINE(HAVE_INIT_EXTENDED_COLOR,1,[Define to 1 to enable init_extended_color() function in test-programs]) AC_DEFINE(HAVE_RESET_COLOR_PAIRS,1,[Define to 1 to enable reset_color_pairs() function in test-programs]) fi fi AC_SUBST(NCURSES_EXT_COLORS) ### use option --enable-ext-mouse to modify coding to support 5-button mice AC_MSG_CHECKING(if you want to use extended mouse encoding) AC_ARG_ENABLE(ext-mouse, [ --enable-ext-mouse compile for extended mouse-encoding], [with_ext_mouse=$enableval], [with_ext_mouse=$cf_dft_ext_mouse]) AC_MSG_RESULT($with_ext_mouse) if test "x$with_ext_mouse" = xyes ; then CF_NCURSES_ABI_6 fi 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) test "x$with_sigwinch" = xyes && AC_DEFINE(USE_SIGWINCH,1,[Define to 1 to compile with SIGWINCH handler]) ### use option --enable-tcap-names to allow user to define new capabilities AC_MSG_CHECKING(if you want user-definable terminal capabilities like termcap) AC_ARG_ENABLE(tcap-names, [ --enable-tcap-names compile with user-definable terminal capabilities], [with_tcap_names=$enableval], [with_tcap_names=$with_ext_funcs]) AC_MSG_RESULT($with_tcap_names) NCURSES_XNAMES=0 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_ENABLE(opaque-curses, [ --disable-opaque-curses do not make WINDOW, etc., structures opaque], [enable_opaque_curses=yes],[ test "$cf_cv_enable_reentrant" = 1 && enable_opaque_curses=yes test "$cf_cv_enable_reentrant" = 1 || enable_opaque_curses=$cf_dft_opaque_curses ]) AC_MSG_RESULT($enable_opaque_curses) test "$cf_cv_enable_reentrant" = 1 && \ test "$enable_opaque_curses" = no && \ AC_MSG_ERROR(reentrant configuration requires opaque library) AC_MSG_CHECKING(whether form library structures should be opaque) AC_ARG_ENABLE(opaque-form, [ --disable-opaque-form do not make form library structures opaque], [enable_opaque_form=yes],[enable_opaque_form=$cf_dft_opaque_curses]) AC_MSG_RESULT($enable_opaque_form) AC_MSG_CHECKING(whether menu library structures should be opaque) AC_ARG_ENABLE(opaque-menu, [ --disable-opaque-menu do not make menu library structures opaque], [enable_opaque_menu=yes],[enable_opaque_menu=$cf_dft_opaque_curses]) AC_MSG_RESULT($enable_opaque_menu) AC_MSG_CHECKING(whether panel library structures should be opaque) AC_ARG_ENABLE(opaque-panel, [ --disable-opaque-panel do not make panel library structures opaque], [enable_opaque_panel=yes],[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-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 code to check screensize) AC_ARG_ENABLE(check-size, [ --enable-check-size compile-in code to detect screensize], [with_check_size=$enableval], [with_check_size=no]) AC_MSG_RESULT($with_check_size) test "x$with_check_size" = xyes && AC_DEFINE(USE_CHECK_SIZE,1,[Define to 1 to compile-in code to detect screensize]) ### use option --enable-colorfgbg to turn on use of $COLORFGBG environment AC_MSG_CHECKING(if you want colorfgbg code) AC_ARG_ENABLE(colorfgbg, [ --enable-colorfgbg compile-in experimental $COLORFGBG code], [with_colorfgbg=$enableval], [with_colorfgbg=no]) AC_MSG_RESULT($with_colorfgbg) test "x$with_colorfgbg" = xyes && AC_DEFINE(USE_COLORFGBG,1,[Define to 1 to compile-in experimental $COLORFGBG code]) ### use option --enable-fvisibility to turn on use of gcc-specific feature AC_MSG_CHECKING(if you want to use gcc -fvisibility option) AC_ARG_ENABLE(fvisibility, [ --enable-fvisibility compile with -fvisibility=hidden], [cf_with_fvisibility=$enableval], [cf_with_fvisibility=no]) AC_MSG_RESULT($cf_with_fvisibility) NCURSES_IMPEXP= NCURSES_CXX_IMPEXP= if test "x$cf_with_fvisibility" = xyes; then CF_CHECK_FVISIBILITY($CC,CFLAGS,cf_cv_fvisibility_hidden) if test "x$cf_cv_fvisibility_hidden" = xyes then CF_ADD_CFLAGS([-fvisibility=hidden]) NCURSES_IMPEXP="__attribute__ ((visibility(\"default\")))" fi if test -n "$CXX" then AC_LANG_PUSH(C++) CF_CHECK_FVISIBILITY($CXX,CXXFLAGS,cf_cv_fvisibility_hidden2) if test "x$cf_cv_fvisibility_hidden2" = xyes then CF_ADD_CXXFLAGS([-fvisibility=hidden]) NCURSES_CXX_IMPEXP="__attribute__ ((visibility(\"default\")))" fi AC_LANG_POP fi fi AC_SUBST(NCURSES_IMPEXP) AC_SUBST(NCURSES_CXX_IMPEXP) ### use option --enable-interop to turn on use of bindings used for interop AC_MSG_CHECKING(if you want interop bindings) AC_ARG_ENABLE(interop, [ --enable-interop compile-in interop bindings], [with_exp_interop=$enableval], [with_exp_interop=$cf_dft_interop]) AC_MSG_RESULT($with_exp_interop) NCURSES_INTEROP_FUNCS=0 test "x$with_exp_interop" = xyes && NCURSES_INTEROP_FUNCS=1 AC_SUBST(NCURSES_INTEROP_FUNCS) AC_MSG_CHECKING(if you want experimental safe-sprintf code) AC_ARG_ENABLE(safe-sprintf, [ --enable-safe-sprintf compile with experimental safe-sprintf code], [with_safe_sprintf=$enableval], [with_safe_sprintf=no]) AC_MSG_RESULT($with_safe_sprintf) ### use option --disable-scroll-hints to turn off use of scroll-hints scrolling logic # when hashmap is used scroll hints are useless if test "$with_hashmap" = no ; then AC_MSG_CHECKING(if you want to experiment without scrolling-hints code) AC_ARG_ENABLE(scroll-hints, [ --disable-scroll-hints compile without scroll-hints code], [with_scroll_hints=$enableval], [with_scroll_hints=yes]) AC_MSG_RESULT($with_scroll_hints) test "x$with_scroll_hints" = xyes && AC_DEFINE(USE_SCROLL_HINTS,1,[Define to 1 to compile without scroll-hints code]) fi AC_MSG_CHECKING(if you want wgetch-events code) AC_ARG_ENABLE(wgetch-events, [ --enable-wgetch-events compile with wgetch-events code], [with_wgetch_events=$enableval], [with_wgetch_events=no]) AC_MSG_RESULT($with_wgetch_events) if test "x$with_wgetch_events" = xyes ; then AC_DEFINE(NCURSES_WGETCH_EVENTS,1,[Define to 1 to compile with wgetch-events code]) NCURSES_WGETCH_EVENTS=1 else NCURSES_WGETCH_EVENTS=0 fi AC_SUBST(NCURSES_WGETCH_EVENTS) case "$cf_cv_system_name" in (*mingw32*|*mingw64*|*-msvc*) AC_MSG_CHECKING(if you want experimental-Windows driver) AC_ARG_ENABLE(exp-win32, [ --enable-exp-win32 compile with experimental-Windows driver], [with_exp_win32=$enableval], [with_exp_win32=no]) AC_MSG_RESULT($with_exp_win32) if test "x$with_exp_win32" = xyes then AC_DEFINE(EXP_WIN32_DRIVER,1,[Define to 1 to compile with experimental win32 driver]) EXP_WIN32_DRIVER=1 INTERNALS_HDR='[$](INCDIR)/nc_win32.h' else INTERNALS_HDR='[$](INCDIR)/nc_mingw.h' EXP_WIN32_DRIVER=0 fi ;; (*) EXP_WIN32_DRIVER=0 INTERNALS_HDR= ;; esac AC_SUBST(EXP_WIN32_DRIVER) AC_SUBST(INTERNALS_HDR) ############################################################################### CF_HELP_MESSAGE(Testing/development Options:) ### use option --disable-echo to suppress full display compiling commands CF_DISABLE_ECHO if test "x$enable_echo" = xyes; then ECHO_LINK= else ECHO_LINK='@ echo linking $@ ... ;' test -n "$LIBTOOL" && LIBTOOL="$LIBTOOL --silent" test -n "$LIBTOOL_CXX" && LIBTOOL_CXX="$LIBTOOL_CXX --silent" fi AC_SUBST(ECHO_LINK) # --disable-stripping is used for debugging CF_INSTALL_OPTS # If we're avoiding relinking of shared libraries during install, that is to # avoid modifying the build-tree. For the same reason, avoid doing ranlib if # the install program has "-p" (for preserving timestamps). cf_cv_do_reranlib=yes if test "x$cf_cv_install_p" = xyes then if test "x$cf_cv_do_relink" != xyes then cf_cv_do_reranlib=no INSTALL_OPT_P="-p" INSTALL_LIB="$INSTALL_LIB $INSTALL_OPT_P" fi fi AC_SUBST(INSTALL_OPT_P) ### use option --enable-warnings to turn on all gcc warnings CF_ENABLE_WARNINGS(Wno-unknown-pragmas Wswitch-enum,yes) if test "x$enable_warnings" = "xyes"; then CF_ADD_ADAFLAGS(-gnatwa -gnatyg) if test "x$cf_with_cxx" = xyes ; then CF_GXX_WARNINGS(Wno-unused) fi fi CF_ENABLE_STRING_HACKS ### use option --enable-assertions to turn on generation of assertion code AC_MSG_CHECKING(if you want to enable runtime assertions) AC_ARG_ENABLE(assertions, [ --enable-assertions test: turn on generation of assertion code], [with_assertions=$enableval], [with_assertions=no]) AC_MSG_RESULT($with_assertions) if test -n "$GCC" then if test "$with_assertions" = no then CPPFLAGS="$CPPFLAGS -DNDEBUG" else CF_ADD_ADAFLAGS(-gnata) fi fi ### use option --disable-leaks to suppress "permanent" leaks, for testing CF_DISABLE_LEAKS AC_DEFINE(HAVE_NC_ALLOC_H,1,[Define to 1 if we have nc_alloc.h header]) ### use option --enable-expanded to generate certain macros as functions AC_ARG_ENABLE(expanded, [ --enable-expanded test: generate functions for certain macros], [test "x$enableval" = xyes && AC_DEFINE(NCURSES_EXPANDED,1,[Define to 1 to generate functions for certain macros])]) ### use option --disable-macros to suppress macros in favor of functions AC_ARG_ENABLE(macros, [ --disable-macros test: use functions rather than macros], [test "$enableval" = no && AC_DEFINE(NCURSES_NOMACROS,1,[Define to 1 to use functions rather than macros])]) # Normally we only add trace() to the debug-library. Allow this to be # extended to all models of the ncurses library: cf_all_traces=no case "$CFLAGS $CPPFLAGS" in (*-DTRACE*) cf_all_traces=yes ;; esac AC_MSG_CHECKING(whether to add trace feature to all models) AC_ARG_WITH(trace, [ --with-trace test: add trace() function to all models of ncurses], [cf_with_trace=$withval], [cf_with_trace=$cf_all_traces]) AC_MSG_RESULT($cf_with_trace) if test "x$cf_with_trace" = xyes ; then LIB_TRACING=all ADA_TRACE=TRUE CF_ADD_CFLAGS(-DTRACE) AC_DEFINE(HAVE__TRACEF,1,[Define to 1 if we have _tracef function]) else LIB_TRACING=DEBUG ADA_TRACE=FALSE fi AC_SUBST(ADA_TRACE) CF_DISABLE_GNAT_PROJECTS ### Checks for libraries. case "$cf_cv_system_name" in (*mingw32*|*mingw64*) # Note: WINVER may be a problem with Windows 10 if test "x$with_exp_win32" = xyes ; then CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -DWIN32_LEAN_AND_MEAN" else CPPFLAGS="$CPPFLAGS -DWINVER=0x0501 -DWIN32_LEAN_AND_MEAN" fi CF_CHECK_LIBSSP ;; (*) ;; 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 \ putenv \ remove \ select \ setbuf \ setbuffer \ setenv \ setfsuid \ setvbuf \ sigaction \ sigvec \ snprintf \ strdup \ strstr \ sysconf \ tcgetpgrp \ times \ tsearch \ vsnprintf \ ) CF_FUNC_GETTTYNAM if test "x$ac_cv_func_getopt" = xno && \ test "x$cf_with_progs$cf_with_tests" != xnono; then AC_MSG_ERROR(getopt is required for building programs) fi if test "x$with_safe_sprintf" = xyes then if test "x$ac_cv_func_vsnprintf" = xyes then AC_MSG_WARN(will use vsnprintf instead of safe-sprintf option) else AC_DEFINE(USE_SAFE_SPRINTF,1,[Define to 1 to compile with experimental safe-sprintf code]) fi fi if test "x$with_getcap" = "xyes" ; then CF_CGETENT fi CF_ISASCII CF_STRUCT_SIGACTION CF_FUNC_NANOSLEEP CF_FUNC_TERMIOS CF_FUNC_VSSCANF CF_MKSTEMP # setup for prototype of fallback for vsscanf() CF_SUBST_IF(["$cf_cv_func_vsscanf" = vsscanf], HAVE_VSSCANF, 1, 0) dnl FIXME (may need this) AC_SYS_RESTARTABLE_SYSCALLS if test "x$cross_compiling" = xyes ; then AC_MSG_WARN(cross compiling: assume setvbuf params not reversed) else AC_FUNC_SETVBUF_REVERSED fi AC_CHECK_TYPE(intptr_t, long) AC_CHECK_TYPE(ssize_t, int) CF_TYPE_SIGACTION CF_SIZECHANGE CF_FUNC_MEMMOVE CF_FUNC_POLL CF_VA_COPY AC_FUNC_VFORK CF_FOPEN_BIN_R # special check for test/ditto.c CF_FUNC_OPENPTY if test "$cf_cv_func_openpty" != no ; then AC_DEFINE_UNQUOTED(USE_OPENPTY_HEADER,<$cf_cv_func_openpty>,[Define to actual header for openpty function]) AC_DEFINE(USE_XTERM_PTY,1,[Define to 1 if we should assume xterm pseudoterminal interface]) if test "x$cf_cv_lib_util" = xyes ; then CF_ADD_LIB(util,TEST_LIBS) fi fi AC_SUBST(TEST_LIBS) AC_SUBST(TEST_LIBS2) if test "$with_hashed_db" != no ; then AC_DEFINE(USE_HASHED_DB,1,[Define to 1 if we should build terminfo in hashed database]) CF_HASHED_DB($with_hashed_db) fi dnl We'll do our own -g libraries, unless the user's overridden via $CFLAGS if test -z "$cf_user_CFLAGS" && test "$enable_leaks" = yes ; then CF_STRIP_G_OPT(CFLAGS) CF_STRIP_G_OPT(CXXFLAGS) fi # Just in case, check if the C compiler has a bool type. CF_BOOL_DECL(cf_cv_cc_bool_type) # Check for C++ compiler characteristics (and ensure that it's there!) if test -n "$CXX" ; then AC_LANG_CPLUSPLUS CF_STDCPP_LIBRARY CF_PROG_CC_C_O(CXX,[$CXXFLAGS $CPPFLAGS]) case "$GXX_VERSION" in (1.*|2.[[0-6]]*|[[1-9]][[0-9]].*) cf_cxx_library=yes ;; (*-2.7*|2.7*) CF_GPP_LIBRARY ;; (*) cf_cxx_library=no ;; esac AC_CHECK_HEADERS(typeinfo) CF_CXX_IOSTREAM_NAMESPACE CF_BOOL_DECL CF_BOOL_SIZE CF_ETIP_DEFINES CF_CPP_OVERRIDE CF_CPP_PARAM_INIT CF_CPP_STATIC_CAST CF_CXX_AR_FLAGS else cf_cxx_library=no cf_cv_builtin_bool=1 # Just because we are not configuring against C++ right now does not # mean that a user will not want to use C++. Some distributors disable # the C++ portion of this configuration as a shortcut (or just to avoid # compiling the demo in the c++ directory). So we need a reasonable # default for the 'bool' type. # # Caveat: since the storage of the bool type is not standardized, it # may change. if test "$NCURSES_BOOL" != auto ; then cf_cv_type_of_bool=$NCURSES_BOOL cf_cv_header_stdbool_h=0 else if test "$cf_cv_header_stdbool_h" = 1 ; then CF_BOOL_SIZE else AC_MSG_CHECKING(for fallback type of bool) case "$host_cpu" in (i?86) cf_cv_type_of_bool=char ;; (*) cf_cv_type_of_bool=int ;; esac AC_MSG_RESULT($cf_cv_type_of_bool) fi fi fi AC_SUBST(CXXLIBS) # If the C compiler did not declare bool, and we did not determine that the C++ # compiler does not declare bool, turn on an ifdef in curses.h that makes the # ncurses library use the same type as C++ bool. Note that this allows one to # specify the type of bool in a configure-script option and postpone # integration with the C++ compiler provided that the types are compatible. USE_CXX_BOOL=1 if test "$cf_cv_cc_bool_type" = 1 then # oops: C has a bool. Unlikely, but C++ could differ. USE_CXX_BOOL=0 elif test "$cf_cv_builtin_bool" = 0 then # C++ has no bool USE_CXX_BOOL=0 else # this is the normal case USE_CXX_BOOL='defined(__cplusplus)' fi AC_SUBST(USE_CXX_BOOL) CF_HELP_MESSAGE(Ada Binding Options:) dnl If the Ada95 source-tree is present, add that to the build unless it will dnl not work, or was not requested. if test -f "${srcdir}/Ada95/Makefile.in" ; then dnl libtool does not know anything about GNAT, though a change made in 1998 dnl provided for it "someday". Disable the ada subtree if we are using dnl libtool -TD 20070714 if test "$cf_with_ada" != "no" ; then if test "$with_libtool" != "no"; then AC_MSG_WARN(libtool does not support Ada - disabling feature) cf_with_ada=no fi fi dnl Check for availability of GNU Ada Translator (GNAT). dnl At the moment we support no other Ada compiler. if test "$cf_with_ada" != "no" ; then CF_PROG_GNAT if test "x$cf_cv_prog_gnat_correct" = xyes; then CF_ADD_ADAFLAGS(-gnatpn) CF_FIXUP_ADAFLAGS CF_GNATPREP_OPT_T CF_GNAT_GENERICS CF_GNAT_SIGINT CF_GNAT_PROJECTS CF_WITH_ADA_COMPILER cf_ada_package=terminal_interface AC_SUBST(cf_ada_package) CF_WITH_ADA_INCLUDE CF_WITH_ADA_OBJECTS CF_WITH_ADA_SHAREDLIB # allow the Ada binding to be renamed CF_WITH_ADA_LIBNAME(AdaCurses) fi fi else cf_with_ada=no fi # do this "late" to avoid conflict with header-checks if test "x$with_widec" = xyes ; then AC_CHECK_SIZEOF(wchar_t) # cross-compiling to mingw can run into the problem that attempting to # link with the regex library fails, causing the test to not set this to # a number. "recent" autoconf does not address this problem either -TD if test -z "$ac_cv_sizeof_wchar_t" then CF_VERBOSE(test failed (assume 2)) sed /SIZEOF_WCHAR_T/d confdefs.h >confdefs.tmp mv confdefs.tmp confdefs.h echo "#define SIZEOF_WCHAR_T 2" >>confdefs.h fi fi ### Construct the ncurses library-subsets, if any, from this set of keywords: ### none, base, ext_funcs, ext_tinfo, ticlib, termlib, widechar ### ### ticlib modules may be a separate library, otherwise contained in termlib. ### termlib modules may be a separate library, otherwise contained in ncurses. ### ### The of "+" or " " between the tokens controls the way the script ### chooses to split module lists into libraries. ### ### (see CF_LIB_RULES). AC_MSG_CHECKING(for library subsets) LIB_SUBSETS= if test "x$cf_with_progs" = xyes || test "$with_ticlib" != no || test "$with_termcap" != no; then LIB_SUBSETS="${LIB_SUBSETS}ticlib" if test "$with_ticlib" != no ; then LIB_SUBSETS="${LIB_SUBSETS} " else LIB_SUBSETS="${LIB_SUBSETS}+" fi fi LIB_SUBSETS="${LIB_SUBSETS}termlib" test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_tinfo" if test "$with_termlib" != no ; then LIB_SUBSETS="${LIB_SUBSETS} " else LIB_SUBSETS="${LIB_SUBSETS}+" fi LIB_SUBSETS="${LIB_SUBSETS}base" # Most term-driver calls are to tinfo, but some like init_pair are to the # base library (so it resides in base). if test "$with_term_driver" != no ; then LIB_SUBSETS="${LIB_SUBSETS}+port_drivers" case "$cf_cv_system_name" in (*mingw32*|*mingw64*) if test "x$with_exp_win32" = xyes ; then LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32" else LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32con" fi CPPFLAGS="$CPPFLAGS -DUSE_WIN32CON_DRIVER" ;; (*) LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo" ;; esac elif test "x$with_exp_win32" = xyes ; then case "$cf_cv_system_name" in (*mingw32*|*mingw64*) LIB_SUBSETS="${LIB_SUBSETS}+port_win32" ;; (*) ;; esac fi test "x$with_widec" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+widechar" test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_funcs" AC_MSG_RESULT($LIB_SUBSETS) ### Construct the list of include-directories to be generated CF_INCLUDE_DIRS CF_ADA_INCLUDE_DIRS ### Build up pieces for makefile rules AC_MSG_CHECKING(default library suffix) CF_LIB_TYPE($DFT_LWR_MODEL,DFT_ARG_SUFFIX)dnl AC_SUBST(DFT_ARG_SUFFIX)dnl the string to append to "-lncurses" ("") AC_MSG_RESULT($DFT_ARG_SUFFIX) AC_MSG_CHECKING(default library-dependency suffix) CF_LIB_SUFFIX($DFT_LWR_MODEL,DFT_LIB_SUFFIX,DFT_DEP_SUFFIX)dnl AC_SUBST(DFT_DEP_SUFFIX)dnl the corresponding library-suffix (".a") AC_MSG_RESULT($DFT_DEP_SUFFIX) AC_MSG_CHECKING(default object directory) CF_OBJ_SUBDIR($DFT_LWR_MODEL,DFT_OBJ_SUBDIR)dnl AC_SUBST(DFT_OBJ_SUBDIR)dnl the default object-directory ("obj") AC_MSG_RESULT($DFT_OBJ_SUBDIR) if test "x$cf_with_cxx" = xyes ; then AC_MSG_CHECKING(c++ library-dependency suffix) if test "$with_libtool" != "no"; then # libtool thinks it can make c++ shared libraries (perhaps only g++) CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX elif test "$with_shared_cxx" != "no"; then # also for g++ users... CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX else # we normally make a static library because C/C++ library rules differ CF_LIB_SUFFIX(normal,CXX_LIB_SUFFIX,CXX_DEP_SUFFIX) fi AC_MSG_RESULT($CXX_LIB_SUFFIX) AC_SUBST(CXX_LIB_SUFFIX) fi # do not want -ldl in build except as needed for -lncurses dependency if test "x$with_dlsym" = xyes ; then if test "$DFT_LWR_MODEL" = shared || \ test "$DFT_LWR_MODEL" = libtool ; then CF_REMOVE_LIB(LIBS,$LIBS,dl) fi fi ### Set up low-level terminfo dependencies for makefiles. # TICS_LIST and TINFO_LIST are needed to build libtic.so and libterm.so, but # do not need libdl TICS_LIST= if test "x$with_dlsym" = xyes ; then CF_REMOVE_LIB(TINFO_LIST,$SHLIB_LIST,dl) fi USE_ARG_SUFFIX="${DFT_ARG_SUFFIX}${EXTRA_SUFFIX}" USE_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}" USE_CFG_SUFFIX=${DFT_ARG_SUFFIX}${cf_cv_abi_version} if test -n "$EXTRA_SUFFIX" && test "x$EXTRA_SUFFIX" != "x${cf_cv_abi_version}" then USE_CFG_SUFFIX="${USE_CFG_SUFFIX}${EXTRA_SUFFIX}" fi AC_SUBST(USE_ARG_SUFFIX) AC_SUBST(USE_CFG_SUFFIX) AC_SUBST(USE_LIB_SUFFIX) if test "$with_ticlib" != no ; then if test "x$with_ticlib" != xyes ; then TICS_NAME=$with_ticlib TICS_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`" TICS_ARG_SUFFIX="${with_ticlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" TICS_DEP_SUFFIX="${with_ticlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" TICS_LIB_SUFFIX="${with_ticlib}" else TICS_SUFFIX=${DFT_LIB_SUFFIX} TICS_ARG_SUFFIX="${TICS_NAME}${USE_ARG_SUFFIX}" TICS_DEP_SUFFIX="${TICS_NAME}${DFT_DEP_SUFFIX}" TICS_LIB_SUFFIX="${TICS_NAME}${USE_LIB_SUFFIX}" fi TICS_LDFLAGS="-L${LIB_DIR}" TICS_LIBS="-l${TICS_ARG_SUFFIX}" else TICS_SUFFIX=${DFT_LIB_SUFFIX} TICS_LDFLAGS="-L${LIB_DIR}" TICS_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}" fi AC_SUBST(TICS_ARG_SUFFIX) AC_SUBST(TICS_DEP_SUFFIX) AC_SUBST(TICS_LIB_SUFFIX) AC_SUBST(TICS_LDFLAGS) AC_SUBST(TICS_LIBS) if test "$with_termlib" != no ; then if test "x$with_termlib" != xyes ; then TINFO_NAME=$with_termlib TINFO_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`" TINFO_ARG_SUFFIX="${with_termlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" TINFO_DEP_SUFFIX="${with_termlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" TINFO_LIB_SUFFIX="${with_termlib}" else TINFO_SUFFIX=${DFT_LIB_SUFFIX} TINFO_ARG_SUFFIX="${TINFO_NAME}${USE_ARG_SUFFIX}" TINFO_DEP_SUFFIX="${TINFO_NAME}${DFT_DEP_SUFFIX}" TINFO_LIB_SUFFIX="${TINFO_NAME}${USE_LIB_SUFFIX}" fi TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}" TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}" if test "$DFT_LWR_MODEL" = "libtool"; then TEST_ARGS="${TEST_DEPS}" TEST_ARG2="${TEST_DEP2}" TINFO_LDFLAGS="-L${LIB_DIR}" TINFO_LIBS="$TEST_ARGS" TICS_LIST="$SHLIB_LIST $TEST_ARGS" SHLIB_LIST="${SHLIB_LIST} $TEST_ARGS" else TEST_ARGS="-l${TINFO_ARG_SUFFIX}" TEST_ARG2="-l${TINFO_ARG_SUFFIX}" if test "x$with_term_driver" != xno ; then TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}" TICS_LIBS="$TICS_LIBS -l${LIB_NAME}${USE_ARG_SUFFIX}" TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARGS" else TICS_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}" TINFO_LIBS="$TEST_ARGS" fi TINFO_LDFLAGS="-L${LIB_DIR}" SHLIB_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}" fi else # the next lines are needed for linking libtic over libncurses TINFO_NAME=${LIB_NAME} TINFO_SUFFIX=${DFT_LIB_SUFFIX} TINFO_ARG_SUFFIX=${LIB_NAME}${USE_ARG_SUFFIX} if test "x$with_tic_depends" = xyes ; then TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}" else TICS_LIST="$SHLIB_LIST" fi TINFO_LDFLAGS="-L${LIB_DIR}" TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}" fi if test "$DFT_LWR_MODEL" = shared ; then case "$cf_cv_system_name" in (cygwin*|msys*) # "lib" files have ".dll.a" suffix, "cyg"or "msys-" files have ".dll" TINFO_SUFFIX=.dll ;; esac fi AC_SUBST(TINFO_ARG_SUFFIX) AC_SUBST(TINFO_DEP_SUFFIX) AC_SUBST(TINFO_LIB_SUFFIX) AC_SUBST(TINFO_LDFLAGS) AC_SUBST(TINFO_LIBS) if test "x$with_dlsym" = xyes ; then CF_REMOVE_LIB(TICS_LIST,$TICS_LIST,dl) fi if test "$DFT_LWR_MODEL" = "libtool"; then OBJEXT=lo fi # needed for Ada95 TINFO_LDFLAGS2=`echo "$TINFO_LDFLAGS" | sed -e 's,-L\.\./,-L../../,'` AC_SUBST(TINFO_LDFLAGS2) case "$DFT_LWR_MODEL" in (normal|debug|profile) CF_LDFLAGS_STATIC ;; esac AC_MSG_CHECKING(where we will install curses.h) AC_SUBST(includesubdir) includesubdir= if test "$with_overwrite" = no && \ { test "x$includedir" = 'x${prefix}/include' || \ test "x$includedir" = "x${prefix}/include"; } then includesubdir="/ncurses${USE_LIB_SUFFIX}" fi AC_MSG_RESULT(${includedir}${includesubdir}) ### Resolve a conflict between normal and wide-curses by forcing applications ### that will need libutf8 to add it to their configure script. if test "$with_overwrite" != no ; then if test "$NCURSES_LIBUTF8" = 1 ; then NCURSES_LIBUTF8='defined(HAVE_LIBUTF8_H)' AC_MSG_WARN(Wide-character applications must define HAVE_LIBUTF8_H to include curses.h) fi fi WITH_OVERWRITE=$with_overwrite ### At least on MinGW a shared library build without libtool ### requires adding the additional libs to the link list. case "$cf_cv_system_name" in (*mingw32*|*mingw64*) if test "$DFT_LWR_MODEL" != "libtool"; then SHLIB_LIST="$SHLIB_LIST ${LIBS}" fi ;; *) ;; esac AC_SUBST(WITH_OVERWRITE) AC_SUBST(TICS_LIST) AC_SUBST(TINFO_LIST) AC_SUBST(SHLIB_LIST) ### 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) # 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" 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 ncurses-6.4-20240113/config.guess0000755000000000000000000014267614471065400014776 0ustar rootroot#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2023 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2023-08-22' # 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-2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi # Just in case it came from the environment. GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still # use 'HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" # shellcheck disable=SC2039,SC3028 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver break fi done if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac } # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case $UNAME_SYSTEM in Linux|GNU|GNU/*) LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" #if defined(__ANDROID__) LIBC=android #else #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu #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 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 ;; 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 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: ncurses-6.4-20240113/mk-1st.awk0000644000000000000000000005060314421001047014252 0ustar rootroot# $Id: mk-1st.awk,v 1.125 2023/04/22 15:49:59 tom Exp $ ############################################################################## # 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: Thomas E. Dickey # # Generate list of objects for a given model library # Variables: # name (library name, e.g., "ncurses", "panel", "forms", "menus") # traces ("all" or "DEBUG", to control whether tracing is compiled in) # MODEL (e.g., "DEBUG", uppercase; toupper is not portable) # CXX_MODEL (e.g., "DEBUG", uppercase) # LIB_SUFFIX (e.g., "", "w", "t", "tw") # USE_LIB_SUFFIX (e.g., "", "w", "t", "tw") # model (directory into which we compile, e.g., "obj") # prefix (e.g., "lib", for Unix-style libraries) # suffix (e.g., "_g.a", for debug libraries) # subset ("none", "base", "base+ext_funcs" or "termlib", etc.) # driver ("yes" or "no", depends on --enable-term-driver) # ShlibVer ("rel", "abi" or "auto", to augment DoLinks variable) # ShlibVerInfix ("yes" or "no", determines location of version #) # SymLink ("ln -s", etc) # TermlibRoot ("tinfo" or other root for libterm.so) # TermlibSuffix (".so" or other suffix for libterm.so) # ReLink ("yes", or "no", flag to rebuild shared libs on install) # ReRanlib ("yes", or "no", flag to rerun ranlib for installing static) # DoLinks ("yes", "reverse" or "no", flag to add symbolic links) # rmSoLocs ("yes" or "no", flag to add extra clean target) # ldconfig (path for this tool, if used) # make_phony ("yes" if the make-program accepts ".PHONY" directive. # overwrite ("yes" or "no", flag to add link to libcurses.a # depend (optional dependencies for all objects, e.g, ncurses_cfg.h) # host (cross-compile host, if any) # libtool_version (libtool "-version-info" or "-version-number") # # Notes: # CLIXs nawk does not like underscores in command-line variable names. # Mixed-case variable names are ok. # HP-UX requires shared libraries to have executable permissions. # function is_ticlib() { return ( subset ~ /^ticlib$/ ); } function is_termlib() { return ( subset ~ /^(ticlib\+)?termlib((\+[^+ ]+)*\+[a-z_]+_tinfo)?$/ ); } # see lib_name function lib_name_of(a_name) { return sprintf("%s%s%s", prefix, a_name, suffix) } # see imp_name function imp_name_of(a_name) { if (ShlibVerInfix == "cygdll" || ShlibVerInfix == "msysdll" || ShlibVerInfix == "mingw") { result = sprintf("%s%s%s.a", prefix, a_name, suffix); } else if (ShlibVerInfix == "msvcdll") { result = sprintf("%s%s%s.lib", prefix, a_name, suffix); } else{ result = ""; } return result; } # see abi_name function abi_name_of(a_name) { if (ShlibVerInfix == "cygdll") { result = sprintf("%s%s$(ABI_VERSION)%s", "cyg", a_name, suffix); } else if (ShlibVerInfix == "msysdll") { result = sprintf("%s%s$(ABI_VERSION)%s", "msys-", a_name, suffix); } else if (ShlibVerInfix == "mingw" || ShlibVerInfix == "msvcdll") { result = sprintf("%s%s$(ABI_VERSION)%s", prefix, a_name, suffix); } else if (ShlibVerInfix == "yes") { result = sprintf("%s%s.$(ABI_VERSION)%s", prefix, a_name, suffix); } else { result = sprintf("%s.$(ABI_VERSION)", lib_name_of(a_name)); } return result; } # see rel_name function rel_name_of(a_name) { if (ShlibVerInfix == "cygdll") { result = sprintf("%s%s$(REL_VERSION)%s", "cyg", a_name, suffix); } else if (ShlibVerInfix == "msysdll") { result = sprintf("%s%s$(ABI_VERSION)%s", "msys-", a_name, suffix); } else if (ShlibVerInfix == "mingw" || ShlibVerInfix == "msvcdll") { result = sprintf("%s%s$(REL_VERSION)%s", prefix, a_name, suffix); } else if (ShlibVerInfix == "yes") { result = sprintf("%s%s.$(REL_VERSION)%s", prefix, a_name, suffix); } else { result = sprintf("%s.$(REL_VERSION)", lib_name_of(a_name)); } return result; } # see end_name function end_name_of(a_name) { if ( MODEL != "SHARED" ) { result = lib_name_of(a_name); } else if ( DoLinks == "reverse") { result = lib_name_of(a_name); } else { if ( ShlibVer == "rel" ) { result = rel_name_of(a_name); } else if ( ShlibVer == "abi" || ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || ShlibVer == "msvcdll" ) { result = abi_name_of(a_name); } else { result = lib_name_of(a_name); } } return result } function symlink(src,dst) { if ( src != dst ) { if ( SymLink !~ /.*-f.*/ ) { printf "rm -f %s; ", dst } printf "$(LN_S) %s %s; ", src, dst } } function rmlink(directory, dst) { if ( dst != "" ) { printf "\t-rm -f %s/%s\n", directory, dst } } function removelinks(directory) { nlinks = 0; links[nlinks++] = end_name; if ( DoLinks == "reverse" ) { if ( ShlibVer == "rel" ) { links[nlinks++] = abi_name; links[nlinks++] = rel_name; } else if ( ShlibVer == "abi" ) { links[nlinks++] = abi_name; } } else { if ( ShlibVer == "rel" ) { links[nlinks++] = abi_name; links[nlinks++] = lib_name; } else if ( ShlibVer == "abi" ) { links[nlinks++] = lib_name; } } for (j = 0; j < nlinks; ++j) { found = 0; for (k = 0; k < j; ++k ) { if ( links[j] == links[k] ) { found = 1; break; } } if ( !found ) { rmlink(directory, links[j]); } } } function make_shlib(objs, shlib_list) { printf "\t$(MK_SHARED_LIB) $(%s_OBJS) $(%s)\n", objs, shlib_list } function sharedlinks(directory) { if ( ShlibVer != "auto" && ShlibVer != "cygdll" && ShlibVer != "msysdll" && ShlibVer != "mingw" && ShlibVer != "msvcdll" ) { printf "\tcd %s && (", directory if ( DoLinks == "reverse" ) { if ( ShlibVer == "rel" ) { symlink(lib_name, abi_name); symlink(abi_name, rel_name); } else if ( ShlibVer == "abi" ) { symlink(lib_name, abi_name); } } else { if ( ShlibVer == "rel" ) { symlink(rel_name, abi_name); symlink(abi_name, lib_name); } else if ( ShlibVer == "abi" ) { symlink(abi_name, lib_name); } } printf ")\n" } } # termlib may be named explicitly via "--with-termlib=XXX", which overrides # any suffix. Temporarily override "suffix" to account for this. function termlib_end_of() { termlib_save_suffix = suffix; suffix = TermlibSuffix; termlib_temp_result = end_name_of(TermlibRoot); suffix = termlib_save_suffix; return termlib_temp_result; } function shlib_build(directory) { dst_libs = sprintf("%s/%s", directory, end_name); printf "%s : \\\n", dst_libs if (subset == "ticlib" && driver == "yes" ) { base = name; sub(/^tic/, "ncurses", base); # workaround for "w" printf "\t\t%s/%s \\\n", directory, end_name_of(base); } if (subset ~ /^base/ || subset == "ticlib" ) { save_suffix = suffix sub(/^[^.]\./,".",suffix) if (directory != "../lib") { printf "\t\t%s/%s \\\n", "../lib", termlib_end_of(); } printf "\t\t%s/%s \\\n", directory, termlib_end_of(); suffix = save_suffix } printf "\t\t$(RESULTING_SYMS) $(%s_OBJS)\n", OBJS printf "\t@echo linking $@\n" printf "\t@mkdir -p %s\n", directory if ( ReLink != "yes" ) { printf "\t@sleep 1\n" } if ( is_ticlib() ) { make_shlib(OBJS, "TICS_LIST") } else if ( is_termlib() ) { make_shlib(OBJS, "TINFO_LIST") } else { make_shlib(OBJS, "SHLIB_LIST") } sharedlinks(directory) } function shlib_install(directory) { src_lib1 = sprintf("../lib/%s", end_name); dst_lib1 = sprintf("%s/%s", directory, end_name); printf "%s : \\\n", dst_lib1 printf "\t\t%s \\\n", directory printf "\t\t%s\n", src_lib1 printf "\t@echo installing $@\n" printf "\t$(INSTALL_LIB) %s %s\n", src_lib1, dst_lib1; sharedlinks(directory) } function install_dll(directory,filename) { src_name = sprintf("../lib/%s", filename); dst_name = sprintf("$(DESTDIR)%s/%s", directory, filename); printf "\t@echo installing %s as %s\n", src_name, dst_name if ( directory == "$(bindir)" ) { program = "$(INSTALL) -m 755"; } else { program = "$(INSTALL_LIB)"; } printf "\t%s %s %s\n", program, src_name, dst_name } function in_subset(value) { value = " " value " "; check = subset; gsub("[+]", " ", check); check = " " check " "; return index(check,value); } function trim_suffix(value) { if (USE_LIB_SUFFIX != "" && length(value) > length(USE_LIB_SUFFIX)) { check = substr(value, 1 + length(value) - length(USE_LIB_SUFFIX)); if (check == USE_LIB_SUFFIX) { value = substr(value, 1, length(value) - length(USE_LIB_SUFFIX)); } } return value; } BEGIN { TOOL_PREFIX = ""; found = 0; using = 0; } /^@/ { using = 0 if (subset == "none") { using = 1 print "" print "# generated by mk-1st.awk" } else if (in_subset($2) > 0) { if (using == 0) { if (found == 0) { if ( name ~ /^.*\+\+.*/ ) { if ( CXX_MODEL == "NORMAL" && MODEL == "SHARED" ) { print "" printf "# overriding model from %s to match CXX_MODEL\n", MODEL; MODEL = "NORMAL"; suffix = ".a"; DoLinks = "no"; } } print "" printf "# generated by mk-1st.awk (subset=%s)\n", subset printf "# name: %s\n", name printf "# traces: %s\n", traces printf "# MODEL: %s\n", MODEL printf "# CXX_MODEL: %s\n", CXX_MODEL printf "# LIB_SUFFIX: %s\n", LIB_SUFFIX printf "# USE_LIB_SUFFIX: %s\n", USE_LIB_SUFFIX printf "# model: %s\n", model printf "# prefix: %s\n", prefix printf "# suffix: %s\n", suffix printf "# subset: %s\n", subset printf "# driver: %s\n", driver printf "# ShlibVer: %s\n", ShlibVer printf "# ShlibVerInfix: %s\n", ShlibVerInfix printf "# SymLink: %s\n", SymLink printf "# TermlibRoot: %s\n", TermlibRoot printf "# TermlibSuffix: %s\n", TermlibSuffix printf "# ReLink: %s\n", ReLink printf "# ReRanlib: %s\n", ReRanlib printf "# DoLinks: %s\n", DoLinks printf "# rmSoLocs: %s\n", rmSoLocs printf "# ldconfig: %s\n", ldconfig printf "# make_phony: %s\n", make_phony printf "# overwrite: %s\n", overwrite printf "# depend: %s\n", depend printf "# host: %s\n", host printf "# libtool_version: %s\n", libtool_version print "" } using = 1 } if ( is_ticlib() ) { OBJS = MODEL "_P" } else if ( is_termlib() ) { OBJS = MODEL "_T" } else { OBJS = MODEL } } } /^[@#]/ { next } $1 ~ /trace/ { if (traces != "all" && traces != MODEL && $1 != "lib_trace") next } { if (using \ && ( $1 != "link_test" ) \ && ( $2 == "lib" \ || $2 == "progs" \ || $2 == "c++" )) { if ( found == 0 ) { printf "%s_OBJS =", OBJS if ( $2 == "lib" ) { found = 1; } else if ( $2 == "c++" ) { TOOL_PREFIX = "CXX_"; found = 1; } else { found = 2; } if ( $2 == "c++" ) { CC_NAME="CXX" CC_FLAG="CXXFLAGS" } else { CC_NAME="CC" CC_FLAG="CFLAGS" } } printf " \\\n\t../%s/%s$o", model, $1; } } END { print "" if ( found != 0 ) { printf "\n$(%s_OBJS) : %s\n", OBJS, depend } if ( found == 1 ) { print "" lib_name = lib_name_of(name); if ( MODEL == "SHARED" ) { abi_name = abi_name_of(name); rel_name = rel_name_of(name); imp_name = imp_name_of(name); end_name = end_name_of(name); shlib_build("../lib") print "" print "install \\" print "install.libs \\" if ( ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || ShlibVer == "msvcdll") { dst_dirs = "$(DESTDIR)$(bindir) $(DESTDIR)$(libdir)"; printf "install.%s :: %s $(LIBRARIES)\n", name, dst_dirs install_dll("$(bindir)",end_name); install_dll("$(libdir)",imp_name); } else { lib_dir = "$(DESTDIR)$(libdir)"; printf "install.%s :: %s/%s\n", name, lib_dir, end_name print "" if ( ReLink == "yes" ) { shlib_build(lib_dir) } else { shlib_install(lib_dir) } } if ( overwrite == "yes" && name == "ncurses" ) { if ( ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || SlibVer == "msvcdll") { if (ShlibVer == "msvcdll") { curses_prefix = "" } else { curses_prefix = "lib" } ovr_name = sprintf("%scurses%s.a", curses_prefix, suffix) printf "\t@echo linking %s to %s\n", imp_name, ovr_name printf "\tcd $(DESTDIR)$(libdir) && (" symlink(imp_name, ovr_name) printf ")\n" } else { ovr_name = sprintf("libcurses%s", suffix) printf "\t@echo linking %s to %s\n", end_name, ovr_name printf "\tcd $(DESTDIR)$(libdir) && (" symlink(end_name, ovr_name) printf ")\n" } } if ( ldconfig != "" && ldconfig != ":" ) { printf "\t- test -z \"$(DESTDIR)\" && %s\n", ldconfig } print "" print "uninstall \\" print "uninstall.libs \\" printf "uninstall.%s ::\n", name if ( ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || ShlibVer == "msvcdll") { printf "\t@echo uninstalling $(DESTDIR)$(bindir)/%s\n", end_name printf "\t-@rm -f $(DESTDIR)$(bindir)/%s\n", end_name printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", imp_name printf "\t-@rm -f $(DESTDIR)$(libdir)/%s\n", imp_name } else { printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", end_name removelinks("$(DESTDIR)$(libdir)") if ( overwrite == "yes" && name == "ncurses" ) { ovr_name = sprintf("libcurses%s", suffix) printf "\t-@rm -f $(DESTDIR)$(libdir)/%s\n", ovr_name } } if ( rmSoLocs == "yes" ) { print "" print "mostlyclean \\" print "clean ::" printf "\t-@rm -f so_locations\n" } } else if ( MODEL == "LIBTOOL" ) { end_name = lib_name; use_name = trim_suffix(TermlibRoot) USE_LIB_SUFFIX printf "../lib/%s : \\\n", lib_name if ( (name != use_name ) && ( index(name, "++") == 0 ) && ( index(name, "tic") == 1 || index(name, "ncurses") == 1 ) ) { printf "\t\t../lib/lib%s.la \\\n", use_name; if ( index(name, "tic") == 1 && index(TermlibRoot, "ncurses") != 1 ) { printf "\t\t../lib/lib%s%s.la \\\n", "ncurses", USE_LIB_SUFFIX; } } printf "\t\t$(%s_OBJS)\n", OBJS if ( is_ticlib() ) { which_list = "TICS_LIST"; } else if ( is_termlib() ) { which_list = "TINFO_LIST"; } else { which_list = "SHLIB_LIST"; } printf "\tcd ../lib && $(LIBTOOL_LINK) $(%s) $(%s) \\\n", CC_NAME, CC_FLAG; printf "\t\t-o %s $(%s_OBJS:$o=.lo) \\\n", lib_name, OBJS; printf "\t\t-rpath $(libdir) \\\n"; printf "\t\t%s $(NCURSES_MAJOR):$(NCURSES_MINOR) $(LT_UNDEF) $(%s) $(LDFLAGS)\n", libtool_version, which_list; if ( make_phony == "yes" ) { print "" printf ".PHONY :\tinstall.%s\n", trim_suffix(name); } print "" print "install \\" print "install.libs \\" printf "install.%s :: \\\n", trim_suffix(name); printf "\t\t$(DESTDIR)$(libdir) \\\n"; use_name = TermlibRoot USE_LIB_SUFFIX if ( (name != use_name ) && ( index(name, "++") == 0 ) && ( index(name, "tic") == 1 || index(name, "ncurses") == 1 ) ) { if ( trim_suffix(TermlibRoot) != trim_suffix(name) ) { printf "\t\tinstall.%s \\\n", trim_suffix(TermlibRoot); } if ( index(name, "tic") == 1 && index(TermlibRoot, "ncurses") != 1 && trim_suffix(name) != "ncurses" ) { printf "\t\tinstall.%s \\\n", "ncurses"; } } printf "\t\t../lib/%s\n", lib_name printf "\t@echo installing ../lib/%s as $(DESTDIR)$(libdir)/%s\n", lib_name, lib_name printf "\tcd ../lib; $(LIBTOOL_INSTALL) $(INSTALL) %s $(DESTDIR)$(libdir)\n", lib_name print "" print "uninstall \\" print "uninstall.libs \\" printf "uninstall.%s ::\n", trim_suffix(name) printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", lib_name printf "\t-@$(LIBTOOL_UNINSTALL) rm -f $(DESTDIR)$(libdir)/%s\n", lib_name } else { end_name = lib_name; printf "../lib/%s : $(%s_OBJS)\n", lib_name, OBJS # workaround: binutils' ranlib tries to be clever with # timestamps, by pretending its update took no time, confusing # the make utility. if ( ReLink != "yes" ) { printf "\t@sleep 1\n" } printf "\t$(%sAR) $(%sARFLAGS) $@ $?\n", TOOL_PREFIX, TOOL_PREFIX; printf "\t$(RANLIB) $@\n" if ( host == "vxworks" ) { printf "\t$(LD) $(LD_OPTS) $? -o $(@:.a=$o)\n" } print "" print "install \\" print "install.libs \\" printf "install.%s :: $(DESTDIR)$(libdir) ../lib/%s\n", name, lib_name printf "\t@echo installing ../lib/%s as $(DESTDIR)$(libdir)/%s\n", lib_name, lib_name printf "\t$(INSTALL_DATA) ../lib/%s $(DESTDIR)$(libdir)/%s\n", lib_name, lib_name if ( overwrite == "yes" && lib_name == "libncurses.a" ) { printf "\t@echo linking libcurses.a to libncurses.a\n" printf "\t-@rm -f $(DESTDIR)$(libdir)/libcurses.a\n" printf "\t(cd $(DESTDIR)$(libdir) && " symlink("libncurses.a", "libcurses.a") printf ")\n" } if ( ReRanlib == "yes" ) { printf "\t$(RANLIB) $(DESTDIR)$(libdir)/%s\n", lib_name } if ( host == "vxworks" ) { printf "\t@echo installing ../lib/lib%s$o as $(DESTDIR)$(libdir)/lib%s$o\n", name, name printf "\t$(INSTALL_DATA) ../lib/lib%s$o $(DESTDIR)$(libdir)/lib%s$o\n", name, name } print "" print "uninstall \\" print "uninstall.libs \\" printf "uninstall.%s ::\n", name printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", lib_name printf "\t-@rm -f $(DESTDIR)$(libdir)/%s\n", lib_name if ( overwrite == "yes" && lib_name == "libncurses.a" ) { printf "\t@echo linking libcurses.a to libncurses.a\n" printf "\t-@rm -f $(DESTDIR)$(libdir)/libcurses.a\n" } if ( host == "vxworks" ) { printf "\t@echo uninstalling $(DESTDIR)$(libdir)/lib%s$o\n", name printf "\t-@rm -f $(DESTDIR)$(libdir)/lib%s$o\n", name } } print "" print "clean ::" removelinks("../lib"); print "" print "mostlyclean::" printf "\t-rm -f $(%s_OBJS)\n", OBJS if ( MODEL == "LIBTOOL" ) { printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS } } else if ( found == 2 ) { print "" print "mostlyclean::" printf "\t-rm -f $(%s_OBJS)\n", OBJS if ( MODEL == "LIBTOOL" ) { printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS } print "" print "clean ::" printf "\t-rm -f $(%s_OBJS)\n", OBJS if ( MODEL == "LIBTOOL" ) { printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS } } } # vile:ts=4 sw=4 ncurses-6.4-20240113/doc/0000755000000000000000000000000014550614020013177 5ustar rootrootncurses-6.4-20240113/doc/html/0000755000000000000000000000000014550614020014143 5ustar rootrootncurses-6.4-20240113/doc/html/Ada95.html0000644000000000000000000003166714210705471015715 0ustar rootroot 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.

ncurses-6.4-20240113/doc/html/index.html0000644000000000000000000000635014340447551016156 0ustar rootroot 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.

ncurses-6.4-20240113/doc/html/NCURSES-Programming-HOWTO.html0000644000000000000000000103304614514776755021370 0ustar rootroot NCURSES Programming HOWTO

NCURSES Programming HOWTO

Pradeep Padala

v1.9, 2005-06-20

Revision History
Revision 2.0 2022-12-03 Revised by: dickey
Fixes for the sample programs, Correct documentation errata.
Revision 1.9 2005-06-20 Revised 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.8 2005-06-17 Revised 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.1 2002-06-25 Revised by: ppadala
Added a README file for building and instructions for building from source.
Revision 1.7 2002-06-25 Revised by: ppadala
Added "Other formats" section and made a lot of fancy changes to the programs. Inlining of programs is gone.
Revision 1.6.1 2002-02-24 Revised by: ppadala
Removed the old Changelog section, cleaned the makefiles
Revision 1.6 2002-02-16 Revised by: ppadala
Corrected a lot of spelling mistakes, added ACS variables section
Revision 1.5 2002-01-05 Revised by: ppadala
Changed structure to present proper TOC
Revision 1.3.1 2001-07-26 Revised by: ppadala
Corrected maintainers paragraph, Corrected stable release number
Revision 1.3 2001-07-24 Revised by: ppadala
Added copyright notices to main document (LDP license) and programs (GPL), Corrected printw_example.
Revision 1.2 2001-06-05 Revised by: ppadala
Incorporated ravi's changes. Mainly to introduction, menu, form, justforfun sections
Revision 1.1 2001-05-22 Revised 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. Readily available formats from tldp.org
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 seeuqnces are usually called escape sequences, because they start with an escape(0x1B) character. Even today, with proper emulation, we can send escape sequences to the emulator and achieve the same effect on a terminal window.

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 ftp://ftp.gnu.org/pub/gnu/ncurses/ncurses.tar.gz or any of the ftp sites mentioned in https://www.gnu.org/order/ftp.html.

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

Using the RPM

NCURSES RPM can be found and downloaded from https://rpmfind.net . The RPM can be installed with the following command after becoming root.

    rpm -i <downloaded rpm>

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 zipped form here. Unzip 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.

If you prefer browsing individual programs, point your browser to https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs/

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 various other formats on the tldp.org site. Here are the links to other formats of this document.


1.6.2. Building from source

If above links are broken or if you want to experiment with sgml read on.


    Get both the source and the tar,gzipped programs, available at
        http://cvsview.tldp.org/index.cgi/LDP/howto/docbook/
        NCURSES-HOWTO/NCURSES-Programming-HOWTO.sgml
        http://cvsview.tldp.org/index.cgi/LDP/howto/docbook/
        NCURSES-HOWTO/ncurses_programs.tar.gz

    Unzip ncurses_programs.tar.gz with
    tar zxvf ncurses_programs.tar.gz

    Use jade to create various formats. For example if you just want to create
    the multiple html files, you would use
        jade -t sgml -i html -d <path to docbook html stylesheet>
        NCURSES-Programming-HOWTO.sgml
    to get pdf, first create a single html file of the HOWTO with 
        jade -t sgml -i html -d <path to docbook html stylesheet> -V nochunks
        NCURSES-Programming-HOWTO.sgml > NCURSES-ONE-BIG-FILE.html
    then use htmldoc to get pdf file with
        htmldoc --size universal -t pdf --firstpage p1 -f <output file name.pdf>
        NCURSES-ONE-BIG-FILE.html
    for ps, you would use
        htmldoc --size universal -t ps --firstpage p1 -f <output file name.ps>
        NCURSES-ONE-BIG-FILE.html

See LDP Author guide for more details. If all else fails, mail me at ppadala@gmail.com


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 are 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()
{       
        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()
{       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. printw() class: Print formatted output similar to printf()

  3. addstr() class: Print strings

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

 return 0;
}

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. scanw() class: Get formatted input

  3. getstr() class: Get strings


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

 return 0;
}

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

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(int argc, char *argv[])
{       WINDOW *my_win;
        int startx, starty, width, height;
        int ch;

        initscr();                      /* Start curses mode            */
        cbreak();                       /* Line buffering disabled, Pass on
                                         * everty thing to me           */
        keypad(stdscr, TRUE);           /* I need that nifty F1         */

        height = 3;
        width = 10;
        starty = (LINES - height) / 2;  /* Calculating for a center placement */
        startx = (COLS - width) / 2;    /* of the window                */
        printw("Press F1 to exit");
        refresh();
        my_win = create_newwin(height, width, starty, startx);

        while((ch = getch()) != KEY_F(1))
        {       switch(ch)
                {       case KEY_LEFT:
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, starty,--startx);
                                break;
                        case KEY_RIGHT:
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, starty,++startx);
                                break;
                        case KEY_UP:
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, --starty,startx);
                                break;
                        case KEY_DOWN:
                                destroy_win(my_win);
                                my_win = create_newwin(height, width, ++starty,startx);
                                break;  
                }
        }
                
        endwin();                       /* End curses mode                */
        return 0;
}

WINDOW *create_newwin(int height, int width, int starty, int startx)
{       WINDOW *local_win;

        local_win = newwin(height, width, starty, startx);
        box(local_win, 0 , 0);          /* 0, 0 gives default characters 
                                         * for the vertical and horizontal
                                         * lines                        */
        wrefresh(local_win);            /* Show that box                */

        return local_win;
}

void destroy_win(WINDOW *local_win)
{       
        /* box(local_win, ' ', ' '); : This won't produce the desired
         * result of erasing the window. It will leave its four corners 
         * and so an ugly remnant of window. 
         */
        wborder(local_win, ' ', ' ', ' ',' ',' ',' ',' ',' ');
        /* The parameters taken are 
         * 1. win: the window on which to operate
         * 2. ls: character to be used for the left side of the window 
         * 3. rs: character to be used for the right side of the window 
         * 4. ts: character to be used for the top side of the window 
         * 5. bs: character to be used for the bottom side of the window 
         * 6. tl: character to be used for the top left corner of the window 
         * 7. tr: character to be used for the top right corner of the window 
         * 8. bl: character to be used for the bottom left corner of the window 
         * 9. br: character to be used for the bottom right corner of the window
         */
        wrefresh(local_win);
        delwin(local_win);
}

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(int argc, char *argv[])
{       WIN win;
        int ch;

        initscr();                      /* Start curses mode            */
        start_color();                  /* Start the color functionality */
        cbreak();                       /* Line buffering disabled, Pass on
                                         * everty thing to me           */
        keypad(stdscr, TRUE);           /* I need that nifty F1         */
        noecho();
        init_pair(1, COLOR_CYAN, COLOR_BLACK);

        /* Initialize the window parameters */
        init_win_params(&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();
#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, char *string);
int main(int argc, char *argv[])
{       initscr();                      /* Start curses mode            */
        if(has_colors() == FALSE)
        {       endwin();
                printf("Your terminal does not support color\n");
                exit(1);
        }
        start_color();                  /* Start color                  */
        init_pair(1, COLOR_RED, COLOR_BLACK);

        attron(COLOR_PAIR(1));
        print_in_middle(stdscr, LINES / 2, 0, 0, "Viola !!! In color ...");
        attroff(COLOR_PAIR(1));
        getch();
        endwin();
}
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string)
{       int length, x, y;
        float temp;

        if(win == NULL)
                win = stdscr;
        getyx(win, y, x);
        if(startx != 0)
                x = startx;
        if(starty != 0)
                y = starty;
        if(width == 0)
                width = 80;

        length = strlen(string);
        temp = (width - length)/ 2;
        x = startx + (int)temp;
        mvwprintw(win, y, x, "%s", string);
        refresh();
}

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;

char *choices[] = { 
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Exit",
                  };
int n_choices = sizeof(choices) / sizeof(char *);
void print_menu(WINDOW *menu_win, int highlight);

int main()
{       WINDOW *menu_win;
        int highlight = 1;
        int choice = 0;
        int c;

        initscr();
        clear();
        noecho();
        cbreak();       /* Line buffering disabled. pass on everything */
        startx = (80 - WIDTH) / 2;
        starty = (24 - HEIGHT) / 2;
                
        menu_win = newwin(HEIGHT, WIDTH, starty, startx);
        keypad(menu_win, TRUE);
        mvprintw(0, 0, "Use arrow keys to go up and down, Press enter to select a choice");
        refresh();
        print_menu(menu_win, highlight);
        while(1)
        {       c = wgetch(menu_win);
                switch(c)
                {       case KEY_UP:
                                if(highlight == 1)
                                        highlight = n_choices;
                                else
                                        --highlight;
                                break;
                        case KEY_DOWN:
                                if(highlight == n_choices)
                                        highlight = 1;
                                else 
                                        ++highlight;
                                break;
                        case 10:
                                choice = highlight;
                                break;
                        default:
                                mvprintw(24, 0, "Character pressed is = %3d Hopefully it can be printed as '%c'", c, c);
                                refresh();
                                break;
                }
                print_menu(menu_win, highlight);
                if(choice != 0) /* User did a choice come out of the infinite loop */
                        break;
        }       
        mvprintw(23, 0, "You chose choice %d with choice string %s\n", choice, choices[choice - 1]);
        clrtoeol();
        refresh();
        endwin();
        return 0;
}

void print_menu(WINDOW *menu_win, int highlight)
{
        int x, y, i;    

        x = 2;
        y = 2;
        box(menu_win, 0, 0);
        for(i = 0; i < n_choices; ++i)
        {       if(highlight == i + 1) /* High light the present choice */
                {       wattron(menu_win, A_REVERSE); 
                        mvwprintw(menu_win, y, x, "%s", choices[i]);
                        wattroff(menu_win, A_REVERSE);
                }
                else
                        mvwprintw(menu_win, y, x, "%s", choices[i]);
                ++y;
        }
        wrefresh(menu_win);
}

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;

char *choices[] = {     "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Exit",
                  };

int n_choices = sizeof(choices) / sizeof(char *);

void print_menu(WINDOW *menu_win, int highlight);
void report_choice(int mouse_x, int mouse_y, int *p_choice);

int main()
{       int c, choice = 0;
        WINDOW *menu_win;
        MEVENT event;

        /* Initialize curses */
        initscr();
        clear();
        noecho();
        cbreak();       //Line buffering disabled. pass on everything

        /* Try to put the window in the middle of screen */
        startx = (80 - WIDTH) / 2;
        starty = (24 - HEIGHT) / 2;

        attron(A_REVERSE);
        mvprintw(23, 1, "Click on Exit to quit (Works best in a virtual console)");
        refresh();
        attroff(A_REVERSE);

        /* Print the menu for the first time */
        menu_win = newwin(HEIGHT, WIDTH, starty, startx);
        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 + 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()
{       
        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()
{
        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. Create panels with the chosen visibility order. Stack them up according to the desired visibility. The function new_panel() is used to created panels.

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

  4. 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.

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

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()
{       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();
}

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, char *label, int label_color);
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);

int main()
{       WINDOW *my_wins[3];
        PANEL  *my_panels[3];
        PANEL  *top;
        int ch;

        /* Initialize curses */
        initscr();
        start_color();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);

        /* Initialize all the colors */
        init_pair(1, COLOR_RED, COLOR_BLACK);
        init_pair(2, COLOR_GREEN, COLOR_BLACK);
        init_pair(3, COLOR_BLUE, COLOR_BLACK);
        init_pair(4, COLOR_CYAN, COLOR_BLACK);

        init_wins(my_wins, 3);
        
        /* Attach a panel to each window */     /* Order is bottom up */
        my_panels[0] = new_panel(my_wins[0]);   /* Push 0, order: stdscr-0 */
        my_panels[1] = new_panel(my_wins[1]);   /* Push 1, order: stdscr-0-1 */
        my_panels[2] = new_panel(my_wins[2]);   /* Push 2, order: stdscr-0-1-2 */

        /* Set up the user pointers to the next panel */
        set_panel_userptr(my_panels[0], my_panels[1]);
        set_panel_userptr(my_panels[1], my_panels[2]);
        set_panel_userptr(my_panels[2], my_panels[0]);

        /* Update the stacking order. 2nd panel will be on top */
        update_panels();

        /* Show it on the screen */
        attron(COLOR_PAIR(4));
        mvprintw(LINES - 2, 0, "Use tab to browse through the windows (F1 to Exit)");
        attroff(COLOR_PAIR(4));
        doupdate();

        top = my_panels[2];
        while((ch = getch()) != KEY_F(1))
        {       switch(ch)
                {       case 9:
                                top = (PANEL *)panel_userptr(top);
                                top_panel(top);
                                break;
                }
                update_panels();
                doupdate();
        }
        endwin();
        return 0;
}

/* Put all the windows */
void init_wins(WINDOW **wins, int n)
{       int x, y, i;
        char label[80];

        y = 2;
        x = 10;
        for(i = 0; i < n; ++i)
        {       wins[i] = newwin(NLINES, NCOLS, y, x);
                sprintf(label, "Window Number %d", i + 1);
                win_show(wins[i], label, i + 1);
                y += 3;
                x += 7;
        }
}

/* Show the window with a border and a label */
void win_show(WINDOW *win, char *label, int label_color)
{       int startx, starty, height, width;

        getbegyx(win, starty, startx);
        getmaxyx(win, height, width);

        box(win, 0, 0);
        mvwaddch(win, 2, 0, ACS_LTEE); 
        mvwhline(win, 2, 1, ACS_HLINE, width - 2); 
        mvwaddch(win, 2, width - 1, ACS_RTEE); 
        
        print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));
}

void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)
{       int length, x, y;
        float temp;

        if(win == NULL)
                win = stdscr;
        getyx(win, y, x);
        if(startx != 0)
                x = startx;
        if(starty != 0)
                y = starty;
        if(width == 0)
                width = 80;

        length = strlen(string);
        temp = (width - length)/ 2;
        x = startx + (int)temp;
        wattron(win, color);
        mvwprintw(win, y, x, "%s", string);
        wattroff(win, color);
        refresh();
}

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, char *label, int label_color);
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);
void set_user_ptrs(PANEL **panels, int n);

int main()
{       WINDOW *my_wins[3];
        PANEL  *my_panels[3];
        PANEL_DATA  *top;
        PANEL *stack_top;
        WINDOW *temp_win, *old_win;
        int ch;
        int newx, newy, neww, newh;
        int size = FALSE, move = FALSE;

        /* Initialize curses */
        initscr();
        start_color();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);

        /* Initialize all the colors */
        init_pair(1, COLOR_RED, COLOR_BLACK);
        init_pair(2, COLOR_GREEN, COLOR_BLACK);
        init_pair(3, COLOR_BLUE, COLOR_BLACK);
        init_pair(4, COLOR_CYAN, COLOR_BLACK);

        init_wins(my_wins, 3);
        
        /* Attach a panel to each window */     /* Order is bottom up */
        my_panels[0] = new_panel(my_wins[0]);   /* Push 0, order: stdscr-0 */
        my_panels[1] = new_panel(my_wins[1]);   /* Push 1, order: stdscr-0-1 */
        my_panels[2] = new_panel(my_wins[2]);   /* Push 2, order: stdscr-0-1-2 */

        set_user_ptrs(my_panels, 3);
        /* Update the stacking order. 2nd panel will be on top */
        update_panels();

        /* Show it on the screen */
        attron(COLOR_PAIR(4));
        mvprintw(LINES - 3, 0, "Use 'm' for moving, 'r' for resizing");
        mvprintw(LINES - 2, 0, "Use tab to browse through the windows (F1 to Exit)");
        attroff(COLOR_PAIR(4));
        doupdate();

        stack_top = my_panels[2];
        top = (PANEL_DATA *)panel_userptr(stack_top);
        newx = top->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(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, char *label, int label_color)
{       int startx, starty, height, width;

        getbegyx(win, starty, startx);
        getmaxyx(win, height, width);

        box(win, 0, 0);
        mvwaddch(win, 2, 0, ACS_LTEE); 
        mvwhline(win, 2, 1, ACS_HLINE, width - 2); 
        mvwaddch(win, 2, width - 1, ACS_RTEE); 
        
        print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));
}

void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)
{       int length, x, y;
        float temp;

        if(win == NULL)
                win = stdscr;
        getyx(win, y, x);
        if(startx != 0)
                x = startx;
        if(starty != 0)
                y = starty;
        if(width == 0)
                width = 80;

        length = strlen(string);
        temp = (width - length)/ 2;
        x = startx + (int)temp;
        wattron(win, color);
        mvwprintw(win, y, x, "%s", string);
        wattroff(win, color);
        refresh();
}

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, char *label, int label_color);
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);

int main()
{       WINDOW *my_wins[3];
        PANEL  *my_panels[3];
        PANEL_DATA panel_datas[3];
        PANEL_DATA *temp;
        int ch;

        /* Initialize curses */
        initscr();
        start_color();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);

        /* Initialize all the colors */
        init_pair(1, COLOR_RED, COLOR_BLACK);
        init_pair(2, COLOR_GREEN, COLOR_BLACK);
        init_pair(3, COLOR_BLUE, COLOR_BLACK);
        init_pair(4, COLOR_CYAN, COLOR_BLACK);

        init_wins(my_wins, 3);
        
        /* Attach a panel to each window */     /* Order is bottom up */
        my_panels[0] = new_panel(my_wins[0]);   /* Push 0, order: stdscr-0 */
        my_panels[1] = new_panel(my_wins[1]);   /* Push 1, order: stdscr-0-1 */
        my_panels[2] = new_panel(my_wins[2]);   /* Push 2, order: stdscr-0-1-2 */

        /* Initialize panel data saying that nothing is hidden */
        panel_datas[0].hide = FALSE;
        panel_datas[1].hide = FALSE;
        panel_datas[2].hide = FALSE;

        set_panel_userptr(my_panels[0], &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, char *label, int label_color)
{       int startx, starty, height, width;

        getbegyx(win, starty, startx);
        getmaxyx(win, height, width);

        box(win, 0, 0);
        mvwaddch(win, 2, 0, ACS_LTEE); 
        mvwhline(win, 2, 1, ACS_HLINE, width - 2); 
        mvwaddch(win, 2, width - 1, ACS_RTEE); 
        
        print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));
}

void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)
{       int length, x, y;
        float temp;

        if(win == NULL)
                win = stdscr;
        getyx(win, y, x);
        if(startx != 0)
                x = startx;
        if(starty != 0)
                y = starty;
        if(width == 0)
                width = 80;

        length = strlen(string);
        temp = (width - length)/ 2;
        x = startx + (int)temp;
        wattron(win, color);
        mvwprintw(win, y, x, "%s", string);
        wattroff(win, color);
        refresh();
}

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. Create items using new_item(). You can specify a name and description for the items.

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

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

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

  6. Unpost the menu with menu_unpost()

  7. Free the memory allocated to menu by free_menu()

  8. Free the memory allocated to the items with free_item()

  9. End curses

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

char *choices[] = {
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Exit",
                  };

int main()
{       ITEM **my_items;
        int c;                          
        MENU *my_menu;
        int n_choices, i;
        ITEM *cur_item;
        
        
        initscr();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);
        
        n_choices = ARRAY_SIZE(choices);
        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));

        for(i = 0; i < 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

char *choices[] = {
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Exit",
                        (char *)NULL,
                  };
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);

int main()
{       ITEM **my_items;
        int c;                          
        MENU *my_menu;
        WINDOW *my_menu_win;
        int n_choices, i;
        
        /* Initialize curses */
        initscr();
        start_color();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);
        init_pair(1, COLOR_RED, COLOR_BLACK);

        /* Create items */
        n_choices = ARRAY_SIZE(choices);
        my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));
        for(i = 0; i < 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, char *string, chtype color)
{       int length, x, y;
        float temp;

        if(win == NULL)
                win = stdscr;
        getyx(win, y, x);
        if(startx != 0)
                x = startx;
        if(starty != 0)
                y = starty;
        if(width == 0)
                width = 80;

        length = strlen(string);
        temp = (width - length)/ 2;
        x = startx + (int)temp;
        wattron(win, color);
        mvwprintw(win, y, x, "%s", string);
        wattroff(win, color);
        refresh();
}

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

char *choices[] = {
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Choice 5",
                        "Choice 6",
                        "Choice 7",
                        "Choice 8",
                        "Choice 9",
                        "Choice 10",
                        "Exit",
                        (char *)NULL,
                  };
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);

int main()
{       ITEM **my_items;
        int c;                          
        MENU *my_menu;
        WINDOW *my_menu_win;
        int n_choices, i;
        
        /* Initialize curses */
        initscr();
        start_color();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);
        init_pair(1, COLOR_RED, COLOR_BLACK);
        init_pair(2, COLOR_CYAN, COLOR_BLACK);

        /* Create items */
        n_choices = ARRAY_SIZE(choices);
        my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));
        for(i = 0; i < 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, char *string, chtype color)
{       int length, x, y;
        float temp;

        if(win == NULL)
                win = stdscr;
        getyx(win, y, x);
        if(startx != 0)
                x = startx;
        if(starty != 0)
                y = starty;
        if(width == 0)
                width = 80;

        length = strlen(string);
        temp = (width - length)/ 2;
        x = startx + (int)temp;
        wattron(win, color);
        mvwprintw(win, y, x, "%s", string);
        wattroff(win, color);
        refresh();
}

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

char *choices[] = {
                        "Choice 1", "Choice 2", "Choice 3", "Choice 4", "Choice 5",
                        "Choice 6", "Choice 7", "Choice 8", "Choice 9", "Choice 10",
                        "Choice 11", "Choice 12", "Choice 13", "Choice 14", "Choice 15",
                        "Choice 16", "Choice 17", "Choice 18", "Choice 19", "Choice 20",
                        "Exit",
                        (char *)NULL,
                  };

int main()
{       ITEM **my_items;
        int c;                          
        MENU *my_menu;
        WINDOW *my_menu_win;
        int n_choices, i;
        
        /* Initialize curses */
        initscr();
        start_color();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);
        init_pair(1, COLOR_RED, COLOR_BLACK);
        init_pair(2, COLOR_CYAN, COLOR_BLACK);

        /* Create items */
        n_choices = ARRAY_SIZE(choices);
        my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));
        for(i = 0; i < 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

char *choices[] = {
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Choice 5",
                        "Choice 6",
                        "Choice 7",
                        "Exit",
                  };

int main()
{       ITEM **my_items;
        int c;                          
        MENU *my_menu;
        int n_choices, i;
        ITEM *cur_item;
        
        /* Initialize curses */ 
        initscr();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);

        /* Initialize items */
        n_choices = ARRAY_SIZE(choices);
        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));
        for(i = 0; i < 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();
                                mvprintw(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

char *choices[] = {
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Choice 5",
                        "Choice 6",
                        "Choice 7",
                        "Exit",
                  };

int main()
{       ITEM **my_items;
        int c;                          
        MENU *my_menu;
        int n_choices, i;
        ITEM *cur_item;
        
        /* Initialize curses */ 
        initscr();
        start_color();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);
        init_pair(1, COLOR_RED, COLOR_BLACK);
        init_pair(2, COLOR_GREEN, COLOR_BLACK);
        init_pair(3, COLOR_MAGENTA, COLOR_BLACK);

        /* Initialize items */
        n_choices = ARRAY_SIZE(choices);
        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));
        for(i = 0; i < 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

char *choices[] = {
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Choice 5",
                        "Choice 6",
                        "Choice 7",
                        "Exit",
                  };
void func(char *name);

int main()
{       ITEM **my_items;
        int c;                          
        MENU *my_menu;
        int n_choices, i;
        ITEM *cur_item;
        
        /* Initialize curses */ 
        initscr();
        start_color();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);
        init_pair(1, COLOR_RED, COLOR_BLACK);
        init_pair(2, COLOR_GREEN, COLOR_BLACK);
        init_pair(3, COLOR_MAGENTA, COLOR_BLACK);

        /* Initialize items */
        n_choices = ARRAY_SIZE(choices);
        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));
        for(i = 0; i < n_choices; ++i)
        {       my_items[i] = new_item(choices[i], choices[i]);
                /* Set the user pointer */
                set_item_userptr(my_items[i], func);
        }
        my_items[n_choices] = (ITEM *)NULL;

        /* Create menu */
        my_menu = new_menu((ITEM **)my_items);

        /* Post the menu */
        mvprintw(LINES - 3, 0, "Press <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;
                                void (*p)(char *);

                                cur = current_item(my_menu);
                                p = item_userptr(cur);
                                p((char *)item_name(cur));
                                pos_menu_cursor(my_menu);
                                break;
                        }
                        break;
                }
        }       
        unpost_menu(my_menu);
        for(i = 0; i < n_choices; ++i)
                free_item(my_items[i]);
        free_menu(my_menu);
        endwin();
}

void func(char *name)
{       move(20, 0);
        clrtoeol();
        mvprintw(20, 0, "Item selected is : %s", name);
}       

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. Create fields using new_field(). You can specify the height and width of the field, and its position on the form.

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

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

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

  6. Unpost the menu with form_unpost()

  7. Free the memory allocated to menu by free_form()

  8. Free the memory allocated to the items with free_field()

  9. End curses

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()
{       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()
{       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()
{       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. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

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, char *string, chtype color);

int main()
{
        FIELD *field[3];
        FORM  *my_form;
        WINDOW *my_form_win;
        int ch, rows, cols;
        
        /* Initialize curses */
        initscr();
        start_color();
        cbreak();
        noecho();
        keypad(stdscr, TRUE);

        /* Initialize few color pairs */
        init_pair(1, COLOR_RED, COLOR_BLACK);

        /* Initialize the fields */
        field[0] = new_field(1, 10, 6, 1, 0, 0);
        field[1] = new_field(1, 10, 8, 1, 0, 0);
        field[2] = NULL;

        /* Set field options */
        set_field_back(field[0], A_UNDERLINE);
        field_opts_off(field[0], O_AUTOSKIP); /* Don't go to next field when this */
                                              /* Field is filled up             */
        set_field_back(field[1], A_UNDERLINE); 
        field_opts_off(field[1], O_AUTOSKIP);
        
        /* Create the form and post it */
        my_form = new_form(field);
        
        /* Calculate the area required for the form */
        scale_form(my_form, &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, char *string, chtype color)
{       int length, x, y;
        float temp;

        if(win == NULL)
                win = stdscr;
        getyx(win, y, x);
        if(startx != 0)
                x = startx;
        if(starty != 0)
                y = starty;
        if(width == 0)
                width = 80;

        length = strlen(string);
        temp = (width - length)/ 2;
        x = startx + (int)temp;
        wattron(win, color);
        mvwprintw(win, y, x, "%s", string);
        wattroff(win, color);
        refresh();
}

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

ncurses-6.4-20240113/doc/html/ada/0000755000000000000000000000000014515003003014662 5ustar rootrootncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm0000644000000000000000000002174514170631653027663 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm0000644000000000000000000001625514170631652031564 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-trace__ads.htm0000644000000000000000000004052014170631653024633 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-panels__ads.htm0000644000000000000000000004027114170631653025022 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/funcs.htm0000644000000000000000000000172114170606213016524 0ustar rootroot

Functions/Procedures

[A] [B] [C] [D] [E] [F] [G] [H] [I] [K] [L] [M] [N] [O] [P] [Q] [R] [S] [T] [U] [V] [W] ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__adb.htm0000644000000000000000000003577414170631652031371 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-float_io__adb.htm0000644000000000000000000002654014170631653026767 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-menus__ads.htm0000644000000000000000000025023314170631653024670 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-putwin__ads.htm0000644000000000000000000001426214170631653025067 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-decimal_io__adb.htm0000644000000000000000000002667514170631653027271 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm0000644000000000000000000001663414170631652030470 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm0000644000000000000000000001656514170631652030777 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__adb.htm0000644000000000000000000002357014170631652030614 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/table.html0000644000000000000000000016112714161716375016673 0ustar rootroot 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
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__adb.htm0000644000000000000000000002314414170631652030745 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm0000644000000000000000000002174514170631653027665 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types__ads.htm0000644000000000000000000007267114170631652027203 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_user_data__adb.htm0000644000000000000000000002505014170631652027752 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__adb.htm0000644000000000000000000002113014170631652031610 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-menus-item_user_data__adb.htm0000644000000000000000000002354114170631653027632 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses__ads.htm0000644000000000000000000102675414170631653023555 0ustar rootroot terminal_interface-curses.ads

File : terminal_interface-curses.ads


------------------------------------------------------------------------------
--                                                                          --
--                           GNAT ncurses Binding                           --
--                                                                          --
--                         Terminal_Interface.Curses                        --
--                                                                          --
--                                 S P E C                                  --
--                                                                          --
------------------------------------------------------------------------------
-- Copyright 2020 Thomas E. Dickey                                          --
-- Copyright 1998-2011,2014 Free Software Foundation, Inc.                  --
--                                                                          --
-- Permission is hereby granted, free of charge, to any person obtaining a  --
-- copy of this software and associated documentation files (the            --
-- "Software"), to deal in the Software without restriction, including      --
-- without limitation the rights to use, copy, modify, merge, publish,      --
-- distribute, distribute with modifications, sublicense, and/or sell       --
-- copies of the Software, and to permit persons to whom the Software is    --
-- furnished to do so, subject to the following conditions:                 --
--                                                                          --
-- The above copyright notice and this permission notice shall be included  --
-- in all copies or substantial portions of the Software.                   --
--                                                                          --
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
--                                                                          --
-- Except as contained in this notice, the name(s) of the above copyright   --
-- holders shall not be used in advertising or otherwise to promote the     --
-- sale, use or other dealings in this Software without prior written       --
-- authorization.                                                           --
------------------------------------------------------------------------------
--  Author:  Juergen Pfeifer, 1996
--  Version Control:
--  @Revision: 1.48 @
--  @Date: 2020/02/02 23:34:34 @
--  Binding Version 01.00
------------------------------------------------------------------------------
with System.Storage_Elements;
with Interfaces.C;   --  We need this for some assertions.

with Terminal_Interface.Curses_Constants;

package Terminal_Interface.Curses is
   pragma Preelaborate (Terminal_Interface.Curses);
   pragma Linker_Options ("-lncurses" & Curses_Constants.DFT_ARG_SUFFIX);

   Major_Version : constant := Curses_Constants.NCURSES_VERSION_MAJOR;
   Minor_Version : constant := Curses_Constants.NCURSES_VERSION_MINOR;
   NC_Version : String renames Curses_Constants.Version;

   type Window is private;
   Null_Window : constant Window;

   type Line_Position   is new Integer; --  line coordinate
   type Column_Position is new Integer; --  column coordinate

   subtype Line_Count   is Line_Position   range 1 .. Line_Position'Last;
   --  Type to count lines. We do not allow null windows, so must be positive
   subtype Column_Count is Column_Position range 1 .. Column_Position'Last;
   --  Type to count columns. We do not allow null windows, so must be positive

   type Key_Code is new Integer;
   --  That is anything including real characters, special keys and logical
   --  request codes.

   --  FIXME: The "-1" should be Curses_Err
   subtype Real_Key_Code is Key_Code range -1 .. Curses_Constants.KEY_MAX;
   --  This are the codes that potentially represent a real keystroke.
   --  Not all codes may be possible on a specific terminal. To check the
   --  availability of a special key, the Has_Key function is provided.

   subtype Special_Key_Code is Real_Key_Code
     range Curses_Constants. KEY_MIN - 1 .. Real_Key_Code'Last;
   --  Type for a function- or special key number

   subtype Normal_Key_Code is Real_Key_Code range
     Character'Pos (Character'First) .. Character'Pos (Character'Last);
   --  This are the codes for regular (incl. non-graphical) characters.

   --  For those who like to use the original key names we produce them were
   --  they differ from the original.

   --  Constants for function- and special keys
   Key_None                    : constant Special_Key_Code
     := Curses_Constants.KEY_MIN - 1;
   Key_Min                     : constant Special_Key_Code
     := Curses_Constants.KEY_MIN;
   Key_Break                   : constant Special_Key_Code
     := Curses_Constants.KEY_BREAK;
   KEY_DOWN                    : constant Special_Key_Code
     := Curses_Constants.KEY_DOWN;
   Key_Cursor_Down             : Special_Key_Code renames KEY_DOWN;
   KEY_UP                      : constant Special_Key_Code
     := Curses_Constants.KEY_UP;
   Key_Cursor_Up               : Special_Key_Code renames KEY_UP;
   KEY_LEFT                    : constant Special_Key_Code
     := Curses_Constants.KEY_LEFT;
   Key_Cursor_Left             : Special_Key_Code renames KEY_LEFT;
   KEY_RIGHT                   : constant Special_Key_Code
     := Curses_Constants.KEY_RIGHT;
   Key_Cursor_Right            : Special_Key_Code renames KEY_RIGHT;
   Key_Home                    : constant Special_Key_Code
     := Curses_Constants.KEY_HOME;
   Key_Backspace               : constant Special_Key_Code
     := Curses_Constants.KEY_BACKSPACE;
   Key_F0                      : constant Special_Key_Code
     := Curses_Constants.KEY_F0;
   Key_F1                      : constant Special_Key_Code
     := Curses_Constants.KEY_F1;
   Key_F2                      : constant Special_Key_Code
     := Curses_Constants.KEY_F2;
   Key_F3                      : constant Special_Key_Code
     := Curses_Constants.KEY_F3;
   Key_F4                      : constant Special_Key_Code
     := Curses_Constants.KEY_F4;
   Key_F5                      : constant Special_Key_Code
     := Curses_Constants.KEY_F5;
   Key_F6                      : constant Special_Key_Code
     := Curses_Constants.KEY_F6;
   Key_F7                      : constant Special_Key_Code
     := Curses_Constants.KEY_F7;
   Key_F8                      : constant Special_Key_Code
     := Curses_Constants.KEY_F8;
   Key_F9                      : constant Special_Key_Code
     := Curses_Constants.KEY_F9;
   Key_F10                     : constant Special_Key_Code
     := Curses_Constants.KEY_F10;
   Key_F11                     : constant Special_Key_Code
     := Curses_Constants.KEY_F11;
   Key_F12                     : constant Special_Key_Code
     := Curses_Constants.KEY_F12;
   Key_F13                     : constant Special_Key_Code
     := Curses_Constants.KEY_F13;
   Key_F14                     : constant Special_Key_Code
     := Curses_Constants.KEY_F14;
   Key_F15                     : constant Special_Key_Code
     := Curses_Constants.KEY_F15;
   Key_F16                     : constant Special_Key_Code
     := Curses_Constants.KEY_F16;
   Key_F17                     : constant Special_Key_Code
     := Curses_Constants.KEY_F17;
   Key_F18                     : constant Special_Key_Code
     := Curses_Constants.KEY_F18;
   Key_F19                     : constant Special_Key_Code
     := Curses_Constants.KEY_F19;
   Key_F20                     : constant Special_Key_Code
     := Curses_Constants.KEY_F20;
   Key_F21                     : constant Special_Key_Code
     := Curses_Constants.KEY_F21;
   Key_F22                     : constant Special_Key_Code
     := Curses_Constants.KEY_F22;
   Key_F23                     : constant Special_Key_Code
     := Curses_Constants.KEY_F23;
   Key_F24                     : constant Special_Key_Code
     := Curses_Constants.KEY_F24;
   KEY_DL                      : constant Special_Key_Code
     := Curses_Constants.KEY_DL;
   Key_Delete_Line             : Special_Key_Code renames KEY_DL;
   KEY_IL                      : constant Special_Key_Code
     := Curses_Constants.KEY_IL;
   Key_Insert_Line             : Special_Key_Code renames KEY_IL;
   KEY_DC                      : constant Special_Key_Code
     := Curses_Constants.KEY_DC;
   Key_Delete_Char             : Special_Key_Code renames KEY_DC;
   KEY_IC                      : constant Special_Key_Code
     := Curses_Constants.KEY_IC;
   Key_Insert_Char             : Special_Key_Code renames KEY_IC;
   KEY_EIC                     : constant Special_Key_Code
     := Curses_Constants.KEY_EIC;
   Key_Exit_Insert_Mode        : Special_Key_Code renames KEY_EIC;
   KEY_CLEAR                   : constant Special_Key_Code
     := Curses_Constants.KEY_CLEAR;
   Key_Clear_Screen            : Special_Key_Code renames KEY_CLEAR;
   KEY_EOS                     : constant Special_Key_Code
     := Curses_Constants.KEY_EOS;
   Key_Clear_End_Of_Screen     : Special_Key_Code renames KEY_EOS;
   KEY_EOL                     : constant Special_Key_Code
     := Curses_Constants.KEY_EOL;
   Key_Clear_End_Of_Line       : Special_Key_Code renames KEY_EOL;
   KEY_SF                      : constant Special_Key_Code
     := Curses_Constants.KEY_SF;
   Key_Scroll_1_Forward        : Special_Key_Code renames KEY_SF;
   KEY_SR                      : constant Special_Key_Code
     := Curses_Constants.KEY_SR;
   Key_Scroll_1_Backward       : Special_Key_Code renames KEY_SR;
   KEY_NPAGE                   : constant Special_Key_Code
     := Curses_Constants.KEY_NPAGE;
   Key_Next_Page               : Special_Key_Code renames KEY_NPAGE;
   KEY_PPAGE                   : constant Special_Key_Code
     := Curses_Constants.KEY_PPAGE;
   Key_Previous_Page           : Special_Key_Code renames KEY_PPAGE;
   KEY_STAB                    : constant Special_Key_Code
     := Curses_Constants.KEY_STAB;
   Key_Set_Tab                 : Special_Key_Code renames KEY_STAB;
   KEY_CTAB                    : constant Special_Key_Code
     := Curses_Constants.KEY_CTAB;
   Key_Clear_Tab               : Special_Key_Code renames KEY_CTAB;
   KEY_CATAB                   : constant Special_Key_Code
     := Curses_Constants.KEY_CATAB;
   Key_Clear_All_Tabs          : Special_Key_Code renames KEY_CATAB;
   KEY_ENTER                   : constant Special_Key_Code
     := Curses_Constants.KEY_ENTER;
   Key_Enter_Or_Send           : Special_Key_Code renames KEY_ENTER;
   KEY_SRESET                  : constant Special_Key_Code
     := Curses_Constants.KEY_SRESET;
   Key_Soft_Reset              : Special_Key_Code renames KEY_SRESET;
   Key_Reset                   : constant Special_Key_Code
     := Curses_Constants.KEY_RESET;
   Key_Print                   : constant Special_Key_Code
     := Curses_Constants.KEY_PRINT;
   KEY_LL                      : constant Special_Key_Code
     := Curses_Constants.KEY_LL;
   Key_Bottom                  : Special_Key_Code renames KEY_LL;
   KEY_A1                      : constant Special_Key_Code
     := Curses_Constants.KEY_A1;
   Key_Upper_Left_Of_Keypad    : Special_Key_Code renames KEY_A1;
   KEY_A3                      : constant Special_Key_Code
     := Curses_Constants.KEY_A3;
   Key_Upper_Right_Of_Keypad   : Special_Key_Code renames KEY_A3;
   KEY_B2                      : constant Special_Key_Code
     := Curses_Constants.KEY_B2;
   Key_Center_Of_Keypad        : Special_Key_Code renames KEY_B2;
   KEY_C1                      : constant Special_Key_Code
     := Curses_Constants.KEY_C1;
   Key_Lower_Left_Of_Keypad    : Special_Key_Code renames KEY_C1;
   KEY_C3                      : constant Special_Key_Code
     := Curses_Constants.KEY_C3;
   Key_Lower_Right_Of_Keypad   : Special_Key_Code renames KEY_C3;
   KEY_BTAB                    : constant Special_Key_Code
     := Curses_Constants.KEY_BTAB;
   Key_Back_Tab                : Special_Key_Code renames KEY_BTAB;
   KEY_BEG                     : constant Special_Key_Code
     := Curses_Constants.KEY_BEG;
   Key_Beginning               : Special_Key_Code renames KEY_BEG;
   Key_Cancel                  : constant Special_Key_Code
     := Curses_Constants.KEY_CANCEL;
   Key_Close                   : constant Special_Key_Code
     := Curses_Constants.KEY_CLOSE;
   Key_Command                 : constant Special_Key_Code
     := Curses_Constants.KEY_COMMAND;
   Key_Copy                    : constant Special_Key_Code
     := Curses_Constants.KEY_COPY;
   Key_Create                  : constant Special_Key_Code
     := Curses_Constants.KEY_CREATE;
   Key_End                     : constant Special_Key_Code
     := Curses_Constants.KEY_END;
   Key_Exit                    : constant Special_Key_Code
     := Curses_Constants.KEY_EXIT;
   Key_Find                    : constant Special_Key_Code
     := Curses_Constants.KEY_FIND;
   Key_Help                    : constant Special_Key_Code
     := Curses_Constants.KEY_HELP;
   Key_Mark                    : constant Special_Key_Code
     := Curses_Constants.KEY_MARK;
   Key_Message                 : constant Special_Key_Code
     := Curses_Constants.KEY_MESSAGE;
   Key_Move                    : constant Special_Key_Code
     := Curses_Constants.KEY_MOVE;
   Key_Next                    : constant Special_Key_Code
     := Curses_Constants.KEY_NEXT;
   Key_Open                    : constant Special_Key_Code
     := Curses_Constants.KEY_OPEN;
   Key_Options                 : constant Special_Key_Code
     := Curses_Constants.KEY_OPTIONS;
   Key_Previous                : constant Special_Key_Code
     := Curses_Constants.KEY_PREVIOUS;
   Key_Redo                    : constant Special_Key_Code
     := Curses_Constants.KEY_REDO;
   Key_Reference               : constant Special_Key_Code
     := Curses_Constants.KEY_REFERENCE;
   Key_Refresh                 : constant Special_Key_Code
     := Curses_Constants.KEY_REFRESH;
   Key_Replace                 : constant Special_Key_Code
     := Curses_Constants.KEY_REPLACE;
   Key_Restart                 : constant Special_Key_Code
     := Curses_Constants.KEY_RESTART;
   Key_Resume                  : constant Special_Key_Code
     := Curses_Constants.KEY_RESUME;
   Key_Save                    : constant Special_Key_Code
     := Curses_Constants.KEY_SAVE;
   KEY_SBEG                    : constant Special_Key_Code
     := Curses_Constants.KEY_SBEG;
   Key_Shift_Begin             : Special_Key_Code renames KEY_SBEG;
   KEY_SCANCEL                 : constant Special_Key_Code
     := Curses_Constants.KEY_SCANCEL;
   Key_Shift_Cancel            : Special_Key_Code renames KEY_SCANCEL;
   KEY_SCOMMAND                : constant Special_Key_Code
     := Curses_Constants.KEY_SCOMMAND;
   Key_Shift_Command           : Special_Key_Code renames KEY_SCOMMAND;
   KEY_SCOPY                   : constant Special_Key_Code
     := Curses_Constants.KEY_SCOPY;
   Key_Shift_Copy              : Special_Key_Code renames KEY_SCOPY;
   KEY_SCREATE                 : constant Special_Key_Code
     := Curses_Constants.KEY_SCREATE;
   Key_Shift_Create            : Special_Key_Code renames KEY_SCREATE;
   KEY_SDC                     : constant Special_Key_Code
     := Curses_Constants.KEY_SDC;
   Key_Shift_Delete_Char       : Special_Key_Code renames KEY_SDC;
   KEY_SDL                     : constant Special_Key_Code
     := Curses_Constants.KEY_SDL;
   Key_Shift_Delete_Line       : Special_Key_Code renames KEY_SDL;
   Key_Select                  : constant Special_Key_Code
     := Curses_Constants.KEY_SELECT;
   KEY_SEND                    : constant Special_Key_Code
     := Curses_Constants.KEY_SEND;
   Key_Shift_End               : Special_Key_Code renames KEY_SEND;
   KEY_SEOL                    : constant Special_Key_Code
     := Curses_Constants.KEY_SEOL;
   Key_Shift_Clear_End_Of_Line : Special_Key_Code renames KEY_SEOL;
   KEY_SEXIT                   : constant Special_Key_Code
     := Curses_Constants.KEY_SEXIT;
   Key_Shift_Exit              : Special_Key_Code renames KEY_SEXIT;
   KEY_SFIND                   : constant Special_Key_Code
     := Curses_Constants.KEY_SFIND;
   Key_Shift_Find              : Special_Key_Code renames KEY_SFIND;
   KEY_SHELP                   : constant Special_Key_Code
     := Curses_Constants.KEY_SHELP;
   Key_Shift_Help              : Special_Key_Code renames KEY_SHELP;
   KEY_SHOME                   : constant Special_Key_Code
     := Curses_Constants.KEY_SHOME;
   Key_Shift_Home              : Special_Key_Code renames KEY_SHOME;
   KEY_SIC                     : constant Special_Key_Code
     := Curses_Constants.KEY_SIC;
   Key_Shift_Insert_Char       : Special_Key_Code renames KEY_SIC;
   KEY_SLEFT                   : constant Special_Key_Code
     := Curses_Constants.KEY_SLEFT;
   Key_Shift_Cursor_Left       : Special_Key_Code renames KEY_SLEFT;
   KEY_SMESSAGE                : constant Special_Key_Code
     := Curses_Constants.KEY_SMESSAGE;
   Key_Shift_Message           : Special_Key_Code renames KEY_SMESSAGE;
   KEY_SMOVE                   : constant Special_Key_Code
     := Curses_Constants.KEY_SMOVE;
   Key_Shift_Move              : Special_Key_Code renames KEY_SMOVE;
   KEY_SNEXT                   : constant Special_Key_Code
     := Curses_Constants.KEY_SNEXT;
   Key_Shift_Next_Page         : Special_Key_Code renames KEY_SNEXT;
   KEY_SOPTIONS                : constant Special_Key_Code
     := Curses_Constants.KEY_SOPTIONS;
   Key_Shift_Options           : Special_Key_Code renames KEY_SOPTIONS;
   KEY_SPREVIOUS               : constant Special_Key_Code
     := Curses_Constants.KEY_SPREVIOUS;
   Key_Shift_Previous_Page     : Special_Key_Code renames KEY_SPREVIOUS;
   KEY_SPRINT                  : constant Special_Key_Code
     := Curses_Constants.KEY_SPRINT;
   Key_Shift_Print             : Special_Key_Code renames KEY_SPRINT;
   KEY_SREDO                   : constant Special_Key_Code
     := Curses_Constants.KEY_SREDO;
   Key_Shift_Redo              : Special_Key_Code renames KEY_SREDO;
   KEY_SREPLACE                : constant Special_Key_Code
     := Curses_Constants.KEY_SREPLACE;
   Key_Shift_Replace           : Special_Key_Code renames KEY_SREPLACE;
   KEY_SRIGHT                  : constant Special_Key_Code
     := Curses_Constants.KEY_SRIGHT;
   Key_Shift_Cursor_Right      : Special_Key_Code renames KEY_SRIGHT;
   KEY_SRSUME                  : constant Special_Key_Code
     := Curses_Constants.KEY_SRSUME;
   Key_Shift_Resume            : Special_Key_Code renames KEY_SRSUME;
   KEY_SSAVE                   : constant Special_Key_Code
     := Curses_Constants.KEY_SSAVE;
   Key_Shift_Save              : Special_Key_Code renames KEY_SSAVE;
   KEY_SSUSPEND                : constant Special_Key_Code
     := Curses_Constants.KEY_SSUSPEND;
   Key_Shift_Suspend           : Special_Key_Code renames KEY_SSUSPEND;
   KEY_SUNDO                   : constant Special_Key_Code
     := Curses_Constants.KEY_SUNDO;
   Key_Shift_Undo              : Special_Key_Code renames KEY_SUNDO;
   Key_Suspend                 : constant Special_Key_Code
     := Curses_Constants.KEY_SUSPEND;
   Key_Undo                    : constant Special_Key_Code
     := Curses_Constants.KEY_UNDO;
   Key_Mouse                   : constant Special_Key_Code
     := Curses_Constants.KEY_MOUSE;
   Key_Resize                  : constant Special_Key_Code
     := Curses_Constants.KEY_RESIZE;
   Key_Max                     : constant Special_Key_Code
     := Special_Key_Code'Last;

   subtype User_Key_Code is Key_Code
     range (Key_Max + 129) .. Key_Code'Last;
   --  This is reserved for user defined key codes. The range between Key_Max
   --  and the first user code is reserved for subsystems like menu and forms.

   --------------------------------------------------------------------------

   type Color_Number is range -1 .. Integer (Interfaces.C.short'Last);
   for Color_Number'Size use Interfaces.C.short'Size;
   --  (n)curses uses a short for the color index
   --  The model is, that a Color_Number is an index into an array of
   --  (potentially) definable colors. Some of those indices are
   --  predefined (see below), although they may not really exist.

   Black   : constant Color_Number := Curses_Constants.COLOR_BLACK;
   Red     : constant Color_Number := Curses_Constants.COLOR_RED;
   Green   : constant Color_Number := Curses_Constants.COLOR_GREEN;
   Yellow  : constant Color_Number := Curses_Constants.COLOR_YELLOW;
   Blue    : constant Color_Number := Curses_Constants.COLOR_BLUE;
   Magenta : constant Color_Number := Curses_Constants.COLOR_MAGENTA;
   Cyan    : constant Color_Number := Curses_Constants.COLOR_CYAN;
   White   : constant Color_Number := Curses_Constants.COLOR_WHITE;

   type RGB_Value is range 0 .. Integer (Interfaces.C.short'Last);
   for RGB_Value'Size use Interfaces.C.short'Size;
   --  Some system may allow to redefine a color by setting RGB values.

   type Color_Pair is range 0 .. 255;
   for Color_Pair'Size use 8;
   subtype Redefinable_Color_Pair is Color_Pair range 1 .. 255;
   --  (n)curses reserves 1 Byte for the color-pair number. Color Pair 0
   --  is fixed (Black & White). A color pair is simply a combination of
   --  two colors described by Color_Numbers, one for the foreground and
   --  the other for the background

   type Character_Attribute_Set is
      record
         Stand_Out               : Boolean;
         Under_Line              : Boolean;
         Reverse_Video           : Boolean;
         Blink                   : Boolean;
         Dim_Character           : Boolean;
         Bold_Character          : Boolean;
         Protected_Character     : Boolean;
         Invisible_Character     : Boolean;
         Alternate_Character_Set : Boolean;
         Horizontal              : Boolean;
         Left                    : Boolean;
         Low                     : Boolean;
         Right                   : Boolean;
         Top                     : Boolean;
         Vertical                : Boolean;
      end record;

   for Character_Attribute_Set use
      record
         Stand_Out at 0 range
           Curses_Constants.A_STANDOUT_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_STANDOUT_Last - Curses_Constants.Attr_First;
         Under_Line at 0 range
           Curses_Constants.A_UNDERLINE_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_UNDERLINE_Last - Curses_Constants.Attr_First;
         Reverse_Video at 0 range
           Curses_Constants.A_REVERSE_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_REVERSE_Last - Curses_Constants.Attr_First;
         Blink at 0 range
           Curses_Constants.A_BLINK_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_BLINK_Last - Curses_Constants.Attr_First;
         Dim_Character at 0 range
           Curses_Constants.A_DIM_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_DIM_Last - Curses_Constants.Attr_First;
         Bold_Character at 0 range
           Curses_Constants.A_BOLD_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_BOLD_Last - Curses_Constants.Attr_First;
         Protected_Character at 0 range
           Curses_Constants.A_PROTECT_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_PROTECT_Last - Curses_Constants.Attr_First;
         Invisible_Character at 0 range
           Curses_Constants.A_INVIS_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_INVIS_Last - Curses_Constants.Attr_First;
         Alternate_Character_Set at 0 range
           Curses_Constants.A_ALTCHARSET_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_ALTCHARSET_Last - Curses_Constants.Attr_First;
         Horizontal at 0 range
           Curses_Constants.A_HORIZONTAL_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_HORIZONTAL_Last - Curses_Constants.Attr_First;
         Left at 0 range
           Curses_Constants.A_LEFT_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_LEFT_Last - Curses_Constants.Attr_First;
         Low at 0 range
           Curses_Constants.A_LOW_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_LOW_Last - Curses_Constants.Attr_First;
         Right at 0 range
           Curses_Constants.A_RIGHT_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_RIGHT_Last - Curses_Constants.Attr_First;
         Top at 0 range
           Curses_Constants.A_TOP_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_TOP_Last - Curses_Constants.Attr_First;
         Vertical at 0 range
           Curses_Constants.A_VERTICAL_First - Curses_Constants.Attr_First
           .. Curses_Constants.A_VERTICAL_Last - Curses_Constants.Attr_First;
      end record;

   Normal_Video : constant Character_Attribute_Set := (others => False);

   type Attributed_Character is
      record
         Attr  : Character_Attribute_Set;
         Color : Color_Pair;
         Ch    : Character;
      end record;
   pragma Convention (C_Pass_By_Copy, Attributed_Character);
   --  This is the counterpart for the chtype in C.

   for Attributed_Character use
      record
         Ch    at 0 range Curses_Constants.A_CHARTEXT_First
           .. Curses_Constants.A_CHARTEXT_Last;
         Color at 0 range Curses_Constants.A_COLOR_First
           .. Curses_Constants.A_COLOR_Last;
         pragma Warnings (Off);
         Attr  at 0 range Curses_Constants.Attr_First
           .. Curses_Constants.Attr_Last;
         pragma Warnings (On);
      end record;
   for Attributed_Character'Size use Curses_Constants.chtype_Size;

   Default_Character : constant Attributed_Character
     := (Ch    => Character'First,
         Color => Color_Pair'First,
         Attr  => (others => False));  --  preelaboratable Normal_Video

   type Attributed_String is array (Positive range <>) of Attributed_Character;
   pragma Convention (C, Attributed_String);
   --  In this binding we allow strings of attributed characters.

   ------------------
   --  Exceptions  --
   ------------------
   Curses_Exception     : exception;
   Wrong_Curses_Version : exception;

   --  Those exceptions are raised by the ETI (Extended Terminal Interface)
   --  subpackets for Menu and Forms handling.
   --
   Eti_System_Error    : exception;
   Eti_Bad_Argument    : exception;
   Eti_Posted          : exception;
   Eti_Connected       : exception;
   Eti_Bad_State       : exception;
   Eti_No_Room         : exception;
   Eti_Not_Posted      : exception;
   Eti_Unknown_Command : exception;
   Eti_No_Match        : exception;
   Eti_Not_Selectable  : exception;
   Eti_Not_Connected   : exception;
   Eti_Request_Denied  : exception;
   Eti_Invalid_Field   : exception;
   Eti_Current         : exception;

   --------------------------------------------------------------------------
   --  External C variables
   --  Conceptually even in C this are kind of constants, but they are
   --  initialized and sometimes changed by the library routines at runtime
   --  depending on the type of terminal. I believe the best way to model
   --  this is to use functions.
   --------------------------------------------------------------------------

   function Lines            return Line_Count;
   pragma Inline (Lines);

   function Columns          return Column_Count;
   pragma Inline (Columns);

   function Tab_Size         return Natural;
   pragma Inline (Tab_Size);

   function Number_Of_Colors return Natural;
   pragma Inline (Number_Of_Colors);

   function Number_Of_Color_Pairs return Natural;
   pragma Inline (Number_Of_Color_Pairs);

   subtype ACS_Index is Character range
     Character'Val (0) .. Character'Val (127);
   function ACS_Map (Index : ACS_Index) return Attributed_Character;
   pragma Import (C, ACS_Map, "acs_map_as_function");

   --  Constants for several characters from the Alternate Character Set
   --  You must use these constants as indices into the ACS_Map function
   --  to get the corresponding attributed character at runtime
   ACS_Upper_Left_Corner  : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_ULCORNER);
   ACS_Lower_Left_Corner  : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_LLCORNER);
   ACS_Upper_Right_Corner : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_URCORNER);
   ACS_Lower_Right_Corner : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_LRCORNER);
   ACS_Left_Tee           : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_LTEE);
   ACS_Right_Tee          : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_RTEE);
   ACS_Bottom_Tee         : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_BTEE);
   ACS_Top_Tee            : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_TTEE);
   ACS_Horizontal_Line    : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_HLINE);
   ACS_Vertical_Line      : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_VLINE);
   ACS_Plus_Symbol        : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_PLUS);
   ACS_Scan_Line_1        : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_S1);
   ACS_Scan_Line_9        : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_S9);
   ACS_Diamond            : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_DIAMOND);
   ACS_Checker_Board      : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_CKBOARD);
   ACS_Degree             : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_DEGREE);
   ACS_Plus_Minus         : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_PLMINUS);
   ACS_Bullet             : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_BULLET);
   ACS_Left_Arrow         : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_LARROW);
   ACS_Right_Arrow        : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_RARROW);
   ACS_Down_Arrow         : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_DARROW);
   ACS_Up_Arrow           : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_UARROW);
   ACS_Board_Of_Squares   : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_BOARD);
   ACS_Lantern            : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_LANTERN);
   ACS_Solid_Block        : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_BLOCK);
   ACS_Scan_Line_3        : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_S3);
   ACS_Scan_Line_7        : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_S7);
   ACS_Less_Or_Equal      : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_LEQUAL);
   ACS_Greater_Or_Equal   : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_GEQUAL);
   ACS_PI                 : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_PI);
   ACS_Not_Equal          : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_NEQUAL);
   ACS_Sterling           : constant ACS_Index
      := Character'Val (Curses_Constants.ACS_STERLING);

   --  |=====================================================================
   --  | 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-integer_io__adb.htm0000644000000000000000000002401614170631653027313 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-putwin__adb.htm0000644000000000000000000002313314170631653025043 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-aux__ads.htm0000644000000000000000000001641414170631653026010 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/funcs/0000755000000000000000000000000014515003003016000 5ustar rootrootncurses-6.4-20240113/doc/html/ada/funcs/H.htm0000644000000000000000000000325414170631652016723 0ustar rootroot H

Functions - H

[index] ncurses-6.4-20240113/doc/html/ada/funcs/F.htm0000644000000000000000000001336014170631652016720 0ustar rootroot F

Functions - F

[index] ncurses-6.4-20240113/doc/html/ada/funcs/G.htm0000644000000000000000000002643114170631652016724 0ustar rootroot G

Functions - G

[index] ncurses-6.4-20240113/doc/html/ada/funcs/B.htm0000644000000000000000000000335414170631652016716 0ustar rootroot B

Functions - B

[index] ncurses-6.4-20240113/doc/html/ada/funcs/V.htm0000644000000000000000000000146114170631652016737 0ustar rootroot V

Functions - V

[index] ncurses-6.4-20240113/doc/html/ada/funcs/I.htm0000644000000000000000000001135114170631652016721 0ustar rootroot I

Functions - I

[index] ncurses-6.4-20240113/doc/html/ada/funcs/K.htm0000644000000000000000000000176314170631652016731 0ustar rootroot K

Functions - K

[index] ncurses-6.4-20240113/doc/html/ada/funcs/R.htm0000644000000000000000000000771714170631652016745 0ustar rootroot R

Functions - R

[index] ncurses-6.4-20240113/doc/html/ada/funcs/N.htm0000644000000000000000000000617614170631652016737 0ustar rootroot N

Functions - N

[index] ncurses-6.4-20240113/doc/html/ada/funcs/D.htm0000644000000000000000000001146014170631652016715 0ustar rootroot D

Functions - D

[index] ncurses-6.4-20240113/doc/html/ada/funcs/E.htm0000644000000000000000000000246414170631652016722 0ustar rootroot E

Functions - E

[index] ncurses-6.4-20240113/doc/html/ada/funcs/S.htm0000644000000000000000000005320514170631652016737 0ustar rootroot S

Functions - S

[index] ncurses-6.4-20240113/doc/html/ada/funcs/U.htm0000644000000000000000000000372514170631652016743 0ustar rootroot U

Functions - U

[index] ncurses-6.4-20240113/doc/html/ada/funcs/M.htm0000644000000000000000000001224014170631652016723 0ustar rootroot M

Functions - M

[index] ncurses-6.4-20240113/doc/html/ada/funcs/C.htm0000644000000000000000000001407314170631652016717 0ustar rootroot C

Functions - C

[index] ncurses-6.4-20240113/doc/html/ada/funcs/Q.htm0000644000000000000000000000060614170631652016732 0ustar rootroot Q

Functions - Q

[index] ncurses-6.4-20240113/doc/html/ada/funcs/T.htm0000644000000000000000000000734014515003003016721 0ustar rootroot T

Functions - T

[index] ncurses-6.4-20240113/doc/html/ada/funcs/P.htm0000644000000000000000000001553714170631652016742 0ustar rootroot P

Functions - P

[index] ncurses-6.4-20240113/doc/html/ada/funcs/A.htm0000644000000000000000000000463514170631652016720 0ustar rootroot A

Functions - A

[index] ncurses-6.4-20240113/doc/html/ada/funcs/W.htm0000644000000000000000000001072614170631652016744 0ustar rootroot W

Functions - W

[index] ncurses-6.4-20240113/doc/html/ada/funcs/L.htm0000644000000000000000000000365014170631652016727 0ustar rootroot L

Functions - L

[index] ncurses-6.4-20240113/doc/html/ada/funcs/O.htm0000644000000000000000000000162414170631652016731 0ustar rootroot O

Functions - O

[index] ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-termcap__adb.htm0000644000000000000000000004650214170631653025155 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__adb.htm0000644000000000000000000002010514170631652031530 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-aux__adb.htm0000644000000000000000000003217014170631652024312 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/main.htm0000644000000000000000000001257314170606213016341 0ustar rootroot

[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: ncurses-6.4-20240113/doc/html/ada/files/0000755000000000000000000000000014170606213015775 5ustar rootrootncurses-6.4-20240113/doc/html/ada/files/T.htm0000644000000000000000000002334314170606213016717 0ustar rootroot T

Files - T

[index] ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm0000644000000000000000000002260714170631653027655 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm0000644000000000000000000002174114170631653027000 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses__adb.htm0000644000000000000000000116357514170631653023537 0ustar rootroot terminal_interface-curses.adb

File : terminal_interface-curses.adb


------------------------------------------------------------------------------
--                                                                          --
--                           GNAT ncurses Binding                           --
--                                                                          --
--                        Terminal_Interface.Curses                         --
--                                                                          --
--                                 B O D Y                                  --
--                                                                          --
------------------------------------------------------------------------------
-- Copyright 2018,2020 Thomas E. Dickey                                     --
-- Copyright 2007-2011,2014 Free Software Foundation, Inc.                  --
--                                                                          --
-- Permission is hereby granted, free of charge, to any person obtaining a  --
-- copy of this software and associated documentation files (the            --
-- "Software"), to deal in the Software without restriction, including      --
-- without limitation the rights to use, copy, modify, merge, publish,      --
-- distribute, distribute with modifications, sublicense, and/or sell       --
-- copies of the Software, and to permit persons to whom the Software is    --
-- furnished to do so, subject to the following conditions:                 --
--                                                                          --
-- The above copyright notice and this permission notice shall be included  --
-- in all copies or substantial portions of the Software.                   --
--                                                                          --
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
--                                                                          --
-- Except as contained in this notice, the name(s) of the above copyright   --
-- holders shall not be used in advertising or otherwise to promote the     --
-- sale, use or other dealings in this Software without prior written       --
-- authorization.                                                           --
------------------------------------------------------------------------------
--  Author: Juergen Pfeifer, 1996
--  Version Control:
--  @Revision: 1.16 @
--  @Date: 2020/02/02 23:34:34 @
--  Binding Version 01.00
------------------------------------------------------------------------------
with System;

with Terminal_Interface.Curses.Aux;
with Interfaces.C;                  use Interfaces.C;
with Interfaces.C.Strings;          use Interfaces.C.Strings;
with Ada.Characters.Handling;       use Ada.Characters.Handling;
with Ada.Strings.Fixed;

package body Terminal_Interface.Curses is

   use Aux;

   package ASF renames Ada.Strings.Fixed;

   type chtype_array is array (size_t range <>)
      of aliased Attributed_Character;
   pragma Convention (C, chtype_array);

------------------------------------------------------------------------------
   function Key_Name (Key : Real_Key_Code) return String
   is
      function Keyname (K : C_Int) return chars_ptr;
      pragma Import (C, Keyname, "keyname");

      Ch : Character;
   begin
      if Key <= Character'Pos (Character'Last) then
         Ch := Character'Val (Key);
         if Is_Control (Ch) then
            return Un_Control (Attributed_Character'(Ch    => Ch,
                                                     Color => Color_Pair'First,
                                                     Attr  => Normal_Video));
         elsif Is_Graphic (Ch) then
            declare
               S : String (1 .. 1);
            begin
               S (1) := Ch;
               return S;
            end;
         else
            return "";
         end if;
      else
         return Fill_String (Keyname (C_Int (Key)));
      end if;
   end Key_Name;

   procedure Key_Name (Key  :  Real_Key_Code;
                       Name : out String)
   is
   begin
      ASF.Move (Key_Name (Key), Name);
   end Key_Name;

------------------------------------------------------------------------------
   procedure Init_Screen
   is
      function Initscr return Window;
      pragma Import (C, Initscr, "initscr");

      W : Window;
   begin
      W := Initscr;
      if W = Null_Window then
         raise Curses_Exception;
      end if;
   end Init_Screen;

   procedure End_Windows
   is
      function Endwin return C_Int;
      pragma Import (C, Endwin, "endwin");
   begin
      if Endwin = Curses_Err then
         raise Curses_Exception;
      end if;
   end End_Windows;

   function Is_End_Window return Boolean
   is
      function Isendwin return Curses_Bool;
      pragma Import (C, Isendwin, "isendwin");
   begin
      if Isendwin = Curses_Bool_False then
         return False;
      else
         return True;
      end if;
   end Is_End_Window;
------------------------------------------------------------------------------
   procedure Move_Cursor (Win    : Window := Standard_Window;
                          Line   : Line_Position;
                          Column : Column_Position)
   is
      function Wmove (Win    : Window;
                      Line   : C_Int;
                      Column : C_Int
                     ) return C_Int;
      pragma Import (C, Wmove, "wmove");
   begin
      if Wmove (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Move_Cursor;
------------------------------------------------------------------------------
   procedure Add (Win : Window := Standard_Window;
                  Ch  : Attributed_Character)
   is
      function Waddch (W  : Window;
                       Ch : Attributed_Character) return C_Int;
      pragma Import (C, Waddch, "waddch");
   begin
      if Waddch (Win, Ch) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Add;

   procedure Add (Win : Window := Standard_Window;
                  Ch  : Character)
   is
   begin
      Add (Win,
           Attributed_Character'(Ch    => Ch,
                                 Color => Color_Pair'First,
                                 Attr  => Normal_Video));
   end Add;

   procedure Add
     (Win    : Window := Standard_Window;
      Line   : Line_Position;
      Column : Column_Position;
      Ch     : Attributed_Character)
   is
      function mvwaddch (W  : Window;
                         Y  : C_Int;
                         X  : C_Int;
                         Ch : Attributed_Character) return C_Int;
      pragma Import (C, mvwaddch, "mvwaddch");
   begin
      if mvwaddch (Win, C_Int (Line),
                   C_Int (Column),
                   Ch) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Add;

   procedure Add
     (Win    : Window := Standard_Window;
      Line   : Line_Position;
      Column : Column_Position;
      Ch     : Character)
   is
   begin
      Add (Win,
           Line,
           Column,
           Attributed_Character'(Ch    => Ch,
                                 Color => Color_Pair'First,
                                 Attr  => Normal_Video));
   end Add;

   procedure Add_With_Immediate_Echo
     (Win : Window := Standard_Window;
      Ch  : Attributed_Character)
   is
      function Wechochar (W  : Window;
                          Ch : Attributed_Character) return C_Int;
      pragma Import (C, Wechochar, "wechochar");
   begin
      if Wechochar (Win, Ch) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Add_With_Immediate_Echo;

   procedure Add_With_Immediate_Echo
     (Win : Window := Standard_Window;
      Ch  : Character)
   is
   begin
      Add_With_Immediate_Echo
        (Win,
         Attributed_Character'(Ch    => Ch,
                               Color => Color_Pair'First,
                               Attr  => Normal_Video));
   end Add_With_Immediate_Echo;
------------------------------------------------------------------------------
   function Create (Number_Of_Lines       : Line_Count;
                    Number_Of_Columns     : Column_Count;
                    First_Line_Position   : Line_Position;
                    First_Column_Position : Column_Position) return Window
   is
      function Newwin (Number_Of_Lines       : C_Int;
                       Number_Of_Columns     : C_Int;
                       First_Line_Position   : C_Int;
                       First_Column_Position : C_Int) return Window;
      pragma Import (C, Newwin, "newwin");

      W : Window;
   begin
      W := Newwin (C_Int (Number_Of_Lines),
                   C_Int (Number_Of_Columns),
                   C_Int (First_Line_Position),
                   C_Int (First_Column_Position));
      if W = Null_Window then
         raise Curses_Exception;
      end if;
      return W;
   end Create;

   procedure Delete (Win : in out Window)
   is
      function Wdelwin (W : Window) return C_Int;
      pragma Import (C, Wdelwin, "delwin");
   begin
      if Wdelwin (Win) = Curses_Err then
         raise Curses_Exception;
      end if;
      Win := Null_Window;
   end Delete;

   function Sub_Window
     (Win                   : Window := Standard_Window;
      Number_Of_Lines       : Line_Count;
      Number_Of_Columns     : Column_Count;
      First_Line_Position   : Line_Position;
      First_Column_Position : Column_Position) return Window
   is
      function Subwin
        (Win                   : Window;
         Number_Of_Lines       : C_Int;
         Number_Of_Columns     : C_Int;
         First_Line_Position   : C_Int;
         First_Column_Position : C_Int) return Window;
      pragma Import (C, Subwin, "subwin");

      W : Window;
   begin
      W := Subwin (Win,
                   C_Int (Number_Of_Lines),
                   C_Int (Number_Of_Columns),
                   C_Int (First_Line_Position),
                   C_Int (First_Column_Position));
      if W = Null_Window then
         raise Curses_Exception;
      end if;
      return W;
   end Sub_Window;

   function Derived_Window
     (Win                   : Window := Standard_Window;
      Number_Of_Lines       : Line_Count;
      Number_Of_Columns     : Column_Count;
      First_Line_Position   : Line_Position;
      First_Column_Position : Column_Position) return Window
   is
      function Derwin
        (Win                   : Window;
         Number_Of_Lines       : C_Int;
         Number_Of_Columns     : C_Int;
         First_Line_Position   : C_Int;
         First_Column_Position : C_Int) return Window;
      pragma Import (C, Derwin, "derwin");

      W : Window;
   begin
      W := Derwin (Win,
                   C_Int (Number_Of_Lines),
                   C_Int (Number_Of_Columns),
                   C_Int (First_Line_Position),
                   C_Int (First_Column_Position));
      if W = Null_Window then
         raise Curses_Exception;
      end if;
      return W;
   end Derived_Window;

   function Duplicate (Win : Window) return Window
   is
      function Dupwin (Win : Window) return Window;
      pragma Import (C, Dupwin, "dupwin");

      W : constant Window := Dupwin (Win);
   begin
      if W = Null_Window then
         raise Curses_Exception;
      end if;
      return W;
   end Duplicate;

   procedure Move_Window (Win    : Window;
                          Line   : Line_Position;
                          Column : Column_Position)
   is
      function Mvwin (Win    : Window;
                      Line   : C_Int;
                      Column : C_Int) return C_Int;
      pragma Import (C, Mvwin, "mvwin");
   begin
      if Mvwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Move_Window;

   procedure Move_Derived_Window (Win    : Window;
                                  Line   : Line_Position;
                                  Column : Column_Position)
   is
      function Mvderwin (Win    : Window;
                         Line   : C_Int;
                         Column : C_Int) return C_Int;
      pragma Import (C, Mvderwin, "mvderwin");
   begin
      if Mvderwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Move_Derived_Window;

   procedure Set_Synch_Mode (Win  : Window  := Standard_Window;
                             Mode : Boolean := False)
   is
      function Syncok (Win  : Window;
                       Mode : Curses_Bool) return C_Int;
      pragma Import (C, Syncok, "syncok");
   begin
      if Syncok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Set_Synch_Mode;
------------------------------------------------------------------------------
   procedure Add (Win : Window := Standard_Window;
                  Str : String;
                  Len : Integer := -1)
   is
      function Waddnstr (Win : Window;
                         Str : char_array;
                         Len : C_Int := -1) return C_Int;
      pragma Import (C, Waddnstr, "waddnstr");

      Txt    : char_array (0 .. Str'Length);
      Length : size_t;
   begin
      To_C (Str, Txt, Length);
      if Waddnstr (Win, Txt, C_Int (Len)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Add;

   procedure Add
     (Win    : Window := Standard_Window;
      Line   : Line_Position;
      Column : Column_Position;
      Str    : String;
      Len    : Integer := -1)
   is
   begin
      Move_Cursor (Win, Line, Column);
      Add (Win, Str, Len);
   end Add;
------------------------------------------------------------------------------
   procedure Add
     (Win : Window := Standard_Window;
      Str : Attributed_String;
      Len : Integer := -1)
   is
      function Waddchnstr (Win : Window;
                           Str : chtype_array;
                           Len : C_Int := -1) return C_Int;
      pragma Import (C, Waddchnstr, "waddchnstr");

      Txt : chtype_array (0 .. Str'Length);
   begin
      for Length in 1 .. size_t (Str'Length) loop
         Txt (Length - 1) := Str (Natural (Length));
      end loop;
      Txt (Str'Length) := Default_Character;
      if Waddchnstr (Win,
                     Txt,
                     C_Int (Len)) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Add;

   procedure Add
     (Win    : Window := Standard_Window;
      Line   : Line_Position;
      Column : Column_Position;
      Str    : Attributed_String;
      Len    : Integer := -1)
   is
   begin
      Move_Cursor (Win, Line, Column);
      Add (Win, Str, Len);
   end Add;
------------------------------------------------------------------------------
   procedure Border
     (Win                       : Window := Standard_Window;
      Left_Side_Symbol          : Attributed_Character := Default_Character;
      Right_Side_Symbol         : Attributed_Character := Default_Character;
      Top_Side_Symbol           : Attributed_Character := Default_Character;
      Bottom_Side_Symbol        : Attributed_Character := Default_Character;
      Upper_Left_Corner_Symbol  : Attributed_Character := Default_Character;
      Upper_Right_Corner_Symbol : Attributed_Character := Default_Character;
      Lower_Left_Corner_Symbol  : Attributed_Character := Default_Character;
      Lower_Right_Corner_Symbol : Attributed_Character := Default_Character)
   is
      function Wborder (W   : Window;
                        LS  : Attributed_Character;
                        RS  : Attributed_Character;
                        TS  : Attributed_Character;
                        BS  : Attributed_Character;
                        ULC : Attributed_Character;
                        URC : Attributed_Character;
                        LLC : Attributed_Character;
                        LRC : Attributed_Character) return C_Int;
      pragma Import (C, Wborder, "wborder");
   begin
      if Wborder (Win,
                  Left_Side_Symbol,
                  Right_Side_Symbol,
                  Top_Side_Symbol,
                  Bottom_Side_Symbol,
                  Upper_Left_Corner_Symbol,
                  Upper_Right_Corner_Symbol,
                  Lower_Left_Corner_Symbol,
                  Lower_Right_Corner_Symbol) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Border;

   procedure Box
     (Win               : Window := Standard_Window;
      Vertical_Symbol   : Attributed_Character := Default_Character;
      Horizontal_Symbol : Attributed_Character := Default_Character)
   is
   begin
      Border (Win,
              Vertical_Symbol, Vertical_Symbol,
              Horizontal_Symbol, Horizontal_Symbol);
   end Box;

   procedure Horizontal_Line
     (Win         : Window := Standard_Window;
      Line_Size   : Natural;
      Line_Symbol : Attributed_Character := Default_Character)
   is
      function Whline (W   : Window;
                       Ch  : Attributed_Character;
                       Len : C_Int) return C_Int;
      pragma Import (C, Whline, "whline");
   begin
      if Whline (Win,
                 Line_Symbol,
                 C_Int (Line_Size)) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Horizontal_Line;

   procedure Vertical_Line
     (Win         : Window := Standard_Window;
      Line_Size   : Natural;
      Line_Symbol : Attributed_Character := Default_Character)
   is
      function Wvline (W   : Window;
                       Ch  : Attributed_Character;
                       Len : C_Int) return C_Int;
      pragma Import (C, Wvline, "wvline");
   begin
      if Wvline (Win,
                 Line_Symbol,
                 C_Int (Line_Size)) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Vertical_Line;

------------------------------------------------------------------------------
   function Get_Keystroke (Win : Window := Standard_Window)
     return Real_Key_Code
   is
      function Wgetch (W : Window) return C_Int;
      pragma Import (C, Wgetch, "wgetch");

      C : constant C_Int := Wgetch (Win);
   begin
      if C = Curses_Err then
         return Key_None;
      else
         return Real_Key_Code (C);
      end if;
   end Get_Keystroke;

   procedure Undo_Keystroke (Key : Real_Key_Code)
   is
      function Ungetch (Ch : C_Int) return C_Int;
      pragma Import (C, Ungetch, "ungetch");
   begin
      if Ungetch (C_Int (Key)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Undo_Keystroke;

   function Has_Key (Key : Special_Key_Code) return Boolean
   is
      function Haskey (Key : C_Int) return C_Int;
      pragma Import (C, Haskey, "has_key");
   begin
      if Haskey (C_Int (Key)) = Curses_False then
         return False;
      else
         return True;
      end if;
   end Has_Key;

   function Is_Function_Key (Key : Special_Key_Code) return Boolean
   is
      L : constant Special_Key_Code  := Special_Key_Code (Natural (Key_F0) +
        Natural (Function_Key_Number'Last));
   begin
      if (Key >= Key_F0) and then (Key <= L) then
         return True;
      else
         return False;
      end if;
   end Is_Function_Key;

   function Function_Key (Key : Real_Key_Code)
                          return Function_Key_Number
   is
   begin
      if Is_Function_Key (Key) then
         return Function_Key_Number (Key - Key_F0);
      else
         raise Constraint_Error;
      end if;
   end Function_Key;

   function Function_Key_Code (Key : Function_Key_Number) return Real_Key_Code
   is
   begin
      return Real_Key_Code (Natural (Key_F0) + Natural (Key));
   end Function_Key_Code;
------------------------------------------------------------------------------
   procedure Standout (Win : Window  := Standard_Window;
                       On  : Boolean := True)
   is
      function wstandout (Win : Window) return C_Int;
      pragma Import (C, wstandout, "wstandout");
      function wstandend (Win : Window) return C_Int;
      pragma Import (C, wstandend, "wstandend");

      Err : C_Int;
   begin
      if On then
         Err := wstandout (Win);
      else
         Err := wstandend (Win);
      end if;
      if Err = Curses_Err then
         raise Curses_Exception;
      end if;
   end Standout;

   procedure Switch_Character_Attribute
     (Win  : Window := Standard_Window;
      Attr : Character_Attribute_Set := Normal_Video;
      On   : Boolean := True)
   is
      function Wattron (Win    : Window;
                        C_Attr : Attributed_Character) return C_Int;
      pragma Import (C, Wattron, "wattr_on");
      function Wattroff (Win    : Window;
                         C_Attr : Attributed_Character) return C_Int;
      pragma Import (C, Wattroff, "wattr_off");
      --  In Ada we use the On Boolean to control whether or not we want to
      --  switch on or off the attributes in the set.
      Err : C_Int;
      AC  : constant Attributed_Character := (Ch    => Character'First,
                                              Color => Color_Pair'First,
                                              Attr  => Attr);
   begin
      if On then
         Err := Wattron  (Win, AC);
      else
         Err := Wattroff (Win, AC);
      end if;
      if Err = Curses_Err then
         raise Curses_Exception;
      end if;
   end Switch_Character_Attribute;

   procedure Set_Character_Attributes
     (Win   : Window := Standard_Window;
      Attr  : Character_Attribute_Set := Normal_Video;
      Color : Color_Pair := Color_Pair'First)
   is
      function Wattrset (Win    : Window;
                         C_Attr : Attributed_Character) return C_Int;
      pragma Import (C, Wattrset, "wattrset"); -- ??? wattr_set
   begin
      if Wattrset (Win, (Ch => Character'First,
                         Color => Color,
                         Attr => Attr)) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Set_Character_Attributes;

   function Get_Character_Attribute (Win : Window := Standard_Window)
                                     return Character_Attribute_Set
   is
      function Wattrget (Win : Window;
                         Atr : access Attributed_Character;
                         Col : access C_Short;
                         Opt : System.Address) return C_Int;
      pragma Import (C, Wattrget, "wattr_get");

      Attr : aliased Attributed_Character;
      Col  : aliased C_Short;
      Res  : constant C_Int := Wattrget (Win, Attr'Access, Col'Access,
                                         System.Null_Address);
   begin
      if Res = Curses_Ok then
         return Attr.Attr;
      else
         raise Curses_Exception;
      end if;
   end Get_Character_Attribute;

   function Get_Character_Attribute (Win : Window := Standard_Window)
                                     return Color_Pair
   is
      function Wattrget (Win : Window;
                         Atr : access Attributed_Character;
                         Col : access C_Short;
                         Opt : System.Address) return C_Int;
      pragma Import (C, Wattrget, "wattr_get");

      Attr : aliased Attributed_Character;
      Col  : aliased C_Short;
      Res  : constant C_Int := Wattrget (Win, Attr'Access, Col'Access,
                                         System.Null_Address);
   begin
      if Res = Curses_Ok then
         return Attr.Color;
      else
         raise Curses_Exception;
      end if;
   end Get_Character_Attribute;

   procedure Set_Color (Win  : Window := Standard_Window;
                        Pair : Color_Pair)
   is
      function Wset_Color (Win   : Window;
                           Color : C_Short;
                           Opts  : C_Void_Ptr) return C_Int;
      pragma Import (C, Wset_Color, "wcolor_set");
   begin
      if Wset_Color (Win,
                     C_Short (Pair),
                     C_Void_Ptr (System.Null_Address)) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Set_Color;

   procedure Change_Attributes
     (Win   : Window := Standard_Window;
      Count : Integer := -1;
      Attr  : Character_Attribute_Set := Normal_Video;
      Color : Color_Pair := Color_Pair'First)
   is
      function Wchgat (Win   : Window;
                       Cnt   : C_Int;
                       Attr  : Attributed_Character;
                       Color : C_Short;
                       Opts  : System.Address := System.Null_Address)
                       return C_Int;
      pragma Import (C, Wchgat, "wchgat");
   begin
      if Wchgat (Win,
                 C_Int (Count),
                 (Ch => Character'First,
                  Color => Color_Pair'First,
                  Attr => Attr),
                 C_Short (Color)) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Change_Attributes;

   procedure Change_Attributes
     (Win    : Window := Standard_Window;
      Line   : Line_Position := Line_Position'First;
      Column : Column_Position := Column_Position'First;
      Count  : Integer := -1;
      Attr   : Character_Attribute_Set := Normal_Video;
      Color  : Color_Pair := Color_Pair'First)
   is
   begin
      Move_Cursor (Win, Line, Column);
      Change_Attributes (Win, Count, Attr, Color);
   end Change_Attributes;
------------------------------------------------------------------------------
   procedure Beep
   is
      function Beeper return C_Int;
      pragma Import (C, Beeper, "beep");
   begin
      if Beeper = Curses_Err then
         raise Curses_Exception;
      end if;
   end Beep;

   procedure Flash_Screen
   is
      function Flash return C_Int;
      pragma Import (C, Flash, "flash");
   begin
      if Flash = Curses_Err then
         raise Curses_Exception;
      end if;
   end Flash_Screen;
------------------------------------------------------------------------------
   procedure Set_Cbreak_Mode (SwitchOn : Boolean := True)
   is
      function Cbreak return C_Int;
      pragma Import (C, Cbreak, "cbreak");
      function NoCbreak return C_Int;
      pragma Import (C, NoCbreak, "nocbreak");

      Err : C_Int;
   begin
      if SwitchOn then
         Err := Cbreak;
      else
         Err := NoCbreak;
      end if;
      if Err = Curses_Err then
         raise Curses_Exception;
      end if;
   end Set_Cbreak_Mode;

   procedure Set_Raw_Mode (SwitchOn : Boolean := True)
   is
      function Raw return C_Int;
      pragma Import (C, Raw, "raw");
      function NoRaw return C_Int;
      pragma Import (C, NoRaw, "noraw");

      Err : C_Int;
   begin
      if SwitchOn then
         Err := Raw;
      else
         Err := NoRaw;
      end if;
      if Err = Curses_Err then
         raise Curses_Exception;
      end if;
   end Set_Raw_Mode;

   procedure Set_Echo_Mode (SwitchOn : Boolean := True)
   is
      function Echo return C_Int;
      pragma Import (C, Echo, "echo");
      function NoEcho return C_Int;
      pragma Import (C, NoEcho, "noecho");

      Err : C_Int;
   begin
      if SwitchOn then
         Err := Echo;
      else
         Err := NoEcho;
      end if;
      if Err = Curses_Err then
         raise Curses_Exception;
      end if;
   end Set_Echo_Mode;

   procedure Set_Meta_Mode (Win      : Window := Standard_Window;
                            SwitchOn : Boolean := True)
   is
      function Meta (W : Window; Mode : Curses_Bool) return C_Int;
      pragma Import (C, Meta, "meta");
   begin
      if Meta (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Set_Meta_Mode;

   procedure Set_KeyPad_Mode (Win      : Window := Standard_Window;
                              SwitchOn : Boolean := True)
   is
      function Keypad (W : Window; Mode : Curses_Bool) return C_Int;
      pragma Import (C, Keypad, "keypad");
   begin
      if Keypad (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Set_KeyPad_Mode;

   function Get_KeyPad_Mode (Win : Window := Standard_Window)
                             return Boolean
   is
      function Is_Keypad (W : Window) return Curses_Bool;
      pragma Import (C, Is_Keypad, "is_keypad");
   begin
      return (Is_Keypad (Win) /= Curses_Bool_False);
   end Get_KeyPad_Mode;

   procedure Half_Delay (Amount : Half_Delay_Amount)
   is
      function Halfdelay (Amount : C_Int) return C_Int;
      pragma Import (C, Halfdelay, "halfdelay");
   begin
      if Halfdelay (C_Int (Amount)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Half_Delay;

   procedure Set_Flush_On_Interrupt_Mode
     (Win  : Window := Standard_Window;
      Mode : Boolean := True)
   is
      function Intrflush (Win : Window; Mode : Curses_Bool) return C_Int;
      pragma Import (C, Intrflush, "intrflush");
   begin
      if Intrflush (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Set_Flush_On_Interrupt_Mode;

   procedure Set_Queue_Interrupt_Mode
     (Win   : Window := Standard_Window;
      Flush : Boolean := True)
   is
      procedure Qiflush;
      pragma Import (C, Qiflush, "qiflush");
      procedure No_Qiflush;
      pragma Import (C, No_Qiflush, "noqiflush");
   begin
      if Win = Null_Window then
         raise Curses_Exception;
      end if;
      if Flush then
         Qiflush;
      else
         No_Qiflush;
      end if;
   end Set_Queue_Interrupt_Mode;

   procedure Set_NoDelay_Mode
     (Win  : Window := Standard_Window;
      Mode : Boolean := False)
   is
      function Nodelay (Win : Window; Mode : Curses_Bool) return C_Int;
      pragma Import (C, Nodelay, "nodelay");
   begin
      if Nodelay (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Set_NoDelay_Mode;

   procedure Set_Timeout_Mode (Win    : Window := Standard_Window;
                               Mode   : Timeout_Mode;
                               Amount : Natural)
   is
      procedure Wtimeout (Win : Window; Amount : C_Int);
      pragma Import (C, Wtimeout, "wtimeout");

      Time : C_Int;
   begin
      case Mode is
         when Blocking     => Time := -1;
         when Non_Blocking => Time := 0;
         when Delayed      =>
            if Amount = 0 then
               raise Constraint_Error;
            end if;
            Time := C_Int (Amount);
      end case;
      Wtimeout (Win, Time);
   end Set_Timeout_Mode;

   procedure Set_Escape_Timer_Mode
     (Win       : Window := Standard_Window;
      Timer_Off : Boolean := False)
   is
      function Notimeout (Win : Window; Mode : Curses_Bool) return C_Int;
      pragma Import (C, Notimeout, "notimeout");
   begin
      if Notimeout (Win, Curses_Bool (Boolean'Pos (Timer_Off)))
        = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Set_Escape_Timer_Mode;

------------------------------------------------------------------------------
   procedure Set_NL_Mode (SwitchOn : Boolean := True)
   is
      function NL return C_Int;
      pragma Import (C, NL, "nl");
      function NoNL return C_Int;
      pragma Import (C, NoNL, "nonl");

      Err : C_Int;
   begin
      if SwitchOn then
         Err := NL;
      else
         Err := NoNL;
      end if;
      if Err = Curses_Err then
         raise Curses_Exception;
      end if;
   end Set_NL_Mode;

   procedure Clear_On_Next_Update
     (Win      : Window := Standard_Window;
      Do_Clear : Boolean := True)
   is
      function Clear_Ok (W : Window; Flag : Curses_Bool) return C_Int;
      pragma Import (C, Clear_Ok, "clearok");
   begin
      if Clear_Ok (Win, Curses_Bool (Boolean'Pos (Do_Clear))) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Clear_On_Next_Update;

   procedure Use_Insert_Delete_Line
     (Win    : Window := Standard_Window;
      Do_Idl : Boolean := True)
   is
      function IDL_Ok (W : Window; Flag : Curses_Bool) return C_Int;
      pragma Import (C, IDL_Ok, "idlok");
   begin
      if IDL_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idl))) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Use_Insert_Delete_Line;

   procedure Use_Insert_Delete_Character
     (Win    : Window := Standard_Window;
      Do_Idc : Boolean := True)
   is
      procedure IDC_Ok (W : Window; Flag : Curses_Bool);
      pragma Import (C, IDC_Ok, "idcok");
   begin
      IDC_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idc)));
   end Use_Insert_Delete_Character;

   procedure Leave_Cursor_After_Update
     (Win      : Window := Standard_Window;
      Do_Leave : Boolean := True)
   is
      function Leave_Ok (W : Window; Flag : Curses_Bool) return C_Int;
      pragma Import (C, Leave_Ok, "leaveok");
   begin
      if Leave_Ok (Win, Curses_Bool (Boolean'Pos (Do_Leave))) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Leave_Cursor_After_Update;

   procedure Immediate_Update_Mode
     (Win  : Window := Standard_Window;
      Mode : Boolean := False)
   is
      procedure Immedok (Win : Window; Mode : Curses_Bool);
      pragma Import (C, Immedok, "immedok");
   begin
      Immedok (Win, Curses_Bool (Boolean'Pos (Mode)));
   end Immediate_Update_Mode;

   procedure Allow_Scrolling
     (Win  : Window  := Standard_Window;
      Mode : Boolean := False)
   is
      function Scrollok (Win : Window; Mode : Curses_Bool) return C_Int;
      pragma Import (C, Scrollok, "scrollok");
   begin
      if Scrollok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Allow_Scrolling;

   function Scrolling_Allowed (Win : Window := Standard_Window)
                               return Boolean
   is
      function Is_Scroll_Ok (W : Window) return Curses_Bool;
      pragma Import (C, Is_Scroll_Ok, "is_scrollok");
   begin
      return (Is_Scroll_Ok (Win) /= Curses_Bool_False);
   end Scrolling_Allowed;

   procedure Set_Scroll_Region
     (Win         : Window := Standard_Window;
      Top_Line    : Line_Position;
      Bottom_Line : Line_Position)
   is
      function Wsetscrreg (Win : Window;
                           Lin : C_Int;
                           Col : C_Int) return C_Int;
      pragma Import (C, Wsetscrreg, "wsetscrreg");
   begin
      if Wsetscrreg (Win, C_Int (Top_Line), C_Int (Bottom_Line))
        = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Set_Scroll_Region;
------------------------------------------------------------------------------
   procedure Update_Screen
   is
      function Do_Update return C_Int;
      pragma Import (C, Do_Update, "doupdate");
   begin
      if Do_Update = Curses_Err then
         raise Curses_Exception;
      end if;
   end Update_Screen;

   procedure Refresh (Win : Window := Standard_Window)
   is
      function Wrefresh (W : Window) return C_Int;
      pragma Import (C, Wrefresh, "wrefresh");
   begin
      if Wrefresh (Win) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Refresh;

   procedure Refresh_Without_Update
     (Win : Window := Standard_Window)
   is
      function Wnoutrefresh (W : Window) return C_Int;
      pragma Import (C, Wnoutrefresh, "wnoutrefresh");
   begin
      if Wnoutrefresh (Win) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Refresh_Without_Update;

   procedure Redraw (Win : Window := Standard_Window)
   is
      function Redrawwin (Win : Window) return C_Int;
      pragma Import (C, Redrawwin, "redrawwin");
   begin
      if Redrawwin (Win) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Redraw;

   procedure Redraw
     (Win        : Window := Standard_Window;
      Begin_Line : Line_Position;
      Line_Count : Positive)
   is
      function Wredrawln (Win : Window; First : C_Int; Cnt : C_Int)
                          return C_Int;
      pragma Import (C, Wredrawln, "wredrawln");
   begin
      if Wredrawln (Win,
                    C_Int (Begin_Line),
                    C_Int (Line_Count)) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Redraw;

------------------------------------------------------------------------------
   procedure Erase (Win : Window := Standard_Window)
   is
      function Werase (W : Window) return C_Int;
      pragma Import (C, Werase, "werase");
   begin
      if Werase (Win) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Erase;

   procedure Clear (Win : Window := Standard_Window)
   is
      function Wclear (W : Window) return C_Int;
      pragma Import (C, Wclear, "wclear");
   begin
      if Wclear (Win) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Clear;

   procedure Clear_To_End_Of_Screen (Win : Window := Standard_Window)
   is
      function Wclearbot (W : Window) return C_Int;
      pragma Import (C, Wclearbot, "wclrtobot");
   begin
      if Wclearbot (Win) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Clear_To_End_Of_Screen;

   procedure Clear_To_End_Of_Line (Win : Window := Standard_Window)
   is
      function Wcleareol (W : Window) return C_Int;
      pragma Import (C, Wcleareol, "wclrtoeol");
   begin
      if Wcleareol (Win) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Clear_To_End_Of_Line;
------------------------------------------------------------------------------
   procedure Set_Background
     (Win : Window := Standard_Window;
      Ch  : Attributed_Character)
   is
      procedure WBackground (W : Window; Ch : Attributed_Character);
      pragma Import (C, WBackground, "wbkgdset");
   begin
      WBackground (Win, Ch);
   end Set_Background;

   procedure Change_Background
     (Win : Window := Standard_Window;
      Ch  : Attributed_Character)
   is
      function WChangeBkgd (W : Window; Ch : Attributed_Character)
         return C_Int;
      pragma Import (C, WChangeBkgd, "wbkgd");
   begin
      if WChangeBkgd (Win, Ch) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Change_Background;

   function Get_Background (Win : Window := Standard_Window)
     return Attributed_Character
   is
      function Wgetbkgd (Win : Window) return Attributed_Character;
      pragma Import (C, Wgetbkgd, "getbkgd");
   begin
      return Wgetbkgd (Win);
   end Get_Background;
------------------------------------------------------------------------------
   procedure Change_Lines_Status (Win   : Window := Standard_Window;
                                  Start : Line_Position;
                                  Count : Positive;
                                  State : Boolean)
   is
      function Wtouchln (Win : Window;
                         Sta : C_Int;
                         Cnt : C_Int;
                         Chg : C_Int) return C_Int;
      pragma Import (C, Wtouchln, "wtouchln");
   begin
      if Wtouchln (Win, C_Int (Start), C_Int (Count),
                   C_Int (Boolean'Pos (State))) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Change_Lines_Status;

   procedure Touch (Win : Window := Standard_Window)
   is
      Y : Line_Position;
      X : Column_Position;
   begin
      Get_Size (Win, Y, X);
      pragma Warnings (Off, X);         --  unreferenced
      Change_Lines_Status (Win, 0, Positive (Y), True);
   end Touch;

   procedure Untouch (Win : Window := Standard_Window)
   is
      Y : Line_Position;
      X : Column_Position;
   begin
      Get_Size (Win, Y, X);
      pragma Warnings (Off, X);         --  unreferenced
      Change_Lines_Status (Win, 0, Positive (Y), False);
   end Untouch;

   procedure Touch (Win   : Window := Standard_Window;
                    Start : Line_Position;
                    Count : Positive)
   is
   begin
      Change_Lines_Status (Win, Start, Count, True);
   end Touch;

   function Is_Touched
     (Win  : Window := Standard_Window;
      Line : Line_Position) return Boolean
   is
      function WLineTouched (W : Window; L : C_Int) return Curses_Bool;
      pragma Import (C, WLineTouched, "is_linetouched");
   begin
      if WLineTouched (Win, C_Int (Line)) = Curses_Bool_False then
         return False;
      else
         return True;
      end if;
   end Is_Touched;

   function Is_Touched
     (Win : Window := Standard_Window) return Boolean
   is
      function WWinTouched (W : Window) return Curses_Bool;
      pragma Import (C, WWinTouched, "is_wintouched");
   begin
      if WWinTouched (Win) = Curses_Bool_False then
         return False;
      else
         return True;
      end if;
   end Is_Touched;
------------------------------------------------------------------------------
   procedure Copy
     (Source_Window            : Window;
      Destination_Window       : Window;
      Source_Top_Row           : Line_Position;
      Source_Left_Column       : Column_Position;
      Destination_Top_Row      : Line_Position;
      Destination_Left_Column  : Column_Position;
      Destination_Bottom_Row   : Line_Position;
      Destination_Right_Column : Column_Position;
      Non_Destructive_Mode     : Boolean := True)
   is
      function Copywin (Src : Window;
                        Dst : Window;
                        Str : C_Int;
                        Slc : C_Int;
                        Dtr : C_Int;
                        Dlc : C_Int;
                        Dbr : C_Int;
                        Drc : C_Int;
                        Ndm : C_Int) return C_Int;
      pragma Import (C, Copywin, "copywin");
   begin
      if Copywin (Source_Window,
                  Destination_Window,
                  C_Int (Source_Top_Row),
                  C_Int (Source_Left_Column),
                  C_Int (Destination_Top_Row),
                  C_Int (Destination_Left_Column),
                  C_Int (Destination_Bottom_Row),
                  C_Int (Destination_Right_Column),
                  Boolean'Pos (Non_Destructive_Mode)
                 ) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Copy;

   procedure Overwrite
     (Source_Window      : Window;
      Destination_Window : Window)
   is
      function Overwrite (Src : Window; Dst : Window) return C_Int;
      pragma Import (C, Overwrite, "overwrite");
   begin
      if Overwrite (Source_Window, Destination_Window) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Overwrite;

   procedure Overlay
     (Source_Window      : Window;
      Destination_Window : Window)
   is
      function Overlay (Src : Window; Dst : Window) return C_Int;
      pragma Import (C, Overlay, "overlay");
   begin
      if Overlay (Source_Window, Destination_Window) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Overlay;

------------------------------------------------------------------------------
   procedure Insert_Delete_Lines
     (Win   : Window := Standard_Window;
      Lines : Integer       := 1) -- default is to insert one line above
   is
      function Winsdelln (W : Window; N : C_Int) return C_Int;
      pragma Import (C, Winsdelln, "winsdelln");
   begin
      if Winsdelln (Win, C_Int (Lines)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Insert_Delete_Lines;

   procedure Delete_Line (Win : Window := Standard_Window)
   is
   begin
      Insert_Delete_Lines (Win, -1);
   end Delete_Line;

   procedure Insert_Line (Win : Window := Standard_Window)
   is
   begin
      Insert_Delete_Lines (Win, 1);
   end Insert_Line;
------------------------------------------------------------------------------

   procedure Get_Size
     (Win               : Window := Standard_Window;
      Number_Of_Lines   : out Line_Count;
      Number_Of_Columns : out Column_Count)
   is
      function GetMaxY (W : Window) return C_Int;
      pragma Import (C, GetMaxY, "getmaxy");

      function GetMaxX (W : Window) return C_Int;
      pragma Import (C, GetMaxX, "getmaxx");

      Y : constant C_Int := GetMaxY (Win);
      X : constant C_Int := GetMaxX (Win);
   begin
      Number_Of_Lines   := Line_Count (Y);
      Number_Of_Columns := Column_Count (X);
   end Get_Size;

   procedure Get_Window_Position
     (Win             : Window := Standard_Window;
      Top_Left_Line   : out Line_Position;
      Top_Left_Column : out Column_Position)
   is
      function GetBegY (W : Window) return C_Int;
      pragma Import (C, GetBegY, "getbegy");

      function GetBegX (W : Window) return C_Int;
      pragma Import (C, GetBegX, "getbegx");

      Y : constant C_Short := C_Short (GetBegY (Win));
      X : constant C_Short := C_Short (GetBegX (Win));
   begin
      Top_Left_Line   := Line_Position (Y);
      Top_Left_Column := Column_Position (X);
   end Get_Window_Position;

   procedure Get_Cursor_Position
     (Win    :  Window := Standard_Window;
      Line   : out Line_Position;
      Column : out Column_Position)
   is
      function GetCurY (W : Window) return C_Int;
      pragma Import (C, GetCurY, "getcury");

      function GetCurX (W : Window) return C_Int;
      pragma Import (C, GetCurX, "getcurx");

      Y : constant C_Short := C_Short (GetCurY (Win));
      X : constant C_Short := C_Short (GetCurX (Win));
   begin
      Line   := Line_Position (Y);
      Column := Column_Position (X);
   end Get_Cursor_Position;

   procedure Get_Origin_Relative_To_Parent
     (Win                :  Window;
      Top_Left_Line      : out Line_Position;
      Top_Left_Column    : out Column_Position;
      Is_Not_A_Subwindow : out Boolean)
   is
      function GetParY (W : Window) return C_Int;
      pragma Import (C, GetParY, "getpary");

      function GetParX (W : Window) return C_Int;
      pragma Import (C, GetParX, "getparx");

      Y : constant C_Int := GetParY (Win);
      X : constant C_Int := GetParX (Win);
   begin
      if Y = -1 then
         Top_Left_Line   := Line_Position'Last;
         Top_Left_Column := Column_Position'Last;
         Is_Not_A_Subwindow := True;
      else
         Top_Left_Line   := Line_Position (Y);
         Top_Left_Column := Column_Position (X);
         Is_Not_A_Subwindow := False;
      end if;
   end Get_Origin_Relative_To_Parent;
------------------------------------------------------------------------------
   function New_Pad (Lines   : Line_Count;
                     Columns : Column_Count) return Window
   is
      function Newpad (Lines : C_Int; Columns : C_Int) return Window;
      pragma Import (C, Newpad, "newpad");

      W : Window;
   begin
      W := Newpad (C_Int (Lines), C_Int (Columns));
      if W = Null_Window then
         raise Curses_Exception;
      end if;
      return W;
   end New_Pad;

   function Sub_Pad
     (Pad                   : Window;
      Number_Of_Lines       : Line_Count;
      Number_Of_Columns     : Column_Count;
      First_Line_Position   : Line_Position;
      First_Column_Position : Column_Position) return Window
   is
      function Subpad
        (Pad                   : Window;
         Number_Of_Lines       : C_Int;
         Number_Of_Columns     : C_Int;
         First_Line_Position   : C_Int;
         First_Column_Position : C_Int) return Window;
      pragma Import (C, Subpad, "subpad");

      W : Window;
   begin
      W := Subpad (Pad,
                   C_Int (Number_Of_Lines),
                   C_Int (Number_Of_Columns),
                   C_Int (First_Line_Position),
                   C_Int (First_Column_Position));
      if W = Null_Window then
         raise Curses_Exception;
      end if;
      return W;
   end Sub_Pad;

   procedure Refresh
     (Pad                      : Window;
      Source_Top_Row           : Line_Position;
      Source_Left_Column       : Column_Position;
      Destination_Top_Row      : Line_Position;
      Destination_Left_Column  : Column_Position;
      Destination_Bottom_Row   : Line_Position;
      Destination_Right_Column : Column_Position)
   is
      function Prefresh
        (Pad                      : Window;
         Source_Top_Row           : C_Int;
         Source_Left_Column       : C_Int;
         Destination_Top_Row      : C_Int;
         Destination_Left_Column  : C_Int;
         Destination_Bottom_Row   : C_Int;
         Destination_Right_Column : C_Int) return C_Int;
      pragma Import (C, Prefresh, "prefresh");
   begin
      if Prefresh (Pad,
                   C_Int (Source_Top_Row),
                   C_Int (Source_Left_Column),
                   C_Int (Destination_Top_Row),
                   C_Int (Destination_Left_Column),
                   C_Int (Destination_Bottom_Row),
                   C_Int (Destination_Right_Column)) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Refresh;

   procedure Refresh_Without_Update
     (Pad                      : Window;
      Source_Top_Row           : Line_Position;
      Source_Left_Column       : Column_Position;
      Destination_Top_Row      : Line_Position;
      Destination_Left_Column  : Column_Position;
      Destination_Bottom_Row   : Line_Position;
      Destination_Right_Column : Column_Position)
   is
      function Pnoutrefresh
        (Pad                      : Window;
         Source_Top_Row           : C_Int;
         Source_Left_Column       : C_Int;
         Destination_Top_Row      : C_Int;
         Destination_Left_Column  : C_Int;
         Destination_Bottom_Row   : C_Int;
         Destination_Right_Column : C_Int) return C_Int;
      pragma Import (C, Pnoutrefresh, "pnoutrefresh");
   begin
      if Pnoutrefresh (Pad,
                       C_Int (Source_Top_Row),
                       C_Int (Source_Left_Column),
                       C_Int (Destination_Top_Row),
                       C_Int (Destination_Left_Column),
                       C_Int (Destination_Bottom_Row),
                       C_Int (Destination_Right_Column)) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Refresh_Without_Update;

   procedure Add_Character_To_Pad_And_Echo_It
     (Pad : Window;
      Ch  : Attributed_Character)
   is
      function Pechochar (Pad : Window; Ch : Attributed_Character)
                          return C_Int;
      pragma Import (C, Pechochar, "pechochar");
   begin
      if Pechochar (Pad, Ch) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Add_Character_To_Pad_And_Echo_It;

   procedure Add_Character_To_Pad_And_Echo_It
     (Pad : Window;
      Ch  : Character)
   is
   begin
      Add_Character_To_Pad_And_Echo_It
        (Pad,
         Attributed_Character'(Ch    => Ch,
                               Color => Color_Pair'First,
                               Attr  => Normal_Video));
   end Add_Character_To_Pad_And_Echo_It;
------------------------------------------------------------------------------
   procedure Scroll (Win    : Window := Standard_Window;
                     Amount : Integer := 1)
   is
      function Wscrl (Win : Window; N : C_Int) return C_Int;
      pragma Import (C, Wscrl, "wscrl");

   begin
      if Wscrl (Win, C_Int (Amount)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Scroll;

------------------------------------------------------------------------------
   procedure Delete_Character (Win : Window := Standard_Window)
   is
      function Wdelch (Win : Window) return C_Int;
      pragma Import (C, Wdelch, "wdelch");
   begin
      if Wdelch (Win) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Delete_Character;

   procedure Delete_Character
     (Win    : Window := Standard_Window;
      Line   : Line_Position;
      Column : Column_Position)
   is
      function Mvwdelch (Win : Window;
                         Lin : C_Int;
                         Col : C_Int) return C_Int;
      pragma Import (C, Mvwdelch, "mvwdelch");
   begin
      if Mvwdelch (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Delete_Character;
------------------------------------------------------------------------------
   function Peek (Win : Window := Standard_Window)
     return Attributed_Character
   is
      function Winch (Win : Window) return Attributed_Character;
      pragma Import (C, Winch, "winch");
   begin
      return Winch (Win);
   end Peek;

   function Peek
     (Win    : Window := Standard_Window;
      Line   : Line_Position;
      Column : Column_Position) return Attributed_Character
   is
      function Mvwinch (Win : Window;
                        Lin : C_Int;
                        Col : C_Int) return Attributed_Character;
      pragma Import (C, Mvwinch, "mvwinch");
   begin
      return Mvwinch (Win, C_Int (Line), C_Int (Column));
   end Peek;
------------------------------------------------------------------------------
   procedure Insert (Win : Window := Standard_Window;
                     Ch  : Attributed_Character)
   is
      function Winsch (Win : Window; Ch : Attributed_Character) return C_Int;
      pragma Import (C, Winsch, "winsch");
   begin
      if Winsch (Win, Ch) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Insert;

   procedure Insert
     (Win    : Window := Standard_Window;
      Line   : Line_Position;
      Column : Column_Position;
      Ch     : Attributed_Character)
   is
      function Mvwinsch (Win : Window;
                         Lin : C_Int;
                         Col : C_Int;
                         Ch  : Attributed_Character) return C_Int;
      pragma Import (C, Mvwinsch, "mvwinsch");
   begin
      if Mvwinsch (Win,
                   C_Int (Line),
                   C_Int (Column),
                   Ch) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Insert;
------------------------------------------------------------------------------
   procedure Insert (Win : Window := Standard_Window;
                     Str : String;
                     Len : Integer := -1)
   is
      function Winsnstr (Win : Window;
                         Str : char_array;
                         Len : Integer := -1) return C_Int;
      pragma Import (C, Winsnstr, "winsnstr");

      Txt    : char_array (0 .. Str'Length);
      Length : size_t;
   begin
      To_C (Str, Txt, Length);
      if Winsnstr (Win, Txt, Len) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Insert;

   procedure Insert
     (Win    : Window := Standard_Window;
      Line   : Line_Position;
      Column : Column_Position;
      Str    : String;
      Len    : Integer := -1)
   is
      function Mvwinsnstr (Win    : Window;
                           Line   : C_Int;
                           Column : C_Int;
                           Str    : char_array;
                           Len    : C_Int) return C_Int;
      pragma Import (C, Mvwinsnstr, "mvwinsnstr");

      Txt    : char_array (0 .. Str'Length);
      Length : size_t;
   begin
      To_C (Str, Txt, Length);
      if Mvwinsnstr (Win, C_Int (Line), C_Int (Column), Txt, C_Int (Len))
        = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Insert;
------------------------------------------------------------------------------
   procedure Peek (Win :  Window := Standard_Window;
                   Str : out String;
                   Len :  Integer := -1)
   is
      function Winnstr (Win : Window;
                        Str : char_array;
                        Len : C_Int) return C_Int;
      pragma Import (C, Winnstr, "winnstr");

      N   : Integer := Len;
      Txt : char_array (0 .. Str'Length);
      Cnt : Natural;
   begin
      if N < 0 then
         N := Str'Length;
      end if;
      if N > Str'Length then
         raise Constraint_Error;
      end if;
      Txt (0) := Interfaces.C.char'First;
      if Winnstr (Win, Txt, C_Int (N)) = Curses_Err then
         raise Curses_Exception;
      end if;
      To_Ada (Txt, Str, Cnt, True);
      if Cnt < Str'Length then
         Str ((Str'First + Cnt) .. Str'Last) := (others => ' ');
      end if;
   end Peek;

   procedure Peek
     (Win    :  Window := Standard_Window;
      Line   :  Line_Position;
      Column :  Column_Position;
      Str    : out String;
      Len    :  Integer := -1)
   is
   begin
      Move_Cursor (Win, Line, Column);
      Peek (Win, Str, Len);
   end Peek;
------------------------------------------------------------------------------
   procedure Peek
     (Win :  Window := Standard_Window;
      Str : out Attributed_String;
      Len :  Integer := -1)
   is
      function Winchnstr (Win : Window;
                          Str : chtype_array;             -- out
                          Len : C_Int) return C_Int;
      pragma Import (C, Winchnstr, "winchnstr");

      N   : Integer := Len;
      Txt : constant chtype_array (0 .. Str'Length)
          := (0 => Default_Character);
      Cnt : Natural := 0;
   begin
      if N < 0 then
         N := Str'Length;
      end if;
      if N > Str'Length then
         raise Constraint_Error;
      end if;
      if Winchnstr (Win, Txt, C_Int (N)) = Curses_Err then
         raise Curses_Exception;
      end if;
      for To in Str'Range loop
         exit when Txt (size_t (Cnt)) = Default_Character;
         Str (To) := Txt (size_t (Cnt));
         Cnt := Cnt + 1;
      end loop;
      if Cnt < Str'Length then
         Str ((Str'First + Cnt) .. Str'Last) :=
           (others => (Ch => ' ',
                       Color => Color_Pair'First,
                       Attr => Normal_Video));
      end if;
   end Peek;

   procedure Peek
     (Win    :  Window := Standard_Window;
      Line   :  Line_Position;
      Column :  Column_Position;
      Str    : out Attributed_String;
      Len    : Integer := -1)
   is
   begin
      Move_Cursor (Win, Line, Column);
      Peek (Win, Str, Len);
   end Peek;
------------------------------------------------------------------------------
   procedure Get (Win :  Window := Standard_Window;
                  Str : out String;
                  Len :  Integer := -1)
   is
      function Wgetnstr (Win : Window;
                         Str : char_array;
                         Len : C_Int) return C_Int;
      pragma Import (C, Wgetnstr, "wgetnstr");

      N   : Integer := Len;
      Txt : char_array (0 .. Str'Length);
      Cnt : Natural;
   begin
      if N < 0 then
         N := Str'Length;
      end if;
      if N > Str'Length then
         raise Constraint_Error;
      end if;
      Txt (0) := Interfaces.C.char'First;
      if Wgetnstr (Win, Txt, C_Int (N)) = Curses_Err then
         raise Curses_Exception;
      end if;
      To_Ada (Txt, Str, Cnt, True);
      if Cnt < Str'Length then
         Str ((Str'First + Cnt) .. Str'Last) := (others => ' ');
      end if;
   end Get;

   procedure Get
     (Win    :  Window := Standard_Window;
      Line   :  Line_Position;
      Column :  Column_Position;
      Str    : out String;
      Len    :  Integer := -1)
   is
   begin
      Move_Cursor (Win, Line, Column);
      Get (Win, Str, Len);
   end Get;
------------------------------------------------------------------------------
   procedure Init_Soft_Label_Keys
     (Format : Soft_Label_Key_Format := Three_Two_Three)
   is
      function Slk_Init (Fmt : C_Int) return C_Int;
      pragma Import (C, Slk_Init, "slk_init");
   begin
      if Slk_Init (Soft_Label_Key_Format'Pos (Format)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Init_Soft_Label_Keys;

   procedure Set_Soft_Label_Key (Label : Label_Number;
                                 Text  : String;
                                 Fmt   : Label_Justification := Left)
   is
      function Slk_Set (Label : C_Int;
                        Txt   : char_array;
                        Fmt   : C_Int) return C_Int;
      pragma Import (C, Slk_Set, "slk_set");

      Txt : char_array (0 .. Text'Length);
      Len : size_t;
   begin
      To_C (Text, Txt, Len);
      if Slk_Set (C_Int (Label), Txt,
                  C_Int (Label_Justification'Pos (Fmt))) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Set_Soft_Label_Key;

   procedure Refresh_Soft_Label_Keys
   is
      function Slk_Refresh return C_Int;
      pragma Import (C, Slk_Refresh, "slk_refresh");
   begin
      if Slk_Refresh = Curses_Err then
         raise Curses_Exception;
      end if;
   end Refresh_Soft_Label_Keys;

   procedure Refresh_Soft_Label_Keys_Without_Update
   is
      function Slk_Noutrefresh return C_Int;
      pragma Import (C, Slk_Noutrefresh, "slk_noutrefresh");
   begin
      if Slk_Noutrefresh = Curses_Err then
         raise Curses_Exception;
      end if;
   end Refresh_Soft_Label_Keys_Without_Update;

   procedure Get_Soft_Label_Key (Label : Label_Number;
                                 Text  : out String)
   is
      function Slk_Label (Label : C_Int) return chars_ptr;
      pragma Import (C, Slk_Label, "slk_label");
   begin
      Fill_String (Slk_Label (C_Int (Label)), Text);
   end Get_Soft_Label_Key;

   function Get_Soft_Label_Key (Label : Label_Number) return String
   is
      function Slk_Label (Label : C_Int) return chars_ptr;
      pragma Import (C, Slk_Label, "slk_label");
   begin
      return Fill_String (Slk_Label (C_Int (Label)));
   end Get_Soft_Label_Key;

   procedure Clear_Soft_Label_Keys
   is
      function Slk_Clear return C_Int;
      pragma Import (C, Slk_Clear, "slk_clear");
   begin
      if Slk_Clear = Curses_Err then
         raise Curses_Exception;
      end if;
   end Clear_Soft_Label_Keys;

   procedure Restore_Soft_Label_Keys
   is
      function Slk_Restore return C_Int;
      pragma Import (C, Slk_Restore, "slk_restore");
   begin
      if Slk_Restore = Curses_Err then
         raise Curses_Exception;
      end if;
   end Restore_Soft_Label_Keys;

   procedure Touch_Soft_Label_Keys
   is
      function Slk_Touch return C_Int;
      pragma Import (C, Slk_Touch, "slk_touch");
   begin
      if Slk_Touch = Curses_Err then
         raise Curses_Exception;
      end if;
   end Touch_Soft_Label_Keys;

   procedure Switch_Soft_Label_Key_Attributes
     (Attr : Character_Attribute_Set;
      On   : Boolean := True)
   is
      function Slk_Attron (Ch : Attributed_Character) return C_Int;
      pragma Import (C, Slk_Attron, "slk_attron");
      function Slk_Attroff (Ch : Attributed_Character) return C_Int;
      pragma Import (C, Slk_Attroff, "slk_attroff");

      Err : C_Int;
      Ch  : constant Attributed_Character := (Ch    => Character'First,
                                              Attr  => Attr,
                                              Color => Color_Pair'First);
   begin
      if On then
         Err := Slk_Attron  (Ch);
      else
         Err := Slk_Attroff (Ch);
      end if;
      if Err = Curses_Err then
         raise Curses_Exception;
      end if;
   end Switch_Soft_Label_Key_Attributes;

   procedure Set_Soft_Label_Key_Attributes
     (Attr  : Character_Attribute_Set := Normal_Video;
      Color : Color_Pair := Color_Pair'First)
   is
      function Slk_Attrset (Ch : Attributed_Character) return C_Int;
      pragma Import (C, Slk_Attrset, "slk_attrset");

      Ch : constant Attributed_Character := (Ch    => Character'First,
                                             Attr  => Attr,
                                             Color => Color);
   begin
      if Slk_Attrset (Ch) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Set_Soft_Label_Key_Attributes;

   function Get_Soft_Label_Key_Attributes return Character_Attribute_Set
   is
      function Slk_Attr return Attributed_Character;
      pragma Import (C, Slk_Attr, "slk_attr");

      Attr : constant Attributed_Character := Slk_Attr;
   begin
      return Attr.Attr;
   end Get_Soft_Label_Key_Attributes;

   function Get_Soft_Label_Key_Attributes return Color_Pair
   is
      function Slk_Attr return Attributed_Character;
      pragma Import (C, Slk_Attr, "slk_attr");

      Attr : constant Attributed_Character := Slk_Attr;
   begin
      return Attr.Color;
   end Get_Soft_Label_Key_Attributes;

   procedure Set_Soft_Label_Key_Color (Pair : Color_Pair)
   is
      function Slk_Color (Color : C_Short) return C_Int;
      pragma Import (C, Slk_Color, "slk_color");
   begin
      if Slk_Color (C_Short (Pair)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Set_Soft_Label_Key_Color;

------------------------------------------------------------------------------
   procedure Enable_Key (Key    : Special_Key_Code;
                         Enable : Boolean := True)
   is
      function Keyok (Keycode : C_Int;
                      On_Off  : Curses_Bool) return C_Int;
      pragma Import (C, Keyok, "keyok");
   begin
      if Keyok (C_Int (Key), Curses_Bool (Boolean'Pos (Enable)))
        = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Enable_Key;
------------------------------------------------------------------------------
   procedure Define_Key (Definition : String;
                         Key        : Special_Key_Code)
   is
      function Defkey (Def : char_array;
                       Key : C_Int) return C_Int;
      pragma Import (C, Defkey, "define_key");

      Txt    : char_array (0 .. Definition'Length);
      Length : size_t;
   begin
      To_C (Definition, Txt, Length);
      if Defkey (Txt, C_Int (Key)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Define_Key;
------------------------------------------------------------------------------
   procedure Un_Control (Ch  : Attributed_Character;
                         Str : out String)
   is
      function Unctrl (Ch : Attributed_Character) return chars_ptr;
      pragma Import (C, Unctrl, "unctrl");
   begin
      Fill_String (Unctrl (Ch), Str);
   end Un_Control;

   function Un_Control (Ch : Attributed_Character) return String
   is
      function Unctrl (Ch : Attributed_Character) return chars_ptr;
      pragma Import (C, Unctrl, "unctrl");
   begin
      return Fill_String (Unctrl (Ch));
   end Un_Control;

   procedure Delay_Output (Msecs : Natural)
   is
      function Delayoutput (Msecs : C_Int) return C_Int;
      pragma Import (C, Delayoutput, "delay_output");
   begin
      if Delayoutput (C_Int (Msecs)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Delay_Output;

   procedure Flush_Input
   is
      function Flushinp return C_Int;
      pragma Import (C, Flushinp, "flushinp");
   begin
      if Flushinp = Curses_Err then  -- docu says that never happens, but...
         raise Curses_Exception;
      end if;
   end Flush_Input;
------------------------------------------------------------------------------
   function Baudrate return Natural
   is
      function Baud return C_Int;
      pragma Import (C, Baud, "baudrate");
   begin
      return Natural (Baud);
   end Baudrate;

   function Erase_Character return Character
   is
      function Erasechar return C_Int;
      pragma Import (C, Erasechar, "erasechar");
   begin
      return Character'Val (Erasechar);
   end Erase_Character;

   function Kill_Character return Character
   is
      function Killchar return C_Int;
      pragma Import (C, Killchar, "killchar");
   begin
      return Character'Val (Killchar);
   end Kill_Character;

   function Has_Insert_Character return Boolean
   is
      function Has_Ic return Curses_Bool;
      pragma Import (C, Has_Ic, "has_ic");
   begin
      if Has_Ic = Curses_Bool_False then
         return False;
      else
         return True;
      end if;
   end Has_Insert_Character;

   function Has_Insert_Line return Boolean
   is
      function Has_Il return Curses_Bool;
      pragma Import (C, Has_Il, "has_il");
   begin
      if Has_Il = Curses_Bool_False then
         return False;
      else
         return True;
      end if;
   end Has_Insert_Line;

   function Supported_Attributes return Character_Attribute_Set
   is
      function Termattrs return Attributed_Character;
      pragma Import (C, Termattrs, "termattrs");

      Ch : constant Attributed_Character := Termattrs;
   begin
      return Ch.Attr;
   end Supported_Attributes;

   procedure Long_Name (Name : out String)
   is
      function Longname return chars_ptr;
      pragma Import (C, Longname, "longname");
   begin
      Fill_String (Longname, Name);
   end Long_Name;

   function Long_Name return String
   is
      function Longname return chars_ptr;
      pragma Import (C, Longname, "longname");
   begin
      return Fill_String (Longname);
   end Long_Name;

   procedure Terminal_Name (Name : out String)
   is
      function Termname return chars_ptr;
      pragma Import (C, Termname, "termname");
   begin
      Fill_String (Termname, Name);
   end Terminal_Name;

   function Terminal_Name return String
   is
      function Termname return chars_ptr;
      pragma Import (C, Termname, "termname");
   begin
      return Fill_String (Termname);
   end Terminal_Name;
------------------------------------------------------------------------------
   procedure Init_Pair (Pair : Redefinable_Color_Pair;
                        Fore : Color_Number;
                        Back : Color_Number)
   is
      function Initpair (Pair : C_Short;
                         Fore : C_Short;
                         Back : C_Short) return C_Int;
      pragma Import (C, Initpair, "init_pair");
   begin
      if Integer (Pair) >= Number_Of_Color_Pairs then
         raise Constraint_Error;
      end if;
      if Integer (Fore) >= Number_Of_Colors or else
         Integer (Back) >= Number_Of_Colors
      then
         raise Constraint_Error;
      end if;
      if Initpair (C_Short (Pair), C_Short (Fore), C_Short (Back))
        = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Init_Pair;

   procedure Pair_Content (Pair : Color_Pair;
                           Fore : out Color_Number;
                           Back : out Color_Number)
   is
      type C_Short_Access is access all C_Short;
      function Paircontent (Pair : C_Short;
                            Fp   : C_Short_Access;
                            Bp   : C_Short_Access) return C_Int;
      pragma Import (C, Paircontent, "pair_content");

      F, B : aliased C_Short;
   begin
      if Paircontent (C_Short (Pair), F'Access, B'Access) = Curses_Err then
         raise Curses_Exception;
      else
         Fore := Color_Number (F);
         Back := Color_Number (B);
      end if;
   end Pair_Content;

   function Has_Colors return Boolean
   is
      function Hascolors return Curses_Bool;
      pragma Import (C, Hascolors, "has_colors");
   begin
      if Hascolors = Curses_Bool_False then
         return False;
      else
         return True;
      end if;
   end Has_Colors;

   procedure Init_Color (Color : Color_Number;
                         Red   : RGB_Value;
                         Green : RGB_Value;
                         Blue  : RGB_Value)
   is
      function Initcolor (Col   : C_Short;
                          Red   : C_Short;
                          Green : C_Short;
                          Blue  : C_Short) return C_Int;
      pragma Import (C, Initcolor, "init_color");
   begin
      if Initcolor (C_Short (Color), C_Short (Red), C_Short (Green),
                    C_Short (Blue)) = Curses_Err
      then
            raise Curses_Exception;
      end if;
   end Init_Color;

   function Can_Change_Color return Boolean
   is
      function Canchangecolor return Curses_Bool;
      pragma Import (C, Canchangecolor, "can_change_color");
   begin
      if Canchangecolor = Curses_Bool_False then
         return False;
      else
         return True;
      end if;
   end Can_Change_Color;

   procedure Color_Content (Color :  Color_Number;
                            Red   : out RGB_Value;
                            Green : out RGB_Value;
                            Blue  : out RGB_Value)
   is
      type C_Short_Access is access all C_Short;

      function Colorcontent (Color : C_Short; R, G, B : C_Short_Access)
                             return C_Int;
      pragma Import (C, Colorcontent, "color_content");

      R, G, B : aliased C_Short;
   begin
      if Colorcontent (C_Short (Color), R'Access, G'Access, B'Access) =
        Curses_Err
      then
         raise Curses_Exception;
      else
         Red   := RGB_Value (R);
         Green := RGB_Value (G);
         Blue  := RGB_Value (B);
      end if;
   end Color_Content;

------------------------------------------------------------------------------
   procedure Save_Curses_Mode (Mode : Curses_Mode)
   is
      function Def_Prog_Mode return C_Int;
      pragma Import (C, Def_Prog_Mode, "def_prog_mode");
      function Def_Shell_Mode return C_Int;
      pragma Import (C, Def_Shell_Mode, "def_shell_mode");

      Err : C_Int;
   begin
      case Mode is
         when Curses => Err := Def_Prog_Mode;
         when Shell  => Err := Def_Shell_Mode;
      end case;
      if Err = Curses_Err then
         raise Curses_Exception;
      end if;
   end Save_Curses_Mode;

   procedure Reset_Curses_Mode (Mode : Curses_Mode)
   is
      function Reset_Prog_Mode return C_Int;
      pragma Import (C, Reset_Prog_Mode, "reset_prog_mode");
      function Reset_Shell_Mode return C_Int;
      pragma Import (C, Reset_Shell_Mode, "reset_shell_mode");

      Err : C_Int;
   begin
      case Mode is
         when Curses => Err := Reset_Prog_Mode;
         when Shell  => Err := Reset_Shell_Mode;
      end case;
      if Err = Curses_Err then
         raise Curses_Exception;
      end if;
   end Reset_Curses_Mode;

   procedure Save_Terminal_State
   is
      function Savetty return C_Int;
      pragma Import (C, Savetty, "savetty");
   begin
      if Savetty = Curses_Err then
         raise Curses_Exception;
      end if;
   end Save_Terminal_State;

   procedure Reset_Terminal_State
   is
      function Resetty return C_Int;
      pragma Import (C, Resetty, "resetty");
   begin
      if Resetty = Curses_Err then
         raise Curses_Exception;
      end if;
   end Reset_Terminal_State;

   procedure Rip_Off_Lines (Lines : Integer;
                            Proc  : Stdscr_Init_Proc)
   is
      function Ripoffline (Lines : C_Int;
                           Proc  : Stdscr_Init_Proc) return C_Int;
      pragma Import (C, Ripoffline, "_nc_ripoffline");
   begin
      if Ripoffline (C_Int (Lines), Proc) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Rip_Off_Lines;

   procedure Set_Cursor_Visibility (Visibility : in out Cursor_Visibility)
   is
      function Curs_Set (Curs : C_Int) return C_Int;
      pragma Import (C, Curs_Set, "curs_set");

      Res : C_Int;
   begin
      Res := Curs_Set (Cursor_Visibility'Pos (Visibility));
      if Res /= Curses_Err then
         Visibility := Cursor_Visibility'Val (Res);
      end if;
   end Set_Cursor_Visibility;

   procedure Nap_Milli_Seconds (Ms : Natural)
   is
      function Napms (Ms : C_Int) return C_Int;
      pragma Import (C, Napms, "napms");
   begin
      if Napms (C_Int (Ms)) = Curses_Err then
         raise Curses_Exception;
      end if;
   end Nap_Milli_Seconds;
------------------------------------------------------------------------------
   function Lines return Line_Count
   is
      function LINES_As_Function return Interfaces.C.int;
      pragma Import (C, LINES_As_Function, "LINES_as_function");
   begin
      return Line_Count (LINES_As_Function);
   end Lines;

   function Columns return Column_Count
   is
      function COLS_As_Function return Interfaces.C.int;
      pragma Import (C, COLS_As_Function, "COLS_as_function");
   begin
      return Column_Count (COLS_As_Function);
   end Columns;

   function Tab_Size return Natural
   is
      function TABSIZE_As_Function return Interfaces.C.int;
      pragma Import (C, TABSIZE_As_Function, "TABSIZE_as_function");

   begin
      return Natural (TABSIZE_As_Function);
   end Tab_Size;

   function Number_Of_Colors return Natural
   is
      function COLORS_As_Function return Interfaces.C.int;
      pragma Import (C, COLORS_As_Function, "COLORS_as_function");
   begin
      return Natural (COLORS_As_Function);
   end Number_Of_Colors;

   function Number_Of_Color_Pairs return Natural
   is
      function COLOR_PAIRS_As_Function return Interfaces.C.int;
      pragma Import (C, COLOR_PAIRS_As_Function, "COLOR_PAIRS_as_function");
   begin
      return Natural (COLOR_PAIRS_As_Function);
   end Number_Of_Color_Pairs;
------------------------------------------------------------------------------
   procedure Transform_Coordinates
     (W      : Window := Standard_Window;
      Line   : in out Line_Position;
      Column : in out Column_Position;
      Dir    : Transform_Direction := From_Screen)
   is
      type Int_Access is access all C_Int;
      function Transform (W    : Window;
                          Y, X : Int_Access;
                          Dir  : Curses_Bool) return C_Int;
      pragma Import (C, Transform, "wmouse_trafo");

      X : aliased C_Int := C_Int (Column);
      Y : aliased C_Int := C_Int (Line);
      D : Curses_Bool := Curses_Bool_False;
      R : C_Int;
   begin
      if Dir = To_Screen then
         D := 1;
      end if;
      R := Transform (W, Y'Access, X'Access, D);
      if R = Curses_False then
         raise Curses_Exception;
      else
         Line   := Line_Position (Y);
         Column := Column_Position (X);
      end if;
   end Transform_Coordinates;
------------------------------------------------------------------------------
   procedure Use_Default_Colors is
      function C_Use_Default_Colors return C_Int;
      pragma Import (C, C_Use_Default_Colors, "use_default_colors");
      Err : constant C_Int := C_Use_Default_Colors;
   begin
      if Err = Curses_Err then
         raise Curses_Exception;
      end if;
   end Use_Default_Colors;

   procedure Assume_Default_Colors (Fore : Color_Number := Default_Color;
                                    Back : Color_Number := Default_Color)
   is
      function C_Assume_Default_Colors (Fore : C_Int;
                                        Back : C_Int) return C_Int;
      pragma Import (C, C_Assume_Default_Colors, "assume_default_colors");

      Err : constant C_Int := C_Assume_Default_Colors (C_Int (Fore),
                                                       C_Int (Back));
   begin
      if Err = Curses_Err then
         raise Curses_Exception;
      end if;
   end Assume_Default_Colors;
------------------------------------------------------------------------------
   function Curses_Version return String
   is
      function curses_versionC return chars_ptr;
      pragma Import (C, curses_versionC, "curses_version");
      Result : constant chars_ptr := curses_versionC;
   begin
      return Fill_String (Result);
   end Curses_Version;
------------------------------------------------------------------------------
   procedure Curses_Free_All is
      procedure curses_freeall;
      pragma Import (C, curses_freeall, "_nc_freeall");
   begin
      --  Use this only for testing: you cannot use curses after calling it,
      --  so it has to be the "last" thing done before exiting the program.
      --  This will not really free ALL of memory used by curses.  That is
      --  because it cannot free the memory used for stdout's setbuf.  The
      --  _nc_free_and_exit() procedure can do that, but it can be invoked
      --  safely only from C - and again, that only as the "last" thing done
      --  before exiting the program.
      curses_freeall;
   end Curses_Free_All;
------------------------------------------------------------------------------
   function Use_Extended_Names (Enable : Boolean) return Boolean
   is
      function use_extended_namesC (e : Curses_Bool) return C_Int;
      pragma Import (C, use_extended_namesC, "use_extended_names");

      Res : constant C_Int :=
         use_extended_namesC (Curses_Bool (Boolean'Pos (Enable)));
   begin
      if Res = C_Int (Curses_Bool_False) then
         return False;
      else
         return True;
      end if;
   end Use_Extended_Names;
------------------------------------------------------------------------------
   procedure Screen_Dump_To_File (Filename : String)
   is
      function scr_dump (f : char_array) return C_Int;
      pragma Import (C, scr_dump, "scr_dump");
      Txt    : char_array (0 .. Filename'Length);
      Length : size_t;
   begin
      To_C (Filename, Txt, Length);
      if Curses_Err = scr_dump (Txt) then
         raise Curses_Exception;
      end if;
   end Screen_Dump_To_File;

   procedure Screen_Restore_From_File (Filename : String)
   is
      function scr_restore (f : char_array) return C_Int;
      pragma Import (C, scr_restore, "scr_restore");
      Txt    : char_array (0 .. Filename'Length);
      Length : size_t;
   begin
      To_C (Filename, Txt, Length);
      if Curses_Err = scr_restore (Txt)  then
         raise Curses_Exception;
      end if;
   end Screen_Restore_From_File;

   procedure Screen_Init_From_File (Filename : String)
   is
      function scr_init (f : char_array) return C_Int;
      pragma Import (C, scr_init, "scr_init");
      Txt    : char_array (0 .. Filename'Length);
      Length : size_t;
   begin
      To_C (Filename, Txt, Length);
      if Curses_Err = scr_init (Txt) then
         raise Curses_Exception;
      end if;
   end Screen_Init_From_File;

   procedure Screen_Set_File (Filename : String)
   is
      function scr_set (f : char_array) return C_Int;
      pragma Import (C, scr_set, "scr_set");
      Txt    : char_array (0 .. Filename'Length);
      Length : size_t;
   begin
      To_C (Filename, Txt, Length);
      if Curses_Err = scr_set (Txt) then
         raise Curses_Exception;
      end if;
   end Screen_Set_File;
------------------------------------------------------------------------------
   procedure Resize (Win               : Window := Standard_Window;
                     Number_Of_Lines   : Line_Count;
                     Number_Of_Columns : Column_Count) is
      function wresize (win     : Window;
                        lines   : C_Int;
                        columns : C_Int) return C_Int;
      pragma Import (C, wresize);
   begin
      if wresize (Win,
                  C_Int (Number_Of_Lines),
                  C_Int (Number_Of_Columns)) = Curses_Err
      then
         raise Curses_Exception;
      end if;
   end Resize;
------------------------------------------------------------------------------

end Terminal_Interface.Curses;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-mouse__adb.htm0000644000000000000000000007152414170631653024654 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm0000644000000000000000000002205614170631653027277 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-menus-menu_user_data__adb.htm0000644000000000000000000002354214170631653027641 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm0000644000000000000000000002771714170631652030160 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io__ads.htm0000644000000000000000000004365214170631653025221 0ustar rootroot 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;
././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.htmncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.h0000644000000000000000000003311514170631652031656 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/index.htm0000644000000000000000000000222114170606213016511 0ustar rootroot 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> ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm0000644000000000000000000001654514170631652030641 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-termcap__ads.htm0000644000000000000000000002267514170631653025203 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-aux__adb.htm0000644000000000000000000004075114170631653025770 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-float_io__ads.htm0000644000000000000000000002163614170631653027011 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm0000644000000000000000000003016214170631652031514 0ustar rootroot 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;
././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htmncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.h0000644000000000000000000002142014170631652031673 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__adb.htm0000644000000000000000000002072314170631652030234 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__adb.htm0000644000000000000000000002062614170631652030443 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-terminfo__ads.htm0000644000000000000000000002255514170631653025370 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms__adb.htm0000644000000000000000000037666214170631653024665 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-form_user_data__adb.htm0000644000000000000000000002477214170631653027645 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-modular_io__adb.htm0000644000000000000000000002401614170631653027321 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm0000644000000000000000000001625614170631652030263 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io__adb.htm0000644000000000000000000011515314170631653025174 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-panels__adb.htm0000644000000000000000000005012114170631653024774 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface__ads.htm0000644000000000000000000001256614170610335022240 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm0000644000000000000000000001642514170631652031644 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm0000644000000000000000000002113114170631653027341 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__adb.htm0000644000000000000000000002706114170631653030207 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-aux__ads.htm0000644000000000000000000003726114170631652024341 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm0000644000000000000000000002046714170631653030233 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-panels-user_data__adb.htm0000644000000000000000000002474414170631653026755 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__adb.htm0000644000000000000000000004303014170631652031471 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types__adb.htm0000644000000000000000000011411314170631652027146 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-panels-user_data__ads.htm0000644000000000000000000002160514170631653026767 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-mouse__ads.htm0000644000000000000000000006443714170631653024702 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm0000644000000000000000000002036714170631653027347 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms__ads.htm0000644000000000000000000032451014170631653024667 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-fixed_io__adb.htm0000644000000000000000000002654114170631653026762 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm0000644000000000000000000002203614170631652027774 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-trace__adb.htm0000644000000000000000000001645314170631653024622 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/files.htm0000644000000000000000000000051414170606213016507 0ustar rootroot

Files

[T] ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm0000644000000000000000000002722514170631652031402 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-menus__adb.htm0000644000000000000000000036356014170631653024657 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses_constants__ads.htm0000644000000000000000000011306114515000262025621 0ustar rootroot 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 := 4;
   Version : constant String := "6.4";

   --  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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-complex_io__adb.htm0000644000000000000000000002506014170631653027325 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-terminfo__adb.htm0000644000000000000000000004640014170631653025342 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm0000644000000000000000000002037114170631653027334 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/ada/terminal_interface-curses-forms-field_types-user__adb.htm0000644000000000000000000004431514170631652030130 0ustar rootroot 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;
ncurses-6.4-20240113/doc/html/announce.html0000644000000000000000000014017714354116726016665 0ustar rootroot Announcing ncurses 6.4

Announcing ncurses 6.4

Overview

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

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

Since 1995, ncurses has been ported to many systems:

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

The distribution includes the library and support utilities, including

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

Full manual pages are provided for the library and tools.

The ncurses distribution is available at ncurses' homepage:

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

It is also available at the GNU distribution site

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

Release Notes

These notes are for ncurses 6.4, released December 31, 2022.

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

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

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

Library improvements

New features

There are no new features in this release.

Other improvements

These are improvements to existing features:

  • modify delscreen to more effectively delete all windows on the given screen.

  • modify wnoutrefresh to call pnoutrefresh if its parameter is a pad, rather than treating it as an error, and modify new_panel to permit its window-parameter to be a pad

  • modify curses_trace() to show the trace-mask as symbols, e.g., TRACE_ORDINARY, DEBUG_LEVEL(3).

  • improve checks for valid mouse events when an intermediate mouse state is not part of the mousemask specified by the caller

  • allow extended-color number in opts parameter of wattr_on.

  • improve _tracecchar_t2 formatting of base+combining character.

  • trim out some unwanted linker options from ncurses*config and .pc files seen in Fedora 36+.

  • improve shell-scripts with shellcheck

  • improve use of "trap" in shell scripts, using a script.

  • modify make-tar.sh scripts to make timestamps more predictable.

These are corrections to existing features:

  • modify misc/gen-pkgconfig.in to allow for the case where the library directory does not yet exist, since this is processed before doing an install

  • set trailing null on string passed from winsnstr to wins_nwstr.

  • modify waddch_literal to allow for double-width base character when merging a combining character

Program improvements

Several improvements were made to the utility programs:

infocmp
  • rewrite canonical_name function of infocmp to ensure buffer size
  • improve readability of long parameterized expressions with the infocmp “-f” option by allowing split before a “%p” marker.
  • modify verbose-option of infocmp, tic, toe to enable debug-tracing if that is configured.
tabs
limit tab-stop values to max-columns
tic
add consistency check in tic for u6/u7/u8/u9 and NQ capabilities.
tput
corrected use of original tty-modes in init/reset subcommands

Examples

Along with the library and utilities, improvements were made to the ncurses-examples. Most of this activity aimed at improving the test-packages:

  • add minimal -h (usage) and -V (version) getopt logic to all ncurses-examples programs.

  • fix an error in "@" command in test/ncurses.c F-menu

  • add curses_trace to ifdef's for START_TRACE in test/test.priv.h

  • improve pthread-configuration for test/worm.c

  • add setlocale call to several test-programs.

  • workaround in test/picsmap.c for use of floating point for rgb values by ImageMagick 6.9.11, which appears to use the wrong upper limit.

  • use static libraries for AdaCurses test-package for Mageia, since no gprbuild package is available.

  • install Ada95 sample programs in libexecdir, adding a wrapper script to invoke those.

  • install ncurses-examples programs in libexecdir, adding a wrapper script to invoke those.

There are other new demo/test programs and reusable examples:

test/combine
demonstrate combining characters
test/test_delwin
demonstrate deleting a window
test/test_mouse
observe mouse events in the raw terminal or parsed ncurses modes
test/test_unget_wch
demonstrate the unget_wch and unget functions

Terminal database

There are several new terminal descriptions:

There are many changes to existing terminal descriptions. Some were updates to several descriptions:

while others affected specific descriptions. These were retested, to take into account changes by their developers:

while these are specific fixes based on reviewing documentation, user reports, or warnings from tic:

att610+cvis0
amended note as per documentation for att610, att620, att730
kon, kon2, jfbterm
revise to undo "linux2.6" change to smacs/rmacs/enacs
st-0.6
add dim, ecma+strikeout
foot+base
add xterm+sl-alt
dec+sl
correct dsl in dec+sl
mintty and tmux
correct setal in mintty/tmux entries, add to vte-2018
nsterm
modify nsterm to use xterm+alt1049
putty
modify putty to use xterm+alt1049
vte-2018
add blink and setal

A few entries use extensions (user-defined terminal capabilities):

  • use ansi+enq and decid+cpr in cases where the terminal probably supported the u6-u9 extension

  • remove u6-u9 from teken-2018

  • use NQ to flag entries where the terminal does not support query and response

  • add/use bracketed+paste to help identify terminals supporting this xterm feature

  • modify samples for xterm mouse 1002/1003 modes to use 1006 mode, and also provide for focus in/out responses

  • xterm patch #371 supports DEC-compatible status-line. add dec+sl to xterm-new, per xterm #371, add xterm-p371, add xterm-p370, for use in older terminals, and set “xterm-new” to “xterm-p370” (to ease adoption).

Documentation

As usual, this release

  • improves documentation by describing new features,

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

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

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

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

Interesting bug-fixes

While there were many bugs fixed during development of ncurses 6.4, only a few (the reason for this release) were both important and interesting. Most of the bug-fixes were for local issues which did not affect compatibility across releases. Since those are detailed in the NEWS file no elaboration is needed here.

The interesting bugs were those dealing with memory leaks and buffer overflows. Although the utilities are designed for text files (which they do properly), some choose to test them with non-text files.

  • Text files contain no embedded nulls. Also, they end with a newline. Feeding tic non-text files exposed a few cases where the program did not check for those issues. As a result, further processing of the input found limit-checks whose assumptions were invalid.

  • Fixing the limit-checks (first) found a problem with tic managing the list of strings in a terminal description. In merging two terminal descriptions (i.e., the “use=” feature), tic was not allocating a complete copy. A quick repair for that introduced a memory leak.

  • The checks for non-text files are improved (i.e., embedded nulls in the input file will cause tic to reject it rather than attempting to process it).

  • The string allocations in tic are likewise improved.

Configuration changes

Major changes

There are no major changes. No new options were added. Several improvements were made to configure checks.

Configuration options

There are a few new/modified configure options:

--with-abi-version

add ABI 7 defaults to configure script.

--with-caps

add warning in configure script if file specified for “--with-caps” does not exist.

--with-manpage-format

bzip2 and xz compression are now supported

--with-xterm-kbs

add check/warning in configure script if option “--with-xterm-kbs” is missing or inconsistent

Portability

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

  • amend configure option's auto-search to account for systems where none of the directories known to pkg-config exist

  • corrected regex needed for older pkg-config used in Solaris 10

  • improve handling of --with-pkg-config-libdir option, allowing for the case where either $PKG_CONFIG_LIBDIR or the option value has a colon-separated list of directories

  • if the --with-pkg-config-libdir option is not given, use ${libdir}/pkgconfig as a default

  • improve search-path check for pkg-config, e.g., for Debian testing which installs pkg-config with architecture-prefixes.

  • build-fix for cross-compiling to MingW, conditionally add -lssp

  • improve configure check for getttynam

  • fixes to build with dietlibc:

    • add configure check for fpathconf
    • add configure check for math sine/cosine, needed in test/tclock, and eliminate pow() from test/hanoi
    • use wcsnlen as an alternative to wmemchr if it is not found
  • modify configure macro CF_BUILD_CC to check if the build-compiler works, rather than that it is different from the cross-compiler, e.g., to accommodate a compiler which can be used for either purpose with different flags

  • modify configure/scripts to work around interference by GNU grep 3.8

Here are some of the other portability fixes:

  • change man_db.renames to template, to handle ncurses*-config script with the --extra-suffix configure option.

  • update CF_XOPEN_SOURCE macro, adding variants “gnueabi" and “gnueabihf" to get _DEFAULT_SOURCE special case, as well as adding GNU libc suffixes for “abi64”, “abin32”, “x32” to distinguish it from other libc flavors.

  • work around musl's nonstandard use of feature test macros by adding a definition for NCURSES_WIDECHAR to the generated “.pc” and *-config files.

  • use “command -v” rather than “type” in Ada95/gen/Makefile.in to fix a portability issue.


Features of ncurses

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

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

  • ncurses supports all of the for SVr4 curses features including keyboard mapping, color, forms-drawing with ACS characters, and automatic recognition of keypad and function keys.

  • ncurses provides these SVr4 add-on libraries (not part of X/Open Curses):

    • the panels library, supporting a stack of windows with backing store.

    • the menus library, supporting a uniform but flexible interface for menu programming.

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

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

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

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

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

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

The ncurses package also has many useful extensions over SVr4:

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

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

  • Ada95 and C++ bindings.

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

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

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

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

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

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

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

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

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

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

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

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

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

  • A BSD-like tset utility is provided.

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

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

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

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

  • The library meets the XSI requirement that every macro entry point has a corresponding function which may be linked (and will be prototype-checked) if the macro definition is disabled with #undef.

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

Applications using ncurses

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

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

aptitude

FrontEnd to Apt, the debian package manager

https://wiki.debian.org/Aptitude

cdk

Curses Development Kit

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

ded

directory-editor

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

dialog

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

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

lynx

the text WWW browser

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

mutt

mail utility

http://www.mutt.org/

ncftp

file-transfer utility

https://www.ncftp.com/

nvi

New vi uses ncurses.

https://sites.google.com/a/bostic.com/keithbostic/vi

ranger

A console file manager with VI key bindings in Python.

https://ranger.github.io/

tin

newsreader, supporting color, MIME

http://www.tin.org/

vifm

File manager with vi like keybindings

https://vifm.info/

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

minicom

terminal emulator for serial modem connections

https://alioth.debian.org/projects/minicom/

mosh

a replacement for ssh.

https://mosh.org/

tack

terminfo action checker

https://invisible-island.net/ncurses/tack.html

tmux

terminal multiplexor

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

vile

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

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

and finally, those which use only the termcap interface:

emacs

text editor

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

less

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

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

screen

terminal multiplexor

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

vim

text editor

https://www.vim.org/

Development activities

Zeyd Ben-Halim started ncurses from a previous package pcurses, written by Pavel Curtis. Eric S. Raymond continued development. 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.3/ and
https://invisible-mirror.net/archives/ncurses/6.3/ .

There is an archive of the mailing list here:

http://lists.gnu.org/archive/html/bug-ncurses (also https)

Related resources

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

Other resources

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

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

ncurses-6.4-20240113/doc/html/hackguide.html0000644000000000000000000011501014340464654016770 0ustar rootroot 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. Mark up manual pages in the man macros. These have to be viewable through traditional man(1) programs.
  3. Write everything else in HTML.

When in doubt, HTMLize a master and use lynx(1) to generate plain ASCII (as we do for the announcement document).

The reason for choosing HTML is that it is (a) well-adapted for on-line browsing through viewers that are everywhere; (b) more easily readable as plain text than most other mark-ups, if you do not have a viewer; and (c) carries enough information that you can generate a nice-looking printed version from it. Also, of course, it make exporting things like the announcement document to WWW pretty trivial.

How to Report Bugs

The reporting address for bugs is bug-ncurses@gnu.org. This is a majordomo list; to join, write to bug-ncurses-request@gnu.org with a message containing the line:

             subscribe <name>@<host.domain>

The ncurses code is maintained by a small group of volunteers. While we try our best to fix bugs promptly, we simply do not have a lot of hours to spend on elementary hand-holding. We rely on intelligent cooperation from our users. If you think you have found a bug in ncurses, there are some steps you can take before contacting us that will help get the bug fixed quickly.

In order to use our bug-fixing time efficiently, we put people who show us they have taken these steps at the head of our queue. This means that if you do not, you will probably end up at the tail end and have to wait a while.

  1. Develop a recipe to reproduce the bug.

    Bugs we can reproduce are likely to be fixed very quickly, often within days. The most effective single thing you can do to get a quick fix is develop a way we can duplicate the bad behavior — ideally, by giving us source for a small, portable test program that breaks the library. (Even better is a keystroke recipe using one of the test programs provided with the distribution.)

  2. Try to reproduce the bug on a different terminal type.

    In our experience, most of the behaviors people report as library bugs are actually due to subtle problems in terminal descriptions. This is especially likely to be true if you are using a traditional asynchronous terminal or PC-based terminal emulator, rather than xterm or a UNIX console entry.

    It is therefore extremely helpful if you can tell us whether or not your problem reproduces on other terminal types. Usually you will have both a console type and xterm available; please tell us whether or not your bug reproduces on both.

    If you have xterm available, it is also good to collect xterm reports for different window sizes. This is especially true if you normally use an unusual xterm window size — a surprising number of the bugs we have seen are either triggered or masked by these.

  3. Generate and examine a trace file for the broken behavior.

    Recompile your program with the debugging versions of the libraries. Insert a trace() call with the argument set to TRACE_UPDATE. (See "Writing Programs with NCURSES" for details on trace levels.) Reproduce your bug, then look at the trace file to see what the library was actually doing.

    Another frequent cause of apparent bugs is application coding errors that cause the wrong things to be put on the virtual screen. Looking at the virtual-screen dumps in the trace file will tell you immediately if this is happening, and save you from the possible embarrassment of being told that the bug is in your code and is your problem rather than ours.

    If the virtual-screen dumps look correct but the bug persists, it is possible to crank up the trace level to give more and more information about the library's update actions and the control sequences it issues to perform them. The test directory of the distribution contains a tool for digesting these logs to make them less tedious to wade through.

    Often you will find terminfo problems at this stage by noticing that the escape sequences put out for various capabilities are wrong. If not, you are likely to learn enough to be able to characterize any bug in the screen-update logic quite exactly.

  4. Report details and symptoms, not just interpretations.

    If you do the preceding two steps, it is very likely that you will discover the nature of the problem yourself and be able to send us a fix. This will create happy feelings all around and earn you good karma for the first time you run into a bug you really cannot characterize and fix yourself.

    If you are still stuck, at least you will know what to tell us. Remember, we need details. If you guess about what is safe to leave out, you are too likely to be wrong.

    If your bug produces a bad update, include a trace file. Try to make the trace at the least voluminous level that pins down the bug. Logs that have been through tracemunch are OK, it does not throw away any information (actually they are better than un-munched ones because they are easier to read).

    If your bug produces a core-dump, please include a symbolic stack trace generated by gdb(1) or your local equivalent.

    Tell us about every terminal on which you have reproduced the bug — and every terminal on which you cannot. Ideally, send us terminfo sources for all of these (yours might differ from ours).

    Include your ncurses version and your OS/machine type, of course! You can find your ncurses version in the curses.h file.

If your problem smells like a logic error or in cursor movement or scrolling or a bad capability, there are a couple of tiny test frames for the library algorithms in the progs directory that may help you isolate it. These are not part of the normal build, but do have their own make productions.

The most important of these is mvcur, a test frame for the cursor-movement optimization code. With this program, you can see directly what control sequences will be emitted for any given cursor movement or scroll/insert/delete operations. If you think you have got a bad capability identified, you can disable it and test again. The program is command-driven and has on-line help.

If you think the vertical-scroll optimization is broken, or just want to understand how it works better, build hashmap and read the header comments of hardscroll.c and hashmap.c; then try it out. You can also test the hardware-scrolling optimization separately with hardscroll.

A Tour of the Ncurses Library

Library Overview

Most of the library is superstructure — fairly trivial convenience interfaces to a small set of basic functions and data structures used to manipulate the virtual screen (in particular, none of this code does any I/O except through calls to more fundamental modules described below). The files

lib_addch.c lib_bkgd.c lib_box.c lib_chgat.c lib_clear.c lib_clearok.c lib_clrbot.c lib_clreol.c lib_colorset.c lib_data.c lib_delch.c lib_delwin.c lib_echo.c lib_erase.c lib_gen.c lib_getstr.c lib_hline.c lib_immedok.c lib_inchstr.c lib_insch.c lib_insdel.c lib_insstr.c lib_instr.c lib_isendwin.c lib_keyname.c lib_leaveok.c lib_move.c lib_mvwin.c lib_overlay.c lib_pad.c lib_printw.c lib_redrawln.c lib_scanw.c lib_screen.c lib_scroll.c lib_scrollok.c lib_scrreg.c lib_set_term.c lib_slk.c lib_slkatr_set.c lib_slkatrof.c lib_slkatron.c lib_slkatrset.c lib_slkattr.c lib_slkclear.c lib_slkcolor.c lib_slkinit.c lib_slklab.c lib_slkrefr.c lib_slkset.c lib_slktouch.c lib_touch.c lib_unctrl.c lib_vline.c lib_wattroff.c lib_wattron.c lib_window.c

are all in this category. They are very unlikely to need change, barring bugs or some fundamental reorganization in the underlying data structures.

These files are used only for debugging support:

lib_trace.c lib_traceatr.c lib_tracebits.c lib_tracechr.c lib_tracedmp.c lib_tracemse.c trace_buf.c

It is rather unlikely you will ever need to change these, unless you want to introduce a new debug trace level for some reason.

There is another group of files that do direct I/O via tputs(), computations on the terminal capabilities, or queries to the OS environment, but nevertheless have only fairly low complexity. These include:

lib_acs.c lib_beep.c lib_color.c lib_endwin.c lib_initscr.c lib_longname.c lib_newterm.c lib_options.c lib_termcap.c lib_ti.c lib_tparm.c lib_tputs.c lib_vidattr.c read_entry.c.

They are likely to need revision only if ncurses is being ported to an environment without an underlying terminfo capability representation.

These files have serious hooks into the tty driver and signal facilities:

lib_kernel.c lib_baudrate.c lib_raw.c lib_tstp.c lib_twait.c

If you run into porting snafus moving the package to another UNIX, the problem is likely to be in one of these files. The file lib_print.c uses sleep(2) and also falls in this category.

Almost all of the real work is done in the files

hardscroll.c hashmap.c lib_addch.c lib_doupdate.c lib_getch.c lib_mouse.c lib_mvcur.c lib_refresh.c lib_setup.c lib_vidattr.c

Most of the algorithmic complexity in the library lives in these files. If there is a real bug in ncurses itself, it is probably here. We will tour some of these files in detail below (see The Engine Room).

Finally, there is a group of files that is actually most of the terminfo compiler. The reason this code lives in the ncurses library is to support fallback to /etc/termcap. These files include

alloc_entry.c captoinfo.c comp_captab.c comp_error.c comp_hash.c comp_parse.c comp_scan.c parse_entry.c read_termcap.c write_entry.c

We will discuss these in the compiler tour.

The Engine Room

Keyboard Input

All ncurses input funnels through the function wgetch(), defined in lib_getch.c. This function is tricky; it has to poll for keyboard and mouse events and do a running match of incoming input against the set of defined special keys.

The central data structure in this module is a FIFO queue, used to match multiple-character input sequences against special-key capabilities; also to implement pushback via ungetch().

The wgetch() code distinguishes between function key sequences and the same sequences typed manually by doing a timed wait after each input character that could lead a function key sequence. If the entire sequence takes less than 1 second, it is assumed to have been generated by a function key press.

Hackers bruised by previous encounters with variant select(2) calls may find the code in lib_twait.c interesting. It deals with the problem that some BSD selects do not return a reliable time-left value. The function timed_wait() effectively simulates a System V select.

Mouse Events

If the mouse interface is active, wgetch() polls for mouse events each call, before it goes to the keyboard for input. It is up to lib_mouse.c how the polling is accomplished; it may vary for different devices.

Under xterm, however, mouse event notifications come in via the keyboard input stream. They are recognized by having the kmous capability as a prefix. This is kind of klugey, but trying to wire in recognition of a mouse key prefix without going through the function-key machinery would be just too painful, and this turns out to imply having the prefix somewhere in the function-key capabilities at terminal-type initialization.

This kluge only works because kmous is not actually used by any historic terminal type or curses implementation we know of. Best guess is it is a relic of some forgotten experiment in-house at Bell Labs that did not leave any traces in the publicly-distributed System V terminfo files. If System V or XPG4 ever gets serious about using it again, this kluge may have to change.

Here are some more details about mouse event handling:

The lib_mouse() code is logically split into a lower level that accepts event reports in a device-dependent format and an upper level that parses mouse gestures and filters events. The mediating data structure is a circular queue of event structures.

Functionally, the lower level's job is to pick up primitive events and put them on the circular queue. This can happen in one of two ways: either (a) _nc_mouse_event() detects a series of incoming mouse reports and queues them, or (b) code in lib_getch.c detects the kmous prefix in the keyboard input stream and calls _nc_mouse_inline to queue up a series of adjacent mouse reports.

In either case, _nc_mouse_parse() should be called after the series is accepted to parse the digested mouse reports (low-level events) into a gesture (a high-level or composite event).

Output and Screen Updating

With the single exception of character echoes during a wgetnstr() call (which simulates cooked-mode line editing in an ncurses window), the library normally does all its output at refresh time.

The main job is to go from the current state of the screen (as represented in the curscr window structure) to the desired new state (as represented in the newscr window structure), while doing as little I/O as possible.

The brains of this operation are the modules hashmap.c, hardscroll.c and lib_doupdate.c; the latter two use lib_mvcur.c. Essentially, what happens looks like this:

  • The hashmap.c module tries to detect vertical motion changes between the real and virtual screens. This information is represented by the oldindex members in the newscr structure. These are modified by vertical-motion and clear operations, and both are re-initialized after each update. To this change-journalling information, the hashmap code adds deductions made using a modified Heckel algorithm on hash values generated from the line contents.

  • The hardscroll.c module computes an optimum set of scroll, insertion, and deletion operations to make the indices match. It calls _nc_mvcur_scrolln() in lib_mvcur.c to do those motions.

  • Then lib_doupdate.c goes to work. Its job is to do line-by-line transformations of curscr lines to newscr lines. Its main tool is the routine mvcur() in lib_mvcur.c. This routine does cursor-movement optimization, attempting to get from given screen location A to given location B in the fewest output characters possible.

If you want to work on screen optimizations, you should use the fact that (in the trace-enabled version of the library) enabling the TRACE_TIMES trace level causes a report to be emitted after each screen update giving the elapsed time and a count of characters emitted during the update. You can use this to tell when an update optimization improves efficiency.

In the trace-enabled version of the library, it is also possible to disable and re-enable various optimizations at runtime by tweaking the variable _nc_optimize_enable. See the file include/curses.h.in for mask values, near the end.

The Forms and Menu Libraries

The forms and menu libraries should work reliably in any environment you can port ncurses to. The only portability issue anywhere in them is what flavor of regular expressions the built-in form field type TYPE_REGEXP will recognize.

The configuration code prefers the POSIX regex facility, modeled on System V's, but will settle for BSD regexps if the former is not available.

Historical note: the panels code was written primarily to assist in porting u386mon 2.0 (comp.sources.misc v14i001-4) to systems lacking panels support; u386mon 2.10 and beyond use it. This version has been slightly cleaned up for ncurses.

A Tour of the Terminfo Compiler

The ncurses implementation of tic is rather complex internally; it has to do a trying combination of missions. This starts with the fact that, in addition to its normal duty of compiling terminfo sources into loadable terminfo binaries, it has to be able to handle termcap syntax and compile that too into terminfo entries.

The implementation therefore starts with a table-driven, dual-mode lexical analyzer (in comp_scan.c). The lexer chooses its mode (termcap or terminfo) based on the first “,” or “:” it finds in each entry. The lexer does all the work of recognizing capability names and values; the grammar above it is trivial, just "parse entries till you run out of file".

Translation of Non-use Capabilities

Translation of most things besides use capabilities is pretty straightforward. The lexical analyzer's tokenizer hands each capability name to a hash function, which drives a table lookup. The table entry yields an index which is used to look up the token type in another table, and controls interpretation of the value.

One possibly interesting aspect of the implementation is the way the compiler tables are initialized. All the tables are generated by various awk/sed/sh scripts from a master table include/Caps; these scripts actually write C initializers which are linked to the compiler. Furthermore, the hash table is generated in the same way, so it doesn't have to be generated at compiler startup time (another benefit of this organization is that the hash table can be in shareable text space).

Thus, adding a new capability is usually pretty trivial, just a matter of adding one line to the include/Caps file. We will have more to say about this in the section on Source-Form Translation.

Use Capability Resolution

The background problem that makes tic tricky is not the capability translation itself, it is the resolution of use capabilities. Older versions would not handle forward use references for this reason (that is, a using terminal always had to follow its use target in the source file). By doing this, they got away with a simple implementation tactic; compile everything as it blows by, then resolve uses from compiled entries.

This will not do for ncurses. The problem is that that the whole compilation process has to be embeddable in the ncurses library so that it can be called by the startup code to translate termcap entries on the fly. The embedded version cannot go promiscuously writing everything it translates out to disk — for one thing, it will typically be running with non-root permissions.

So our tic is designed to parse an entire terminfo file into a doubly-linked circular list of entry structures in-core, and then do use resolution in-memory before writing everything out. This design has other advantages: it makes forward and back use-references equally easy (so we get the latter for free), and it makes checking for name collisions before they are written out easy to do.

And this is exactly how the embedded version works. But the stand-alone user-accessible version of tic partly reverts to the historical strategy; it writes to disk (not keeping in core) any entry with no use references.

This is strictly a core-economy kluge, implemented because the terminfo master file is large enough that some core-poor systems swap like crazy when you compile it all in memory...there have been reports of this process taking three hours, rather than the twenty seconds or less typical on the author's development box.

So. The executable tic passes the entry-parser a hook that immediately writes out the referenced entry if it has no use capabilities. The compiler main loop refrains from adding the entry to the in-core list when this hook fires. If some other entry later needs to reference an entry that got written immediately, that is OK; the resolution code will fetch it off disk when it cannot find it in core.

Name collisions will still be detected, just not as cleanly. The write_entry() code complains before overwriting an entry that postdates the time of tic's first call to write_entry(), Thus it will complain about overwriting entries newly made during the tic run, but not about overwriting ones that predate it.

Source-Form Translation

Another use of tic is to do source translation between various termcap and terminfo formats. There are more variants out there than you might think; the ones we know about are described in the captoinfo(1) manual page.

The translation output code (dump_entry() in ncurses/dump_entry.c) is shared with the infocmp(1) utility. It takes the same internal representation used to generate the binary form and dumps it to standard output in a specified format.

The include/Caps file has a header comment describing ways you can specify source translations for nonstandard capabilities just by altering the master table. It is possible to set up capability aliasing or tell the compiler to plain ignore a given capability without writing any C code at all.

For circumstances where you need to do algorithmic translation, there are functions in parse_entry.c called after the parse of each entry that are specifically intended to encapsulate such translations. This, for example, is where the AIX box1 capability get translated to an acsc string.

Other Utilities

The infocmp utility is just a wrapper around the same entry-dumping code used by tic for source translation. Perhaps the one interesting aspect of the code is the use of a predicate function passed in to dump_entry() to control which capabilities are dumped. This is necessary in order to handle both the ordinary De-compilation case and entry difference reporting.

The tput and clear utilities just do an entry load followed by a tputs() of a selected capability.

Style Tips for Developers

See the TO-DO file in the top-level directory of the source distribution for additions that would be particularly useful.

The prefix _nc_ should be used on library public functions that are not part of the curses API in order to prevent pollution of the application namespace. If you have to add to or modify the function prototypes in curses.h.in, read ncurses/MKlib_gen.sh first so you can avoid breaking XSI conformance. Please join the ncurses mailing list. See the INSTALL file in the top level of the distribution for details on the list.

Look for the string FIXME in source files to tag minor bugs and potential problems that could use fixing.

Do not try to auto-detect OS features in the main body of the C code. That is the job of the configuration system.

To hold down complexity, do make your code data-driven. Especially, if you can drive logic from a table filtered out of include/Caps, do it. If you find you need to augment the data in that file in order to generate the proper table, that is still preferable to ad-hoc code — that is why the fifth field (flags) is there.

Have fun!

Porting Hints

The following notes are intended to be a first step towards DOS and Macintosh ports of the ncurses libraries.

The following library modules are “pure curses”; they operate only on the curses internal structures, do all output through other curses calls (not including tputs() and putp()) and do not call any other UNIX routines such as signal(2) or the stdio library. Thus, they should not need to be modified for single-terminal ports.

lib_addch.c lib_addstr.c lib_bkgd.c lib_box.c lib_clear.c lib_clrbot.c lib_clreol.c lib_delch.c lib_delwin.c lib_erase.c lib_inchstr.c lib_insch.c lib_insdel.c lib_insstr.c lib_keyname.c lib_move.c lib_mvwin.c lib_newwin.c lib_overlay.c lib_pad.c lib_printw.c lib_refresh.c lib_scanw.c lib_scroll.c lib_scrreg.c lib_set_term.c lib_touch.c lib_tparm.c lib_tputs.c lib_unctrl.c lib_window.c panel.c

This module is pure curses, but calls outstr():

lib_getstr.c

These modules are pure curses, except that they use tputs() and putp():

lib_beep.c lib_color.c lib_endwin.c lib_options.c lib_slk.c lib_vidattr.c

This modules assist in POSIX emulation on non-POSIX systems:

sigaction.c
signal calls

The following source files will not be needed for a single-terminal-type port.

alloc_entry.c captoinfo.c clear.c comp_captab.c comp_error.c comp_hash.c comp_main.c comp_parse.c comp_scan.c dump_entry.c infocmp.c parse_entry.c read_entry.c tput.c write_entry.c

The following modules will use open()/read()/write()/close()/lseek() on files, but no other OS calls.

lib_screen.c
used to read/write screen dumps
lib_trace.c
used to write trace data to the logfile

Modules that would have to be modified for a port start here:

The following modules are “pure curses” but contain assumptions inappropriate for a memory-mapped port.

lib_longname.c
assumes there may be multiple terminals
lib_acs.c
assumes acs_map as a double indirection
lib_mvcur.c
assumes cursor moves have variable cost
lib_termcap.c
assumes there may be multiple terminals
lib_ti.c
assumes there may be multiple terminals

The following modules use UNIX-specific calls:

lib_doupdate.c
input checking
lib_getch.c
read()
lib_initscr.c
getenv()
lib_newterm.c
lib_baudrate.c
lib_kernel.c
various tty-manipulation and system calls
lib_raw.c
various tty-manipulation calls
lib_setup.c
various tty-manipulation calls
lib_restart.c
various tty-manipulation calls
lib_tstp.c
signal-manipulation calls
lib_twait.c
gettimeofday(), select().

Eric S. Raymond <esr@snark.thyrsus.com>
(Note: This is not the bug address!) ncurses-6.4-20240113/doc/html/man/0000755000000000000000000000000014550614020014716 5ustar rootrootncurses-6.4-20240113/doc/html/man/curs_insch.3x.html0000644000000000000000000001417214541645310020310 0ustar rootroot curs_insch 3x 2023-12-23 ncurses 6.4 Library calls

curs_insch 3x 2023-12-23 ncurses 6.4 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 using wmove
       and fail if the position (y, x) is outside the window.


NOTES

       A terminal's insert_character  (ich1)  capability  is  not  necessarily
       employed.

       insch, mvinsch, and mvwinsch may be implemented as macros.


PORTABILITY

       X/Open Curses, Issue 4, describes these functions.

       SVr4 describes successful return values only as "an integer value other
       than ERR".


SEE ALSO

       curs_ins_wch(3x) describes comparable functions in  the  wide-character
       curses configuration.

       curses(3x), terminfo(5)



ncurses 6.4                       2023-12-23                    curs_insch(3x)
ncurses-6.4-20240113/doc/html/man/user_caps.5.html0000644000000000000000000005361414550604710017751 0ustar rootroot user_caps 5 2024-01-13 ncurses 6.4 File formats

user_caps 5 2024-01-13 ncurses 6.4 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 the
       Single Unix Specification beginning 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.4                       2024-01-13                      user_caps(5)
ncurses-6.4-20240113/doc/html/man/form_field_new.3x.html0000644000000000000000000001634514530450430021126 0ustar rootroot form_field_new 3x 2023-11-25 ncurses 6.4 Library calls

form_field_new 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                form_field_new(3x)
ncurses-6.4-20240113/doc/html/man/curs_refresh.3x.html0000644000000000000000000002420114546123512020634 0ustar rootroot curs_refresh 3x 2024-01-05 ncurses 6.4 Library calls

curs_refresh 3x 2024-01-05 ncurses 6.4 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.

       X/Open does not define any error conditions.  In this implementation

          wnoutrefresh
               returns  an  error  if  the  window  pointer is null, or if the
               window is really a pad.

          wredrawln
               returns an error if the associated call to touchln  returns  an
               error.


NOTES

       Note that refresh and redrawwin may be macros.


PORTABILITY

       The XSI Curses standard, Issue 4 describes these functions.

       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.4                       2024-01-05                  curs_refresh(3x)
ncurses-6.4-20240113/doc/html/man/mitem_new.3x.html0000644000000000000000000001402714530450431020127 0ustar rootroot mitem_new 3x 2023-11-25 ncurses 6.4 Library calls

mitem_new 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                     mitem_new(3x)
ncurses-6.4-20240113/doc/html/man/curs_opaque.3x.html0000644000000000000000000002466014537426147020513 0ustar rootroot curs_opaque 3x 2023-12-16 ncurses 6.4 Library calls

curs_opaque 3x 2023-12-16 ncurses 6.4 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.4                       2023-12-16                   curs_opaque(3x)
ncurses-6.4-20240113/doc/html/man/curs_insstr.3x.html0000644000000000000000000002114414530450426020523 0ustar rootroot curs_insstr 3x 2023-11-25 ncurses 6.4 Library calls

curs_insstr 3x 2023-11-25 ncurses 6.4 Library calls

curs_insstr(3x)                  Library calls                 curs_insstr(3x)




NAME

       insstr,  insnstr,  winsstr,  winsnstr,  mvinsstr, mvinsnstr, mvwinsstr,
       mvwinsnstr - insert a string in a curses window


SYNOPSIS

       #include <curses.h>
       int insstr(const char *str);
       int insnstr(const char *str, int n);
       int winsstr(WINDOW *win, const char *str);
       int winsnstr(WINDOW *win, const char *str, int n);

       int mvinsstr(int y, int x, const char *str);
       int mvinsnstr(int y, int x, const char *str, int n);
       int mvwinsstr(WINDOW *win, int y, int x, const char *str);
       int mvwinsnstr(WINDOW *win, int y, int x, const char *str, int n);


DESCRIPTION

       These routines insert a character string (as many  characters  as  will
       fit  on  the line) before the character under the cursor, as if calling
       winsch(3x).  All characters to the right  of  the  cursor  are  shifted
       right,  with  the  possibility  of the rightmost characters on the line
       being lost.  No wrapping is performed.

       The cursor  position  does  not  change  (after  moving  to  y,  x,  if
       specified).

       The functions with n as the last argument insert a leading substring of
       at most n characters.  If n is less than zero,  the  entire  string  is
       inserted (stopping on a NUL character).

       Special characters are handled as in waddch(3x).


RETURN VALUE

       All functions return the integer ERR upon failure and OK on success.

       X/Open  does  not  define  any  error  conditions.  This implementation
       returns an error

       o   if the win parameter is null or

       o   if the str parameter is null or

       o   the winsch(3x) function returns an error.

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove(3x),  and  return an error if the position is outside the window,
       or if the window pointer is null.


NOTES

       All but winsnstr may be macros.


PORTABILITY

       These functions are described in the  XSI  Curses  standard,  Issue  4,
       which adds const qualifiers to the arguments.

       The  Single  Unix  Specification,  Version  2  states  that insnstr and
       winsnstr perform wrapping.  This is probably an error, since  it  makes
       this  group  of  functions  inconsistent.   Also,  no implementation of
       curses documents this inconsistency.

       X/Open 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, and differs from the  SVr4  and  X/Open  implementations  on
       Solaris.


SEE ALSO

       curses(3x), curs_inch(3x), curs_ins_wstr(3x), curs_util(3x)



ncurses 6.4                       2023-11-25                   curs_insstr(3x)
ncurses-6.4-20240113/doc/html/man/curs_get_wch.3x.html0000644000000000000000000002450014541645310020620 0ustar rootroot curs_get_wch 3x 2023-12-23 ncurses 6.4 Library calls

curs_get_wch 3x 2023-12-23 ncurses 6.4 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


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 wch);


DESCRIPTION


wget_wch

       The get_wch, wget_wch,  mvget_wch,  and  mvwget_wch  functions  read  a
       character  from  the  terminal associated with the current or specified
       window.  In no-delay mode, if no input is waiting,  the  value  ERR  is
       returned.   In  delay  mode,  the program waits until the system passes
       text through to the program.  Depending on the setting of cbreak,  this
       is  after  one  character  (cbreak  mode),  or  after the first newline
       (nocbreak mode).  In half-delay mode, the program waits until the  user
       types a character or the specified timeout interval has elapsed.

       Unless  noecho has been set, these routines echo the character into the
       designated window.

       If the window is not a pad and has been moved  or  modified  since  the
       last call to wrefresh, wrefresh will be called before another character
       is read.

       If keypad is enabled, these functions respond  to  the  pressing  of  a
       function  key  by  setting  the object pointed to by wch to the keycode
       assigned to  the  function  key,  and  returning  KEY_CODE_YES.   If  a
       character  (such  as  escape) that could be the beginning of a function
       key is received, curses sets a timer.  If the remainder of the sequence
       does  arrive  within  the  designated  time,  curses passes through the
       character; otherwise, curses returns the function key value.  For  this
       reason,  many  terminals  experience  a  delay  between the time a user
       presses the escape key and the time  the  escape  is  returned  to  the
       program.

       The keycodes returned by these functions are the same as those returned
       by wgetch:

       o   The predefined function keys are listed  in  <curses.h>  as  macros
           with  values  outside  the  range of 8-bit characters.  Their names
           begin with KEY_.

       o   Other (user-defined) function  keys  which  may  be  defined  using
           define_key(3x)  have no names, but also are expected to have values
           outside the range of 8-bit characters.


unget_wch

       The unget_wch function pushes the wide character wch back onto the head
       of  the input queue, so the wide character is returned by the next call
       to get_wch.  The pushback of  one  character  is  guaranteed.   If  the
       program  calls  unget_wch too many times without an intervening call to
       get_wch, the operation may fail.

       Unlike  ungetch  and  wgetch,  unget_wch  cannot  distinguish   special
       characters   returned   by   wget_wch  from  ordinary  characters.   An
       application can push special keys which it may  read  via  wget_wch  by
       checking  for  the  KEY_CODE_YES  result,  and  using ungetch for those
       special keys.


RETURN VALUE

       When   get_wch,   wget_wch,   mvget_wch,   and   mvwget_wch   functions
       successfully  report  the  pressing  of  a  function  key,  they return
       KEY_CODE_YES.  When they successfully report  a  wide  character,  they
       return OK.  Otherwise, they return ERR.

       Upon  successful  completion,  unget_wch  returns  OK.   Otherwise, the
       function returns ERR.

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       Applications should not define the escape key by itself  as  a  single-
       character function.

       When  using  get_wch,  wget_wch, mvget_wch, or mvwget_wch, applications
       should not use nocbreak mode and echo mode at the same time.  Depending
       on  the  state  of  the  tty  driver  when each character is typed, the
       program may produce undesirable results.

       All of these functions except wget_wch and unget_wch may be implemented
       as macros.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.


SEE ALSO

       curses(3x),    curs_getch(3x),    curs_inopts(3x),    curs_ins_wch(3x),
       curs_move(3x), curs_refresh(3x)



ncurses 6.4                       2023-12-23                  curs_get_wch(3x)
ncurses-6.4-20240113/doc/html/man/curs_scroll.3x.html0000644000000000000000000001607614537711242020512 0ustar rootroot curs_scroll 3x 2023-12-16 ncurses 6.4 Library calls

curs_scroll 3x 2023-12-16 ncurses 6.4 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 blank
       characters; see bkgd(3x) or 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 scroll  stdscr  or  the  specified  window  up  or  down
       depending on 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).

       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

       Unusually,  there  is  no wscroll function; scroll behaves as one would
       expect wscroll to, accepting a WINDOW pointer argument.

       scrl and scroll may be implemented as macros.


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  will occur, to leave open the possibility of smarter optimization
       of multiple scroll actions on the next update.

       Neither SVr4 curses nor  X/Open  Curses  specify  whether  the  current
       attribute  or  current  color  pair  of  blanks generated by the scroll
       function are zeroed.  ncurses does so.


SEE ALSO

       curses(3x), curs_outopts(3x)



ncurses 6.4                       2023-12-16                   curs_scroll(3x)
ncurses-6.4-20240113/doc/html/man/form_new_page.3x.html0000644000000000000000000001245714530450430020757 0ustar rootroot form_new_page 3x 2023-11-25 ncurses 6.4 Library calls

form_new_page 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                 form_new_page(3x)
ncurses-6.4-20240113/doc/html/man/form_fieldtype.3x.html0000644000000000000000000002551714530450430021160 0ustar rootroot form_fieldtype 3x 2023-11-25 ncurses 6.4 Library calls

form_fieldtype 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                form_fieldtype(3x)
ncurses-6.4-20240113/doc/html/man/menu.3x.html0000644000000000000000000003356714541645312017127 0ustar rootroot menu 3x 2023-12-23 ncurses 6.4 Library calls

menu 3x 2023-12-23 ncurses 6.4 Library calls

menu(3x)                         Library calls                        menu(3x)




NAME

       menu - curses extension for programming menus


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.4                       2023-12-23                          menu(3x)
ncurses-6.4-20240113/doc/html/man/tabs.1.html0000644000000000000000000003342214550576013016711 0ustar rootroot tabs 1 2023-12-23 ncurses 6.4 User commands

tabs 1 2023-12-23 ncurses 6.4 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  provide the capability for changing their left/right
       margins.  The tabs program has an option to use this feature:

       +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  width  for
                tab-stops.

            o   If the terminal does not provide the margin capabilities, tabs
                imitates the effect, putting the tab stops at the  appropriate
                place  on  each  line.   The  terminal's  left-margin  is  not
                modified.

            If the margin parameter is omitted, the default is 10.  Use +m0 to
            reset  the  left  margin, i.e., to the left edge of the terminal's
            display.  Before setting a left-margin, tabs resets the margin  to
            reduce  problems which might arise on moving the cursor before the
            current left-margin.

       When setting or resetting the left-margin, tabs may  reset  the  right-
       margin.


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  smgl   (set_left_margin)   or   smglp   (set_left_margin_parm)
           capability needed to support the feature.

       o   There  is no counterpart in X/Open Curses Issue 7 for this utility,
           unlike tput(1).

       The -d (debug) and -n (no-op) options are 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 a "-n" option to set the first tab stop at the
       left margin.  That option is not documented by POSIX.

       The PWB/Unix tabs utility returned  in  System  III  (1980),  and  used
       built-in  tables  rather than the terminal database, to support a half-
       dozen hardcopy terminal (printer) types.  It also had built-in logic to
       support  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.  In an earlier development effort, the  tab  stop
       initialization  provided  by  tset(1)  (1982),  and  incorporated  into
       tput(1) uses the terminal database,

       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 tabs 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  tabs  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.

       Nevertheless,  the  feature  described  in  subsection "Explicit Lists"
       above was implemented in PWB/Unix, and permits the setting of  abitrary
       tab stops.


SEE ALSO

       infocmp(1m), tset(1), curses(3x), terminfo(5)



ncurses 6.4                       2023-12-23                           tabs(1)
ncurses-6.4-20240113/doc/html/man/captoinfo.1m.html0000644000000000000000000003245714550576010020123 0ustar rootroot captoinfo 1m 2023-12-23 ncurses 6.4 User commands

captoinfo 1m 2023-12-23 ncurses 6.4 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  (SVr4/XSI  Curses)  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.

                     Name
              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 Name            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    XSI
                                    -------------
                                    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.4                       2023-12-23                     captoinfo(1m)
ncurses-6.4-20240113/doc/html/man/form_field_validation.3x.html0000644000000000000000000003040414537426150022470 0ustar rootroot form_field_validation 3x 2023-12-16 ncurses 6.4 Library calls

form_field_validation 3x 2023-12-16 ncurses 6.4 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.4                       2023-12-16         form_field_validation(3x)
ncurses-6.4-20240113/doc/html/man/curs_kernel.3x.html0000644000000000000000000003334414546123512020466 0ustar rootroot curs_kernel 3x 2024-01-05 ncurses 6.4 Library calls

curs_kernel 3x 2024-01-05 ncurses 6.4 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, ripoffline, curs_set,  napms  -  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 ripoffline(int line, int (*init)(WINDOW *, int));
       int curs_set(int visibility);
       int napms(int ms);


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

       The getsyx routine returns  the  current  coordinates  of  the  virtual
       screen  cursor in y and x.  If leaveok is currently TRUE, then -1,-1 is
       returned.  If lines have been removed from the top of the screen, using
       ripoffline,  y  and x include these lines; therefore, y and x should be
       used only as arguments for setsyx.

       Few applications will use this feature, most use getyx instead.


setsyx

       The setsyx routine sets the virtual screen cursor to y, x.  If y and  x
       are  both  -1, then leaveok is set.  The two routines getsyx and setsyx
       are designed to be used by a library routine, which manipulates  curses
       windows  but  does  not  want  to  change  the  current position of the
       program's cursor.   The  library  routine  would  call  getsyx  at  the
       beginning, do its manipulation of its own windows, do a wnoutrefresh on
       its windows, call setsyx, and then call doupdate.

       Few applications will use this feature, most use wmove instead.


ripoffline

       The ripoffline routine  provides  access  to  the  same  facility  that
       slk_init  [see  curs_slk(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.


curs_set

       The curs_set routine sets the cursor state  to  invisible,  normal,  or
       very  visible  for visibility equal to 0, 1, or 2 respectively.  If the
       terminal supports the visibility requested, the previous  cursor  state
       is returned; otherwise, ERR is returned.


napms

       The  napms  routine is used to sleep for ms milliseconds.  If the value
       of ms exceeds 30,000 (thirty seconds), it is capped at that value.


RETURN VALUE

       Except for curs_set, these routines always return OK.

       curs_set returns the previous cursor state, or  ERR  if  the  requested
       visibility is not supported.

       X/Open defines no error conditions.  In this implementation

       def_prog_mode, def_shell_mode, reset_prog_mode, reset_shell_mode
            return an error if the terminal was not initialized, or if the I/O
            call to obtain the terminal settings fails.

       ripoffline
            returns an error if the maximum number of ripped-off lines exceeds
            the maximum (5).


NOTES

       Note that getsyx is a macro, so & is not necessary before the variables
       y and x.

       Older SVr4 man pages  warn  that  the  return  value  of  curs_set  "is
       currently incorrect".  This implementation gets it right, but it may be
       unwise to count on the correctness of the return value anywhere else.

       Both ncurses and SVr4 will call curs_set in endwin if curs_set has been
       called  to make the cursor other than normal, i.e., either invisible or
       very visible.  There is no way for ncurses  to  determine  the  initial
       cursor state to restore that.


PORTABILITY

       The virtual screen functions setsyx and getsyx are not described in the
       XSI Curses standard, Issue 4.  All other functions are as described  in
       XSI Curses.

       The  SVr4  documentation  describes  setsyx and getsyx as having return
       type int.  This is misleading, as they are macros  with  no  documented
       semantics for the return value.

       If interrupted, ncurses restarts napms.  That, and the limitation to 30
       seconds, are different 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.4                       2024-01-05                   curs_kernel(3x)
ncurses-6.4-20240113/doc/html/man/legacy_coding.3x.html0000644000000000000000000001322014537426151020735 0ustar rootroot legacy_coding 3x 2023-12-16 ncurses 6.4 Library calls

legacy_coding 3x 2023-12-16 ncurses 6.4 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

       The  use_legacy_coding  function is an extension to the curses library.
       It allows the caller to change  the  result  of  unctrl,  and  suppress
       related checks within the library that would normally cause nonprinting
       characters to be rendered in visible form.   This  affects  only  8-bit
       characters.

       The level parameter controls the result:

              0    the   library  functions  normally,  rendering  nonprinting
                   characters as described in unctrl.

              1    the  library  ignores  isprintf  for  codes  in  the  range
                   160-255.

              2    the  library  ignores  isprintf  for  codes  in  the  range
                   128-255.  It also modifies the output  of  unctrl,  showing
                   codes in the range 128-159 as is.


RETURN VALUE

       If  the  screen has not been initialized, or the level parameter is out
       of range, the function returns ERR.  Otherwise, it returns the previous
       level: 0, 1 or 2.


PORTABILITY

       This  routine  is specific to ncurses.  It was not supported on Version
       7, BSD or System V implementations.  It is recommended  that  any  code
       depending on ncurses extensions be conditioned using NCURSES_VERSION.


AUTHORS

       Thomas Dickey (to support lynx's font-switching feature).


SEE ALSO

       unctrl(3x)



ncurses 6.4                       2023-12-16                 legacy_coding(3x)
ncurses-6.4-20240113/doc/html/man/terminfo.5.html0000644000000000000000000055116214550614020017604 0ustar rootroot terminfo 5 2024-01-13 ncurses 6.4 File formats

terminfo 5 2024-01-13 ncurses 6.4 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 manual describes ncurses version 6.4 (patch 20240113).


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

       The following is a complete table of the  capabilities  included  in  a
       terminfo  description  block  and available to terminfo-using code.  In
       each line of the table,

       o   The variable is the name by which the programmer (at  the  terminfo
           level) accesses the capability.

       o   The  capname  (Cap-name)  is the short name used in the text of the
           database, and is used by a person updating the database.

           Whenever possible, capnames are chosen to be the same as or similar
           to  the  ANSI X3.64-1979 standard (now superseded by ECMA-48, which
           uses identical or very similar names).  Semantics are also intended
           to match those of the specification.

           Capability  names  have no hard length limit, but an informal limit
           of 5 characters has been adopted to keep them short  and  to  allow
           the tabs in the source file Caps to line up nicely.

       o   The   termcap   (Tcap)  code  is  the  old  capability  name  (some
           capabilities  are  new,  and  have  names  which  termcap  did  not
           originate).

       o   Finally,  the description field attempts to convey the semantics of
           the capability.

       You may find some codes in the description field:

       (P)    indicates that padding may be specified

       #[1-9] in the description field indicates that  the  string  is  passed
              through tparm(3x) with parameters as given (#i).

              If  no  parameters  are  listed  in the description, passing the
              string through tparm(3x) may give unexpected results,  e.g.,  if
              it contains percent (%%) signs.

       (P*)   indicates  that  padding may vary in proportion to the number of
              lines affected

       (#i)   indicates the ith parameter.

                                     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. (ML is 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 row, 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 row.  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 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 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 row 3 and column 12, needs to  be
       sent  \E&a12c03Y  padded for 6 milliseconds.  The order of the rows and
       columns is inverted here, and the row 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 row and column sent preceded by
       a ^T, with the row and column simply encoded in binary,
              cup=^T%p1%c%p2%c

       Terminals which use "%c" need  to  be  able  to  backspace  the  cursor
       (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 row and column offset by
       a blank character, thus
              cup=\E=%p1%' '%+%c%p2%' '%+%c

       After sending "\E=", this pushes the first parameter, pushes the  ASCII
       value  for  a  space  (32),  adds them (pushing the sum on the stack in
       place of  the  two  previous  values)  and  outputs  that  value  as  a
       character.   Then  the  same  is  done  for the second parameter.  More
       complex arithmetic is possible using the stack.


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 row 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 rows 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 XSI 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 n characters, 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  row).   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
           characters 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 the XSI Curses standard.  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 cancelled
       ncv.  If italics should work with colors, then the ncv  value  must  be
       specified, even if it is zero.

       Different  commercial  ports  of  terminfo and curses support different
       subsets of XSI 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 XSI
       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.4                       2024-01-13                       terminfo(5)
ncurses-6.4-20240113/doc/html/man/curs_scanw.3x.html0000644000000000000000000003037614550576011020324 0ustar rootroot curs_scanw 3x 2023-12-23 ncurses 6.4 Library calls

curs_scanw 3x 2023-12-23 ncurses 6.4 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 with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and fail if the position is outside the window.


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.4                       2023-12-23                    curs_scanw(3x)
ncurses-6.4-20240113/doc/html/man/infocmp.1m.html0000644000000000000000000007727714550604706017611 0ustar rootroot infocmp 1m 2024-01-13 ncurses 6.4 User commands

infocmp 1m 2024-01-13 ncurses 6.4 User commands

infocmp(1m)                      User commands                     infocmp(1m)




NAME

       infocmp - compare or print out terminfo descriptions


SYNOPSIS

       infocmp [-1cCdDeEFgGiIKlLnpqrtTuUVWx]
             [-v n] [-s d| i| l| c] [-Q n] [-R subset]
             [-w width] [-A directory] [-B directory]
             [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  cancelled
       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  cancelled
                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, -E, -F, -G, -Q, -R, -T, -V, -a, -e, -f, -g, -i, -l, -p,  -q
       and -t options are not supported in SVr4 curses.

       SVr4   infocmp  does  not  distinguish  between  absent  and  cancelled
       capabilities.  Also, it shows missing integer capabilities as  -1  (the
       internal   value   used   to   represent   missing   integers).    This
       implementation shows those as  "NULL",  for  consistency  with  missing
       strings.

       The  -r  option's  notion of "termcap" capabilities is System V Release
       4's.  Actual BSD curses versions will have a more restricted  set.   To
       see only the 4.4BSD set, use -r -RBSD.


PORTABILITY

       X/Open  Curses,  Issue  7 (2009) provides a description of infocmp.  It
       does not mention the options used for converting to termcap format.


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.4                       2024-01-13                       infocmp(1m)
ncurses-6.4-20240113/doc/html/man/curs_initscr.3x.html0000644000000000000000000004551414541645310020663 0ustar rootroot curs_initscr 3x 2023-12-23 ncurses 6.4 Library calls

curs_initscr 3x 2023-12-23 ncurses 6.4 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 is normally the first curses routine to call when  initializing
       a  program.   A few special routines sometimes need to be called before
       it; these are slk_init(3x), filter, ripoffline, use_env.  For multiple-
       terminal applications, newterm may be called before initscr.

       The  initscr  code  determines  the  terminal  type and initializes all
       curses  data  structures.   initscr  also  causes  the  first  call  to
       refresh(3x)  to  clear  the screen.  If errors occur, initscr writes an
       appropriate error message to standard error  and  exits;  otherwise,  a
       pointer is returned to stdscr.


newterm

       A program that outputs to more than one terminal should use the newterm
       routine for each terminal instead of initscr.  A program that needs  to
       inspect capabilities, so it can continue to run in a line-oriented mode
       if the terminal cannot support a screen-oriented  program,  would  also
       use newterm.

       The  routine  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.  newterm's arguments are

       o   the type of the terminal to be used in place of $TERM,

       o   an output stream connected to the terminal, and

       o   an input stream connected to the terminal

       If the type parameter is NULL, $TERM will be used.

       The  file  descriptor  of the output stream is passed to setupterm(3x),
       which returns a pointer to  a  TERMINAL  structure.   newterm's  return
       value holds a pointer to the TERMINAL structure.


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  or  escaping  from
       curses mode temporarily.  This routine

       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   stops  cursor-addressing  mode  using  the  exit_ca_mode   terminal
           capability,

       o   restores tty modes (see reset_shell_mode(3x)).

       Calling refresh(3x) or doupdate(3x) after a temporary escape causes the
       program to resume visual mode.


isendwin

       The isendwin routine returns TRUE if endwin has been called without any
       subsequent calls to wrefresh, and FALSE otherwise.


set_term

       The  set_term  routine  is  used to switch between different terminals.
       The screen  reference  new  becomes  the  new  current  terminal.   The
       previous terminal is returned by the routine.  This is the only routine
       which manipulates SCREEN pointers; all other routines affect  only  the
       current terminal.


delscreen

       The  delscreen  routine  frees  storage associated with the SCREEN data
       structure.  The endwin routine does not do this, so delscreen should be
       called after endwin if a particular SCREEN is no longer needed.


RETURN VALUE

       endwin  returns  the  integer  ERR  upon failure and OK upon successful
       completion.

       Routines that return pointers always return NULL on error.

       X/Open defines no error conditions.  In this implementation

       o   endwin returns an error if

           o   the terminal was not initialized, or

           o   endwin is called more than once without updating the screen, or

           o   reset_shell_mode(3x) returns an error.

       o   newterm returns an error if it cannot allocate the data  structures
           for  the  screen,  or  for the top-level windows within the screen,
           i.e., curscr, newscr, or stdscr.

       o   set_term returns no error.


PORTABILITY

       These functions were described in the XSI Curses standard, Issue 4.  As
       of 2015, the current document is X/Open Curses, Issue 7.


Differences

       X/Open  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 XSI 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.

       For example

       o   NetBSD's  baudrate(3x)  function  uses  the descriptor in TERMINAL.
           ncurses and SVr4 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 cleanup 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 which is later tested in wgetch(3x).  If keypad has  been
            enabled  for  the  corresponding  window,  wgetch  returns the key
            symbol KEY_RESIZE.  At the same time, wgetch 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.4                       2023-12-23                  curs_initscr(3x)
ncurses-6.4-20240113/doc/html/man/menu_format.3x.html0000644000000000000000000001413714530450430020460 0ustar rootroot menu_format 3x 2023-11-25 ncurses 6.4 Library calls

menu_format 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                   menu_format(3x)
ncurses-6.4-20240113/doc/html/man/curs_clear.3x.html0000644000000000000000000002114714546123511020271 0ustar rootroot curs_clear 3x 2024-01-05 ncurses 6.4 Library calls

curs_clear 3x 2024-01-05 ncurses 6.4 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 an error 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 the XSI Curses standard, 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.4                       2024-01-05                    curs_clear(3x)
ncurses-6.4-20240113/doc/html/man/curs_add_wch.3x.html0000644000000000000000000005331014550604704020574 0ustar rootroot curs_add_wch 3x 2024-01-13 ncurses 6.4 Library calls

curs_add_wch 3x 2024-01-13 ncurses 6.4 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 and advance 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


add_wch

       The add_wch, wadd_wch, mvadd_wch,  and  mvwadd_wch  functions  put  the
       complex  character  wch  into the given window at its current position,
       which is then advanced.  These functions perform wrapping and  special-
       character processing as follows:

       o   If  wch  refers to a spacing character, then any previous character
           at that location is removed.  A new character specified by  wch  is
           placed  at  that  location  with  rendition  specified by wch.  The
           cursor then advances after this spacing character, to  prepare  for
           writing the next character on the screen.

           The newly added spacing character is the base of the active complex
           character.  Subsequent non-spacing characters can be combined  with
           this base until another spacing character is written to the screen,
           or the cursor is moved, e.g., using wmove.

       o   If wch refers to a non-spacing character, it  is  appended  to  the
           active complex character, retaining the previous characters at that
           location.  The rendition specified by wch is ignored.

           The cursor is not advanced after adding  a  non-spacing  character.
           Subsequent calls to add non-spacing characters will update the same
           position.

       o   If the character part of wch is a tab, newline, backspace or  other
           control character, the window is updated and the cursor moves as if
           addch were called.


echo_wchar

       The echo_wchar function is functionally equivalent to a call to add_wch
       followed  by  a  call  to  refresh(3x).   Similarly, the wecho_wchar is
       functionally equivalent to a call to wadd_wch followed  by  a  call  to
       wrefresh.   The  knowledge that only a single character is being output
       is  taken  into  consideration  and,  for  non-control  characters,   a
       considerable  performance  gain  might  be  seen  by  using  the *echo*
       functions instead of their equivalents.


Line Graphics

       Like addch(3x), addch_wch accepts symbols which make it simple to  draw
       lines  and  other  frequently  used  special characters.  These symbols
       correspond to the same VT100 line-drawing set as addch(3x).

                       Unicode   ASCII     acsc


       ACS Name        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

       All routines return the integer ERR upon failure and OK on success.

       X/Open does not  define  any  error  conditions.   This  implementation
       returns an error

       o   if the window pointer is null or

       o   if it is not possible to add a complete character in the window.

       The latter may be due to different causes:

       o   If  scrollok(3x)  is  not enabled, writing a character at the lower
           right margin succeeds.  However, an error is returned because it is
           not possible to wrap to a new line.

       o   If  an error is detected when converting a multibyte character to a
           sequence of bytes, or if it is not  possible  to  add  all  of  the
           resulting bytes in the window, an error is returned.

       Functions  with  a  "mv"  prefix  first perform a cursor movement using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       Note that add_wch, mvadd_wch, mvwadd_wch, and echo_wchar may be macros.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.  The
       defaults specified for  line-drawing  characters  apply  in  the  POSIX
       locale.


WACS Symbols

       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 define symbols for thick- or double-lines.  SVr4
       curses  implementations  defined their line-drawing symbols in terms of
       intermediate  symbols.   This  implementation  extends  those  symbols,
       providing new definitions which are not in the SVr4 implementations.

       Not  all  Unicode-capable  terminals  provide  support  for VT100-style
       alternate character  sets  (i.e.,  the  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).   The  X/Open Curses description does not mention
       this possibility, describing only the cases  where  wch  is  a  spacing
       character or a non-spacing character.

       This implementation assumes that wch is constructed using setcchar(3x),
       and in turn that the result

       o   contains at most one spacing character in the beginning of its list
           of wide characters, and zero or more non-spacing characters or

       o   may hold one non-spacing character.

       In  the  latter  case,  ncurses  adds  the non-spacing character to the
       active (base) spacing character.


SEE ALSO

       curses(3x),     curs_addch(3x),     curs_attr(3x),      curs_clear(3x),
       curs_getcchar(3x), curs_outopts(3x), curs_refresh(3x), putwc(3)



ncurses 6.4                       2024-01-13                  curs_add_wch(3x)
ncurses-6.4-20240113/doc/html/man/ncurses.3x.html0000644000000000000000000033711414550604707017643 0ustar rootroot ncurses 3x 2024-01-13 ncurses 6.4 Library calls

ncurses 3x 2024-01-13 ncurses 6.4 Library calls

ncurses(3x)                      Library calls                     ncurses(3x)




NAME

       ncurses - character-cell terminal interface with optimized output


SYNOPSIS

       #include <curses.h>


DESCRIPTION

       The  ncurses  library  routines  give  the  user a terminal-independent
       method of updating  character  screens  with  reasonable  optimization.
       This  implementation  is  "new  curses"  (ncurses)  and is the approved
       replacement for 4.4BSD classic curses,  which  has  been  discontinued.
       This describes ncurses version 6.4 (patch 20240113).

       The  ncurses  library emulates the curses library of System V Release 4
       Unix ("SVr4"), and XPG4 (X/Open Portability Guide) curses  (also  known
       as  XSI  curses).   XSI  stands for X/Open System Interfaces Extension.
       The ncurses library is freely redistributable in source form.

       ncurses man pages employ several sections to clarify matters  of  usage
       and interoperability with other curses implementations.

       o   "NOTES"  describes  matters  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 that will be significant 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  to
           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 program using these  routines  must  be  linked  with  the  -lncurses
       option,  or  (if  it  has  been  generated)  with the debugging library
       -lncurses_g.  (Your system integrator may  also  have  installed  these
       libraries  under  the  names  -lcurses  and -lcurses_g.)  The ncurses_g
       library generates trace logs (in a file called "trace" in  the  current
       directory)  that  describe  curses  actions.   See  section  "ALTERNATE
       CONFIGURATIONS" below.

       The  ncurses  package  supports:  overall  screen,   window   and   pad
       manipulation;  output  to  windows  and  pads;  reading terminal input;
       control over terminal and curses input and output options;  environment
       query  routines;  color  manipulation; use of soft label keys; terminfo
       capabilities; and access to low-level terminal-manipulation routines.


Initialization

       The library uses the locale which the calling program has  initialized.
       That is normally done with setlocale(3):

           setlocale(LC_ALL, "");

       If  the  locale is not initialized, the library assumes that characters
       are printable as in ISO-8859-1, to work with certain  legacy  programs.
       You  should  initialize  the locale and not rely on specific details of
       the library when the locale has not been setup.

       The function initscr or  newterm  must  be  called  to  initialize  the
       library  before  any  of  the other routines that deal with windows and
       screens are  used.   The  routine  endwin(3x)  must  be  called  before
       exiting.

       To  get  character-at-a-time  input  without echoing (most interactive,
       screen oriented programs want this), the following sequence  should  be
       used:

           initscr(); cbreak(); noecho();

       Most programs would additionally use the sequence:

           intrflush(stdscr, FALSE);
           keypad(stdscr, TRUE);

       Before a curses program is run, the tab stops of the terminal should be
       set and its initialization strings, if defined, must be  output.   This
       can  be  done  by  executing  the  tput  init  command  after the shell
       environment variable TERM has been exported.   (The  BSD-style  tset(1)
       utility  also  performs  this  function.)   See  subsection  "Tabs  and
       Initialization" of terminfo(5).


Overview

       A curses library abstracts the terminal screen by representing  all  or
       part  of it as a WINDOW data structure.  A window is a rectangular grid
       of character cells, addressed by row 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.  (See panel(3x)
       if you desire this.)  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  output  operation  will  occur.
       Among those, the most basic are move(3x) and addch(3x): these place the
       cursor and write a character  to  stdscr,  respectively.   As  a  rule,
       window-addressing  functions  feature  names  prefixed (or infixed, see
       below) with "w"; these allow the user to specify a pointer to a WINDOW.
       Counterparts  not  thus  prefixed  (or infixed) affect stdscr.  Because
       moving the cursor prior to  another  operation  is  so  common,  curses
       generally  also provides functions with a "mv" prefix as a convenience.
       Thus, the library defines all of addch, waddch, mvaddch, and  mvwaddch.
       When  both  prefixes  are  present,  the order of arguments is a WINDOW
       pointer first, then a y and x coordinate pair.

       Updating  the  terminal  screen  with  every  curses  call  can   cause
       unpleasant  flicker or inefficient use of the communications channel to
       the device.  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.   ncurses optimizes its output by computing a minimal number 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 windows
       that  are  not constrained to the size of the terminal screen and whose
       contents need not be completely displayed.  See curs_pad(3x).

       In addition to drawing characters on the screen,  rendering  attributes
       and  colors may be supported, causing the characters to show up in such
       modes as underlined, in reverse video, or in color  on  terminals  that
       support such display enhancements.  See curs_attr(3x).

       curses  predefines  constants for a small set of line-drawing and other
       graphics corresponding to the DEC  Alternate  Character  Set  (ACS),  a
       feature of VT100 and other terminals.  See waddch(3x) and wadd_wch(3x).

       curses  is  implemented  using  the operating system's terminal driver;
       keystroke events are received not as scan codes but as byte  sequences.
       Graphical  keycaps  (alphanumeric  and punctuation keys, and the space)
       appear  as-is.   Everything  else,  including  the  tab,  enter/return,
       keypad,  arrow,  and function keys, appears as a control character or a
       multibyte escape sequence.  curses translates  these  into  unique  key
       codes.  See getch(3x).


Effects of GUIs and Environment Variables

       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  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  experimental  type
       descriptions  or  when  write  permission to /usr/share/terminfo is not
       available.

       See section "ENVIRONMENT" below.


Naming Conventions

       Many curses functions have two or more versions.  Those  prefixed  with
       "w"  require  a  window  argument.   Four  functions  prefixed with "p"
       require a pad argument.  Those without a prefix  generally  operate  on
       stdscr.

       In  function  synopses,  ncurses man pages apply the following names to
       parameters.

                        bf    bool (TRUE or FALSE)
                        win   pointer to WINDOW
                        pad   pointer to WINDOW that is a pad


Wide and Non-wide Character Configurations

       This manual page describes 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 in a chtype datum, which is often an alias of int.

                 Attributes alone (with no  corresponding  character)  can  be
                 stored  in  variables  of  chtype  or attr_t type.  In either
                 case, they are represented as an integral bit mask.

                 Each cell of a WINDOW is stored as a chtype.

       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 adds about one third more
                 calls  using  additional  data  types  that  can  store  such
                 multibyte characters.

                 cchar_t  corresponds to the non-wide configuration's  chtype.
                          It  always  a structure type, because it stores more
                          data than fits into an integral type.   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).   Attributes  and
                          color  data  are  stored  in  separate fields of the
                          structure, not combined as in chtype.

                 Each cell of a WINDOW is stored as a cchar_t.

                 The  setcchar(3x)  and  getcchar(3x)  functions   store   and
                 retrieve the data from a cchar_t structure.  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.

                 The   wide   library   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.

                 This  convention  is  inapplicable  to some non-wide function
                 names,  so  other  transformations  are  used  for  the  wide
                 configuration: in the window background management functions,
                 "bkgd"  becomes  "bkgrnd";  the  window  border-drawing   and
                 -clearing functions are suffixed with "_set".


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_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_terminfo(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_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_tioctl               curs_util(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)

       Depending on the configuration, additional sets  of  functions  may  be
       available:

          curs_memleaks(3x) - curses memory-leak checking

          curs_sp_funcs(3x) - curses screen-pointer extension

          curs_threads(3x) - curses thread support

          curs_trace(3x) - curses debugging routines


RETURN VALUE

       Unless  otherwise  noted, functions that return an integer return OK on
       success and ERR on failure.  Functions that return pointers return NULL
       on  failure.   Typically,  ncurses  treats  a  null pointer passed as a
       function parameter as a failure.

       Functions with a "mv" prefix first perform cursor movement using  wmove
       and  fail  if  the  position  is  outside  the  window,  or  (for "mvw"
       functions) if the WINDOW pointer is null.


ENVIRONMENT

       The following  environment  symbols  are  useful  for  customizing  the
       runtime  behavior of the ncurses library.  The most important ones have
       been already discussed in detail.


CC (command character)

       When set, change the  command_character  (cmdch)  capability  value  of
       loaded  terminfo entries to the value of this variable.  Very few term-
       info entries provide this feature.

       Because this name is also used in development environments to represent
       the C compiler's name, ncurses ignores it if it does not happen to be a
       single character.


BAUDRATE

       The  debugging  library  checks  this  environment  variable  when  the
       application  has  redirected  output to a file.  The variable's numeric
       value is used for the baudrate.  If no value  is  found,  ncurses  uses
       9600.  This allows testers to construct repeatable test-cases that take
       into account costs that depend on baudrate.


COLUMNS

       Specify the width of the screen in characters.  Applications running in
       a  windowing  environment  usually  are able to obtain the width of the
       window in which they are executing.  If neither the COLUMNS  value  nor
       the  terminal's  screen  size is available, ncurses uses the size which
       may be specified in the terminfo database (i.e., the cols capability).

       It is important that your  application  use  a  correct  size  for  the
       screen.   This  is  not always possible because your application may be
       running on a host which does not honor NAWS (Negotiations About  Window
       Size),  or  because  you  are  temporarily  running  as  another  user.
       However, setting COLUMNS and/or LINES overrides the  library's  use  of
       the screen size obtained from the operating system.

       Either  COLUMNS  or LINES symbols may be specified independently.  This
       is  mainly  useful  to  circumvent  legacy  misfeatures   of   terminal
       descriptions,  e.g.,  xterm  which commonly specifies a 65 line screen.
       For best results, lines and cols should not be specified in a  terminal
       description for terminals which are run as emulations.

       Use  the  use_env  function  to disable all use of external environment
       (but not including system calls) to determine the screen size.  Use the
       use_tioctl function to update COLUMNS or LINES to match the screen size
       obtained from system calls or the terminal database.


ESCDELAY

       Specifies the total time, in milliseconds, for which ncurses will await
       a  character  sequence,  e.g., a function key.  The default value, 1000
       milliseconds, is enough for most uses.  However, it is made a  variable
       to accommodate unusual applications.

       The  most common instance where you may wish to change this value is to
       work with slow hosts, e.g., running on a network.  If the  host  cannot
       read  characters rapidly enough, it will have the same effect as if the
       terminal did not send characters  rapidly  enough.   The  library  will
       still see a timeout.

       Note  that  xterm  mouse  events  are built up from character sequences
       received from the xterm.   If  your  application  makes  heavy  use  of
       multiple-clicking,  you may wish to lengthen this default value because
       the timeout applies to the composed multi-click event as  well  as  the
       individual clicks.

       In addition to the environment variable, this implementation provides a
       global variable with the same name.  Portable applications  should  not
       rely  upon  the  presence  of  ESCDELAY in either form, but setting the
       environment variable rather than the global variable  does  not  create
       problems when compiling an application.


HOME

       Tells  ncurses where your home directory is.  That is where it may read
       and write auxiliary terminal descriptions:

           $HOME/.termcap
           $HOME/.terminfo


LINES

       Like COLUMNS, specify the height of  the  screen  in  characters.   See
       COLUMNS for a detailed description.


MOUSE_BUTTONS_123

       This  applies  only  to  the  OS/2 EMX port.  It specifies the order of
       buttons on the mouse.  OS/2 numbers  a  3-button  mouse  inconsistently
       from other platforms:

           1 = left
           2 = right
           3 = middle.

       This variable lets you customize the mouse.  The variable must be three
       numeric digits 1-3 in any order, e.g.,  123  or  321.   If  it  is  not
       specified, ncurses uses 132.


NCURSES_ASSUMED_COLORS

       Override  the compiled-in assumption that the terminal's default colors
       are  white-on-black  (see  default_colors(3x)).   You   may   set   the
       foreground  and  background color values with this environment variable
       by proving a 2-element list: foreground,background.   For  example,  to
       tell  ncurses  to  not  assume  anything  about the colors, set this to
       "-1,-1".  To make it green-on-black, set it  to  "2,0".   Any  positive
       value from zero to the terminfo max_colors value is allowed.


NCURSES_CONSOLE2

       This applies only to the MinGW port of ncurses.

       The  Console2  program's  handling  of  the  Microsoft Console API call
       CreateConsoleScreenBuffer is defective.  Applications  which  use  this
       will hang.  However, it is possible to simulate the action of this call
       by mapping coordinates, explicitly saving and  restoring  the  original
       screen  contents.   Setting the environment variable NCGDB has the same
       effect.


NCURSES_GPM_TERMS

       This applies only to ncurses configured to use the GPM interface.

       If present, the environment variable is a list of one or more  terminal
       names  against which the TERM environment variable is matched.  Setting
       it to an empty value disables the GPM  interface;  using  the  built-in
       support for xterm, etc.

       If the environment variable is absent, ncurses will attempt to open GPM
       if TERM contains "linux".


NCURSES_NO_HARD_TABS

       ncurses may use tabs as part of cursor movement optimization.  In  some
       cases,  your  terminal  driver may not handle these 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

       Some  terminals  use  a  magic-cookie  feature  which  requires special
       handling to  make  highlighting  and  other  video  attributes  display
       properly.   You  can  suppress  the  highlighting  entirely  for  these
       terminals by setting this environment variable to any value.


NCURSES_NO_PADDING

       Most of the terminal descriptions in the terminfo database are  written
       for  real  "hardware"  terminals.   Many  people use terminal emulators
       which run in a windowing environment and use curses-based applications.
       Terminal  emulators  can  duplicate  all  of the important aspects of a
       hardware terminal, but they do not  have  the  same  limitations.   The
       chief  limitation  of  a  hardware terminal from the standpoint of your
       application is the management of  dataflow,  i.e.,  timing.   Unless  a
       hardware  terminal  is  interfaced  into a terminal concentrator (which
       does flow control), it (or  your  application)  must  manage  dataflow,
       preventing  overruns.   The cheapest solution (no hardware cost) is for
       your program to do this by pausing after operations that  the  terminal
       does slowly, such as clearing the display.

       As  a  result,  many  terminal  descriptions (including the vt100) have
       delay times embedded.  You may wish to use these descriptions, but  not
       want to pay the performance penalty.

       Set  the  NCURSES_NO_PADDING  environment  variable  to disable all but
       mandatory padding.  Mandatory padding is used  as  a  part  of  special
       control sequences such as flash.


NCURSES_NO_SETBUF

       This setting is obsolete.  Before changes

          o   started with 5.9 patch 20120825 and

          o   continued though 5.9 patch 20130126

       ncurses  enabled  buffered output during terminal initialization.  This
       was done (as in SVr4 curses)  for  performance  reasons.   For  testing
       purposes,  both  of  ncurses and certain applications, this feature was
       made optional.  Setting the NCURSES_NO_SETBUF variable disabled  output
       buffering,  leaving  the output in the original (usually line buffered)
       mode.

       In the current implementation, ncurses performs its own  buffering  and
       does  not require this workaround.  It does not modify the buffering of
       the standard output.

       The reason for the change was to make the behavior for  interrupts  and
       other   signals   more   robust.    One   drawback   is   that  certain
       nonconventional programs would mix ordinary stdio(3) calls with ncurses
       calls  and (usually) work.  This is no longer possible since ncurses is
       not using the buffered standard output but its own output (to the  same
       file  descriptor).  As a special case, the low-level calls such as putp
       still use the standard output.  But high-level curses calls do not.


NCURSES_NO_UTF8_ACS

       During initialization, the ncurses library  checks  for  special  cases
       where VT100 line-drawing (and the corresponding alternate character set
       capabilities) described in  the  terminfo  are  known  to  be  missing.
       Specifically,  when  running  in  a  UTF-8  locale,  the  Linux console
       emulator and the GNU screen program ignore these.  ncurses  checks  the
       TERM  environment  variable  for  these.   For other special cases, you
       should set this environment variable.  Doing this tells ncurses to  use
       Unicode values which correspond to the VT100 line-drawing glyphs.  That
       works for the special cases cited, and is likely to work  for  terminal
       emulators.

       When  setting  this  variable,  you  should  set it to a nonzero value.
       Setting it to zero (or to a nonnumber) disables the special  check  for
       "linux" and "screen".

       As  an  alternative  to the environment variable, ncurses checks for an
       extended terminfo capability U8.  This is a  numeric  capability  which
       can be compiled using tic -x.  For example

          # linux console, if patched to provide working
          # VT100 shift-in/shift-out, with corresponding font.
          linux-vt100|linux console with VT100 line-graphics,
                  U8#0, use=linux,

          # uxterm with vt100Graphics resource set to false
          xterm-utf8|xterm relying on UTF-8 line-graphics,
                  U8#1, use=xterm,

       The  name  "U8" is chosen to be two characters, to permit it to be used
       by applications that use ncurses' termcap interface.


NCURSES_TRACE

       During  initialization,  the  ncurses  debugging  library  checks   the
       NCURSES_TRACE  environment  variable.   If  it is defined, to a numeric
       value, ncurses calls the  trace  function,  using  that  value  as  the
       argument.

       The  argument  values,  which  are defined in curses.h, provide several
       types  of  information.   When  running  with  traces   enabled,   your
       application will write the file trace to the current directory.

       See curs_trace(3x) for more information.


TERM

       Denotes  your  terminal  type.   Each terminal type is distinct, though
       many are similar.

       TERM is commonly set by terminal emulators to help applications find  a
       workable   terminal  description.   Some  of  those  choose  a  popular
       approximation, e.g., "ansi", "vt100", "xterm" rather than an exact fit.
       Not  infrequently,  your  application  will  have  problems  with  that
       approach, e.g., incorrect function-key definitions.

       If you set TERM in your environment, it has no effect on the  operation
       of  the  terminal  emulator.  It only affects the way applications work
       within the terminal.  Likewise, as a general  rule  (xterm(1)  being  a
       rare  exception), terminal emulators which allow you to specify TERM as
       a parameter or configuration value do  not  change  their  behavior  to
       match that setting.


TERMCAP

       If  the  ncurses  library  has  been  configured  with termcap support,
       ncurses will check for a terminal's description in termcap form  if  it
       is not available in the terminfo database.

       The TERMCAP environment variable contains either a terminal description
       (with newlines  stripped  out),  or  a  file  name  telling  where  the
       information denoted by the TERM environment variable exists.  In either
       case, setting it directs ncurses to ignore the  usual  place  for  this
       information, e.g., /etc/termcap.


TERMINFO

       ncurses  can  be  configured  to read from multiple terminal databases.
       The TERMINFO variable overrides the location for the  default  terminal
       database.   Terminal  descriptions  (in  terminal format) are stored in
       terminal databases:

       o   Normally these are stored in a directory tree, using subdirectories
           named by the first letter of the terminal names therein.

           This is the scheme used in System V, which legacy Unix systems use,
           and the TERMINFO variable is used by curses applications  on  those
           systems to override the default location of the terminal database.

       o   If  ncurses  is  built  to use hashed databases, then each entry in
           this list may be the path of a hashed database file, e.g.,

               /usr/share/terminfo.db

           rather than

               /usr/share/terminfo/

           The hashed database uses less disk-space and  is  a  little  faster
           than  the  directory  tree.   However, some applications assume the
           existence of the directory tree, reading it  directly  rather  than
           using the terminfo library calls.

       o   If  ncurses  is  built  with  a  support  for reading termcap files
           directly, then an entry in this list may be the path of  a  termcap
           file.

       o   If the TERMINFO variable begins with "hex:" or "b64:", ncurses uses
           the remainder of that variable as a compiled terminal  description.
           You might produce the base64 format using infocmp(1m):

               TERMINFO="$(infocmp -0 -Q2 -q)"
               export TERMINFO

           The  compiled description is used if it corresponds to the terminal
           identified by the TERM variable.

       Setting TERMINFO is the simplest, but not the only way to set  location
       of  the  default  terminal  database.   The  complete  list of database
       locations in order follows:

          o   the last terminal database to which ncurses wrote,  if  any,  is
              searched first

          o   the location specified by the TERMINFO environment variable

          o   $HOME/.terminfo

          o   locations listed in the TERMINFO_DIRS environment variable

          o   one  or  more  locations whose names are configured and compiled
              into the ncurses library, i.e.,

             o   /usr/share/terminfo  (corresponding  to   the   TERMINFO_DIRS
                 variable)

             o   /usr/share/terminfo (corresponding to the TERMINFO variable)


TERMINFO_DIRS

       Specifies  a  list  of  locations  to search for terminal descriptions.
       Each location in the list is a terminal database as  described  in  the
       section  on  the  TERMINFO  variable.   The list is separated by colons
       (i.e., ":") on Unix, semicolons on OS/2 EMX.

       There is no corresponding feature  in  System  V  terminfo;  it  is  an
       extension developed for ncurses.


TERMPATH

       If  TERMCAP  does not hold a file name then ncurses checks the TERMPATH
       environment variable.  This is a list of filenames separated by  spaces
       or colons (i.e., ":") on Unix, semicolons on OS/2 EMX.

       If  the  TERMPATH environment variable is not set, ncurses looks in the
       files

           /etc/termcap, /usr/share/misc/termcap and $HOME/.termcap,

       in that order.

       The library may be configured to disregard the following variables when
       the  current  user  is the superuser (root), or if the application uses
       setuid or setgid permissions:

           $TERMINFO, $TERMINFO_DIRS, $TERMPATH, as well as $HOME.


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 include for ncurses is as noted in SYNOPSIS:

                #include <curses.h>

            This  option  is  used to avoid filename conflicts when ncurses is
            not the main implementation of curses of the computer.  If ncurses
            is  installed  disabling  overwrite,  it  puts  its  headers  in a
            subdirectory, e.g.,

                #include <ncurses/curses.h>

            It also omits a  symbolic  link  which  would  allow  you  to  use
            -lcurses to build executables.

       --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 XSI 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   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.

       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; 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    sequences    at   runtime;   see   define_key(3x),
       key_defined(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  choose  to  hide the internal details of
       WINDOW  structures,  instead   using   accessor   functions   such   as
       is_scrollok(3x).

       ncurses  enables  an  application  to  direct  application  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.

       Some  extensions  are  only available if ncurses is compiled to support
       them; see section "ALTERNATE CONFIGURATIONS" above.

       o   Rudimentary  support  for  multi-threaded   applications   may   be
           available; see curs_threads(3x).

       o   Functions  that  ease  the  management  of  multiple screens can be
           exposed; see curs_sp_funcs(3x).

       o   The compiler option -DUSE_GETCAP causes the library 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 nearly all its enhanced features.

       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,  this  one  checks  parameters  such as
       pointers to WINDOW structures to ensure they are not  null.   The  main
       reason  for  providing  this  behavior  is  to guard against programmer
       error.  The standard interface does not provide a way for  the  library
       to  tell an application which of several possible errors were detected.
       Relying on this (or some other) extension  will  adversely  affect  the
       portability of curses applications.


Padding Differences

       In  historic  curses  versions, delays embedded in the capabilities cr,
       ind, cub1, ff and tab activated corresponding delay bits  in  the  Unix
       tty driver.  In this implementation, all padding is done by sending NUL
       bytes.  This  method  is  slightly  more  expensive,  but  narrows  the
       interface  to the Unix kernel significantly and increases the package's
       portability correspondingly.


Header Files

       The header file curses.h itself includes the header files  stdio.h  and
       unctrl.h.

       X/Open Curses has more to say, but does not finish the story:

           The  inclusion  of <curses.h> may make visible all symbols from the
           headers <stdio.h>, <term.h>, <termios.h>, and <wchar.h>.

       Here is a more complete story:

       o   Starting  with  BSD  curses,  all  implementations  have   included
           <stdio.h>.

           BSD  curses  included  <curses.h>  and  <unctrl.h> from an internal
           header file curses.ext ("ext" abbreviated "externs").

           BSD curses used <stdio.h> internally (for printw  and  scanw),  but
           nothing in <curses.h> itself relied upon <stdio.h>.

       o   SVr2  curses  added newterm(3x), which relies upon <stdio.h>.  That
           is, the function prototype uses FILE.

           SVr4 curses added putwin and getwin, which also use <stdio.h>.

           X/Open Curses documents all three of these functions.

           SVr4 curses and X/Open Curses  do  not  require  the  developer  to
           include  <stdio.h>  before  including  <curses.h>.   Both  document
           curses showing <curses.h> as the only required header.

           As a result, standard <curses.h> will always include <stdio.h>.

       o   X/Open Curses  is  inconsistent  with  respect  to  SVr4  regarding
           <unctrl.h>.

           As   noted  in  curs_util(3x),  ncurses  includes  <unctrl.h>  from
           <curses.h> (like SVr4).

       o   X/Open'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  says  that <curses.h> may include <term.h>, but there is no
           requirement that it do that.

           Some  programs  use  functions  declared  in  both  <curses.h>  and
           <term.h>,  and  must include both headers in the same module.  Very
           old versions of AIX curses  required  including  <curses.h>  before
           including <term.h>.

           Because  ncurses  header files include the headers needed to define
           datatypes used in the headers, ncurses header files can be included
           in  any  order.  But for portability, you should include <curses.h>
           before <term.h>.

       o   X/Open Curses says "may make visible" because  including  a  header
           file does not necessarily make all symbols in it visible (there are
           ifdef's to consider).

           For instance, in ncurses <wchar.h> may be included  if  the  proper
           symbol  is defined, and if ncurses is configured for wide-character
           support.  If the header  is  included,  its  symbols  may  be  made
           visible.   That depends on the value used for _XOPEN_SOURCE feature
           test macro.

       o   X/Open Curses documents one required header,  in  a  special  case:
           <stdarg.h>   before  <curses.h>  to  prototype  the  vw_printw  and
           vw_scanw functions (as  well  as  the  obsolete  the  vwprintw  and
           vwscanw functions).  Each of those uses a va_list parameter.

           The  two  obsolete  functions  were  introduced in SVr3.  The other
           functions were introduced  in  X/Open  Curses.   In  between,  SVr4
           curses  provided  for  the  possibility  that  an application might
           include either <varargs.h> or <stdarg.h>.  Initially, that was done
           by  using  void*  for the va_list parameter.  Later, a special type
           (defined in <stdio.h>) was introduced, to allow for compiler  type-
           checking.  That special type is always available, because <stdio.h>
           is always included by <curses.h>.

           None of the X/Open Curses implementations require an application to
           include  <stdarg.h>  before  <curses.h>  because  they  either have
           allowed for a special type, or (like  ncurses)  include  <stdarg.h>
           directly to provide a portable interface.


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.4                       2024-01-13                       ncurses(3x)
ncurses-6.4-20240113/doc/html/man/curs_printw.3x.html0000644000000000000000000002474614550576011020540 0ustar rootroot curs_printw 3x 2023-12-23 ncurses 6.4 Library calls

curs_printw 3x 2023-12-23 ncurses 6.4 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  with  a  "mv"  prefix  first perform a cursor movement using
       wmove, and fail if the position is outside the window.


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.4                       2023-12-23                   curs_printw(3x)
ncurses-6.4-20240113/doc/html/man/form_post.3x.html0000644000000000000000000001336614530450430020157 0ustar rootroot form_post 3x 2023-11-25 ncurses 6.4 Library calls

form_post 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                     form_post(3x)
ncurses-6.4-20240113/doc/html/man/infotocap.1m.html0000644000000000000000000001301614537426151020116 0ustar rootroot infotocap 1m 2023-12-10 ncurses 6.4 User commands

infotocap 1m 2023-12-10 ncurses 6.4 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.4                       2023-12-10                     infotocap(1m)
ncurses-6.4-20240113/doc/html/man/index.html0000644000000000000000000001151613615656212016731 0ustar rootroot NCURSES – Manual Pages ncurses-6.4-20240113/doc/html/man/form_data.3x.html0000644000000000000000000001137114530450427020103 0ustar rootroot form_data 3x 2023-11-25 ncurses 6.4 Library calls

form_data 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                     form_data(3x)
ncurses-6.4-20240113/doc/html/man/menu_opts.3x.html0000644000000000000000000001525214530450430020154 0ustar rootroot menu_opts 3x 2023-11-25 ncurses 6.4 Library calls

menu_opts 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                     menu_opts(3x)
ncurses-6.4-20240113/doc/html/man/curs_addstr.3x.html0000644000000000000000000001744314526247437020504 0ustar rootroot curs_addstr 3x 2023-11-18 ncurses 6.4 Library calls

curs_addstr 3x 2023-11-18 ncurses 6.4 Library calls

curs_addstr(3x)                  Library calls                 curs_addstr(3x)




NAME

       addstr,  addnstr,  waddstr,  waddnstr,  mvaddstr, mvaddnstr, mvwaddstr,
       mvwaddnstr - add a string to a curses window and advance the cursor


SYNOPSIS

       #include <curses.h>

       int addstr(const char *str);
       int addnstr(const char *str, int n);
       int waddstr(WINDOW *win, const char *str);
       int waddnstr(WINDOW *win, const char *str, int n);

       int mvaddstr(int y, int x, const char *str);
       int mvaddnstr(int y, int x, const char *str, int n);
       int mvwaddstr(WINDOW *win, int y, int x, const char *str);
       int mvwaddnstr(WINDOW *win, int y, int x, const char *str, int n);


DESCRIPTION

       These functions write the (null-terminated) character string str on the
       given  window.   It  is similar to calling waddch once for each byte in
       the string.

       The mv functions perform  cursor  movement  once,  before  writing  any
       characters.   Thereafter,  the  cursor  is advanced as a side-effect of
       writing to the window.

       The four functions with n as the last argument write at most  n  bytes,
       or  until  a  terminating null is reached.  If n is -1, then the entire
       string will be added.


RETURN VALUE

       All functions return the integer ERR upon failure and OK on success.

       X/Open does not  define  any  error  conditions.   This  implementation
       returns an error

       o   if the window pointer is null or

       o   if the string pointer is null or

       o   if the corresponding calls to waddch return an error.

       Functions  with  a  "mv"  prefix  first perform a cursor movement using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       All of these functions except waddnstr may be macros.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.


SEE ALSO

       curses(3x),    curs_addch(3x),   curs_addchstr(3x),   curs_addwstr(3x),
       curs_add_wchstr(3x)



ncurses 6.4                       2023-11-18                   curs_addstr(3x)
ncurses-6.4-20240113/doc/html/man/curs_trace.3x.html0000644000000000000000000003514014541645311020301 0ustar rootroot curs_trace 3x 2023-12-23 ncurses 6.4 Library calls

curs_trace 3x 2023-12-23 ncurses 6.4 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 param);

       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 ch);
       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 param);


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.


Initialization

       These  functions  check  the NCURSES_TRACE environment variable, to set
       the tracing feature as if curses_trace was called:

           filter,  initscr,  new_prescr,  newterm,   nofilter,   restartterm,
           ripoffline,      setupterm,     slk_init,     tgetent,     use_env,
           use_extended_names, use_tioctl


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.


PORTABILITY

       These functions are not part of the XSI interface.  Some  other  curses
       implementations  are  known  to have similar features, but they are not
       compatible with ncurses:

       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.4                       2023-12-23                    curs_trace(3x)
ncurses-6.4-20240113/doc/html/man/form_field_opts.3x.html0000644000000000000000000002021214530450430021306 0ustar rootroot form_field_opts 3x 2023-11-25 ncurses 6.4 Library calls

form_field_opts 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25               form_field_opts(3x)
ncurses-6.4-20240113/doc/html/man/menu_post.3x.html0000644000000000000000000001365114530450430020155 0ustar rootroot menu_post 3x 2023-11-25 ncurses 6.4 Library calls

menu_post 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                     menu_post(3x)
ncurses-6.4-20240113/doc/html/man/curs_legacy.3x.html0000644000000000000000000002042014541645311020442 0ustar rootroot curs_legacy 3x 2023-12-23 ncurses 6.4 Library calls

curs_legacy 3x 2023-12-23 ncurses 6.4 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.


NOTES

       All of these interfaces are implemented as macros and  functions.   The
       macros  are suppressed (and only the functions provided) in an "opaque"
       ncurses build, which defines the  preprocessor  symbol  NCURSES_OPAQUE.
       See section "ALTERNATE CONFIGURATIONS" in ncurses(3x).

       The standard forms such as getyx must be implemented as macros, and (in
       this implementation) are defined in terms of  the  functions  described
       here, to avoid reliance on internal details of the WINDOW structure.


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.4                       2023-12-23                   curs_legacy(3x)
ncurses-6.4-20240113/doc/html/man/curs_border_set.3x.html0000644000000000000000000003025414530450426021333 0ustar rootroot curs_border_set 3x 2023-11-25 ncurses 6.4 Library calls

curs_border_set 3x 2023-11-25 ncurses 6.4 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 an error if it is null.

       Functions  with  a  "mv"  prefix  first perform a cursor movement using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


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 the XSI Curses standard, Issue 4.


SEE ALSO

       curses(3x), curs_add_wch(3x), curs_border(3x), curs_outopts(3x)



ncurses 6.4                       2023-11-25               curs_border_set(3x)
ncurses-6.4-20240113/doc/html/man/curs_overlay.3x.html0000644000000000000000000001660314546123512020666 0ustar rootroot curs_overlay 3x 2024-01-05 ncurses 6.4 Library calls

curs_overlay 3x 2024-01-05 ncurses 6.4 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 an error 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  the XSI Curses standard, 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.4                       2024-01-05                  curs_overlay(3x)
ncurses-6.4-20240113/doc/html/man/toe.1m.html0000644000000000000000000002467714550604710016734 0ustar rootroot toe 1m 2024-01-13 ncurses 6.4 User commands

toe 1m 2024-01-13 ncurses 6.4 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 the -s option is also given,  toe  adds  a  column  to  the
                report,  showing  (like conflict(1)) which entries belong 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.4                       2024-01-13                           toe(1m)
ncurses-6.4-20240113/doc/html/man/form_requestname.3x.html0000644000000000000000000001251614537426151021531 0ustar rootroot form_requestname 3x 2023-12-16 ncurses 6.4 Library calls

form_requestname 3x 2023-12-16 ncurses 6.4 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.4                       2023-12-16              form_requestname(3x)
ncurses-6.4-20240113/doc/html/man/term.5.html0000644000000000000000000005452414550604710016735 0ustar rootroot term 5 2024-01-13 ncurses 6.4 File formats

term 5 2024-01-13 ncurses 6.4 File formats

term(5)                          File formats                          term(5)




NAME

       term - compiled terminfo terminal description


SYNOPSIS

       term


DESCRIPTION


Storage Location

       Compiled   terminfo   descriptions   are  placed  under  the  directory
       /usr/share/terminfo.  Two configurations are supported  (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,
            act4  can  be  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 Berkeley database, two types  of  records  are  stored:  the
            terminfo  data  in  the  same format as stored in a directory tree
            with the terminfo's primary name as a key, and records  containing
            only aliases pointing to the primary name.

            If  built  to  write  hashed  databases,  ncurses  can  still read
            terminfo databases organized as a directory tree, but cannot write
            entries  into  the  directory  tree.   It  can  write (or rewrite)
            entries in the hashed database.

            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  hashed
            database otherwise.


Legacy Storage Format

       The format has been chosen so that it will be the same on all hardware.
       An 8 or more bit  byte  is  assumed,  but  no  assumptions  about  byte
       ordering or sign extension are made.

       The  compiled  file  is  created  with the tic program, and read by the
       routine setupterm(3x).  The file is divided into six parts:

            a) header,

            b) terminal names,

            c) Boolean flags,

            d) numbers,

            e) strings, and

            f) 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 the file <term.h>.

       Short integers are signed, in the range  -32768  to  32767.   They  are
       stored  as  two  8-bit  bytes.   The  first  byte  contains  the  least
       significant 8 bits of the value, and the second byte contains the  most
       significant 8 bits.  (Thus, the value represented is 256*second+first.)
       This format corresponds to the hardware of the VAX and PDP-11 (that is,
       little-endian  machines).   Machines  where this does not correspond to
       the hardware must read the  integers  as  two  bytes  and  compute  the
       little-endian value.

       Numbers  in  a  terminal  description,  whether they are entries in the
       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  which  are  loaded  at
       runtime.   This  extension  is made possible by using the fact that the
       other implementations stop reading the terminfo  data  when  they  have
       reached  the  end  of the size given in the header.  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,  e.g.,  Booleans,  then  numbers and
       finally strings.

       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 which need  more  than  the  predefined
       capabilities.  See user_caps(5) for an overview of the way ncurses uses
       this extended information.

       Applications which manipulate terminal data  can  use  the  definitions
       described  in  term_variables(3x)  which  associate the long capability
       names with members of a TERMTYPE structure.


Extended Number Format

       On occasion, 16-bit signed integers are not large enough.  With ncurses
       6.1,  a new format was introduced 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  for  numbers  and the
       otherwise  self-describing  format,  it  is  not  wise  to   count   on
       portability   of   binary  terminfo  entries  between  commercial  Unix
       versions.  The problem is that there are at  least  three  versions  of
       terminfo  (under  HP-UX,  AIX,  and OSF/1) which diverged from System V
       terminfo after SVr1, and  have  added  extension  capabilities  to  the
       string  table that (in the binary format) collide with System V and XSI
       Curses extensions.  See 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  the  tigetflag  and
       related  functions  described in curs_terminfo(3x) for reading terminal
       capabilities.


Mixed-case Terminal Names

       A small number of terminal descriptions  use  uppercase  characters  in
       their  names.   If  the  underlying  filesystem  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 sections

       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 which they can store (i.e.,  16-bit  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

       As  an  example,  here  is  a description for the Lear-Siegler ADM-3, a
       popular though rather stupid early terminal:

       adm3a|lsi adm3a,
               am,
               cols#80, lines#24,
               bel=^G, clear=\032$<1>, cr=^M, cub1=^H, cud1=^J,
               cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
               home=^^, ind=^J,

       and a hexadecimal dump of the compiled terminal description:

       0000  1a 01 10 00 02 00 03 00  82 00 31 00 61 64 6d 33  ........ ..1.adm3
       0010  61 7c 6c 73 69 20 61 64  6d 33 61 00 00 01 50 00  a|lsi ad m3a...P.
       0020  ff ff 18 00 ff ff 00 00  02 00 ff ff ff ff 04 00  ........ ........
       0030  ff ff ff ff ff ff ff ff  0a 00 25 00 27 00 ff ff  ........ ..%.'...
       0040  29 00 ff ff ff ff 2b 00  ff ff 2d 00 ff ff ff ff  ).....+. ..-.....
       0050  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       0060  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       0070  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       0080  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       0090  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       00a0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       00b0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       00c0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       00d0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       00e0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       00f0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       0100  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       0110  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
       0120  ff ff ff ff ff ff 2f 00  07 00 0d 00 1a 24 3c 31  ....../. .....$<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, e.g., from pcurses.


SEE ALSO

       curses(3x), curs_terminfo(3x), terminfo(5), user_caps(5)



ncurses 6.4                       2024-01-13                           term(5)
ncurses-6.4-20240113/doc/html/man/wresize.3x.html0000644000000000000000000001326314530450431017634 0ustar rootroot wresize 3x 2023-11-25 ncurses 6.4 Library calls

wresize 3x 2023-11-25 ncurses 6.4 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

       This  ncurses  extension  to  standard curses reallocates storage for a
       curses window to adjust its dimensions to  the  specified  values.   If
       either dimension is larger than its current value, the expanded part of
       the window  is  filled  with  blanks  merged  with  current  background
       rendition (as set by wbkgdset(3x)).


RETURN VALUE

       wresize  returns  ERR  upon failure and OK on success.  It will fail if
       either of the dimensions is less than or equal to zero, or if an  error
       occurs while (re)allocating memory for the window.


NOTES

       The  only  restriction placed on the dimensions is that they be greater
       than zero.  They are not compared to the curses screen dimensions; this
       keeps  the logic of resizeterm(3x) simple.  The caller must ensure that
       the window's dimensions fit within the actual screen dimensions.


PORTABILITY

       It is not possible to resize windows with SVr4 curses.

       ncurses introduced this extension in mid-1995.  NetBSD  curses  adopted
       it in 2001, and PDCurses in 2003.


AUTHORS

       Thomas  Dickey  (from  an  equivalent  function written in 1988 for BSD
       curses).


SEE ALSO

       resizeterm(3x)



ncurses 6.4                       2023-11-25                       wresize(3x)
ncurses-6.4-20240113/doc/html/man/form_variables.3x.html0000644000000000000000000001411014510361214021125 0ustar rootroot form_variables 3x 2023-10-07 ncurses 6.4 Library calls

form_variables 3x 2023-10-07 ncurses 6.4 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.4                       2023-10-07                form_variables(3x)
ncurses-6.4-20240113/doc/html/man/form.3x.html0000644000000000000000000003762214541645311017121 0ustar rootroot form 3x 2023-12-23 ncurses 6.4 Library calls

form 3x 2023-12-23 ncurses 6.4 Library calls

form(3x)                         Library calls                        form(3x)




NAME

       form - curses extension for programming forms


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.4                       2023-12-23                          form(3x)
ncurses-6.4-20240113/doc/html/man/curs_inch.3x.html0000644000000000000000000001745214550604705020134 0ustar rootroot curs_inch 3x 2024-01-13 ncurses 6.4 Library calls

curs_inch 3x 2024-01-13 ncurses 6.4 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

       These  routines  return  the  character, of type chtype, at the current
       position in the named window.  If  any  attributes  are  set  for  that
       position,  their  values  are OR'ed into the value returned.  Constants
       defined in <curses.h> can be used with the & (logical AND) operator  to
       extract the character or attributes alone.


Attributes

       The  following  bit  masks  may  be  AND-ed with characters returned by
       winch.

       Name           Description
       ------------------------------------------------------------------------
       A_CHARTEXT     Extract character
       A_ATTRIBUTES   Extract attributes
       A_COLOR        Extract color pair information


RETURN VALUE

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.

       The winch function does not return an  error  if  the  window  contains
       characters  larger than 8-bits (255).  Only the low-order 8 bits of the
       character are used by winch.


NOTES

       Note that all of these routines may be macros.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.

       Very old systems (before standardization) provide a different  function
       with the same name:

       o   The  winch  function  was  part of the original BSD curses library,
           which  stored  a  7-bit  character  combined  with   the   standout
           attribute.

           In  BSD  curses,  winch returned only the character (as an integer)
           with the standout attribute removed.

       o   System V curses added support for several  video  attributes  which
           could be combined with characters in the window.

           Reflecting this improvement, the function was altered to return the
           character combined with all video attributes in a chtype value.

       X/Open Curses does not specify the size and layout of attributes, color
       and  character  values in chtype; it is implementation-dependent.  This
       implementation uses 8 bits for character values.  An application  using
       more  bits,  e.g.,  a  Unicode  value,  should  use  the wide-character
       equivalents to these functions.


SEE ALSO

       curses(3x)
              gives an overview of the WINDOW and chtype data types.

       curs_attr(3x)
              goes into more detail, pointing  out  portability  problems  and
              constraints   on   the   use  of  chtype  for  returning  window
              information.

       curs_in_wch(3x)
              describes comparable functions for the wide-character (ncursesw)
              library.



ncurses 6.4                       2024-01-13                     curs_inch(3x)
ncurses-6.4-20240113/doc/html/man/curs_memleaks.3x.html0000644000000000000000000001777114541645311021013 0ustar rootroot curs_memleaks 3x 2023-12-23 ncurses 6.4 Library calls

curs_memleaks 3x 2023-12-23 ncurses 6.4 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.4                       2023-12-23                 curs_memleaks(3x)
ncurses-6.4-20240113/doc/html/man/menu_spacing.3x.html0000644000000000000000000001603714537426151020627 0ustar rootroot menu_spacing 3x 2023-12-16 ncurses 6.4 Library calls

menu_spacing 3x 2023-12-16 ncurses 6.4 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.4                       2023-12-16                  menu_spacing(3x)
ncurses-6.4-20240113/doc/html/man/curs_move.3x.html0000644000000000000000000001236714537426147020170 0ustar rootroot curs_move 3x 2023-12-16 ncurses 6.4 Library calls

curs_move 3x 2023-12-16 ncurses 6.4 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

       These routines move the cursor associated with the window to line y and
       column x.  This routine does  not  move  the  physical  cursor  of  the
       terminal  until  refresh(3x)  is  called.   The  position  specified is
       relative to the upper left-hand corner of the window, which is (0,0).


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.

       Specifically, they return an error if the window pointer is null, or if
       the position is outside the window.


NOTES

       Note that move may be a macro.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.


SEE ALSO

       curses(3x), curs_refresh(3x)



ncurses 6.4                       2023-12-16                     curs_move(3x)
ncurses-6.4-20240113/doc/html/man/ncursesw6-config.1.html0000644000000000000000000001427014541670545021167 0ustar rootroot ncursesw6-config 1 2023-12-23 ncurses 6.4 User commands

ncursesw6-config 1 2023-12-23 ncurses 6.4 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.4                       2023-12-23               ncursesw6-config(1)
ncurses-6.4-20240113/doc/html/man/menu_mark.3x.html0000644000000000000000000001372014530450430020117 0ustar rootroot menu_mark 3x 2023-11-25 ncurses 6.4 Library calls

menu_mark 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                     menu_mark(3x)
ncurses-6.4-20240113/doc/html/man/curs_deleteln.3x.html0000644000000000000000000001503414537426147021010 0ustar rootroot curs_deleteln 3x 2023-12-16 ncurses 6.4 Library calls

curs_deleteln 3x 2023-12-16 ncurses 6.4 Library calls

curs_deleteln(3x)                Library calls               curs_deleteln(3x)




NAME

       deleteln,  wdeleteln, insdelln, winsdelln, insertln, winsertln - delete
       or insert lines in a curses window


SYNOPSIS

       #include <curses.h>

       int deleteln(void);
       int wdeleteln(WINDOW *win);

       int insdelln(int n);
       int winsdelln(WINDOW *win, int n);

       int insertln(void);
       int winsertln(WINDOW *win);


DESCRIPTION

       The deleteln and wdeleteln routines delete the line under the cursor in
       the  window;  all  lines  below the current line are moved up one line.
       The bottom line of the window is cleared.  The cursor position does not
       change.

       The  insdelln  and  winsdelln  routines, for positive n, insert n lines
       into the specified window above the current line.  The n  bottom  lines
       are  lost.  For negative n, delete n lines (starting with the one under
       the cursor), and move the remaining lines up.  The bottom n  lines  are
       cleared.  The current cursor position remains the same.

       The  insertln  and  winsertln  routines  insert  a blank line above the
       current line and the bottom line is lost.


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,  if  the
       window parameter is null, an error is returned.


NOTES

       Note that all but winsdelln may be macros.

       These  routines do not require a hardware line delete or insert feature
       in  the  terminal.   In  fact,  they  will  not   use   hardware   line
       delete/insert  unless  idlok(...,  TRUE)  has  been  set on the current
       window.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.  The
       standard  specifies  that  they return ERR on failure, but specifies no
       error conditions.


SEE ALSO

       curses(3x)



ncurses 6.4                       2023-12-16                 curs_deleteln(3x)
ncurses-6.4-20240113/doc/html/man/menu_hook.3x.html0000644000000000000000000001625214530450430020130 0ustar rootroot menu_hook 3x 2023-11-25 ncurses 6.4 Library calls

menu_hook 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                     menu_hook(3x)
ncurses-6.4-20240113/doc/html/man/curs_pad.3x.html0000644000000000000000000003623114546123512017750 0ustar rootroot curs_pad 3x 2024-01-05 ncurses 6.4 Library calls

curs_pad 3x 2024-01-05 ncurses 6.4 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 *orig, 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


newpad

       newpad creates and returns a pointer to a new pad data  structure  with
       the given number of lines, nlines, and columns, ncols.  A pad is like a
       window, except that it is not restricted by the screen size, and is not
       necessarily  associated with a particular part of the screen.  Pads can
       be used when a large window is needed, and only a part  of  the  window
       will  be  on  the  screen at one time.  Automatic refreshes of pads (as
       from scrolling or echoing of input) do not occur.

       It is not valid to call wrefresh with a pad argument; call prefresh  or
       pnoutrefresh  instead.   They  require additional parameters to specify
       the part of the pad to be displayed and the location on the  screen  to
       be used for the display.


subpad

       The  subpad routine creates and returns a pointer to a subwindow within
       a pad with the given number  of  lines,  nlines,  and  columns,  ncols.
       Unlike subwin, which uses screen coordinates, the window is at position
       (begin_x, begin_y) on the pad.  The window is made in the middle of the
       window  orig,  so  that changes made to one window affect both windows.
       During the use of this routine, it will  often  be  necessary  to  call
       touchwin or touchline on orig before calling prefresh.


prefresh, pnoutrefresh

       The  prefresh  and  pnoutrefresh routines are analogous to wrefresh and
       wnoutrefresh except that they relate to pads instead of  windows.   The
       additional  parameters  are needed to indicate what part of the pad and
       screen are involved.

       o   The pminrow and pmincol  parameters  specify  the  upper  left-hand
           corner of the rectangle to be displayed in the pad.

       o   The  sminrow,  smincol, smaxrow, and smaxcol parameters specify the
           edges of the rectangle to be displayed on the screen.

       The lower right-hand corner of the rectangle to be displayed in the pad
       is calculated from the screen coordinates, since the rectangles must be
       the same size.  Both rectangles must be entirely contained within their
       respective  structures.   Negative values of pminrow, pmincol, sminrow,
       or smincol are treated as if they were zero.


pechochar

       The pechochar routine is functionally equivalent to  a  call  to  addch
       followed  by a call to refresh(3x), a call to waddch followed by a call
       to wrefresh, or a call to waddch followed by a call to  prefresh.   The
       knowledge  that  only  a single character is being output is taken into
       consideration  and,  for   non-control   characters,   a   considerable
       performance gain might be seen by using these routines instead of their
       equivalents.  In the case of pechochar, the last location of the pad on
       the screen is reused for the arguments to prefresh.


pecho_wchar

       The  pecho_wchar  function  is  the  analogous  wide-character  form of
       pechochar.  It outputs one character to a pad and immediately refreshes
       the  pad.   It  does  this  by a call to wadd_wch followed by a call 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.

       X/Open   Curses   does  not  define  any  error  conditions.   In  this
       implementation

          prefresh and pnoutrefresh
               return an error if the window pointer is null, or if the window
               is  not  really  a  pad  or if the area to refresh extends off-
               screen or if the  minimum  coordinates  are  greater  than  the
               maximum.

          pechochar
               returns  an  error  if  the window is not really a pad, and the
               associated call to wechochar returns an error.

          pecho_wchar
               returns an error if the window is not really  a  pad,  and  the
               associated call to wecho_wchar returns an error.


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.

       The XSI Curses standard, Issue 4  describes  these  functions,  without
       significant  change from the SVr3 documentation.  It describes no error
       conditions.  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.4                       2024-01-05                      curs_pad(3x)
ncurses-6.4-20240113/doc/html/man/curs_util.3x.html0000644000000000000000000006106514546123513020165 0ustar rootroot curs_util 3x 2024-01-05 ncurses 6.4 Library calls

curs_util 3x 2024-01-05 ncurses 6.4 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 c);
       wchar_t *wunctrl(cchar_t *c);

       const char *keyname(int c);
       const char *key_name(wchar_t w);

       void filter(void);

       void use_env(bool f);

       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 f);


DESCRIPTION


unctrl

       The  unctrl  routine  returns  a  character string which is a printable
       representation of the character c:

       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 c.

       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  w.   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 which set the screen size.

       The use_env and use_tioctl routines combine as follows.

              use_env   use_tioctl   Summary
              -----------------------------------------------------------------
              TRUE      FALSE        This  is  the  default behavior.  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  which  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.

       X/Open does not define any error conditions.  In this implementation

          flushinp
               returns an error if the terminal was not initialized.

          putwin
               returns  an  error  if  the  associated  fwrite calls return an
               error.


PORTABILITY


filter

       The SVr4 documentation describes the  action  of  filter  only  in  the
       vaguest  terms.   The  description  here is adapted from the XSI Curses
       standard (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 which are defined in the terminfo entry via the -x  option
       of tic.  This implementation automatically assigns at run-time keycodes
       to user-defined strings which begin with "k".  The  keycodes  start  at
       KEY_MAX, but are not guaranteed to be the same value for different runs
       because user-defined codes are merged from  all  terminal  descriptions
       which  have  been loaded.  The 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  which  use  binary  dumps  use block-I/O (the
           fwrite and fread 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

       The  XSI Curses standard, Issue 4 describes these functions.  It states
       that unctrl and wunctrl will return a null pointer if unsuccessful, but
       does  not  define any error conditions.  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.


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.4                       2024-01-05                     curs_util(3x)
ncurses-6.4-20240113/doc/html/man/mitem_visible.3x.html0000644000000000000000000001100014530450431020757 0ustar rootroot mitem_visible 3x 2023-11-25 ncurses 6.4 Library calls

mitem_visible 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                 mitem_visible(3x)
ncurses-6.4-20240113/doc/html/man/curs_print.3x.html0000644000000000000000000001417414541645311020343 0ustar rootroot curs_print 3x 2023-12-23 ncurses 6.4 Library calls

curs_print 3x 2023-12-23 ncurses 6.4 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

       This  function  uses  the mc5p or mc4 and mc5 capabilities, if they are
       present, to ship given data to a printer attached to the terminal.

       Note that the mcprint code has no way  to  do  flow  control  with  the
       printer  or  to  know  how  much buffering it has.  Your application is
       responsible for keeping the rate of writes to  the  printer  below  its
       continuous  throughput  rate  (typically  about half of its nominal cps
       rating).   Dot-matrix  printers  and   6-page-per-minute   lasers   can
       typically  handle  80cps,  so  a  good conservative rule of thumb is to
       sleep for a second after shipping each 80-character line.


RETURN VALUE

       The mcprint function returns ERR if the  write  operation  aborted  for
       some  reason.   In  this  case,  errno  will  contain  either  an error
       associated with write(2) or one of the following:

       ENODEV
            Capabilities for printer redirection do not exist.

       ENOMEM
            Couldn't allocate sufficient memory to buffer the printer write.

       When mcprint succeeds, it returns the  number  of  characters  actually
       sent to the printer.


EXTENSIONS

       mcprint was designed for ncurses(3x), and was 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.


BUGS

       Padding in the mc5p, mc4, and mc5 capabilities is not interpreted.


SEE ALSO

       curses(3x)



ncurses 6.4                       2023-12-23                    curs_print(3x)
ncurses-6.4-20240113/doc/html/man/menu_driver.3x.html0000644000000000000000000002416014541645312020467 0ustar rootroot menu_driver 3x 2023-12-23 ncurses 6.4 Library calls

menu_driver 3x 2023-12-23 ncurses 6.4 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.4                       2023-12-23                   menu_driver(3x)
ncurses-6.4-20240113/doc/html/man/resizeterm.3x.html0000644000000000000000000002756514537426152020361 0ustar rootroot resizeterm 3x 2023-12-16 ncurses 6.4 Library calls

resizeterm 3x 2023-12-16 ncurses 6.4 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.4                       2023-12-16                    resizeterm(3x)
ncurses-6.4-20240113/doc/html/man/curs_extend.3x.html0000644000000000000000000001551014541645310020470 0ustar rootroot curs_extend 3x 2023-12-23 ncurses 6.4 Library calls

curs_extend 3x 2023-12-23 ncurses 6.4 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 enable);


DESCRIPTION

       These  functions  are extensions to the curses library which do not fit
       easily into other categories.


curses_version

       Use curses_version to get the version number, including patch level  of
       the library, prefixed by "ncurses", e.g.,

              ncurses 5.0.19991023


use_extended_names

       The   use_extended_names   function   controls   whether   the  calling
       application is able to use user-defined or nonstandard names which  may
       be  compiled  into  the terminfo description, i.e., via the terminfo or
       termcap interfaces.  Normally these names are available for use,  since
       the essential decision is made by using the -x option of tic to compile
       extended terminal definitions.  However you can disable this feature to
       ensure compatibility with other implementations of curses.


RETURN VALUE

       curses_version  returns a pointer to static memory; you should not free
       this in your application.

       use_extended_names returns the previous state,  allowing  you  to  save
       this and restore 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

       curs_getch(3x),    curs_mouse(3x),    curs_print(3x),    curs_util(3x),
       default_colors(3x),    define_key(3x),     keybound(3x),     keyok(3x),
       resizeterm(3x), wresize(3x)



ncurses 6.4                       2023-12-23                   curs_extend(3x)
ncurses-6.4-20240113/doc/html/man/curs_in_wch.3x.html0000644000000000000000000001376514526247437020475 0ustar rootroot curs_in_wch 3x 2023-11-18 ncurses 6.4 Library calls

curs_in_wch 3x 2023-11-18 ncurses 6.4 Library calls

curs_in_wch(3x)                  Library calls                 curs_in_wch(3x)




NAME

       in_wch,  mvin_wch,  mvwin_wch, win_wch - get a curses complex character
       from a window


SYNOPSIS

       #include <curses.h>

       int in_wch(cchar_t *wcval);
       int win_wch(WINDOW *win, 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);


DESCRIPTION

       These functions extract the complex character and  rendition  from  the
       current position in the named window into the cchar_t object referenced
       by wcval.


RETURN VALUE

       No errors are defined in the XSI Curses standard.  This  implementation
       checks  for  null  pointers,  returns  ERR  in that case.  Also, the mv
       routines check for error moving the cursor, returning ERR in that case.
       Otherwise they return OK.

       Functions  with  a  "mv"  prefix  first perform a cursor movement using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       Note that all of these routines may be macros.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.


SEE ALSO

       curses(3x),     curs_inch(3x),     curs_inchstr(3x),    curs_instr(3x),
       curs_inwstr(3x)



ncurses 6.4                       2023-11-18                   curs_in_wch(3x)
ncurses-6.4-20240113/doc/html/man/menu_attributes.3x.html0000644000000000000000000001637714530450430021366 0ustar rootroot menu_attributes 3x 2023-11-25 ncurses 6.4 Library calls

menu_attributes 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25               menu_attributes(3x)
ncurses-6.4-20240113/doc/html/man/default_colors.3x.html0000644000000000000000000002243714537426150021164 0ustar rootroot default_colors 3x 2023-12-16 ncurses 6.4 Library calls

default_colors 3x 2023-12-16 ncurses 6.4 Library calls

default_colors(3x)               Library calls              default_colors(3x)




NAME

       use_default_colors,  assume_default_colors  -  use  terminal's  default
       colors


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.4                       2023-12-16                default_colors(3x)
ncurses-6.4-20240113/doc/html/man/keybound.3x.html0000644000000000000000000001215414537426151017773 0ustar rootroot keybound 3x 2023-12-16 ncurses 6.4 Library calls

keybound 3x 2023-12-16 ncurses 6.4 Library calls

keybound(3x)                     Library calls                    keybound(3x)




NAME

       keybound - get definition of curses keycode


SYNOPSIS

       #include <curses.h>

       char * keybound(int keycode, int count);


DESCRIPTION

       This  is an extension to the curses library.  It permits an application
       to determine the string which is defined in the terminfo  for  specific
       keycodes.


RETURN VALUE

       The keycode parameter must be greater than zero, else NULL is returned.
       If it does not correspond to a defined key, then NULL is returned.  The
       count  parameter  is  used  to allow the application to iterate through
       multiple  definitions,  counting  from  zero.   When  successful,   the
       function returns a string which must be freed by the caller.


PORTABILITY

       This  routine  is specific to ncurses.  It was not supported on Version
       7, BSD or System V implementations.  It is recommended  that  any  code
       depending on them be conditioned using NCURSES_VERSION.


AUTHORS

       Thomas Dickey


SEE ALSO

       define_key(3x), keyok(3x)



ncurses 6.4                       2023-12-16                      keybound(3x)
ncurses-6.4-20240113/doc/html/man/curs_ins_wstr.3x.html0000644000000000000000000002115414537426147021064 0ustar rootroot curs_ins_wstr 3x 2023-12-16 ncurses 6.4 Library calls

curs_ins_wstr 3x 2023-12-16 ncurses 6.4 Library calls

curs_ins_wstr(3x)                Library calls               curs_ins_wstr(3x)




NAME

       ins_wstr,  ins_nwstr,  wins_wstr,  wins_nwstr, mvins_wstr, mvins_nwstr,
       mvwins_wstr, mvwins_nwstr - insert a wide-character string in a  curses
       window


SYNOPSIS

       #include <curses.h>

       int ins_wstr(const wchar_t *wstr);
       int ins_nwstr(const wchar_t *wstr, int n);
       int wins_wstr(WINDOW *win, const wchar_t *wstr);
       int wins_nwstr(WINDOW *win, const wchar_t *wstr, int n);

       int mvins_wstr(int y, int x, const wchar_t *wstr);
       int mvins_nwstr(int y, int x, const wchar_t *wstr, int n);
       int mvwins_wstr(WINDOW *win, int y, int x, const wchar_t *wstr);
       int mvwins_nwstr(WINDOW *win, int y, int x, const wchar_t *wstr, int n);


DESCRIPTION

       These routines insert a wchar_t character string (as many characters as
       will fit on the line) before the character  under  the  cursor,  as  if
       calling  wins_wch(3x).   All  characters to the right of the cursor are
       shifted right, with the possibility of the rightmost characters on  the
       line being lost.  No wrapping is performed.

       The  cursor  position  does  not  change  (after  moving  to  y,  x, if
       specified).

       The functions with n as the last argument insert a leading substring of
       at  most  n  wchar_t  characters.   If  n is less than zero, the entire
       string is inserted (stopping on a L'\0' character).

       Special characters are handled as in wadd_wch(3x).


RETURN VALUE

       All functions return the integer ERR upon failure and OK on success.

       X/Open does not  define  any  error  conditions.   This  implementation
       returns an error

       o   if the win parameter is null or

       o   if the wstr parameter is null or

       o   if the wins_wch function returns an error.

       Functions  with  a  "mv"  prefix  first perform a cursor movement using
       wmove(3x), and return an error if the position is outside  the  window,
       or if the window pointer is null.


NOTES

       All but wins_nwstr may be macros.

       If  the first character in the string is a non-spacing character, these
       functions will fail.  XSI does not define what will happen  if  a  non-
       spacing character follows a control character.


PORTABILITY

       These  functions  are  described  in  the XSI Curses standard, Issue 4,
       which adds const qualifiers to the arguments.

       X/Open 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, and differs from the X/Open implementation on Solaris.


SEE ALSO

       curses(3x), curs_insstr(3x), curs_ins_wch(3x), curs_in_wch(3x)



ncurses 6.4                       2023-12-16                 curs_ins_wstr(3x)
ncurses-6.4-20240113/doc/html/man/form_field_info.3x.html0000644000000000000000000001500314530450427021264 0ustar rootroot form_field_info 3x 2023-11-25 ncurses 6.4 Library calls

form_field_info 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25               form_field_info(3x)
ncurses-6.4-20240113/doc/html/man/curs_ins_wch.3x.html0000644000000000000000000001520114541645310020630 0ustar rootroot curs_ins_wch 3x 2023-12-23 ncurses 6.4 Library calls

curs_ins_wch 3x 2023-12-23 ncurses 6.4 Library calls

curs_ins_wch(3x)                 Library calls                curs_ins_wch(3x)




NAME

       ins_wch,  mvins_wch,  mvwins_wch,  wins_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 using  wmove
       and fail if the position (y, x) is outside the window.


NOTES

       A  terminal's  insert_character  (ich1)  capability  is not necessarily
       employed.

       ins_wch, mvins_wch, and mvwins_wch may be implemented as macros.


PORTABILITY

       X/Open Curses, Issue 4, describes these functions.

       SVr4 describes successful return values only as "an integer value other
       than ERR".


HISTORY

       SVr4  (1989)  implemented  these  functions  under  the  names  inswch,
       winswch, mvinswch, and mvwinswch.


SEE ALSO

       curs_insch(3x) describes comparable functions in the non-wide-character
       curses configuration.

       curses(3x), terminfo(5)



ncurses 6.4                       2023-12-23                  curs_ins_wch(3x)
ncurses-6.4-20240113/doc/html/man/curs_threads.3x.html0000644000000000000000000011430114550604706020635 0ustar rootroot curs_threads 3x 2024-01-13 ncurses 6.4 Library calls

curs_threads 3x 2024-01-13 ncurses 6.4 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.4                       2024-01-13                  curs_threads(3x)
ncurses-6.4-20240113/doc/html/man/curs_in_wchstr.3x.html0000644000000000000000000002067514526247437021224 0ustar rootroot curs_in_wchstr 3x 2023-11-18 ncurses 6.4 Library calls

curs_in_wchstr 3x 2023-11-18 ncurses 6.4 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 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);


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
       an error

       o   if the win parameter is null or

       o   if the wchstr parameter is null.

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


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

       The XSI Curses defines no error conditions.  This implementation checks
       for null pointers, returning ERR in that case.


SEE ALSO

       curses(3x),    curs_inchstr(3x),    curs_instr(3x),    curs_inwstr(3x),
       curs_in_wch(3x)



ncurses 6.4                       2023-11-18                curs_in_wchstr(3x)
ncurses-6.4-20240113/doc/html/man/keyok.3x.html0000644000000000000000000001200714537426151017272 0ustar rootroot keyok 3x 2023-12-16 ncurses 6.4 Library calls

keyok 3x 2023-12-16 ncurses 6.4 Library calls

keyok(3x)                        Library calls                       keyok(3x)




NAME

       keyok - enable or disable a curses keycode


SYNOPSIS

       #include <curses.h>

       int keyok(int keycode, bool enable);


DESCRIPTION

       This  is an extension to the curses library.  It permits an application
       to disable specific keycodes, rather than use the  keypad  function  to
       disable all keycodes.  Keys that have been disabled can be re-enabled.


RETURN VALUE

       The  keycode  must  be  greater than zero, else ERR is returned.  If it
       does not correspond to a defined key, then ERR  is  returned.   If  the
       enable  parameter  is  true,  then the key must have been disabled, and
       vice versa.  Otherwise, the function returns OK.


PORTABILITY

       This routine is specific to ncurses.  It was not supported  on  Version
       7,  BSD  or  System V implementations.  It is recommended that any code
       depending on them be conditioned using NCURSES_VERSION.


AUTHORS

       Thomas Dickey


SEE ALSO

       define_key(3x)



ncurses 6.4                       2023-12-16                         keyok(3x)
ncurses-6.4-20240113/doc/html/man/form_field_userptr.3x.html0000644000000000000000000001237414530450430022037 0ustar rootroot form_field_userptr 3x 2023-11-25 ncurses 6.4 Library calls

form_field_userptr 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25            form_field_userptr(3x)
ncurses-6.4-20240113/doc/html/man/menu_new.3x.html0000644000000000000000000001305414530450430017756 0ustar rootroot menu_new 3x 2023-11-25 ncurses 6.4 Library calls

menu_new 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                      menu_new(3x)
ncurses-6.4-20240113/doc/html/man/menu_win.3x.html0000644000000000000000000001527314530450431017770 0ustar rootroot menu_win 3x 2023-11-25 ncurses 6.4 Library calls

menu_win 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                      menu_win(3x)
ncurses-6.4-20240113/doc/html/man/form_win.3x.html0000644000000000000000000001527314530450430017766 0ustar rootroot form_win 3x 2023-11-25 ncurses 6.4 Library calls

form_win 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                      form_win(3x)
ncurses-6.4-20240113/doc/html/man/tset.1.html0000644000000000000000000005630314550576014016743 0ustar rootroot tset 1 2023-12-23 ncurses 6.4 User commands

tset 1 2023-12-23 ncurses 6.4 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
           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, which may
           be from the operating system, the  LINES  and  COLUMNS  environment
           variables or the terminal description.

       Obtaining  the  window  size from the terminal description is common to
       both implementations, but considered obsolescent.  Its  only  practical
       use is for hardware terminals.  Generally speaking, a window size would
       be unset only if there were some problem obtaining the value  from  the
       operating  system  (and  setupterm would still fail).  For that reason,
       the LINES and COLUMNS environment variables may be useful  for  working
       around  window-size  problems.   Those  have  the  drawback that if the
       window is resized, those variables must be recomputed  and  reassigned.
       To do this more easily, use the resize(1) program.


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.4                       2023-12-23                           tset(1)
ncurses-6.4-20240113/doc/html/man/form_new.3x.html0000644000000000000000000001314614530450430017757 0ustar rootroot form_new 3x 2023-11-25 ncurses 6.4 Library calls

form_new 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                      form_new(3x)
ncurses-6.4-20240113/doc/html/man/curs_mouse.3x.html0000644000000000000000000005747114550604705020350 0ustar rootroot curs_mouse 3x 2024-01-13 ncurses 6.4 Library calls

curs_mouse 3x 2024-01-13 ncurses 6.4 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);

       int getmouse(MEVENT *event);
       int ungetmouse(MEVENT *event);

       mmask_t mousemask(mmask_t newmask, mmask_t *oldmask);

       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.


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 mousemask 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.


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 window-relative coordinates due to the mechanism to
       reserve lines on top or bottom of the screen for  other  purposes  (see
       the ripoffline 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  window-relative  coordinates and returned
           through the  pointers.   If  the  conversion  was  successful,  the
           function returns TRUE.

       o   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  window-
           relative   coordinates.   They  are  converted  to  stdscr-relative
           coordinates if the window win encloses this point.   In  this  case
           the function returns TRUE.

       o   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 thousands of a
       second) that can elapse between press and release events for them to be
       recognized   as   a  click.   Use  mouseinterval(0)  to  disable  click
       resolution.  This function returns the previous  interval  value.   Use
       mouseinterval(-1)  to  obtain  the  interval  without altering it.  The
       default is one sixth of a second.


has_mouse

       The has_mouse function returns  TRUE  if  the  mouse  driver  has  been
       successfully initialized, and FALSE otherwise.

       Note  that  mouse  events will be ignored when input is in cooked mode,
       and will cause an error beep when cooked mode is being simulated  in  a
       window  by a function such as getstr that expects a linefeed for input-
       loop termination.


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 an error 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.

       Mouse  event  reports from xterm are not detected correctly in a window
       with keypad application mode disabled, since they are interpreted as  a
       variety  of function key.  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_slk(3x),
       curs_variables(3x)



ncurses 6.4                       2024-01-13                    curs_mouse(3x)
ncurses-6.4-20240113/doc/html/man/form_userptr.3x.html0000644000000000000000000001235314530450430020671 0ustar rootroot form_userptr 3x 2023-11-25 ncurses 6.4 Library calls

form_userptr 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                  form_userptr(3x)
ncurses-6.4-20240113/doc/html/man/curs_add_wchstr.3x.html0000644000000000000000000002124414530450425021323 0ustar rootroot curs_add_wchstr 3x 2023-11-25 ncurses 6.4 Library calls

curs_add_wchstr 3x 2023-11-25 ncurses 6.4 Library calls

curs_add_wchstr(3x)              Library calls             curs_add_wchstr(3x)




NAME

       add_wchstr,   add_wchnstr,   wadd_wchstr,  wadd_wchnstr,  mvadd_wchstr,
       mvadd_wchnstr, mvwadd_wchstr, mvwadd_wchnstr -  add  a  curses  complex
       character string to a window


SYNOPSIS

       #include <curses.h>

       int add_wchstr(const cchar_t *wchstr);
       int add_wchnstr(const cchar_t *wchstr, int n);
       int wadd_wchstr(WINDOW * win, const cchar_t *wchstr);
       int wadd_wchnstr(WINDOW * win, const cchar_t *wchstr, int n);

       int mvadd_wchstr(int y, int x, const cchar_t *wchstr);
       int mvadd_wchnstr(int y, int x, const cchar_t *wchstr, int n);
       int mvwadd_wchstr(WINDOW *win, int y, int x, const cchar_t *wchstr);
       int mvwadd_wchnstr(WINDOW *win, int y, int x, const cchar_t *wchstr, int n);


DESCRIPTION

       These  functions copy the (null-terminated) array of complex characters
       wchstr into the window image structure starting at the  current  cursor
       position.

       The four functions with n as the last argument copy at most n elements,
       but no more than will fit on the line.  If n=-1 then the whole array is
       copied, to the maximum number of characters that will fit on the line.

       The  window  cursor  is  not advanced.  These functions are faster than
       waddnstr.  On the other hand:

       o   they do not perform checking (such as for the  newline,  backspace,
           or carriage return characters),

       o   they do not advance the current cursor position,

       o   they do not expand other control characters to ^-escapes, and

       o   they  truncate  the  string  if it crosses the right margin, rather
           than wrapping it around to the new line.

       These functions end successfully on encountering  a  null  cchar_t,  or
       when  they have filled the current line.  If a complex character cannot
       completely fit at the end of the current line,  the  remaining  columns
       are filled with the background character and rendition.


RETURN VALUE

       All functions return the integer ERR upon failure and OK on success.

       X/Open  does  not  define  any  error  conditions.  This implementation
       returns an error

       o   if the win parameter is null or

       o   if the wchstr parameter is null.

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       All functions except wadd_wchnstr may be macros.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.


SEE ALSO

       curses(3x),   curs_addch(3x),    curs_addchstr(3x),    curs_addstr(3x),
       curs_addwstr(3x), curs_add_wch(3x)



ncurses 6.4                       2023-11-25               curs_add_wchstr(3x)
ncurses-6.4-20240113/doc/html/man/form_field_attributes.3x.html0000644000000000000000000001471014530450427022523 0ustar rootroot form_field_attributes 3x 2023-11-25 ncurses 6.4 Library calls

form_field_attributes 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25         form_field_attributes(3x)
ncurses-6.4-20240113/doc/html/man/menu_items.3x.html0000644000000000000000000001426614530450430020314 0ustar rootroot menu_items 3x 2023-11-25 ncurses 6.4 Library calls

menu_items 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                    menu_items(3x)
ncurses-6.4-20240113/doc/html/man/tic.1m.html0000644000000000000000000007030614544131761016716 0ustar rootroot tic 1m 2023-12-30 ncurses 6.4 User commands

tic 1m 2023-12-30 ncurses 6.4 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
       cancelled 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.4                       2023-12-30                           tic(1m)
ncurses-6.4-20240113/doc/html/man/curs_addchstr.3x.html0000644000000000000000000002025714530450426021001 0ustar rootroot curs_addchstr 3x 2023-11-25 ncurses 6.4 Library calls

curs_addchstr 3x 2023-11-25 ncurses 6.4 Library calls

curs_addchstr(3x)                Library calls               curs_addchstr(3x)




NAME

       addchstr,  addchnstr,  waddchstr,  waddchnstr, mvaddchstr, mvaddchnstr,
       mvwaddchstr, mvwaddchnstr - add a curses character string to a window


SYNOPSIS

       #include <curses.h>

       int addchstr(const chtype *chstr);
       int addchnstr(const chtype *chstr, int n);
       int waddchstr(WINDOW *win, const chtype *chstr);
       int waddchnstr(WINDOW *win, const chtype *chstr, int n);

       int mvaddchstr(int y, int x, const chtype *chstr);
       int mvaddchnstr(int y, int x, const chtype *chstr, int n);
       int mvwaddchstr(WINDOW *win, int y, int x, const chtype *chstr);
       int mvwaddchnstr(WINDOW *win, int y, int x, const chtype *chstr, int n);


DESCRIPTION

       These functions copy the (null-terminated) chstr array into the  window
       image structure starting at the current cursor position.

       The four functions with n as the last argument copy at most n elements,
       but no more than will fit on the line.  If n=-1 then the whole array is
       copied, to the maximum number of characters that will fit on the line.

       The  window  cursor  is  not advanced.  These functions are faster than
       waddnstr.  On the other hand:

       o   they do not perform checking (such as for the  newline,  backspace,
           or carriage return characters),

       o   they do not advance the current cursor position,

       o   they do not expand other control characters to ^-escapes, and

       o   they  truncate  the  string  if it crosses the right margin, rather
           than wrapping it around to the new line.


RETURN VALUE

       All functions return the integer ERR upon failure and OK on success.

       X/Open does not  define  any  error  conditions.   This  implementation
       returns an error

       o   if the win parameter is null or

       o   if the wchstr parameter is null.

       Functions  with  a  "mv"  prefix  first perform a cursor movement using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       All functions except waddchnstr may be macros.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.


SEE ALSO

       curses(3x),    curs_addch(3x),    curs_addstr(3x),    curs_addwstr(3x),
       curs_add_wchstr(3x)



ncurses 6.4                       2023-11-25                 curs_addchstr(3x)
ncurses-6.4-20240113/doc/html/man/curs_inchstr.3x.html0000644000000000000000000002120314526251625020654 0ustar rootroot curs_inchstr 3x 2023-11-18 ncurses 6.4 Library calls

curs_inchstr 3x 2023-11-18 ncurses 6.4 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
       an error

       o   if the win parameter is null or

       o   if the chstr parameter is null.

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


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 the XSI Curses standard, Issue 4.  It
       is no more specific than the SVr4 documentation on the trailing 0.   It
       does specify that the successful return of the functions is OK.


SEE ALSO

       curses(3x), curs_inch(3x), curs_inwstr(3x), curs_in_wchstr(3x)



ncurses 6.4                       2023-11-18                  curs_inchstr(3x)
ncurses-6.4-20240113/doc/html/man/curs_bkgd.3x.html0000644000000000000000000002714214546047763020131 0ustar rootroot curs_bkgd 3x 2023-12-23 ncurses 6.4 Library calls

curs_bkgd 3x 2023-12-23 ncurses 6.4 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

       The  background  of  a  curses  window  (in  the  library's  non-"wide"
       configuration)   is  a  chtype  combining  a  set  of  attributes  (see
       curs_attr(3x)) with a character called the blank character.

       The blank character is a spacing character that  populates  a  window's
       character  cells  when  their  contents are erased without replacement.
       The background's attributes are combined with all non-blank  characters
       written  to  the window, as with the waddch(3x) and winsch(3x) families
       of functions.

       The blank character and  attributes  of  the  background  combine  with
       characters  written  to  the window as described below.  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  blank  character;  if they match, ncurses writes the new
           blank 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.

       ncurses  treats  a  background  character  value of zero (0) as a blank
       character.

       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.4                       2023-12-23                     curs_bkgd(3x)
ncurses-6.4-20240113/doc/html/man/curs_sp_funcs.3x.html0000644000000000000000000007370314550576011021032 0ustar rootroot curs_sp_funcs 3x 2023-12-23 ncurses 6.4 Library calls

curs_sp_funcs 3x 2023-12-23 ncurses 6.4 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 *ch);
       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 ch);
       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 *ch);
       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 wch);
       int ungetch_sp(SCREEN* sp, int ch);
       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 *ch);

       #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 c);


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.4                       2023-12-23                 curs_sp_funcs(3x)
ncurses-6.4-20240113/doc/html/man/curs_get_wstr.3x.html0000644000000000000000000003022214537426147021046 0ustar rootroot curs_get_wstr 3x 2023-12-16 ncurses 6.4 Library calls

curs_get_wstr 3x 2023-12-16 ncurses 6.4 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 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);


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 an error

       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  with  a  "mv"  prefix  first perform a cursor movement using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


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

       These functions are described in The Single Unix Specification, Version
       2.  No error conditions are defined.

       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

       curses(3x), curs_getstr(3x), curs_get_wch(3x)



ncurses 6.4                       2023-12-16                 curs_get_wstr(3x)
ncurses-6.4-20240113/doc/html/man/curs_addwstr.3x.html0000644000000000000000000002065514526247437020672 0ustar rootroot curs_addwstr 3x 2023-11-18 ncurses 6.4 Library calls

curs_addwstr 3x 2023-11-18 ncurses 6.4 Library calls

curs_addwstr(3x)                 Library calls                curs_addwstr(3x)




NAME

       addwstr,   addnwstr,   waddwstr,   waddnwstr,   mvaddwstr,  mvaddnwstr,
       mvwaddwstr, 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 addnwstr(const wchar_t *wstr, int n);
       int waddwstr(WINDOW *win, const wchar_t *wstr);
       int waddnwstr(WINDOW *win, const wchar_t *wstr, int n);

       int mvaddwstr(int y, int x, const wchar_t *wstr);
       int mvaddnwstr(int y, int x, const wchar_t *wstr, int n);
       int mvwaddwstr(WINDOW *win, int y, int x, const wchar_t *wstr);
       int mvwaddnwstr(WINDOW *win, int y, int x, const wchar_t *wstr, int n);


DESCRIPTION

       These  functions  write the characters of the (null-terminated) wchar_t
       character  string  wstr  on  the  given  window.   It  is  similar   to
       constructing  a  cchar_t  for  each wchar_t in the string, then calling
       wadd_wch(3x) for the resulting cchar_t:

       o   spacing and non-spacing characters in the string are processed  one
           at a time, and

       o   control characters are processed as in waddch(3x).

       The  mv  functions  perform  cursor  movement  once, before writing any
       characters.  Thereafter, the cursor is advanced  as  a  side-effect  of
       writing to the window.

       The  four functions with n as the last argument write at most n wchar_t
       characters, or until a terminating null is reached.  If n is  -1,  then
       the entire string will be added.


RETURN VALUE

       All functions return the integer ERR upon failure and OK on success.

       X/Open  does  not  define  any  error  conditions.  This implementation
       returns an error

       o   if the window pointer is null or

       o   if the string pointer is null or

       o   if the corresponding calls to wadd_wch return an error.

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       All of these functions except waddnwstr may be macros.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.


SEE ALSO

       curses(3x),   curs_addch(3x),    curs_addchstr(3x),    curs_addstr(3x),
       curs_add_wch(3x), curs_add_wchstr(3x)



ncurses 6.4                       2023-11-18                  curs_addwstr(3x)
ncurses-6.4-20240113/doc/html/man/curs_variables.3x.html0000644000000000000000000004266614550576012021167 0ustar rootroot curs_variables 3x 2024-01-05 ncurses 6.4 Library calls

curs_variables 3x 2024-01-05 ncurses 6.4 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 an escape character corresponding to a user's
       press of an "Escape" key on the input device from  one  included  in  a
       control sequence used by a cursor movement or function key, the library
       waits to see if another key event occurs after  the  escape  character.
       ESCDELAY stores this interval in milliseconds.


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  terminfo
       libraries, most of these variables reside in the curses library.


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

       curses(3x),   curs_color(3x),    curs_opaque(3x),    curs_terminfo(3x),
       curs_threads(3x), term_variables(3x), terminfo(5)

       [UAX  #29]  "Unicode  Standard  Annex  #29: Unicode Text Segmentation";
       <https://unicode.org/reports/tr29/>



ncurses 6.4                       2024-01-05                curs_variables(3x)
ncurses-6.4-20240113/doc/html/man/curs_getch.3x.html0000644000000000000000000005565314541645310020307 0ustar rootroot curs_getch 3x 2023-12-23 ncurses 6.4 Library calls

curs_getch 3x 2023-12-23 ncurses 6.4 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


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 ch);

       /* extension */
       int has_key(int ch);


DESCRIPTION


Reading Characters

       The getch, wgetch, mvgetch and mvwgetch, routines read a character from
       the window.  In no-delay mode, if no input is waiting, the value ERR is
       returned.  In delay mode, the program waits  until  the  system  passes
       text  through to the program.  Depending on the setting of cbreak, this
       is after one character  (cbreak  mode),  or  after  the  first  newline
       (nocbreak  mode).   In  half-delay  mode,  the  program  waits  until a
       character is typed or the specified timeout has been reached.

       If echo is enabled, and the window is not a  pad,  then  the  character
       will  also  be  echoed  into  the  designated  window  according to the
       following rules:

       o   If the character is the current erase  character,  left  arrow,  or
           backspace,  the  cursor  is  moved  one  space to the left and that
           screen position is erased as if delch had been called.

       o   If the character value is  any  other  KEY_  define,  the  user  is
           alerted with a beep call.

       o   If  the character is a carriage-return, and if nl is enabled, it is
           translated to a line-feed after echoing.

       o   Otherwise the character is simply output to the screen.

       If the window is not a pad, and it has been moved or modified since the
       last call to wrefresh, wrefresh will be called before another character
       is read.


Keypad Mode

       If keypad is TRUE, and a function key is pressed, the  token  for  that
       function key is returned instead of the raw characters:

       o   The  predefined  function  keys  are listed in <curses.h> as macros
           with values outside the range of  8-bit  characters.   Their  names
           begin with KEY_.

       o   Other  (user-defined)  function  keys  which  may  be defined using
           define_key(3x) have no names, but also are expected to have  values
           outside the range of 8-bit characters.

       Thus,  a  variable  intended to hold the return value of a function key
       must be of short size or larger.

       When a character that could be the  beginning  of  a  function  key  is
       received  (which,  on  modern  terminals,  means  an escape character),
       curses sets a timer.  If the remainder of the sequence does not come in
       within the designated time, the character is passed through; otherwise,
       the function key value is returned.  For this  reason,  many  terminals
       experience  a  delay between the time a user presses the escape key and
       the escape is returned to the program.

       In ncurses, the timer normally expires after the value in ESCDELAY (see
       curs_variables(3x)).   If notimeout is TRUE, the timer does not expire;
       it is an infinite (or very large) value.  Because function keys usually
       begin  with  an  escape  character,  the terminal may appear to hang in
       notimeout mode after pressing the  escape  key  until  another  key  is
       pressed.


Ungetting Characters

       The  ungetch routine places ch back onto the input queue to be returned
       by the next call to wgetch.  There is just  one  input  queue  for  all
       windows.


Predefined Key Codes

       The following special keys are defined in <curses.h>.

       o   Except  for  the special case KEY_RESIZE, it is necessary to enable
           keypad for getch to return these codes.

       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  long  terminfo  capability  names  for  the keys, and were
           defined long ago, in the 1980s.

              Name            Key name
              -------------------------------------------------
              KEY_BREAK       Break key
              KEY_DOWN        The four arrow keys ...
              KEY_UP
              KEY_LEFT
              KEY_RIGHT
              KEY_HOME        Home key (upward+left arrow)
              KEY_BACKSPACE   Backspace
              KEY_F0          Function keys; space for 64 keys
                              is reserved.
              KEY_F(n)        For 0 <= n <= 63
              KEY_DL          Delete line
              KEY_IL          Insert line
              KEY_DC          Delete character
              KEY_IC          Insert char or enter insert mode
              KEY_EIC         Exit insert char mode
              KEY_CLEAR       Clear screen
              KEY_EOS         Clear to end of screen
              KEY_EOL         Clear to end of line
              KEY_SF          Scroll 1 line forward
              KEY_SR          Scroll 1 line backward (reverse)
              KEY_NPAGE       Next page
              KEY_PPAGE       Previous page
              KEY_STAB        Set tab
              KEY_CTAB        Clear tab
              KEY_CATAB       Clear all tabs
              KEY_ENTER       Enter or send
              KEY_SRESET      Soft (partial) reset
              KEY_RESET       Reset or hard reset
              KEY_PRINT       Print or copy

              KEY_LL          Home down or bottom (lower left)
              KEY_A1          Upper left of keypad
              KEY_A3          Upper right of keypad
              KEY_B2          Center of keypad
              KEY_C1          Lower left of keypad
              KEY_C3          Lower right of keypad
              KEY_BTAB        Back tab key
              KEY_BEG         Beg(inning) key
              KEY_CANCEL      Cancel key
              KEY_CLOSE       Close key
              KEY_COMMAND     Cmd (command) key
              KEY_COPY        Copy key
              KEY_CREATE      Create key
              KEY_END         End key
              KEY_EXIT        Exit key
              KEY_FIND        Find key
              KEY_HELP        Help key
              KEY_MARK        Mark key
              KEY_MESSAGE     Message key
              KEY_MOUSE       Mouse event occurred
              KEY_MOVE        Move key
              KEY_NEXT        Next object key
              KEY_OPEN        Open key
              KEY_OPTIONS     Options key
              KEY_PREVIOUS    Previous object key
              KEY_REDO        Redo key
              KEY_REFERENCE   Ref(erence) key
              KEY_REFRESH     Refresh key
              KEY_REPLACE     Replace key
              KEY_RESIZE      Screen resized
              KEY_RESTART     Restart key
              KEY_RESUME      Resume key
              KEY_SAVE        Save key
              KEY_SBEG        Shifted beginning key
              KEY_SCANCEL     Shifted cancel key
              KEY_SCOMMAND    Shifted command key
              KEY_SCOPY       Shifted copy key
              KEY_SCREATE     Shifted create key
              KEY_SDC         Shifted delete char key
              KEY_SDL         Shifted delete line key
              KEY_SELECT      Select key
              KEY_SEND        Shifted end key
              KEY_SEOL        Shifted clear line key
              KEY_SEXIT       Shifted exit key
              KEY_SFIND       Shifted find key
              KEY_SHELP       Shifted help key
              KEY_SHOME       Shifted home key
              KEY_SIC         Shifted insert key
              KEY_SLEFT       Shifted left arrow key
              KEY_SMESSAGE    Shifted message key
              KEY_SMOVE       Shifted move key
              KEY_SNEXT       Shifted next key
              KEY_SOPTIONS    Shifted options key
              KEY_SPREVIOUS   Shifted prev key
              KEY_SPRINT      Shifted print key
              KEY_SREDO       Shifted redo key
              KEY_SREPLACE    Shifted replace key
              KEY_SRIGHT      Shifted right arrow key
              KEY_SRSUME      Shifted resume key
              KEY_SSAVE       Shifted save key
              KEY_SSUSPEND    Shifted suspend key
              KEY_SUNDO       Shifted undo key
              KEY_SUSPEND     Suspend key
              KEY_UNDO        Undo key

       Keypad is arranged like this:

              +-----+------+-------+
              | A1  |  up  |  A3   |
              +-----+------+-------+
              |left |  B2  | right |
              +-----+------+-------+
              | C1  | down |  C3   |
              +-----+------+-------+
       A few of these predefined values do not correspond to a real key:

       o   KEY_RESIZE  is  returned when the SIGWINCH signal has been detected
           (see  initscr(3x)  and  resizeterm(3x)).   This  code  is  returned
           whether or not keypad has been enabled.

       o   KEY_MOUSE  is returned for mouse-events (see curs_mouse(3x)).  This
           code relies upon  whether  or  not  keypad(3x)  has  been  enabled,
           because  (e.g.,  with  xterm(1) mouse prototocol) ncurses must read
           escape sequences, just like a function key.


Testing Key Codes

       The has_key routine takes a key-code value from  the  above  list,  and
       returns  TRUE  or  FALSE according to whether the current terminal type
       recognizes a key with that value.

       The library also supports these extensions:

          define_key
               defines a key-code for a given string (see define_key(3x)).

          key_defined
               checks if there is a key-code defined for a given  string  (see
               key_defined(3x)).


RETURN VALUE

       All  routines  return the integer ERR upon failure and an integer value
       other than ERR (OK in the case of ungetch) upon successful completion.

          ungetch
               returns ERR if there is no more room in the FIFO.

          wgetch
               returns ERR if the window pointer is null, or  if  its  timeout
               expires  without  having  any  data,  or  if  the execution was
               interrupted by a signal (errno will be set to EINTR).

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       Use of the escape key by a programmer for a single  character  function
       is  discouraged, as it will cause a delay of up to one second while the
       keypad code looks for a following function-key sequence.

       Some keys may  be  the  same  as  commonly  used  control  keys,  e.g.,
       KEY_ENTER  versus  control/M,  KEY_BACKSPACE  versus  control/H.   Some
       curses implementations may differ according to whether they treat these
       control  keys  specially (and ignore the terminfo), or use the terminfo
       definitions.  ncurses uses the terminfo definition.  If  it  says  that
       KEY_ENTER  is  control/M,  getch  will  return KEY_ENTER when you press
       control/M.

       Generally, KEY_ENTER denotes the character(s) sent by the Enter key  on
       the numeric keypad:

       o   the terminal description lists the most useful keys,

       o   the  Enter  key  on  the regular keyboard is already handled by the
           standard ASCII characters for carriage-return and line-feed,

       o   depending on whether nl or nonl was called, pressing "Enter" on the
           regular  keyboard may return either a carriage-return or line-feed,
           and finally

       o   "Enter or send" is the standard description for this key.

       When  using  getch,  wgetch,  mvgetch,  or  mvwgetch,   nocbreak   mode
       (nocbreak)  and  echo  mode (echo) should not be used at the same time.
       Depending on the state of the tty driver when each character is  typed,
       the program may produce undesirable results.

       Note that getch, mvgetch, and mvwgetch may be macros.

       Historically,  the  set  of  keypad  macros  was largely defined by the
       extremely function-key-rich keyboard of the AT&T  7300,  aka  3B1,  aka
       Safari  4.   Modern personal computers usually have only a small subset
       of these.  IBM PC-style consoles typically  support  little  more  than
       KEY_UP,  KEY_DOWN,  KEY_LEFT,  KEY_RIGHT, KEY_HOME, KEY_END, KEY_NPAGE,
       KEY_PPAGE, and function keys 1 through 12.   The  Ins  key  is  usually
       mapped to KEY_IC.


EXTENSIONS

       has_key  was designed for ncurses(3x), 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.

       X/Open  Curses,  Issue  4, Version 2, describes getch, wgetch, mvgetch,
       mvwgetch, and ungetch.  They read  single-byte  characters  only.   The
       standard  specifies  that  they return ERR on failure, but describes no
       failure conditions.

       The echo behavior of these functions on  input  of  KEY_  or  backspace
       characters   was   not  specified  in  the  SVr4  documentation.   This
       description is adapted from X/Open Curses.

       The behavior of getch and friends in the presence of signal handlers is
       unspecified  in  the  SVr4  documentation  and  X/Open  Curses.   Under
       historical curses implementations, it varied depending on  whether  the
       operating  system's  dispatch  of  a  signal  to a handler interrupts a
       read(2) call in progress or not, and  also  (in  some  implementations)
       whether an input timeout or non-blocking mode has been set.

       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  is  an  extension  first  implemented  for ncurses.  NetBSD
       curses later added this extension.

       Programmers concerned about portability should be prepared  for  either
       of  two  cases: (a) signal receipt does not interrupt getch; (b) signal
       receipt interrupts getch and causes it to return ERR with errno set  to
       EINTR.

       The  has_key function is unique to ncurses.  We recommend that any code
       using it be conditionalized on the NCURSES_VERSION feature macro.


SEE ALSO

       curses(3x),     curs_inopts(3x),     curs_mouse(3x),     curs_move(3x),
       curs_outopts(3x), curs_refresh(3x), curs_variables(3x), resizeterm(3x)

       Comparable  functions  in  the  wide-character  (ncursesw)  library are
       described in curs_get_wch(3x).



ncurses 6.4                       2023-12-23                    curs_getch(3x)
ncurses-6.4-20240113/doc/html/man/key_defined.3x.html0000644000000000000000000001152214537426151020417 0ustar rootroot key_defined 3x 2023-12-16 ncurses 6.4 Library calls

key_defined 3x 2023-12-16 ncurses 6.4 Library calls

key_defined(3x)                  Library calls                 key_defined(3x)




NAME

       key_defined - test whether a curses keycode is defined


SYNOPSIS

       #include <curses.h>

       int key_defined(const char *definition);


DESCRIPTION

       This  is an extension to the curses library.  It permits an application
       to determine if a string is currently bound to any keycode.


RETURN VALUE

       If the string is bound to a keycode, its value (greater than  zero)  is
       returned.   If  no  keycode  is bound, zero is returned.  If the string
       conflicts with longer strings which are bound to keys, -1 is returned.


PORTABILITY

       This routine is specific to ncurses.  It was not supported  on  Version
       7,  BSD  or  System V implementations.  It is recommended that any code
       depending on them be conditioned using NCURSES_VERSION.


AUTHORS

       Thomas Dickey


SEE ALSO

       define_key(3x)



ncurses 6.4                       2023-12-16                   key_defined(3x)
ncurses-6.4-20240113/doc/html/man/mitem_current.3x.html0000644000000000000000000001557114530450431021025 0ustar rootroot mitem_current 3x 2023-11-25 ncurses 6.4 Library calls

mitem_current 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                 mitem_current(3x)
ncurses-6.4-20240113/doc/html/man/curs_addch.3x.html0000644000000000000000000004721614541645310020254 0ustar rootroot curs_addch 3x 2023-12-23 ncurses 6.4 Library calls

curs_addch 3x 2023-12-23 ncurses 6.4 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


Adding Characters

       The addch, waddch, mvaddch and mvwaddch routines put the  character  ch
       into  the  given  window  at its current window position, which is then
       advanced.  They are analogous to the standard C  library's  putchar(3).
       If the advance is at the right margin:

       o   The cursor automatically wraps to the beginning of the next line.

       o   At  the bottom of the current scrolling region, and if scrollok(3x)
           is enabled, the scrolling region is scrolled up one line.

       o   If scrollok(3x) is not enabled, writing a character  at  the  lower
           right margin succeeds.  However, an error is returned because it is
           not possible to wrap to a new line.

       If ch is a tab, newline, carriage return or backspace,  the  cursor  is
       moved appropriately within the window:

       o   Backspace  moves the cursor one character left; at the left edge of
           a window it does nothing.

       o   Carriage return moves the cursor to the window left margin  on  the
           current line.

       o   Newline  does  a clrtoeol, then moves the cursor to the window left
           margin on the next line, scrolling the window if on the last line.

       o   Tabs are considered to be at every eighth column.  The tab interval
           may be altered by setting the TABSIZE variable.

       If  ch  is  any  other nonprintable character, it is drawn in printable
       form, using the same convention as unctrl(3x):

       o   Control characters are displayed in the ^X notation.

       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 E
           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.

       Calling winch after adding a nonprintable character does not return the
       character  itself,  but instead returns the printable representation of
       the character.

       Video attributes can be combined with a character  argument  passed  to
       addch  or  related  functions by logical-ORing them into the character.
       (Thus, text, including attributes, can be  copied  from  one  place  to
       another  using  inch(3x)  and  addch.)   See the curs_attr(3x) page for
       values of predefined video attribute constants  that  can  be  usefully
       OR'ed into characters.


Echoing Characters

       The  echochar  and wechochar routines are equivalent to a call to addch
       followed by a call to refresh(3x), or a call to waddch  followed  by  a
       call  to wrefresh.  The knowledge that only a single character is being
       output  is  used  and,  for  non-control  characters,  a   considerable
       performance  gain  may be seen by using these routines instead of their
       equivalents.


Line Graphics

       The following variables may be used to add line drawing  characters  to
       the  screen  with  routines of the addch family.  The default character
       listed below is used if the acsc capability does not define a terminal-
       specific   replacement   for   it,   or  if  the  terminal  and  locale
       configuration requires  Unicode  but  the  library  is  unable  to  use
       Unicode.

       The names are taken from VT100 nomenclature.

       ACS            ACS       acsc   Glyph
       Name           Default   char   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

       All routines return the integer ERR upon failure and OK on success (the
       SVr4 manuals specify only "an  integer  value  other  than  ERR")  upon
       successful  completion, unless otherwise noted in the preceding routine
       descriptions.

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.

       If it is not  possible  to  add  a  complete  character,  an  error  is
       returned:

       o   If  scrollok(3x)  is  not enabled, writing a character at the lower
           right margin succeeds.  However, an error is returned because it is
           not possible to wrap to a new line.

       o   If  an error is detected when converting a multibyte character to a
           sequence of bytes, or if it is not  possible  to  add  all  of  the
           resulting bytes in the window, an error is returned.


NOTES

       Note that addch, mvaddch, mvwaddch, and echochar may be macros.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.  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.  For
       the  wide-character  implementation  (see  curs_add_wch),   there   are
       analogous   WACS_   definitions  which  are  cchar_t  constants.   Some
       implementations are problematic:

       o   Some implementations define the ACS symbols to a constant (such  as
           Solaris), while others define those to entries in an array.

           This  implementation uses an array acs_map, as done in 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.   The
           misdefined  symbols  are the arrows and other symbols which 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 the various
           implementations use i (lowercase).

           None  of the terminal descriptions on Unix platforms use uppercase-
           I,  except  for  Solaris  (i.e.,  screen's  terminal   description,
           apparently  based on the X/Open documentation around 1995).  On the
           other hand, the terminal description gs6300 (AT&T PC6300 with EMOTS
           Terminal Emulator) uses lowercase-i.

       Some  ACS  symbols  (ACS_S3,  ACS_S7,  ACS_LEQUAL,  ACS_GEQUAL, ACS_PI,
       ACS_NEQUAL, ACS_STERLING) were not documented in any publicly  released
       System  V.   However,  many  publicly  available terminfos include acsc
       strings in which their key characters (pryz{|})  are  embedded,  and  a
       second-hand  list  of  their  character descriptions has come to light.
       The ACS-prefixed names for them were invented for ncurses(3x).

       The displayed values for the ACS_ and WACS_ constants depend on

       o   the library configuration, i.e., ncurses versus ncursesw, where the
           latter  is  capable  of displaying Unicode while the former is not,
           and

       o   whether the locale uses UTF-8 encoding.

       In certain cases,  the  terminal  is  unable  to  display  line-drawing
       characters   except   by   using   UTF-8   (see   the   discussion   of
       NCURSES_NO_UTF8_ACS in ncurses(3x)).


Character Set

       X/Open Curses assumes that the parameter passed to  waddch  contains  a
       single  character.   As  discussed in curs_attr(3x), that character may
       have been more than eight bits in an SVr3 or SVr4  implementation,  but
       in  the  X/Open Curses model, the details are not given.  The important
       distinction between SVr4 curses and X/Open  Curses  is  that  the  non-
       character  information  (attributes  and  color) was separated from the
       character information which is packed in a chtype to pass to waddch.

       In this implementation,  chtype  holds  an  eight-bit  character.   But
       ncurses  allows  multibyte  characters  to be passed in a succession of
       calls to waddch.  The other implementations do not do this; a  call  to
       waddch  passes  exactly  one  character which may be rendered as one or
       more cells on the screen depending on whether it is printable.

       Depending on the locale settings, ncurses will inspect the byte  passed
       in  each  call  to waddch, and check if the latest call will continue a
       multibyte sequence.  When a character is complete, ncurses displays the
       character and moves to the next position in the screen.

       If  the  calling  application  interrupts  the succession of bytes in a
       multibyte character by moving the current location (e.g., using wmove),
       ncurses discards the partially built character, starting over again.

       For  portability  to  other  implementations,  do  not  rely  upon this
       behavior:

       o   check if a character can be represented as a  single  byte  in  the
           current locale before attempting call waddch, and

       o   call wadd_wch for characters which cannot be handled by waddch.


TABSIZE

       The  TABSIZE  variable  is  implemented  in  SVr4 and other versions of
       curses, but is not part of X/Open curses  (see  curs_variables(3x)  for
       more details).

       If ch is a carriage return, the cursor is moved to the beginning of the
       current row of the window.  This is true of other implementations,  but
       is not documented.


SEE ALSO

       curses(3x),      curs_attr(3x),      curs_clear(3x),     curs_inch(3x),
       curs_outopts(3x), curs_refresh(3x), curs_variables(3x), putc(3)

       Comparable functions  in  the  wide-character  (ncursesw)  library  are
       described in curs_add_wch(3x).



ncurses 6.4                       2023-12-23                    curs_addch(3x)
ncurses-6.4-20240113/doc/html/man/curs_getcchar.3x.html0000644000000000000000000002704114537426147020775 0ustar rootroot curs_getcchar 3x 2023-12-16 ncurses 6.4 Library calls

curs_getcchar 3x 2023-12-16 ncurses 6.4 Library calls

curs_getcchar(3x)                Library calls               curs_getcchar(3x)




NAME

       getcchar,  setcchar  -  convert  between  a wide-character string and a
       curses complex character string


SYNOPSIS

       #include <curses.h>

       int getcchar(
               const cchar_t *wcval,
               wchar_t *wch,
               attr_t *attrs,
               short *color_pair,
               void *opts );

       int setcchar(
               cchar_t *wcval,
               const wchar_t *wch,
               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  wch  is  not  a  null  pointer, the getcchar
       function does the following:

       o   Extracts information from a cchar_t value wcval

       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  wcval,
           into the array pointed to by wch.

       When wch is a null pointer, the getcchar function does the following:

       o   Obtains the number of wide characters pointed to by wcval

       o   Does not change the data referenced by attrs or color_pair


setcchar

       The  setcchar  function initializes the location pointed to by wcval by
       using:

       o   The character attributes in attrs

       o   The color pair in color_pair

       o   The wide-character string pointed to by wch.  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 wch is a  null  pointer,  getcchar  returns  the  number  of  wide
       characters referenced by wcval, including one for a trailing null.

       When  wch  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 wcval argument may be a value generated by a call to setcchar or by
       a function that has a cchar_t output argument.  If wcval 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.4                       2023-12-16                 curs_getcchar(3x)
ncurses-6.4-20240113/doc/html/man/curs_outopts.3x.html0000644000000000000000000003417314546123512020724 0ustar rootroot curs_outopts 3x 2024-01-05 ncurses 6.4 Library calls

curs_outopts 3x 2024-01-05 ncurses 6.4 Library calls

curs_outopts(3x)                 Library calls                curs_outopts(3x)




NAME

       clearok,   idlok,   idcok,  immedok,  leaveok,  setscrreg,  wsetscrreg,
       scrollok - set curses output options


SYNOPSIS

       #include <curses.h>

       int clearok(WINDOW *win, bool bf);
       int idlok(WINDOW *win, bool bf);
       void idcok(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.


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.


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.


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.

       X/Open Curses does not define any error conditions.

       In this implementation,

       o   those functions that have a window pointer will return an error  if
           the window pointer is null

       o   wsetscrreg  returns  an error if the scrolling region limits extend
           outside the window.

       X/Open does not  define  any  error  conditions.   This  implementation
       returns an error if the window pointer is null.


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

       These functions are described in the XSI Curses standard, Issue 4.

       From  the  outset,  ncurses  used  nl/nonl to control the conversion of
       newlines to carriage return/line-feed on output as well as input.   XSI
       Curses  documents  only  the  use  of  these functions for input.  This
       difference arose from converting the pcurses source (which  used  ioctl
       calls  with  the sgttyb structure) to termios (i.e., the POSIX terminal
       interface).  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,  nl/nonl
       were amended after ncurses 6.2 to eliminate their effect on output.

       Some  historic  curses implementations had, as an undocumented feature,
       the  ability  to  do  the  equivalent  of  clearok(...,  1)  by  saying
       touchwin(stdscr) or clear(stdscr).  This will not work under ncurses.

       Earlier  System  V  curses implementations specified that with scrollok
       enabled, any window modification triggering  a  scroll  also  forced  a
       physical refresh.  XSI Curses does not require this, and ncurses avoids
       doing it to perform better  vertical-motion  optimization  at  wrefresh
       time.

       The XSI Curses standard does not mention that the cursor should be made
       invisible as a side-effect of leaveok.  SVr4 curses documentation  does
       this,  but  the  code  does  not.   Use  curs_set  to  make  the cursor
       invisible.


SEE ALSO

       curses(3x),    curs_addch(3x),    curs_clear(3x),     curs_initscr(3x),
       curs_refresh(3x), curs_scroll(3x), curs_variables(3x)



ncurses 6.4                       2024-01-05                  curs_outopts(3x)
ncurses-6.4-20240113/doc/html/man/curs_getstr.3x.html0000644000000000000000000003721514537426147020531 0ustar rootroot curs_getstr 3x 2023-12-16 ncurses 6.4 Library calls

curs_getstr 3x 2023-12-16 ncurses 6.4 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 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 *win, int y, int x, char *str, int n);


DESCRIPTION

       The function wgetnstr is equivalent to a series of calls to wgetch(3x),
       until a newline or carriage return terminates the series:

       o   The terminating character is not included in the returned string.

       o   In all instances, the end of the string is terminated by a NUL.

       o   The  function  stores  the result in the area pointed to by the str
           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   getnstr,   mvgetnstr,  mvwgetnstr,  and  wgetnstr  functions  are
       identical to the getstr, mvgetstr, mvwgetstr,  and  wgetstr  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.  (SVr4 specifies only "an integer value other than ERR") If
       unsuccessful, they return ERR.

       X/Open defines no error conditions.

       In this implementation, these functions return an error

       o   if the window pointer is null,

       o   if its timeout expires without having any data, or

       o   if the associated call to wgetch failed.

       This implementation provides an  extension  as  well.   If  a  SIGWINCH
       interrupts  the  function,  it will return KEY_RESIZE rather than OK or
       ERR.

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       Any of these functions other than wgetnstr may be macros.

       Using getstr, mvgetstr, mvwgetstr, or  wgetstr  to  read  a  line  that
       overflows  the  array  pointed to by str causes undefined results.  The
       use of getnstr, mvgetnstr, mvwgetnstr, or  wgetnstr,  respectively,  is
       recommended.


PORTABILITY

       These functions are described in The Single Unix Specification, Version
       2.  No error conditions are defined.

       This implementation returns ERR if the window pointer is  null,  or  if
       the lower-level wgetch(3x) call returns an ERR.

       SVr3  and  early  SVr4  curses  implementations did not reject function
       keys; the SVr4.0 documentation claimed that  "special  keys"  (such  as
       function  keys,  "home"  key,  "clear"  key,  etc.)  are "interpreted",
       without giving details.  It  lied.   In  fact,  the  "character"  value
       appended to the string by those implementations was predictable but not
       useful (being, in fact, the low-order eight  bits  of  the  key's  KEY_
       value).

       The  functions  getnstr, mvgetnstr, and mvwgetnstr were present but not
       documented in SVr4.

       X/Open Curses, Issue 5 (2007) stated that these functions "read at most
       n  bytes"  but  did not state whether the terminating NUL is counted in
       that limit.  X/Open Curses, Issue 7 (2009) changed  that  to  say  they
       "read at most n-1 bytes" to allow for the terminating NUL.  As of 2018,
       some implementations count it, some do not:

       o   ncurses 6.1 and PDCurses do not count the NUL in the  given  limit,
           while

       o   Solaris SVr4 and NetBSD curses count the NUL as part of the limit.

       o   Solaris   xcurses   provides  both:  its  wide-character  wget_nstr
           reserves  a  NUL,  but  its  wgetnstr  does  not  count   the   NUL
           consistently.

       In SVr4 curses, a negative value of n tells wgetnstr to assume that the
       caller's buffer is large enough to hold the result, i.e., to  act  like
       wgetstr.   X/Open  Curses does not mention this (or anything related to
       negative or zero values of n), however  most  implementations  use  the
       feature, with different limits:

       o   Solaris  SVr4  curses  and  PDCurses limit the result to 255 bytes.
           Other Unix systems than Solaris are likely to use the same limit.

       o   Solaris xcurses limits the result to LINE_MAX bytes.

       o   NetBSD 7 assumes no particular limit for the result  from  wgetstr.
           However,  it  limits  the wgetnstr parameter n to ensure that it is
           greater than zero.

           A comment in NetBSD's source code states that this is specified  in
           SUSv2.

       o   ncurses  (before  6.2)  assumes  no particular limit for the result
           from wgetstr, and treats the n  parameter  of  wgetnstr  like  SVr4
           curses.

       o   ncurses  6.2  uses  LINE_MAX,  or a larger (system-dependent) value
           which the sysconf function may provide.   If  neither  LINE_MAX  or
           sysconf  is available, ncurses uses the POSIX value for LINE_MAX (a
           2048 byte limit).  In either case,  it  reserves  a  byte  for  the
           terminating NUL.

       Although  getnstr  is equivalent to a series of calls to getch, it also
       makes changes to the curses modes to allow simple editing of the  input
       buffer:

       o   getnstr  saves  the  current  value of the nl, echo, raw and cbreak
           modes, and sets nl, noecho, noraw, and cbreak.

           getnstr handles the echoing of characters, rather than  relying  on
           the caller to set an appropriate mode.

       o   It  also  obtains  the erase and kill characters from erasechar and
           killchar, respectively.

       o   On return, getnstr restores the modes to their previous values.

       Other implementations differ in their treatment of special characters:

       o   While they may set the echo  mode,  other  implementations  do  not
           modify  the  raw  mode,  They  may  take the cbreak mode set by the
           caller into account when deciding whether to handle echoing  within
           getnstr or as a side-effect of the getch calls.

       o   The original ncurses (as pcurses in 1986) set noraw and cbreak when
           accepting input for getnstr.  That  may  have  been  done  to  make
           function- and cursor-keys work; it is not necessary with ncurses.

           Since  1995, ncurses has provided signal handlers for INTR and QUIT
           (e.g., ^C or ^\).  With the noraw and cbreak  settings,  those  may
           catch  a  signal  and stop the program, where other implementations
           allow one to enter those characters in the buffer.

       o   Starting in 2021 (ncurses 6.3), getnstr sets raw, rather than noraw
           and   cbreak  for  better  compatibility  with  SVr4-curses,  e.g.,
           allowing one to enter a ^C into the buffer.


SEE ALSO

       curses(3x), curs_getch(3x), curs_termattrs(3x), curs_variables(3x)



ncurses 6.4                       2023-12-16                   curs_getstr(3x)
ncurses-6.4-20240113/doc/html/man/curs_inopts.3x.html0000644000000000000000000005633514546047763020544 0ustar rootroot curs_inopts 3x 2023-12-23 ncurses 6.4 Library calls

curs_inopts 3x 2023-12-23 ncurses 6.4 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, bool bf);
       int keypad(WINDOW *win, bool bf);
       int meta(WINDOW *win, bool bf);
       int nodelay(WINDOW *win, bool bf);
       int notimeout(WINDOW *win, bool bf);

       int nl(void);
       int nonl(void);

       int raw(void);
       int noraw(void);

       void qiflush(void);
       void noqiflush(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

       ncurses provides several functions that let an application  change  the
       way  input  from the terminal is handled.  Some are global, applying to
       all windows.  Others apply only to a specific window.   Window-specific
       settings  are  not automatically applied to new or derived windows.  An
       application must apply these to each window if  the  same  behavior  is
       desired.


cbreak, nocbreak

       Normally,  the terminal driver buffers typed characters until a newline
       or  carriage  return  is  typed.   The  cbreak  routine  disables  line
       buffering  and  erase/kill  character-processing  (interrupt  and  flow
       control characters are unaffected), making characters typed by the user
       immediately available to the program.  The nocbreak routine returns the
       terminal to normal (cooked) mode.

       Initially the terminal may or may not be in cbreak mode, as the mode is
       inherited;   therefore,  a  program  should  call  cbreak  or  nocbreak
       explicitly.  Most interactive programs  using  curses  set  the  cbreak
       mode.   Note  that  cbreak  overrides  raw.   [See curs_getch(3x) for a
       discussion of how these routines interact with echo and noecho.]


echo, noecho

       The echo and noecho routines control whether characters  typed  by  the
       user  are  echoed  by  getch(3x)  as  they  are  typed.  Echoing by the
       terminal driver is always disabled, but  initially  getch  is  in  echo
       mode,  so  characters  typed  are  echoed.  Authors of most interactive
       programs prefer to do their own echoing in a  controlled  area  of  the
       screen,  or  not  to  echo  at  all, so they disable echoing by calling
       noecho.  [See curs_getch(3x) for a discussion  of  how  these  routines
       interact with cbreak and nocbreak.]


halfdelay

       The  halfdelay routine is used for 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, ERR is returned if nothing  has  been  typed.   The  value  of
       tenths must be a number between 1 and 255.  Use nocbreak to leave half-
       delay mode.


intrflush

       If the intrflush option is enabled (bf is TRUE), and an  interrupt  key
       is  pressed on the keyboard (interrupt, break, quit), all output in the
       terminal driver queue is flushed, giving the effect of faster  response
       to  the interrupt, but causing curses to have the wrong idea of what is
       on the screen.  Disabling the option (bf is FALSE), prevents the flush.
       The  default  for  the  option  is  inherited  from the terminal driver
       settings.  The win argument is ignored.


keypad

       The keypad option enables  the  keypad  of  the  user's  terminal.   If
       enabled  (bf  is  TRUE),  the user can press a function key (such as an
       arrow key) and wgetch(3x)  returns  a  single  value  representing  the
       function  key,  as in KEY_LEFT.  If disabled (bf is FALSE), curses does
       not treat function keys specially and the program has to interpret  the
       escape  sequences  itself.  If the keypad in the terminal can be turned
       on (made to transmit) and off (made to work locally), turning  on  this
       option  causes  the  terminal keypad to be turned on when wgetch(3x) is
       called.  The default value for keypad is FALSE.


meta

       Initially, whether the terminal returns 7  or  8  significant  bits  on
       input  depends  on  the  control  mode  of  the  terminal  driver  [see
       termios(3)].  To force 8 bits to be returned, invoke  meta(win,  TRUE);
       this  is  equivalent,  under  POSIX,  to  setting  the  CS8 flag on the
       terminal.  To force 7 bits to be  returned,  invoke  meta(win,  FALSE);
       this  is  equivalent,  under  POSIX,  to  setting  the  CS7 flag on the
       terminal.  The  window  argument,  win,  is  always  ignored.   If  the
       terminfo  capabilities smm (meta_on) and rmm (meta_off) are defined for
       the terminal, smm is sent to  the  terminal  when  meta(win,  TRUE)  is
       called and rmm is sent when meta(win, FALSE) is called.


nl, nonl

       The  nl and nonl routines control whether the underlying display device
       translates the return key into newline on input.


nodelay

       The nodelay option causes getch to be a non-blocking call.  If no input
       is  ready,  getch  returns ERR.  If disabled (bf is FALSE), getch waits
       until a key is pressed.


notimeout

       When interpreting an escape sequence, wgetch(3x)  sets  a  timer  while
       waiting  for  the  next  character.  If notimeout(win, TRUE) is called,
       then wgetch does not set a timer.  The purpose of  the  timeout  is  to
       distinguish  sequences produced by a function key from those typed by a
       user.


raw, noraw

       The raw and noraw routines place the terminal into or out of raw  mode.
       Raw  mode  is  similar  to  cbreak  mode,  in that characters typed are
       immediately passed through to the user program.   The  differences  are
       that  in  raw  mode,  the  interrupt,  quit,  suspend, and flow control
       characters are all passed through uninterpreted, instead of  generating
       a  signal.   The behavior of the BREAK key depends on other bits in the
       terminal driver that are not set by curses.


qiflush, nqiflush

       When the noqiflush routine is used, normal flush of  input  and  output
       queues  associated  with the INTR, QUIT and SUSP characters will not be
       done [see termios(3)].  When qiflush is  called,  the  queues  will  be
       flushed  when  these control characters are read.  You may want to call
       noqiflush in a signal handler if you want output to continue as  though
       the interrupt had not occurred, after the handler exits.


timeout, wtimeout

       The timeout and wtimeout routines set blocking or non-blocking read for
       a given window.  If delay is negative, a blocking read is  used  (i.e.,
       waits  indefinitely  for input).  If delay is zero, then a non-blocking
       read is used (i.e., read returns ERR if no input is waiting).  If delay
       is  positive,  then read blocks for delay milliseconds, and returns ERR
       if there is still no input.  Hence, these  routines  provide  the  same
       functionality  as nodelay, plus the additional capability of being able
       to block for only delay milliseconds (where delay is positive).


typeahead

       curses does  "line-breakout  optimization"  by  looking  for  typeahead
       periodically  while  updating the screen.  If input is found, and it is
       coming  from  a  terminal,  the  current  update  is  postponed   until
       refresh(3x)  or  doupdate is called again.  This allows faster response
       to commands typed in advance.  Normally, the input FILE pointer  passed
       to newterm, or stdin in the case that initscr was used, will be used to
       do this typeahead checking.  The typeahead routine specifies  that  the
       file descriptor fd is to be used to check for typeahead instead.  If fd
       is -1, then no typeahead checking is done.


RETURN VALUE

       All routines that return an integer return  ERR  upon  failure  and  OK
       (SVr4 specifies only "an integer value other than ERR") upon successful
       completion,  unless  otherwise   noted   in   the   preceding   routine
       descriptions.

       X/Open  does  not define any error conditions.  In this implementation,
       functions with a window parameter will return an error if it  is  null.
       Any  function  will  also  return  an  error  if  the  terminal was not
       initialized.  Also,

          halfdelay
               returns an error if its parameter is outside the range 1..255.


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 normal ("cooked") mode from raw and cbreak modes  respectively.
       Mixing  raw/noraw  and  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 that may be used to detect if the
       corresponding flags were set or reset.

                            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 flag is set,

       0   if the flag is reset, or

       -1  if the library is not initialized.

       They 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.

       Except as noted in section "EXTENSIONS" above, X/Open Curses, Issue  4,
       Version 2 describes these functions.

       ncurses  follows  X/Open  Curses  and  the  historical practice of AT&T
       curses implementations, in that the echo bit  is  cleared  when  curses
       initializes   the  terminal  state.   BSD  curses  differed  from  this
       slightly; it left the echo bit on at initialization, but  the  BSD  raw
       call turned it off as a side effect.  For best portability, set echo or
       noecho explicitly just  after  initialization,  even  if  your  program
       remains in cooked mode.

       X/Open  Curses  is  ambiguous  regarding whether raw should disable the
       CR/LF translations controlled by nl and nonl.  BSD curses did turn  off
       these  translations;  AT&T  curses  (at least as late as SVr1) 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, e.g., from using the -x  option  of  tic,
       then  ncurses  also defines keys for the capabilities whose names begin
       with "k".  The corresponding keycodes are generated and  (depending  on
       previous  loads of terminal descriptions) may differ from one execution
       of a program to the next.  The generated keycodes are recognized by the
       keyname(3x)  function (which will then return a name beginning with "k"
       denoting the terminfo capability name rather than "K", used for  curses
       key  names).   On the other hand, an application can use define_key(3x)
       to establish a specific keycode for a  given  string.   This  makes  it
       possible  for  an  application  to  check  for an extended capability's
       presence with tigetstr, and reassign  the  keycode  to  match  its  own
       needs.

       Low-level applications can use tigetstr to obtain the definition of any
       particular string capability.  Higher-level applications which use  the
       curses  wgetch  and  similar functions to return keycodes rely upon the
       order in which the strings are loaded.  If more than one key definition
       has  the  same  string  value, then wgetch can return only one keycode.
       Most curses implementations (including ncurses) load key definitions in
       the  order  defined  by the array of string capability names.  The last
       key to be loaded determines the keycode which  will  be  returned.   In
       ncurses,  you  may  also  have extended capabilities interpreted as key
       definitions.  These are loaded after the  predefined  keys,  and  if  a
       capability's  value  is the same as a previously-loaded key definition,
       the later definition is the one used.


SEE ALSO

       curses(3x),    curs_getch(3x),     curs_initscr(3x),     curs_util(3x),
       define_key(3x), termios(3)



ncurses 6.4                       2023-12-23                   curs_inopts(3x)
ncurses-6.4-20240113/doc/html/man/mitem_name.3x.html0000644000000000000000000001166514530450431020263 0ustar rootroot mitem_name 3x 2023-11-25 ncurses 6.4 Library calls

mitem_name 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                    mitem_name(3x)
ncurses-6.4-20240113/doc/html/man/curs_color.3x.html0000644000000000000000000010402714544131756020330 0ustar rootroot curs_color 3x 2023-12-30 ncurses 6.4 Library calls

curs_color 3x 2023-12-30 ncurses 6.4 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 an error 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 XSI 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.4                       2023-12-30                    curs_color(3x)
ncurses-6.4-20240113/doc/html/man/curs_touch.3x.html0000644000000000000000000002124414530450427020325 0ustar rootroot curs_touch 3x 2023-11-25 ncurses 6.4 Library calls

curs_touch 3x 2023-11-25 ncurses 6.4 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.

       X/Open does not define any error conditions.  In this implementation

          is_linetouched
               returns  an error if the window pointer is null, or if the line
               number is outside the window.

               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  an error if the window pointer is null, or if the line
               number is outside the window.


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.

       The XSI Curses standard, Issue 4 describes these functions, but defines
       no error conditions.


SEE ALSO

       curses(3x), curs_refresh(3x), curs_variables(3x)



ncurses 6.4                       2023-11-25                    curs_touch(3x)
ncurses-6.4-20240113/doc/html/man/adacursesw6-config.1.html0000644000000000000000000001455114537452240021454 0ustar rootroot adacursesw6\-config 1 2023-12-16 ncurses 6.4 User commands

adacursesw6\-config 1 2023-12-16 ncurses 6.4 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.4                       2023-12-16             adacursesw6-config(1)
ncurses-6.4-20240113/doc/html/man/curs_termcap.3x.html0000644000000000000000000006061314550576011020641 0ustar rootroot curs_termcap 3x 2023-12-30 ncurses 6.4 Library calls

curs_termcap 3x 2023-12-30 ncurses 6.4 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.   ncurses 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) marks the  termcap  interface  (along
           with vwprintw and vwscanw) as withdrawn.

       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
       Externally  visible  variables  are  provided  for  support  of 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 used escapes many application developers.  The BSD termcap  library
       did  not require a trailing null character on 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.

       o   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 for compatibility with other
       implementations, but the  header  is  rarely  used  because  the  other
       implementations are not strictly compatible.


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 though 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.
           This header file was added to NetBSD's termcap library in mid-1994.

       Meanwhile, GNU termcap began development in 1990.   Its  first  release
       (1.0)  in  1991  included  a  termcap.h  header.   Its  second (1.1) in
       September 1992 modified the  header  to  use  const  for  the  function
       prototypes  in  the  header where one would expect the 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 termcap 1.3 was bundled with bash(1) in  mid-1993  to  support  the
       readline(3) library.

       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 expand terminfo-style strings 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

       curses(3x), curs_terminfo(3x), putc(3), term_variables(3x), terminfo(5)

       https://invisible-island.net/ncurses/tctest.html



ncurses 6.4                       2023-12-30                  curs_termcap(3x)
ncurses-6.4-20240113/doc/html/man/curs_inwstr.3x.html0000644000000000000000000002075314544131757020544 0ustar rootroot curs_inwstr 3x 2023-12-30 ncurses 6.4 Library calls

curs_inwstr 3x 2023-12-30 ncurses 6.4 Library calls

curs_inwstr(3x)                  Library calls                 curs_inwstr(3x)




NAME

       inwstr,  innwstr,  winwstr,  winnwstr,  mvinwstr, mvinnwstr, mvwinwstr,
       mvwinnwstr - get a wide-character string from a curses window


SYNOPSIS

       #include <curses.h>

       int inwstr(wchar_t *wstr);
       int innwstr(wchar_t *wstr, int n);
       int winwstr(WINDOW *win, wchar_t *wstr);
       int winnwstr(WINDOW *win, wchar_t *wstr, int n);

       int mvinwstr(int y, int x, wchar_t *wstr);
       int mvinnwstr(int y, int x, wchar_t *wstr, int n);
       int mvwinwstr(WINDOW *win, int y, int x, wchar_t *wstr);
       int mvwinnwstr(WINDOW *win, int y, int x, wchar_t *wstr, int n);


DESCRIPTION

       These routines return a string of  wchar_t  wide  characters  in  wstr,
       starting at the current cursor position in the named window.

       The  four  functions  with  n  as  the  last  argument return a leading
       substring at most n characters long (exclusive of  the  trailing  NUL).
       Transfer  stops  at  the  end of the current line, or when n characters
       have been stored at the location referenced by wstr.

       If the size  n  is  not  large  enough  to  store  a  complete  complex
       character, an error is generated.


RETURN VALUE

       All  routines return ERR upon failure.  Upon successful completion, the
       *inwstr routines return OK, and the *innwstr routines return the number
       of characters read into the string.

       X/Open  defines  no  error  conditions.  This implementation returns an
       error

       o   if the win parameter is null or

       o   if the wstr parameter is null, or

       o   if no characters could be read.

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       All routines except winnwstr may be macros.

       Each cell in the window holds a complex character (a spacing  character
       and  zero  or more non-spacing characters) together with attributes and
       color.  These  functions  store  only  the  wide  characters,  ignoring
       attributes  and  color.  Use in_wchstr to return the complex characters
       from a window.

       Reading a line that overflows the array pointed to by wstr with inwstr,
       mvinwstr,  mvwinwstr  or  winwstr causes undefined results.  Therefore,
       the use of innwstr, mvinnwstr, mvwinnwstr, or winnwstr is recommended.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.


SEE ALSO

       curses(3x),    curs_inch(3x),     curs_inchstr(3x),     curs_instr(3x),
       curs_in_wchstr(3x)



ncurses 6.4                       2023-12-30                   curs_inwstr(3x)
ncurses-6.4-20240113/doc/html/man/scr_dump.5.html0000644000000000000000000004374014550576013017604 0ustar rootroot scr_dump 5 2023-12-30 ncurses 6.4 File formats

scr_dump 5 2023-12-30 ncurses 6.4 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.4                       2023-12-30                       scr_dump(5)
ncurses-6.4-20240113/doc/html/man/curs_instr.3x.html0000644000000000000000000001776614537426147020371 0ustar rootroot curs_instr 3x 2023-12-16 ncurses 6.4 Library calls

curs_instr 3x 2023-12-16 ncurses 6.4 Library calls

curs_instr(3x)                   Library calls                  curs_instr(3x)




NAME

       instr,  innstr, winstr, winnstr, mvinstr, mvinnstr, mvwinstr, mvwinnstr
       - get a string from a curses window


SYNOPSIS

       #include <curses.h>

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


DESCRIPTION

       These routines return a string of characters in str,  starting  at  the
       current  cursor  position in the named window.  Attributes are stripped
       from the characters.

       The four functions with  n  as  the  last  argument  return  a  leading
       substring  at  most  n characters long (exclusive of the trailing NUL).
       Transfer stops at the end of the current line,  or  when  n  characters
       have been stored at the location referenced by str.


RETURN VALUE

       All  of  the  functions  return  ERR  upon  failure,  or  the number of
       characters actually read into the string.

       X/Open Curses defines no error conditions.  This implementation returns
       an error

       o   if the win parameter is null or

       o   if the chstr parameter is null.

       Functions  with  a  "mv"  prefix  first perform a cursor movement using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       All routines except winnstr may be macros.

       Reading  a  line that overflows the array pointed to by str with instr,
       mvinstr, mvwinstr or winstr causes undefined results.   Therefore,  the
       use of innstr, mvinnstr, mvwinnstr, or winnstr is recommended.


PORTABILITY

       SVr4  does not document whether a length limit includes or excludes the
       trailing NUL.

       The ncurses library extends the XSI description by allowing a  negative
       value  for  n.  In this case, the functions return the string ending at
       the right margin.


SEE ALSO

       curses(3x),    curs_inch(3x),    curs_inchstr(3x),     curs_inwstr(3x),
       curs_in_wchstr(3x)



ncurses 6.4                       2023-12-16                    curs_instr(3x)
ncurses-6.4-20240113/doc/html/man/clear.1.html0000644000000000000000000002056514550576010017047 0ustar rootroot clear 1 2023-12-16 ncurses 6.4 User commands

clear 1 2023-12-16 ncurses 6.4 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.4                       2023-12-16                          clear(1)
ncurses-6.4-20240113/doc/html/man/menu_cursor.3x.html0000644000000000000000000001211714530450430020501 0ustar rootroot menu_cursor 3x 2023-11-25 ncurses 6.4 Library calls

menu_cursor 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                   menu_cursor(3x)
ncurses-6.4-20240113/doc/html/man/menu_userptr.3x.html0000644000000000000000000001232114530450430020665 0ustar rootroot menu_userptr 3x 2023-11-25 ncurses 6.4 Library calls

menu_userptr 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                  menu_userptr(3x)
ncurses-6.4-20240113/doc/html/man/form_opts.3x.html0000644000000000000000000001420114530450430020144 0ustar rootroot form_opts 3x 2023-11-25 ncurses 6.4 Library calls

form_opts 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                     form_opts(3x)
ncurses-6.4-20240113/doc/html/man/term_variables.3x.html0000644000000000000000000002653014541645313021153 0ustar rootroot term_variables 3x 2023-12-23 ncurses 6.4 Library calls

term_variables 3x 2023-12-23 ncurses 6.4 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.4                       2023-12-23                term_variables(3x)
ncurses-6.4-20240113/doc/html/man/form_cursor.3x.html0000644000000000000000000001210614530450427020504 0ustar rootroot form_cursor 3x 2023-11-25 ncurses 6.4 Library calls

form_cursor 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                   form_cursor(3x)
ncurses-6.4-20240113/doc/html/man/new_pair.3x.html0000644000000000000000000002262414537426152017763 0ustar rootroot new_pair 3x 2023-12-16 ncurses 6.4 Library calls

new_pair 3x 2023-12-16 ncurses 6.4 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.4                       2023-12-16                      new_pair(3x)
ncurses-6.4-20240113/doc/html/man/curs_delch.3x.html0000644000000000000000000001337014537426147020274 0ustar rootroot curs_delch 3x 2023-12-16 ncurses 6.4 Library calls

curs_delch 3x 2023-12-16 ncurses 6.4 Library calls

curs_delch(3x)                   Library calls                  curs_delch(3x)




NAME

       delch,  wdelch,  mvdelch, mvwdelch - delete the character at the cursor
       in 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

       These routines delete the character under the cursor; all characters to
       the  right  of  the  cursor  on the same line are moved to the left one
       position and the last character on the line is  filled  with  a  blank.
       The  cursor  position  does  not  change  (after  moving  to  y,  x, if
       specified).  (This does not imply use of the hardware delete  character
       feature.)


RETURN VALUE

       All  routines  return  the  integer  ERR  upon  failure and an OK (SVr4
       specifies only "an integer  value  other  than  ERR")  upon  successful
       completion.

       Functions  with  a  "mv"  prefix  first perform a cursor movement using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


NOTES

       Note that delch, mvdelch, and mvwdelch may be macros.


PORTABILITY

       These functions are described in the XSI Curses standard, Issue 4.  The
       standard specifies that they return ERR on failure,  but  specifies  no
       error conditions.


SEE ALSO

       curses(3x)



ncurses 6.4                       2023-12-16                    curs_delch(3x)
ncurses-6.4-20240113/doc/html/man/curs_terminfo.3x.html0000644000000000000000000013062714550607666021047 0ustar rootroot curs_terminfo 3x 2024-01-13 ncurses 6.4 Library calls

curs_terminfo 3x 2024-01-13 ncurses 6.4 Library calls

curs_terminfo(3x)                Library calls               curs_terminfo(3x)




NAME

       del_curterm,   mvcur,   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 mvcur(int oldrow, int oldcol, int newrow, int newcol);

       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 not available to
       applications.

       If setupterm is called repeatedly for the same terminal type,  it  will
       reuse  the  information.   It  maintains  only  one  copy  of  a  given
       terminal's capabilities in memory.   If  it  is  called  for  different
       terminal  types,  setupterm  allocates  new  storage  for  each  set of
       terminal capabilities.

       set_curterm sets cur_term to nterm,  and  makes  all  of  the  terminfo
       Boolean,  numeric,  and string variables use the values from nterm.  It
       returns the old value of cur_term.

       del_curterm frees the space pointed to by oterm and makes it  available
       for  further  use.  If oterm is the same as cur_term, references to any
       of the terminfo Boolean, numeric, and string variables  thereafter  may
       refer  to  invalid  memory  locations  until another setupterm has been
       called.

       restartterm is similar to setupterm and  initscr,  except  that  it  is
       called  after  restoring  memory to a previous state (for example, when
       reloading a game saved as a core image dump).  restartterm assumes that
       the  windows  and  the  input  and  output options are the same as when
       memory was saved, but the terminal type and baud rate may be different.
       Accordingly,  restartterm  saves  various  terminal  state  bits, calls
       setupterm, and then restores the bits.


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, tiparm, tgetstr, or tgoto.

           The tgetstr and tgoto functions are part of the termcap  interface,
           which happens to share these function names with the terminfo API.

       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.

       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 or pass an  output
       function  parameter,  mvcur uses an output file descriptor derived from
       the output stream parameter of newterm(3x).

       While putp and mvcur are low-level functions that do not use high-level
       curses  state,  ncurses  declares them 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 an error.

       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 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 cleanup 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,  in  some cases applying it needlessly to values are already
           constant, and in most cases overlooking parameters  which  normally
           would  use const.  Using constant parameters for functions which do
           not use 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
           an error 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.

       X/Open  Curses notes that after calling mvcur, the curses state may not
       match the actual terminal state, and that an application  should  touch
       and  refresh  the  window  before  resuming  normal curses calls.  Both
       ncurses and SVr4 curses implement mvcur using the SCREEN data allocated
       in either initscr or newterm.  So though it is documented as a terminfo
       function, mvcur is really a curses function that is not well specified.

       X/Open notes that after calling mvcur, the curses state may  not  match
       the  actual  terminal  state,  and that an application should touch and
       refresh the window before resuming normal curses calls.   Both  ncurses
       and  SVr4  curses  implement  mvcur  using the SCREEN data allocated in
       either initscr or newterm.  So though it is documented  as  a  terminfo
       function, mvcur is really a curses function that is not well specified.

       X/Open  Curses  states that the old location must be given for mvcur to
       accommodate terminals that lack absolute cursor  positioning.   ncurses
       allows the caller to use -1 for either or both old coordinates.  The -1
       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.


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.4                       2024-01-13                 curs_terminfo(3x)
ncurses-6.4-20240113/doc/html/man/tput.1.html0000644000000000000000000010215514550612424016751 0ustar rootroot tput 1 2024-01-13 ncurses 6.4 User commands

tput 1 2024-01-13 ncurses 6.4 User commands

tput(1)                          User commands                         tput(1)




NAME

       tput,  init,  reset - initialize a terminal, exercise its capabilities,
       or query terminfo database


SYNOPSIS

       tput [-T terminal-type] {cap-code [parameter ...]} ...

       tput [-T terminal-type] [-x] clear

       tput [-T terminal-type] init

       tput [-T terminal-type] reset

       tput [-T terminal-type] longname

       tput -S

       tput -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  the  capability  is of string type and takes parameters,
                  the arguments following the capability will be used  as  its
                  parameters.

                  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".  (The tset(1) utility also  treats
       a link named reset specially.)

       If  tput  is  invoked by a link named init, this has the same effect as
       "tput init".  Such a link is seldom employed because another program of
       that name is in widespread use.


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       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 command 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 dch1 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 names rather than
           terminfo capability names in their respective tput commands.  Since
           2010,  NetBSD's  tput  uses  terminfo names.  Before that, it (like
           FreeBSD) recognized termcap names.

           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  cancelled  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 names 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   The tset program waits one  second  when  resetting,  in  case  the
           terminal happens to be a hardware device.

       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 row 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 row 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.4                       2024-01-13                           tput(1)
ncurses-6.4-20240113/doc/html/man/curs_bkgrnd.3x.html0000644000000000000000000002610114546047763020463 0ustar rootroot curs_bkgrnd 3x 2023-12-23 ncurses 6.4 Library calls

curs_bkgrnd 3x 2023-12-23 ncurses 6.4 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

       The  background  of  a  curses  window   (in   the   library's   "wide"
       configuration)  is  a  cchar_t  combining  a  set  of  attributes  (see
       curs_attr(3x)) with a complex character called the blank character.

       The blank character is a spacing character that  populates  a  window's
       character  cells  when  their  contents are erased without replacement.
       The background's attributes are combined with all non-blank  characters
       written  to  the  window,  as  with  the  wadd_wch(3x) and wins_wch(3x)
       families of functions.

       The blank character and  attributes  of  the  background  combine  with
       characters  written  to  the window as described below.  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  blank  character;  if they match, ncurses writes the new
           blank 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.

       ncurses  treats  a  background  character  value of zero (0) as a blank
       character.

       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.4                       2023-12-23                   curs_bkgrnd(3x)
ncurses-6.4-20240113/doc/html/man/form_hook.3x.html0000644000000000000000000001742014546123514020134 0ustar rootroot form_hook 3x 2024-01-05 ncurses 6.4 Library calls

form_hook 3x 2024-01-05 ncurses 6.4 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_init

       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.4                       2024-01-05                     form_hook(3x)
ncurses-6.4-20240113/doc/html/man/form_field_just.3x.html0000644000000000000000000001271214530450430021314 0ustar rootroot form_field_just 3x 2023-11-25 ncurses 6.4 Library calls

form_field_just 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25               form_field_just(3x)
ncurses-6.4-20240113/doc/html/man/curs_termattrs.3x.html0000644000000000000000000002260414546123513021231 0ustar rootroot curs_termattrs 3x 2024-01-05 ncurses 6.4 Library calls

curs_termattrs 3x 2024-01-05 ncurses 6.4 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 -  curses  environment  query
       routines


SYNOPSIS

       #include <curses.h>

       int baudrate(void);
       char erasechar(void);
       int erasewchar(wchar_t *ch);
       bool has_ic(void);
       bool has_il(void);
       char killchar(void);
       int killwchar(wchar_t *ch);
       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 ch.  If no erase character has been defined, the
       routine fails and the location referenced by ch is not changed.


has_is, 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 ch.  If no line-kill character has been defined,
       the routine fails and the location referenced by ch 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

       The XSI Curses standard, 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.4                       2024-01-05                curs_termattrs(3x)
ncurses-6.4-20240113/doc/html/man/curs_getyx.3x.html0000644000000000000000000001661214537426147020357 0ustar rootroot curs_getyx 3x 2023-12-16 ncurses 6.4 Library calls

curs_getyx 3x 2023-12-16 ncurses 6.4 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 getparyx(WINDOW *win, int y, int x);
       void getbegyx(WINDOW *win, int y, int x);
       void getmaxyx(WINDOW *win, int y, int x);


DESCRIPTION

       The getyx macro places the current cursor position of the given  window
       in the two integer variables y and x.

       If  win  is  a  subwindow,  the  getparyx  macro  places  the beginning
       coordinates of the subwindow relative to the  parent  window  into  two
       integer variables y and x.  Otherwise, -1 is placed into y and x.

       Like  getyx,  the  getbegyx  and  getmaxyx  macros  store  the  current
       beginning coordinates and size of the specified window.


RETURN VALUE

       The return values of these macros are undefined (i.e., they should  not
       be used as the right-hand side of assignment statements).


NOTES

       All  of these interfaces are macros.  A "&" is not necessary before the
       variables y and x.


PORTABILITY

       The getyx, getparyx, getbegyx and getmaxyx macros are described in  the
       XSI Curses standard, Issue 4.

       This  implementation 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 this, many implementations
       provide members of the WINDOW structure containing values corresponding
       to  these  macros.  For best portability, do not rely on using the data
       in WINDOW, since some implementations make WINDOW opaque (do not  allow
       direct use of its members).

       Besides the problem of opaque structures, the data stored in like-named
       members may not have like-values  in  different  implementations.   For
       example,  the  WINDOW._maxx and WINDOW._maxy values in ncurses have (at
       least  since  release  1.8.1)  differed  by   one   from   some   other
       implementations.   The  difference  is  hidden  by  means  of the macro
       getmaxyx.


SEE ALSO

       curses(3x), curs_legacy(3x), curs_opaque(3x)



ncurses 6.4                       2023-12-16                    curs_getyx(3x)
ncurses-6.4-20240113/doc/html/man/mitem_userptr.3x.html0000644000000000000000000001231214530450431021035 0ustar rootroot mitem_userptr 3x 2023-11-25 ncurses 6.4 Library calls

mitem_userptr 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                 mitem_userptr(3x)
ncurses-6.4-20240113/doc/html/man/curs_scr_dump.3x.html0000644000000000000000000002042214550576011021014 0ustar rootroot curs_scr_dump 3x 2023-12-30 ncurses 6.4 Library calls

curs_scr_dump 3x 2023-12-30 ncurses 6.4 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  contain  the  contents  of
       filename  (if  it  was  validly  written with scr_dump).  No refresh is
       performed;  after  performing  any  further   desired   updates,   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.  If these data are  valid,
       curses  bases  its next update of the screen on this information rather
       than clearing it and starting from scratch.

       The data fail the validity check

       o   if the terminal employs terminfo capabilities exit_ca_mode  (rmcup)
           or non_rev_rmcup (nrrmc) are defined, or

       o   if  curses  knows  that  the terminal has been written to since the
           preceding scr_dump call.

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


scr_set

       The  scr_set  routine is a combination of scr_restore and scr_init.  It
       tells the program that the information in filename is what is currently
       on the screen, and also what the program wants on the screen.  This can
       be thought of as a screen inheritance function.


RETURN VALUE

       These functions return OK on success and ERR on failure.

       X/Open defines no failure conditions.   In  this  implementation,  each
       function fails if it cannot open filename.


NOTES

       scr_init, scr_set, and scr_restore may be macros.


PORTABILITY

       X/Open Curses, Issue 4, describes these functions.

       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".


SEE ALSO

       curses(3x),    curs_initscr(3x),    curs_refresh(3x),    curs_util(3x),
       system(3), scr_dump(5)



ncurses 6.4                       2023-12-30                 curs_scr_dump(3x)
ncurses-6.4-20240113/doc/html/man/curs_window.3x.html0000644000000000000000000004016214537426150020515 0ustar rootroot curs_window 3x 2023-12-16 ncurses 6.4 Library calls

curs_window 3x 2023-12-16 ncurses 6.4 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 an error if the window pointer is null, or if  the  window
            is the parent of another window.

       derwin
            returns  an  error if the parent window pointer is null, or if any
            of its ordinates or dimensions is negative, or  if  the  resulting
            window does not fit inside the parent window.

       dupwin
            returns an error 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 an error if the window pointer is null, or if some part of
            the window would be placed off-screen.

       mvwin
            returns an error if the window pointer is null, or if  the  window
            is  really  a  pad,  or if some part of the window would be placed
            off-screen.

       newwin
            will fail if either of its beginning ordinates is negative, or  if
            either the number of lines or columns is negative.

       syncok
            returns an error if the window pointer is null.

       subwin
            returns  an  error if the parent window pointer is null, or if any
            of its ordinates or dimensions is negative, or  if  the  resulting
            window does not fit inside the parent window.

       The  functions  which return a window pointer may also fail if there is
       insufficient memory for its data structures.  Any  of  these  functions
       will fail if the screen has not been initialized, i.e., with 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

       The XSI Curses standard, Issue 4 describes these functions.

       X/Open Curses states regarding delwin:

       o   It must delete subwindows before deleting their parent.

       o   If  delwin  is asked to delete a parent window, it can only succeed
           if the curses library keeps a list of the subwindows.  SVr4  curses
           kept  a  count  of the number of subwindows rather than a list.  It
           simply returned ERR when asked  to  delete  a  subwindow.   Solaris
           X/Open  curses  does  not  even  make that check, and will delete a
           parent window which still has subwindows.

       o   Since release 4.0 (1996), ncurses maintains a list of  windows  for
           each  screen,  to  ensure  that  a  window has no subwindows before
           allowing deletion.

       o   NetBSD copied this feature of ncurses in 2003.
           PDCurses follows the scheme used in Solaris X/Open curses.


BUGS

       The subwindow functions subwin, derwin, mvderwin,  wsyncup,  wsyncdown,
       wcursyncup,  and  syncok  are  flaky, incompletely implemented, and not
       well tested.

       System V's 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 language here, and behavior of 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.4                       2023-12-16                   curs_window(3x)
ncurses-6.4-20240113/doc/html/man/form_driver.3x.html0000644000000000000000000003724314550604706020476 0ustar rootroot form_driver 3x 2024-01-13 ncurses 6.4 Library calls

form_driver 3x 2024-01-13 ncurses 6.4 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 wch);


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.4                       2024-01-13                   form_driver(3x)
ncurses-6.4-20240113/doc/html/man/mitem_opts.3x.html0000644000000000000000000001364214530450431020325 0ustar rootroot mitem_opts 3x 2023-11-25 ncurses 6.4 Library calls

mitem_opts 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                    mitem_opts(3x)
ncurses-6.4-20240113/doc/html/man/curs_slk.3x.html0000644000000000000000000004466214537452242020011 0ustar rootroot curs_slk 3x 2023-12-16 ncurses 6.4 Library calls

curs_slk 3x 2023-12-16 ncurses 6.4 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 an error if  the  terminal  or  the  softkeys  were  not
               initialized.

          slk_attrset
               returns  an  error  if  the  terminal  or the softkeys were not
               initialized.

          slk_attr_set
               returns an error if the  terminal  or  the  softkeys  were  not
               initialized,   or   the   color   pair  is  outside  the  range
               0..COLOR_PAIRS-1.

          slk_color
               returns an error if the  terminal  or  the  softkeys  were  not
               initialized,   or   the   color   pair  is  outside  the  range
               0..COLOR_PAIRS-1.

          slk_init
               returns an error if the format parameter is outside  the  range
               0..3.

          slk_label
               returns NULL on error.

          slk_set
               returns  an  error  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 an error.

       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.4                       2023-12-16                      curs_slk(3x)
ncurses-6.4-20240113/doc/html/man/curs_beep.3x.html0000644000000000000000000001214614510361211020105 0ustar rootroot curs_beep 3x 2023-10-07 ncurses 6.4 Library calls

curs_beep 3x 2023-10-07 ncurses 6.4 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

       The  beep  and flash routines are used to alert the terminal user.  The
       routine beep sounds an audible alarm  on  the  terminal,  if  possible;
       otherwise  it  flashes  the  screen  (visible bell).  The routine flash
       flashes the screen, and if that is not possible, sounds the alert.   If
       neither  alert is possible, nothing happens.  Nearly all terminals have
       an audible alert (bell or beep), but only some can flash the screen.


RETURN VALUE

       These routines return OK if they succeed in beeping  or  flashing,  ERR
       otherwise.


EXTENSIONS

       SVr4's  beep  and  flash  routines  always  returned  OK, so it was not
       possible to tell when the beep or flash failed.


PORTABILITY

       These functions are described in the  XSI  Curses  standard,  Issue  4.
       Like SVr4, it specifies that they always return OK.


SEE ALSO

       curses(3x)



ncurses 6.4                       2023-10-07                     curs_beep(3x)
ncurses-6.4-20240113/doc/html/man/menu_pattern.3x.html0000644000000000000000000001427214530450430020645 0ustar rootroot menu_pattern 3x 2023-11-25 ncurses 6.4 Library calls

menu_pattern 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                  menu_pattern(3x)
ncurses-6.4-20240113/doc/html/man/define_key.3x.html0000644000000000000000000001265314537426150020260 0ustar rootroot define_key 3x 2023-12-16 ncurses 6.4 Library calls

define_key 3x 2023-12-16 ncurses 6.4 Library calls

define_key(3x)                   Library calls                  define_key(3x)




NAME

       define_key - define a curses keycode


SYNOPSIS

       #include <curses.h>

       int define_key(const char *definition, int keycode);


DESCRIPTION

       This  is an extension to the curses library.  It permits an application
       to define keycodes with their corresponding control  strings,  so  that
       the ncurses library will interpret them just as it would the predefined
       codes in the terminfo database.

       If definition is NULL, any existing one for  the  keycode  is  removed.
       Similarly,  if  the  given  keycode  is  negative or zero, any existing
       string for the given definition is removed.


RETURN VALUE

       Either keycode must be greater than zero, or definition  must  be  non-
       NULL,  otherwise ERR is returned.  ERR may also be returned if there is
       insufficient memory to allocate the data to store the  definition.   If
       no error is detected, OK is returned.


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

       keyok(3x), key_defined(3x)



ncurses 6.4                       2023-12-16                    define_key(3x)
ncurses-6.4-20240113/doc/html/man/form_page.3x.html0000644000000000000000000001532514537426150020114 0ustar rootroot form_page 3x 2023-12-16 ncurses 6.4 Library calls

form_page 3x 2023-12-16 ncurses 6.4 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.4                       2023-12-16                     form_page(3x)
ncurses-6.4-20240113/doc/html/man/mitem_value.3x.html0000644000000000000000000001271714530450431020456 0ustar rootroot mitem_value 3x 2023-11-25 ncurses 6.4 Library calls

mitem_value 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                   mitem_value(3x)
ncurses-6.4-20240113/doc/html/man/form_field_buffer.3x.html0000644000000000000000000002147514537426150021617 0ustar rootroot form_field_buffer 3x 2023-12-16 ncurses 6.4 Library calls

form_field_buffer 3x 2023-12-16 ncurses 6.4 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.4                       2023-12-16             form_field_buffer(3x)
ncurses-6.4-20240113/doc/html/man/curs_border.3x.html0000644000000000000000000002463414537426146020476 0ustar rootroot curs_border 3x 2023-12-16 ncurses 6.4 Library calls

curs_border 3x 2023-12-16 ncurses 6.4 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.

       X/Open does not  define  any  error  conditions.   This  implementation
       returns an error if the window pointer is null.

       Functions  with  a  "mv"  prefix  first perform a cursor movement using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


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 the XSI Curses standard, Issue 4.


SEE ALSO

       curses(3x), curs_outopts(3x)



ncurses 6.4                       2023-12-16                   curs_border(3x)
ncurses-6.4-20240113/doc/html/man/term.7.html0000644000000000000000000003027514550576013016740 0ustar rootroot term 7 2023-12-02 ncurses 6.4 Miscellaneous

term 7 2023-12-02 ncurses 6.4 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.4                       2023-12-02                           term(7)
ncurses-6.4-20240113/doc/html/man/menu_requestname.3x.html0000644000000000000000000001253014537426151021526 0ustar rootroot menu_requestname 3x 2023-12-16 ncurses 6.4 Library calls

menu_requestname 3x 2023-12-16 ncurses 6.4 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.4                       2023-12-16              menu_requestname(3x)
ncurses-6.4-20240113/doc/html/man/panel.3x.html0000644000000000000000000004137714550576013017261 0ustar rootroot panel 3x 2023-12-23 ncurses 6.4 Library calls

panel 3x 2023-12-23 ncurses 6.4 Library calls

panel(3x)                        Library calls                       panel(3x)




NAME

       panel - panel stack extension for curses


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 an error if mvwin
       returns an error.


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.4                       2023-12-23                         panel(3x)
ncurses-6.4-20240113/doc/html/man/curs_attr.3x.html0000644000000000000000000010226414550604704020160 0ustar rootroot curs_attr 3x 2024-01-13 ncurses 6.4 Library calls

curs_attr 3x 2024-01-13 ncurses 6.4 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 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)

       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

       All routines return the integer OK on success, or ERR on failure.

       X/Open does not define any error conditions.

       This implementation

       o   returns an error if the window pointer is null.

       o   returns an error if the color  pair  parameter  for  wcolor_set  is
           outside the range 0..COLOR_PAIRS-1.

       o   does  not  return an error if either of the parameters of wattr_get
           used for retrieving attribute or color pair values is NULL.

       Functions with a "mv" prefix first  perform  a  cursor  movement  using
       wmove, and return an error if the position is outside the window, or if
       the window pointer is null.


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 the XSI Curses standard, Issue 4.  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.

       The  XSI  Curses standard 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).

       XSI 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

       XSI  curses  does not assign values to these symbols, nor does it state
       whether or not they are related to the similarly-named A_NORMAL, etc.:

       o   The XSI curses standard 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  XSI  standard  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 SVr4 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.4                       2024-01-13                     curs_attr(3x)
ncurses-6.4-20240113/doc/html/man/form_field.3x.html0000644000000000000000000001474614530450427020266 0ustar rootroot form_field 3x 2023-11-25 ncurses 6.4 Library calls

form_field 3x 2023-11-25 ncurses 6.4 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.4                       2023-11-25                    form_field(3x)
ncurses-6.4-20240113/doc/html/ncurses-intro.html0000644000000000000000000041046014340465032017655 0ustar rootroot 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 (System III UNIX) from Bell Labs featured a rewritten and much-improved curses library, along with the tic program (late 1986).

To recap, terminfo is based on Berkeley's termcap database, but contains a number of improvements and extensions. Parameterized capabilities strings were introduced, making it possible to describe multiple video attributes, and colors and to handle far more unusual terminals than possible with termcap. In the later AT&T System V releases, curses evolved to use more facilities and offer more capabilities, going far beyond BSD curses in power and flexibility.

Scope of This Document

This document describes ncurses, a free implementation of the System V curses API with some clearly marked extensions. It includes the following System V curses features:

  • Support for multiple screen highlights (BSD curses could only handle one “standout” highlight, usually reverse-video).
  • Support for line- and box-drawing using forms characters.
  • Recognition of function keys on input.
  • Color support.
  • Support for pads (windows of larger than screen size on which the screen or a subwindow defines a viewport).

Also, this package makes use of the insert and delete line and character features of terminals so equipped, and determines how to optimally use these features with no help from the programmer. It allows arbitrary combinations of video attributes to be displayed, even on terminals that leave “magic cookies” on the screen to mark changes in attributes.

The ncurses package can also capture and use event reports from a mouse in some environments (notably, xterm under the X window system). This document includes tips for using the mouse.

The ncurses package was originated by Pavel Curtis. The original maintainer of this package is Zeyd Ben-Halim <zmbenhal@netcom.com>. Eric S. Raymond <esr@snark.thyrsus.com> wrote many of the new features in versions after 1.8.1 and wrote most of this introduction. 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. Create the menu items, using new_item().
  3. Create the menu using new_menu().
  4. Post the menu using post_menu().
  5. Refresh the screen.
  6. Process user requests via an input loop.
  7. Unpost the menu using unpost_menu().
  8. Free the menu, using free_menu().
  9. Free the items using free_item().
  10. Terminate curses.

Selecting items

Menus may be multi-valued or (the default) single-valued (see the manual page menu_opts(3x) to see how to change the default). Both types always have a current item.

From a single-valued menu you can read the selected value simply by looking at the current item. From a multi-valued menu, you get the selected set by looping through the items applying the item_value() predicate function. Your menu-processing code can use the function set_item_value() to flag the items in the select set.

Menu items can be made unselectable using set_item_opts() or item_opts_off() with the O_SELECTABLE argument. This is the only option so far defined for menus, but it is good practice to code as though other option bits might be on.

Menu Display

The menu library calculates a minimum display size for your window, based on the following variables:

  • The number and maximum length of the menu items
  • Whether the O_ROWMAJOR option is enabled
  • Whether display of descriptions is enabled
  • Whatever menu format may have been set by the programmer
  • The length of the menu mark string used for highlighting selected items

The function set_menu_format() allows you to set the maximum size of the viewport or menu page that will be used to display menu items. You can retrieve any format associated with a menu with menu_format(). The default format is rows=16, columns=1.

The actual menu page may be smaller than the format size. This depends on the item number and size and whether O_ROWMAJOR is on. This option (on by default) causes menu items to be displayed in a “raster-scan” pattern, so that if more than one item will fit horizontally the first couple of items are side-by-side in the top row. The alternative is column-major display, which tries to put the first several items in the first column.

As mentioned above, a menu format not large enough to allow all items to fit on-screen will result in a menu display that is vertically scrollable.

You can scroll it with requests to the menu driver, which will be described in the section on menu input handling.

Each menu has a mark string used to visually tag selected items; see the menu_mark(3x) manual page for details. The mark string length also influences the menu page size.

The function scale_menu() returns the minimum display size that the menu code computes from all these factors. There are other menu display attributes including a select attribute, an attribute for selectable items, an attribute for unselectable items, and a pad character used to separate item name text from description text. These have reasonable defaults which the library allows you to change (see the menu_attribs(3x) manual page.

Menu Windows

Each menu has, as mentioned previously, a pair of associated windows. Both these windows are painted when the menu is posted and erased when the menu is unposted.

The outer or frame window is not otherwise touched by the menu routines. It exists so the programmer can associate a title, a border, or perhaps help text with the menu and have it properly refreshed or erased at post/unpost time. The inner window or subwindow is where the current menu page is displayed.

By default, both windows are stdscr. You can set them with the functions in menu_win(3x).

When you call post_menu(), you write the menu to its subwindow. When you call unpost_menu(), you erase the subwindow, However, neither of these actually modifies the screen. To do that, call wrefresh() or some equivalent.

Processing Menu Input

The main loop of your menu-processing code should call menu_driver() repeatedly. The first argument of this routine is a menu pointer; the second is a menu command code. You should write an input-fetching routine that maps input characters to menu command codes, and pass its output to menu_driver(). The menu command codes are fully documented in menu_driver(3x).

The simplest group of command codes is REQ_NEXT_ITEM, REQ_PREV_ITEM, REQ_FIRST_ITEM, REQ_LAST_ITEM, REQ_UP_ITEM, REQ_DOWN_ITEM, REQ_LEFT_ITEM, REQ_RIGHT_ITEM. These change the currently selected item. These requests may cause scrolling of the menu page if it only partially displayed.

There are explicit requests for scrolling which also change the current item (because the select location does not change, but the item there does). These are REQ_SCR_DLINE, REQ_SCR_ULINE, REQ_SCR_DPAGE, and REQ_SCR_UPAGE.

The REQ_TOGGLE_ITEM selects or deselects the current item. It is for use in multi-valued menus; if you use it with O_ONEVALUE on, you will get an error return (E_REQUEST_DENIED).

Each menu has an associated pattern buffer. The menu_driver() logic tries to accumulate printable ASCII characters passed in in that buffer; when it matches a prefix of an item name, that item (or the next matching item) is selected. If appending a character yields no new match, that character is deleted from the pattern buffer, and menu_driver() returns E_NO_MATCH.

Some requests change the pattern buffer directly: REQ_CLEAR_PATTERN, REQ_BACK_PATTERN, REQ_NEXT_MATCH, REQ_PREV_MATCH. The latter two are useful when pattern buffer input matches more than one item in a multi-valued menu.

Each successful scroll or item navigation request clears the pattern buffer. It is also possible to set the pattern buffer explicitly with set_menu_pattern().

Finally, menu driver requests above the constant MAX_COMMAND are considered application-specific commands. The menu_driver() code ignores them and returns E_UNKNOWN_COMMAND.

Miscellaneous Other Features

Various menu options can affect the processing and visual appearance and input processing of menus. See menu_opts(3x) for details.

It is possible to change the current item from application code; this is useful if you want to write your own navigation requests. It is also possible to explicitly set the top row of the menu display. See mitem_current(3x). If your application needs to change the menu subwindow cursor for any reason, pos_menu_cursor() will restore it to the correct location for continuing menu driver processing.

It is possible to set hooks to be called at menu initialization and wrapup time, and whenever the selected item changes. See menu_hook(3x).

Each item, and each menu, has an associated user pointer on which you can hang application data. See mitem_userptr(3x) and menu_userptr(3x).

The Forms Library

The form library is a curses extension that supports easy programming of on-screen forms for data entry and program control.

The form library first appeared in AT&T System V. The version documented here is the form code distributed with ncurses.

Compiling With the form Library

Your form-using modules must import the form library declarations with

          #include <form.h>

and must be linked explicitly with the forms library using an -lform argument. Note that they must also link the ncurses library with -lncurses. Many linkers are two-pass and will accept either order, but it is still good practice to put -lform first and -lncurses second.

Overview of Forms

A form is a collection of fields; each field may be either a label (explanatory text) or a data-entry location. Long forms may be segmented into pages; each entry to a new page clears the screen.

To make forms, you create groups of fields and connect them with form frame objects; the form library makes this relatively simple.

Once defined, a form can be posted, that is written to an associated window. Actually, each form has two associated windows; a containing window in which the programmer can scribble titles or borders, and a subwindow in which the form fields proper are displayed.

As the form user fills out the posted form, navigation and editing keys support movement between fields, editing keys support modifying field, and plain text adds to or changes data in a current field. The form library allows you (the forms designer) to bind each navigation and editing key to any keystroke accepted by curses Fields may have validation conditions on them, so that they check input data for type and value. The form library supplies a rich set of pre-defined field types, and makes it relatively easy to define new ones.

Once its transaction is completed (or aborted), a form may be unposted (that is, undisplayed), and finally freed to make the storage associated with it and its items available for re-use.

The general flow of control of a form program looks like this:

  1. Initialize curses.
  2. Create the form fields, using new_field().
  3. Create the form using new_form().
  4. Post the form using post_form().
  5. Refresh the screen.
  6. Process user requests via an input loop.
  7. Unpost the form using unpost_form().
  8. Free the form, using free_form().
  9. Free the fields using free_field().
  10. Terminate curses.

Note that this looks much like a menu program; the form library handles tasks which are in many ways similar, and its interface was obviously designed to resemble that of the menu library wherever possible.

In forms programs, however, the “process user requests” is somewhat more complicated than for menus. Besides menu-like navigation operations, the menu driver loop has to support field editing and data validation.

Creating and Freeing Fields and Forms

The basic function for creating fields is new_field():

FIELD *new_field(int height, int width,   /* new field size */
                 int top, int left,       /* upper left corner */
                 int offscreen,           /* number of offscreen rows */
                 int nbuf);               /* number of working buffers */

Menu items always occupy a single row, but forms fields may have multiple rows. So new_field() requires you to specify a width and height (the first two arguments, which mist both be greater than zero).

You must also specify the location of the field's upper left corner on the screen (the third and fourth arguments, which must be zero or greater). Note that these coordinates are relative to the form subwindow, which will coincide with stdscr by default but need not be stdscr if you have done an explicit set_form_win() call.

The fifth argument allows you to specify a number of off-screen rows. If this is zero, the entire field will always be displayed. If it is nonzero, the form will be scrollable, with only one screen-full (initially the top part) displayed at any given time. If you make a field dynamic and grow it so it will no longer fit on the screen, the form will become scrollable even if the offscreen argument was initially zero.

The forms library allocates one working buffer per field; the size of each buffer is ((height + offscreen)*width + 1, one character for each position in the field plus a NUL terminator. The sixth argument is the number of additional data buffers to allocate for the field; your application can use them for its own purposes.

FIELD *dup_field(FIELD *field,            /* field to copy */
                 int top, int left);      /* location of new copy */

The function dup_field() duplicates an existing field at a new location. Size and buffering information are copied; some attribute flags and status bits are not (see the form_field_new(3X) for details).

FIELD *link_field(FIELD *field,           /* field to copy */
                  int top, int left);     /* location of new copy */

The function link_field() also duplicates an existing field at a new location. The difference from dup_field() is that it arranges for the new field's buffer to be shared with the old one.

Besides the obvious use in making a field editable from two different form pages, linked fields give you a way to hack in dynamic labels. If you declare several fields linked to an original, and then make them inactive, changes from the original will still be propagated to the linked fields.

As with duplicated fields, linked fields have attribute bits separate from the original.

As you might guess, all these field-allocations return NULL if the field allocation is not possible due to an out-of-memory error or out-of-bounds arguments.

To connect fields to a form, use

FORM *new_form(FIELD **fields);

This function expects to see a NULL-terminated array of field pointers. Said fields are connected to a newly-allocated form object; its address is returned (or else NULL if the allocation fails).

Note that new_field() does not copy the pointer array into private storage; if you modify the contents of the pointer array during forms processing, all manner of bizarre things might happen. Also note that any given field may only be connected to one form.

The functions free_field() and free_form are available to free field and form objects. It is an error to attempt to free a field connected to a form, but not vice-versa; thus, you will generally free your form objects first.

Fetching and Changing Field Attributes

Each form field has a number of location and size attributes associated with it. There are other field attributes used to control display and editing of the field. Some (for example, the O_STATIC bit) involve sufficient complications to be covered in sections of their own later on. We cover the functions used to get and set several basic attributes here.

When a field is created, the attributes not specified by the new_field function are copied from an invisible system default field. In attribute-setting and -fetching functions, the argument NULL is taken to mean this field. Changes to it persist as defaults until your forms application terminates.

Fetching Size and Location Data

You can retrieve field sizes and locations through:

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

This function is a sort of inverse of new_field(); instead of setting size and location attributes of a new field, it fetches them from an existing one.

Changing the Field Location

It is possible to move a field's location on the screen:

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

You can, of course. query the current location through field_info().

The Justification Attribute

One-line fields may be unjustified, justified right, justified left, or centered. Here is how you manipulate this attribute:

int set_field_just(FIELD *field,          /* field to alter */
                   int justmode);         /* mode to set */

int field_just(FIELD *field);             /* fetch mode of field */

The mode values accepted and returned by this functions are preprocessor macros NO_JUSTIFICATION, JUSTIFY_RIGHT, JUSTIFY_LEFT, or JUSTIFY_CENTER.

Field Display Attributes

For each field, you can set a foreground attribute for entered characters, a background attribute for the entire field, and a pad character for the unfilled portion of the field. You can also control pagination of the form.

This group of four field attributes controls the visual appearance of the field on the screen, without affecting in any way the data in the field buffer.

int set_field_fore(FIELD *field,          /* field to alter */
                   chtype attr);          /* attribute to set */

chtype field_fore(FIELD *field);          /* field to query */

int set_field_back(FIELD *field,          /* field to alter */
                   chtype attr);          /* attribute to set */

chtype field_back(FIELD *field);          /* field to query */

int set_field_pad(FIELD *field,           /* field to alter */
                 int pad);                /* pad character to set */

chtype field_pad(FIELD *field);

int set_new_page(FIELD *field,            /* field to alter */
                 int flag);               /* TRUE to force new page */

chtype new_page(FIELD *field);            /* field to query */

The attributes set and returned by the first four functions are normal curses(3x) display attribute values (A_STANDOUT, A_BOLD, A_REVERSE etc). The page bit of a field controls whether it is displayed at the start of a new form screen.

Field Option Bits

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

int set_field_opts(FIELD *field,          /* field to alter */
                   int attr);             /* attribute to set */

int field_opts_on(FIELD *field,           /* field to alter */
                  int attr);              /* attributes to turn on */

int field_opts_off(FIELD *field,          /* field to alter */
                   int attr);             /* attributes to turn off */

int field_opts(FIELD *field);             /* field to query */

By default, all options are on. Here are the available option bits:

O_VISIBLE
Controls whether the field is visible on the screen. Can be used during form processing to hide or pop up fields depending on the value of parent fields.
O_ACTIVE
Controls whether the field is active during forms processing (i.e. visited by form navigation keys). Can be used to make labels or derived fields with buffer values alterable by the forms application, not the user.
O_PUBLIC
Controls whether data is displayed during field entry. If this option is turned off on a field, the library will accept and edit data in that field, but it will not be displayed and the visible field cursor will not move. You can turn off the O_PUBLIC bit to define password fields.
O_EDIT
Controls whether the field's data can be modified. When this option is off, all editing requests except REQ_PREV_CHOICE and REQ_NEXT_CHOICE will fail. Such read-only fields may be useful for help messages.
O_WRAP
Controls word-wrapping in multi-line fields. Normally, when any character of a (blank-separated) word reaches the end of the current line, the entire word is wrapped to the next line (assuming there is one). When this option is off, the word will be split across the line break.
O_BLANK
Controls field blanking. When this option is on, entering a character at the first field position erases the entire field (except for the just-entered character).
O_AUTOSKIP
Controls automatic skip to next field when this one fills. Normally, when the forms user tries to type more data into a field than will fit, the editing location jumps to next field. When this option is off, the user's cursor will hang at the end of the field. This option is ignored in dynamic fields that have not reached their size limit.
O_NULLOK
Controls whether validation is applied to blank fields. Normally, it is not; the user can leave a field blank without invoking the usual validation check on exit. If this option is off on a field, exit from it will invoke a validation check.
O_PASSOK
Controls whether validation occurs on every exit, or only after the field is modified. Normally the latter is true. Setting O_PASSOK may be useful if your field's validation function may change during forms processing.
O_STATIC
Controls whether the field is fixed to its initial dimensions. If you turn this off, the field becomes dynamic and will stretch to fit entered data.

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

The option values are bit-masks and can be composed with logical-or in the obvious way.

Field Status

Every field has a status flag, which is set to FALSE when the field is created and TRUE when the value in field buffer 0 changes. This flag can be queried and set directly:

int set_field_status(FIELD *field,      /* field to alter */
                   int status);         /* mode to set */

int field_status(FIELD *field);         /* fetch mode of field */

Setting this flag under program control can be useful if you use the same form repeatedly, looking for modified fields each time.

Calling field_status() on a field not currently selected for input will return a correct value. Calling field_status() on a field that is currently selected for input may not necessarily give a correct field status value, because entered data is not necessarily copied to buffer zero before the exit validation check. To guarantee that the returned status value reflects reality, call field_status() either (1) in the field's exit validation check routine, (2) from the field's or form's initialization or termination hooks, or (3) just after a REQ_VALIDATION request has been processed by the forms driver.

Field User Pointer

Each field structure contains one character pointer slot that is not used by the forms library. It is intended to be used by applications to store private per-field data. You can manipulate it with:

int set_field_userptr(FIELD *field,       /* field to alter */
                   char *userptr);        /* mode to set */

char *field_userptr(FIELD *field);        /* fetch mode of field */
(Properly, this user pointer field ought to have (void *) type. The (char *) type is retained for System V compatibility.)

It is valid to set the user pointer of the default field (with a set_field_userptr() call passed a NULL field pointer.) When a new field is created, the default-field user pointer is copied to initialize the new field's user pointer.

Variable-Sized Fields

Normally, a field is fixed at the size specified for it at creation time. If, however, you turn off its O_STATIC bit, it becomes dynamic and will automatically resize itself to accommodate data as it is entered. If the field has extra buffers associated with it, they will grow right along with the main input buffer.

A one-line dynamic field will have a fixed height (1) but variable width, scrolling horizontally to display data within the field area as originally dimensioned and located. A multi-line dynamic field will have a fixed width, but variable height (number of rows), scrolling vertically to display data within the field area as originally dimensioned and located.

Normally, a dynamic field is allowed to grow without limit. But it is possible to set an upper limit on the size of a dynamic field. You do it with this function:

int set_max_field(FIELD *field,     /* field to alter (may not be NULL) */
                   int max_size);   /* upper limit on field size */

If the field is one-line, max_size is taken to be a column size limit; if it is multi-line, it is taken to be a line size limit. To disable any limit, use an argument of zero. The growth limit can be changed whether or not the O_STATIC bit is on, but has no effect until it is.

The following properties of a field change when it becomes dynamic:

  • If there is no growth limit, there is no final position of the field; therefore O_AUTOSKIP and O_NL_OVERLOAD are ignored.
  • Field justification will be ignored (though whatever justification is set up will be retained internally and can be queried).
  • The dup_field() and link_field() calls copy dynamic-buffer sizes. If the O_STATIC option is set on one of a collection of links, buffer resizing will occur only when the field is edited through that link.
  • The call field_info() will retrieve the original static size of the field; use dynamic_field_info() to get the actual dynamic size.

Field Validation

By default, a field will accept any data that will fit in its input buffer. However, it is possible to attach a validation type to a field. If you do this, any attempt to leave the field while it contains data that does not match the validation type will fail. Some validation types also have a character-validity check for each time a character is entered in the field.

A field's validation check (if any) is not called when set_field_buffer() modifies the input buffer, nor when that buffer is changed through a linked field.

The form library provides a rich set of pre-defined validation types, and gives you the capability to define custom ones of your own. You can examine and change field validation attributes with the following functions:

int set_field_type(FIELD *field,          /* field to alter */
                   FIELDTYPE *ftype,      /* type to associate */
                   ...);                  /* additional arguments*/

FIELDTYPE *field_type(FIELD *field);      /* field to query */

The validation type of a field is considered an attribute of the field. As with other field attributes, Also, doing set_field_type() with a NULL field default will change the system default for validation of newly-created fields.

Here are the pre-defined validation types:

TYPE_ALPHA

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

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

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

TYPE_ALNUM

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

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

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

TYPE_ENUM

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

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

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

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

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

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

TYPE_INTEGER

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

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

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

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

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

TYPE_NUMERIC

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

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

Valid characters consist of an optional leading minus and digits. possibly including a decimal point. If your system supports locale's, the decimal point character used must be the one defined by your locale. The range check is performed on exit. If the range maximum is less than or equal to the minimum, the range is ignored.

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

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

TYPE_REGEXP

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

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

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

Direct Field Buffer Manipulation

The chief attribute of a field is its buffer contents. When a form has been completed, your application usually needs to know the state of each field buffer. You can find this out with:

char *field_buffer(FIELD *field,          /* field to query */
                   int bufindex);         /* number of buffer to query */

Normally, the state of the zero-numbered buffer for each field is set by the user's editing actions on that field. It is sometimes useful to be able to set the value of the zero-numbered (or some other) buffer from your application:

int set_field_buffer(FIELD *field,        /* field to alter */
                   int bufindex,          /* number of buffer to alter */
                   char *value);          /* string value to set */

If the field is not large enough and cannot be resized to a sufficiently large size to contain the specified value, the value will be truncated to fit.

Calling field_buffer() with a null field pointer will raise an error. Calling field_buffer() on a field not currently selected for input will return a correct value. Calling field_buffer() on a field that is currently selected for input may not necessarily give a correct field buffer value, because entered data is not necessarily copied to buffer zero before the exit validation check. To guarantee that the returned buffer value reflects on-screen reality, call field_buffer() either (1) in the field's exit validation check routine, (2) from the field's or form's initialization or termination hooks, or (3) just after a REQ_VALIDATION request has been processed by the forms driver.

Attributes of Forms

As with field attributes, form attributes inherit a default from a system default form structure. These defaults can be queried or set by of these functions using a form-pointer argument of NULL.

The principal attribute of a form is its field list. You can query and change this list with:

int set_form_fields(FORM *form,           /* form to alter */
                    FIELD **fields);      /* fields to connect */

char *form_fields(FORM *form);            /* fetch fields of form */

int field_count(FORM *form);              /* count connect fields */

The second argument of set_form_fields() may be a NULL-terminated field pointer array like the one required by new_form(). In that case, the old fields of the form are disconnected but not freed (and eligible to be connected to other forms), then the new fields are connected.

It may also be null, in which case the old fields are disconnected (and not freed) but no new ones are connected.

The field_count() function simply counts the number of fields connected to a given from. It returns -1 if the form-pointer argument is NULL.

Control of Form Display

In the overview section, you saw that to display a form you normally start by defining its size (and fields), posting it, and refreshing the screen. There is an hidden step before posting, which is the association of the form with a frame window (actually, a pair of windows) within which it will be displayed. By default, the forms library associates every form with the full-screen window stdscr.

By making this step explicit, you can associate a form with a declared frame window on your screen display. This can be useful if you want to adapt the form display to different screen sizes, dynamically tile forms on the screen, or use a form as part of an interface layout managed by panels.

The two windows associated with each form have the same functions as their analogues in the menu library. Both these windows are painted when the form is posted and erased when the form is unposted.

The outer or frame window is not otherwise touched by the form routines. It exists so the programmer can associate a title, a border, or perhaps help text with the form and have it properly refreshed or erased at post/unpost time. The inner window or subwindow is where the current form page is actually displayed.

In order to declare your own frame window for a form, you will need to know the size of the form's bounding rectangle. You can get this information with:

int scale_form(FORM *form,                /* form to query */
               int *rows,                 /* form rows */
               int *cols);                /* form cols */

The form dimensions are passed back in the locations pointed to by the arguments. Once you have this information, you can use it to declare of windows, then use one of these functions:

int set_form_win(FORM *form,              /* form to alter */
                 WINDOW *win);            /* frame window to connect */

WINDOW *form_win(FORM *form);             /* fetch frame window of form */

int set_form_sub(FORM *form,              /* form to alter */
                 WINDOW *win);            /* form subwindow to connect */

WINDOW *form_sub(FORM *form);             /* fetch form subwindow of form */

Note that curses operations, including refresh(), on the form, should be done on the frame window, not the form subwindow.

It is possible to check from your application whether all of a scrollable field is actually displayed within the menu subwindow. Use these functions:

int data_ahead(FORM *form);               /* form to be queried */

int data_behind(FORM *form);              /* form to be queried */

The function data_ahead() returns TRUE if (a) the current field is one-line and has undisplayed data off to the right, (b) the current field is multi-line and there is data off-screen below it.

The function data_behind() returns TRUE if the first (upper left hand) character position is off-screen (not being displayed).

Finally, there is a function to restore the form window's cursor to the value expected by the forms driver:

int pos_form_cursor(FORM *)               /* form to be queried */

If your application changes the form window cursor, call this function before handing control back to the forms driver in order to re-synchronize it.

Input Processing in the Forms Driver

The function form_driver() handles virtualized input requests for form navigation, editing, and validation requests, just as menu_driver does for menus (see the section on menu input handling).

int form_driver(FORM *form,               /* form to pass input to */
                int request);             /* form request code */

Your input virtualization function needs to take input and then convert it to either an alphanumeric character (which is treated as data to be entered in the currently-selected field), or a forms processing request.

The forms driver provides hooks (through input-validation and field-termination functions) with which your application code can check that the input taken by the driver matched what was expected.

Page Navigation Requests

These requests cause page-level moves through the form, triggering display of a new form screen.

REQ_NEXT_PAGE
Move to the next form page.
REQ_PREV_PAGE
Move to the previous form page.
REQ_FIRST_PAGE
Move to the first form page.
REQ_LAST_PAGE
Move to the last form page.

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

Inter-Field Navigation Requests

These requests handle navigation between fields on the same page.

REQ_NEXT_FIELD
Move to next field.
REQ_PREV_FIELD
Move to previous field.
REQ_FIRST_FIELD
Move to the first field.
REQ_LAST_FIELD
Move to the last field.
REQ_SNEXT_FIELD
Move to sorted next field.
REQ_SPREV_FIELD
Move to sorted previous field.
REQ_SFIRST_FIELD
Move to the sorted first field.
REQ_SLAST_FIELD
Move to the sorted last field.
REQ_LEFT_FIELD
Move left to field.
REQ_RIGHT_FIELD
Move right to field.
REQ_UP_FIELD
Move up to field.
REQ_DOWN_FIELD
Move down to field.

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

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

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

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

Intra-Field Navigation Requests

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

REQ_NEXT_CHAR
Move to next character.
REQ_PREV_CHAR
Move to previous character.
REQ_NEXT_LINE
Move to next line.
REQ_PREV_LINE
Move to previous line.
REQ_NEXT_WORD
Move to next word.
REQ_PREV_WORD
Move to previous word.
REQ_BEG_FIELD
Move to beginning of field.
REQ_END_FIELD
Move to end of field.
REQ_BEG_LINE
Move to beginning of line.
REQ_END_LINE
Move to end of line.
REQ_LEFT_CHAR
Move left in field.
REQ_RIGHT_CHAR
Move right in field.
REQ_UP_CHAR
Move up in field.
REQ_DOWN_CHAR
Move down in field.

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

Scrolling Requests

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

REQ_SCR_FLINE
Scroll vertically forward a line.
REQ_SCR_BLINE
Scroll vertically backward a line.
REQ_SCR_FPAGE
Scroll vertically forward a page.
REQ_SCR_BPAGE
Scroll vertically backward a page.
REQ_SCR_FHPAGE
Scroll vertically forward half a page.
REQ_SCR_BHPAGE
Scroll vertically backward half a page.
REQ_SCR_FCHAR
Scroll horizontally forward a character.
REQ_SCR_BCHAR
Scroll horizontally backward a character.
REQ_SCR_HFLINE
Scroll horizontally one field width forward.
REQ_SCR_HBLINE
Scroll horizontally one field width backward.
REQ_SCR_HFHALF
Scroll horizontally one half field width forward.
REQ_SCR_HBHALF
Scroll horizontally one half field width backward.

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

Editing Requests

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

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

REQ_INS_MODE
Set insertion mode.
REQ_OVL_MODE
Set overlay mode.
REQ_NEW_LINE
New line request (see below for explanation).
REQ_INS_CHAR
Insert space at character location.
REQ_INS_LINE
Insert blank line at character location.
REQ_DEL_CHAR
Delete character at cursor.
REQ_DEL_PREV
Delete previous word at cursor.
REQ_DEL_LINE
Delete line at cursor.
REQ_DEL_WORD
Delete word at cursor.
REQ_CLR_EOL
Clear to end of line.
REQ_CLR_EOF
Clear to end of field.
REQ_CLEAR_FIELD
Clear entire field.

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

First, we consider REQ_NEW_LINE:

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

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

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

Now, let us consider REQ_DEL_PREV:

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

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

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

See Form Options for discussion of how to set and clear the overload options.

Order Requests

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

REQ_NEXT_CHOICE
Place the successor value of the current value in the buffer.
REQ_PREV_CHOICE
Place the predecessor value of the current value in the buffer.

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

Application Commands

Form requests are represented as integers above the curses value greater than KEY_MAX and less than or equal to the constant MAX_COMMAND. If your input-virtualization routine returns a value above MAX_COMMAND, the forms driver will ignore it.

Field Change Hooks

It is possible to set function hooks to be executed whenever the current field or form changes. Here are the functions that support this:

typedef void    (*HOOK)();       /* pointer to function returning void */

int set_form_init(FORM *form,    /* form to alter */
                  HOOK hook);    /* initialization hook */

HOOK form_init(FORM *form);      /* form to query */

int set_form_term(FORM *form,    /* form to alter */
                  HOOK hook);    /* termination hook */

HOOK form_term(FORM *form);      /* form to query */

int set_field_init(FORM *form,   /* form to alter */
                  HOOK hook);    /* initialization hook */

HOOK field_init(FORM *form);     /* form to query */

int set_field_term(FORM *form,   /* form to alter */
                  HOOK hook);    /* termination hook */

HOOK field_term(FORM *form);     /* form to query */

These functions allow you to either set or query four different hooks. In each of the set functions, the second argument should be the address of a hook function. These functions differ only in the timing of the hook call.

form_init
This hook is called when the form is posted; also, just after each page change operation.
field_init
This hook is called when the form is posted; also, just after each field change
field_term
This hook is called just after field validation; that is, just before the field is altered. It is also called when the form is unposted.
form_term
This hook is called when the form is unposted; also, just before each page change operation.

Calls to these hooks may be triggered

  1. When user editing requests are processed by the forms driver
  2. When the current page is changed by set_current_field() call
  3. When the current field is changed by a set_form_page() call

See Field Change Commands for discussion of the latter two cases.

You can set a default hook for all fields by passing one of the set functions a NULL first argument.

You can disable any of these hooks by (re)setting them to NULL, the default value.

Field Change Commands

Normally, navigation through the form will be driven by the user's input requests. But sometimes it is useful to be able to move the focus for editing and viewing under control of your application, or ask which field it currently is in. The following functions help you accomplish this:

int set_current_field(FORM *form,         /* form to alter */
                      FIELD *field);      /* field to shift to */

FIELD *current_field(FORM *form);         /* form to query */

int field_index(FORM *form,               /* form to query */
                FIELD *field);            /* field to get index of */

The function field_index() returns the index of the given field in the given form's field array (the array passed to new_form() or set_form_fields()).

The initial current field of a form is the first active field on the first page. The function set_form_fields() resets this.

It is also possible to move around by pages.

int set_form_page(FORM *form,             /* form to alter */
                  int page);              /* page to go to (0-origin) */

int form_page(FORM *form);                /* return form's current page */

The initial page of a newly-created form is 0. The function set_form_fields() resets this.

Form Options

Like fields, forms may have control option bits. They can be changed or queried with these functions:

int set_form_opts(FORM *form,             /* form to alter */
                  int attr);              /* attribute to set */

int form_opts_on(FORM *form,              /* form to alter */
                 int attr);               /* attributes to turn on */

int form_opts_off(FORM *form,             /* form to alter */
                  int attr);              /* attributes to turn off */

int form_opts(FORM *form);                /* form to query */

By default, all options are on. Here are the available option bits:

O_NL_OVERLOAD
Enable overloading of REQ_NEW_LINE as described in Editing Requests. The value of this option is ignored on dynamic fields that have not reached their size limit; these have no last line, so the circumstances for triggering a REQ_NEXT_FIELD never arise.
O_BS_OVERLOAD
Enable overloading of REQ_DEL_PREV as described in Editing Requests.

The option values are bit-masks and can be composed with logical-or in the obvious way.

Custom Validation Types

The form library gives you the capability to define custom validation types of your own. Further, the optional additional arguments of set_field_type effectively allow you to parameterize validation types. Most of the complications in the validation-type interface have to do with the handling of the additional arguments within custom validation functions.

Union Types

The simplest way to create a custom data type is to compose it from two preexisting ones:

FIELD *link_fieldtype(FIELDTYPE *type1,
                      FIELDTYPE *type2);

This function creates a field type that will accept any of the values legal for either of its argument field types (which may be either predefined or programmer-defined). If a set_field_type() call later requires arguments, the new composite type expects all arguments for the first type, than all arguments for the second. Order functions (see Order Requests) associated with the component types will work on the composite; what it does is check the validation function for the first type, then for the second, to figure what type the buffer contents should be treated as.

New Field Types

To create a field type from scratch, you need to specify one or both of the following things:

  • A character-validation function, to check each character as it is entered.
  • A field-validation function to be applied on exit from the field.

Here is how you do that:

typedef int     (*HOOK)();       /* pointer to function returning int */

FIELDTYPE *new_fieldtype(HOOK f_validate, /* field validator */
                         HOOK c_validate) /* character validator */

int free_fieldtype(FIELDTYPE *ftype);     /* type to free */

At least one of the arguments of new_fieldtype() must be non-NULL. The forms driver will automatically call the new type's validation functions at appropriate points in processing a field of the new type.

The function free_fieldtype() deallocates the argument fieldtype, freeing all storage associated with it.

Normally, a field validator is called when the user attempts to leave the field. Its first argument is a field pointer, from which it can get to field buffer 0 and test it. If the function returns TRUE, the operation succeeds; if it returns FALSE, the edit cursor stays in the field.

A character validator gets the character passed in as a first argument. It too should return TRUE if the character is valid, FALSE otherwise.

Validation Function Arguments

Your field- and character- validation functions will be passed a second argument as well. This second argument is the address of a structure (which we will call a pile) built from any of the field-type-specific arguments passed to set_field_type(). If no such arguments are defined for the field type, this pile pointer argument will be NULL.

In order to arrange for such arguments to be passed to your validation functions, you must associate a small set of storage-management functions with the type. The forms driver will use these to synthesize a pile from the trailing arguments of each set_field_type() argument, and a pointer to the pile will be passed to the validation functions.

Here is how you make the association:

typedef char    *(*PTRHOOK)();    /* pointer to function returning (char *) */
typedef void    (*VOIDHOOK)();    /* pointer to function returning void */

int set_fieldtype_arg(FIELDTYPE *type,    /* type to alter */
                      PTRHOOK make_str,   /* make structure from args */
                      PTRHOOK copy_str,   /* make copy of structure */
                      VOIDHOOK free_str); /* free structure storage */

Here is how the storage-management hooks are used:

make_str
This function is called by set_field_type(). It gets one argument, a va_list of the type-specific arguments passed to set_field_type(). It is expected to return a pile pointer to a data structure that encapsulates those arguments.
copy_str
This function is called by form library functions that allocate new field instances. It is expected to take a pile pointer, copy the pile to allocated storage, and return the address of the pile copy.
free_str
This function is called by field- and type-deallocation routines in the library. It takes a pile pointer argument, and is expected to free the storage of that pile.

The make_str and copy_str functions may return NULL to signal allocation failure. The library routines will that call them will return error indication when this happens. Thus, your validation functions should never see a NULL file pointer and need not check specially for it.

Order Functions For Custom Types

Some custom field types are simply ordered in the same well-defined way that TYPE_ENUM is. For such types, it is possible to define successor and predecessor functions to support the REQ_NEXT_CHOICE and REQ_PREV_CHOICE requests. Here is how:

typedef int     (*INTHOOK)();     /* pointer to function returning int */

int set_fieldtype_arg(FIELDTYPE *type,    /* type to alter */
                      INTHOOK succ,       /* get successor value */
                      INTHOOK pred);      /* get predecessor value */

The successor and predecessor arguments will each be passed two arguments; a field pointer, and a pile pointer (as for the validation functions). They are expected to use the function field_buffer() to read the current value, and set_field_buffer() on buffer 0 to set the next or previous value. Either hook may return TRUE to indicate success (a legal next or previous value was set) or FALSE to indicate failure.

Avoiding Problems

The interface for defining custom types is complicated and tricky. Rather than attempting to create a custom type entirely from scratch, you should start by studying the library source code for whichever of the pre-defined types seems to be closest to what you want.

Use that code as a model, and evolve it towards what you really want. You will avoid many problems and annoyances that way. The code in the ncurses library has been specifically exempted from the package copyright to support this.

If your custom type defines order functions, have do something intuitive with a blank field. A useful convention is to make the successor of a blank field the types minimum value, and its predecessor the maximum.

ncurses-6.4-20240113/doc/hackguide.doc0000644000000000000000000007733114354116727015642 0ustar rootroot 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!) ncurses-6.4-20240113/doc/ncurses-intro.doc0000644000000000000000000033655414354116727016536 0ustar rootroot Writing Programs with NCURSES Writing Programs with NCURSES by Eric S. Raymond and Zeyd M. Ben-Halim updates since release 1.9.9e by Thomas Dickey Contents * Introduction + A Brief History of Curses + Scope of This Document + Terminology * The Curses Library + An Overview of Curses o Compiling Programs using Curses o Updating the Screen o Standard Windows and Function Naming Conventions o Variables + Using the Library o Starting up o Output o Input o Using Forms Characters o Character Attributes and Color o Mouse Interfacing o Finishing Up + Function Descriptions o Initialization and Wrapup o Causing Output to the Terminal o Low-Level Capability Access o Debugging + Hints, Tips, and Tricks o Some Notes of Caution o Temporarily Leaving ncurses Mode o Using ncurses under xterm o Handling Multiple Terminal Screens o Testing for Terminal Capabilities o Tuning for Speed o Special Features of ncurses + Compatibility with Older Versions o Refresh of Overlapping Windows o Background Erase + XSI Curses Conformance * The Panels Library + Compiling With the Panels Library + Overview of Panels + Panels, Input, and the Standard Screen + Hiding Panels + Miscellaneous Other Facilities * The Menu Library + Compiling with the menu Library + Overview of Menus + Selecting items + Menu Display + Menu Windows + Processing Menu Input + Miscellaneous Other Features * The Forms Library + Compiling with the forms Library + Overview of Forms + Creating and Freeing Fields and Forms + Fetching and Changing Field Attributes o Fetching Size and Location Data o Changing the Field Location o The Justification Attribute o Field Display Attributes o Field Option Bits o Field Status o Field User Pointer + Variable-Sized Fields + Field Validation o TYPE_ALPHA o TYPE_ALNUM o TYPE_ENUM o TYPE_INTEGER o TYPE_NUMERIC o TYPE_REGEXP + Direct Field Buffer Manipulation + Attributes of Forms + Control of Form Display + Input Processing in the Forms Driver o Page Navigation Requests o Inter-Field Navigation Requests o Intra-Field Navigation Requests o Scrolling Requests o Field Editing Requests o Order Requests o Application Commands + Field Change Hooks + Field Change Commands + Form Options + Custom Validation Types o Union Types o New Field Types o Validation Function Arguments o Order Functions For Custom Types o Avoiding Problems _________________________________________________________________ Introduction This document is an introduction to programming with curses. It is not an exhaustive reference for the curses Application Programming Interface (API); that role is filled by the curses manual pages. Rather, it is intended to help C programmers ease into using the package. This document is aimed at C applications programmers not yet specifically familiar with ncurses. If you are already an experienced curses programmer, you should nevertheless read the sections on Mouse Interfacing, Debugging, Compatibility with Older Versions, and Hints, Tips, and Tricks. These will bring you up to speed on the special features and quirks of the ncurses implementation. If you are not so experienced, keep reading. The curses package is a subroutine library for terminal-independent screen-painting and input-event handling which presents a high level screen model to the programmer, hiding differences between terminal types and doing automatic optimization of output to change one screen full of text into another. Curses uses terminfo, which is a database format that can describe the capabilities of thousands of different terminals. The curses API may seem something of an archaism on UNIX desktops increasingly dominated by X, Motif, and Tcl/Tk. Nevertheless, UNIX still supports tty lines and X supports xterm(1); the curses API has the advantage of (a) back-portability to character-cell terminals, and (b) simplicity. For an application that does not require bit-mapped graphics and multiple fonts, an interface implementation using curses will typically be a great deal simpler and less expensive than one using an X toolkit. A Brief History of Curses Historically, the first ancestor of curses was the routines written to provide screen-handling for the vi editor; these used the termcap database facility (both released in 3BSD) for describing terminal capabilities. These routines were abstracted into a documented library and first released with the early BSD UNIX versions. All of this work was done by students at the University of California (Berkeley campus). The curses library was first published in 4.0BSD, a year after 3BSD (i.e., late 1980). After graduation, one of those students went to work at AT&T Bell Labs, and made an improved termcap library called terminfo (i.e., "libterm"), and adapted the curses library to use this. That was subsequently released in System V Release 2 (early 1984). Thereafter, other developers added to the curses and terminfo libraries. For instance, a student at Cornell University wrote an improved terminfo library as well as a tool (tic) to compile the terminal descriptions. As a general rule, AT&T did not identify the developers in the source-code or documentation; the tic and infocmp programs are the exceptions. System V Release 3 (System III UNIX) from Bell Labs featured a rewritten and much-improved curses library, along with the tic program (late 1986). To recap, terminfo is based on Berkeley's termcap database, but contains a number of improvements and extensions. Parameterized capabilities strings were introduced, making it possible to describe multiple video attributes, and colors and to handle far more unusual terminals than possible with termcap. In the later AT&T System V releases, curses evolved to use more facilities and offer more capabilities, going far beyond BSD curses in power and flexibility. Scope of This Document This document describes ncurses, a free implementation of the System V curses API with some clearly marked extensions. It includes the following System V curses features: * Support for multiple screen highlights (BSD curses could only handle one "standout" highlight, usually reverse-video). * Support for line- and box-drawing using forms characters. * Recognition of function keys on input. * Color support. * Support for pads (windows of larger than screen size on which the screen or a subwindow defines a viewport). Also, this package makes use of the insert and delete line and character features of terminals so equipped, and determines how to optimally use these features with no help from the programmer. It allows arbitrary combinations of video attributes to be displayed, even on terminals that leave "magic cookies" on the screen to mark changes in attributes. The ncurses package can also capture and use event reports from a mouse in some environments (notably, xterm under the X window system). This document includes tips for using the mouse. The ncurses package was originated by Pavel Curtis. The original maintainer of this package is Zeyd Ben-Halim . 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. ncurses-6.4-20240113/c++/0000755000000000000000000000000014472447406013021 5ustar rootrootncurses-6.4-20240113/c++/cursesf.cc0000644000000000000000000003015614036622274015001 0ustar rootroot// * this is for making emacs happy: -*-Mode: C++;-*- /**************************************************************************** * Copyright 2019-2020,2021 Thomas E. Dickey * * Copyright 1998-2005,2011 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1997 * ****************************************************************************/ #include "internal.h" #include "cursesf.h" #include "cursesapp.h" MODULE_ID("$Id: cursesf.cc,v 1.26 2021/04/17 18:11:08 tom Exp $") NCursesFormField::~NCursesFormField () THROWS(NCursesException) { if (field) OnError(::free_field (field)); } /* Construct a FIELD* array from an array of NCursesFormField * objects. */ FIELD** NCursesForm::mapFields(NCursesFormField* nfields[]) { int fieldCount = 0,lcv; FIELD** old_fields; assert(nfields != 0); for (lcv=0; nfields[lcv]->field; ++lcv) ++fieldCount; FIELD** fields = new FIELD*[fieldCount + 1]; for (lcv=0;nfields[lcv]->field;++lcv) { fields[lcv] = nfields[lcv]->field; } fields[lcv] = NULL; my_fields = nfields; if (form && (old_fields = ::form_fields(form))) { ::set_form_fields(form, static_cast(0)); delete[] old_fields; } return fields; } void NCursesForm::setDefaultAttributes() { 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(); ncurses-6.4-20240113/c++/demo.cc0000644000000000000000000003502514472447406014261 0ustar rootroot// * 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 ncurses-6.4-20240113/c++/cursesmain.cc0000644000000000000000000000725613704652027015505 0ustar rootroot// * 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 } } ncurses-6.4-20240113/c++/internal.h0000644000000000000000000000604413722557601015006 0ustar rootroot// * 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 */ ncurses-6.4-20240113/c++/cursesapp.cc0000644000000000000000000001250213704652027015327 0ustar rootroot// * 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; } ncurses-6.4-20240113/c++/headers0000644000000000000000000000465513615656212014364 0ustar rootroot# 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 ncurses-6.4-20240113/c++/cursesf.h0000644000000000000000000006707014300244577014650 0ustar rootroot// * This makes emacs happy -*-Mode: C++;-*- // vile:cppmode /**************************************************************************** * Copyright 2019-2021,2022 Thomas E. Dickey * * Copyright 1998-2012,2014 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1997 * ****************************************************************************/ // $Id: cursesf.h,v 1.39 2022/08/20 20:52:15 tom Exp $ #ifndef NCURSES_CURSESF_H_incl #define NCURSES_CURSESF_H_incl 1 #include #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() { 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 */ ncurses-6.4-20240113/c++/cursslk.cc0000644000000000000000000001152714376515546015030 0ustar rootroot// * this is for making emacs happy: -*-Mode: C++;-*- /**************************************************************************** * Copyright 2019-2022,2023 Thomas E. Dickey * * Copyright 1998-2005,2012 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1997 * ****************************************************************************/ #include "internal.h" #include "cursslk.h" #include "cursesapp.h" MODULE_ID("$Id: cursslk.cc,v 1.21 2023/02/25 23:36:06 tom Exp $") Soft_Label_Key_Set::Soft_Label_Key& Soft_Label_Key_Set::Soft_Label_Key::operator=(char *text) { delete[] label; size_t need = 1 + ::strlen(text); label = new char[need]; ::_nc_STRCPY(label,text,need); return *this; } long Soft_Label_Key_Set::count = 0L; int Soft_Label_Key_Set::num_labels = 0; Soft_Label_Key_Set::Label_Layout Soft_Label_Key_Set::format = None; void Soft_Label_Key_Set::init() { if (num_labels > 12) num_labels = 12; 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) { NCursesApplication* A = NCursesApplication::getApplication(); if (A) attrset(A->labels()); b_attrInit = TRUE; } Soft_Label_Key& K = (*this)[i]; if (ERR==::slk_set(K.num,bf?K.label:"",K.format)) Error("slk_set"); noutrefresh(); } void Soft_Label_Key_Set::activate_labels(bool bf) { if (!b_attrInit) { NCursesApplication* A = NCursesApplication::getApplication(); if (A) attrset(A->labels()); b_attrInit = TRUE; } for(int i=1; i <= num_labels; i++) { Soft_Label_Key& K = (*this)[i]; if (ERR==::slk_set(K.num,bf?K.label:"",K.format)) Error("slk_set"); } if (bf) restore(); else clear(); noutrefresh(); } ncurses-6.4-20240113/c++/cursesp.h0000644000000000000000000002114214300244577014650 0ustar rootroot// * 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 */ ncurses-6.4-20240113/c++/etip.h.in0000644000000000000000000002365714300244370014536 0ustar rootroot// * 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 */ ncurses-6.4-20240113/c++/modules0000644000000000000000000000537713615656212014423 0ustar rootroot# Program modules # $Id: modules,v 1.12 2020/02/02 23:34:34 tom Exp $ ############################################################################## # Copyright 2020 Thomas E. Dickey # # Copyright 1998-2006,2013 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1995-on # @ base cursesf c++ $(srcdir) $(internal_h) $(cursesf_h) $(cursesapp_h) cursesm c++ $(srcdir) $(internal_h) $(cursesm_h) $(cursesapp_h) cursesw c++ $(srcdir) $(internal_h) $(cursesw_h) cursespad c++ $(srcdir) $(internal_h) $(cursesw_h) cursesp c++ $(srcdir) $(internal_h) $(cursesp_h) cursslk c++ $(srcdir) $(internal_h) $(cursesapp_h) cursesapp c++ $(srcdir) $(internal_h) $(cursesapp_h) cursesmain c++ $(srcdir) $(internal_h) $(cursesapp_h) $(INCDIR)/nc_alloc.h # vile:makemode ncurses-6.4-20240113/c++/Makefile.in0000644000000000000000000002113014070131105015037 0ustar rootroot# $Id: Makefile.in,v 1.133 2021/07/03 18:53:57 tom Exp $ ############################################################################## # Copyright 2018-2020,2021 Thomas E. Dickey # # Copyright 1998-2015,2016 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey # # Simple makefile for c++ window class demo # turn off _all_ suffix rules; we'll generate our own .SUFFIXES: SHELL = @SHELL@ VPATH = @srcdir@ CF_MFLAGS = @cf_cv_makeflags@ @SET_MAKE@ x = @EXEEXT@ o = .@OBJEXT@ MODEL = ../@DFT_OBJ_SUBDIR@ DESTDIR = @DESTDIR@ top_srcdir = @top_srcdir@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ includesubdir = @includesubdir@ INCLUDEDIR = $(DESTDIR)$(includedir)$(includesubdir) PACKAGE = @PACKAGE@ LIBTOOL = @LIBTOOL_CXX@ LIBTOOL_OPTS = @LIBTOOL_OPTS@ @LIBTOOL_OPTS_CXX@ LIBTOOL_CLEAN = @LIB_CLEAN@ LIBTOOL_COMPILE = @LIB_COMPILE@ LIBTOOL_LINK = @LIB_LINK@ LIBTOOL_INSTALL = @LIB_INSTALL@ LIBTOOL_UNINSTALL = @LIB_UNINSTALL@ LIBTOOL_VERSION = @LIBTOOL_VERSION@ LT_UNDEF = @LT_UNDEF@ INSTALL = @INSTALL@ INSTALL_LIB = $(INSTALL) @INSTALL_LIB@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_OPT_P = @INSTALL_OPT_P@ AR = @AR@ ARFLAGS = @ARFLAGS@ AWK = @AWK@ LD = @LD@ LN_S = @LN_S@ CXX_AR = @CXX_AR@ CXX_ARFLAGS = @CXX_ARFLAGS@ RANLIB = @LIB_PREP@ CXX = @CXX@ CPP = @CXXCPP@ CXXFLAGS = @CXXFLAGS@ @EXTRA_CXXFLAGS@ CXXLIBS = @CXXLIBS@ INCDIR = ../include CPPFLAGS = -DHAVE_CONFIG_H -DBUILDING_NCURSES_CXX -I../c++ @CPPFLAGS@ CTAGS = @CTAGS@ ETAGS = @ETAGS@ CC = ${CXX} CCFLAGS = $(CPPFLAGS) $(CXXFLAGS) CFLAGS_LIBTOOL = $(CCFLAGS) CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CXX_G_OPT@ -DTRACE CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) NCURSES_MAJOR = @NCURSES_MAJOR@ NCURSES_MINOR = @NCURSES_MINOR@ REL_VERSION = @cf_cv_rel_version@ ABI_VERSION = @cf_cv_abi_version@ LOCAL_LIBDIR = @top_builddir@/lib LINK = @LINK_PROGS@ $(LIBTOOL_LINK) @CXXLDFLAGS@ SHLIB_DIRS = -L../lib SHLIB_LIST = $(SHLIB_DIRS) \ -l@FORM_NAME@@USE_LIB_SUFFIX@ \ -l@MENU_NAME@@USE_LIB_SUFFIX@ \ -l@PANEL_NAME@@USE_LIB_SUFFIX@ \ -lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@ LIBROOT = ncurses++ LIBNAME_LIBTOOL = @LIB_PREFIX@$(LIBROOT)@USE_LIB_SUFFIX@.la LIBNAME_NORMAL = @LIB_PREFIX@$(LIBROOT)@USE_LIB_SUFFIX@.a LIBNAME = @LIB_PREFIX@$(LIBROOT)@CXX_LIB_SUFFIX@ LIBRARIES = @Libs_To_Make@ LINT = @LINT@ LINT_OPTS = @LINT_OPTS@ LINT_LIBS = -lncurses @LIBS@ LINK_FLAGS = @EXTRA_LDFLAGS@ -L../lib -l$(LIBROOT)@USE_LIB_SUFFIX@ RPATH_LIST = @RPATH_LIST@ MK_SHARED_LIB = @MK_SHARED_LIB@ LINK_LIBTOOL = @EXTRA_LDFLAGS@ -L../lib $(LIBRARIES) LINK_NORMAL = $(LINK_FLAGS) LINK_DEBUG = $(LINK_FLAGS) LINK_PROFILE = $(LINK_FLAGS) LINK_SHARED = $(LINK_FLAGS) # flags for test-programs TEST_LIBS = @TEST_LIBS@ TEST_ARGS = @LDFLAGS_STATIC@ @TEST_ARGS@ @LDFLAGS_SHARED@ TEST_LDFLAGS = $(TEST_ARGS) @LDFLAGS@ \ @LD_MODEL@ $(TEST_LIBS) @LIBS@ @LOCAL_LDFLAGS@ $(CXXLIBS) LDFLAGS_LIBTOOL = $(TEST_LDFLAGS) $(CFLAGS_LIBTOOL) LDFLAGS_NORMAL = $(TEST_LDFLAGS) $(CFLAGS_NORMAL) LDFLAGS_DEBUG = $(TEST_LDFLAGS) $(CFLAGS_DEBUG) LDFLAGS_PROFILE = $(TEST_LDFLAGS) $(CFLAGS_PROFILE) LDFLAGS_SHARED = $(TEST_LDFLAGS) $(CFLAGS_SHARED) @LD_SHARED_OPTS@ LDFLAGS_DEFAULT = $(LINK_@DFT_UPR_MODEL@) $(LDFLAGS_@DFT_UPR_MODEL@) # flags for library built by this makefile LDFLAGS = $(TEST_ARGS) @LDFLAGS@ \ @LD_MODEL@ $(TEST_LIBS) @LIBS@ $(CXXLIBS) AUTO_SRC = \ etip.h ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : check @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : depend @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.libs @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.libs all \ libs :: $(AUTO_SRC) $(LIBRARIES) @MAKE_TESTS@all :: demo$x depend : sources : $(AUTO_SRC) tags: $(CTAGS) *.[h] *.cc $(DESTDIR)$(libdir) : mkdir -p $@ mostlyclean :: -rm -f core tags TAGS *~ *.bak *.i *.ii *.ln *.atac trace clean :: mostlyclean -$(SHELL) -c "if test -n '$x' ; then $(MAKE) clean x=''; fi" -rm -rf $(MODEL)/SunWS_cache -$(LIBTOOL_CLEAN) rm -f demo$x $(AUTO_SRC) $(LIBRARIES) $(OBJS_DEMO) -rm -rf .libs *.dSYM distclean :: clean -rm -f Makefile realclean :: distclean ############################################################################### HEADER_DEPS = @INTERNALS_HDR@ \ etip.h \ ../include/curses.h \ ../include/eti.h \ ../include/form.h \ ../include/menu.h \ ../include/ncurses_cfg.h \ ../include/ncurses_def.h \ ../include/ncurses_dll.h \ ../include/panel.h \ ../include/unctrl.h \ $(INCDIR)/nc_string.h \ $(srcdir)/cursesp.h \ $(srcdir)/cursesw.h \ $(srcdir)/cursslk.h \ $(srcdir)/internal.h cursesw_h = $(srcdir)/cursesw.h \ $(HEADER_DEPS) cursesp_h = $(srcdir)/cursesp.h \ $(cursesw_h) cursesf_h = $(srcdir)/cursesf.h \ $(cursesp_h) cursesm_h = $(srcdir)/cursesm.h \ $(cursesp_h) cursslk_h = $(srcdir)/cursslk.h \ $(cursesw_h) cursesapp_h = $(srcdir)/cursesapp.h \ $(cursslk_h) $(INCDIR)/form.h : ( cd ../form && $(MAKE) $@ ) $(INCDIR)/menu.h : ( cd ../menu && $(MAKE) $@ ) $(INCDIR)/panel.h : ( cd ../panel && $(MAKE) $@ ) ############################################################################### OBJS_DEMO = $(MODEL)/demo$o $(MODEL)/demo$o : $(srcdir)/demo.cc \ $(HEADER_DEPS) \ $(cursesf_h) \ $(cursesm_h) \ $(cursesapp_h) @echo 'compiling demo (obj_s)' @( cd $(MODEL) && $(LIBTOOL_COMPILE) $(CXX) $(CFLAGS_DEFAULT) -c $(top_srcdir)/c++/demo.cc -o $@ ) demo$x: $(OBJS_DEMO) \ $(LIBRARIES) \ @TEST_DEPS@ @ECHO_LD@ $(LINK) -o $@ $(OBJS_DEMO) $(LDFLAGS_DEFAULT) etip.h: $(srcdir)/etip.h.in $(srcdir)/edit_cfg.sh cp $(srcdir)/etip.h.in $@ $(SHELL) $(srcdir)/edit_cfg.sh ../include/ncurses_cfg.h $@ # Verify that each header-file can be compiled without including another. check :: @$(SHELL) -c "for header in *.h;\ do \ [ \$${header} = etip.h ] && continue; \ echo \"** testing \$${header}\" ; \ echo \"#include <\$${header}>\" >headers.cc; \ echo \"int main(int argc, char **argv) { (void) argc; (void) argv; return 0; }\" >>headers.cc; \ $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) headers.cc; \ done" -@rm -f headers.* ############################################################################### # The remainder of this file is automatically generated during configuration ############################################################################### ncurses-6.4-20240113/c++/cursslk.h0000644000000000000000000001623114036622274014655 0ustar rootroot// * this is for making emacs happy: -*-Mode: C++;-*- // vile:cppmode /**************************************************************************** * Copyright 2019-2020,2021 Thomas E. Dickey * * Copyright 1998-2003,2005 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1997 * ****************************************************************************/ // $Id: cursslk.h,v 1.19 2021/04/17 18:11:08 tom Exp $ #ifndef NCURSES_CURSSLK_H_incl #define NCURSES_CURSSLK_H_incl #include class NCURSES_CXX_IMPEXP Soft_Label_Key_Set { public: // This inner class represents the attributes of a Soft Label Key (SLK) class NCURSES_CXX_IMPEXP Soft_Label_Key { friend class Soft_Label_Key_Set; public: typedef enum { Left=0, Center=1, Right=2 } Justification; private: char *label; // The Text of the Label Justification format; // The Justification int num; // The number of the Label Soft_Label_Key() : label(NULL), format(Left), num(-1) { } virtual ~Soft_Label_Key() { delete[] label; }; public: // Set the text of the Label Soft_Label_Key& operator=(char *text); // Set the Justification of the Label Soft_Label_Key& operator=(Justification just) { format = just; return *this; } // Retrieve the text of the label inline char* operator()(void) const { return label; } Soft_Label_Key& operator=(const Soft_Label_Key& rhs) { if (this != &rhs) { *this = rhs; } return *this; } Soft_Label_Key(const Soft_Label_Key& rhs) : label(NULL), format(rhs.format), num(rhs.num) { *this = rhs.label; } }; public: typedef enum { None = -1, Three_Two_Three = 0, Four_Four = 1, PC_Style = 2, PC_Style_With_Index = 3 } Label_Layout; private: static long count; // Number of Key Sets static Label_Layout format; // Layout of the Key Sets static int num_labels; // Number Of Labels in Key Sets bool b_attrInit; // Are attributes initialized Soft_Label_Key *slk_array; // The array of SLK's // Init the Key Set void init(); // Activate or Deactivate Label# i, Label counting starts with 1! void activate_label(int i, bool bf=TRUE); // Activate of Deactivate all Labels void activate_labels(bool bf); protected: inline void Error (const char* msg) const THROWS(NCursesException) { THROW(new NCursesException (msg)); } // Remove SLK's from screen void clear() { if (ERR==::slk_clear()) Error("slk_clear"); } // Restore them void restore() { if (ERR==::slk_restore()) Error("slk_restore"); } public: // Construct a Key Set, use the most comfortable layout as default. // You must create a Soft_Label_Key_Set before you create any object of // the NCursesWindow, NCursesPanel or derived classes. (Actually before // ::initscr() is called). explicit Soft_Label_Key_Set(Label_Layout fmt); // This constructor assumes, that you already constructed a Key Set // with a layout by the constructor above. This layout will be reused. Soft_Label_Key_Set(); Soft_Label_Key_Set& operator=(const Soft_Label_Key_Set& rhs) { if (this != &rhs) { *this = rhs; init(); // allocate a new slk_array[] } return *this; } Soft_Label_Key_Set(const Soft_Label_Key_Set& rhs) : b_attrInit(rhs.b_attrInit), slk_array(NULL) { init(); // allocate a new slk_array[] } virtual ~Soft_Label_Key_Set() THROWS(NCursesException); // Get Label# i. Label counting starts with 1! Soft_Label_Key& operator[](int i); // Retrieve number of Labels int labels() const; // Refresh the SLK portion of the screen inline void refresh() { if (ERR==::slk_refresh()) Error("slk_refresh"); } // Mark the SLK portion of the screen for refresh, defer actual refresh // until next update call. inline void noutrefresh() { if (ERR==::slk_noutrefresh()) Error("slk_noutrefresh"); } // Mark the whole SLK portion of the screen as modified inline void touch() { if (ERR==::slk_touch()) Error("slk_touch"); } // Activate Label# i inline void show(int i) { activate_label(i,FALSE); activate_label(i,TRUE); } // Hide Label# i inline void hide(int i) { activate_label(i,FALSE); } // Show all Labels inline void show() { activate_labels(FALSE); activate_labels(TRUE); } // Hide all Labels inline void hide() { activate_labels(FALSE); } inline void attron(attr_t attrs) { if (ERR==::slk_attron(attrs)) Error("slk_attron"); } inline void attroff(attr_t attrs) { if (ERR==::slk_attroff(attrs)) Error("slk_attroff"); } inline void attrset(attr_t attrs) { if (ERR==::slk_attrset(attrs)) Error("slk_attrset"); } inline void color(short color_pair_number) { if (ERR==::slk_color(color_pair_number)) Error("slk_color"); } inline attr_t attr() const { return ::slk_attr(); } }; #endif /* NCURSES_CURSSLK_H_incl */ ncurses-6.4-20240113/c++/cursesm.h0000644000000000000000000004677214300244577014665 0ustar rootroot// * This makes emacs happy -*-Mode: C++;-*- /**************************************************************************** * Copyright 2019-2020,2022 Thomas E. Dickey * * Copyright 1998-2012,2014 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1997 * ****************************************************************************/ // $Id: cursesm.h,v 1.35 2022/08/20 20:52:15 tom Exp $ #ifndef NCURSES_CURSESM_H_incl #define NCURSES_CURSESM_H_incl 1 #include 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() { 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 */ ncurses-6.4-20240113/c++/cursesw.cc0000644000000000000000000002573313615656212015030 0ustar rootroot// * 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 ncurses-6.4-20240113/c++/cursesapp.h0000644000000000000000000001607114062736752015204 0ustar rootroot// * 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 */ ncurses-6.4-20240113/c++/cursespad.cc0000644000000000000000000001734413615656212015325 0ustar rootroot// * this is for making emacs happy: -*-Mode: C++;-*- /**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 1999-2012,2013 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1999 * ****************************************************************************/ #include "internal.h" #include MODULE_ID("$Id: cursespad.cc,v 1.18 2020/02/02 23:34:34 tom Exp $") NCursesPad::NCursesPad(int nlines, int ncols) : NCursesWindow(), viewWin(static_cast(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; 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); } } ncurses-6.4-20240113/c++/NEWS0000644000000000000000000001042514062736236013517 0ustar rootroot------------------------------------------------------------------------------- -- 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. ncurses-6.4-20240113/c++/cursesm.cc0000644000000000000000000002375214036622274015014 0ustar rootroot// * this is for making emacs happy: -*-Mode: C++;-*- /**************************************************************************** * Copyright 2019-2020,2021 Thomas E. Dickey * * Copyright 1998-2011,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1997 * ****************************************************************************/ #include "internal.h" #include "cursesm.h" #include "cursesapp.h" MODULE_ID("$Id: cursesm.cc,v 1.27 2021/04/17 18:11:08 tom Exp $") NCursesMenuItem::~NCursesMenuItem() THROWS(NCursesException) { if (item) OnError(::free_item(item)); } bool NCursesMenuItem::action() { return FALSE; } NCursesMenuCallbackItem::~NCursesMenuCallbackItem() THROWS(NCursesException) { } bool NCursesMenuCallbackItem::action() { if (p_fct) return p_fct (*this); else return FALSE; } /* Internal hook functions. They will route the hook * calls to virtual methods of the NCursesMenu class, * so in C++ providing a hook is done simply by * implementing a virtual method in a derived class */ void _nc_xx_mnu_init(MENU *m) { NCursesMenu::getHook(m)->On_Menu_Init(); } void _nc_xx_mnu_term(MENU *m) { NCursesMenu::getHook(m)->On_Menu_Termination(); } void _nc_xx_itm_init(MENU *m) { NCursesMenu* M = NCursesMenu::getHook(m); M->On_Item_Init (*(M->current_item ())); } void _nc_xx_itm_term(MENU *m) { NCursesMenu* M = NCursesMenu::getHook(m); M->On_Item_Termination (*(M->current_item ())); } /* Construct an ITEM* array from an array of NCursesMenuItem * objects. */ ITEM** NCursesMenu::mapItems(NCursesMenuItem* nitems[]) { int itemCount = 0,lcv; for (lcv=0; nitems[lcv]->item; ++lcv) ++itemCount; ITEM** itemArray = new ITEM*[itemCount + 1]; for (lcv=0;nitems[lcv]->item;++lcv) { itemArray[lcv] = nitems[lcv]->item; } itemArray[lcv] = NULL; my_items = nitems; if (menu) delete[] ::menu_items(menu); return itemArray; } void NCursesMenu::InitMenu(NCursesMenuItem* nitems[], bool with_frame, bool autoDelete_Items) { int mrows, mcols; keypad(TRUE); meta(TRUE); b_framed = with_frame; b_autoDelete = autoDelete_Items; menu = static_cast(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() { 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(); } ncurses-6.4-20240113/c++/README-first0000644000000000000000000001133714062736236015030 0ustar rootroot------------------------------------------------------------------------------- -- 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 ncurses-6.4-20240113/c++/cursesp.cc0000644000000000000000000001017413615656212015012 0ustar rootroot// * this is for making emacs happy: -*-Mode: C++;-*- /**************************************************************************** * Copyright 2019,2020 Thomas E. Dickey * * Copyright 1998-2003,2005 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1993, 1997 * ****************************************************************************/ #include "internal.h" #include "cursesp.h" MODULE_ID("$Id: cursesp.cc,v 1.27 2020/02/02 23:34:34 tom Exp $") NCursesPanel* NCursesPanel::dummy = static_cast(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() { 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(); } ncurses-6.4-20240113/c++/PROBLEMS0000644000000000000000000000470513615656212014170 0ustar rootroot------------------------------------------------------------------------------- -- 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 ncurses-6.4-20240113/c++/edit_cfg.sh0000755000000000000000000000607714264576333015137 0ustar rootroot#!/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 ncurses-6.4-20240113/c++/cursesw.h0000644000000000000000000014232714300244577014670 0ustar rootroot// * 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 */ ncurses-6.4-20240113/mk-2nd.awk0000644000000000000000000001261314062736236014245 0ustar rootroot# $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 "" } ncurses-6.4-20240113/form/0000755000000000000000000000000014114006751013377 5ustar rootrootncurses-6.4-20240113/form/READ.ME0000644000000000000000000000530614062736236014353 0ustar rootroot------------------------------------------------------------------------------- -- 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 ncurses-6.4-20240113/form/llib-lform0000644000000000000000000003675414062736236015412 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/form/fld_opts.c0000644000000000000000000001372014062736236015372 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fld_just.c0000644000000000000000000000766014062736236015400 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/llib-lformt0000644000000000000000000003675414062736236015576 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/form/frm_scale.c0000644000000000000000000000650314062736236015514 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/f_trace.c0000644000000000000000000000606013662350204015152 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/form/fty_alnum.c0000644000000000000000000001611713765014671015562 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/frm_post.c0000644000000000000000000001165113662350204015402 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 1998-2010,2012 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1995,1997 * ****************************************************************************/ #include "form.priv.h" MODULE_ID("$Id: frm_post.c,v 1.14 2020/05/24 01:40:20 anonymous.maarten Exp $") /*--------------------------------------------------------------------------- | Facility : libnform | Function : int post_form(FORM * form) | | Description : Writes the form into its associated subwindow. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid form pointer | E_POSTED - form already posted | E_NOT_CONNECTED - no fields connected to form | E_NO_ROOM - form doesn't fit into subwindow | E_SYSTEM_ERROR - system error +--------------------------------------------------------------------------*/ FORM_EXPORT(int) post_form(FORM *form) { WINDOW *formwin; int err; int page; T((T_CALLED("post_form(%p)"), (void *)form)); if (!form) RETURN(E_BAD_ARGUMENT); if (form->status & _POSTED) RETURN(E_POSTED); if (!(form->field)) RETURN(E_NOT_CONNECTED); formwin = Get_Form_Window(form); if ((form->cols > getmaxx(formwin)) || (form->rows > getmaxy(formwin))) RETURN(E_NO_ROOM); /* reset form->curpage to an invalid value. This forces Set_Form_Page to do the page initialization which is required by post_form. */ page = form->curpage; form->curpage = -1; if ((err = _nc_Set_Form_Page(form, page, form->current)) != E_OK) RETURN(err); SetStatus(form, _POSTED); Call_Hook(form, forminit); Call_Hook(form, fieldinit); _nc_Refresh_Current_Field(form); RETURN(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : int unpost_form(FORM * form) | | Description : Erase form from its associated subwindow. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid form pointer | E_NOT_POSTED - form isn't posted | E_BAD_STATE - called from a hook routine +--------------------------------------------------------------------------*/ FORM_EXPORT(int) unpost_form(FORM *form) { T((T_CALLED("unpost_form(%p)"), (void *)form)); if (!form) RETURN(E_BAD_ARGUMENT); if (!(form->status & _POSTED)) RETURN(E_NOT_POSTED); if (form->status & _IN_DRIVER) RETURN(E_BAD_STATE); Call_Hook(form, fieldterm); Call_Hook(form, formterm); werase(Get_Form_Window(form)); delwin(form->w); form->w = (WINDOW *)0; ClrStatus(form, _POSTED); RETURN(E_OK); } /* frm_post.c ends here */ ncurses-6.4-20240113/form/frm_hook.c0000644000000000000000000001554213662350204015360 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fld_ftchoice.c0000644000000000000000000000727514062736752016204 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/frm_req_name.c0000644000000000000000000001377114062735154016217 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fld_arg.c0000644000000000000000000001171113764766444015170 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/form.h0000644000000000000000000004472314062736752014542 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/frm_user.c0000644000000000000000000000735714062736236015413 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/frm_opts.c0000644000000000000000000001250114062736236015405 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/headers0000644000000000000000000000437413615656212014755 0ustar rootroot############################################################################## # 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 ncurses-6.4-20240113/form/fld_stat.c0000644000000000000000000000747614062736236015373 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fld_pad.c0000644000000000000000000000753114062736236015154 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fty_enum.c0000644000000000000000000003074714062735154015414 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2009,2010 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /*************************************************************************** * * * Author : Juergen Pfeifer * * * ***************************************************************************/ #include "form.priv.h" MODULE_ID("$Id: fty_enum.c,v 1.33 2021/06/17 21:11:08 tom Exp $") typedef struct { char **kwds; int count; bool checkcase; bool checkunique; } enumARG; typedef struct { char **kwds; int ccase; int cunique; } enumParams; /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void *Generic_Enum_Type(void * arg) | | Description : Allocate structure for enumeration type argument. | | Return Values : Pointer to argument structure or NULL on error +--------------------------------------------------------------------------*/ static void * Generic_Enum_Type(void *arg) { enumARG *argp = (enumARG *)0; enumParams *params = (enumParams *)arg; if (params) { argp = typeMalloc(enumARG, 1); if (argp) { int cnt = 0; char **kp = (char **)0; char **kwds = (char **)0; int ccase, cunique; T((T_CREATE("enumARG %p"), (void *)argp)); kwds = params->kwds; ccase = params->ccase; cunique = params->cunique; argp->checkcase = ccase ? TRUE : FALSE; argp->checkunique = cunique ? TRUE : FALSE; argp->kwds = (char **)0; kp = kwds; while (kp && (*kp++)) cnt++; argp->count = cnt; if (cnt > 0) { char **kptarget; /* We copy the keywords, because we can't rely on the fact that the caller doesn't relocate or free the memory used for the keywords (maybe he has GC) */ argp->kwds = typeMalloc(char *, cnt + 1); kp = kwds; if ((kptarget = argp->kwds) != 0) { while (kp && (*kp)) { (*kptarget++) = strdup(*kp++); } *kptarget = (char *)0; } } } } return (void *)argp; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void *Make_Enum_Type( va_list * ap ) | | Description : Allocate structure for enumeration type argument. | | Return Values : Pointer to argument structure or NULL on error +--------------------------------------------------------------------------*/ static void * Make_Enum_Type(va_list *ap) { enumParams params; params.kwds = va_arg(*ap, char **); params.ccase = va_arg(*ap, int); params.cunique = va_arg(*ap, int); return Generic_Enum_Type((void *)¶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; unsigned char *bp = (unsigned char *)field_buffer(field, 0); char *s, *t, *p; while (kwds && (s = (*kwds++))) { int res; if ((res = Compare((unsigned char *)s, bp, ccase)) != NOMATCH) { p = t = s; /* t is at least a partial match */ if ((unique && res != EXACT)) { while (kwds && (p = *kwds++)) { if ((res = Compare((unsigned char *)p, bp, ccase)) != NOMATCH) { if (res == EXACT) { t = p; break; } else t = (char *)0; } } } if (t) { set_field_buffer(field, 0, t); return TRUE; } if (!p) break; } } return FALSE; } static const char *dummy[] = {(char *)0}; /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Next_Enum(FIELD * field, | const void * argp) | | Description : Check for the next enumeration value | | Return Values : TRUE - next value found and loaded | FALSE - no next value loaded +--------------------------------------------------------------------------*/ static bool Next_Enum(FIELD *field, const void *argp) { const enumARG *args = (const enumARG *)argp; char **kwds = args->kwds; bool ccase = args->checkcase; int cnt = args->count; unsigned char *bp = (unsigned char *)field_buffer(field, 0); if (kwds) { while (cnt--) { if (Compare((unsigned char *)(*kwds++), bp, ccase) == EXACT) break; } if (cnt <= 0) kwds = args->kwds; if ((cnt >= 0) || (Compare((const unsigned char *)dummy, bp, ccase) == EXACT)) { set_field_buffer(field, 0, *kwds); return TRUE; } } return FALSE; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Previous_Enum( | FIELD * field, | const void * argp) | | Description : Check for the previous enumeration value | | Return Values : TRUE - previous value found and loaded | FALSE - no previous value loaded +--------------------------------------------------------------------------*/ static bool Previous_Enum(FIELD *field, const void *argp) { const enumARG *args = (const enumARG *)argp; int cnt = args->count; char **kwds = &args->kwds[cnt - 1]; bool ccase = args->checkcase; unsigned char *bp = (unsigned char *)field_buffer(field, 0); if (kwds) { while (cnt--) { if (Compare((unsigned char *)(*kwds--), bp, ccase) == EXACT) break; } if (cnt <= 0) kwds = &args->kwds[args->count - 1]; if ((cnt >= 0) || (Compare((const unsigned char *)dummy, bp, ccase) == EXACT)) { set_field_buffer(field, 0, *kwds); return TRUE; } } return FALSE; } static FIELDTYPE typeENUM = { _HAS_ARGS | _HAS_CHOICE | _RESIDENT, 1, /* this is mutable, so we can't be const */ (FIELDTYPE *)0, (FIELDTYPE *)0, Make_Enum_Type, Copy_Enum_Type, Free_Enum_Type, INIT_FT_FUNC(Check_Enum_Field), INIT_FT_FUNC(NULL), INIT_FT_FUNC(Next_Enum), INIT_FT_FUNC(Previous_Enum), #if NCURSES_INTEROP_FUNCS Generic_Enum_Type #endif }; FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ENUM = &typeENUM; #if NCURSES_INTEROP_FUNCS /* The next routines are to simplify the use of ncurses from programming languages with restrictions on interop with C level constructs (e.g. variable access or va_list + ellipsis constructs) */ FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ENUM(void) { return TYPE_ENUM; } #endif /* fty_enum.c ends here */ ncurses-6.4-20240113/form/frm_page.c0000644000000000000000000001065414062736236015343 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fty_generic.c0000644000000000000000000002602714027742241016054 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2021 Thomas E. Dickey * * Copyright 2008-2012,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /*************************************************************************** * * * Author : Juergen Pfeifer * * * ***************************************************************************/ #include "form.priv.h" MODULE_ID("$Id: fty_generic.c,v 1.15 2021/03/27 23:49:53 tom Exp $") /* * This is not a full implementation of a field type, but adds some * support for higher level languages with some restrictions to interop * with C language. In particular, the collection of arguments for the * various fieldtypes is not based on the vararg C mechanism, but on a * iterator based callback mechanism that allows the high level language * to provide the arguments as a structure. Most languages have mechanisms * to layout structures so that they can be passed to C. * * The languages can register a new generic fieldtype dynamically and store * a handle (key) to the calling object as an argument. Together with that * it can register a freearg callback, so that the high level language * remains in control of the memory management of the arguments they pass. * The design idea is, that the high-level language - typically a OO * language like C# or Java, uses its own dispatching mechanisms * (polymorphism) to call the proper check routines responsible for the * argument type. So these language implement typically only one generic * fieldtype they register with the forms library using this call. * * For that purpose we have extended the fieldtype structure by a new element * that gets the arguments from a single struct passed by the caller. * */ #if NCURSES_INTEROP_FUNCS /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void *Generic_This_Type( void * arg ) | | Description : We interpret the passed arg just as a handle the | calling language uses to keep track of its allocated | argument structures. We can simply copy it back. | | Return Values : Pointer to argument structure +--------------------------------------------------------------------------*/ static void * Generic_This_Type(void *arg) { return (arg); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : FIELDTYPE *_nc_generic_fieldtype( | bool (* const field_check)(FIELD *,const void *), | bool (* const char_check) (int, const void *), | bool (*const next)(FORM*,FIELD*,const void*), | bool (*const prev)(FORM*,FIELD*,const void*), | void (*freecallback)(void*)) | | Description : Create a new fieldtype. The application programmer must | write a field_check and a char_check function and give | them as input to this call. A callback to allow the | release of the allocated memory must also be provided. | For generic field types, we provide some more | information about the field as parameters. | | If an error occurs, errno is set to | E_BAD_ARGUMENT - invalid arguments | E_SYSTEM_ERROR - system error (no memory) | | Return Values : Fieldtype pointer or NULL if error occurred +--------------------------------------------------------------------------*/ FORM_EXPORT(FIELDTYPE *) _nc_generic_fieldtype(bool (*const field_check) (FORM *, FIELD *, const void *), bool (*const char_check) (int, FORM *, FIELD *, const void *), bool (*const next) (FORM *, FIELD *, const void *), bool (*const prev) (FORM *, FIELD *, const void *), void (*freecallback) (void *)) { int code = E_SYSTEM_ERROR; FIELDTYPE *res = (FIELDTYPE *)0; TR_FUNC_BFR(5); T((T_CALLED("_nc_generic_fieldtype(%s,%s,%s,%s,%s)"), TR_FUNC_ARG(0, field_check), TR_FUNC_ARG(1, char_check), TR_FUNC_ARG(2, next), TR_FUNC_ARG(3, prev), TR_FUNC_ARG(4, freecallback))); if (field_check || char_check) { res = typeMalloc(FIELDTYPE, 1); if (res) { *res = *_nc_Default_FieldType; SetStatus(res, (_HAS_ARGS | _GENERIC)); res->fieldcheck.gfcheck = field_check; res->charcheck.gccheck = char_check; res->genericarg = Generic_This_Type; res->freearg = freecallback; res->enum_next.gnext = next; res->enum_prev.gprev = prev; code = E_OK; } } else code = E_BAD_ARGUMENT; if (E_OK != code) SET_ERROR(code); returnFieldType(res); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static TypeArgument *GenericArgument( | const FIELDTYPE* typ, | int (*argiterator)(void**), | int* err) | | Description : The iterator callback must browse through all fieldtype | parameters that have an argument associated with the | type. The iterator returns 1 if the operation to get | the next element was successful, 0 otherwise. If the | iterator could move to the next argument, it fills | the void* pointer representing the argument into the | location provided as argument to the iterator. | The err reference is used to keep track of errors. | | Return Values : Pointer to argument structure +--------------------------------------------------------------------------*/ static TypeArgument * GenericArgument(const FIELDTYPE *typ, int (*argiterator) (void **), int *err) { TypeArgument *res = (TypeArgument *)0; if (typ != 0 && (typ->status & _HAS_ARGS) != 0 && err != 0 && argiterator != 0) { if (typ->status & _LINKED_TYPE) { /* Composite fieldtypes keep track internally of their own memory */ TypeArgument *p = typeMalloc(TypeArgument, 1); if (p) { p->left = GenericArgument(typ->left, argiterator, err); p->right = GenericArgument(typ->right, argiterator, err); return p; } else *err += 1; } else { assert(typ->genericarg != (void *)0); if (typ->genericarg == 0) *err += 1; else { void *argp; int valid = argiterator(&argp); if (valid == 0 || argp == 0 || !(res = (TypeArgument *)typ->genericarg(argp))) { *err += 1; } } } } return res; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : int _nc_set_generic_fieldtype( | FIELD* field, | FIELDTYPE* ftyp, | int (*argiterator)(void**)) | | Description : Assign the fieldtype to the field and use the iterator | mechanism to get the arguments when a check is | performed. | | Return Values : E_OK if all went well | E_SYSTEM_ERROR if an error occurred +--------------------------------------------------------------------------*/ FORM_EXPORT(int) _nc_set_generic_fieldtype(FIELD *field, FIELDTYPE *ftyp, int (*argiterator) (void **)) { int code = E_SYSTEM_ERROR; int err = 0; if (field) { if (field && field->type) _nc_Free_Type(field); field->type = ftyp; if (ftyp) { if (argiterator) { /* The precondition is that the iterator is reset */ field->arg = (void *)GenericArgument(field->type, argiterator, &err); if (err) { _nc_Free_Argument(field->type, (TypeArgument *)(field->arg)); field->type = (FIELDTYPE *)0; field->arg = (void *)0; } else { code = E_OK; if (field->type) field->type->ref++; } } } else { field->arg = (void *)0; code = E_OK; } } return code; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : WINDOW* _nc_form_cursor( | FORM* form, | int *pRow, int *pCol) | | Description : Get the current position of the form cursor position | We also return the field window | | Return Values : The field's Window or NULL on error +--------------------------------------------------------------------------*/ FORM_EXPORT(WINDOW *) _nc_form_cursor(const FORM *form, int *pRow, int *pCol) { int code = E_SYSTEM_ERROR; WINDOW *res = (WINDOW *)0; if (form != 0 && pRow != 0 && pCol != 0) { *pRow = form->currow; *pCol = form->curcol; res = form->w; code = E_OK; } if (code != E_OK) SET_ERROR(code); return res; } #else extern void _nc_fty_generic(void); void _nc_fty_generic(void) { } #endif /* fty_generic.c ends here */ ncurses-6.4-20240113/form/fld_max.c0000644000000000000000000000760614062736752015203 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/llib-lformtw0000644000000000000000000003731214062736236015754 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/form/fld_attr.c0000644000000000000000000001267213764766444015400 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/frm_data.c0000644000000000000000000001437114062735154015336 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2010,2013 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1995,1997 * ****************************************************************************/ #include "form.priv.h" MODULE_ID("$Id: frm_data.c,v 1.21 2021/06/17 21:11:08 tom Exp $") /*--------------------------------------------------------------------------- | Facility : libnform | Function : bool data_behind(const FORM *form) | | Description : Check for off-screen data behind. This is nearly trivial | because the beginning of a field is fixed. | | Return Values : TRUE - there are off-screen data behind | FALSE - there are no off-screen data behind +--------------------------------------------------------------------------*/ FORM_EXPORT(bool) data_behind(const FORM *form) { bool result = FALSE; T((T_CALLED("data_behind(%p)"), (const void *)form)); if (form && (form->status & _POSTED) && form->current) { FIELD *field; field = form->current; if (!Single_Line_Field(field)) { result = (form->toprow == 0) ? FALSE : TRUE; } else { result = (form->begincol == 0) ? FALSE : TRUE; } } returnBool(result); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static char * Only_Padding( | WINDOW *w, | int len, | int pad) | | Description : Test if 'length' cells starting at the current position | contain a padding character. | | Return Values : true if only padding cells are found +--------------------------------------------------------------------------*/ NCURSES_INLINE static bool Only_Padding(WINDOW *w, int len, int pad) { bool result = TRUE; int y, x, j; FIELD_CELL cell; getyx(w, y, x); for (j = 0; j < len; ++j) { if (wmove(w, y, x + j) != ERR) { #if USE_WIDEC_SUPPORT if (win_wch(w, &cell) != ERR) { if ((chtype)CharOf(cell) != ChCharOf(pad) || cell.chars[1] != 0) { result = FALSE; break; } } #else cell = (FIELD_CELL)winch(w); if (ChCharOf(cell) != ChCharOf(pad)) { result = FALSE; break; } #endif } else { /* if an error, return true: no non-padding text found */ break; } } /* no need to reset the cursor position; caller does this */ return result; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : bool data_ahead(const FORM *form) | | Description : Check for off-screen data ahead. This is more difficult | because a dynamic field has a variable end. | | Return Values : TRUE - there are off-screen data ahead | FALSE - there are no off-screen data ahead +--------------------------------------------------------------------------*/ FORM_EXPORT(bool) data_ahead(const FORM *form) { bool result = FALSE; T((T_CALLED("data_ahead(%p)"), (const void *)form)); if (form && (form->status & _POSTED) && form->current) { FIELD *field; bool cursor_moved = FALSE; int pos; field = form->current; assert(form->w); if (Single_Line_Field(field)) { pos = form->begincol + field->cols; while (pos < field->dcols) { int check_len = field->dcols - pos; if (check_len >= field->cols) check_len = field->cols; cursor_moved = TRUE; wmove(form->w, 0, pos); if (Only_Padding(form->w, check_len, field->pad)) pos += field->cols; else { result = TRUE; break; } } } else { pos = form->toprow + field->rows; while (pos < field->drows) { cursor_moved = TRUE; wmove(form->w, pos, 0); pos++; if (!Only_Padding(form->w, field->cols, field->pad)) { result = TRUE; break; } } } if (cursor_moved) wmove(form->w, form->currow, form->curcol); } returnBool(result); } /* frm_data.c ends here */ ncurses-6.4-20240113/form/fty_int.c0000644000000000000000000002102414062735154015226 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2010,2012 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /*************************************************************************** * * * Author : Juergen Pfeifer * * * ***************************************************************************/ #include "form.priv.h" MODULE_ID("$Id: fty_int.c,v 1.33 2021/06/17 21:11:08 tom Exp $") #if USE_WIDEC_SUPPORT #define isDigit(c) (iswdigit((wint_t)(c)) || isdigit(UChar(c))) #else #define isDigit(c) isdigit(UChar(c)) #endif #define thisARG integerARG typedef struct { int precision; long low; long high; } thisARG; typedef struct { int precision; long low; long high; } integerPARM; /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void *Generic_This_Type( void * arg ) | | Description : Allocate structure for integer type argument. | | Return Values : Pointer to argument structure or NULL on error +--------------------------------------------------------------------------*/ static void * Generic_This_Type(void *arg) { thisARG *argp = (thisARG *)0; thisARG *param = (thisARG *)arg; if (param) { argp = typeMalloc(thisARG, 1); if (argp) { T((T_CREATE("thisARG %p"), (void *)argp)); *argp = *param; } } return (void *)argp; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void *Make_This_Type( va_list * ap ) | | Description : Allocate structure for integer type argument. | | Return Values : Pointer to argument structure or NULL on error +--------------------------------------------------------------------------*/ static void * Make_This_Type(va_list *ap) { thisARG arg; arg.precision = va_arg(*ap, int); arg.low = va_arg(*ap, long); arg.high = va_arg(*ap, long); return Generic_This_Type((void *)&arg); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void *Copy_This_Type(const void * argp) | | Description : Copy structure for integer type argument. | | Return Values : Pointer to argument structure or NULL on error. +--------------------------------------------------------------------------*/ static void * Copy_This_Type(const void *argp) { const thisARG *ap = (const thisARG *)argp; thisARG *result = (thisARG *)0; if (argp) { result = typeMalloc(thisARG, 1); if (result) { T((T_CREATE("thisARG %p"), (void *)result)); *result = *ap; } } return (void *)result; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void Free_This_Type(void * argp) | | Description : Free structure for integer type argument. | | Return Values : - +--------------------------------------------------------------------------*/ static void Free_This_Type(void *argp) { if (argp) free(argp); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Check_This_Field( | FIELD * field, | const void * argp) | | Description : Validate buffer content to be a valid integer value | | Return Values : TRUE - field is valid | FALSE - field is invalid +--------------------------------------------------------------------------*/ static bool Check_This_Field(FIELD *field, const void *argp) { const thisARG *argi = (const thisARG *)argp; long low = argi->low; long high = argi->high; int prec = argi->precision; unsigned char *bp = (unsigned char *)field_buffer(field, 0); char *s = (char *)bp; bool result = FALSE; while (*bp == ' ') bp++; if (*bp) { if (*bp == '-') bp++; #if USE_WIDEC_SUPPORT if (*bp) { int len; wchar_t *list = _nc_Widen_String((char *)bp, &len); if (list != 0) { bool blank = FALSE; int n; result = TRUE; for (n = 0; n < len; ++n) { if (blank) { if (list[n] != ' ') { result = FALSE; break; } } else if (list[n] == ' ') { blank = TRUE; } else if (!isDigit(list[n])) { result = FALSE; break; } } free(list); } } #else while (*bp) { if (!isdigit(UChar(*bp))) break; bp++; } while (*bp && *bp == ' ') bp++; result = (*bp == '\0'); #endif if (result) { long val = atol(s); if (low < high) { if (val < low || val > high) result = FALSE; } if (result) { char buf[100]; _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "%.*ld", (prec > 0 ? prec : 0), val); set_field_buffer(field, 0, buf); } } } return (result); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Check_This_Character( | int c, | const void * argp) | | Description : Check a character for the integer type. | | Return Values : TRUE - character is valid | FALSE - character is invalid +--------------------------------------------------------------------------*/ static bool Check_This_Character(int c, const void *argp GCC_UNUSED) { return ((isDigit(UChar(c)) || (c == '-')) ? TRUE : FALSE); } static FIELDTYPE typeTHIS = { _HAS_ARGS | _RESIDENT, 1, /* this is mutable, so we can't be const */ (FIELDTYPE *)0, (FIELDTYPE *)0, Make_This_Type, Copy_This_Type, Free_This_Type, INIT_FT_FUNC(Check_This_Field), INIT_FT_FUNC(Check_This_Character), INIT_FT_FUNC(NULL), INIT_FT_FUNC(NULL), #if NCURSES_INTEROP_FUNCS Generic_This_Type #endif }; FORM_EXPORT_VAR(FIELDTYPE *) TYPE_INTEGER = &typeTHIS; #if NCURSES_INTEROP_FUNCS /* The next routines are to simplify the use of ncurses from programming languages with restrictions on interop with C level constructs (e.g. variable access or va_list + ellipsis constructs) */ FORM_EXPORT(FIELDTYPE *) _nc_TYPE_INTEGER(void) { return TYPE_INTEGER; } #endif /* fty_int.c ends here */ ncurses-6.4-20240113/form/fld_user.c0000644000000000000000000000740514062736236015366 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fty_ipv4.c0000644000000000000000000001176014062735154015324 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/frm_win.c0000644000000000000000000000772714062736236015233 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2009,2010 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1995,1997 * ****************************************************************************/ #include "form.priv.h" MODULE_ID("$Id: frm_win.c,v 1.19 2021/06/17 21:20:30 tom Exp $") /*--------------------------------------------------------------------------- | Facility : libnform | Function : int set_form_win(FORM *form,WINDOW *win) | | Description : Set the window of the form to win. | | Return Values : E_OK - success | E_POSTED - form is posted +--------------------------------------------------------------------------*/ FORM_EXPORT(int) set_form_win(FORM *form, WINDOW *win) { T((T_CALLED("set_form_win(%p,%p)"), (void *)form, (void *)win)); if (form && (form->status & _POSTED)) RETURN(E_POSTED); else { #if NCURSES_SP_FUNCS FORM *f = Normalize_Form(form); f->win = win ? win : StdScreen(Get_Form_Screen(f)); RETURN(E_OK); #else Normalize_Form(form)->win = win; RETURN(E_OK); #endif } } /*--------------------------------------------------------------------------- | Facility : libnform | Function : WINDOW *form_win(const FORM *) | | Description : Retrieve the window of the form. | | Return Values : The pointer to the Window or stdscr if there is none. +--------------------------------------------------------------------------*/ FORM_EXPORT(WINDOW *) form_win(const FORM *form) { WINDOW *result; const FORM *f; T((T_CALLED("form_win(%p)"), (const void *)form)); f = Normalize_Form(form); #if NCURSES_SP_FUNCS result = (f->win ? f->win : StdScreen(Get_Form_Screen(f))); #else result = (f->win ? f->win : stdscr); #endif returnWin(result); } /* frm_win.c ends here */ ncurses-6.4-20240113/form/modules0000644000000000000000000000765113615656212015013 0ustar rootroot# $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 ncurses-6.4-20240113/form/Makefile.in0000644000000000000000000001440714070103035015444 0ustar rootroot# $Id: Makefile.in,v 1.72 2021/07/03 15:45:33 tom Exp $ ############################################################################## # Copyright 2020,2021 Thomas E. Dickey # # Copyright 1998-2015,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1996-on # # Makefile for form source code. # # This makes the following: # libraries (normal/debug/profile/shared) # # The variable 'srcdir' refers to the source-distribution, and can be set with # the configure script by "--srcdir=DIR". # # The rules are organized to produce the libraries for the configured models, # turn off _all_ suffix rules; we'll generate our own .SUFFIXES: SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile x = @EXEEXT@ o = .@OBJEXT@ MODEL = @DFT_LWR_MODEL@ DESTDIR = @DESTDIR@ top_srcdir = @top_srcdir@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ includesubdir = @includesubdir@ INCLUDEDIR = $(DESTDIR)$(includedir)$(includesubdir) PACKAGE = @PACKAGE@ LIBTOOL = @LIBTOOL@ LIBTOOL_OPTS = @LIBTOOL_OPTS@ @EXPORT_SYMS@ LIBTOOL_CLEAN = @LIB_CLEAN@ LIBTOOL_COMPILE = @LIB_COMPILE@ LIBTOOL_LINK = @LIB_LINK@ LIBTOOL_INSTALL = @LIB_INSTALL@ LIBTOOL_UNINSTALL = @LIB_UNINSTALL@ LT_UNDEF = @LT_UNDEF@ INSTALL = @INSTALL@ INSTALL_LIB = @INSTALL@ @INSTALL_LIB@ INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ INSTALL_DATA = @INSTALL_DATA@ AR = @AR@ ARFLAGS = @ARFLAGS@ AWK = @AWK@ LD = @LD@ LN_S = @LN_S@ CTAGS = @CTAGS@ ETAGS = @ETAGS@ CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ INCDIR = $(top_srcdir)/include BASE_DIR = $(top_srcdir)/ncurses CPPFLAGS = -I$(BASE_DIR) -DHAVE_CONFIG_H -DBUILDING_FORM @CPPFLAGS@ CCFLAGS = $(CPPFLAGS) $(CFLAGS) CFLAGS_LIBTOOL = $(CCFLAGS) CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) LINK = $(LIBTOOL_LINK) LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@ SHLIB_DIRS = -L../lib SHLIB_LIST = $(SHLIB_DIRS) -lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@ RPATH_LIST = @RPATH_LIST@ RESULTING_SYMS = @RESULTING_SYMS@ VERSIONED_SYMS = @VERSIONED_SYMS@ MK_SHARED_LIB = @MK_SHARED_LIB@ NCURSES_MAJOR = @NCURSES_MAJOR@ NCURSES_MINOR = @NCURSES_MINOR@ REL_VERSION = @cf_cv_rel_version@ ABI_VERSION = @cf_cv_abi_version@ RANLIB = @LIB_PREP@ LIBRARIES = @Libs_To_Make@ LINT = @LINT@ LINT_OPTS = @LINT_OPTS@ LINT_LIBS = -lform -lncurses @LIBS@ AUTO_SRC = \ ../include/form.h ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.libs @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.libs all \ libs \ install :: $(AUTO_SRC) $(LIBRARIES) sources : $(AUTO_SRC) $(DESTDIR)$(bindir) \ $(DESTDIR)$(libdir) : mkdir -p $@ # make copies to simplify include-paths while still keeping form's include # file in this directory. ../include/form.h : $(srcdir)/form.h -rm -f $@ cp $(srcdir)/form.h $@ HEADER_DEPS = \ ../include/curses.h \ ../include/eti.h \ ../include/mf_common.h \ ../include/ncurses_cfg.h \ ../include/ncurses_def.h \ ../include/ncurses_dll.h \ ../include/term.h \ ../include/unctrl.h \ $(BASE_DIR)/curses.priv.h \ $(BASE_DIR)/new_pair.h \ $(INCDIR)/nc_alloc.h \ $(INCDIR)/nc_panel.h \ $(INCDIR)/nc_string.h \ $(INCDIR)/nc_termios.h \ $(INCDIR)/nc_tparm.h \ $(INCDIR)/term_entry.h \ $(srcdir)/form.h \ $(srcdir)/form.priv.h tags: $(CTAGS) *.[ch] @MAKE_UPPER_TAGS@TAGS: @MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] mostlyclean :: -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace clean :: mostlyclean -rm -f $(AUTO_SRC) distclean :: clean -rm -f Makefile -rm -rf .libs *.dSYM realclean :: distclean ../include/mf_common.h \ ../include/eti.h : ( cd ../menu && $(MAKE) $@ ) ############################################################################### # The remainder of this file is automatically generated during configuration ############################################################################### ncurses-6.4-20240113/form/fld_newftyp.c0000644000000000000000000001366713662350204016103 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fld_dup.c0000644000000000000000000001077413662350204015173 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fty_alpha.c0000644000000000000000000001605113765014671015530 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fld_type.c0000644000000000000000000001030614062736236015363 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/frm_cursor.c0000644000000000000000000000706714062736236015750 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/form.priv.h0000644000000000000000000002534714062737356015523 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2021 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1995,1997 * ****************************************************************************/ /* $Id: form.priv.h,v 0.48 2021/06/17 21:30:22 tom Exp $ */ #ifndef FORM_PRIV_H #define FORM_PRIV_H 1 /* *INDENT-OFF*/ #include "curses.priv.h" #define NCURSES_OPAQUE_FORM 0 #include "mf_common.h" #if USE_WIDEC_SUPPORT #if HAVE_WCTYPE_H #include #endif #ifndef MB_LEN_MAX #define MB_LEN_MAX 8 /* should be >= MB_CUR_MAX, but that may be a function */ #endif #define FIELD_CELL NCURSES_CH_T #define NCURSES_FIELD_INTERNALS char** expanded; WINDOW *working; #define NCURSES_FIELD_EXTENSION , (char **)0, (WINDOW *)0 #else #define FIELD_CELL char #define NCURSES_FIELD_EXTENSION /* nothing */ #endif #include "form.h" /*********************** * Default objects * ***********************/ extern FORM_EXPORT_VAR(FORM *) _nc_Default_Form; extern FORM_EXPORT_VAR(FIELD *) _nc_Default_Field; extern FORM_EXPORT_VAR(FIELDTYPE *) _nc_Default_FieldType; /* form status values */ #define _OVLMODE (0x04U) /* Form is in overlay mode */ #define _WINDOW_MODIFIED (0x10U) /* Current field window has been modified */ #define _FCHECK_REQUIRED (0x20U) /* Current field needs validation */ /* field status values */ #define _CHANGED (0x01U) /* Field has been changed */ #define _NEWTOP (0x02U) /* Vertical scrolling occurred */ #define _NEWPAGE (0x04U) /* field begins new page of form */ #define _MAY_GROW (0x08U) /* dynamic field may still grow */ /* fieldtype status values */ #define _LINKED_TYPE (0x01U) /* Type is a linked type */ #define _HAS_ARGS (0x02U) /* Type has arguments */ #define _HAS_CHOICE (0x04U) /* Type has choice methods */ #define _RESIDENT (0x08U) /* Type is built-in */ #define _GENERIC (0x10U) /* A generic field type */ /* This are the field options required to be a selectable field in field navigation requests */ #define O_SELECTABLE (O_ACTIVE | O_VISIBLE) /* If form is NULL replace form argument by default-form */ #define Normalize_Form(form) \ ((form) = (form != 0) ? (form) : _nc_Default_Form) /* If field is NULL replace field argument by default-field */ #define Normalize_Field(field) \ ((field) = (field != 0) ? (field) : _nc_Default_Field) #if NCURSES_SP_FUNCS #define Get_Form_Screen(form) \ ((form)->win ? _nc_screen_of((form->win)):CURRENT_SCREEN) #else #define Get_Form_Screen(form) CURRENT_SCREEN #endif /* Retrieve form's window */ #define Get_Form_Window(form) \ ((form)->sub \ ? (form)->sub \ : ((form)->win \ ? (form)->win \ : StdScreen(Get_Form_Screen(form)))) /* Calculate the size for a single buffer for this field */ #define Buffer_Length(field) ((field)->drows * (field)->dcols) /* Calculate the total size of all buffers for this field */ #define Total_Buffer_Size(field) \ ( (size_t)(Buffer_Length(field) + 1) * (size_t)(1+(field)->nbuf) * sizeof(FIELD_CELL) ) /* Logic to determine whether or not a field is single lined */ #define Single_Line_Field(field) \ (((field)->rows + (field)->nrow) == 1) #define Field_Has_Option(f,o) ((((unsigned)(f)->opts) & o) != 0) /* Logic to determine whether or not a field is selectable */ #define Field_Is_Selectable(f) (((unsigned)((f)->opts) & O_SELECTABLE)==O_SELECTABLE) #define Field_Is_Not_Selectable(f) (((unsigned)((f)->opts) & O_SELECTABLE)!=O_SELECTABLE) typedef struct typearg { struct typearg *left; struct typearg *right; } TypeArgument; /* This is a dummy request code (normally invalid) to be used internally with the form_driver() routine to position to the first active field on the form */ #define FIRST_ACTIVE_MAGIC (-291056) #define ALL_FORM_OPTS ( \ O_NL_OVERLOAD |\ O_BS_OVERLOAD ) #define STD_FIELD_OPTS (Field_Options)( \ O_VISIBLE |\ O_ACTIVE |\ O_PUBLIC |\ O_EDIT |\ O_WRAP |\ O_BLANK |\ O_AUTOSKIP|\ O_NULLOK |\ O_PASSOK |\ O_STATIC) #define ALL_FIELD_OPTS (Field_Options)( \ STD_FIELD_OPTS |\ O_DYNAMIC_JUSTIFY |\ O_NO_LEFT_STRIP |\ O_EDGE_INSERT_STAY |\ O_INPUT_LIMIT) #define C_BLANK ' ' #define is_blank(c) ((c)==C_BLANK) #define C_ZEROS '\0' extern FORM_EXPORT(TypeArgument *) _nc_Make_Argument (const FIELDTYPE*, va_list*, int*); extern FORM_EXPORT(TypeArgument *) _nc_Copy_Argument (const FIELDTYPE*, const TypeArgument*, int*); extern FORM_EXPORT(void) _nc_Free_Argument (const FIELDTYPE*, TypeArgument*); extern FORM_EXPORT(bool) _nc_Copy_Type (FIELD*, FIELD const *); extern FORM_EXPORT(void) _nc_Free_Type (FIELD *); extern FORM_EXPORT(int) _nc_Synchronize_Attributes (FIELD*); extern FORM_EXPORT(int) _nc_Synchronize_Options (FIELD*, Field_Options); extern FORM_EXPORT(int) _nc_Set_Form_Page (FORM*, int, FIELD*); extern FORM_EXPORT(int) _nc_Refresh_Current_Field (FORM*); extern FORM_EXPORT(FIELD *) _nc_First_Active_Field (FORM*); extern FORM_EXPORT(bool) _nc_Internal_Validation (FORM*); extern FORM_EXPORT(int) _nc_Set_Current_Field (FORM*, FIELD*); extern FORM_EXPORT(int) _nc_Position_Form_Cursor (FORM*); extern FORM_EXPORT(void) _nc_Unset_Current_Field(FORM *form); #if NCURSES_INTEROP_FUNCS extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_INTEGER(void); extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ALNUM(void); extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ALPHA(void); extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ENUM(void); extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_NUMERIC(void); extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_REGEXP(void); extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_IPV4(void); extern FORM_EXPORT(FIELDTYPE *) _nc_generic_fieldtype(bool (*const field_check) (FORM*, FIELD *, const void *), bool (*const char_check) (int, FORM*, FIELD*, const void *), bool (*const next)(FORM*,FIELD*,const void*), bool (*const prev)(FORM*,FIELD*,const void*), void (*freecallback)(void*)); extern FORM_EXPORT(int) _nc_set_generic_fieldtype(FIELD*, FIELDTYPE*, int (*)(void**)); extern FORM_EXPORT(WINDOW*) _nc_form_cursor(const FORM* , int* , int* ); #define INIT_FT_FUNC(func) {func} #else #define INIT_FT_FUNC(func) func #endif extern FORM_EXPORT(void) _nc_get_fieldbuffer(FORM*, FIELD*, FIELD_CELL*); #if USE_WIDEC_SUPPORT extern FORM_EXPORT(wchar_t *) _nc_Widen_String(char *, int *); #endif #ifdef TRACE #define returnField(code) TRACE_RETURN1(code,field) #define returnFieldPtr(code) TRACE_RETURN1(code,field_ptr) #define returnForm(code) TRACE_RETURN1(code,form) #define returnFieldType(code) TRACE_RETURN1(code,field_type) #define returnFormHook(code) TRACE_RETURN1(code,form_hook) extern FORM_EXPORT(FIELD **) _nc_retrace_field_ptr (FIELD **); extern FORM_EXPORT(FIELD *) _nc_retrace_field (FIELD *); extern FORM_EXPORT(FIELDTYPE *) _nc_retrace_field_type (FIELDTYPE *); extern FORM_EXPORT(FORM *) _nc_retrace_form (FORM *); extern FORM_EXPORT(Form_Hook) _nc_retrace_form_hook (Form_Hook); #else /* !TRACE */ #define returnFieldPtr(code) return code #define returnFieldType(code) return code #define returnField(code) return code #define returnForm(code) return code #define returnFormHook(code) return code #endif /* TRACE/!TRACE */ /* * Use Check_CTYPE_Field() to simplify FIELDTYPE's that use only the ccheck() * function. */ #if USE_WIDEC_SUPPORT #define Check_CTYPE_Field(result, buffer, width, ccheck) \ while (*buffer && *buffer == ' ') \ buffer++; \ if (*buffer) \ { \ bool blank = FALSE; \ int len; \ int n; \ wchar_t *list = _nc_Widen_String((char *)buffer, &len); \ if (list != 0) \ { \ result = TRUE; \ for (n = 0; n < len; ++n) \ { \ if (blank) \ { \ if (list[n] != ' ') \ { \ result = FALSE; \ break; \ } \ } \ else if (list[n] == ' ') \ { \ blank = TRUE; \ result = (n + 1 >= width); \ } \ else if (!ccheck(list[n], NULL)) \ { \ result = FALSE; \ break; \ } \ } \ free(list); \ } \ } #else #define Check_CTYPE_Field(result, buffer, width, ccheck) \ while (*buffer && *buffer == ' ') \ buffer++; \ if (*buffer) \ { \ unsigned char *s = buffer; \ int l = -1; \ while (*buffer && ccheck(*buffer, NULL)) \ buffer++; \ l = (int)(buffer - s); \ while (*buffer && *buffer == ' ') \ buffer++; \ result = ((*buffer || (l < width)) ? FALSE : TRUE); \ } #endif /* *INDENT-ON*/ #endif /* FORM_PRIV_H */ ncurses-6.4-20240113/form/fld_page.c0000644000000000000000000000762114062736236015324 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fld_current.c0000644000000000000000000001432613662350204016062 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fld_move.c0000644000000000000000000000652114062736236015354 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/frm_def.c0000644000000000000000000003412414027742246015162 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/frm_sub.c0000644000000000000000000000746614062736236015227 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2009,2010 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1995-1997,2009 * ****************************************************************************/ #include "form.priv.h" MODULE_ID("$Id: frm_sub.c,v 1.15 2021/06/17 21:20:30 tom Exp $") /*--------------------------------------------------------------------------- | Facility : libnform | Function : int set_form_sub(FORM *form, WINDOW *win) | | Description : Set the subwindow of the form to win. | | Return Values : E_OK - success | E_POSTED - form is posted +--------------------------------------------------------------------------*/ FORM_EXPORT(int) set_form_sub(FORM *form, WINDOW *win) { T((T_CALLED("set_form_sub(%p,%p)"), (void *)form, (void *)win)); if (form && (form->status & _POSTED)) RETURN(E_POSTED); else { #if NCURSES_SP_FUNCS FORM *f = Normalize_Form(form); f->sub = win ? win : StdScreen(Get_Form_Screen(f)); RETURN(E_OK); #else Normalize_Form(form)->sub = win; RETURN(E_OK); #endif } } /*--------------------------------------------------------------------------- | Facility : libnform | Function : WINDOW *form_sub(const FORM *) | | Description : Retrieve the window of the form. | | Return Values : The pointer to the Subwindow. +--------------------------------------------------------------------------*/ FORM_EXPORT(WINDOW *) form_sub(const FORM *form) { const FORM *f; T((T_CALLED("form_sub(%p)"), (const void *)form)); f = Normalize_Form(form); returnWin(Get_Form_Window(f)); } /* frm_sub.c ends here */ ncurses-6.4-20240113/form/fld_ftlink.c0000644000000000000000000000777714062736236015713 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/llib-lformw0000644000000000000000000003731214062736236015570 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/form/fty_regex.c0000644000000000000000000002606614105755340015556 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fld_link.c0000644000000000000000000001067114062736236015344 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fty_num.c0000644000000000000000000002246414027742246015245 0ustar rootroot/**************************************************************************** * Copyright 2019-2020,2021 Thomas E. Dickey * * Copyright 1998-2010,2012 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /*************************************************************************** * * * Author : Juergen Pfeifer * * * ***************************************************************************/ #include "form.priv.h" MODULE_ID("$Id: fty_num.c,v 1.37 2021/03/27 23:49:58 tom Exp $") #if HAVE_LOCALE_H #include #endif #if HAVE_LOCALE_H && HAVE_LOCALECONV #define isDecimalPoint(c) ((c) == ((L && L->decimal_point) ? *(L->decimal_point) : '.')) #else #define isDecimalPoint(c) ((c) == '.') #endif #if USE_WIDEC_SUPPORT #define isDigit(c) (iswdigit((wint_t)(c)) || isdigit(UChar(c))) #else #define isDigit(c) isdigit(UChar(c)) #endif #define thisARG numericARG typedef struct { int precision; double low; double high; struct lconv *L; } thisARG; typedef struct { int precision; double low; double high; } thisPARM; /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void *Generic_This_Type(void * arg) | | Description : Allocate structure for numeric type argument. | | Return Values : Pointer to argument structure or NULL on error +--------------------------------------------------------------------------*/ static void * Generic_This_Type(void *arg) { thisARG *argn = (thisARG *)0; thisPARM *args = (thisPARM *)arg; if (args) { argn = typeMalloc(thisARG, 1); if (argn) { T((T_CREATE("thisARG %p"), (void *)argn)); argn->precision = args->precision; argn->low = args->low; argn->high = args->high; #if HAVE_LOCALE_H && HAVE_LOCALECONV argn->L = localeconv(); #else argn->L = NULL; #endif } } return (void *)argn; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void *Make_This_Type(va_list * ap) | | Description : Allocate structure for numeric type argument. | | Return Values : Pointer to argument structure or NULL on error +--------------------------------------------------------------------------*/ static void * Make_This_Type(va_list *ap) { thisPARM arg; arg.precision = va_arg(*ap, int); arg.low = va_arg(*ap, double); arg.high = va_arg(*ap, double); return Generic_This_Type((void *)&arg); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void *Copy_This_Type(const void * argp) | | Description : Copy structure for numeric type argument. | | Return Values : Pointer to argument structure or NULL on error. +--------------------------------------------------------------------------*/ static void * Copy_This_Type(const void *argp) { const thisARG *ap = (const thisARG *)argp; thisARG *result = (thisARG *)0; if (argp) { result = typeMalloc(thisARG, 1); if (result) { T((T_CREATE("thisARG %p"), (void *)result)); *result = *ap; } } return (void *)result; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void Free_This_Type(void * argp) | | Description : Free structure for numeric type argument. | | Return Values : - +--------------------------------------------------------------------------*/ static void Free_This_Type(void *argp) { if (argp) free(argp); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Check_This_Field(FIELD * field, | const void * argp) | | Description : Validate buffer content to be a valid numeric value | | Return Values : TRUE - field is valid | FALSE - field is invalid +--------------------------------------------------------------------------*/ static bool Check_This_Field(FIELD *field, const void *argp) { const thisARG *argn = (const thisARG *)argp; double low = argn->low; double high = argn->high; int prec = argn->precision; unsigned char *bp = (unsigned char *)field_buffer(field, 0); char *s = (char *)bp; struct lconv *L = argn->L; bool result = FALSE; while (*bp == ' ') bp++; if (*bp) { if (*bp == '-' || *bp == '+') bp++; #if USE_WIDEC_SUPPORT if (*bp) { int len; wchar_t *list = _nc_Widen_String((char *)bp, &len); if (list != 0) { bool blank = FALSE; int state = 0; int n; result = TRUE; for (n = 0; n < len; ++n) { if (blank) { if (list[n] != ' ') { result = FALSE; break; } } else if (list[n] == ' ') { blank = TRUE; } else if (isDecimalPoint(list[n])) { if (++state > 1) { result = FALSE; break; } } else if (!isDigit(list[n])) { result = FALSE; break; } } free(list); } } #else while (*bp) { if (!isdigit(UChar(*bp))) break; bp++; } if (isDecimalPoint(*bp)) { bp++; while (*bp) { if (!isdigit(UChar(*bp))) break; bp++; } } while (*bp && *bp == ' ') bp++; result = (*bp == '\0'); #endif if (result) { double val = atof(s); if (low < high) { if (val < low || val > high) result = FALSE; } if (result) { char buf[64]; _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "%.*f", (prec > 0 ? prec : 0), val); set_field_buffer(field, 0, buf); } } } return (result); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Check_This_Character( | int c, | const void * argp) | | Description : Check a character for the numeric type. | | Return Values : TRUE - character is valid | FALSE - character is invalid +--------------------------------------------------------------------------*/ static bool Check_This_Character(int c, const void *argp) { const thisARG *argn = (const thisARG *)argp; struct lconv *L = argn->L; return ((isDigit(c) || c == '+' || c == '-' || isDecimalPoint(c)) ? TRUE : FALSE); } static FIELDTYPE typeTHIS = { _HAS_ARGS | _RESIDENT, 1, /* this is mutable, so we can't be const */ (FIELDTYPE *)0, (FIELDTYPE *)0, Make_This_Type, Copy_This_Type, Free_This_Type, INIT_FT_FUNC(Check_This_Field), INIT_FT_FUNC(Check_This_Character), INIT_FT_FUNC(NULL), INIT_FT_FUNC(NULL), #if NCURSES_INTEROP_FUNCS Generic_This_Type #endif }; FORM_EXPORT_VAR(FIELDTYPE *) TYPE_NUMERIC = &typeTHIS; #if NCURSES_INTEROP_FUNCS /* The next routines are to simplify the use of ncurses from programming languages with restrictions on interop with C level constructs (e.g. variable access or va_list + ellipsis constructs) */ FORM_EXPORT(FIELDTYPE *) _nc_TYPE_NUMERIC(void) { return TYPE_NUMERIC; } #endif /* fty_num.c ends here */ ncurses-6.4-20240113/form/fld_def.c0000644000000000000000000003013614027742241015135 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/fld_info.c0000644000000000000000000001123014062736236015332 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/form/frm_driver.c0000644000000000000000000050055714114006751015716 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2021 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1995,1997 * ****************************************************************************/ #include "form.priv.h" MODULE_ID("$Id: frm_driver.c,v 1.135 2021/09/01 23:34:01 tom Exp $") /*---------------------------------------------------------------------------- This is the core module of the form library. It contains the majority of the driver routines as well as the form_driver function. Essentially this module is nearly the whole library. This is because all the functions in this module depends on some others in the module, so it makes no sense to split them into separate files because they will always be linked together. The only acceptable concern is turnaround time for this module, but now we have all Pentiums or RISCs, so what! The driver routines are grouped into nine generic categories: a) Page Navigation ( all functions prefixed by PN_ ) The current page of the form is left and some new page is entered. b) Inter-Field Navigation ( all functions prefixed by FN_ ) The current field of the form is left and some new field is entered. c) Intra-Field Navigation ( all functions prefixed by IFN_ ) The current position in the current field is changed. d) Vertical Scrolling ( all functions prefixed by VSC_ ) Essentially this is a specialization of Intra-Field navigation. It has to check for a multi-line field. e) Horizontal Scrolling ( all functions prefixed by HSC_ ) Essentially this is a specialization of Intra-Field navigation. It has to check for a single-line field. f) Field Editing ( all functions prefixed by FE_ ) The content of the current field is changed g) Edit Mode requests ( all functions prefixed by EM_ ) Switching between insert and overlay mode h) Field-Validation requests ( all functions prefixed by FV_ ) Perform verifications of the field. i) Choice requests ( all functions prefixed by CR_ ) Requests to enumerate possible field values --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Some remarks on the placements of assert() macros : I use them only on "strategic" places, i.e. top level entries where I want to make sure that things are set correctly. Throughout subordinate routines I omit them mostly. --------------------------------------------------------------------------*/ /* Some options that may effect compatibility in behavior to SVr4 forms, but they are here to allow a more intuitive and user friendly behavior of our form implementation. This doesn't affect the API, so we feel it is uncritical. The initial implementation tries to stay very close with the behavior of the original SVr4 implementation, although in some areas it is quite clear that this isn't the most appropriate way. As far as possible this sources will allow you to build a forms lib that behaves quite similar to SVr4, but now and in the future we will give you better options. Perhaps at some time we will make this configurable at runtime. */ /* Implement a more user-friendly previous/next word behavior */ #define FRIENDLY_PREV_NEXT_WORD (1) /* Fix the wrong behavior for forms with all fields inactive */ #define FIX_FORM_INACTIVE_BUG (1) /* Allow dynamic field growth also when navigating past the end */ #define GROW_IF_NAVIGATE (1) #if USE_WIDEC_SUPPORT #define myADDNSTR(w, s, n) wide_waddnstr(w, s, n) #define myINSNSTR(w, s, n) wide_winsnstr(w, s, n) #define myINNSTR(w, s, n) wide_winnstr(w, s, n) #define myWCWIDTH(w, y, x) cell_width(w, y, x) #else #define myADDNSTR(w, s, n) waddnstr(w, s, n) #define myINSNSTR(w, s, n) winsnstr(w, s, n) #define myINNSTR(w, s, n) winnstr(w, s, n) #define myWCWIDTH(w, y, x) 1 #endif /*---------------------------------------------------------------------------- Forward references to some internally used static functions --------------------------------------------------------------------------*/ static int Inter_Field_Navigation(int (*const fct) (FORM *), FORM *form); static int FN_Next_Field(FORM *form); static int FN_Previous_Field(FORM *form); static int FE_New_Line(FORM *); static int FE_Delete_Previous(FORM *); /*---------------------------------------------------------------------------- Macro Definitions. Some Remarks on that: I use the convention to use UPPERCASE for constants defined by Macros. If I provide a macro as a kind of inline routine to provide some logic, I use my Upper_Lower case style. --------------------------------------------------------------------------*/ /* Calculate the position of a single row in a field buffer */ #define Position_Of_Row_In_Buffer(field,row) ((row)*(field)->dcols) /* Calculate start address for the field's buffer# N */ #define Address_Of_Nth_Buffer(field,N) \ ((field)->buf + (N)*(1+Buffer_Length(field))) /* Calculate the start address of the row in the field's specified buffer# N */ #define Address_Of_Row_In_Nth_Buffer(field,N,row) \ (Address_Of_Nth_Buffer(field,N) + Position_Of_Row_In_Buffer(field,row)) /* Calculate the start address of the row in the field's primary buffer */ #define Address_Of_Row_In_Buffer(field,row) \ Address_Of_Row_In_Nth_Buffer(field,0,row) /* Calculate the start address of the row in the form's current field buffer# N */ #define Address_Of_Current_Row_In_Nth_Buffer(form,N) \ Address_Of_Row_In_Nth_Buffer((form)->current,N,(form)->currow) /* Calculate the start address of the row in the form's current field primary buffer */ #define Address_Of_Current_Row_In_Buffer(form) \ Address_Of_Current_Row_In_Nth_Buffer(form,0) /* Calculate the address of the cursor in the form's current field primary buffer */ #define Address_Of_Current_Position_In_Nth_Buffer(form,N) \ (Address_Of_Current_Row_In_Nth_Buffer(form,N) + (form)->curcol) /* Calculate the address of the cursor in the form's current field buffer# N */ #define Address_Of_Current_Position_In_Buffer(form) \ Address_Of_Current_Position_In_Nth_Buffer(form,0) /* Logic to decide whether or not a field is actually a field with vertical or horizontal scrolling */ #define Is_Scroll_Field(field) \ (((field)->drows > (field)->rows) || \ ((field)->dcols > (field)->cols)) /* Logic to decide whether or not a field needs to have an individual window instead of a derived window because it contains invisible parts. This is true for non-public fields and for scrollable fields. */ #define Has_Invisible_Parts(field) \ (!(Field_Has_Option(field, O_PUBLIC)) || \ Is_Scroll_Field(field)) /* Logic to decide whether or not a field needs justification */ #define Justification_Allowed(field) \ (((field)->just != NO_JUSTIFICATION) && \ (Single_Line_Field(field)) && \ ((Field_Has_Option(field, O_STATIC) && \ ((field)->dcols == (field)->cols)) || \ Field_Has_Option(field, O_DYNAMIC_JUSTIFY))) /* Logic to determine whether or not a dynamic field may still grow */ #define Growable(field) ((field)->status & _MAY_GROW) /* Macro to set the attributes for a field's window */ #define Set_Field_Window_Attributes(field,win) \ ( wbkgdset((win),(chtype)((chtype)((field)->pad) | (field)->back)), \ (void) wattrset((win), (int)(field)->fore) ) /* Logic to decide whether or not a field really appears on the form */ #define Field_Really_Appears(field) \ ((field->form) &&\ (field->form->status & _POSTED) &&\ (Field_Has_Option(field, O_VISIBLE)) &&\ (field->page == field->form->curpage)) /* Logic to determine whether or not we are on the first position in the current field */ #define First_Position_In_Current_Field(form) \ (((form)->currow==0) && ((form)->curcol==0)) #define Minimum(a,b) (((a)<=(b)) ? (a) : (b)) #define Maximum(a,b) (((a)>=(b)) ? (a) : (b)) /*---------------------------------------------------------------------------- Useful constants --------------------------------------------------------------------------*/ static FIELD_CELL myBLANK = BLANK; static FIELD_CELL myZEROS; #ifdef TRACE static void check_pos(FORM *form, int lineno) { if (form && form->w) { int y, x; getyx(form->w, y, x); if (y != form->currow || x != form->curcol) { T(("CHECKPOS %s@%d have position %d,%d vs want %d,%d", __FILE__, lineno, y, x, form->currow, form->curcol)); } } } #define CHECKPOS(form) check_pos(form, __LINE__) #else #define CHECKPOS(form) /* nothing */ #endif /*---------------------------------------------------------------------------- Wide-character special functions --------------------------------------------------------------------------*/ #if USE_WIDEC_SUPPORT /* add like waddnstr, but using cchar_t* rather than char* */ static int wide_waddnstr(WINDOW *w, const cchar_t *s, int n) { int rc = OK; while (n-- > 0) { if ((rc = wadd_wch(w, s)) != OK) break; ++s; } return rc; } /* insert like winsnstr, but using cchar_t* rather than char* * * X/Open Curses has no close equivalent; inserts are done only with wchar_t * strings. */ static int wide_winsnstr(WINDOW *w, const cchar_t *s, int n) { int code = ERR; while (n-- > 0) { int y, x; getyx(w, y, x); if ((code = wins_wch(w, s++)) != OK) break; if ((code = wmove(w, y, x + 1)) != OK) break; } return code; } /* retrieve like winnstr, but using cchar_t*, rather than char*. * * X/Open Curses' closest equivalent, win_wchnstr(), is inconsistent with * winnstr(), since it returns OK rather than the number of items transferred. */ static int wide_winnstr(WINDOW *w, cchar_t *s, int n) { int x; win_wchnstr(w, s, n); /* * This function is used to extract the text only from the window. * Strip attributes and color from the string so they will not be added * back when copying the string to the window. */ for (x = 0; x < n; ++x) { RemAttr(s[x], A_ATTRIBUTES); SetPair(s[x], 0); } return n; } /* * Returns the column of the base of the given cell. */ static int cell_base(WINDOW *win, int y, int x) { int result = x; while (LEGALYX(win, y, x)) { cchar_t *data = &(win->_line[y].text[x]); if (isWidecBase(CHDEREF(data)) || !isWidecExt(CHDEREF(data))) { result = x; break; } --x; } return result; } /* * Returns the number of columns needed for the given cell in a window. */ static int cell_width(WINDOW *win, int y, int x) { int result = 1; if (LEGALYX(win, y, x)) { cchar_t *data = &(win->_line[y].text[x]); if (isWidecExt(CHDEREF(data))) { /* recur, providing the number of columns to the next character */ result = cell_width(win, y, x - 1); } else { result = wcwidth(CharOf(CHDEREF(data))); } } return result; } /* * There is no wide-character function such as wdel_wch(), so we must find * all of the cells that comprise a multi-column character and delete them * one-by-one. */ static void delete_char(FORM *form) { int cells = cell_width(form->w, form->currow, form->curcol); form->curcol = cell_base(form->w, form->currow, form->curcol); wmove(form->w, form->currow, form->curcol); while (cells-- > 0) { wdelch(form->w); } } #define DeleteChar(form) delete_char(form) #else #define DeleteChar(form) \ wmove((form)->w, (form)->currow, (form)->curcol), \ wdelch((form)->w) #endif /*--------------------------------------------------------------------------- | Facility : libnform | Function : static char *Get_Start_Of_Data(char * buf, int blen) | | Description : Return pointer to first non-blank position in buffer. | If buffer is empty return pointer to buffer itself. | | Return Values : Pointer to first non-blank position in buffer +--------------------------------------------------------------------------*/ NCURSES_INLINE static FIELD_CELL * Get_Start_Of_Data(FIELD_CELL *buf, int blen) { FIELD_CELL *p = buf; FIELD_CELL *end = &buf[blen]; assert(buf && blen >= 0); while ((p < end) && ISBLANK(*p)) p++; return ((p == end) ? buf : p); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static char *After_End_Of_Data(char * buf, int blen) | | Description : Return pointer after last non-blank position in buffer. | If buffer is empty, return pointer to buffer itself. | | Return Values : Pointer to position after last non-blank position in | buffer. +--------------------------------------------------------------------------*/ NCURSES_INLINE static FIELD_CELL * After_End_Of_Data(FIELD_CELL *buf, int blen) { FIELD_CELL *p = &buf[blen]; assert(buf && blen >= 0); while ((p > buf) && ISBLANK(p[-1])) p--; return (p); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static char *Get_First_Whitespace_Character( | char * buf, int blen) | | Description : Position to the first whitespace character. | | Return Values : Pointer to first whitespace character in buffer. +--------------------------------------------------------------------------*/ NCURSES_INLINE static FIELD_CELL * Get_First_Whitespace_Character(FIELD_CELL *buf, int blen) { FIELD_CELL *p = buf; FIELD_CELL *end = &p[blen]; assert(buf && blen >= 0); while ((p < end) && !ISBLANK(*p)) p++; return ((p == end) ? buf : p); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static char *After_Last_Whitespace_Character( | char * buf, int blen) | | Description : Get the position after the last whitespace character. | | Return Values : Pointer to position after last whitespace character in | buffer. +--------------------------------------------------------------------------*/ NCURSES_INLINE static FIELD_CELL * After_Last_Whitespace_Character(FIELD_CELL *buf, int blen) { FIELD_CELL *p = &buf[blen]; assert(buf && blen >= 0); while ((p > buf) && !ISBLANK(p[-1])) p--; return (p); } /* Set this to 1 to use the div_t version. This is a good idea if your compiler has an intrinsic div() support. Unfortunately GNU-C has it not yet. N.B.: This only works if form->curcol follows immediately form->currow and both are of type int. */ #define USE_DIV_T (0) /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void Adjust_Cursor_Position( | FORM * form, const char * pos) | | Description : Set current row and column of the form to values | corresponding to the buffer position. | | Return Values : - +--------------------------------------------------------------------------*/ NCURSES_INLINE static void Adjust_Cursor_Position(FORM *form, const FIELD_CELL *pos) { FIELD *field; int idx; field = form->current; assert(pos >= field->buf && field->dcols > 0); idx = (int)(pos - field->buf); #if USE_DIV_T *((div_t *) & (form->currow)) = div(idx, field->dcols); #else form->currow = idx / field->dcols; form->curcol = idx - field->cols * form->currow; #endif if (field->drows < form->currow) form->currow = 0; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void Buffer_To_Window( | const FIELD * field, | WINDOW * win) | | Description : Copy the buffer to the window. If it is a multi-line | field, the buffer is split to the lines of the | window without any editing. | | Return Values : - +--------------------------------------------------------------------------*/ static void Buffer_To_Window(const FIELD *field, WINDOW *win) { int width, height; int y, x; int row; FIELD_CELL *pBuffer; assert(win && field); getyx(win, y, x); width = getmaxx(win); height = getmaxy(win); for (row = 0, pBuffer = field->buf; row < height; row++, pBuffer += width) { int len; if ((len = (int)(After_End_Of_Data(pBuffer, width) - pBuffer)) > 0) { wmove(win, row, 0); myADDNSTR(win, pBuffer, len); } } wmove(win, y, x); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : void _nc_get_fieldbuffer( | WINDOW * win, | FIELD * field, | FIELD_CELL * buf) | | Description : Copy the content of the window into the buffer. | The multiple lines of a window are simply | concatenated into the buffer. Pad characters in | the window will be replaced by blanks in the buffer. | | Return Values : - +--------------------------------------------------------------------------*/ FORM_EXPORT(void) _nc_get_fieldbuffer(FORM *form, FIELD *field, FIELD_CELL *buf) { int pad; int len = 0; FIELD_CELL *p; int row, height; WINDOW *win; assert(form && field && buf); win = form->w; assert(win); pad = field->pad; p = buf; height = getmaxy(win); for (row = 0; (row < height) && (row < field->drows); row++) { wmove(win, row, 0); len += myINNSTR(win, p + len, field->dcols); } p[len] = myZEROS; /* replace visual padding character by blanks in buffer */ if (pad != C_BLANK) { int i; for (i = 0; i < len; i++, p++) { if ((unsigned long)CharOf(*p) == ChCharOf(pad) #if USE_WIDEC_SUPPORT && p->chars[1] == 0 #endif ) *p = myBLANK; } } } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void Window_To_Buffer( | FORM * form, | FIELD * field) | | Description : Copy the content of the window into the buffer. | The multiple lines of a window are simply | concatenated into the buffer. Pad characters in | the window will be replaced by blanks in the buffer. | | Return Values : - +--------------------------------------------------------------------------*/ static void Window_To_Buffer(FORM *form, FIELD *field) { _nc_get_fieldbuffer(form, field, field->buf); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void Synchronize_Buffer(FORM * form) | | Description : If there was a change, copy the content of the | window into the buffer, so the buffer is synchronized | with the windows content. We have to indicate that the | buffer needs validation due to the change. | | Return Values : - +--------------------------------------------------------------------------*/ NCURSES_INLINE static void Synchronize_Buffer(FORM *form) { if (form->status & _WINDOW_MODIFIED) { ClrStatus(form, _WINDOW_MODIFIED); SetStatus(form, _FCHECK_REQUIRED); Window_To_Buffer(form, form->current); wmove(form->w, form->currow, form->curcol); } } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Field_Grown( FIELD *field, int amount) | | Description : This function is called for growable dynamic fields | only. It has to increase the buffers and to allocate | a new window for this field. | This function has the side effect to set a new | field-buffer pointer, the dcols and drows values | as well as a new current Window for the field. | | Return Values : TRUE - field successfully increased | FALSE - there was some error +--------------------------------------------------------------------------*/ static bool Field_Grown(FIELD *field, int amount) { bool result = FALSE; if (field && Growable(field)) { bool single_line_field = Single_Line_Field(field); int old_buflen = Buffer_Length(field); int new_buflen; int old_dcols = field->dcols; int old_drows = field->drows; FIELD_CELL *oldbuf = field->buf; FIELD_CELL *newbuf; int growth; FORM *form = field->form; bool need_visual_update = ((form != (FORM *)0) && (form->status & _POSTED) && (form->current == field)); if (need_visual_update) Synchronize_Buffer(form); if (single_line_field) { growth = field->cols * amount; if (field->maxgrow) growth = Minimum(field->maxgrow - field->dcols, growth); field->dcols += growth; if (field->dcols == field->maxgrow) ClrStatus(field, _MAY_GROW); } else { growth = (field->rows + field->nrow) * amount; if (field->maxgrow) growth = Minimum(field->maxgrow - field->drows, growth); field->drows += growth; if (field->drows == field->maxgrow) ClrStatus(field, _MAY_GROW); } /* drows, dcols changed, so we get really the new buffer length */ new_buflen = Buffer_Length(field); newbuf = (FIELD_CELL *)malloc(Total_Buffer_Size(field)); if (!newbuf) { /* restore to previous state */ field->dcols = old_dcols; field->drows = old_drows; if ((single_line_field && (field->dcols != field->maxgrow)) || (!single_line_field && (field->drows != field->maxgrow))) SetStatus(field, _MAY_GROW); } else { /* Copy all the buffers. This is the reason why we can't just use * realloc(). */ int i, j; result = TRUE; /* allow sharing of recovery on failure */ T((T_CREATE("fieldcell %p"), (void *)newbuf)); field->buf = newbuf; for (i = 0; i <= field->nbuf; i++) { FIELD_CELL *new_bp = Address_Of_Nth_Buffer(field, i); FIELD_CELL *old_bp = oldbuf + i * (1 + old_buflen); for (j = 0; j < old_buflen; ++j) new_bp[j] = old_bp[j]; while (j < new_buflen) new_bp[j++] = myBLANK; new_bp[new_buflen] = myZEROS; } #if USE_WIDEC_SUPPORT && NCURSES_EXT_FUNCS if (wresize(field->working, 1, Buffer_Length(field) + 1) == ERR) result = FALSE; #endif if (need_visual_update && result) { WINDOW *new_window = newpad(field->drows, field->dcols); if (new_window != 0) { assert(form != (FORM *)0); if (form->w) delwin(form->w); form->w = new_window; Set_Field_Window_Attributes(field, form->w); werase(form->w); Buffer_To_Window(field, form->w); untouchwin(form->w); wmove(form->w, form->currow, form->curcol); } else result = FALSE; } if (result) { free(oldbuf); /* reflect changes in linked fields */ if (field != field->link) { FIELD *linked_field; for (linked_field = field->link; linked_field != field; linked_field = linked_field->link) { linked_field->buf = field->buf; linked_field->drows = field->drows; linked_field->dcols = field->dcols; } } } else { /* restore old state */ field->dcols = old_dcols; field->drows = old_drows; field->buf = oldbuf; if ((single_line_field && (field->dcols != field->maxgrow)) || (!single_line_field && (field->drows != field->maxgrow))) SetStatus(field, _MAY_GROW); free(newbuf); } } } return (result); } #ifdef NCURSES_MOUSE_VERSION /*--------------------------------------------------------------------------- | Facility : libnform | Function : int Field_encloses(FIELD *field, int ry, int rx) | | Description : Check if the given coordinates lie within the given field. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid form pointer | E_SYSTEM_ERROR - form has no current field or | field-window +--------------------------------------------------------------------------*/ static int Field_encloses(FIELD *field, int ry, int rx) { T((T_CALLED("Field_encloses(%p)"), (void *)field)); if (field != 0 && field->frow <= ry && (field->frow + field->rows) > ry && field->fcol <= rx && (field->fcol + field->cols) > rx) { RETURN(E_OK); } RETURN(E_INVALID_FIELD); } #endif /*--------------------------------------------------------------------------- | Facility : libnform | Function : int _nc_Position_Form_Cursor(FORM * form) | | Description : Position the cursor in the window for the current | field to be in sync. with the currow and curcol | values. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid form pointer | E_SYSTEM_ERROR - form has no current field or | field-window +--------------------------------------------------------------------------*/ FORM_EXPORT(int) _nc_Position_Form_Cursor(FORM *form) { FIELD *field; WINDOW *formwin; if (!form) return (E_BAD_ARGUMENT); if (!form->w || !form->current) return (E_SYSTEM_ERROR); field = form->current; formwin = Get_Form_Window(form); wmove(form->w, form->currow, form->curcol); if (Has_Invisible_Parts(field)) { /* in this case fieldwin isn't derived from formwin, so we have to move the cursor in formwin by hand... */ wmove(formwin, field->frow + form->currow - form->toprow, field->fcol + form->curcol - form->begincol); wcursyncup(formwin); } else wcursyncup(form->w); return (E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : int _nc_Refresh_Current_Field(FORM * form) | | Description : Propagate the changes in the field's window to the | window of the form. | | Return Values : E_OK - on success | E_BAD_ARGUMENT - invalid form pointer | E_SYSTEM_ERROR - general error +--------------------------------------------------------------------------*/ static bool move_after_insert = TRUE; FORM_EXPORT(int) _nc_Refresh_Current_Field(FORM *form) { WINDOW *formwin; FIELD *field; bool is_public; T((T_CALLED("_nc_Refresh_Current_Field(%p)"), (void *)form)); if (!form) RETURN(E_BAD_ARGUMENT); if (!form->w || !form->current) RETURN(E_SYSTEM_ERROR); field = form->current; formwin = Get_Form_Window(form); is_public = Field_Has_Option(field, O_PUBLIC); if (Is_Scroll_Field(field)) { /* Again, in this case the fieldwin isn't derived from formwin, so we have to perform a copy operation. */ if (Single_Line_Field(field)) { /* horizontal scrolling */ if (form->curcol < form->begincol) form->begincol = form->curcol; else { if (form->curcol >= (form->begincol + field->cols)) form->begincol = form->curcol - field->cols + (move_after_insert ? 1 : 0); } if (is_public) copywin(form->w, formwin, 0, form->begincol, field->frow, field->fcol, field->frow, field->cols + field->fcol - 1, 0); } else { /* A multi-line, i.e. vertical scrolling field */ int first_modified_row, first_unmodified_row; if (field->drows > field->rows) { int row_after_bottom = form->toprow + field->rows; if (form->currow < form->toprow) { form->toprow = form->currow; SetStatus(field, _NEWTOP); } if (form->currow >= row_after_bottom) { form->toprow = form->currow - field->rows + 1; SetStatus(field, _NEWTOP); } if (field->status & _NEWTOP) { /* means we have to copy whole range */ first_modified_row = form->toprow; first_unmodified_row = first_modified_row + field->rows; ClrStatus(field, _NEWTOP); } else { /* we try to optimize : finding the range of touched lines */ first_modified_row = form->toprow; while (first_modified_row < row_after_bottom) { if (is_linetouched(form->w, first_modified_row)) break; first_modified_row++; } first_unmodified_row = first_modified_row; while (first_unmodified_row < row_after_bottom) { if (!is_linetouched(form->w, first_unmodified_row)) break; first_unmodified_row++; } } } else { first_modified_row = form->toprow; first_unmodified_row = first_modified_row + field->rows; } if (first_unmodified_row != first_modified_row && is_public) copywin(form->w, formwin, first_modified_row, 0, field->frow + first_modified_row - form->toprow, field->fcol, field->frow + first_unmodified_row - form->toprow - 1, field->cols + field->fcol - 1, 0); } if (is_public) wsyncup(formwin); } else { /* if the field-window is simply a derived window, i.e. contains no * invisible parts, the whole thing is trivial */ if (is_public) wsyncup(form->w); } untouchwin(form->w); returnCode(_nc_Position_Form_Cursor(form)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void Perform_Justification( | FIELD * field, | WINDOW * win) | | Description : Output field with requested justification | | Return Values : - +--------------------------------------------------------------------------*/ static void Perform_Justification(FIELD *field, WINDOW *win) { FIELD_CELL *bp; int len; bp = (Field_Has_Option(field, O_NO_LEFT_STRIP) ? field->buf : Get_Start_Of_Data(field->buf, Buffer_Length(field))); len = (int)(After_End_Of_Data(field->buf, Buffer_Length(field)) - bp); if (len > 0) { int col = 0; assert(win && (field->drows == 1)); if (field->cols - len >= 0) switch (field->just) { case JUSTIFY_LEFT: break; case JUSTIFY_CENTER: col = (field->cols - len) / 2; break; case JUSTIFY_RIGHT: col = field->cols - len; break; default: break; } wmove(win, 0, col); myADDNSTR(win, bp, len); } } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void Undo_Justification( | FIELD * field, | WINDOW * win) | | Description : Display field without any justification, i.e. | left justified | | Return Values : - +--------------------------------------------------------------------------*/ static void Undo_Justification(FIELD *field, WINDOW *win) { FIELD_CELL *bp; int y, x; int len; getyx(win, y, x); bp = (Field_Has_Option(field, O_NO_LEFT_STRIP) ? field->buf : Get_Start_Of_Data(field->buf, Buffer_Length(field))); len = (int)(After_End_Of_Data(field->buf, Buffer_Length(field)) - bp); if (len > 0) { assert(win); wmove(win, 0, 0); myADDNSTR(win, bp, len); } wmove(win, y, x); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Check_Char(FORM *form, | FIELD *field, | FIELDTYPE * typ, | int ch, | TypeArgument *argp) | | Description : Perform a single character check for character ch | according to the fieldtype instance. | | Return Values : TRUE - Character is valid | FALSE - Character is invalid +--------------------------------------------------------------------------*/ static bool Check_Char(FORM *form, FIELD *field, FIELDTYPE *typ, int ch, TypeArgument *argp) { if (typ) { if (typ->status & _LINKED_TYPE) { assert(argp); return ( Check_Char(form, field, typ->left, ch, argp->left) || Check_Char(form, field, typ->right, ch, argp->right)); } else { #if NCURSES_INTEROP_FUNCS if (typ->charcheck.occheck) { if (typ->status & _GENERIC) return typ->charcheck.gccheck(ch, form, field, (void *)argp); else return typ->charcheck.occheck(ch, (void *)argp); } #else if (typ->ccheck) return typ->ccheck(ch, (void *)argp); #endif } } return (!iscntrl(UChar(ch)) ? TRUE : FALSE); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Display_Or_Erase_Field( | FIELD * field, | bool bEraseFlag) | | Description : Create a subwindow for the field and display the | buffer contents (apply justification if required) | or simply erase the field. | | Return Values : E_OK - on success | E_SYSTEM_ERROR - some error (typical no memory) +--------------------------------------------------------------------------*/ static int Display_Or_Erase_Field(FIELD *field, bool bEraseFlag) { WINDOW *win; WINDOW *fwin; if (!field) return E_SYSTEM_ERROR; fwin = Get_Form_Window(field->form); win = derwin(fwin, field->rows, field->cols, field->frow, field->fcol); if (!win) return E_SYSTEM_ERROR; else { if (Field_Has_Option(field, O_VISIBLE)) { Set_Field_Window_Attributes(field, win); } else { (void)wattrset(win, (int)WINDOW_ATTRS(fwin)); } werase(win); } if (!bEraseFlag) { if (Field_Has_Option(field, O_PUBLIC)) { if (Justification_Allowed(field)) Perform_Justification(field, win); else Buffer_To_Window(field, win); } ClrStatus(field, _NEWTOP); } wsyncup(win); delwin(win); return E_OK; } /* Macros to preset the bEraseFlag */ #define Display_Field(field) Display_Or_Erase_Field(field,FALSE) #define Erase_Field(field) Display_Or_Erase_Field(field,TRUE) /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Synchronize_Field(FIELD * field) | | Description : Synchronize the windows content with the value in | the buffer. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid field pointer | E_SYSTEM_ERROR - some severe basic error +--------------------------------------------------------------------------*/ static int Synchronize_Field(FIELD *field) { FORM *form; int res = E_OK; if (!field) return (E_BAD_ARGUMENT); if (((form = field->form) != (FORM *)0) && Field_Really_Appears(field)) { if (field == form->current) { form->currow = form->curcol = form->toprow = form->begincol = 0; werase(form->w); if ((Field_Has_Option(field, O_PUBLIC)) && Justification_Allowed(field)) Undo_Justification(field, form->w); else Buffer_To_Window(field, form->w); SetStatus(field, _NEWTOP); res = _nc_Refresh_Current_Field(form); } else res = Display_Field(field); } SetStatus(field, _CHANGED); return (res); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Synchronize_Linked_Fields(FIELD * field) | | Description : Propagate the Synchronize_Field function to all linked | fields. The first error that occurs in the sequence | of updates is the return value. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid field pointer | E_SYSTEM_ERROR - some severe basic error +--------------------------------------------------------------------------*/ static int Synchronize_Linked_Fields(FIELD *field) { FIELD *linked_field; int res = E_OK; if (!field) return (E_BAD_ARGUMENT); if (!field->link) return (E_SYSTEM_ERROR); for (linked_field = field->link; (linked_field != field) && (linked_field != 0); linked_field = linked_field->link) { int syncres; if (((syncres = Synchronize_Field(linked_field)) != E_OK) && (res == E_OK)) res = syncres; } return (res); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : int _nc_Synchronize_Attributes(FIELD * field) | | Description : If a field's visual attributes have changed, this | routine is called to propagate those changes to the | screen. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid field pointer | E_SYSTEM_ERROR - some severe basic error +--------------------------------------------------------------------------*/ FORM_EXPORT(int) _nc_Synchronize_Attributes(FIELD *field) { FORM *form; int res = E_OK; T((T_CALLED("_nc_Synchronize_Attributes(%p)"), (void *)field)); if (!field) returnCode(E_BAD_ARGUMENT); CHECKPOS(field->form); if (((form = field->form) != (FORM *)0) && Field_Really_Appears(field)) { if (form->current == field) { Synchronize_Buffer(form); Set_Field_Window_Attributes(field, form->w); werase(form->w); wmove(form->w, form->currow, form->curcol); if (Field_Has_Option(field, O_PUBLIC)) { if (Justification_Allowed(field)) Undo_Justification(field, form->w); else Buffer_To_Window(field, form->w); } else { WINDOW *formwin = Get_Form_Window(form); copywin(form->w, formwin, 0, 0, field->frow, field->fcol, field->frow + field->rows - 1, field->fcol + field->cols - 1, 0); wsyncup(formwin); Buffer_To_Window(field, form->w); SetStatus(field, _NEWTOP); /* fake refresh to paint all */ _nc_Refresh_Current_Field(form); } } else { res = Display_Field(field); } } CHECKPOS(form); returnCode(res); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : int _nc_Synchronize_Options(FIELD * field, | Field_Options newopts) | | Description : If a field's options have changed, this routine is | called to propagate these changes to the screen and | to really change the behavior of the field. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid field pointer | E_CURRENT - field is the current one | E_SYSTEM_ERROR - some severe basic error +--------------------------------------------------------------------------*/ FORM_EXPORT(int) _nc_Synchronize_Options(FIELD *field, Field_Options newopts) { Field_Options oldopts; Field_Options changed_opts; FORM *form; int res = E_OK; T((T_CALLED("_nc_Synchronize_Options(%p,%#x)"), (void *)field, newopts)); if (!field) returnCode(E_BAD_ARGUMENT); oldopts = field->opts; changed_opts = oldopts ^ newopts; field->opts = newopts; form = field->form; if (form) { if (form->status & _POSTED) { if (form->current == field) { field->opts = oldopts; returnCode(E_CURRENT); } if (form->curpage == field->page) { if ((unsigned)changed_opts & O_VISIBLE) { if ((unsigned)newopts & O_VISIBLE) res = Display_Field(field); else res = Erase_Field(field); } else { if (((unsigned)changed_opts & O_PUBLIC) && ((unsigned)newopts & O_VISIBLE)) res = Display_Field(field); } } } } if ((unsigned)changed_opts & O_STATIC) { bool single_line_field = Single_Line_Field(field); int res2 = E_OK; if ((unsigned)newopts & O_STATIC) { /* the field becomes now static */ ClrStatus(field, _MAY_GROW); /* if actually we have no hidden columns, justification may occur again */ if (single_line_field && (field->cols == field->dcols) && (field->just != NO_JUSTIFICATION) && Field_Really_Appears(field)) { res2 = Display_Field(field); } } else { /* field is no longer static */ if ((field->maxgrow == 0) || (single_line_field && (field->dcols < field->maxgrow)) || (!single_line_field && (field->drows < field->maxgrow))) { SetStatus(field, _MAY_GROW); /* a field with justification now changes its behavior, so we must redisplay it */ if (single_line_field && (field->just != NO_JUSTIFICATION) && Field_Really_Appears(field)) { res2 = Display_Field(field); } } } if (res2 != E_OK) res = res2; } returnCode(res); } /* * Removes the focus from the current field of the form. */ void _nc_Unset_Current_Field(FORM *form) { FIELD *field = form->current; _nc_Refresh_Current_Field(form); if (Field_Has_Option(field, O_PUBLIC)) { if (field->drows > field->rows) { if (form->toprow == 0) ClrStatus(field, _NEWTOP); else SetStatus(field, _NEWTOP); } else { if (Justification_Allowed(field)) { Window_To_Buffer(form, field); werase(form->w); Perform_Justification(field, form->w); if (Field_Has_Option(field, O_DYNAMIC_JUSTIFY) && (form->w->_parent == 0)) { copywin(form->w, Get_Form_Window(form), 0, 0, field->frow, field->fcol, field->frow, field->cols + field->fcol - 1, 0); wsyncup(Get_Form_Window(form)); } else { wsyncup(form->w); } } } } delwin(form->w); form->w = (WINDOW *)0; form->current = 0; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : int _nc_Set_Current_Field(FORM * form, | FIELD * newfield) | | Description : Make the newfield the new current field. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid form or field pointer | E_SYSTEM_ERROR - some severe basic error | E_NOT_CONNECTED - no fields are connected to the form +--------------------------------------------------------------------------*/ FORM_EXPORT(int) _nc_Set_Current_Field(FORM *form, FIELD *newfield) { FIELD *field; WINDOW *new_window; T((T_CALLED("_nc_Set_Current_Field(%p,%p)"), (void *)form, (void *)newfield)); if (!form || !newfield || (newfield->form != form)) returnCode(E_BAD_ARGUMENT); if ((form->status & _IN_DRIVER)) returnCode(E_BAD_STATE); if (!(form->field)) returnCode(E_NOT_CONNECTED); field = form->current; if ((field != newfield) || !(form->status & _POSTED)) { if (field && (form->w) && (Field_Has_Option(field, O_VISIBLE)) && (field->form->curpage == field->page)) _nc_Unset_Current_Field(form); field = newfield; if (Has_Invisible_Parts(field)) new_window = newpad(field->drows, field->dcols); else new_window = derwin(Get_Form_Window(form), field->rows, field->cols, field->frow, field->fcol); if (!new_window) returnCode(E_SYSTEM_ERROR); form->current = field; if (form->w) delwin(form->w); form->w = new_window; ClrStatus(form, _WINDOW_MODIFIED); Set_Field_Window_Attributes(field, form->w); if (Has_Invisible_Parts(field)) { werase(form->w); Buffer_To_Window(field, form->w); } else { if (Justification_Allowed(field)) { werase(form->w); Undo_Justification(field, form->w); wsyncup(form->w); } } untouchwin(form->w); } form->currow = form->curcol = form->toprow = form->begincol = 0; returnCode(E_OK); } /*---------------------------------------------------------------------------- Intra-Field Navigation routines --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Next_Character(FORM * form) | | Description : Move to the next character in the field. In a multi-line | field this wraps at the end of the line. | | Return Values : E_OK - success | E_REQUEST_DENIED - at the rightmost position +--------------------------------------------------------------------------*/ static int IFN_Next_Character(FORM *form) { FIELD *field = form->current; int step = myWCWIDTH(form->w, form->currow, form->curcol); T((T_CALLED("IFN_Next_Character(%p)"), (void *)form)); if ((form->curcol += step) == field->dcols) { if ((++(form->currow)) == field->drows) { #if GROW_IF_NAVIGATE if (!Single_Line_Field(field) && Field_Grown(field, 1)) { form->curcol = 0; returnCode(E_OK); } #endif form->currow--; #if GROW_IF_NAVIGATE if (Single_Line_Field(field) && Field_Grown(field, 1)) returnCode(E_OK); #endif form->curcol -= step; returnCode(E_REQUEST_DENIED); } form->curcol = 0; } returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Previous_Character(FORM * form) | | Description : Move to the previous character in the field. In a | multi-line field this wraps and the beginning of the | line. | | Return Values : E_OK - success | E_REQUEST_DENIED - at the leftmost position +--------------------------------------------------------------------------*/ static int IFN_Previous_Character(FORM *form) { int amount = myWCWIDTH(form->w, form->currow, form->curcol - 1); int oldcol = form->curcol; T((T_CALLED("IFN_Previous_Character(%p)"), (void *)form)); if ((form->curcol -= amount) < 0) { if ((--(form->currow)) < 0) { form->currow++; form->curcol = oldcol; returnCode(E_REQUEST_DENIED); } form->curcol = form->current->dcols - 1; } returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Next_Line(FORM * form) | | Description : Move to the beginning of the next line in the field | | Return Values : E_OK - success | E_REQUEST_DENIED - at the last line +--------------------------------------------------------------------------*/ static int IFN_Next_Line(FORM *form) { FIELD *field = form->current; T((T_CALLED("IFN_Next_Line(%p)"), (void *)form)); if ((++(form->currow)) == field->drows) { #if GROW_IF_NAVIGATE if (!Single_Line_Field(field) && Field_Grown(field, 1)) returnCode(E_OK); #endif form->currow--; returnCode(E_REQUEST_DENIED); } form->curcol = 0; returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Previous_Line(FORM * form) | | Description : Move to the beginning of the previous line in the field | | Return Values : E_OK - success | E_REQUEST_DENIED - at the first line +--------------------------------------------------------------------------*/ static int IFN_Previous_Line(FORM *form) { T((T_CALLED("IFN_Previous_Line(%p)"), (void *)form)); if ((--(form->currow)) < 0) { form->currow++; returnCode(E_REQUEST_DENIED); } form->curcol = 0; returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Next_Word(FORM * form) | | Description : Move to the beginning of the next word in the field. | | Return Values : E_OK - success | E_REQUEST_DENIED - there is no next word +--------------------------------------------------------------------------*/ static int IFN_Next_Word(FORM *form) { FIELD *field = form->current; FIELD_CELL *bp = Address_Of_Current_Position_In_Buffer(form); FIELD_CELL *s; FIELD_CELL *t; T((T_CALLED("IFN_Next_Word(%p)"), (void *)form)); /* We really need access to the data, so we have to synchronize */ Synchronize_Buffer(form); /* Go to the first whitespace after the current position (including current position). This is then the starting point to look for the next non-blank data */ s = Get_First_Whitespace_Character(bp, Buffer_Length(field) - (int)(bp - field->buf)); /* Find the start of the next word */ t = Get_Start_Of_Data(s, Buffer_Length(field) - (int)(s - field->buf)); #if !FRIENDLY_PREV_NEXT_WORD if (s == t) returnCode(E_REQUEST_DENIED); else #endif { Adjust_Cursor_Position(form, t); returnCode(E_OK); } } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Previous_Word(FORM * form) | | Description : Move to the beginning of the previous word in the field. | | Return Values : E_OK - success | E_REQUEST_DENIED - there is no previous word +--------------------------------------------------------------------------*/ static int IFN_Previous_Word(FORM *form) { FIELD *field = form->current; FIELD_CELL *bp = Address_Of_Current_Position_In_Buffer(form); FIELD_CELL *s; FIELD_CELL *t; bool again = FALSE; T((T_CALLED("IFN_Previous_Word(%p)"), (void *)form)); /* We really need access to the data, so we have to synchronize */ Synchronize_Buffer(form); s = After_End_Of_Data(field->buf, (int)(bp - field->buf)); /* s points now right after the last non-blank in the buffer before bp. If bp was in a word, s equals bp. In this case we must find the last whitespace in the buffer before bp and repeat the game to really find the previous word! */ if (s == bp) again = TRUE; /* And next call now goes backward to look for the last whitespace before that, pointing right after this, so it points to the begin of the previous word. */ t = After_Last_Whitespace_Character(field->buf, (int)(s - field->buf)); #if !FRIENDLY_PREV_NEXT_WORD if (s == t) returnCode(E_REQUEST_DENIED); #endif if (again) { /* and do it again, replacing bp by t */ s = After_End_Of_Data(field->buf, (int)(t - field->buf)); t = After_Last_Whitespace_Character(field->buf, (int)(s - field->buf)); #if !FRIENDLY_PREV_NEXT_WORD if (s == t) returnCode(E_REQUEST_DENIED); #endif } Adjust_Cursor_Position(form, t); returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Beginning_Of_Field(FORM * form) | | Description : Place the cursor at the first non-pad character in | the field. | | Return Values : E_OK - success +--------------------------------------------------------------------------*/ static int IFN_Beginning_Of_Field(FORM *form) { FIELD *field = form->current; T((T_CALLED("IFN_Beginning_Of_Field(%p)"), (void *)form)); Synchronize_Buffer(form); Adjust_Cursor_Position(form, Get_Start_Of_Data(field->buf, Buffer_Length(field))); returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_End_Of_Field(FORM * form) | | Description : Place the cursor after the last non-pad character in | the field. If the field occupies the last position in | the buffer, the cursor is positioned on the last | character. | | Return Values : E_OK - success +--------------------------------------------------------------------------*/ static int IFN_End_Of_Field(FORM *form) { FIELD *field = form->current; FIELD_CELL *pos; T((T_CALLED("IFN_End_Of_Field(%p)"), (void *)form)); Synchronize_Buffer(form); pos = After_End_Of_Data(field->buf, Buffer_Length(field)); if (pos == (field->buf + Buffer_Length(field))) pos--; Adjust_Cursor_Position(form, pos); returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Beginning_Of_Line(FORM * form) | | Description : Place the cursor on the first non-pad character in | the current line of the field. | | Return Values : E_OK - success +--------------------------------------------------------------------------*/ static int IFN_Beginning_Of_Line(FORM *form) { FIELD *field = form->current; T((T_CALLED("IFN_Beginning_Of_Line(%p)"), (void *)form)); Synchronize_Buffer(form); Adjust_Cursor_Position(form, Get_Start_Of_Data(Address_Of_Current_Row_In_Buffer(form), field->dcols)); returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_End_Of_Line(FORM * form) | | Description : Place the cursor after the last non-pad character in the | current line of the field. If the field occupies the | last column in the line, the cursor is positioned on the | last character of the line. | | Return Values : E_OK - success +--------------------------------------------------------------------------*/ static int IFN_End_Of_Line(FORM *form) { FIELD *field = form->current; FIELD_CELL *pos; FIELD_CELL *bp; T((T_CALLED("IFN_End_Of_Line(%p)"), (void *)form)); Synchronize_Buffer(form); bp = Address_Of_Current_Row_In_Buffer(form); pos = After_End_Of_Data(bp, field->dcols); if (pos == (bp + field->dcols)) pos--; Adjust_Cursor_Position(form, pos); returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Left_Character(FORM * form) | | Description : Move one character to the left in the current line. | This doesn't cycle. | | Return Values : E_OK - success | E_REQUEST_DENIED - already in first column +--------------------------------------------------------------------------*/ static int IFN_Left_Character(FORM *form) { int amount = myWCWIDTH(form->w, form->currow, form->curcol - 1); int oldcol = form->curcol; T((T_CALLED("IFN_Left_Character(%p)"), (void *)form)); if ((form->curcol -= amount) < 0) { form->curcol = oldcol; returnCode(E_REQUEST_DENIED); } returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Right_Character(FORM * form) | | Description : Move one character to the right in the current line. | This doesn't cycle. | | Return Values : E_OK - success | E_REQUEST_DENIED - already in last column +--------------------------------------------------------------------------*/ static int IFN_Right_Character(FORM *form) { int amount = myWCWIDTH(form->w, form->currow, form->curcol); int oldcol = form->curcol; T((T_CALLED("IFN_Right_Character(%p)"), (void *)form)); if ((form->curcol += amount) >= form->current->dcols) { #if GROW_IF_NAVIGATE FIELD *field = form->current; if (Single_Line_Field(field) && Field_Grown(field, 1)) returnCode(E_OK); #endif form->curcol = oldcol; returnCode(E_REQUEST_DENIED); } returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Up_Character(FORM * form) | | Description : Move one line up. This doesn't cycle through the lines | of the field. | | Return Values : E_OK - success | E_REQUEST_DENIED - already in last column +--------------------------------------------------------------------------*/ static int IFN_Up_Character(FORM *form) { T((T_CALLED("IFN_Up_Character(%p)"), (void *)form)); if ((--(form->currow)) < 0) { form->currow++; returnCode(E_REQUEST_DENIED); } returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int IFN_Down_Character(FORM * form) | | Description : Move one line down. This doesn't cycle through the | lines of the field. | | Return Values : E_OK - success | E_REQUEST_DENIED - already in last column +--------------------------------------------------------------------------*/ static int IFN_Down_Character(FORM *form) { FIELD *field = form->current; T((T_CALLED("IFN_Down_Character(%p)"), (void *)form)); if ((++(form->currow)) == field->drows) { #if GROW_IF_NAVIGATE if (!Single_Line_Field(field) && Field_Grown(field, 1)) returnCode(E_OK); #endif --(form->currow); returnCode(E_REQUEST_DENIED); } returnCode(E_OK); } /*---------------------------------------------------------------------------- END of Intra-Field Navigation routines --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Vertical scrolling helper routines --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int VSC_Generic(FORM *form, int nlines) | | Description : Scroll multi-line field forward (nlines>0) or | backward (nlines<0) this many lines. | | Return Values : E_OK - success | E_REQUEST_DENIED - can't scroll +--------------------------------------------------------------------------*/ static int VSC_Generic(FORM *form, int nlines) { FIELD *field = form->current; int res = E_REQUEST_DENIED; int rows_to_go = (nlines > 0 ? nlines : -nlines); if (nlines > 0) { if ((rows_to_go + form->toprow) > (field->drows - field->rows)) rows_to_go = (field->drows - field->rows - form->toprow); if (rows_to_go > 0) { form->currow += rows_to_go; form->toprow += rows_to_go; res = E_OK; } } else { if (rows_to_go > form->toprow) rows_to_go = form->toprow; if (rows_to_go > 0) { form->currow -= rows_to_go; form->toprow -= rows_to_go; res = E_OK; } } return (res); } /*---------------------------------------------------------------------------- End of Vertical scrolling helper routines --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Vertical scrolling routines --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Vertical_Scrolling( | int (* const fct) (FORM *), | FORM * form) | | Description : Performs the generic vertical scrolling routines. | This has to check for a multi-line field and to set | the _NEWTOP flag if scrolling really occurred. | | Return Values : Propagated error code from low-level driver calls +--------------------------------------------------------------------------*/ static int Vertical_Scrolling(int (*const fct) (FORM *), FORM *form) { int res = E_REQUEST_DENIED; if (!Single_Line_Field(form->current)) { res = fct(form); if (res == E_OK) SetStatus(form->current, _NEWTOP); } return (res); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int VSC_Scroll_Line_Forward(FORM * form) | | Description : Scroll multi-line field forward a line | | Return Values : E_OK - success | E_REQUEST_DENIED - no data ahead +--------------------------------------------------------------------------*/ static int VSC_Scroll_Line_Forward(FORM *form) { T((T_CALLED("VSC_Scroll_Line_Forward(%p)"), (void *)form)); returnCode(VSC_Generic(form, 1)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int VSC_Scroll_Line_Backward(FORM * form) | | Description : Scroll multi-line field backward a line | | Return Values : E_OK - success | E_REQUEST_DENIED - no data behind +--------------------------------------------------------------------------*/ static int VSC_Scroll_Line_Backward(FORM *form) { T((T_CALLED("VSC_Scroll_Line_Backward(%p)"), (void *)form)); returnCode(VSC_Generic(form, -1)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int VSC_Scroll_Page_Forward(FORM * form) | | Description : Scroll a multi-line field forward a page | | Return Values : E_OK - success | E_REQUEST_DENIED - no data ahead +--------------------------------------------------------------------------*/ static int VSC_Scroll_Page_Forward(FORM *form) { T((T_CALLED("VSC_Scroll_Page_Forward(%p)"), (void *)form)); returnCode(VSC_Generic(form, form->current->rows)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int VSC_Scroll_Half_Page_Forward(FORM * form) | | Description : Scroll a multi-line field forward half a page | | Return Values : E_OK - success | E_REQUEST_DENIED - no data ahead +--------------------------------------------------------------------------*/ static int VSC_Scroll_Half_Page_Forward(FORM *form) { T((T_CALLED("VSC_Scroll_Half_Page_Forward(%p)"), (void *)form)); returnCode(VSC_Generic(form, (form->current->rows + 1) / 2)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int VSC_Scroll_Page_Backward(FORM * form) | | Description : Scroll a multi-line field backward a page | | Return Values : E_OK - success | E_REQUEST_DENIED - no data behind +--------------------------------------------------------------------------*/ static int VSC_Scroll_Page_Backward(FORM *form) { T((T_CALLED("VSC_Scroll_Page_Backward(%p)"), (void *)form)); returnCode(VSC_Generic(form, -(form->current->rows))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int VSC_Scroll_Half_Page_Backward(FORM * form) | | Description : Scroll a multi-line field backward half a page | | Return Values : E_OK - success | E_REQUEST_DENIED - no data behind +--------------------------------------------------------------------------*/ static int VSC_Scroll_Half_Page_Backward(FORM *form) { T((T_CALLED("VSC_Scroll_Half_Page_Backward(%p)"), (void *)form)); returnCode(VSC_Generic(form, -((form->current->rows + 1) / 2))); } /*---------------------------------------------------------------------------- End of Vertical scrolling routines --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Horizontal scrolling helper routines --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int HSC_Generic(FORM *form, int ncolumns) | | Description : Scroll single-line field forward (ncolumns>0) or | backward (ncolumns<0) this many columns. | | Return Values : E_OK - success | E_REQUEST_DENIED - can't scroll +--------------------------------------------------------------------------*/ static int HSC_Generic(FORM *form, int ncolumns) { FIELD *field = form->current; int res = E_REQUEST_DENIED; int cols_to_go = (ncolumns > 0 ? ncolumns : -ncolumns); if (ncolumns > 0) { if ((cols_to_go + form->begincol) > (field->dcols - field->cols)) cols_to_go = field->dcols - field->cols - form->begincol; if (cols_to_go > 0) { form->curcol += cols_to_go; form->begincol += cols_to_go; res = E_OK; } } else { if (cols_to_go > form->begincol) cols_to_go = form->begincol; if (cols_to_go > 0) { form->curcol -= cols_to_go; form->begincol -= cols_to_go; res = E_OK; } } return (res); } /*---------------------------------------------------------------------------- End of Horizontal scrolling helper routines --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Horizontal scrolling routines --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Horizontal_Scrolling( | int (* const fct) (FORM *), | FORM * form) | | Description : Performs the generic horizontal scrolling routines. | This has to check for a single-line field. | | Return Values : Propagated error code from low-level driver calls +--------------------------------------------------------------------------*/ static int Horizontal_Scrolling(int (*const fct) (FORM *), FORM *form) { if (Single_Line_Field(form->current)) return fct(form); else return (E_REQUEST_DENIED); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int HSC_Scroll_Char_Forward(FORM * form) | | Description : Scroll single-line field forward a character | | Return Values : E_OK - success | E_REQUEST_DENIED - no data ahead +--------------------------------------------------------------------------*/ static int HSC_Scroll_Char_Forward(FORM *form) { T((T_CALLED("HSC_Scroll_Char_Forward(%p)"), (void *)form)); returnCode(HSC_Generic(form, 1)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int HSC_Scroll_Char_Backward(FORM * form) | | Description : Scroll single-line field backward a character | | Return Values : E_OK - success | E_REQUEST_DENIED - no data behind +--------------------------------------------------------------------------*/ static int HSC_Scroll_Char_Backward(FORM *form) { T((T_CALLED("HSC_Scroll_Char_Backward(%p)"), (void *)form)); returnCode(HSC_Generic(form, -1)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int HSC_Horizontal_Line_Forward(FORM* form) | | Description : Scroll single-line field forward a line | | Return Values : E_OK - success | E_REQUEST_DENIED - no data ahead +--------------------------------------------------------------------------*/ static int HSC_Horizontal_Line_Forward(FORM *form) { T((T_CALLED("HSC_Horizontal_Line_Forward(%p)"), (void *)form)); returnCode(HSC_Generic(form, form->current->cols)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int HSC_Horizontal_Half_Line_Forward(FORM* form) | | Description : Scroll single-line field forward half a line | | Return Values : E_OK - success | E_REQUEST_DENIED - no data ahead +--------------------------------------------------------------------------*/ static int HSC_Horizontal_Half_Line_Forward(FORM *form) { T((T_CALLED("HSC_Horizontal_Half_Line_Forward(%p)"), (void *)form)); returnCode(HSC_Generic(form, (form->current->cols + 1) / 2)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int HSC_Horizontal_Line_Backward(FORM* form) | | Description : Scroll single-line field backward a line | | Return Values : E_OK - success | E_REQUEST_DENIED - no data behind +--------------------------------------------------------------------------*/ static int HSC_Horizontal_Line_Backward(FORM *form) { T((T_CALLED("HSC_Horizontal_Line_Backward(%p)"), (void *)form)); returnCode(HSC_Generic(form, -(form->current->cols))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int HSC_Horizontal_Half_Line_Backward(FORM* form) | | Description : Scroll single-line field backward half a line | | Return Values : E_OK - success | E_REQUEST_DENIED - no data behind +--------------------------------------------------------------------------*/ static int HSC_Horizontal_Half_Line_Backward(FORM *form) { T((T_CALLED("HSC_Horizontal_Half_Line_Backward(%p)"), (void *)form)); returnCode(HSC_Generic(form, -((form->current->cols + 1) / 2))); } /*---------------------------------------------------------------------------- End of Horizontal scrolling routines --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Helper routines for Field Editing --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Is_There_Room_For_A_Line(FORM * form) | | Description : Check whether or not there is enough room in the | buffer to enter a whole line. | | Return Values : TRUE - there is enough space | FALSE - there is not enough space +--------------------------------------------------------------------------*/ NCURSES_INLINE static bool Is_There_Room_For_A_Line(FORM *form) { FIELD *field = form->current; FIELD_CELL *begin_of_last_line, *s; Synchronize_Buffer(form); begin_of_last_line = Address_Of_Row_In_Buffer(field, (field->drows - 1)); s = After_End_Of_Data(begin_of_last_line, field->dcols); return ((s == begin_of_last_line) ? TRUE : FALSE); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Is_There_Room_For_A_Char_In_Line(FORM * form) | | Description : Checks whether or not there is room for a new character | in the current line. | | Return Values : TRUE - there is room | FALSE - there is not enough room (line full) +--------------------------------------------------------------------------*/ NCURSES_INLINE static bool Is_There_Room_For_A_Char_In_Line(FORM *form) { int last_char_in_line; wmove(form->w, form->currow, form->current->dcols - 1); last_char_in_line = (int)(winch(form->w) & A_CHARTEXT); wmove(form->w, form->currow, form->curcol); return (((last_char_in_line == form->current->pad) || is_blank(last_char_in_line)) ? TRUE : FALSE); } #define There_Is_No_Room_For_A_Char_In_Line(f) \ !Is_There_Room_For_A_Char_In_Line(f) /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Insert_String( | FORM * form, | int row, | char *txt, | int len ) | | Description : Insert the 'len' characters beginning at pointer 'txt' | into the 'row' of the 'form'. The insertion occurs | on the beginning of the row, all other characters are | moved to the right. After the text a pad character will | be inserted to separate the text from the rest. If | necessary the insertion moves characters on the next | line to make place for the requested insertion string. | | Return Values : E_OK - success | E_REQUEST_DENIED - | E_SYSTEM_ERROR - system error +--------------------------------------------------------------------------*/ static int Insert_String(FORM *form, int row, FIELD_CELL *txt, int len) { FIELD *field = form->current; FIELD_CELL *bp = Address_Of_Row_In_Buffer(field, row); int datalen = (int)(After_End_Of_Data(bp, field->dcols) - bp); int freelen = field->dcols - datalen; int requiredlen = len + 1; int result = E_REQUEST_DENIED; if (freelen >= requiredlen) { wmove(form->w, row, 0); myINSNSTR(form->w, txt, len); wmove(form->w, row, len); myINSNSTR(form->w, &myBLANK, 1); result = E_OK; } else { /* we have to move characters on the next line. If we are on the last line this may work, if the field is growable */ if ((row == (field->drows - 1)) && Growable(field)) { if (!Field_Grown(field, 1)) return (E_SYSTEM_ERROR); /* !!!Side-Effect : might be changed due to growth!!! */ bp = Address_Of_Row_In_Buffer(field, row); } if (row < (field->drows - 1)) { FIELD_CELL *split; split = After_Last_Whitespace_Character(bp, (int)(Get_Start_Of_Data(bp + field->dcols - requiredlen, requiredlen) - bp)); /* split points now to the first character of the portion of the line that must be moved to the next line */ datalen = (int)(split - bp); /* + freelen has to stay on this line */ freelen = field->dcols - (datalen + freelen); /* for the next line */ if ((result = Insert_String(form, row + 1, split, freelen)) == E_OK) { wmove(form->w, row, datalen); wclrtoeol(form->w); wmove(form->w, row, 0); myINSNSTR(form->w, txt, len); wmove(form->w, row, len); myINSNSTR(form->w, &myBLANK, 1); return E_OK; } } } return (result); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Wrapping_Not_Necessary_Or_Wrapping_Ok( | FORM * form) | | Description : If a character has been entered into a field, it may | be that wrapping has to occur. This routine checks | whether or not wrapping is required and if so, performs | the wrapping. | | Return Values : E_OK - no wrapping required or wrapping | was successful | E_REQUEST_DENIED - | E_SYSTEM_ERROR - some system error +--------------------------------------------------------------------------*/ static int Wrapping_Not_Necessary_Or_Wrapping_Ok(FORM *form) { FIELD *field = form->current; int result = E_REQUEST_DENIED; bool Last_Row = ((field->drows - 1) == form->currow); if ((Field_Has_Option(field, O_WRAP)) && /* wrapping wanted */ (!Single_Line_Field(field)) && /* must be multi-line */ (There_Is_No_Room_For_A_Char_In_Line(form)) && /* line is full */ (!Last_Row || Growable(field))) /* there are more lines */ { FIELD_CELL *bp; FIELD_CELL *split; int chars_to_be_wrapped; int chars_to_remain_on_line; if (Last_Row) { /* the above logic already ensures, that in this case the field is growable */ if (!Field_Grown(field, 1)) return E_SYSTEM_ERROR; } bp = Address_Of_Current_Row_In_Buffer(form); Window_To_Buffer(form, field); split = After_Last_Whitespace_Character(bp, field->dcols); /* split points to the first character of the sequence to be brought on the next line */ chars_to_remain_on_line = (int)(split - bp); chars_to_be_wrapped = field->dcols - chars_to_remain_on_line; if (chars_to_remain_on_line > 0) { if ((result = Insert_String(form, form->currow + 1, split, chars_to_be_wrapped)) == E_OK) { wmove(form->w, form->currow, chars_to_remain_on_line); wclrtoeol(form->w); if (form->curcol >= chars_to_remain_on_line) { form->currow++; form->curcol -= chars_to_remain_on_line; } return E_OK; } } else return E_OK; if (result != E_OK) { DeleteChar(form); Window_To_Buffer(form, field); result = E_REQUEST_DENIED; } } else result = E_OK; /* wrapping was not necessary */ return (result); } /*---------------------------------------------------------------------------- Field Editing routines --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Field_Editing( | int (* const fct) (FORM *), | FORM * form) | | Description : Generic routine for field editing requests. The driver | routines are only called for editable fields, the | _WINDOW_MODIFIED flag is set if editing occurred. | This is somewhat special due to the overload semantics | of the NEW_LINE and DEL_PREV requests. | | Return Values : Error code from low level drivers. +--------------------------------------------------------------------------*/ static int Field_Editing(int (*const fct) (FORM *), FORM *form) { int res = E_REQUEST_DENIED; /* We have to deal here with the specific case of the overloaded behavior of New_Line and Delete_Previous requests. They may end up in navigational requests if we are on the first character in a field. But navigation is also allowed on non- editable fields. */ if ((fct == FE_Delete_Previous) && ((unsigned)form->opts & O_BS_OVERLOAD) && First_Position_In_Current_Field(form)) { res = Inter_Field_Navigation(FN_Previous_Field, form); } else { if (fct == FE_New_Line) { if (((unsigned)form->opts & O_NL_OVERLOAD) && First_Position_In_Current_Field(form)) { res = Inter_Field_Navigation(FN_Next_Field, form); } else /* FE_New_Line deals itself with the _WINDOW_MODIFIED flag */ res = fct(form); } else { /* From now on, everything must be editable */ if ((unsigned)form->current->opts & O_EDIT) { res = fct(form); if (res == E_OK) SetStatus(form, _WINDOW_MODIFIED); } } } return res; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FE_New_Line(FORM * form) | | Description : Perform a new line request. This is rather complex | compared to other routines in this code due to the | rather difficult to understand description in the | manuals. | | Return Values : E_OK - success | E_REQUEST_DENIED - new line not allowed | E_SYSTEM_ERROR - system error +--------------------------------------------------------------------------*/ static int FE_New_Line(FORM *form) { FIELD *field = form->current; FIELD_CELL *bp, *t; bool Last_Row = ((field->drows - 1) == form->currow); T((T_CALLED("FE_New_Line(%p)"), (void *)form)); if (form->status & _OVLMODE) { if (Last_Row && (!(Growable(field) && !Single_Line_Field(field)))) { if (!((unsigned)form->opts & O_NL_OVERLOAD)) returnCode(E_REQUEST_DENIED); wmove(form->w, form->currow, form->curcol); wclrtoeol(form->w); /* we have to set this here, although it is also handled in the generic routine. The reason is, that FN_Next_Field may fail, but the form is definitively changed */ SetStatus(form, _WINDOW_MODIFIED); returnCode(Inter_Field_Navigation(FN_Next_Field, form)); } else { if (Last_Row && !Field_Grown(field, 1)) { /* N.B.: due to the logic in the 'if', LastRow==TRUE means here that the field is growable and not a single-line field */ returnCode(E_SYSTEM_ERROR); } wmove(form->w, form->currow, form->curcol); wclrtoeol(form->w); form->currow++; form->curcol = 0; SetStatus(form, _WINDOW_MODIFIED); returnCode(E_OK); } } else { /* Insert Mode */ if (Last_Row && !(Growable(field) && !Single_Line_Field(field))) { if (!((unsigned)form->opts & O_NL_OVERLOAD)) returnCode(E_REQUEST_DENIED); returnCode(Inter_Field_Navigation(FN_Next_Field, form)); } else { bool May_Do_It = !Last_Row && Is_There_Room_For_A_Line(form); if (!(May_Do_It || Growable(field))) returnCode(E_REQUEST_DENIED); if (!May_Do_It && !Field_Grown(field, 1)) returnCode(E_SYSTEM_ERROR); bp = Address_Of_Current_Position_In_Buffer(form); t = After_End_Of_Data(bp, field->dcols - form->curcol); wmove(form->w, form->currow, form->curcol); wclrtoeol(form->w); form->currow++; form->curcol = 0; wmove(form->w, form->currow, form->curcol); winsertln(form->w); myADDNSTR(form->w, bp, (int)(t - bp)); SetStatus(form, _WINDOW_MODIFIED); returnCode(E_OK); } } } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FE_Insert_Character(FORM * form) | | Description : Insert blank character at the cursor position | | Return Values : E_OK | E_REQUEST_DENIED +--------------------------------------------------------------------------*/ static int FE_Insert_Character(FORM *form) { FIELD *field = form->current; int result = E_REQUEST_DENIED; T((T_CALLED("FE_Insert_Character(%p)"), (void *)form)); if (Check_Char(form, field, field->type, (int)C_BLANK, (TypeArgument *)(field->arg))) { bool There_Is_Room = Is_There_Room_For_A_Char_In_Line(form); if (There_Is_Room || ((Single_Line_Field(field) && Growable(field)))) { if (!There_Is_Room && !Field_Grown(field, 1)) result = E_SYSTEM_ERROR; else { winsch(form->w, (chtype)C_BLANK); result = Wrapping_Not_Necessary_Or_Wrapping_Ok(form); } } } returnCode(result); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FE_Insert_Line(FORM * form) | | Description : Insert a blank line at the cursor position | | Return Values : E_OK - success | E_REQUEST_DENIED - line can not be inserted +--------------------------------------------------------------------------*/ static int FE_Insert_Line(FORM *form) { FIELD *field = form->current; int result = E_REQUEST_DENIED; T((T_CALLED("FE_Insert_Line(%p)"), (void *)form)); if (Check_Char(form, field, field->type, (int)C_BLANK, (TypeArgument *)(field->arg))) { bool Maybe_Done = (form->currow != (field->drows - 1)) && Is_There_Room_For_A_Line(form); if (!Single_Line_Field(field) && (Maybe_Done || Growable(field))) { if (!Maybe_Done && !Field_Grown(field, 1)) result = E_SYSTEM_ERROR; else { form->curcol = 0; winsertln(form->w); result = E_OK; } } } returnCode(result); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FE_Delete_Character(FORM * form) | | Description : Delete character at the cursor position | | Return Values : E_OK - success +--------------------------------------------------------------------------*/ static int FE_Delete_Character(FORM *form) { T((T_CALLED("FE_Delete_Character(%p)"), (void *)form)); DeleteChar(form); returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FE_Delete_Previous(FORM * form) | | Description : Delete character before cursor. Again this is a rather | difficult piece compared to others due to the overloading | semantics of backspace. | N.B.: The case of overloaded BS on first field position | is already handled in the generic routine. | | Return Values : E_OK - success | E_REQUEST_DENIED - Character can't be deleted +--------------------------------------------------------------------------*/ static int FE_Delete_Previous(FORM *form) { FIELD *field = form->current; T((T_CALLED("FE_Delete_Previous(%p)"), (void *)form)); if (First_Position_In_Current_Field(form)) returnCode(E_REQUEST_DENIED); if ((--(form->curcol)) < 0) { FIELD_CELL *this_line, *prev_line, *prev_end, *this_end; int this_row = form->currow; form->curcol++; if (form->status & _OVLMODE) returnCode(E_REQUEST_DENIED); prev_line = Address_Of_Row_In_Buffer(field, (form->currow - 1)); this_line = Address_Of_Row_In_Buffer(field, (form->currow)); Synchronize_Buffer(form); prev_end = After_End_Of_Data(prev_line, field->dcols); this_end = After_End_Of_Data(this_line, field->dcols); if ((int)(this_end - this_line) > (field->cols - (int)(prev_end - prev_line))) returnCode(E_REQUEST_DENIED); wmove(form->w, form->currow, form->curcol); wdeleteln(form->w); Adjust_Cursor_Position(form, prev_end); /* * If we did not really move to the previous line, help the user a * little. It is however a little inconsistent. Normally, when * backspacing around the point where text wraps to a new line in a * multi-line form, we absorb one keystroke for the wrapping point. That * is consistent with SVr4 forms. However, SVr4 does not allow typing * into the last column of the field, and requires the user to enter a * newline to move to the next line. Therefore it can consistently eat * that keystroke. Since ncurses allows the last column, it wraps * automatically (given the proper options). But we cannot eat the * keystroke to back over the wrapping point, since that would put the * cursor past the end of the form field. In this case, just delete the * character at the end of the field. */ if (form->currow == this_row && this_row > 0) { form->currow -= 1; form->curcol = field->dcols - 1; DeleteChar(form); } else { wmove(form->w, form->currow, form->curcol); myADDNSTR(form->w, this_line, (int)(this_end - this_line)); } } else { DeleteChar(form); } returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FE_Delete_Line(FORM * form) | | Description : Delete line at cursor position. | | Return Values : E_OK - success +--------------------------------------------------------------------------*/ static int FE_Delete_Line(FORM *form) { T((T_CALLED("FE_Delete_Line(%p)"), (void *)form)); form->curcol = 0; wdeleteln(form->w); returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FE_Delete_Word(FORM * form) | | Description : Delete word at cursor position | | Return Values : E_OK - success | E_REQUEST_DENIED - failure +--------------------------------------------------------------------------*/ static int FE_Delete_Word(FORM *form) { FIELD *field = form->current; FIELD_CELL *bp = Address_Of_Current_Row_In_Buffer(form); FIELD_CELL *ep = bp + field->dcols; FIELD_CELL *cp = bp + form->curcol; FIELD_CELL *s; T((T_CALLED("FE_Delete_Word(%p)"), (void *)form)); Synchronize_Buffer(form); if (ISBLANK(*cp)) returnCode(E_REQUEST_DENIED); /* not in word */ /* move cursor to begin of word and erase to end of screen-line */ Adjust_Cursor_Position(form, After_Last_Whitespace_Character(bp, form->curcol)); wmove(form->w, form->currow, form->curcol); wclrtoeol(form->w); /* skip over word in buffer */ s = Get_First_Whitespace_Character(cp, (int)(ep - cp)); /* to begin of next word */ s = Get_Start_Of_Data(s, (int)(ep - s)); if ((s != cp) && !ISBLANK(*s)) { /* copy remaining line to window */ myADDNSTR(form->w, s, (int)(s - After_End_Of_Data(s, (int)(ep - s)))); } returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FE_Clear_To_End_Of_Line(FORM * form) | | Description : Clear to end of current line. | | Return Values : E_OK - success +--------------------------------------------------------------------------*/ static int FE_Clear_To_End_Of_Line(FORM *form) { T((T_CALLED("FE_Clear_To_End_Of_Line(%p)"), (void *)form)); wmove(form->w, form->currow, form->curcol); wclrtoeol(form->w); returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FE_Clear_To_End_Of_Field(FORM * form) | | Description : Clear to end of field. | | Return Values : E_OK - success +--------------------------------------------------------------------------*/ static int FE_Clear_To_End_Of_Field(FORM *form) { T((T_CALLED("FE_Clear_To_End_Of_Field(%p)"), (void *)form)); wmove(form->w, form->currow, form->curcol); wclrtobot(form->w); returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FE_Clear_Field(FORM * form) | | Description : Clear entire field. | | Return Values : E_OK - success +--------------------------------------------------------------------------*/ static int FE_Clear_Field(FORM *form) { T((T_CALLED("FE_Clear_Field(%p)"), (void *)form)); form->currow = form->curcol = 0; werase(form->w); returnCode(E_OK); } /*---------------------------------------------------------------------------- END of Field Editing routines --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Edit Mode routines --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int EM_Overlay_Mode(FORM * form) | | Description : Switch to overlay mode. | | Return Values : E_OK - success +--------------------------------------------------------------------------*/ static int EM_Overlay_Mode(FORM *form) { T((T_CALLED("EM_Overlay_Mode(%p)"), (void *)form)); SetStatus(form, _OVLMODE); returnCode(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int EM_Insert_Mode(FORM * form) | | Description : Switch to insert mode | | Return Values : E_OK - success +--------------------------------------------------------------------------*/ static int EM_Insert_Mode(FORM *form) { T((T_CALLED("EM_Insert_Mode(%p)"), (void *)form)); ClrStatus(form, _OVLMODE); returnCode(E_OK); } /*---------------------------------------------------------------------------- END of Edit Mode routines --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Helper routines for Choice Requests --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Next_Choice(FORM * form, | FIELDTYPE * typ, | FIELD * field, | TypeArgument *argp) | | Description : Get the next field choice. For linked types this is | done recursively. | | Return Values : TRUE - next choice successfully retrieved | FALSE - couldn't retrieve next choice +--------------------------------------------------------------------------*/ static bool Next_Choice(FORM *form, FIELDTYPE *typ, FIELD *field, TypeArgument *argp) { if (!typ || !(typ->status & _HAS_CHOICE)) return FALSE; if (typ->status & _LINKED_TYPE) { assert(argp); return ( Next_Choice(form, typ->left, field, argp->left) || Next_Choice(form, typ->right, field, argp->right)); } else { #if NCURSES_INTEROP_FUNCS assert(typ->enum_next.onext); if (typ->status & _GENERIC) return typ->enum_next.gnext(form, field, (void *)argp); else return typ->enum_next.onext(field, (void *)argp); #else assert(typ->next); return typ->next(field, (void *)argp); #endif } } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Previous_Choice(FORM * form, | FIELDTYPE * typ, | FIELD * field, | TypeArgument *argp) | | Description : Get the previous field choice. For linked types this | is done recursively. | | Return Values : TRUE - previous choice successfully retrieved | FALSE - couldn't retrieve previous choice +--------------------------------------------------------------------------*/ static bool Previous_Choice(FORM *form, FIELDTYPE *typ, FIELD *field, TypeArgument *argp) { if (!typ || !(typ->status & _HAS_CHOICE)) return FALSE; if (typ->status & _LINKED_TYPE) { assert(argp); return ( Previous_Choice(form, typ->left, field, argp->left) || Previous_Choice(form, typ->right, field, argp->right)); } else { #if NCURSES_INTEROP_FUNCS assert(typ->enum_prev.oprev); if (typ->status & _GENERIC) return typ->enum_prev.gprev(form, field, (void *)argp); else return typ->enum_prev.oprev(field, (void *)argp); #else assert(typ->prev); return typ->prev(field, (void *)argp); #endif } } /*---------------------------------------------------------------------------- End of Helper routines for Choice Requests --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Routines for Choice Requests --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int CR_Next_Choice(FORM * form) | | Description : Get the next field choice. | | Return Values : E_OK - success | E_REQUEST_DENIED - next choice couldn't be retrieved +--------------------------------------------------------------------------*/ static int CR_Next_Choice(FORM *form) { FIELD *field = form->current; T((T_CALLED("CR_Next_Choice(%p)"), (void *)form)); Synchronize_Buffer(form); returnCode((Next_Choice(form, field->type, field, (TypeArgument *)(field->arg))) ? E_OK : E_REQUEST_DENIED); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int CR_Previous_Choice(FORM * form) | | Description : Get the previous field choice. | | Return Values : E_OK - success | E_REQUEST_DENIED - prev. choice couldn't be retrieved +--------------------------------------------------------------------------*/ static int CR_Previous_Choice(FORM *form) { FIELD *field = form->current; T((T_CALLED("CR_Previous_Choice(%p)"), (void *)form)); Synchronize_Buffer(form); returnCode((Previous_Choice(form, field->type, field, (TypeArgument *)(field->arg))) ? E_OK : E_REQUEST_DENIED); } /*---------------------------------------------------------------------------- End of Routines for Choice Requests --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Helper routines for Field Validations. --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static bool Check_Field(FORM* form, | FIELDTYPE * typ, | FIELD * field, | TypeArgument * argp) | | Description : Check the field according to its fieldtype and its | actual arguments. For linked fieldtypes this is done | recursively. | | Return Values : TRUE - field is valid | FALSE - field is invalid. +--------------------------------------------------------------------------*/ static bool Check_Field(FORM *form, FIELDTYPE *typ, FIELD *field, TypeArgument *argp) { if (typ) { if (Field_Has_Option(field, O_NULLOK)) { FIELD_CELL *bp = field->buf; assert(bp); while (ISBLANK(*bp)) { bp++; } if (CharOf(*bp) == 0) return TRUE; } if (typ->status & _LINKED_TYPE) { assert(argp); return ( Check_Field(form, typ->left, field, argp->left) || Check_Field(form, typ->right, field, argp->right)); } else { #if NCURSES_INTEROP_FUNCS if (typ->fieldcheck.ofcheck) { if (typ->status & _GENERIC) return typ->fieldcheck.gfcheck(form, field, (void *)argp); else return typ->fieldcheck.ofcheck(field, (void *)argp); } #else if (typ->fcheck) return typ->fcheck(field, (void *)argp); #endif } } return TRUE; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : bool _nc_Internal_Validation(FORM * form ) | | Description : Validate the current field of the form. | | Return Values : TRUE - field is valid | FALSE - field is invalid +--------------------------------------------------------------------------*/ FORM_EXPORT(bool) _nc_Internal_Validation(FORM *form) { FIELD *field; field = form->current; Synchronize_Buffer(form); if ((form->status & _FCHECK_REQUIRED) || (!(Field_Has_Option(field, O_PASSOK)))) { if (!Check_Field(form, field->type, field, (TypeArgument *)(field->arg))) return FALSE; ClrStatus(form, _FCHECK_REQUIRED); SetStatus(field, _CHANGED); Synchronize_Linked_Fields(field); } return TRUE; } /*---------------------------------------------------------------------------- End of Helper routines for Field Validations. --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Routines for Field Validation. --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FV_Validation(FORM * form) | | Description : Validate the current field of the form. | | Return Values : E_OK - field valid | E_INVALID_FIELD - field not valid +--------------------------------------------------------------------------*/ static int FV_Validation(FORM *form) { T((T_CALLED("FV_Validation(%p)"), (void *)form)); if (_nc_Internal_Validation(form)) returnCode(E_OK); else returnCode(E_INVALID_FIELD); } /*---------------------------------------------------------------------------- End of routines for Field Validation. --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Helper routines for Inter-Field Navigation --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static FIELD *Next_Field_On_Page(FIELD * field) | | Description : Get the next field after the given field on the current | page. The order of fields is the one defined by the | field's array. Only visible and active fields are | counted. | | Return Values : Pointer to the next field. +--------------------------------------------------------------------------*/ NCURSES_INLINE static FIELD * Next_Field_On_Page(FIELD *field) { FORM *form = field->form; FIELD **field_on_page = &form->field[field->index]; FIELD **first_on_page = &form->field[form->page[form->curpage].pmin]; FIELD **last_on_page = &form->field[form->page[form->curpage].pmax]; do { field_on_page = (field_on_page == last_on_page) ? first_on_page : field_on_page + 1; if (Field_Is_Selectable(*field_on_page)) break; } while (field != (*field_on_page)); return (*field_on_page); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : FIELD* _nc_First_Active_Field(FORM * form) | | Description : Get the first active field on the current page, | if there are such. If there are none, get the first | visible field on the page. If there are also none, | we return the first field on page and hope the best. | | Return Values : Pointer to calculated field. +--------------------------------------------------------------------------*/ FORM_EXPORT(FIELD *) _nc_First_Active_Field(FORM *form) { FIELD **last_on_page = &form->field[form->page[form->curpage].pmax]; FIELD *proposed = Next_Field_On_Page(*last_on_page); if (proposed == *last_on_page) { /* there might be the special situation, where there is no active and visible field on the current page. We then select the first visible field on this readonly page */ if (Field_Is_Not_Selectable(proposed)) { FIELD **field = &form->field[proposed->index]; FIELD **first = &form->field[form->page[form->curpage].pmin]; do { field = (field == last_on_page) ? first : field + 1; if (Field_Has_Option(*field, O_VISIBLE)) break; } while (proposed != (*field)); proposed = *field; if ((proposed == *last_on_page) && !((unsigned)proposed->opts & O_VISIBLE)) { /* This means, there is also no visible field on the page. So we propose the first one and hope the very best... Some very clever user has designed a readonly and invisible page on this form. */ proposed = *first; } } } return (proposed); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static FIELD *Previous_Field_On_Page(FIELD * field) | | Description : Get the previous field before the given field on the | current page. The order of fields is the one defined by | the field's array. Only visible and active fields are | counted. | | Return Values : Pointer to the previous field. +--------------------------------------------------------------------------*/ NCURSES_INLINE static FIELD * Previous_Field_On_Page(FIELD *field) { FORM *form = field->form; FIELD **field_on_page = &form->field[field->index]; FIELD **first_on_page = &form->field[form->page[form->curpage].pmin]; FIELD **last_on_page = &form->field[form->page[form->curpage].pmax]; do { field_on_page = (field_on_page == first_on_page) ? last_on_page : field_on_page - 1; if (Field_Is_Selectable(*field_on_page)) break; } while (field != (*field_on_page)); return (*field_on_page); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static FIELD *Sorted_Next_Field(FIELD * field) | | Description : Get the next field after the given field on the current | page. The order of fields is the one defined by the | (row,column) geometry, rows are major. | | Return Values : Pointer to the next field. +--------------------------------------------------------------------------*/ NCURSES_INLINE static FIELD * Sorted_Next_Field(FIELD *field) { FIELD *field_on_page = field; do { field_on_page = field_on_page->snext; if (Field_Is_Selectable(field_on_page)) break; } while (field_on_page != field); return (field_on_page); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static FIELD *Sorted_Previous_Field(FIELD * field) | | Description : Get the previous field before the given field on the | current page. The order of fields is the one defined | by the (row,column) geometry, rows are major. | | Return Values : Pointer to the previous field. +--------------------------------------------------------------------------*/ NCURSES_INLINE static FIELD * Sorted_Previous_Field(FIELD *field) { FIELD *field_on_page = field; do { field_on_page = field_on_page->sprev; if (Field_Is_Selectable(field_on_page)) break; } while (field_on_page != field); return (field_on_page); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static FIELD *Left_Neighbor_Field(FIELD * field) | | Description : Get the left neighbor of the field on the same line | and the same page. Cycles through the line. | | Return Values : Pointer to left neighbor field. +--------------------------------------------------------------------------*/ NCURSES_INLINE static FIELD * Left_Neighbor_Field(FIELD *field) { FIELD *field_on_page = field; /* For a field that has really a left neighbor, the while clause immediately fails and the loop is left, positioned at the right neighbor. Otherwise we cycle backwards through the sorted field list until we enter the same line (from the right end). */ do { field_on_page = Sorted_Previous_Field(field_on_page); } while (field_on_page->frow != field->frow); return (field_on_page); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static FIELD *Right_Neighbor_Field(FIELD * field) | | Description : Get the right neighbor of the field on the same line | and the same page. | | Return Values : Pointer to right neighbor field. +--------------------------------------------------------------------------*/ NCURSES_INLINE static FIELD * Right_Neighbor_Field(FIELD *field) { FIELD *field_on_page = field; /* See the comments on Left_Neighbor_Field to understand how it works */ do { field_on_page = Sorted_Next_Field(field_on_page); } while (field_on_page->frow != field->frow); return (field_on_page); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static FIELD *Upper_Neighbor_Field(FIELD * field) | | Description : Because of the row-major nature of sorting the fields, | it is more difficult to define what the upper neighbor | field really means. We define that it must be on a | 'previous' line (cyclic order!) and is the rightmost | field lying on the left side of the given field. If | this set is empty, we take the first field on the line. | | Return Values : Pointer to the upper neighbor field. +--------------------------------------------------------------------------*/ static FIELD * Upper_Neighbor_Field(FIELD *field) { FIELD *field_on_page = field; int frow = field->frow; int fcol = field->fcol; /* Walk back to the 'previous' line. The second term in the while clause just guarantees that we stop if we cycled through the line because there might be no 'previous' line if the page has just one line. */ do { field_on_page = Sorted_Previous_Field(field_on_page); } while (field_on_page->frow == frow && field_on_page->fcol != fcol); if (field_on_page->frow != frow) { /* We really found a 'previous' line. We are positioned at the rightmost field on this line */ frow = field_on_page->frow; /* We walk to the left as long as we are really right of the field. */ while (field_on_page->frow == frow && field_on_page->fcol > fcol) field_on_page = Sorted_Previous_Field(field_on_page); /* If we wrapped, just go to the right which is the first field on the row */ if (field_on_page->frow != frow) field_on_page = Sorted_Next_Field(field_on_page); } return (field_on_page); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static FIELD *Down_Neighbor_Field(FIELD * field) | | Description : Because of the row-major nature of sorting the fields, | it is more difficult to define what the down neighbor | field really means. We define that it must be on a | 'next' line (cyclic order!) and is the leftmost | field laying on the right side of the given field. If | this set is empty, we take the last field on the line. | | Return Values : Pointer to the upper neighbor field. +--------------------------------------------------------------------------*/ static FIELD * Down_Neighbor_Field(FIELD *field) { FIELD *field_on_page = field; int frow = field->frow; int fcol = field->fcol; /* Walk forward to the 'next' line. The second term in the while clause just guarantees that we stop if we cycled through the line because there might be no 'next' line if the page has just one line. */ do { field_on_page = Sorted_Next_Field(field_on_page); } while (field_on_page->frow == frow && field_on_page->fcol != fcol); if (field_on_page->frow != frow) { /* We really found a 'next' line. We are positioned at the rightmost field on this line */ frow = field_on_page->frow; /* We walk to the right as long as we are really left of the field. */ while (field_on_page->frow == frow && field_on_page->fcol < fcol) field_on_page = Sorted_Next_Field(field_on_page); /* If we wrapped, just go to the left which is the last field on the row */ if (field_on_page->frow != frow) field_on_page = Sorted_Previous_Field(field_on_page); } return (field_on_page); } /*---------------------------------------------------------------------------- Inter-Field Navigation routines --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Inter_Field_Navigation( | int (* const fct) (FORM *), | FORM * form) | | Description : Generic behavior for changing the current field, the | field is left and a new field is entered. So the field | must be validated and the field init/term hooks must | be called. | | Return Values : E_OK - success | E_INVALID_FIELD - field is invalid | some other - error from subordinate call +--------------------------------------------------------------------------*/ static int Inter_Field_Navigation(int (*const fct) (FORM *), FORM *form) { int res; if (!_nc_Internal_Validation(form)) res = E_INVALID_FIELD; else { Call_Hook(form, fieldterm); res = fct(form); Call_Hook(form, fieldinit); } return res; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_Next_Field(FORM * form) | | Description : Move to the next field on the current page of the form | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_Next_Field(FORM *form) { T((T_CALLED("FN_Next_Field(%p)"), (void *)form)); returnCode(_nc_Set_Current_Field(form, Next_Field_On_Page(form->current))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_Previous_Field(FORM * form) | | Description : Move to the previous field on the current page of the | form | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_Previous_Field(FORM *form) { T((T_CALLED("FN_Previous_Field(%p)"), (void *)form)); returnCode(_nc_Set_Current_Field(form, Previous_Field_On_Page(form->current))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_First_Field(FORM * form) | | Description : Move to the first field on the current page of the form | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_First_Field(FORM *form) { T((T_CALLED("FN_First_Field(%p)"), (void *)form)); returnCode(_nc_Set_Current_Field(form, Next_Field_On_Page(form->field[form->page[form->curpage].pmax]))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_Last_Field(FORM * form) | | Description : Move to the last field on the current page of the form | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_Last_Field(FORM *form) { T((T_CALLED("FN_Last_Field(%p)"), (void *)form)); returnCode( _nc_Set_Current_Field(form, Previous_Field_On_Page(form->field[form->page[form->curpage].pmin]))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_Sorted_Next_Field(FORM * form) | | Description : Move to the sorted next field on the current page | of the form. | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_Sorted_Next_Field(FORM *form) { T((T_CALLED("FN_Sorted_Next_Field(%p)"), (void *)form)); returnCode(_nc_Set_Current_Field(form, Sorted_Next_Field(form->current))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_Sorted_Previous_Field(FORM * form) | | Description : Move to the sorted previous field on the current page | of the form. | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_Sorted_Previous_Field(FORM *form) { T((T_CALLED("FN_Sorted_Previous_Field(%p)"), (void *)form)); returnCode(_nc_Set_Current_Field(form, Sorted_Previous_Field(form->current))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_Sorted_First_Field(FORM * form) | | Description : Move to the sorted first field on the current page | of the form. | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_Sorted_First_Field(FORM *form) { T((T_CALLED("FN_Sorted_First_Field(%p)"), (void *)form)); returnCode(_nc_Set_Current_Field(form, Sorted_Next_Field(form->field[form->page[form->curpage].smax]))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_Sorted_Last_Field(FORM * form) | | Description : Move to the sorted last field on the current page | of the form. | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_Sorted_Last_Field(FORM *form) { T((T_CALLED("FN_Sorted_Last_Field(%p)"), (void *)form)); returnCode(_nc_Set_Current_Field(form, Sorted_Previous_Field(form->field[form->page[form->curpage].smin]))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_Left_Field(FORM * form) | | Description : Get the field on the left of the current field on the | same line and the same page. Cycles through the line. | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_Left_Field(FORM *form) { T((T_CALLED("FN_Left_Field(%p)"), (void *)form)); returnCode(_nc_Set_Current_Field(form, Left_Neighbor_Field(form->current))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_Right_Field(FORM * form) | | Description : Get the field on the right of the current field on the | same line and the same page. Cycles through the line. | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_Right_Field(FORM *form) { T((T_CALLED("FN_Right_Field(%p)"), (void *)form)); returnCode(_nc_Set_Current_Field(form, Right_Neighbor_Field(form->current))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_Up_Field(FORM * form) | | Description : Get the upper neighbor of the current field. This | cycles through the page. See the comments of the | Upper_Neighbor_Field function to understand how | 'upper' is defined. | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_Up_Field(FORM *form) { T((T_CALLED("FN_Up_Field(%p)"), (void *)form)); returnCode(_nc_Set_Current_Field(form, Upper_Neighbor_Field(form->current))); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int FN_Down_Field(FORM * form) | | Description : Get the down neighbor of the current field. This | cycles through the page. See the comments of the | Down_Neighbor_Field function to understand how | 'down' is defined. | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int FN_Down_Field(FORM *form) { T((T_CALLED("FN_Down_Field(%p)"), (void *)form)); returnCode(_nc_Set_Current_Field(form, Down_Neighbor_Field(form->current))); } /*---------------------------------------------------------------------------- END of Field Navigation routines --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Helper routines for Page Navigation --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : int _nc_Set_Form_Page(FORM * form, | int page, | FIELD * field) | | Description : Make the given page number the current page and make | the given field the current field on the page. If | for the field NULL is given, make the first field on | the page the current field. The routine acts only | if the requested page is not the current page. | | Return Values : E_OK - success | != E_OK - error from subordinate call | E_BAD_ARGUMENT - invalid field pointer | E_SYSTEM_ERROR - some severe basic error +--------------------------------------------------------------------------*/ FORM_EXPORT(int) _nc_Set_Form_Page(FORM *form, int page, FIELD *field) { int res = E_OK; if ((form->curpage != page)) { FIELD *last_field, *field_on_page; werase(Get_Form_Window(form)); form->curpage = (short)page; last_field = field_on_page = form->field[form->page[page].smin]; do { if ((unsigned)field_on_page->opts & O_VISIBLE) if ((res = Display_Field(field_on_page)) != E_OK) return (res); field_on_page = field_on_page->snext; } while (field_on_page != last_field); if (field) res = _nc_Set_Current_Field(form, field); else /* N.B.: we don't encapsulate this by Inter_Field_Navigation(), because this is already executed in a page navigation context that contains field navigation */ res = FN_First_Field(form); } return (res); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Next_Page_Number(const FORM * form) | | Description : Calculate the page number following the current page | number. This cycles if the highest page number is | reached. | | Return Values : The next page number +--------------------------------------------------------------------------*/ NCURSES_INLINE static int Next_Page_Number(const FORM *form) { return (form->curpage + 1) % form->maxpage; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Previous_Page_Number(const FORM * form) | | Description : Calculate the page number before the current page | number. This cycles if the first page number is | reached. | | Return Values : The previous page number +--------------------------------------------------------------------------*/ NCURSES_INLINE static int Previous_Page_Number(const FORM *form) { return (form->curpage != 0 ? form->curpage - 1 : form->maxpage - 1); } /*---------------------------------------------------------------------------- Page Navigation routines --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Page_Navigation( | int (* const fct) (FORM *), | FORM * form) | | Description : Generic behavior for changing a page. This means | that the field is left and a new field is entered. | So the field must be validated and the field init/term | hooks must be called. Because also the page is changed, | the form's init/term hooks must be called also. | | Return Values : E_OK - success | E_INVALID_FIELD - field is invalid | some other - error from subordinate call +--------------------------------------------------------------------------*/ static int Page_Navigation(int (*const fct) (FORM *), FORM *form) { int res; if (!_nc_Internal_Validation(form)) res = E_INVALID_FIELD; else { Call_Hook(form, fieldterm); Call_Hook(form, formterm); res = fct(form); Call_Hook(form, forminit); Call_Hook(form, fieldinit); } return res; } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int PN_Next_Page(FORM * form) | | Description : Move to the next page of the form | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int PN_Next_Page(FORM *form) { T((T_CALLED("PN_Next_Page(%p)"), (void *)form)); returnCode(_nc_Set_Form_Page(form, Next_Page_Number(form), (FIELD *)0)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int PN_Previous_Page(FORM * form) | | Description : Move to the previous page of the form | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int PN_Previous_Page(FORM *form) { T((T_CALLED("PN_Previous_Page(%p)"), (void *)form)); returnCode(_nc_Set_Form_Page(form, Previous_Page_Number(form), (FIELD *)0)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int PN_First_Page(FORM * form) | | Description : Move to the first page of the form | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int PN_First_Page(FORM *form) { T((T_CALLED("PN_First_Page(%p)"), (void *)form)); returnCode(_nc_Set_Form_Page(form, 0, (FIELD *)0)); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int PN_Last_Page(FORM * form) | | Description : Move to the last page of the form | | Return Values : E_OK - success | != E_OK - error from subordinate call +--------------------------------------------------------------------------*/ static int PN_Last_Page(FORM *form) { T((T_CALLED("PN_Last_Page(%p)"), (void *)form)); returnCode(_nc_Set_Form_Page(form, form->maxpage - 1, (FIELD *)0)); } /*---------------------------------------------------------------------------- END of Field Navigation routines --------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Helper routines for the core form driver. --------------------------------------------------------------------------*/ # if USE_WIDEC_SUPPORT /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Data_Entry_w(FORM * form, wchar_t c) | | Description : Enter the wide character c into at the current | position of the current field of the form. | | Return Values : E_OK - success | E_REQUEST_DENIED - driver could not process the request | E_SYSTEM_ERROR - +--------------------------------------------------------------------------*/ static int Data_Entry_w(FORM *form, wchar_t c) { FIELD *field = form->current; int result = E_REQUEST_DENIED; T((T_CALLED("Data_Entry(%p,%s)"), (void *)form, _tracechtype((chtype)c))); if ((Field_Has_Option(field, O_EDIT)) #if FIX_FORM_INACTIVE_BUG && (Field_Has_Option(field, O_ACTIVE)) #endif ) { wchar_t given[2]; cchar_t temp_ch; given[0] = c; given[1] = 0; setcchar(&temp_ch, given, 0, 0, (void *)0); if ((Field_Has_Option(field, O_BLANK)) && First_Position_In_Current_Field(form) && !(form->status & _FCHECK_REQUIRED) && !(form->status & _WINDOW_MODIFIED)) werase(form->w); if (form->status & _OVLMODE) { wadd_wch(form->w, &temp_ch); } else /* no _OVLMODE */ { bool There_Is_Room = Is_There_Room_For_A_Char_In_Line(form); if (!(There_Is_Room || ((Single_Line_Field(field) && Growable(field))))) RETURN(E_REQUEST_DENIED); if (!There_Is_Room && !Field_Grown(field, 1)) RETURN(E_SYSTEM_ERROR); wins_wch(form->w, &temp_ch); } if ((result = Wrapping_Not_Necessary_Or_Wrapping_Ok(form)) == E_OK) { bool End_Of_Field = (((field->drows - 1) == form->currow) && ((field->dcols - 1) == form->curcol)); form->status |= _WINDOW_MODIFIED; if (End_Of_Field && !Growable(field) && (Field_Has_Option(field, O_AUTOSKIP))) result = Inter_Field_Navigation(FN_Next_Field, form); else { if (End_Of_Field && Growable(field) && !Field_Grown(field, 1)) result = E_SYSTEM_ERROR; else { /* * We have just added a byte to the form field. It may have * been part of a multibyte character. If it was, the * addch_used field is nonzero and we should not try to move * to a new column. */ if (WINDOW_EXT(form->w, addch_used) == 0) IFN_Next_Character(form); result = E_OK; } } } } RETURN(result); } # endif /*--------------------------------------------------------------------------- | Facility : libnform | Function : static int Data_Entry(FORM * form,int c) | | Description : Enter character c into at the current position of the | current field of the form. | | Return Values : E_OK - success | E_REQUEST_DENIED - driver could not process the request | E_SYSTEM_ERROR - +--------------------------------------------------------------------------*/ static int Data_Entry(FORM *form, int c) { FIELD *field = form->current; int result = E_REQUEST_DENIED; T((T_CALLED("Data_Entry(%p,%s)"), (void *)form, _tracechtype((chtype)c))); if ((Field_Has_Option(field, O_EDIT)) #if FIX_FORM_INACTIVE_BUG && (Field_Has_Option(field, O_ACTIVE)) #endif ) { if ((Field_Has_Option(field, O_BLANK)) && First_Position_In_Current_Field(form) && !(form->status & _FCHECK_REQUIRED) && !(form->status & _WINDOW_MODIFIED)) werase(form->w); if (form->status & _OVLMODE) { waddch(form->w, (chtype)c); } else /* no _OVLMODE */ { bool There_Is_Room = Is_There_Room_For_A_Char_In_Line(form); if (!(There_Is_Room || ((Single_Line_Field(field) && Growable(field))))) RETURN(E_REQUEST_DENIED); if (!There_Is_Room && !Field_Grown(field, 1)) RETURN(E_SYSTEM_ERROR); winsch(form->w, (chtype)c); } if ((result = Wrapping_Not_Necessary_Or_Wrapping_Ok(form)) == E_OK) { bool End_Of_Field = (((field->drows - 1) == form->currow) && ((field->dcols - 1) == form->curcol)); if (Field_Has_Option(field, O_EDGE_INSERT_STAY)) move_after_insert = !!(form->curcol - form->begincol - field->cols + 1); SetStatus(form, _WINDOW_MODIFIED); if (End_Of_Field && !Growable(field) && (Field_Has_Option(field, O_AUTOSKIP))) result = Inter_Field_Navigation(FN_Next_Field, form); else { if (End_Of_Field && Growable(field) && !Field_Grown(field, 1)) result = E_SYSTEM_ERROR; else { #if USE_WIDEC_SUPPORT /* * We have just added a byte to the form field. It may have * been part of a multibyte character. If it was, the * addch_used field is nonzero and we should not try to move * to a new column. */ if (WINDOW_EXT(form->w, addch_used) == 0) IFN_Next_Character(form); #else IFN_Next_Character(form); #endif result = E_OK; } } } } RETURN(result); } /* Structure to describe the binding of a request code to a function. The member keycode codes the request value as well as the generic routine to use for the request. The code for the generic routine is coded in the upper 16 Bits while the request code is coded in the lower 16 bits. In terms of C++ you might think of a request as a class with a virtual method "perform". The different types of request are derived from this base class and overload (or not) the base class implementation of perform. */ typedef struct { int keycode; /* must be at least 32 bit: hi:mode, lo: key */ int (*cmd) (FORM *); /* low level driver routine for this key */ } Binding_Info; /* You may see this is the class-id of the request type class */ #define ID_PN (0x00000000) /* Page navigation */ #define ID_FN (0x00010000) /* Inter-Field navigation */ #define ID_IFN (0x00020000) /* Intra-Field navigation */ #define ID_VSC (0x00030000) /* Vertical Scrolling */ #define ID_HSC (0x00040000) /* Horizontal Scrolling */ #define ID_FE (0x00050000) /* Field Editing */ #define ID_EM (0x00060000) /* Edit Mode */ #define ID_FV (0x00070000) /* Field Validation */ #define ID_CH (0x00080000) /* Choice */ #define ID_Mask (0xffff0000) #define Key_Mask (0x0000ffff) #define ID_Shft (16) /* This array holds all the Binding Infos */ /* *INDENT-OFF* */ static const Binding_Info bindings[MAX_FORM_COMMAND - MIN_FORM_COMMAND + 1] = { { REQ_NEXT_PAGE |ID_PN ,PN_Next_Page}, { REQ_PREV_PAGE |ID_PN ,PN_Previous_Page}, { REQ_FIRST_PAGE |ID_PN ,PN_First_Page}, { REQ_LAST_PAGE |ID_PN ,PN_Last_Page}, { REQ_NEXT_FIELD |ID_FN ,FN_Next_Field}, { REQ_PREV_FIELD |ID_FN ,FN_Previous_Field}, { REQ_FIRST_FIELD |ID_FN ,FN_First_Field}, { REQ_LAST_FIELD |ID_FN ,FN_Last_Field}, { REQ_SNEXT_FIELD |ID_FN ,FN_Sorted_Next_Field}, { REQ_SPREV_FIELD |ID_FN ,FN_Sorted_Previous_Field}, { REQ_SFIRST_FIELD |ID_FN ,FN_Sorted_First_Field}, { REQ_SLAST_FIELD |ID_FN ,FN_Sorted_Last_Field}, { REQ_LEFT_FIELD |ID_FN ,FN_Left_Field}, { REQ_RIGHT_FIELD |ID_FN ,FN_Right_Field}, { REQ_UP_FIELD |ID_FN ,FN_Up_Field}, { REQ_DOWN_FIELD |ID_FN ,FN_Down_Field}, { REQ_NEXT_CHAR |ID_IFN ,IFN_Next_Character}, { REQ_PREV_CHAR |ID_IFN ,IFN_Previous_Character}, { REQ_NEXT_LINE |ID_IFN ,IFN_Next_Line}, { REQ_PREV_LINE |ID_IFN ,IFN_Previous_Line}, { REQ_NEXT_WORD |ID_IFN ,IFN_Next_Word}, { REQ_PREV_WORD |ID_IFN ,IFN_Previous_Word}, { REQ_BEG_FIELD |ID_IFN ,IFN_Beginning_Of_Field}, { REQ_END_FIELD |ID_IFN ,IFN_End_Of_Field}, { REQ_BEG_LINE |ID_IFN ,IFN_Beginning_Of_Line}, { REQ_END_LINE |ID_IFN ,IFN_End_Of_Line}, { REQ_LEFT_CHAR |ID_IFN ,IFN_Left_Character}, { REQ_RIGHT_CHAR |ID_IFN ,IFN_Right_Character}, { REQ_UP_CHAR |ID_IFN ,IFN_Up_Character}, { REQ_DOWN_CHAR |ID_IFN ,IFN_Down_Character}, { REQ_NEW_LINE |ID_FE ,FE_New_Line}, { REQ_INS_CHAR |ID_FE ,FE_Insert_Character}, { REQ_INS_LINE |ID_FE ,FE_Insert_Line}, { REQ_DEL_CHAR |ID_FE ,FE_Delete_Character}, { REQ_DEL_PREV |ID_FE ,FE_Delete_Previous}, { REQ_DEL_LINE |ID_FE ,FE_Delete_Line}, { REQ_DEL_WORD |ID_FE ,FE_Delete_Word}, { REQ_CLR_EOL |ID_FE ,FE_Clear_To_End_Of_Line}, { REQ_CLR_EOF |ID_FE ,FE_Clear_To_End_Of_Field}, { REQ_CLR_FIELD |ID_FE ,FE_Clear_Field}, { REQ_OVL_MODE |ID_EM ,EM_Overlay_Mode}, { REQ_INS_MODE |ID_EM ,EM_Insert_Mode}, { REQ_SCR_FLINE |ID_VSC ,VSC_Scroll_Line_Forward}, { REQ_SCR_BLINE |ID_VSC ,VSC_Scroll_Line_Backward}, { REQ_SCR_FPAGE |ID_VSC ,VSC_Scroll_Page_Forward}, { REQ_SCR_BPAGE |ID_VSC ,VSC_Scroll_Page_Backward}, { REQ_SCR_FHPAGE |ID_VSC ,VSC_Scroll_Half_Page_Forward}, { REQ_SCR_BHPAGE |ID_VSC ,VSC_Scroll_Half_Page_Backward}, { REQ_SCR_FCHAR |ID_HSC ,HSC_Scroll_Char_Forward}, { REQ_SCR_BCHAR |ID_HSC ,HSC_Scroll_Char_Backward}, { REQ_SCR_HFLINE |ID_HSC ,HSC_Horizontal_Line_Forward}, { REQ_SCR_HBLINE |ID_HSC ,HSC_Horizontal_Line_Backward}, { REQ_SCR_HFHALF |ID_HSC ,HSC_Horizontal_Half_Line_Forward}, { REQ_SCR_HBHALF |ID_HSC ,HSC_Horizontal_Half_Line_Backward}, { REQ_VALIDATION |ID_FV ,FV_Validation}, { REQ_NEXT_CHOICE |ID_CH ,CR_Next_Choice}, { REQ_PREV_CHOICE |ID_CH ,CR_Previous_Choice} }; /* *INDENT-ON* */ /*--------------------------------------------------------------------------- | Facility : libnform | Function : int form_driver(FORM * form,int c) | | Description : This is the workhorse of the forms system. It checks | to determine whether the character c is a request or | data. If it is a request, the form driver executes | the request and returns the result. If it is data | (printable character), it enters the data into the | current position in the current field. If it is not | recognized, the form driver assumes it is an application | defined command and returns E_UNKNOWN_COMMAND. | Application defined command should be defined relative | to MAX_FORM_COMMAND, the maximum value of a request. | | Return Values : E_OK - success | E_SYSTEM_ERROR - system error | E_BAD_ARGUMENT - an argument is incorrect | E_NOT_POSTED - form is not posted | E_INVALID_FIELD - field contents are invalid | E_BAD_STATE - called from inside a hook routine | E_REQUEST_DENIED - request failed | E_NOT_CONNECTED - no fields are connected to the form | E_UNKNOWN_COMMAND - command not known +--------------------------------------------------------------------------*/ FORM_EXPORT(int) form_driver(FORM *form, int c) { const Binding_Info *BI = (Binding_Info *)0; int res = E_UNKNOWN_COMMAND; move_after_insert = TRUE; T((T_CALLED("form_driver(%p,%d)"), (void *)form, c)); if (!form) RETURN(E_BAD_ARGUMENT); if (!(form->field) || !(form->current)) RETURN(E_NOT_CONNECTED); assert(form->page); if (c == FIRST_ACTIVE_MAGIC) { form->current = _nc_First_Active_Field(form); RETURN(E_OK); } assert(form->current && form->current->buf && (form->current->form == form) ); if (form->status & _IN_DRIVER) RETURN(E_BAD_STATE); if (!(form->status & _POSTED)) RETURN(E_NOT_POSTED); if ((c >= MIN_FORM_COMMAND && c <= MAX_FORM_COMMAND) && ((bindings[c - MIN_FORM_COMMAND].keycode & Key_Mask) == c)) { TR(TRACE_CALLS, ("form_request %s", form_request_name(c))); BI = &(bindings[c - MIN_FORM_COMMAND]); } if (BI) { typedef int (*Generic_Method) (int (*const) (FORM *), FORM *); static const Generic_Method Generic_Methods[] = { Page_Navigation, /* overloaded to call field&form hooks */ Inter_Field_Navigation, /* overloaded to call field hooks */ NULL, /* Intra-Field is generic */ Vertical_Scrolling, /* Overloaded to check multi-line */ Horizontal_Scrolling, /* Overloaded to check single-line */ Field_Editing, /* Overloaded to mark modification */ NULL, /* Edit Mode is generic */ NULL, /* Field Validation is generic */ NULL /* Choice Request is generic */ }; size_t nMethods = (sizeof(Generic_Methods) / sizeof(Generic_Methods[0])); size_t method = (size_t)((BI->keycode >> ID_Shft) & 0xffff); /* see ID_Mask */ if ((method >= nMethods) || !(BI->cmd)) res = E_SYSTEM_ERROR; else { Generic_Method fct = Generic_Methods[method]; if (fct) { res = fct(BI->cmd, form); } else { res = (BI->cmd) (form); } } } #ifdef NCURSES_MOUSE_VERSION else if (KEY_MOUSE == c) { MEVENT event; WINDOW *win = form->win ? form->win : StdScreen(Get_Form_Screen(form)); WINDOW *sub = form->sub ? form->sub : win; getmouse(&event); if ((event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED | BUTTON1_TRIPLE_CLICKED)) && wenclose(win, event.y, event.x)) { /* we react only if the click was in the userwin, that means * inside the form display area or at the decoration window. */ int ry = event.y, rx = event.x; /* screen coordinates */ res = E_REQUEST_DENIED; if (mouse_trafo(&ry, &rx, FALSE)) { /* rx, ry are now "curses" coordinates */ if (ry < sub->_begy) { /* we clicked above the display region; this is * interpreted as "scroll up" request */ if (event.bstate & BUTTON1_CLICKED) res = form_driver(form, REQ_PREV_FIELD); else if (event.bstate & BUTTON1_DOUBLE_CLICKED) res = form_driver(form, REQ_PREV_PAGE); else if (event.bstate & BUTTON1_TRIPLE_CLICKED) res = form_driver(form, REQ_FIRST_FIELD); } else if (ry > sub->_begy + sub->_maxy) { /* we clicked below the display region; this is * interpreted as "scroll down" request */ if (event.bstate & BUTTON1_CLICKED) res = form_driver(form, REQ_NEXT_FIELD); else if (event.bstate & BUTTON1_DOUBLE_CLICKED) res = form_driver(form, REQ_NEXT_PAGE); else if (event.bstate & BUTTON1_TRIPLE_CLICKED) res = form_driver(form, REQ_LAST_FIELD); } else if (wenclose(sub, event.y, event.x)) { /* Inside the area we try to find the hit item */ ry = event.y; rx = event.x; if (wmouse_trafo(sub, &ry, &rx, FALSE)) { int min_field = form->page[form->curpage].pmin; int max_field = form->page[form->curpage].pmax; int i; for (i = min_field; i <= max_field; ++i) { FIELD *field = form->field[i]; if (Field_Is_Selectable(field) && Field_encloses(field, ry, rx) == E_OK) { res = _nc_Set_Current_Field(form, field); if (res == E_OK) res = _nc_Position_Form_Cursor(form); if (res == E_OK && (event.bstate & BUTTON1_DOUBLE_CLICKED)) res = E_UNKNOWN_COMMAND; break; } } } } } } else res = E_REQUEST_DENIED; } #endif /* NCURSES_MOUSE_VERSION */ else if (!(c & (~(int)MAX_REGULAR_CHARACTER))) { /* * If we're using 8-bit characters, iscntrl+isprint cover the whole set. * But with multibyte characters, there is a third possibility, i.e., * parts of characters that build up into printable characters which are * not considered printable. * * FIXME: the wide-character branch should also use Check_Char(). */ #if USE_WIDEC_SUPPORT if (!iscntrl(UChar(c))) #else if (isprint(UChar(c)) && Check_Char(form, form->current, form->current->type, c, (TypeArgument *)(form->current->arg))) #endif res = Data_Entry(form, c); } _nc_Refresh_Current_Field(form); RETURN(res); } # if USE_WIDEC_SUPPORT /*--------------------------------------------------------------------------- | Facility : libnform | Function : int form_driver_w(FORM * form,int type,wchar_t c) | | Description : This is the workhorse of the forms system. | | Input is either a key code (request) or a wide char | returned by e.g. get_wch (). The type must be passed | as well,so that we are able to determine whether the char | is a multibyte char or a request. | If it is a request, the form driver executes | the request and returns the result. If it is data | (printable character), it enters the data into the | current position in the current field. If it is not | recognized, the form driver assumes it is an application | defined command and returns E_UNKNOWN_COMMAND. | Application defined command should be defined relative | to MAX_FORM_COMMAND, the maximum value of a request. | | Return Values : E_OK - success | E_SYSTEM_ERROR - system error | E_BAD_ARGUMENT - an argument is incorrect | E_NOT_POSTED - form is not posted | E_INVALID_FIELD - field contents are invalid | E_BAD_STATE - called from inside a hook routine | E_REQUEST_DENIED - request failed | E_NOT_CONNECTED - no fields are connected to the form | E_UNKNOWN_COMMAND - command not known +--------------------------------------------------------------------------*/ FORM_EXPORT(int) form_driver_w(FORM *form, int type, wchar_t c) { const Binding_Info *BI = (Binding_Info *)0; int res = E_UNKNOWN_COMMAND; T((T_CALLED("form_driver(%p,%d)"), (void *)form, (int)c)); if (!form) RETURN(E_BAD_ARGUMENT); if (!(form->field)) RETURN(E_NOT_CONNECTED); assert(form->page); if (c == (wchar_t)FIRST_ACTIVE_MAGIC) { form->current = _nc_First_Active_Field(form); RETURN(E_OK); } assert(form->current && form->current->buf && (form->current->form == form) ); if (form->status & _IN_DRIVER) RETURN(E_BAD_STATE); if (!(form->status & _POSTED)) RETURN(E_NOT_POSTED); /* check if this is a keycode or a (wide) char */ if (type == KEY_CODE_YES) { if ((c >= MIN_FORM_COMMAND && c <= MAX_FORM_COMMAND) && ((bindings[c - MIN_FORM_COMMAND].keycode & Key_Mask) == c)) BI = &(bindings[c - MIN_FORM_COMMAND]); } if (BI) { typedef int (*Generic_Method) (int (*const) (FORM *), FORM *); static const Generic_Method Generic_Methods[] = { Page_Navigation, /* overloaded to call field&form hooks */ Inter_Field_Navigation, /* overloaded to call field hooks */ NULL, /* Intra-Field is generic */ Vertical_Scrolling, /* Overloaded to check multi-line */ Horizontal_Scrolling, /* Overloaded to check single-line */ Field_Editing, /* Overloaded to mark modification */ NULL, /* Edit Mode is generic */ NULL, /* Field Validation is generic */ NULL /* Choice Request is generic */ }; size_t nMethods = (sizeof(Generic_Methods) / sizeof(Generic_Methods[0])); size_t method = (size_t)(BI->keycode >> ID_Shft) & 0xffff; /* see ID_Mask */ if ((method >= nMethods) || !(BI->cmd)) res = E_SYSTEM_ERROR; else { Generic_Method fct = Generic_Methods[method]; if (fct) res = fct(BI->cmd, form); else res = (BI->cmd) (form); } } #ifdef NCURSES_MOUSE_VERSION else if (KEY_MOUSE == c) { MEVENT event; WINDOW *win = form->win ? form->win : StdScreen(Get_Form_Screen(form)); WINDOW *sub = form->sub ? form->sub : win; getmouse(&event); if ((event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED | BUTTON1_TRIPLE_CLICKED)) && wenclose(win, event.y, event.x)) { /* we react only if the click was in the userwin, that means * inside the form display area or at the decoration window. */ int ry = event.y, rx = event.x; /* screen coordinates */ res = E_REQUEST_DENIED; if (mouse_trafo(&ry, &rx, FALSE)) { /* rx, ry are now "curses" coordinates */ if (ry < sub->_begy) { /* we clicked above the display region; this is * interpreted as "scroll up" request */ if (event.bstate & BUTTON1_CLICKED) res = form_driver(form, REQ_PREV_FIELD); else if (event.bstate & BUTTON1_DOUBLE_CLICKED) res = form_driver(form, REQ_PREV_PAGE); else if (event.bstate & BUTTON1_TRIPLE_CLICKED) res = form_driver(form, REQ_FIRST_FIELD); } else if (ry > sub->_begy + sub->_maxy) { /* we clicked below the display region; this is * interpreted as "scroll down" request */ if (event.bstate & BUTTON1_CLICKED) res = form_driver(form, REQ_NEXT_FIELD); else if (event.bstate & BUTTON1_DOUBLE_CLICKED) res = form_driver(form, REQ_NEXT_PAGE); else if (event.bstate & BUTTON1_TRIPLE_CLICKED) res = form_driver(form, REQ_LAST_FIELD); } else if (wenclose(sub, event.y, event.x)) { /* Inside the area we try to find the hit item */ ry = event.y; rx = event.x; if (wmouse_trafo(sub, &ry, &rx, FALSE)) { int min_field = form->page[form->curpage].pmin; int max_field = form->page[form->curpage].pmax; int i; for (i = min_field; i <= max_field; ++i) { FIELD *field = form->field[i]; if (Field_Is_Selectable(field) && Field_encloses(field, ry, rx) == E_OK) { res = _nc_Set_Current_Field(form, field); if (res == E_OK) res = _nc_Position_Form_Cursor(form); if (res == E_OK && (event.bstate & BUTTON1_DOUBLE_CLICKED)) res = E_UNKNOWN_COMMAND; break; } } } } } } else res = E_REQUEST_DENIED; } #endif /* NCURSES_MOUSE_VERSION */ else if (type == OK) { res = Data_Entry_w(form, c); } _nc_Refresh_Current_Field(form); RETURN(res); } # endif /* USE_WIDEC_SUPPORT */ /*---------------------------------------------------------------------------- Field-Buffer manipulation routines. The effects of setting a buffer are tightly coupled to the core of the form driver logic. This is especially true in the case of growable fields. So I don't separate this into a separate module. --------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- | Facility : libnform | Function : int set_field_buffer(FIELD *field, | int buffer, char *value) | | Description : Set the given buffer of the field to the given value. | Buffer 0 stores the displayed content of the field. | For dynamic fields this may grow the fieldbuffers if | the length of the value exceeds the current buffer | length. For buffer 0 only printable values are allowed. | For static fields, the value must not be zero terminated. | It is copied up to the length of the buffer. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid argument | E_SYSTEM_ERROR - system error +--------------------------------------------------------------------------*/ FORM_EXPORT(int) set_field_buffer(FIELD *field, int buffer, const char *value) { FIELD_CELL *p; int res = E_OK; int i; int len; #if USE_WIDEC_SUPPORT FIELD_CELL *widevalue = 0; #endif T((T_CALLED("set_field_buffer(%p,%d,%s)"), (void *)field, buffer, _nc_visbuf(value))); if (!field || !value || ((buffer < 0) || (buffer > field->nbuf))) RETURN(E_BAD_ARGUMENT); len = Buffer_Length(field); if (Growable(field)) { /* for a growable field we must assume zero terminated strings, because somehow we have to detect the length of what should be copied. */ int vlen = (int)strlen(value); if (vlen > len) { if (!Field_Grown(field, (int)(1 + (vlen - len) / ((field->rows + field->nrow) * field->cols)))) RETURN(E_SYSTEM_ERROR); #if !USE_WIDEC_SUPPORT len = vlen; #endif } } p = Address_Of_Nth_Buffer(field, buffer); #if USE_WIDEC_SUPPORT /* * Use addstr's logic for converting a string to an array of cchar_t's. * There should be a better way, but this handles nonspacing characters * and other special cases that we really do not want to handle here. */ #if NCURSES_EXT_FUNCS if (wresize(field->working, 1, Buffer_Length(field) + 1) == ERR) #endif { delwin(field->working); field->working = newpad(1, Buffer_Length(field) + 1); } len = Buffer_Length(field); wclear(field->working); (void)mvwaddstr(field->working, 0, 0, value); if ((widevalue = typeCalloc(FIELD_CELL, len + 1)) == 0) { RETURN(E_SYSTEM_ERROR); } else { for (i = 0; i < field->drows; ++i) { (void)mvwin_wchnstr(field->working, 0, (int)i * field->dcols, widevalue + ((int)i * field->dcols), field->dcols); } for (i = 0; i < len; ++i) { if (CharEq(myZEROS, widevalue[i])) { while (i < len) p[i++] = myBLANK; break; } p[i] = widevalue[i]; } free(widevalue); } #else for (i = 0; i < len; ++i) { if (value[i] == '\0') { while (i < len) p[i++] = myBLANK; break; } p[i] = value[i]; } #endif if (buffer == 0) { int syncres; if (((syncres = Synchronize_Field(field)) != E_OK) && (res == E_OK)) res = syncres; if (((syncres = Synchronize_Linked_Fields(field)) != E_OK) && (res == E_OK)) res = syncres; } RETURN(res); } /*--------------------------------------------------------------------------- | Facility : libnform | Function : char *field_buffer(const FIELD *field,int buffer) | | Description : Return the address of the buffer for the field. | | Return Values : Pointer to buffer or NULL if arguments were invalid. +--------------------------------------------------------------------------*/ FORM_EXPORT(char *) field_buffer(const FIELD *field, int buffer) { char *result = 0; T((T_CALLED("field_buffer(%p,%d)"), (const void *)field, buffer)); if (field && (buffer >= 0) && (buffer <= field->nbuf)) { #if USE_WIDEC_SUPPORT FIELD_CELL *data = Address_Of_Nth_Buffer(field, buffer); size_t need = 0; int size = Buffer_Length(field); int n; /* determine the number of bytes needed to store the expanded string */ for (n = 0; n < size; ++n) { if (!isWidecExt(data[n]) && data[n].chars[0] != L'\0') { mbstate_t state; size_t next; init_mb(state); next = _nc_wcrtomb(0, data[n].chars[0], &state); if (next > 0) need += next; } } /* allocate a place to store the expanded string */ if (field->expanded[buffer] != 0) free(field->expanded[buffer]); field->expanded[buffer] = typeMalloc(char, need + 1); /* * Expand the multibyte data. * * It may also be multi-column data. In that case, the data for a row * may be null-padded to align to the dcols/drows layout (or it may * contain embedded wide-character extensions). Change the null-padding * to blanks as needed. */ if ((result = field->expanded[buffer]) != 0) { wclear(field->working); wmove(field->working, 0, 0); for (n = 0; n < size; ++n) { if (!isWidecExt(data[n]) && data[n].chars[0] != L'\0') wadd_wch(field->working, &data[n]); } wmove(field->working, 0, 0); winnstr(field->working, result, (int)need); } #else result = Address_Of_Nth_Buffer(field, buffer); #endif } returnPtr(result); } #if USE_WIDEC_SUPPORT /*--------------------------------------------------------------------------- | Convert a multibyte string to a wide-character string. The result must be | freed by the caller. +--------------------------------------------------------------------------*/ FORM_EXPORT(wchar_t *) _nc_Widen_String(char *source, int *lengthp) { wchar_t *result = 0; wchar_t wch; size_t given = strlen(source); size_t tries; int pass; int status; #ifndef state_unused mbstate_t state; #endif for (pass = 0; pass < 2; ++pass) { unsigned need = 0; size_t passed = 0; while (passed < given) { bool found = FALSE; for (tries = 1, status = 0; tries <= (given - passed); ++tries) { int save = source[passed + tries]; source[passed + tries] = 0; reset_mbytes(state); status = check_mbytes(wch, source + passed, tries, state); source[passed + tries] = (char)save; if (status > 0) { found = TRUE; break; } } if (found) { if (pass) { result[need] = wch; } passed += (size_t)status; ++need; } else { if (pass) { result[need] = (wchar_t)source[passed]; } ++need; ++passed; } } if (!pass) { if (!need) break; result = typeCalloc(wchar_t, need); *lengthp = (int)need; if (result == 0) break; } } return result; } #endif /* frm_driver.c ends here */ ncurses-6.4-20240113/package/0000755000000000000000000000000014550465535014044 5ustar rootrootncurses-6.4-20240113/package/debian-mingw64/0000755000000000000000000000000014550465535016557 5ustar rootrootncurses-6.4-20240113/package/debian-mingw64/copyright0000644000000000000000000001204314546070571020507 0ustar rootrootUpstream 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 ncurses-6.4-20240113/package/debian-mingw64/compat0000644000000000000000000000000314336210026017737 0ustar rootroot12 ncurses-6.4-20240113/package/debian-mingw64/rules0000755000000000000000000000700414450102064017620 0ustar rootroot#!/usr/bin/make -f # Made with the aid of dh_make, by Craig Small # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. # Some lines taken from debmake, by Cristoph Lameter. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) MY_ABI=6 BUILD_CC = gcc CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic TARGET = x86_64-w64-mingw32 MINGW_BIN = /usr/bin MINGW_TOP = /usr/$(TARGET) MINGW_TMP = $(CURDIR)/debian/mingw64-ncurses$(MY_ABI) CFLAGS = $(CC_NORMAL) verbose = # -v CONFIG_OPTIONS = \ --disable-db-install \ --disable-echo \ --disable-getcap \ --disable-hard-tabs \ --disable-leaks \ --disable-macros \ --disable-overwrite \ --disable-termcap \ --enable-interop \ --enable-opaque-curses \ --enable-opaque-form \ --enable-opaque-menu \ --enable-opaque-panel \ --enable-pc-files \ --enable-term-driver \ --enable-warnings \ --enable-widec \ --verbose \ --with-abi-version=$(MY_ABI) \ --with-cxx-shared \ --with-develop \ --with-fallbacks=unknown,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-pc-suffix=$(MY_ABI) \ --with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig \ $(CONFIG_OPTIONS) touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir $(MAKE) touch build-stamp clean: dh_testdir dh_testroot [ ! -f makefile ] || $(MAKE) distclean rm -f configure-stamp build-stamp install-stamp dh_clean install: install-stamp install-stamp: build-stamp dh_testdir dh_testroot dh_prep dh_installdirs $(verbose) $(MAKE) install.libs DESTDIR=$(MINGW_TMP) mkdir -p $(MINGW_TMP)$(MINGW_BIN) for name in $(MINGW_TMP)$(MINGW_TOP)/bin/*-config; \ do \ base=`basename $$name`; \ ln -v $$name $(MINGW_TMP)$(MINGW_BIN)/$(TARGET)-$$base; \ done touch install-stamp # Build architecture-independent files here. binary-indep: build install # No binary-indep target. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot $(verbose) dh_lintian $(verbose) dh_installdocs $(verbose) dh_installchangelogs $(verbose) NEWS # dh_strip dh_compress $(verbose) dh_fixperms $(verbose) dh_installdeb $(verbose) dh_shlibdeps $(verbose) dh_gencontrol $(verbose) dh_md5sums $(verbose) dh_builddeb $(verbose) binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install install-stamp ncurses-6.4-20240113/package/debian-mingw64/control0000644000000000000000000000114714336210335020151 0ustar rootrootSource: ncurses6 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-ncurses6 Architecture: any Depends: ${misc:Depends} Description: shared libraries for terminal handling The ncurses library routines are a terminal-independent method of updating character screens with reasonable optimization. . This package is used for testing ABI 6 with the MinGW 64-bit port. ncurses-6.4-20240113/package/debian-mingw64/source/0000755000000000000000000000000012432004723020040 5ustar rootrootncurses-6.4-20240113/package/debian-mingw64/source/format0000644000000000000000000000001512432004723021247 0ustar rootroot3.0 (native) ncurses-6.4-20240113/package/debian-mingw64/mingw64-ncurses6.lintian-overrides0000644000000000000000000000035413132010360025153 0ustar rootrootmingw64-ncurses6: latest-debian-changelog-entry-changed-to-native mingw64-ncurses6: non-standard-dir-in-usr mingw64-ncurses6: file-in-unusual-dir mingw64-ncurses6: binary-without-manpage mingw64-ncurses6: executable-not-elf-or-script ncurses-6.4-20240113/package/debian-mingw64/watch0000644000000000000000000000015213213045113017563 0ustar rootrootversion=3 opts=passive ftp://ftp.invisible-island.net/ncurses/current/ncurses\.tar.gz \ debian uupdate ncurses-6.4-20240113/package/debian-mingw64/changelog0000644000000000000000000000046514550465535020436 0ustar rootrootncurses6 (6.4+20240113) unstable; urgency=low * latest weekly patch -- Thomas E. Dickey Sat, 13 Jan 2024 05:52:13 -0500 ncurses6 (5.9+20131005) unstable; urgency=low * initial release -- Thomas E. Dickey Sat, 05 Oct 2013 13:35:29 -0400 ncurses-6.4-20240113/package/ncursestw.sym0000644000000000000000000004667614465722507016656 0ustar rootroot# $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 ncurses-6.4-20240113/package/debian-mingw/0000755000000000000000000000000014550465535016405 5ustar rootrootncurses-6.4-20240113/package/debian-mingw/copyright0000644000000000000000000001204314546070540020331 0ustar rootrootUpstream 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 ncurses-6.4-20240113/package/debian-mingw/mingw32-ncurses6.lintian-overrides0000644000000000000000000000035413132013672025005 0ustar rootrootmingw32-ncurses6: latest-debian-changelog-entry-changed-to-native mingw32-ncurses6: non-standard-dir-in-usr mingw32-ncurses6: file-in-unusual-dir mingw32-ncurses6: binary-without-manpage mingw32-ncurses6: executable-not-elf-or-script ncurses-6.4-20240113/package/debian-mingw/compat0000644000000000000000000000000314336207751017600 0ustar rootroot12 ncurses-6.4-20240113/package/debian-mingw/rules0000755000000000000000000000700214450102043017441 0ustar rootroot#!/usr/bin/make -f # Made with the aid of dh_make, by Craig Small # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. # Some lines taken from debmake, by Cristoph Lameter. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) MY_ABI=6 BUILD_CC = gcc CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic TARGET = i686-w64-mingw32 MINGW_BIN = /usr/bin MINGW_TOP = /usr/$(TARGET) MINGW_TMP = $(CURDIR)/debian/mingw32-ncurses$(MY_ABI) CFLAGS = $(CC_NORMAL) verbose = # -v CONFIG_OPTIONS = \ --disable-db-install \ --disable-echo \ --disable-getcap \ --disable-hard-tabs \ --disable-leaks \ --disable-macros \ --disable-overwrite \ --disable-termcap \ --enable-interop \ --enable-opaque-curses \ --enable-opaque-form \ --enable-opaque-menu \ --enable-opaque-panel \ --enable-pc-files \ --enable-term-driver \ --enable-warnings \ --enable-widec \ --verbose \ --with-abi-version=$(MY_ABI) \ --with-cxx-shared \ --with-develop \ --with-fallbacks=unknown,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-pc-suffix=$(MY_ABI) \ --with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig \ $(CONFIG_OPTIONS) touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir $(MAKE) touch build-stamp clean: dh_testdir dh_testroot [ ! -f makefile ] || $(MAKE) distclean rm -f configure-stamp build-stamp install-stamp dh_clean install: install-stamp install-stamp: build-stamp dh_testdir dh_testroot dh_prep dh_installdirs $(verbose) $(MAKE) install.libs DESTDIR=$(MINGW_TMP) mkdir -p $(MINGW_TMP)$(MINGW_BIN) for name in $(MINGW_TMP)$(MINGW_TOP)/bin/*-config; \ do \ base=`basename $$name`; \ ln -v $$name $(MINGW_TMP)$(MINGW_BIN)/$(TARGET)-$$base; \ done touch install-stamp # Build architecture-independent files here. binary-indep: build install # No binary-indep target. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot $(verbose) dh_lintian $(verbose) dh_installdocs $(verbose) dh_installchangelogs $(verbose) NEWS # dh_strip dh_compress $(verbose) dh_fixperms $(verbose) dh_installdeb $(verbose) dh_shlibdeps $(verbose) dh_gencontrol $(verbose) dh_md5sums $(verbose) dh_builddeb $(verbose) binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install install-stamp ncurses-6.4-20240113/package/debian-mingw/control0000644000000000000000000000114114336210420017764 0ustar rootrootSource: ncurses6 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-ncurses6 Architecture: any Depends: ${misc:Depends} Description: shared libraries for terminal handling The ncurses library routines are a terminal-independent method of updating character screens with reasonable optimization. . This package is used for testing ABI 6 with the MinGW 32-bit port. ncurses-6.4-20240113/package/debian-mingw/source/0000755000000000000000000000000012432004712017664 5ustar rootrootncurses-6.4-20240113/package/debian-mingw/source/format0000644000000000000000000000001512432004712021073 0ustar rootroot3.0 (native) ncurses-6.4-20240113/package/debian-mingw/watch0000644000000000000000000000015213213045121017410 0ustar rootrootversion=3 opts=passive ftp://ftp.invisible-island.net/ncurses/current/ncurses\.tar.gz \ debian uupdate ncurses-6.4-20240113/package/debian-mingw/changelog0000644000000000000000000000046514550465535020264 0ustar rootrootncurses6 (6.4+20240113) unstable; urgency=low * latest weekly patch -- Thomas E. Dickey Sat, 13 Jan 2024 05:52:13 -0500 ncurses6 (5.9+20131005) unstable; urgency=low * initial release -- Thomas E. Dickey Sat, 05 Oct 2013 13:35:29 -0400 ncurses-6.4-20240113/package/ncursest.spec0000644000000000000000000001115014550465535016564 0ustar rootrootSummary: Curses library with POSIX thread support. Name: ncursest6 Version: 6.4 Release: 20240113 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. ncurses-6.4-20240113/package/ncurses.map0000644000000000000000000006447414465723117016242 0ustar rootroot# $Id: ncurses.map,v 1.57 2023/08/12 15:33:35 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.4.current { 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; ncurses-6.4-20240113/package/ncursesw.map0000644000000000000000000006725414465723140016424 0ustar rootroot# $Id: ncursesw.map,v 1.61 2023/08/12 15:33:52 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.4.current { 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; ncurses-6.4-20240113/package/debian/0000755000000000000000000000000014550465535015266 5ustar rootrootncurses-6.4-20240113/package/debian/ncurses6.lintian-overrides0000644000000000000000000000132114175361605022407 0ustar rootroot# This is intentional. ncurses6: package-name-doesnt-match-sonames libformw6-6 libmenuw6-6 libncurses++w6-6 libncursesw6-6 libpanelw6-6 libticw6-6 libtinfow6-6 # This worked around a bug in Debian's build-scripts. #ncurses6: latest-debian-changelog-entry-changed-to-native ncurses6: hardening-no-fortify-functions usr/lib/libncurses++w6.so.6.1 #ncurses6: hardening-no-fortify-functions usr/lib/libformw6.so.6.1 ncurses6: hardening-no-fortify-functions usr/lib/libmenuw6.so.6.1 # This is intentional. ncurses6: binary-without-manpage ncurses6: non-dev-pkg-with-shlib-symlink ncurses6: embedded-library ncurses usr/lib/libtinfow6.so.6.1 #ncurses6: postinst-must-call-ldconfig usr/lib/libtinfow6.so.6.1 # vile: confmode ncurses-6.4-20240113/package/debian/copyright0000644000000000000000000001204314546070502017210 0ustar rootrootUpstream 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 ncurses-6.4-20240113/package/debian/compat0000644000000000000000000000000314336210572016454 0ustar rootroot12 ncurses-6.4-20240113/package/debian/rules0000755000000000000000000002030614546111006016331 0ustar rootroot#!/usr/bin/make -f # $Id: rules,v 1.52 2024/01/05 23:34:30 tom Exp $ # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # packages PACKAGES.indep = ncurses6-doc ncurses6-doc-html PACKAGES.arch = ncurses6 ncursest6 # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic MY_ABI=6 MY_DIR=/usr BINDIR=$(MY_DIR)/bin LIBDIR=$(MY_DIR)/lib/$(DEB_HOST_MULTIARCH) MYDATA=/usr/local/ncurses/share/terminfo NORMAL_DIR=$(CURDIR)/debian/ncurses$(MY_ABI) THREAD_DIR=$(CURDIR)/debian/ncursest$(MY_ABI) CFLAGS = $(shell dpkg-buildflags --get CFLAGS) $(CC_NORMAL) CXXFLAGS = $(shell dpkg-buildflags --get CXXFLAGS) CPPFLAGS = $(shell dpkg-buildflags --get CPPFLAGS) LDFLAGS = $(shell dpkg-buildflags --get LDFLAGS) ifneq ($(MY_DIR),/usr) RPATH_ENV = RPATH_LIST=../lib:$(LIBDIR) RPATH_OPT = --enable-rpath else RPATH_ENV = RPATH_OPT = --disable-rpath --disable-rpath-hack endif ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif verbose = # -v configure = \ $(RPATH_ENV) \ CFLAGS="$(CFLAGS)" \ CPPFLAGS="$(CPPFLAGS)" \ LDFLAGS="$(LDFLAGS)" ../../configure $(RPATH_OPT) \ --host=$(DEB_HOST_GNU_TYPE) \ --build=$(DEB_BUILD_GNU_TYPE) \ --prefix=$(MY_DIR) \ --libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH) \ --disable-echo \ --disable-getcap \ --disable-leaks \ --disable-macros \ --disable-overwrite \ --disable-relink \ --disable-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=dev \ --with-cxx-shared \ --with-default-terminfo-dir=$(MYDATA) \ --with-develop \ --with-extra-suffix=$(MY_ABI) \ --with-shared \ --with-terminfo-dirs=$(MYDATA):/lib/terminfo:/usr/share/terminfo \ --with-termlib \ --with-ticlib \ --with-trace \ --with-versioned-syms \ --with-xterm-kbs=DEL \ --without-ada \ --without-debug \ --with-manpage-aliases \ --with-manpage-symlinks \ --without-normal NCURSES6_DIR = $(CURDIR)/debian/ncurses6 NCURSEST6_DIR = $(CURDIR)/debian/ncursest6 .PHONY: all config build install binary clean config-indep config-arch \ build-indep build-arch install-indep install-arch binary-indep \ binary-arch all: build config: config-indep config-arch build: build-indep build-arch install: install-indep install-arch binary: binary-indep binary-arch clean: dh_testdir dh_testroot dh_clean $(verbose) rm -rf t config-indep: $(PACKAGES.indep:%=config-%-stamp) config-arch: $(PACKAGES.arch:%=config-%-stamp) build-indep: $(PACKAGES.indep:%=build-%-stamp) build-arch: $(PACKAGES.arch:%=build-%-stamp) install-indep: $(PACKAGES.indep:%=install-%-stamp) install-arch: $(PACKAGES.arch:%=install-%-stamp) # make the doc-package installable by renaming everything to avoid clashing patch-ncurses6-stamp: dh_testdir sed -i.bak \ -e 's/-config\.1$$/dev-config.1/;t' \ -e 's/\.3ncurses$$/.3ncurses6/' \ -e 's/\.3curses$$/.3curses6/' \ -e 's/\.3form$$/.3form6/' \ -e 's/\.3menu$$/.3menu6/' \ -e 's/\.3panel$$/.3panel6/' \ -e 's/\.\([157]\)$$/6.\1/' \ man/man_db.renames.in diff -u man/man_db.renames.in.bak man/man_db.renames.in || true touch $@ config-ncurses6-stamp: patch-ncurses6-stamp dh_testdir rm -rf t/ncurses6 mkdir -p t/ncurses6 cd t/ncurses6; $(configure) touch $@ config-ncursest6-stamp: patch-ncurses6-stamp dh_testdir rm -rf t/ncursest6 mkdir -p t/ncursest6 cd t/ncursest6; $(configure) \ --enable-interop \ --enable-sp-funcs \ --program-suffix=t$(MY_ABI) \ --with-pthread touch $@ config-ncurses6-doc-stamp \ config-ncurses6-doc-html-stamp: config-ncurses6-stamp touch $@ build-ncurses6-stamp: config-ncurses6-stamp dh_testdir $(MAKE) -C t/ncurses6 touch $@ build-ncursest6-stamp: config-ncursest6-stamp dh_testdir $(MAKE) -C t/ncursest6 touch $@ build-ncurses6-doc-stamp \ build-ncurses6-doc-html-stamp: build-ncurses6-stamp touch $@ install-ncurses6-stamp: build-ncurses6-stamp dh_testdir dh_testroot dh_installdirs $(verbose) dh_prep $(verbose) -pncurses6 $(MAKE) -C t/ncurses6 install.libs install.progs DESTDIR=$(NCURSES6_DIR) $(MAKE) -C t/ncurses6/test ncurses LOCAL_LIBDIR=$(LIBDIR) mv t/ncurses6/test/ncurses $(NCURSES6_DIR)$(BINDIR)/ncurses$(MY_ABI) touch $@ install-ncursest6-stamp: build-ncursest6-stamp dh_testdir dh_testroot dh_installdirs $(verbose) dh_prep $(verbose) -pncursest6 $(MAKE) -C t/ncursest6 install.libs install.progs DESTDIR=$(NCURSEST6_DIR) $(MAKE) -C t/ncursest6/test ncurses LOCAL_LIBDIR=$(LIBDIR) mv t/ncursest6/test/ncurses $(NCURSEST6_DIR)$(BINDIR)/ncursest$(MY_ABI) touch $@ install-ncurses6-doc-stamp: build-ncurses6-stamp dh_testdir dh_testroot dh_installdirs $(verbose) dh_prep $(verbose) -pncurses6-doc $(MAKE) -C t/ncurses6 install.man DESTDIR=$(NCURSES6_DIR)-doc 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/ncurses6-doc-html install-ncurses6-doc-html-stamp: build-ncurses6-stamp dh_testdir dh_testroot dh_installdirs $(verbose) dh_prep $(verbose) -pncurses6-doc-html cd doc/html && find * -type d | sort | xargs -I{} mkdir -p -v $(HTML_DESTDIR)/{} cd doc/html && find * -type f -name '*.html' | sort | xargs -I{} install -m 644 -p -v -T {} $(HTML_DESTDIR)/{} 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 ncurses-6.4-20240113/package/debian/control0000644000000000000000000000266014336210466016666 0ustar rootrootSource: ncurses6 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: ncurses6 Architecture: any Depends: ${misc:Depends}, libc6 (>= 2.4) Description: shared libraries for terminal handling The ncurses library routines are a terminal-independent method of updating character screens with reasonable optimization. . This package is used for testing ABI 6. Package: ncursest6 Architecture: any Depends: ${misc:Depends}, libc6 (>= 2.4) Description: shared libraries for terminal handling The ncurses library routines are a terminal-independent method of updating character screens with reasonable optimization. . This package is used for testing ABI 6 with pthreads. Package: ncurses6-doc Section: doc Architecture: all Depends: groff-base Description: shared libraries for terminal handling The ncurses library routines are a terminal-independent method of updating character screens with reasonable optimization. . This package is used for testing ncurses6 document packaging. Package: ncurses6-doc-html Section: doc Architecture: all Description: shared libraries for terminal handling The ncurses library routines are a terminal-independent method of updating character screens with reasonable optimization. . This package is used for testing ncurses6 document packaging. ncurses-6.4-20240113/package/debian/source/0000755000000000000000000000000012432004703016545 5ustar rootrootncurses-6.4-20240113/package/debian/source/format0000644000000000000000000000001512432004703017754 0ustar rootroot3.0 (native) ncurses-6.4-20240113/package/debian/ncursest6.triggers0000644000000000000000000000003213246576644020772 0ustar rootrootactivate-noawait ldconfig ncurses-6.4-20240113/package/debian/watch0000644000000000000000000000015213213045126016276 0ustar rootrootversion=3 opts=passive ftp://ftp.invisible-island.net/ncurses/current/ncurses\.tar.gz \ debian uupdate ncurses-6.4-20240113/package/debian/ncurses6.triggers0000644000000000000000000000003213246576644020606 0ustar rootrootactivate-noawait ldconfig ncurses-6.4-20240113/package/debian/changelog0000644000000000000000000000046514550465535017145 0ustar rootrootncurses6 (6.4+20240113) unstable; urgency=low * latest weekly patch -- Thomas E. Dickey Sat, 13 Jan 2024 05:52:13 -0500 ncurses6 (5.9+20120608) unstable; urgency=low * initial release -- Thomas E. Dickey Fri, 08 Jun 2012 07:54:29 -0400 ncurses-6.4-20240113/package/debian/ncursest6.lintian-overrides0000644000000000000000000000134614175361616022604 0ustar rootroot# This is intentional. ncursest6: package-name-doesnt-match-sonames libformtw6-6 libmenutw6-6 libncurses++tw6-6 libncursestw6-6 libpaneltw6-6 libtictw6-6 libtinfotw6-6 # This worked around a bug in Debian's build-scripts. #ncursest6: latest-debian-changelog-entry-changed-to-native ncursest6: hardening-no-fortify-functions usr/lib/libncurses++tw6.so.6.1 #ncursest6: hardening-no-fortify-functions usr/lib/libformtw6.so.6.1 ncursest6: hardening-no-fortify-functions usr/lib/libmenutw6.so.6.1 # This is intentional. ncursest6: binary-without-manpage ncursest6: non-dev-pkg-with-shlib-symlink ncursest6: embedded-library ncurses usr/lib/libtinfotw6.so.6.1 #ncursest6: postinst-must-call-ldconfig usr/lib/libtinfotw6.so.6.1 # vile: confmode ncurses-6.4-20240113/package/ncursest.map0000644000000000000000000006274514465723125016424 0ustar rootroot# $Id: ncursest.map,v 1.55 2023/08/12 15:33:41 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.4.current { 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; ncurses-6.4-20240113/package/ncursest.sym0000644000000000000000000004325614465722462016456 0ustar rootroot# $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 ncurses-6.4-20240113/package/ncurses.spec0000644000000000000000000001120314550465535016377 0ustar rootrootSummary: shared libraries for terminal handling Name: ncurses6 Version: 6.4 Release: 20240113 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. ncurses-6.4-20240113/package/ncurses.sym0000644000000000000000000004415114465722475016271 0ustar rootroot# $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 ncurses-6.4-20240113/package/mingw-ncurses.nsi0000644000000000000000000001263114550465535017363 0ustar rootroot; $Id: mingw-ncurses.nsi,v 1.628 2024/01/13 10:52:13 tom Exp $ ; TODO add examples ; TODO bump ABI to 6 ; Define the application name !define APPNAME "ncurses" !define EXENAME "ncurses.exe" !define VERSION_MAJOR "6" !define VERSION_MINOR "4" !define VERSION_YYYY "2024" !define VERSION_MMDD "0113" !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\" SectionEndncurses-6.4-20240113/package/mingw-ncurses.spec0000644000000000000000000001000014550465535017510 0ustar rootroot%?mingw_package_header Summary: shared libraries for terminal handling Name: mingw32-ncurses6 Version: 6.4 Release: 20240113 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. ncurses-6.4-20240113/package/ncursesw.sym0000644000000000000000000004615314465722436016461 0ustar rootroot# $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 ncurses-6.4-20240113/package/ncursestw.map0000644000000000000000000006736114465723132016610 0ustar rootroot# $Id: ncursestw.map,v 1.58 2023/08/12 15:33:46 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.4.current { 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; ncurses-6.4-20240113/README.emx0000644000000000000000000000774314062736236014131 0ustar rootroot------------------------------------------------------------------------------- -- 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. ncurses-6.4-20240113/VERSION0000644000000000000000000000002414550465535013515 0ustar rootroot5:0:10 6.4 20240113 ncurses-6.4-20240113/include/0000755000000000000000000000000014550604463014067 5ustar rootrootncurses-6.4-20240113/include/Caps.aix40000644000000000000000000016156514550604463015562 0ustar rootroot############################################################################## # 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.24 2024/01/13 22:05:39 tom Exp $ # # This is an adaptation of ncurses' termcap/terminfo capability table, which # is designed to align with AIX 4.x's terminfo. # # This table is used to generate initializers for tables that drive tic, # infocmp, and the library compilation code used to support the termcap # compatibility hack. It is also used to generate the tabular portion of the # terminfo(5) man page; lines beginning with `#%' are passed through to become # the terminfo table. # # This file has three major sections; a standard-capabilities table, two # extension-capability tables, and a section of aliases declarations. # The first two have the same format, as follows: # # FILE FORMAT # # Column 1: terminfo variable name # Column 2: terminfo capability name # Column 3: capability type (Boolean, numeric, or string) # Column 4: termcap capability name # Column 5: KEY_xxx name, if any, `-' otherwise # Column 6: value for KEY_xxx name, if any, `-' otherwise # Column 7: Lead with `Y' if capability should be emitted in termcap # translations, `-' otherwise # Column 8: capability description # # The codes following [Y-] in column 7 describe the versions of termcap which # use the given capability. This information is not used by the curses library # proper; rather, it is there to help the terminfo maintainer avoid emitting # termcap entry translations that are more than 1023 bytes long (and tank a # lot of old termcap-using programs). The codes read as follows: # B = mentioned in the BSD man page for 4.4BSD curses # C = used by the 4.4BSD curses library # G = mentioned in the documentation for GNU termcap # E = used by GNU Emacs # K = remove this terminfo capability when translating to standard format # The important codes are C and E. A cap with C or E should be preserved in # translation if possible. The problem is that preserving all such caps may # lead to some termcap translations being too long. The termcap maintainer # has a bit of a juggling act to do...potential problem cases are marked with # an asterisk (*). # # The aliases section has the following format: # # Column 1: either `capalias' or `infoalias' # Column 2: name to be aliased # Column 3: what name it should translate to. The name IGNORE means it # should be discarded with a warning message. # Column 4: name of the extension set (used for compiler warning messages) # Column 5: capability description (usually an associated terminfo variable) # # HANDLING TERMCAP AND TERMINFO EXTENSIONS # # There are basically five different ways to handle termcap and terminfo # extensions: # # 1. Don't list the capname here, or list it but comment it out (the latter # is preferable; someone might want to handle it in the future). If you do # this, the capability will be treated as unknown and raise a warning from # the compiler. # # 2. Alias it. This is appropriate if the capability has the same meaning # as an already-supported one. The compiler will handle aliasing, emitting # an appropriate informational message whenever an alias fires. # # 3. List it in the standard table. You almost certainly do *not* want # to do this -- the capabilities in that one, and their order, have been # carefully chosen to be SVr4-binary-compatible when they're written out # as a terminfo object, and breaking this would be bad. It is up to the ncurses # library what to do with the terminfo data after it is read in. # # 4. List it in the aliases table with an IGNORE target field. If you # do this, the capability will be ignored on input (though the user will # get a warning message about it). # # 5. List it in the extensions table. If you do this, the compiler will # silently accept the capability, but the curses library proper will never # see it (because it won't be written out as part of the terminfo object # format). It is up to you what you have the compiler do with it. # # There are two opposite reasons to choose option 5. One is when you want # to eat the capability silently and discard it when doing translations # to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are # in this class. Nothing will ever use them again. # # More usually, you want the compiler to try to deduce something from the # capability value that it can use to translate it into your output format. # You'll need to write custom code, probably in postprocess_termcap() or # postprocess_terminfo(), to handle the translation. # # CONTROLLING ENTRY LENGTH # # Notes on specific elisions made to fit translations within 1023 bytes: # # Machines with IBM PC-like keyboards want to be able to define the following # keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- # only environments for End or Home-Down), key_dc, and key_ic. This is also # the set of keys the `joe' editor will be upset if it can't see. So don't # trim those out of the set to be translated to termcap, or various users of # the termcap file will become irate. # # It might look tempting to leave those long init strings out of translations. # We can't do it (yet); 4.4BSD tput and tset use them. # # We retain the sgr capability in translation in spite of the fact that neither # 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are # hard to understand without it, and (b) the entries in which it is long tend # to be older types that don't use up a lot of string space on function keys. # The tic(1) translation code will complain and elide it if it makes a critical # difference (there is special code in tic to recognize this situation). # # Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion # optimizer in BSD curses didn't use them. This omission seems to be the # single most effective one, it shortened the resolved length of all thirteen # problem entries in the 9.9.0 version of the terminfo master below critical. # # It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap # translations go back over critical if we do this. As 4.4BSD curses fades # into history and GNU termcap's application base shrinks towards being GNU # Emacs only, we'll probably elide out some BSD-only capabilities in order # to buy space for non-essentials Emacs is still using. Capabilities high # on that hit list: rc, sc, uc. # ############################################################################# # # STANDARD CAPABILITIES # #%The following is a complete table of the capabilities included in a #%terminfo description block and available to terminfo-using code. #%In each line of the table, #%.bP #%The \fBvariable\fR is the name by which the programmer (at the terminfo level) #%accesses the capability. #%.bP #%The \fBcapname\fR (\fICap-name\fP) #%is the short name used in the text of the database, #%and is used by a person updating the database. #%.IP #%Whenever possible, capnames are chosen to be the same as or similar to #%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses #%identical or very similar names). #%Semantics are also intended to match those of the specification. #%.IP #%Capability names have no hard length limit, but an informal limit of 5 #%characters has been adopted to keep them short and to allow the tabs in #%the source file #%.B Caps #%to line up nicely. #%.bP #%The \fBtermcap\fP (\fITcap\fP) code is the old capability name #%(some capabilities are new, and have names which termcap did not originate). #%.bP #%Finally, the \fBdescription\fP field attempts to convey the semantics of the #%capability. #%.PP #%You may find some codes in the description field: #%.TP #%(P) #%indicates that padding may be specified #%.TP #%#[1-9] #%in the description field indicates that the string is passed #%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP). #%.IP #%If no parameters are listed in the description, #%passing the string through \fBtparm\fP(3X) may give unexpected results, #%e.g., if it contains percent (%%) signs. #%.TP #%(P*) #%indicates that padding may vary in proportion to the number of #%lines affected #%.TP #%(#\d\fIi\fP\u) #%indicates the \fIi\fP\uth\d parameter. #%. #%.PP #%.TS #%center; #%Lb Cb S Lb #%Lb Lb Lb Lb #%Lb Lb Lb 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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key key_f10 kf10 str k; KEY_F(10) - ----E F10 function key key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key key_home khome str kh KEY_HOME 0406 YBCGE home key key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key keypad_local rmkx str ke - - YBCGE leave 'keyboard_transmit' mode keypad_xmit smkx str ks - - YBCGE enter 'keyboard_transmit' mode lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 lab_f10 lf10 str la - - ----- label on function key f10 if not f10 lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 meta_off rmm str mo - - YB-G-* turn off meta mode meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) newline nel str nw - - YB-G-* newline (behave like cr followed by lf) pad_char pad str pc - - YBCGE padding char (instead of null) parm_dch dch str DC - - YB-GE delete #1 characters (P*) parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) parm_ich ich str IC - - YB-GE insert #1 characters (P*) parm_index indn str SF - - YBCG- scroll forward #1 lines (P) parm_insert_line il str AL - - YBCGE insert #1 lines (P*) parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 print_screen mc0 str ps - - -B-G-* print contents of screen prtr_off mc4 str pf - - -B-G-* turn off printer prtr_on mc5 str po - - -B-G-* turn on printer repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) reset_1string rs1 str r1 - - -B--- reset string reset_2string rs2 str r2 - - -B--- reset string reset_3string rs3 str r3 - - -B--- reset string reset_file rf str rf - - -B--- name of reset file restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) save_cursor sc str sc - - YBCG- save current cursor position (P) scroll_forward ind str sf - - YBCGE scroll text up (P) scroll_reverse ri str sr - - YBCGE scroll text down (P) set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) set_tab hts str st - - YB-G- set a tab in every row, current columns set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 tab ht str ta - - YBCGE tab to next 8-space hardware tab stop to_status_line tsl str ts - - YB-G- move to status line, column #1 underline_char uc str uc - - YBCG- underline char and move past it up_half_line hu str hu - - YB-G- half a line up init_prog iprog str iP - - -B--- path name of program for initialization key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes # # IBM extensions # # These extensions follow ptr_non (replacing everything after it) in IBM # terminfo files. # # The places in the box[12] capabilities correspond to acsc characters, here is # the mapping: # # box1[0] = ACS_ULCORNER # box1[1] = ACS_HLINE # box1[2] = ACS_URCORNER # box1[3] = ACS_VLINE # box1[4] = ACS_LRCORNER # box1[5] = ACS_LLCORNER # box1[6] = ACS_TTEE # box1[7] = ACS_RTEE # box1[8] = ACS_BTEE # box1[9] = ACS_LTEE # box1[10] = ACS_PLUS # # The box2 characters are the double-line versions of these forms graphics. # box_chars_1 box1 str bx - - ----K box characters primary set box_chars_2 box2 str by - - ----K box characters secondary set box_attr_1 batt1 str Bx - - ----K attributes for box1 box_attr_2 batt2 str By - - ----K attributes for box2 color_bg_0 colb0 str d0 - - ----K background color 0 color_bg_1 colb1 str d1 - - ----K background color 1 color_bg_2 colb2 str d2 - - ----K background color 2 color_bg_3 colb3 str d3 - - ----K background color 3 color_bg_4 colb4 str d4 - - ----K background color 4 color_bg_5 colb5 str d5 - - ----K background color 5 color_bg_6 colb6 str d6 - - ----K background color 6 color_bg_7 colb7 str d7 - - ----K background color 7 color_fg_0 colf0 str c0 - - ----K foreground color 0 color_fg_1 colf1 str c1 - - ----K foreground color 1 color_fg_2 colf2 str c2 - - ----K foreground color 2 color_fg_3 colf3 str c3 - - ----K foreground color 3 color_fg_4 colf4 str c4 - - ----K foreground color 4 color_fg_5 colf5 str c5 - - ----K foreground color 5 color_fg_6 colf6 str c6 - - ----K foreground color 6 color_fg_7 colf7 str c7 - - ----K foreground color 7 font_0 font0 str f0 - - ----K select font 0 font_1 font1 str f1 - - ----K select font 1 font_2 font2 str f2 - - ----K select font 2 font_3 font3 str f3 - - ----K select font 3 font_4 font4 str f4 - - ----K select font 4 font_5 font5 str f5 - - ----K select font 5 font_6 font6 str f6 - - ----K select font 6 font_7 font7 str f7 - - ----K select font 7 key_back_tab kbtab str kO - - ----K backtab key key_do kdo str ki - - ----K do request key key_command kcmd str @4 - - ----K command-request key key_command_pane kcpn str kW - - ----K command-pane key key_end kend str @7 KEY_END 0550 ----- end key key_help khlp str %1 - - ----- help key key_newline knl str kn - - ----K newline key key_next_pane knpn str kv - - ----K next-pane key key_prev_cmd kpcmd str kp - - ----K previous-command key key_prev_pane kppn str kV - - ----K previous-pane key key_quit kquit str kQ - - ----K quit key key_select_aix ksel str kU - - ----- select key key_scroll_left kscl str kz - - ----K scroll left key_scroll_right kscr str kZ - - ----K scroll right key_tab ktab str ko - - ----K tab key key_smap_in1 kmpf1 str Kv - - ----K special mapped key 1 input key_smap_out1 kmpt1 str KV - - ----K special mapped key 1 output key_smap_in2 kmpf2 str Kw - - ----K special mapped key 2 input key_smap_out2 kmpt2 str KW - - ----K special mapped key 2 output key_smap_in3 kmpf3 str Kx - - ----K special mapped key 3 input key_smap_out3 kmpt3 str KX - - ----K special mapped key 3 output key_smap_in4 kmpf4 str Ky - - ----K special mapped key 4 input key_smap_out4 kmpt4 str KY - - ----K special mapped key 4 output key_smap_in5 kmpf5 str Kz - - ----K special mapped key 5 input key_smap_out5 kmpt5 str KZ - - ----K special mapped key 5 output appl_defined_str apstr str za - - ----K application-defined string key_smap_in6 kmpf6 str Kr - - ----K special mapped key 6 input key_smap_out6 kmpt6 str KR - - ----K special mapped key 6 output key_smap_in7 kmpf7 str Ks - - ----K special mapped key 7 input key_smap_out7 kmpt7 str KS - - ----K special mapped key 7 output key_smap_in8 kmpf8 str Kt - - ----K special mapped key 8 input key_smap_out8 kmpt8 str KT - - ----K special mapped key 8 output key_smap_in9 kmpf9 str Ku - - ----K special mapped key 9 input key_smap_out9 kmpt9 str KU - - ----K special mapped key 9 output key_sf1 ksf1 str S1 - - ----K special function key 1 key_sf2 ksf2 str S2 - - ----K special function key 2 key_sf3 ksf3 str S3 - - ----K special function key 3 key_sf4 ksf4 str S4 - - ----K special function key 4 key_sf5 ksf5 str S5 - - ----K special function key 5 key_sf6 ksf6 str S6 - - ----K special function key 6 key_sf7 ksf7 str S7 - - ----K special function key 7 key_sf8 ksf8 str S8 - - ----K special function key 8 key_sf9 ksf9 str S9 - - ----K special function key 9 key_sf10 ksf10 str S0 - - ----K special function key 10 key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key key_f20 kf20 str FA KEY_F(20) - ----E F20 function key key_f21 kf21 str FB KEY_F(21) - ----E F21 function key key_f22 kf22 str FC KEY_F(22) - ----E F22 function key key_f23 kf23 str FD KEY_F(23) - ----E F23 function key key_f24 kf24 str FE KEY_F(24) - ----E F24 function key key_f25 kf25 str FF KEY_F(25) - ----E F25 function key key_f26 kf26 str FG KEY_F(26) - ----E F26 function key key_f27 kf27 str FH KEY_F(27) - ----E F27 function key key_f28 kf28 str FI KEY_F(28) - ----E F28 function key key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key key_f30 kf30 str FK KEY_F(30) - ----E F30 function key key_f31 kf31 str FL KEY_F(31) - ----E F31 function key key_f32 kf32 str FM KEY_F(32) - ----E F32 function key key_f33 kf33 str FN KEY_F(33) - ----E F33 function key key_f34 kf34 str FO KEY_F(34) - ----E F34 function key key_f35 kf35 str FP KEY_F(35) - ----E F35 function key key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key key_f37 kf37 str FR KEY_F(37) - ----E F37 function key key_f38 kf38 str FS KEY_F(38) - ----E F38 function key key_f39 kf39 str FT KEY_F(39) - ----E F39 function key key_f40 kf40 str FU KEY_F(40) - ----E F40 function key key_f41 kf41 str FV KEY_F(41) - ----E F41 function key key_f42 kf42 str FW KEY_F(42) - ----E F42 function key key_f43 kf43 str FX KEY_F(43) - ----E F43 function key key_f44 kf44 str FY KEY_F(44) - ----E F44 function key key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key key_action kact str kJ - - ----K sent by action key # The IBM docs say these capabilities are for table-drawing, and are # valid only for aixterm descriptions. enter_topline_mode topl str tp - - ----K start top-line mode enter_bottom_mode btml str bm - - ----K start bottom-line mode enter_rvert_mode rvert str rv - - ----K start right-vertical mode enter_lvert_mode lvert str lv - - ----K start left-vertical mode # # SVr4 capabilities resume here. Note that key_end is in the IBM-extensions. # char_padding rmp str rP - - ----- like ip but when in insert mode acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 plab_norm pln str pn - - ----- program label #1 to show string #2 key_btab kcbt str kB KEY_BTAB 0541 ----- back-tab key enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking enter_am_mode smam str SA - - ----- turn on automatic margins exit_am_mode rmam str RA - - ----- turn off automatic margins xon_character xonc str XN - - ----- XON character xoff_character xoffc str XF - - ----- XOFF character ena_acs enacs str eA - - ----- enable alternate char set label_on smln str LO - - ----- turn on soft labels label_off rmln str LF - - ----- turn off soft labels key_beg kbeg str @1 KEY_BEG 0542 ----- begin key key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key key_close kclo str @3 KEY_CLOSE 0544 ----- close key #key_command kcmd str @4 KEY_COMMAND 0545 ----- command key key_copy kcpy str @5 KEY_COPY 0546 ----- copy key key_create kcrt str @6 KEY_CREATE 0547 ----- create key #key_end kend str @7 KEY_END 0550 ----- end key key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key key_exit kext str @9 KEY_EXIT 0551 ----- exit key key_find kfnd str @0 KEY_FIND 0552 ----- find key #key_help khlp str %1 KEY_HELP 0553 ----- help key key_mark kmrk str %2 KEY_MARK 0554 ----- mark key key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key key_move kmov str %4 KEY_MOVE 0556 ----- move key key_next knxt str %5 KEY_NEXT 0557 ----- next key key_open kopn str %6 KEY_OPEN 0560 ----- open key key_options kopt str %7 KEY_OPTIONS 0561 ----- options key key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key key_print kprt str %9 KEY_PRINT 0532 ----- print key key_redo krdo str %0 KEY_REDO 0563 ----- redo key key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key key_restart krst str &4 KEY_RESTART 0567 ----- restart key key_resume kres str &5 KEY_RESUME 0570 ----- resume key key_save ksav str &6 KEY_SAVE 0571 ----- save key key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key key_undo kund str &8 KEY_UNDO 0630 ----- undo key key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key key_select kslt str *6 KEY_SELECT 0601 ----- select key key_send kEND str *7 KEY_SEND 0602 ----- shifted end key key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key req_for_input rfi str RF - - ----- send next input char (for ptys) clr_bol el1 str cb - - ----- Clear to beginning of line clear_margins mgc str MC - - ----- clear right and left soft margins set_left_margin smgl str ML - - ----- set left soft margin at current column. (ML is not in BSD termcap). set_right_margin smgr str MR - - ----- set right soft margin at current column label_format fln str Lf - - ----- label format set_clock sclk str SC - - ----- set clock, #1 hrs #2 mins #3 secs display_clock dclk str DK - - ----- display clock remove_clock rmclk str RC - - ----- remove clock create_window cwin str CW - - ----- define a window #1 from #2,#3 to #4,#5 goto_window wingo str WG - - ----- go to window #1 hangup hup str HU - - ----- hang-up phone dial_phone dial str DI - - ----- dial number #1 quick_dial qdial str QD - - ----- dial number #1 without checking tone tone str TO - - ----- select touch tone dialing pulse pulse str PU - - ----- select pulse dialing flash_hook hook str fh - - ----- flash switch hook fixed_pause pause str PA - - ----- pause for 2-3 seconds wait_tone wait str WA - - ----- wait for dial-tone user0 u0 str u0 - - ----- User string #0 user1 u1 str u1 - - ----- User string #1 user2 u2 str u2 - - ----- User string #2 user3 u3 str u3 - - ----- User string #3 user4 u4 str u4 - - ----- User string #4 user5 u5 str u5 - - ----- User string #5 user6 u6 str u6 - - ----- User string #6 user7 u7 str u7 - - ----- User string #7 user8 u8 str u8 - - ----- User string #8 user9 u9 str u9 - - ----- User string #9 # # SVr4 added these capabilities to support color # orig_pair op str op - - ----- Set default pair to its original value orig_colors oc str oc - - ----- Set all color pairs to the original ones initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) set_color_pair scp str sp - - ----- Set current color pair to #1 set_foreground setf str Sf - - ----- Set foreground color #1 set_background setb str Sb - - ----- Set background color #1 # # SVr4 added these capabilities to support printers # change_char_pitch cpi str ZA - - ----- Change number of characters per inch to #1 change_line_pitch lpi str ZB - - ----- Change number of lines per inch to #1 change_res_horz chr str ZC - - ----- Change horizontal resolution to #1 change_res_vert cvr str ZD - - ----- Change vertical resolution to #1 define_char defc str ZE - - ----- Define a character #1, #2 dots wide, descender #3 enter_doublewide_mode swidm str ZF - - ----- Enter double-wide mode enter_draft_quality sdrfq str ZG - - ----- Enter draft-quality mode enter_italics_mode sitm str ZH - - ----- Enter italic mode enter_leftward_mode slm str ZI - - ----- Start leftward carriage motion enter_micro_mode smicm str ZJ - - ----- Start micro-motion mode enter_near_letter_quality snlq str ZK - - ----- Enter NLQ mode enter_normal_quality snrmq str ZL - - ----- Enter normal-quality mode enter_shadow_mode sshm str ZM - - ----- Enter shadow-print mode enter_subscript_mode ssubm str ZN - - ----- Enter subscript mode enter_superscript_mode ssupm str ZO - - ----- Enter superscript mode enter_upward_mode sum str ZP - - ----- Start upward carriage motion exit_doublewide_mode rwidm str ZQ - - ----- End double-wide mode exit_italics_mode ritm str ZR - - ----- End italic mode exit_leftward_mode rlm str ZS - - ----- End left-motion mode exit_micro_mode rmicm str ZT - - ----- End micro-motion mode exit_shadow_mode rshm str ZU - - ----- End shadow-print mode exit_subscript_mode rsubm str ZV - - ----- End subscript mode exit_superscript_mode rsupm str ZW - - ----- End superscript mode exit_upward_mode rum str ZX - - ----- End reverse character motion micro_column_address mhpa str ZY - - ----- Like column_address in micro mode micro_down mcud1 str ZZ - - ----- Like cursor_down in micro mode micro_left mcub1 str Za - - ----- Like cursor_left in micro mode micro_right mcuf1 str Zb - - ----- Like cursor_right in micro mode micro_row_address mvpa str Zc - - ----- Like row_address #1 in micro mode micro_up mcuu1 str Zd - - ----- Like cursor_up in micro mode order_of_pins porder str Ze - - ----- Match software bits to print-head pins parm_down_micro mcud str Zf - - ----- Like parm_down_cursor in micro mode parm_left_micro mcub str Zg - - ----- Like parm_left_cursor in micro mode parm_right_micro mcuf str Zh - - ----- Like parm_right_cursor in micro mode parm_up_micro mcuu str Zi - - ----- Like parm_up_cursor in micro mode select_char_set scs str Zj - - ----- Select character set, #1 set_bottom_margin smgb str Zk - - ----- Set bottom margin at current line set_bottom_margin_parm smgbp str Zl - - ----- Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom set_left_margin_parm smglp str Zm - - ----- Set left (right) margin at column #1 set_right_margin_parm smgrp str Zn - - ----- Set right margin at column #1 set_top_margin smgt str Zo - - ----- Set top margin at current line set_top_margin_parm smgtp str Zp - - ----- Set top (bottom) margin at row #1 start_bit_image sbim str Zq - - ----- Start printing bit image graphics start_char_set_def scsd str Zr - - ----- Start character set definition #1, with #2 characters in the set stop_bit_image rbim str Zs - - ----- Stop printing bit image graphics stop_char_set_def rcsd str Zt - - ----- End definition of character set #1 subscript_characters subcs str Zu - - ----- List of subscriptable characters superscript_characters supcs str Zv - - ----- List of superscriptable characters these_cause_cr docr str Zw - - ----- Printing any of these characters causes CR zero_motion zerom str Zx - - ----- No motion for subsequent character #%.TE #%.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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 # ############################################################################# ncurses-6.4-20240113/include/win32_curses.h0000644000000000000000000000664514062736752016606 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2021 Thomas E. Dickey * * Copyright 2008-2014,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 2008-on * ****************************************************************************/ /* $Id: win32_curses.h,v 1.3 2021/06/17 21:26:02 tom Exp $ */ /* * This is the interface we use on Windows to mimic the control of the settings * of what acts like the classic TTY - the Windows Console. */ #if (defined(_WIN32) || defined(_WIN64)) #ifndef _NC_WIN32_CURSES_H #define _NC_WIN32_CURSES_H 1 struct winconmode { unsigned long dwFlagIn; unsigned long dwFlagOut; }; extern NCURSES_EXPORT(void*) _nc_console_fd2handle(int fd); extern NCURSES_EXPORT(int) _nc_console_setmode(void* handle, const struct winconmode* arg); extern NCURSES_EXPORT(int) _nc_console_getmode(void* handle, struct winconmode* arg); extern NCURSES_EXPORT(int) _nc_console_flush(void* handle); /* A few definitions of Unix functions we need to emulate */ #define SIGHUP 1 #define SIGKILL 9 #undef getlogin #define getlogin() getenv("USERNAME") #undef ttyname #define ttyname(fd) NULL #undef sleep #define sleep(n) Sleep((n) * 1000) #undef gettimeofday #define gettimeofday(tv,tz) _nc_gettimeofday(tv,tz) #endif /* _NC_WIN32_CURSES_H */ #endif /* _WIN32||_WIN64 */ ncurses-6.4-20240113/include/ncurses_mingw.h0000644000000000000000000000665414062736752017143 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/include/ncurses_dll.h.in0000644000000000000000000001015014425532273017157 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/include/tic.h0000644000000000000000000003374114420761421015021 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/include/Caps.uwin0000644000000000000000000012403614550604463015667 0ustar rootroot############################################################################## # 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.19 2024/01/13 22:05:39 tom Exp $ # # This is an adaptation of ncurses' termcap/terminfo capability table, which # is designed to align with U/Win's terminfo. # # This table is used to generate initializers for tables that drive tic, # infocmp, and the library compilation code used to support the termcap # compatibility hack. It is also used to generate the tabular portion of the # terminfo(5) man page; lines beginning with `#%' are passed through to become # the terminfo table. # # This file has three major sections; a standard-capabilities table, two # extension-capability tables, and a section of aliases declarations. # The first two have the same format, as follows: # # FILE FORMAT # # Column 1: terminfo variable name # Column 2: terminfo capability name # Column 3: capability type (Boolean, numeric, or string) # Column 4: termcap capability name # Column 5: KEY_xxx name, if any, `-' otherwise # Column 6: value for KEY_xxx name, if any, `-' otherwise # Column 7: Lead with `Y' if capability should be emitted in termcap # translations, `-' otherwise # Column 8: capability description # # The codes following [Y-] in column 7 describe the versions of termcap which # use the given capability. This information is not used by the curses library # proper; rather, it is there to help the terminfo maintainer avoid emitting # termcap entry translations that are more than 1023 bytes long (and tank a # lot of old termcap-using programs). The codes read as follows: # B = mentioned in the BSD man page for 4.4BSD curses # C = used by the 4.4BSD curses library # G = mentioned in the documentation for GNU termcap # E = used by GNU Emacs # K = remove this terminfo capability when translating to standard format # The important codes are C and E. A cap with C or E should be preserved in # translation if possible. The problem is that preserving all such caps may # lead to some termcap translations being too long. The termcap maintainer # has a bit of a juggling act to do...potential problem cases are marked with # an asterisk (*). # # The aliases section has the following format: # # Column 1: either `capalias' or `infoalias' # Column 2: name to be aliased # Column 3: what name it should translate to. The name IGNORE means it # should be discarded with a warning message. # Column 4: name of the extension set (used for compiler warning messages) # Column 5: capability description (usually an associated terminfo variable) # # HANDLING TERMCAP AND TERMINFO EXTENSIONS # # There are basically five different ways to handle termcap and terminfo # extensions: # # 1. Don't list the capname here, or list it but comment it out (the latter # is preferable; someone might want to handle it in the future). If you do # this, the capability will be treated as unknown and raise a warning from # the compiler. # # 2. Alias it. This is appropriate if the capability has the same meaning # as an already-supported one. The compiler will handle aliasing, emitting # an appropriate informational message whenever an alias fires. # # 3. List it in the standard table. You almost certainly do *not* want # to do this -- the capabilities in that one, and their order, have been # carefully chosen to be SVr4-binary-compatible when they're written out # as a terminfo object, and breaking this would be bad. It is up to the ncurses # library what to do with the terminfo data after it is read in. # # 4. List it in the aliases table with an IGNORE target field. If you # do this, the capability will be ignored on input (though the user will # get a warning message about it). # # 5. List it in the extensions table. If you do this, the compiler will # silently accept the capability, but the curses library proper will never # see it (because it won't be written out as part of the terminfo object # format). It is up to you what you have the compiler do with it. # # There are two opposite reasons to choose option 5. One is when you want # to eat the capability silently and discard it when doing translations # to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are # in this class. Nothing will ever use them again. # # More usually, you want the compiler to try to deduce something from the # capability value that it can use to translate it into your output format. # You'll need to write custom code, probably in postprocess_termcap() or # postprocess_terminfo(), to handle the translation. # # CONTROLLING ENTRY LENGTH # # Notes on specific elisions made to fit translations within 1023 bytes: # # Machines with IBM PC-like keyboards want to be able to define the following # keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- # only environments for End or Home-Down), key_dc, and key_ic. This is also # the set of keys the `joe' editor will be upset if it can't see. So don't # trim those out of the set to be translated to termcap, or various users of # the termcap file will become irate. # # It might look tempting to leave those long init strings out of translations. # We can't do it (yet); 4.4BSD tput and tset use them. # # We retain the sgr capability in translation in spite of the fact that neither # 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are # hard to understand without it, and (b) the entries in which it is long tend # to be older types that don't use up a lot of string space on function keys. # The tic(1) translation code will complain and elide it if it makes a critical # difference (there is special code in tic to recognize this situation). # # Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion # optimizer in BSD curses didn't use them. This omission seems to be the # single most effective one, it shortened the resolved length of all thirteen # problem entries in the 9.9.0 version of the terminfo master below critical. # # It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap # translations go back over critical if we do this. As 4.4BSD curses fades # into history and GNU termcap's application base shrinks towards being GNU # Emacs only, we'll probably elide out some BSD-only capabilities in order # to buy space for non-essentials Emacs is still using. Capabilities high # on that hit list: rc, sc, uc. # ############################################################################# # # STANDARD CAPABILITIES # #%The following is a complete table of the capabilities included in a #%terminfo description block and available to terminfo-using code. #%In each line of the table, #%.bP #%The \fBvariable\fR is the name by which the programmer (at the terminfo level) #%accesses the capability. #%.bP #%The \fBcapname\fR (\fICap-name\fP) #%is the short name used in the text of the database, #%and is used by a person updating the database. #%.IP #%Whenever possible, capnames are chosen to be the same as or similar to #%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses #%identical or very similar names). #%Semantics are also intended to match those of the specification. #%.IP #%Capability names have no hard length limit, but an informal limit of 5 #%characters has been adopted to keep them short and to allow the tabs in #%the source file #%.B Caps #%to line up nicely. #%.bP #%The \fBtermcap\fP (\fITcap\fP) code is the old capability name #%(some capabilities are new, and have names which termcap did not originate). #%.bP #%Finally, the \fBdescription\fP field attempts to convey the semantics of the #%capability. #%.PP #%You may find some codes in the description field: #%.TP #%(P) #%indicates that padding may be specified #%.TP #%#[1-9] #%in the description field indicates that the string is passed #%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP). #%.IP #%If no parameters are listed in the description, #%passing the string through \fBtparm\fP(3X) may give unexpected results, #%e.g., if it contains percent (%%) signs. #%.TP #%(P*) #%indicates that padding may vary in proportion to the number of #%lines affected #%.TP #%(#\d\fIi\fP\u) #%indicates the \fIi\fP\uth\d parameter. #%. #%.PP #%.TS #%center; #%Lb Cb S Lb #%Lb Lb Lb Lb #%Lb Lb Lb 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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key key_f10 kf10 str k; KEY_F(10) - ----E F10 function key key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key key_home khome str kh KEY_HOME 0406 YBCGE home key key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key keypad_local rmkx str ke - - YBCGE leave 'keyboard_transmit' mode keypad_xmit smkx str ks - - YBCGE enter 'keyboard_transmit' mode lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 lab_f10 lf10 str la - - ----- label on function key f10 if not f10 lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 meta_off rmm str mo - - YB-G-* turn off meta mode meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) newline nel str nw - - YB-G-* newline (behave like cr followed by lf) pad_char pad str pc - - YBCGE padding char (instead of null) parm_dch dch str DC - - YB-GE delete #1 characters (P*) parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) parm_ich ich str IC - - YB-GE insert #1 characters (P*) parm_index indn str SF - - YBCG- scroll forward #1 lines (P) parm_insert_line il str AL - - YBCGE insert #1 lines (P*) parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 print_screen mc0 str ps - - -B-G-* print contents of screen prtr_off mc4 str pf - - -B-G-* turn off printer prtr_on mc5 str po - - -B-G-* turn on printer repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) reset_1string rs1 str r1 - - -B--- reset string reset_2string rs2 str r2 - - -B--- reset string reset_3string rs3 str r3 - - -B--- reset string reset_file rf str rf - - -B--- name of reset file restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) save_cursor sc str sc - - YBCG- save current cursor position (P) scroll_forward ind str sf - - YBCGE scroll text up (P) scroll_reverse ri str sr - - YBCGE scroll text down (P) set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) set_tab hts str st - - YB-G- set a tab in every row, current columns set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 tab ht str ta - - YBCGE tab to next 8-space hardware tab stop to_status_line tsl str ts - - YB-G- move to status line, column #1 underline_char uc str uc - - YBCG- underline char and move past it up_half_line hu str hu - - YB-G- half a line up init_prog iprog str iP - - -B--- path name of program for initialization key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes # # SVr1 capabilities stop here. IBM's version of terminfo is the same as # SVr4 up to this point, but has a different set afterwards. # char_padding rmp str rP - - ----- like ip but when in insert mode acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 plab_norm pln str pn - - ----- program label #1 to show string #2 key_btab kcbt str kB KEY_BTAB 0541 ----- back-tab key enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking enter_am_mode smam str SA - - ----- turn on automatic margins exit_am_mode rmam str RA - - ----- turn off automatic margins xon_character xonc str XN - - ----- XON character xoff_character xoffc str XF - - ----- XOFF character ena_acs enacs str eA - - ----- enable alternate char set label_on smln str LO - - ----- turn on soft labels label_off rmln str LF - - ----- turn off soft labels key_beg kbeg str @1 KEY_BEG 0542 ----- begin key key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key key_close kclo str @3 KEY_CLOSE 0544 ----- close key key_command kcmd str @4 KEY_COMMAND 0545 ----- command key key_copy kcpy str @5 KEY_COPY 0546 ----- copy key key_create kcrt str @6 KEY_CREATE 0547 ----- create key key_end kend str @7 KEY_END 0550 ----- end key key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key key_exit kext str @9 KEY_EXIT 0551 ----- exit key key_find kfnd str @0 KEY_FIND 0552 ----- find key key_help khlp str %1 KEY_HELP 0553 ----- help key key_mark kmrk str %2 KEY_MARK 0554 ----- mark key key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key key_move kmov str %4 KEY_MOVE 0556 ----- move key key_next knxt str %5 KEY_NEXT 0557 ----- next key key_open kopn str %6 KEY_OPEN 0560 ----- open key key_options kopt str %7 KEY_OPTIONS 0561 ----- options key key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key key_print kprt str %9 KEY_PRINT 0532 ----- print key key_redo krdo str %0 KEY_REDO 0563 ----- redo key key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key key_restart krst str &4 KEY_RESTART 0567 ----- restart key key_resume kres str &5 KEY_RESUME 0570 ----- resume key key_save ksav str &6 KEY_SAVE 0571 ----- save key key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key key_undo kund str &8 KEY_UNDO 0630 ----- undo key key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key key_select kslt str *6 KEY_SELECT 0601 ----- select key key_send kEND str *7 KEY_SEND 0602 ----- shifted end key key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key req_for_input rfi str RF - - ----- send next input char (for ptys) key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key key_f20 kf20 str FA KEY_F(20) - ----E F20 function key key_f21 kf21 str FB KEY_F(21) - ----E F21 function key key_f22 kf22 str FC KEY_F(22) - ----E F22 function key key_f23 kf23 str FD KEY_F(23) - ----E F23 function key key_f24 kf24 str FE KEY_F(24) - ----E F24 function key key_f25 kf25 str FF KEY_F(25) - ----E F25 function key key_f26 kf26 str FG KEY_F(26) - ----E F26 function key key_f27 kf27 str FH KEY_F(27) - ----E F27 function key key_f28 kf28 str FI KEY_F(28) - ----E F28 function key key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key key_f30 kf30 str FK KEY_F(30) - ----E F30 function key key_f31 kf31 str FL KEY_F(31) - ----E F31 function key key_f32 kf32 str FM KEY_F(32) - ----E F32 function key key_f33 kf33 str FN KEY_F(33) - ----E F33 function key key_f34 kf34 str FO KEY_F(34) - ----E F34 function key key_f35 kf35 str FP KEY_F(35) - ----E F35 function key key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key key_f37 kf37 str FR KEY_F(37) - ----E F37 function key key_f38 kf38 str FS KEY_F(38) - ----E F38 function key key_f39 kf39 str FT KEY_F(39) - ----E F39 function key key_f40 kf40 str FU KEY_F(40) - ----E F40 function key key_f41 kf41 str FV KEY_F(41) - ----E F41 function key key_f42 kf42 str FW KEY_F(42) - ----E F42 function key key_f43 kf43 str FX KEY_F(43) - ----E F43 function key key_f44 kf44 str FY KEY_F(44) - ----E F44 function key key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key clr_bol el1 str cb - - ----- Clear to beginning of line clear_margins mgc str MC - - ----- clear right and left soft margins set_left_margin smgl str ML - - ----- set left soft margin at current column. (ML is not in BSD termcap). set_right_margin smgr str MR - - ----- set right soft margin at current column device_type devt str dv - - ----- Indicate language/codeset support code_set_init csin str ci - - ----- Init sequence for multiple codesets set0_des_seq s0ds str s0 - - ----- Shift to codeset 0 (EUC set 0, ASCII) set1_des_seq s1ds str s1 - - ----- Shift to codeset 1 set2_des_seq s2ds str s2 - - ----- Shift to codeset 2 set3_des_seq s3ds str s3 - - ----- Shift to codeset 3 key_mouse kmous str Km KEY_MOUSE 0631 ----- Mouse event has occurred mouse_info minfo str Mi - - ----- Mouse status information req_mouse_pos reqmp str RQ - - ----- Request mouse position get_mouse getm str Gm - - ----- Curses should get button events, parameter #1 not documented. release_mouse relm str Rm - - ----- Curses should release the mouse */ color_names colornm str Yw - - ----- Give name for color #1 initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) orig_colors oc str oc - - ----- Set all color pairs to the original ones orig_pair op str op - - ----- Set default pair to its original value set_a_background setab str AB - - ----- Set background color to #1, using ANSI escape set_a_foreground setaf str AF - - ----- Set foreground color to #1, using ANSI escape set_background setb str Sb - - ----- Set background color #1 set_color_pair scp str sp - - ----- Set current color pair to #1 set_foreground setf str Sf - - ----- Set foreground color #1 #%.TE #% # 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 # ############################################################################# ncurses-6.4-20240113/include/Caps0000644000000000000000000014775414550604463014722 0ustar rootroot############################################################################## # 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.52 2024/01/13 22:05:39 tom Exp $ # # This is the master termcap/terminfo capability table. # # This table is used to generate initializers for tables that drive tic, # infocmp, and the library compilation code used to support the termcap # compatibility hack. It is also used to generate the tabular portion of the # terminfo(5) man page; lines beginning with `#%' are passed through to become # the terminfo table. # # This file has three major sections; a standard-capabilities table, two # extension-capability tables, and a section of aliases declarations. # The first two have the same format, as follows: # # FILE FORMAT # # Column 1: terminfo variable name # Column 2: terminfo capability name # Column 3: capability type (Boolean, numeric, or string) # Column 4: termcap capability name # Column 5: KEY_xxx name, if any, `-' otherwise # Column 6: value for KEY_xxx name, if any, `-' otherwise # Column 7: Lead with `Y' if capability should be emitted in termcap # translations, `-' otherwise # Column 8: capability description # # The codes following [Y-] in column 7 describe the versions of termcap which # use the given capability. This information is not used by the curses library # proper; rather, it is there to help the terminfo maintainer avoid emitting # termcap entry translations that are more than 1023 bytes long (and tank a # lot of old termcap-using programs). The codes read as follows: # B = mentioned in the BSD man page for 4.4BSD curses # C = used by the 4.4BSD curses library # G = mentioned in the documentation for GNU termcap # E = used by GNU Emacs # K = remove this terminfo capability when translating to standard format # The important codes are C and E. A cap with C or E should be preserved in # translation if possible. The problem is that preserving all such caps may # lead to some termcap translations being too long. The termcap maintainer # has a bit of a juggling act to do...potential problem cases are marked with # an asterisk (*). # # The aliases section has the following format: # # Column 1: either `capalias' or `infoalias' # Column 2: name to be aliased # Column 3: what name it should translate to. The name IGNORE means it # should be discarded with a warning message. # Column 4: name of the extension set (used for compiler warning messages) # Column 5: capability description (usually an associated terminfo variable) # # HANDLING TERMCAP AND TERMINFO EXTENSIONS # # There are basically five different ways to handle termcap and terminfo # extensions: # # 1. Don't list the capname here, or list it but comment it out (the latter # is preferable; someone might want to handle it in the future). If you do # this, the capability will be treated as unknown and raise a warning from # the compiler. # # 2. Alias it. This is appropriate if the capability has the same meaning # as an already-supported one. The compiler will handle aliasing, emitting # an appropriate informational message whenever an alias fires. # # 3. List it in the standard table. You almost certainly do *not* want # to do this -- the capabilities in that one, and their order, have been # carefully chosen to be SVr4-binary-compatible when they're written out # as a terminfo object, and breaking this would be bad. It is up to the ncurses # library what to do with the terminfo data after it is read in. # # 4. List it in the aliases table with an IGNORE target field. If you # do this, the capability will be ignored on input (though the user will # get a warning message about it). # # 5. List it in the extensions table. If you do this, the compiler will # silently accept the capability, but the curses library proper will never # see it (because it won't be written out as part of the terminfo object # format). It is up to you what you have the compiler do with it. # # There are two opposite reasons to choose option 5. One is when you want # to eat the capability silently and discard it when doing translations # to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are # in this class. Nothing will ever use them again. # # More usually, you want the compiler to try to deduce something from the # capability value that it can use to translate it into your output format. # You'll need to write custom code, probably in postprocess_termcap() or # postprocess_terminfo(), to handle the translation. # # CONTROLLING ENTRY LENGTH # # Notes on specific elisions made to fit translations within 1023 bytes: # # Machines with IBM PC-like keyboards want to be able to define the following # keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- # only environments for End or Home-Down), key_dc, and key_ic. This is also # the set of keys the `joe' editor will be upset if it can't see. So don't # trim those out of the set to be translated to termcap, or various users of # the termcap file will become irate. # # It might look tempting to leave those long init strings out of translations. # We can't do it (yet); 4.4BSD tput and tset use them. # # We retain the sgr capability in translation in spite of the fact that neither # 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are # hard to understand without it, and (b) the entries in which it is long tend # to be older types that don't use up a lot of string space on function keys. # The tic(1) translation code will complain and elide it if it makes a critical # difference (there is special code in tic to recognize this situation). # # Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion # optimizer in BSD curses didn't use them. This omission seems to be the # single most effective one, it shortened the resolved length of all thirteen # problem entries in the 9.9.0 version of the terminfo master below critical. # # It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap # translations go back over critical if we do this. As 4.4BSD curses fades # into history and GNU termcap's application base shrinks towards being GNU # Emacs only, we'll probably elide out some BSD-only capabilities in order # to buy space for non-essentials Emacs is still using. Capabilities high # on that hit list: rc, sc, uc. # ############################################################################# # # STANDARD CAPABILITIES # #%The following is a complete table of the capabilities included in a #%terminfo description block and available to terminfo-using code. #%In each line of the table, #%.bP #%The \fBvariable\fR is the name by which the programmer (at the terminfo level) #%accesses the capability. #%.bP #%The \fBcapname\fR (\fICap-name\fP) #%is the short name used in the text of the database, #%and is used by a person updating the database. #%.IP #%Whenever possible, capnames are chosen to be the same as or similar to #%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses #%identical or very similar names). #%Semantics are also intended to match those of the specification. #%.IP #%Capability names have no hard length limit, but an informal limit of 5 #%characters has been adopted to keep them short and to allow the tabs in #%the source file #%.B Caps #%to line up nicely. #%.bP #%The \fBtermcap\fP (\fITcap\fP) code is the old capability name #%(some capabilities are new, and have names which termcap did not originate). #%.bP #%Finally, the \fBdescription\fP field attempts to convey the semantics of the #%capability. #%.PP #%You may find some codes in the description field: #%.TP #%(P) #%indicates that padding may be specified #%.TP #%#[1-9] #%in the description field indicates that the string is passed #%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP). #%.IP #%If no parameters are listed in the description, #%passing the string through \fBtparm\fP(3X) may give unexpected results, #%e.g., if it contains percent (%%) signs. #%.TP #%(P*) #%indicates that padding may vary in proportion to the number of #%lines affected #%.TP #%(#\d\fIi\fP\u) #%indicates the \fIi\fP\uth\d parameter. #%. #%.PP #%.TS #%center; #%Lb Cb S Lb #%Lb Lb Lb Lb #%Lb Lb Lb 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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key key_f10 kf10 str k; KEY_F(10) - ----E F10 function key key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key key_home khome str kh KEY_HOME 0406 YBCGE home key key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key keypad_local rmkx str ke - - YBCGE leave keyboard transmit mode keypad_xmit smkx str ks - - YBCGE enter keyboard transmit mode lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 lab_f10 lf10 str la - - ----- label on function key f10 if not f10 lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 meta_off rmm str mo - - YB-G-* turn off meta mode meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) newline nel str nw - - YB-G-* newline (behave like cr followed by lf) pad_char pad str pc - - YBCGE padding char (instead of null) parm_dch dch str DC - - YB-GE delete #1 characters (P*) parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) parm_ich ich str IC - - YB-GE insert #1 characters (P*) parm_index indn str SF - - YBCG- scroll forward #1 lines (P) parm_insert_line il str AL - - YBCGE insert #1 lines (P*) parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 print_screen mc0 str ps - - -B-G-* print contents of screen prtr_off mc4 str pf - - -B-G-* turn off printer prtr_on mc5 str po - - -B-G-* turn on printer repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) reset_1string rs1 str r1 - - -B--- reset string reset_2string rs2 str r2 - - -B--- reset string reset_3string rs3 str r3 - - -B--- reset string reset_file rf str rf - - -B--- name of reset file restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) save_cursor sc str sc - - YBCG- save current cursor position (P) scroll_forward ind str sf - - YBCGE scroll text up (P) scroll_reverse ri str sr - - YBCGE scroll text down (P) set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) set_tab hts str st - - YB-G- set a tab in every row, current columns set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 tab ht str ta - - YBCGE tab to next 8-space hardware tab stop to_status_line tsl str ts - - YB-G- move to status line, column #1 underline_char uc str uc - - YBCG- underline char and move past it up_half_line hu str hu - - YB-G- half a line up init_prog iprog str iP - - -B--- path name of program for initialization key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes # # SVr1 capabilities stop here. IBM's version of terminfo is the same as # SVr4 up to this point, but has a different set afterwards. # char_padding rmp str rP - - ----- like ip but when in insert mode acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 plab_norm pln str pn - - ----- program label #1 to show string #2 key_btab kcbt str kB KEY_BTAB 0541 ----- back-tab key enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking enter_am_mode smam str SA - - ----- turn on automatic margins exit_am_mode rmam str RA - - ----- turn off automatic margins xon_character xonc str XN - - ----- XON character xoff_character xoffc str XF - - ----- XOFF character ena_acs enacs str eA - - ----- enable alternate char set label_on smln str LO - - ----- turn on soft labels label_off rmln str LF - - ----- turn off soft labels key_beg kbeg str @1 KEY_BEG 0542 ----- begin key key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key key_close kclo str @3 KEY_CLOSE 0544 ----- close key key_command kcmd str @4 KEY_COMMAND 0545 ----- command key key_copy kcpy str @5 KEY_COPY 0546 ----- copy key key_create kcrt str @6 KEY_CREATE 0547 ----- create key key_end kend str @7 KEY_END 0550 ----- end key key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key key_exit kext str @9 KEY_EXIT 0551 ----- exit key key_find kfnd str @0 KEY_FIND 0552 ----- find key key_help khlp str %1 KEY_HELP 0553 ----- help key key_mark kmrk str %2 KEY_MARK 0554 ----- mark key key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key key_move kmov str %4 KEY_MOVE 0556 ----- move key key_next knxt str %5 KEY_NEXT 0557 ----- next key key_open kopn str %6 KEY_OPEN 0560 ----- open key key_options kopt str %7 KEY_OPTIONS 0561 ----- options key key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key key_print kprt str %9 KEY_PRINT 0532 ----- print key key_redo krdo str %0 KEY_REDO 0563 ----- redo key key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key key_restart krst str &4 KEY_RESTART 0567 ----- restart key key_resume kres str &5 KEY_RESUME 0570 ----- resume key key_save ksav str &6 KEY_SAVE 0571 ----- save key key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key key_undo kund str &8 KEY_UNDO 0630 ----- undo key key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key key_select kslt str *6 KEY_SELECT 0601 ----- select key key_send kEND str *7 KEY_SEND 0602 ----- shifted end key key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key req_for_input rfi str RF - - ----- send next input char (for ptys) key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key key_f20 kf20 str FA KEY_F(20) - ----E F20 function key key_f21 kf21 str FB KEY_F(21) - ----E F21 function key key_f22 kf22 str FC KEY_F(22) - ----E F22 function key key_f23 kf23 str FD KEY_F(23) - ----E F23 function key key_f24 kf24 str FE KEY_F(24) - ----E F24 function key key_f25 kf25 str FF KEY_F(25) - ----E F25 function key key_f26 kf26 str FG KEY_F(26) - ----E F26 function key key_f27 kf27 str FH KEY_F(27) - ----E F27 function key key_f28 kf28 str FI KEY_F(28) - ----E F28 function key key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key key_f30 kf30 str FK KEY_F(30) - ----E F30 function key key_f31 kf31 str FL KEY_F(31) - ----E F31 function key key_f32 kf32 str FM KEY_F(32) - ----E F32 function key key_f33 kf33 str FN KEY_F(33) - ----E F33 function key key_f34 kf34 str FO KEY_F(34) - ----E F34 function key key_f35 kf35 str FP KEY_F(35) - ----E F35 function key key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key key_f37 kf37 str FR KEY_F(37) - ----E F37 function key key_f38 kf38 str FS KEY_F(38) - ----E F38 function key key_f39 kf39 str FT KEY_F(39) - ----E F39 function key key_f40 kf40 str FU KEY_F(40) - ----E F40 function key key_f41 kf41 str FV KEY_F(41) - ----E F41 function key key_f42 kf42 str FW KEY_F(42) - ----E F42 function key key_f43 kf43 str FX KEY_F(43) - ----E F43 function key key_f44 kf44 str FY KEY_F(44) - ----E F44 function key key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key clr_bol el1 str cb - - ----- Clear to beginning of line clear_margins mgc str MC - - ----- clear right and left soft margins set_left_margin smgl str ML - - ----- set left soft margin at current column. (ML is not in BSD termcap). set_right_margin smgr str MR - - ----- set right soft margin at current column label_format fln str Lf - - ----- label format set_clock sclk str SC - - ----- set clock, #1 hrs #2 mins #3 secs display_clock dclk str DK - - ----- display clock remove_clock rmclk str RC - - ----- remove clock create_window cwin str CW - - ----- define a window #1 from #2,#3 to #4,#5 goto_window wingo str WG - - ----- go to window #1 hangup hup str HU - - ----- hang-up phone dial_phone dial str DI - - ----- dial number #1 quick_dial qdial str QD - - ----- dial number #1 without checking tone tone str TO - - ----- select touch tone dialing pulse pulse str PU - - ----- select pulse dialing flash_hook hook str fh - - ----- flash switch hook fixed_pause pause str PA - - ----- pause for 2-3 seconds wait_tone wait str WA - - ----- wait for dial-tone user0 u0 str u0 - - ----- User string #0 user1 u1 str u1 - - ----- User string #1 user2 u2 str u2 - - ----- User string #2 user3 u3 str u3 - - ----- User string #3 user4 u4 str u4 - - ----- User string #4 user5 u5 str u5 - - ----- User string #5 user6 u6 str u6 - - ----- User string #6 user7 u7 str u7 - - ----- User string #7 user8 u8 str u8 - - ----- User string #8 user9 u9 str u9 - - ----- User string #9 # # SVr4 added these capabilities to support color # orig_pair op str op - - ----- Set default pair to its original value orig_colors oc str oc - - ----- Set all color pairs to the original ones initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) set_color_pair scp str sp - - ----- Set current color pair to #1 set_foreground setf str Sf - - ----- Set foreground color #1 set_background setb str Sb - - ----- Set background color #1 # # SVr4 added these capabilities to support printers # change_char_pitch cpi str ZA - - ----- Change number of characters per inch to #1 change_line_pitch lpi str ZB - - ----- Change number of lines per inch to #1 change_res_horz chr str ZC - - ----- Change horizontal resolution to #1 change_res_vert cvr str ZD - - ----- Change vertical resolution to #1 define_char defc str ZE - - ----- Define a character #1, #2 dots wide, descender #3 enter_doublewide_mode swidm str ZF - - ----- Enter double-wide mode enter_draft_quality sdrfq str ZG - - ----- Enter draft-quality mode enter_italics_mode sitm str ZH - - ----- Enter italic mode enter_leftward_mode slm str ZI - - ----- Start leftward carriage motion enter_micro_mode smicm str ZJ - - ----- Start micro-motion mode enter_near_letter_quality snlq str ZK - - ----- Enter NLQ mode enter_normal_quality snrmq str ZL - - ----- Enter normal-quality mode enter_shadow_mode sshm str ZM - - ----- Enter shadow-print mode enter_subscript_mode ssubm str ZN - - ----- Enter subscript mode enter_superscript_mode ssupm str ZO - - ----- Enter superscript mode enter_upward_mode sum str ZP - - ----- Start upward carriage motion exit_doublewide_mode rwidm str ZQ - - ----- End double-wide mode exit_italics_mode ritm str ZR - - ----- End italic mode exit_leftward_mode rlm str ZS - - ----- End left-motion mode exit_micro_mode rmicm str ZT - - ----- End micro-motion mode exit_shadow_mode rshm str ZU - - ----- End shadow-print mode exit_subscript_mode rsubm str ZV - - ----- End subscript mode exit_superscript_mode rsupm str ZW - - ----- End superscript mode exit_upward_mode rum str ZX - - ----- End reverse character motion micro_column_address mhpa str ZY - - ----- Like column_address in micro mode micro_down mcud1 str ZZ - - ----- Like cursor_down in micro mode micro_left mcub1 str Za - - ----- Like cursor_left in micro mode micro_right mcuf1 str Zb - - ----- Like cursor_right in micro mode micro_row_address mvpa str Zc - - ----- Like row_address #1 in micro mode micro_up mcuu1 str Zd - - ----- Like cursor_up in micro mode order_of_pins porder str Ze - - ----- Match software bits to print-head pins parm_down_micro mcud str Zf - - ----- Like parm_down_cursor in micro mode parm_left_micro mcub str Zg - - ----- Like parm_left_cursor in micro mode parm_right_micro mcuf str Zh - - ----- Like parm_right_cursor in micro mode parm_up_micro mcuu str Zi - - ----- Like parm_up_cursor in micro mode select_char_set scs str Zj - - ----- Select character set, #1 set_bottom_margin smgb str Zk - - ----- Set bottom margin at current line set_bottom_margin_parm smgbp str Zl - - ----- Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom set_left_margin_parm smglp str Zm - - ----- Set left (right) margin at column #1 set_right_margin_parm smgrp str Zn - - ----- Set right margin at column #1 set_top_margin smgt str Zo - - ----- Set top margin at current line set_top_margin_parm smgtp str Zp - - ----- Set top (bottom) margin at row #1 start_bit_image sbim str Zq - - ----- Start printing bit image graphics start_char_set_def scsd str Zr - - ----- Start character set definition #1, with #2 characters in the set stop_bit_image rbim str Zs - - ----- Stop printing bit image graphics stop_char_set_def rcsd str Zt - - ----- End definition of character set #1 subscript_characters subcs str Zu - - ----- List of subscriptable characters superscript_characters supcs str Zv - - ----- List of superscriptable characters these_cause_cr docr str Zw - - ----- Printing any of these characters causes CR zero_motion zerom str Zx - - ----- No motion for subsequent character #%.TE #%.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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 ############################################################################# ncurses-6.4-20240113/include/ncurses_cfg.hin0000644000000000000000000000666113631163447017102 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey 1997-on * ****************************************************************************/ /* * $Id: ncurses_cfg.hin,v 1.13 2020/03/08 12:37:59 tom Exp $ * * Both ncurses_cfg.h and ncurses_def.h are internal header-files used when * building ncurses. * * This is a template-file used to generate the "ncurses_cfg.h" file. * * Rather than list every definition, the configuration script substitutes the * definitions that it finds using 'sed'. You need a patch (original date * 971222) to autoconf 2.12 or 2.13 to do this. * * See: * https://invisible-island.net/autoconf/ * ftp://ftp.invisible-island.net/autoconf/ */ #ifndef NC_CONFIG_H #define NC_CONFIG_H @DEFS@ #include /* 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 */ ncurses-6.4-20240113/include/curses.wide0000644000000000000000000004323514052264555016255 0ustar rootroot/* $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 */ ncurses-6.4-20240113/include/nc_win32.h0000644000000000000000000001512714376465363015702 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2023 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.10 2023/02/25 20:09:23 tom Exp $ */ #ifndef NC_WIN32_H #define NC_WIN32_H 1 #if defined(_WIN32) || defined(_WIN64) #ifndef _NC_WINDOWS #define _NC_WINDOWS #endif #ifdef TERMIOS #error TERMIOS must not be defined on Windows #endif /* We no longer support WindowsXP. Minimum requirement is Windows Vista or Server2008, aka Windows NT 6.0 */ #ifdef WINVER # if WINVER < 0x0600 # error WINVER must at least be 0x0600 # endif #else # define WINVER 0x0600 #endif #undef _NC_CHECK_MINTTY #if WINVER >= 0x0600 #define _NC_CHECK_MINTTY #endif #include #if HAVE_SYS_TIME_H #include /* for struct timeval */ #endif #ifdef _NC_MSC #include /* for struct timeval */ #endif #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(wchar_t); #ifdef EVENTLIST_2nd /* test.priv.h just needs the preceding */ extern NCURSES_EXPORT(void) _nc_console_size(int* Lines, int* Cols); extern NCURSES_EXPORT(HANDLE) _nc_console_handle(int fd); extern NCURSES_EXPORT(int) _nc_console_isatty(int fd); extern NCURSES_EXPORT(int) _nc_console_test(int fd); extern NCURSES_EXPORT(int) _nc_console_read(SCREEN *sp,HANDLE hdl,int *buf); extern NCURSES_EXPORT(int) _nc_console_twait(SCREEN *, HANDLE,int,int,int * EVENTLIST_2nd(_nc_eventlist * evl)); extern NCURSES_EXPORT(WORD) _nc_console_MapColor(bool fore, int color); extern NCURSES_EXPORT(void) _nc_console_selectActiveHandle(void); extern NCURSES_EXPORT(bool) _nc_console_get_SBI(void); extern NCURSES_EXPORT(void) _nc_console_set_scrollback(bool normal, CONSOLE_SCREEN_BUFFER_INFO * info); extern NCURSES_EXPORT(int) _nc_console_testmouse(SCREEN *,HANDLE,int EVENTLIST_2nd(_nc_eventlist*)); extern NCURSES_EXPORT(int) _nc_console_keyok(int keycode,int flag); extern NCURSES_EXPORT(bool) _nc_console_keyExist(int keycode); extern NCURSES_EXPORT(bool) _nc_console_checkinit(bool initFlag, bool assumeTermInfo); extern NCURSES_EXPORT(int) _nc_console_vt_supported(void); #ifdef _NC_CHECK_MINTTY extern NCURSES_EXPORT(int) _nc_console_checkmintty(int fd, LPHANDLE pMinTTY); #endif #undef VALID_TERM_ENV #define MS_TERMINAL "ms-terminal" #define VALID_TERM_ENV(term_env, no_terminal) \ (term_env = (NonEmpty(term_env) \ ? term_env \ : (_nc_console_vt_supported() \ ? MS_TERMINAL \ : no_terminal)), \ NonEmpty(term_env)) /* * Various Console mode definitions */ /* Flags to enable virtual Terminal processing */ #define VT_FLAG_OUT ENABLE_VIRTUAL_TERMINAL_PROCESSING #define VT_FLAG_IN ENABLE_VIRTUAL_TERMINAL_INPUT /* Default flags for input/output modes */ #define CONMODE_IN_DEFAULT (ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT) #define CONMODE_OUT_DEFAULT (ENABLE_PROCESSED_OUTPUT | DISABLE_NEWLINE_AUTO_RETURN | ENABLE_LVB_GRID_WORLDWIDE) /* Flags to reset from RAW/CBREAK */ #define CONMODE_NORAW (ENABLE_PROCESSED_INPUT|ENABLE_LINE_INPUT) #define CONMODE_NOCBREAK (ENABLE_LINE_INPUT) #if defined(USE_TERM_DRIVER) && defined(USE_WIN32CON_DRIVER) extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_WIN_DRIVER; #endif #define CON_NUMPAIRS 64 typedef struct { BOOL initialized; BOOL buffered; BOOL window_only; BOOL progMode; BOOL isMinTTY; BOOL isTermInfoConsole; HANDLE out; HANDLE inp; HANDLE hdl; HANDLE lastOut; int numButtons; LPDWORD ansi_map; LPDWORD map; LPDWORD rmap; WORD pairs[CON_NUMPAIRS]; COORD origin; CHAR_INFO *save_screen; COORD save_size; SMALL_RECT save_region; CONSOLE_SCREEN_BUFFER_INFO SBI; CONSOLE_SCREEN_BUFFER_INFO save_SBI; CONSOLE_CURSOR_INFO save_CI; TTY originalMode; } ConsoleInfo; extern NCURSES_EXPORT_VAR(ConsoleInfo) _nc_CONSOLE; #define WINCONSOLE _nc_CONSOLE #define TypeAlloca(type,count)(type*) _alloca(sizeof(type)*(size_t)(count)) #endif /* EVENTLIST_2nd */ #ifdef __cplusplus } #endif #endif /* _WIN32 || _WIN64 */ #endif /* NC_WIN32_H */ ncurses-6.4-20240113/include/nc_panel.h0000644000000000000000000000652213615656212016024 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/include/hashed_db.h0000644000000000000000000000704713615656212016151 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/include/MKhashsize.sh0000755000000000000000000000517113615656212016500 0ustar rootroot#!/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)" ncurses-6.4-20240113/include/curses.tail0000644000000000000000000002005514463523162016247 0ustar rootroot/* $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 */ ncurses-6.4-20240113/include/headers0000644000000000000000000000507714420747145015437 0ustar rootroot# $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 ncurses-6.4-20240113/include/MKncurses_def.sh0000755000000000000000000000641314264567577017202 0ustar rootroot#! /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 * * 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 */ ncurses-6.4-20240113/include/Caps.keys0000644000000000000000000016215014550604463015657 0ustar rootroot############################################################################## # 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.21 2024/01/13 22:05:39 tom Exp $ # # This is an adaptation of ncurses' termcap/terminfo capability table, which # is illustrates an experimental extension to describe alt-, shift- and # control-modifiers applied to function and normal keys, as done on IBM pc's. # # This table is used to generate initializers for tables that drive tic, # infocmp, and the library compilation code used to support the termcap # compatibility hack. It is also used to generate the tabular portion of the # terminfo(5) man page; lines beginning with `#%' are passed through to become # the terminfo table. # # This file has three major sections; a standard-capabilities table, two # extension-capability tables, and a section of aliases declarations. # The first two have the same format, as follows: # # FILE FORMAT # # Column 1: terminfo variable name # Column 2: terminfo capability name # Column 3: capability type (Boolean, numeric, or string) # Column 4: termcap capability name # Column 5: KEY_xxx name, if any, `-' otherwise # Column 6: value for KEY_xxx name, if any, `-' otherwise # Column 7: Lead with `Y' if capability should be emitted in termcap # translations, `-' otherwise # Column 8: capability description # # The codes following [Y-] in column 7 describe the versions of termcap which # use the given capability. This information is not used by the curses library # proper; rather, it is there to help the terminfo maintainer avoid emitting # termcap entry translations that are more than 1023 bytes long (and tank a # lot of old termcap-using programs). The codes read as follows: # B = mentioned in the BSD man page for 4.4BSD curses # C = used by the 4.4BSD curses library # G = mentioned in the documentation for GNU termcap # E = used by GNU Emacs # K = remove this terminfo capability when translating to standard format # The important codes are C and E. A cap with C or E should be preserved in # translation if possible. The problem is that preserving all such caps may # lead to some termcap translations being too long. The termcap maintainer # has a bit of a juggling act to do...potential problem cases are marked with # an asterisk (*). # # The aliases section has the following format: # # Column 1: either `capalias' or `infoalias' # Column 2: name to be aliased # Column 3: what name it should translate to. The name IGNORE means it # should be discarded with a warning message. # Column 4: name of the extension set (used for compiler warning messages) # Column 5: capability description (usually an associated terminfo variable) # # HANDLING TERMCAP AND TERMINFO EXTENSIONS # # There are basically five different ways to handle termcap and terminfo # extensions: # # 1. Don't list the capname here, or list it but comment it out (the latter # is preferable; someone might want to handle it in the future). If you do # this, the capability will be treated as unknown and raise a warning from # the compiler. # # 2. Alias it. This is appropriate if the capability has the same meaning # as an already-supported one. The compiler will handle aliasing, emitting # an appropriate informational message whenever an alias fires. # # 3. List it in the standard table. You almost certainly do *not* want # to do this -- the capabilities in that one, and their order, have been # carefully chosen to be SVr4-binary-compatible when they're written out # as a terminfo object, and breaking this would be bad. It is up to the ncurses # library what to do with the terminfo data after it is read in. # # 4. List it in the aliases table with an IGNORE target field. If you # do this, the capability will be ignored on input (though the user will # get a warning message about it). # # 5. List it in the extensions table. If you do this, the compiler will # silently accept the capability, but the curses library proper will never # see it (because it won't be written out as part of the terminfo object # format). It is up to you what you have the compiler do with it. # # There are two opposite reasons to choose option 5. One is when you want # to eat the capability silently and discard it when doing translations # to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are # in this class. Nothing will ever use them again. # # More usually, you want the compiler to try to deduce something from the # capability value that it can use to translate it into your output format. # You'll need to write custom code, probably in postprocess_termcap() or # postprocess_terminfo(), to handle the translation. # # CONTROLLING ENTRY LENGTH # # Notes on specific elisions made to fit translations within 1023 bytes: # # Machines with IBM PC-like keyboards want to be able to define the following # keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- # only environments for End or Home-Down), key_dc, and key_ic. This is also # the set of keys the `joe' editor will be upset if it can't see. So don't # trim those out of the set to be translated to termcap, or various users of # the termcap file will become irate. # # It might look tempting to leave those long init strings out of translations. # We can't do it (yet); 4.4BSD tput and tset use them. # # We retain the sgr capability in translation in spite of the fact that neither # 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are # hard to understand without it, and (b) the entries in which it is long tend # to be older types that don't use up a lot of string space on function keys. # The tic(1) translation code will complain and elide it if it makes a critical # difference (there is special code in tic to recognize this situation). # # Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion # optimizer in BSD curses didn't use them. This omission seems to be the # single most effective one, it shortened the resolved length of all thirteen # problem entries in the 9.9.0 version of the terminfo master below critical. # # It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap # translations go back over critical if we do this. As 4.4BSD curses fades # into history and GNU termcap's application base shrinks towards being GNU # Emacs only, we'll probably elide out some BSD-only capabilities in order # to buy space for non-essentials Emacs is still using. Capabilities high # on that hit list: rc, sc, uc. # ############################################################################# # # STANDARD CAPABILITIES # #%The following is a complete table of the capabilities included in a #%terminfo description block and available to terminfo-using code. #%In each line of the table, #%.bP #%The \fBvariable\fR is the name by which the programmer (at the terminfo level) #%accesses the capability. #%.bP #%The \fBcapname\fR (\fICap-name\fP) #%is the short name used in the text of the database, #%and is used by a person updating the database. #%.IP #%Whenever possible, capnames are chosen to be the same as or similar to #%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses #%identical or very similar names). #%Semantics are also intended to match those of the specification. #%.IP #%Capability names have no hard length limit, but an informal limit of 5 #%characters has been adopted to keep them short and to allow the tabs in #%the source file #%.B Caps #%to line up nicely. #%.bP #%The \fBtermcap\fP (\fITcap\fP) code is the old capability name #%(some capabilities are new, and have names which termcap did not originate). #%.bP #%Finally, the \fBdescription\fP field attempts to convey the semantics of the #%capability. #%.PP #%You may find some codes in the description field: #%.TP #%(P) #%indicates that padding may be specified #%.TP #%#[1-9] #%in the description field indicates that the string is passed #%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP). #%.IP #%If no parameters are listed in the description, #%passing the string through \fBtparm\fP(3X) may give unexpected results, #%e.g., if it contains percent (%%) signs. #%.TP #%(P*) #%indicates that padding may vary in proportion to the number of #%lines affected #%.TP #%(#\d\fIi\fP\u) #%indicates the \fIi\fP\uth\d parameter. #%. #%.PP #%.TS #%center; #%Lb Cb S Lb #%Lb Lb Lb Lb #%Lb Lb Lb 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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key key_f10 kf10 str k; KEY_F(10) - ----E F10 function key key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key key_home khome str kh KEY_HOME 0406 YBCGE home key key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key keypad_local rmkx str ke - - YBCGE leave 'keyboard_transmit' mode keypad_xmit smkx str ks - - YBCGE enter 'keyboard_transmit' mode lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 lab_f10 lf10 str la - - ----- label on function key f10 if not f10 lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 meta_off rmm str mo - - YB-G-* turn off meta mode meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) newline nel str nw - - YB-G-* newline (behave like cr followed by lf) pad_char pad str pc - - YBCGE padding char (instead of null) parm_dch dch str DC - - YB-GE delete #1 characters (P*) parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) parm_ich ich str IC - - YB-GE insert #1 characters (P*) parm_index indn str SF - - YBCG- scroll forward #1 lines (P) parm_insert_line il str AL - - YBCGE insert #1 lines (P*) parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 print_screen mc0 str ps - - -B-G-* print contents of screen prtr_off mc4 str pf - - -B-G-* turn off printer prtr_on mc5 str po - - -B-G-* turn on printer repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) reset_1string rs1 str r1 - - -B--- reset string reset_2string rs2 str r2 - - -B--- reset string reset_3string rs3 str r3 - - -B--- reset string reset_file rf str rf - - -B--- name of reset file restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) save_cursor sc str sc - - YBCG- save current cursor position (P) scroll_forward ind str sf - - YBCGE scroll text up (P) scroll_reverse ri str sr - - YBCGE scroll text down (P) set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) set_tab hts str st - - YB-G- set a tab in every row, current columns set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 tab ht str ta - - YBCGE tab to next 8-space hardware tab stop to_status_line tsl str ts - - YB-G- move to status line, column #1 underline_char uc str uc - - YBCG- underline char and move past it up_half_line hu str hu - - YB-G- half a line up init_prog iprog str iP - - -B--- path name of program for initialization key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes # # SVr1 capabilities stop here. IBM's version of terminfo is the same as # SVr4 up to this point, but has a different set afterwards. # char_padding rmp str rP - - ----- like ip but when in insert mode acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 plab_norm pln str pn - - ----- program label #1 to show string #2 key_btab kcbt str kB KEY_BTAB 0541 ----- back-tab key enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking enter_am_mode smam str SA - - ----- turn on automatic margins exit_am_mode rmam str RA - - ----- turn off automatic margins xon_character xonc str XN - - ----- XON character xoff_character xoffc str XF - - ----- XOFF character ena_acs enacs str eA - - ----- enable alternate char set label_on smln str LO - - ----- turn on soft labels label_off rmln str LF - - ----- turn off soft labels key_beg kbeg str @1 KEY_BEG 0542 ----- begin key key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key key_close kclo str @3 KEY_CLOSE 0544 ----- close key key_command kcmd str @4 KEY_COMMAND 0545 ----- command key key_copy kcpy str @5 KEY_COPY 0546 ----- copy key key_create kcrt str @6 KEY_CREATE 0547 ----- create key key_end kend str @7 KEY_END 0550 ----- end key key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key key_exit kext str @9 KEY_EXIT 0551 ----- exit key key_find kfnd str @0 KEY_FIND 0552 ----- find key key_help khlp str %1 KEY_HELP 0553 ----- help key key_mark kmrk str %2 KEY_MARK 0554 ----- mark key key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key key_move kmov str %4 KEY_MOVE 0556 ----- move key key_next knxt str %5 KEY_NEXT 0557 ----- next key key_open kopn str %6 KEY_OPEN 0560 ----- open key key_options kopt str %7 KEY_OPTIONS 0561 ----- options key key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key key_print kprt str %9 KEY_PRINT 0532 ----- print key key_redo krdo str %0 KEY_REDO 0563 ----- redo key key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key key_restart krst str &4 KEY_RESTART 0567 ----- restart key key_resume kres str &5 KEY_RESUME 0570 ----- resume key key_save ksav str &6 KEY_SAVE 0571 ----- save key key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key key_undo kund str &8 KEY_UNDO 0630 ----- undo key key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key key_select kslt str *6 KEY_SELECT 0601 ----- select key key_send kEND str *7 KEY_SEND 0602 ----- shifted end key key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key req_for_input rfi str RF - - ----- send next input char (for ptys) key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key key_f20 kf20 str FA KEY_F(20) - ----E F20 function key key_f21 kf21 str FB KEY_F(21) - ----E F21 function key key_f22 kf22 str FC KEY_F(22) - ----E F22 function key key_f23 kf23 str FD KEY_F(23) - ----E F23 function key key_f24 kf24 str FE KEY_F(24) - ----E F24 function key key_f25 kf25 str FF KEY_F(25) - ----E F25 function key key_f26 kf26 str FG KEY_F(26) - ----E F26 function key key_f27 kf27 str FH KEY_F(27) - ----E F27 function key key_f28 kf28 str FI KEY_F(28) - ----E F28 function key key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key key_f30 kf30 str FK KEY_F(30) - ----E F30 function key key_f31 kf31 str FL KEY_F(31) - ----E F31 function key key_f32 kf32 str FM KEY_F(32) - ----E F32 function key key_f33 kf33 str FN KEY_F(33) - ----E F33 function key key_f34 kf34 str FO KEY_F(34) - ----E F34 function key key_f35 kf35 str FP KEY_F(35) - ----E F35 function key key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key key_f37 kf37 str FR KEY_F(37) - ----E F37 function key key_f38 kf38 str FS KEY_F(38) - ----E F38 function key key_f39 kf39 str FT KEY_F(39) - ----E F39 function key key_f40 kf40 str FU KEY_F(40) - ----E F40 function key key_f41 kf41 str FV KEY_F(41) - ----E F41 function key key_f42 kf42 str FW KEY_F(42) - ----E F42 function key key_f43 kf43 str FX KEY_F(43) - ----E F43 function key key_f44 kf44 str FY KEY_F(44) - ----E F44 function key key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key clr_bol el1 str cb - - ----- Clear to beginning of line clear_margins mgc str MC - - ----- clear right and left soft margins set_left_margin smgl str ML - - ----- set left soft margin at current column. (ML is not in BSD termcap). set_right_margin smgr str MR - - ----- set right soft margin at current column label_format fln str Lf - - ----- label format set_clock sclk str SC - - ----- set clock, #1 hrs #2 mins #3 secs display_clock dclk str DK - - ----- display clock remove_clock rmclk str RC - - ----- remove clock create_window cwin str CW - - ----- define a window #1 from #2,#3 to #4,#5 goto_window wingo str WG - - ----- go to window #1 hangup hup str HU - - ----- hang-up phone dial_phone dial str DI - - ----- dial number #1 quick_dial qdial str QD - - ----- dial number #1 without checking tone tone str TO - - ----- select touch tone dialing pulse pulse str PU - - ----- select pulse dialing flash_hook hook str fh - - ----- flash switch hook fixed_pause pause str PA - - ----- pause for 2-3 seconds wait_tone wait str WA - - ----- wait for dial-tone user0 u0 str u0 - - ----- User string #0 user1 u1 str u1 - - ----- User string #1 user2 u2 str u2 - - ----- User string #2 user3 u3 str u3 - - ----- User string #3 user4 u4 str u4 - - ----- User string #4 user5 u5 str u5 - - ----- User string #5 user6 u6 str u6 - - ----- User string #6 user7 u7 str u7 - - ----- User string #7 user8 u8 str u8 - - ----- User string #8 user9 u9 str u9 - - ----- User string #9 # # NCurses extensions for keys accessible on most PC consoles # key_sup kUP str !5 KEY_SUP + ----- shifted up-arrow key key_sdown kDOWN str !6 KEY_SDOWN + ----- shifted down-arrow key key_sbackspace kBS str !7 KEY_SBACKSPACE + ----- shifted backspace key key_c_delete kcdelete str !8 KEY_C_DELETE + ----- control- delete-character key key_c_end kcend str !9 KEY_C_END + ----- control- end key key_c_home kchom str !0 KEY_C_HOME + ----- control- home key key_c_insert kcinsert str !_ KEY_C_INSERT + ----- control- insert-character key key_c_left kclft str %k KEY_C_LEFT + ----- control- left-arrow key key_c_next kcnxt str %l KEY_C_NEXT + ----- control- next key key_c_previous kcprv str %m KEY_C_PREVIOUS + ----- control- previous key key_c_print kcprt str %n KEY_C_PRINT + ----- control- print key key_c_right kcrit str %o KEY_C_RIGHT + ----- control- right-arrow key key_c_backspace kcbs str %p KEY_C_BACKSPACE + ----- control- backspace key key_c_up kcup str %q KEY_C_UP + ----- control- up-arrow key key_c_down kcdown str %r KEY_C_DOWN + ----- control- down-arrow key key_a_delete kadelete str %s KEY_A_DELETE + ----- alt- delete-character key key_a_end kaend str %t KEY_A_END + ----- alt- end key key_a_home kahom str %u KEY_A_HOME + ----- alt- home key key_a_insert kainsert str %v KEY_A_INSERT + ----- alt- insert-character key key_a_left kalft str %w KEY_A_LEFT + ----- alt- left-arrow key key_a_next kanxt str %x KEY_A_NEXT + ----- alt- next key key_a_previous kaprv str %y KEY_A_PREVIOUS + ----- alt- previous key key_a_print kaprt str %z KEY_A_PRINT + ----- alt- print key key_a_right karit str %! KEY_A_RIGHT + ----- alt- right-arrow key key_a_backspace kabs str %@ KEY_A_BACKSPACE + ----- alt- backspace key key_a_up kaup str %# KEY_A_UP + ----- alt- up-arrow key key_a_down kadown str %$ KEY_A_DOWN + ----- alt- down-arrow key key_a_a kaa str $a KEY_A_A + ----- alt- a key key_a_b kab str $b KEY_A_B + ----- alt- b key key_a_c kac str $c KEY_A_C + ----- alt- c key key_a_d kad str $d KEY_A_D + ----- alt- d key key_a_e kae str $e KEY_A_E + ----- alt- e key key_a_f kaf str $f KEY_A_F + ----- alt- f key key_a_g kag str $g KEY_A_G + ----- alt- g key key_a_h kah str $h KEY_A_H + ----- alt- h key key_a_i kai str $i KEY_A_I + ----- alt- i key key_a_j kaj str $j KEY_A_J + ----- alt- j key key_a_k kak str $k KEY_A_K + ----- alt- k key key_a_l kal str $l KEY_A_L + ----- alt- l key key_a_m kam str $m KEY_A_M + ----- alt- m key key_a_n kan str $n KEY_A_N + ----- alt- n key key_a_o kao str $o KEY_A_O + ----- alt- o key key_a_p kap str $p KEY_A_P + ----- alt- p key key_a_q kaq str $q KEY_A_Q + ----- alt- q key key_a_r kar str $r KEY_A_R + ----- alt- r key key_a_s kas str $s KEY_A_S + ----- alt- s key key_a_t kat str $t KEY_A_T + ----- alt- t key key_a_u kau str $u KEY_A_U + ----- alt- u key key_a_v kav str $v KEY_A_V + ----- alt- v key key_a_w kaw str $w KEY_A_W + ----- alt- w key key_a_x kax str $x KEY_A_X + ----- alt- x key key_a_y kay str $y KEY_A_Y + ----- alt- y key key_a_z kaz str $z KEY_A_Z + ----- alt- z key key_a_0 ka_0 str $0 KEY_A_0 + ----- alt- 0 key key_a_1 ka_1 str $1 KEY_A_1 + ----- alt- 1 key key_a_2 ka_2 str $2 KEY_A_2 + ----- alt- 2 key key_a_3 ka_3 str $3 KEY_A_3 + ----- alt- 3 key key_a_4 ka_4 str $4 KEY_A_4 + ----- alt- 4 key key_a_5 ka_5 str $5 KEY_A_5 + ----- alt- 5 key key_a_6 ka_6 str $6 KEY_A_6 + ----- alt- 6 key key_a_7 ka_7 str $7 KEY_A_7 + ----- alt- 7 key key_a_8 ka_8 str $8 KEY_A_8 + ----- alt- 8 key key_a_9 ka_9 str $9 KEY_A_9 + ----- alt- 9 key key_a_backtick ka_bt str $` KEY_A_BACKTICK + ----- alt- ` key key_a_under ka_und str $_ KEY_A_UNDER + ----- alt- _ key key_a_equals ka_eq str $= KEY_A_EQUALS + ----- alt- = key key_a_bar ka_bsl str $| KEY_A_BAR + ----- alt- | key key_a_lbracker ka_lbr str $[ KEY_A_LBRACKER + ----- alt- [ key key_a_rbracker ka_rbr str $] KEY_A_RBRACKER + ----- alt- ] key key_a_semi ka_semi str $; KEY_A_SEMI + ----- alt- ; key key_a_tick ka_tick str $' KEY_A_TICK + ----- alt- ' key key_a_comma ka_com str $, KEY_A_COMMA + ----- alt- , key key_a_dot ka_dot str $. KEY_A_DOT + ----- alt- . key key_a_question ka_sla str $? KEY_A_QUESTION + ----- alt- ? key key_a_divide ka_div str $/ KEY_A_DIVIDE + ----- alt- keypad / key key_a_multiply ka_mul str $* KEY_A_MULTIPLY + ----- alt- keypad * key key_a_add ka_add str $+ KEY_A_ADD + ----- alt- keypad + key key_a_subtract ka_sub str $- KEY_A_SUBTRACT + ----- alt- keypad - key key_a_kenter ka_kent str $< KEY_A_KENTER + ----- alt- keypad enter key key_a_enter ka_ent str $> KEY_A_ENTER + ----- alt- enter key key_c_at kcat str %% KEY_C_AT + ----- control- @ key key_c_divide kcdiv str %/ KEY_C_DIVIDE + ----- control- keypad / key key_c_multiply kcmul str %* KEY_C_MULTIPLY + ----- control- keypad * key key_c_add kcadd str %+ KEY_C_ADD + ----- control- keypad + key key_c_subtract kcsub str %- KEY_C_SUBTRACT + ----- control- keypad - key # # SVr4 added these capabilities to support color # orig_pair op str op - - ----- Set default pair to its original value orig_colors oc str oc - - ----- Set all color pairs to the original ones initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) set_color_pair scp str sp - - ----- Set current color pair to #1 set_foreground setf str Sf - - ----- Set foreground color #1 set_background setb str Sb - - ----- Set background color #1 # # SVr4 added these capabilities to support printers # change_char_pitch cpi str ZA - - ----- Change number of characters per inch to #1 change_line_pitch lpi str ZB - - ----- Change number of lines per inch to #1 change_res_horz chr str ZC - - ----- Change horizontal resolution to #1 change_res_vert cvr str ZD - - ----- Change vertical resolution to #1 define_char defc str ZE - - ----- Define a character #1, #2 dots wide, descender #3 enter_doublewide_mode swidm str ZF - - ----- Enter double-wide mode enter_draft_quality sdrfq str ZG - - ----- Enter draft-quality mode enter_italics_mode sitm str ZH - - ----- Enter italic mode enter_leftward_mode slm str ZI - - ----- Start leftward carriage motion enter_micro_mode smicm str ZJ - - ----- Start micro-motion mode enter_near_letter_quality snlq str ZK - - ----- Enter NLQ mode enter_normal_quality snrmq str ZL - - ----- Enter normal-quality mode enter_shadow_mode sshm str ZM - - ----- Enter shadow-print mode enter_subscript_mode ssubm str ZN - - ----- Enter subscript mode enter_superscript_mode ssupm str ZO - - ----- Enter superscript mode enter_upward_mode sum str ZP - - ----- Start upward carriage motion exit_doublewide_mode rwidm str ZQ - - ----- End double-wide mode exit_italics_mode ritm str ZR - - ----- End italic mode exit_leftward_mode rlm str ZS - - ----- End left-motion mode exit_micro_mode rmicm str ZT - - ----- End micro-motion mode exit_shadow_mode rshm str ZU - - ----- End shadow-print mode exit_subscript_mode rsubm str ZV - - ----- End subscript mode exit_superscript_mode rsupm str ZW - - ----- End superscript mode exit_upward_mode rum str ZX - - ----- End reverse character motion micro_column_address mhpa str ZY - - ----- Like column_address in micro mode micro_down mcud1 str ZZ - - ----- Like cursor_down in micro mode micro_left mcub1 str Za - - ----- Like cursor_left in micro mode micro_right mcuf1 str Zb - - ----- Like cursor_right in micro mode micro_row_address mvpa str Zc - - ----- Like row_address #1 in micro mode micro_up mcuu1 str Zd - - ----- Like cursor_up in micro mode order_of_pins porder str Ze - - ----- Match software bits to print-head pins parm_down_micro mcud str Zf - - ----- Like parm_down_cursor in micro mode parm_left_micro mcub str Zg - - ----- Like parm_left_cursor in micro mode parm_right_micro mcuf str Zh - - ----- Like parm_right_cursor in micro mode parm_up_micro mcuu str Zi - - ----- Like parm_up_cursor in micro mode select_char_set scs str Zj - - ----- Select character set, #1 set_bottom_margin smgb str Zk - - ----- Set bottom margin at current line set_bottom_margin_parm smgbp str Zl - - ----- Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom set_left_margin_parm smglp str Zm - - ----- Set left (right) margin at column #1 set_right_margin_parm smgrp str Zn - - ----- Set right margin at column #1 set_top_margin smgt str Zo - - ----- Set top margin at current line set_top_margin_parm smgtp str Zp - - ----- Set top (bottom) margin at row #1 start_bit_image sbim str Zq - - ----- Start printing bit image graphics start_char_set_def scsd str Zr - - ----- Start character set definition #1, with #2 characters in the set stop_bit_image rbim str Zs - - ----- Stop printing bit image graphics stop_char_set_def rcsd str Zt - - ----- End definition of character set #1 subscript_characters subcs str Zu - - ----- List of subscriptable characters superscript_characters supcs str Zv - - ----- List of superscriptable characters these_cause_cr docr str Zw - - ----- Printing any of these characters causes CR zero_motion zerom str Zx - - ----- No motion for subsequent character #%.TE #%.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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 # ############################################################################# ncurses-6.4-20240113/include/curses.h.in0000644000000000000000000021356414465712437016172 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* $Id: curses.h.in,v 1.281 2023/08/12 14:20:15 tom Exp $ */ #ifndef __NCURSES_H #define __NCURSES_H /* The symbols beginning NCURSES_ or USE_ are configuration choices. A few of the former can be overridden by applications at compile-time. Most of the others correspond to configure-script options (or checks by the configure-script for features of the system on which it is built). These symbols can be overridden by applications at compile-time: NCURSES_NOMACROS suppresses macro definitions in favor of functions NCURSES_WATTR_MACROS suppresses wattr_* macro definitions NCURSES_WIDECHAR is an alternative for declaring wide-character functions. These symbols are used only when building ncurses: NCURSES_ATTR_T NCURSES_FIELD_INTERNALS NCURSES_INTERNALS These symbols are set by the configure script: NCURSES_ENABLE_STDBOOL_H NCURSES_EXPANDED NCURSES_EXT_COLORS NCURSES_EXT_FUNCS NCURSES_EXT_PUTWIN NCURSES_NO_PADDING NCURSES_OSPEED_COMPAT NCURSES_PATHSEP NCURSES_REENTRANT */ #define CURSES 1 #define CURSES_H 1 /* These are defined only in curses.h, and are used for conditional compiles */ #define NCURSES_VERSION_MAJOR @NCURSES_MAJOR@ #define NCURSES_VERSION_MINOR @NCURSES_MINOR@ #define NCURSES_VERSION_PATCH @NCURSES_PATCH@ /* This is defined in more than one ncurses header, for identification */ #undef NCURSES_VERSION #define NCURSES_VERSION "@NCURSES_MAJOR@.@NCURSES_MINOR@" /* * Identify the mouse encoding version. */ #define NCURSES_MOUSE_VERSION @NCURSES_MOUSE_VERSION@ /* * Definitions to facilitate DLL's. */ #include /* * 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 /* * 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) */ ncurses-6.4-20240113/include/curses.events0000644000000000000000000000257314521527723016631 0ustar rootroot/* $Id*/ /* * vile:cmode: * This file is part of ncurses, designed to be appended after curses.h.in * (see that file for the relevant copyright). */ /* * This is an extension to support events... */ #ifdef NCURSES_WGETCH_EVENTS #if !defined(__BEOS__) || defined(__HAIKU__) /* Fix _nc_timed_wait() on BEOS... */ # define NCURSES_EVENT_VERSION 1 #endif /* !defined(__BEOS__) */ /* * Bits to set in _nc_event.data.flags */ # define _NC_EVENT_TIMEOUT_MSEC 1 # define _NC_EVENT_FILE 2 # define _NC_EVENT_FILE_READABLE 2 # if 0 /* Not supported yet... */ # define _NC_EVENT_FILE_WRITABLE 4 # define _NC_EVENT_FILE_EXCEPTION 8 # endif typedef struct { int type; union { long timeout_msec; /* _NC_EVENT_TIMEOUT_MSEC */ struct { unsigned int flags; int fd; unsigned int result; } fev; /* _NC_EVENT_FILE */ } data; } _nc_event; typedef struct { int count; int result_flags; /* _NC_EVENT_TIMEOUT_MSEC or _NC_EVENT_FILE_READABLE */ _nc_event *events[1]; } _nc_eventlist; extern NCURSES_EXPORT(int) wgetch_events (WINDOW *, _nc_eventlist *) GCC_DEPRECATED(experimental option); /* experimental */ extern NCURSES_EXPORT(int) wgetnstr_events (WINDOW *,char *,int,_nc_eventlist *) GCC_DEPRECATED(experimental option); /* experimental */ #define KEY_EVENT 0634 /* We were interrupted by an event */ #endif /* NCURSES_WGETCH_EVENTS */ ncurses-6.4-20240113/include/MKterm.h.awk.in0000644000000000000000000004335314421301730016621 0ustar rootroot# vile:awkmode function declare_termtype(number,suffix) { printf "typedef struct termtype%s { /* in-core form of terminfo data */\n", suffix; print " char *term_names; /* str_table offset of term names */" print " char *str_table; /* pointer to string table */" print " NCURSES_SBOOL *Booleans; /* array of boolean values */" printf " %-5s *Numbers; /* array of integer values */\n", number; print " char **Strings; /* array of string offsets */" print "" print "#if NCURSES_XNAMES" print " char *ext_str_table; /* pointer to extended string table */" print " char **ext_Names; /* corresponding names */" print "" print " unsigned short num_Booleans;/* count total Booleans */"; print " unsigned short num_Numbers; /* count total Numbers */"; print " unsigned short num_Strings; /* count total Strings */"; print "" print " unsigned short ext_Booleans;/* count extensions to Booleans */"; print " unsigned short ext_Numbers; /* count extensions to Numbers */"; print " unsigned short ext_Strings; /* count extensions to Strings */"; print "#endif /* NCURSES_XNAMES */" print "" printf "} TERMTYPE%s;\n", suffix; } BEGIN { lcurl = "{"; rcurl = "}"; print "/****************************************************************************" print " * Copyright 2018-2021,2023 Thomas E. Dickey *" print " * Copyright 1998-2013,2017 Free Software Foundation, Inc. *" print " * *" print " * Permission is hereby granted, free of charge, to any person obtaining a *" print " * copy of this software and associated documentation files (the *" print " * \"Software\"), to deal in the Software without restriction, including *" print " * without limitation the rights to use, copy, modify, merge, publish, *" print " * distribute, distribute with modifications, sublicense, and/or sell *" print " * copies of the Software, and to permit persons to whom the Software is *" print " * furnished to do so, subject to the following conditions: *" print " * *" print " * The above copyright notice and this permission notice shall be included *" print " * in all copies or substantial portions of the Software. *" print " * *" print " * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS *" print " * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *" print " * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *" print " * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *" print " * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *" print " * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *" print " * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *" print " * *" print " * Except as contained in this notice, the name(s) of the above copyright *" print " * holders shall not be used in advertising or otherwise to promote the *" print " * sale, use or other dealings in this Software without prior written *" print " * authorization. *" print " ****************************************************************************/" print "" print "/****************************************************************************/" print "/* Author: Zeyd M. Ben-Halim 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 */" } ncurses-6.4-20240113/include/Caps-ncurses0000644000000000000000000005262014517301543016361 0ustar rootroot############################################################################## # 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 ############################################################################# ncurses-6.4-20240113/include/termcap.h.in0000644000000000000000000000666314062736752016320 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/include/capdefaults.c0000644000000000000000000001042014114650007016512 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2000,2008 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 1992,1995 * * and: Eric S. Raymond * * and: Thomas E. Dickey 1996-on * ****************************************************************************/ /* $Id: capdefaults.c,v 1.16 2021/09/04 10:52:55 tom Exp $ */ /* * Compute obsolete capabilities. The reason this is an include file is * that the two places where it is needed require the macros to generate * offsets to different structures. See the file Caps for explanations of * these conversions. * * Note: This code is the functional inverse of the first part of * postprocess_termcap(). */ { char *strp; short capval; #define EXTRACT_DELAY(str) \ (short) (strp = strchr(str, '*'), strp ? atoi(strp+1) : 0) /* current (4.4BSD) capabilities marked obsolete */ if (VALID_STRING(carriage_return) && (capval = EXTRACT_DELAY(carriage_return))) carriage_return_delay = capval; if (VALID_STRING(newline) && (capval = EXTRACT_DELAY(newline))) new_line_delay = capval; /* current (4.4BSD) capabilities not obsolete */ if (!VALID_STRING(termcap_init2) && VALID_STRING(init_3string)) { termcap_init2 = init_3string; init_3string = ABSENT_STRING; } if (!VALID_STRING(termcap_reset) && VALID_STRING(reset_2string) && !VALID_STRING(reset_1string) && !VALID_STRING(reset_3string)) { termcap_reset = reset_2string; reset_2string = ABSENT_STRING; } if (magic_cookie_glitch_ul == ABSENT_NUMERIC && magic_cookie_glitch != ABSENT_NUMERIC && VALID_STRING(enter_underline_mode)) magic_cookie_glitch_ul = magic_cookie_glitch; /* totally obsolete capabilities */ linefeed_is_newline = (char) (VALID_STRING(newline) && (strcmp("\n", newline) == 0)); if (VALID_STRING(cursor_left) && (capval = EXTRACT_DELAY(cursor_left))) backspace_delay = capval; if (VALID_STRING(tab) && (capval = EXTRACT_DELAY(tab))) horizontal_tab_delay = capval; #undef EXTRACT_DELAY } ncurses-6.4-20240113/include/Caps.hpux110000644000000000000000000015124014550604463016030 0ustar rootroot############################################################################## # 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.22 2024/01/13 22:05:39 tom Exp $ # # This is an adaptation of ncurses' termcap/terminfo capability table, which # is designed to align with HPUX 11.x's terminfo. # # This table is used to generate initializers for tables that drive tic, # infocmp, and the library compilation code used to support the termcap # compatibility hack. It is also used to generate the tabular portion of the # terminfo(5) man page; lines beginning with `#%' are passed through to become # the terminfo table. # # This file has three major sections; a standard-capabilities table, two # extension-capability tables, and a section of aliases declarations. # The first two have the same format, as follows: # # FILE FORMAT # # Column 1: terminfo variable name # Column 2: terminfo capability name # Column 3: capability type (Boolean, numeric, or string) # Column 4: termcap capability name # Column 5: KEY_xxx name, if any, `-' otherwise # Column 6: value for KEY_xxx name, if any, `-' otherwise # Column 7: Lead with `Y' if capability should be emitted in termcap # translations, `-' otherwise # Column 8: capability description # # The codes following [Y-] in column 7 describe the versions of termcap which # use the given capability. This information is not used by the curses library # proper; rather, it is there to help the terminfo maintainer avoid emitting # termcap entry translations that are more than 1023 bytes long (and tank a # lot of old termcap-using programs). The codes read as follows: # B = mentioned in the BSD man page for 4.4BSD curses # C = used by the 4.4BSD curses library # G = mentioned in the documentation for GNU termcap # E = used by GNU Emacs # K = remove this terminfo capability when translating to standard format # The important codes are C and E. A cap with C or E should be preserved in # translation if possible. The problem is that preserving all such caps may # lead to some termcap translations being too long. The termcap maintainer # has a bit of a juggling act to do...potential problem cases are marked with # an asterisk (*). # # The aliases section has the following format: # # Column 1: either `capalias' or `infoalias' # Column 2: name to be aliased # Column 3: what name it should translate to. The name IGNORE means it # should be discarded with a warning message. # Column 4: name of the extension set (used for compiler warning messages) # Column 5: capability description (usually an associated terminfo variable) # # HANDLING TERMCAP AND TERMINFO EXTENSIONS # # There are basically five different ways to handle termcap and terminfo # extensions: # # 1. Don't list the capname here, or list it but comment it out (the latter # is preferable; someone might want to handle it in the future). If you do # this, the capability will be treated as unknown and raise a warning from # the compiler. # # 2. Alias it. This is appropriate if the capability has the same meaning # as an already-supported one. The compiler will handle aliasing, emitting # an appropriate informational message whenever an alias fires. # # 3. List it in the standard table. You almost certainly do *not* want # to do this -- the capabilities in that one, and their order, have been # carefully chosen to be SVr4-binary-compatible when they're written out # as a terminfo object, and breaking this would be bad. It is up to the ncurses # library what to do with the terminfo data after it is read in. # # 4. List it in the aliases table with an IGNORE target field. If you # do this, the capability will be ignored on input (though the user will # get a warning message about it). # # 5. List it in the extensions table. If you do this, the compiler will # silently accept the capability, but the curses library proper will never # see it (because it won't be written out as part of the terminfo object # format). It is up to you what you have the compiler do with it. # # There are two opposite reasons to choose option 5. One is when you want # to eat the capability silently and discard it when doing translations # to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are # in this class. Nothing will ever use them again. # # More usually, you want the compiler to try to deduce something from the # capability value that it can use to translate it into your output format. # You'll need to write custom code, probably in postprocess_termcap() or # postprocess_terminfo(), to handle the translation. # # CONTROLLING ENTRY LENGTH # # Notes on specific elisions made to fit translations within 1023 bytes: # # Machines with IBM PC-like keyboards want to be able to define the following # keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- # only environments for End or Home-Down), key_dc, and key_ic. This is also # the set of keys the `joe' editor will be upset if it can't see. So don't # trim those out of the set to be translated to termcap, or various users of # the termcap file will become irate. # # It might look tempting to leave those long init strings out of translations. # We can't do it (yet); 4.4BSD tput and tset use them. # # We retain the sgr capability in translation in spite of the fact that neither # 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are # hard to understand without it, and (b) the entries in which it is long tend # to be older types that don't use up a lot of string space on function keys. # The tic(1) translation code will complain and elide it if it makes a critical # difference (there is special code in tic to recognize this situation). # # Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion # optimizer in BSD curses didn't use them. This omission seems to be the # single most effective one, it shortened the resolved length of all thirteen # problem entries in the 9.9.0 version of the terminfo master below critical. # # It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap # translations go back over critical if we do this. As 4.4BSD curses fades # into history and GNU termcap's application base shrinks towards being GNU # Emacs only, we'll probably elide out some BSD-only capabilities in order # to buy space for non-essentials Emacs is still using. Capabilities high # on that hit list: rc, sc, uc. # ############################################################################# # # STANDARD CAPABILITIES # #%The following is a complete table of the capabilities included in a #%terminfo description block and available to terminfo-using code. #%In each line of the table, #%.bP #%The \fBvariable\fR is the name by which the programmer (at the terminfo level) #%accesses the capability. #%.bP #%The \fBcapname\fR (\fICap-name\fP) #%is the short name used in the text of the database, #%and is used by a person updating the database. #%.IP #%Whenever possible, capnames are chosen to be the same as or similar to #%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses #%identical or very similar names). #%Semantics are also intended to match those of the specification. #%.IP #%Capability names have no hard length limit, but an informal limit of 5 #%characters has been adopted to keep them short and to allow the tabs in #%the source file #%.B Caps #%to line up nicely. #%.bP #%The \fBtermcap\fP (\fITcap\fP) code is the old capability name #%(some capabilities are new, and have names which termcap did not originate). #%.bP #%Finally, the \fBdescription\fP field attempts to convey the semantics of the #%capability. #%.PP #%You may find some codes in the description field: #%.TP #%(P) #%indicates that padding may be specified #%.TP #%#[1-9] #%in the description field indicates that the string is passed #%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP). #%.IP #%If no parameters are listed in the description, #%passing the string through \fBtparm\fP(3X) may give unexpected results, #%e.g., if it contains percent (%%) signs. #%.TP #%(P*) #%indicates that padding may vary in proportion to the number of #%lines affected #%.TP #%(#\d\fIi\fP\u) #%indicates the \fIi\fP\uth\d parameter. #%. #%.PP #%.TS #%center; #%Lb Cb S Lb #%Lb Lb Lb Lb #%Lb Lb Lb 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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key key_f10 kf10 str k; KEY_F(10) - ----E F10 function key key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key key_home khome str kh KEY_HOME 0406 YBCGE home key key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key keypad_local rmkx str ke - - YBCGE leave 'keyboard_transmit' mode keypad_xmit smkx str ks - - YBCGE enter 'keyboard_transmit' mode lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 lab_f10 lf10 str la - - ----- label on function key f10 if not f10 lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 meta_off rmm str mo - - YB-G-* turn off meta mode meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) newline nel str nw - - YB-G-* newline (behave like cr followed by lf) pad_char pad str pc - - YBCGE padding char (instead of null) parm_dch dch str DC - - YB-GE delete #1 characters (P*) parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) parm_ich ich str IC - - YB-GE insert #1 characters (P*) parm_index indn str SF - - YBCG- scroll forward #1 lines (P) parm_insert_line il str AL - - YBCGE insert #1 lines (P*) parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 print_screen mc0 str ps - - -B-G-* print contents of screen prtr_off mc4 str pf - - -B-G-* turn off printer prtr_on mc5 str po - - -B-G-* turn on printer repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) reset_1string rs1 str r1 - - -B--- reset string reset_2string rs2 str r2 - - -B--- reset string reset_3string rs3 str r3 - - -B--- reset string reset_file rf str rf - - -B--- name of reset file restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) save_cursor sc str sc - - YBCG- save current cursor position (P) scroll_forward ind str sf - - YBCGE scroll text up (P) scroll_reverse ri str sr - - YBCGE scroll text down (P) set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) set_tab hts str st - - YB-G- set a tab in every row, current columns set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 tab ht str ta - - YBCGE tab to next 8-space hardware tab stop to_status_line tsl str ts - - YB-G- move to status line, column #1 underline_char uc str uc - - YBCG- underline char and move past it up_half_line hu str hu - - YB-G- half a line up init_prog iprog str iP - - -B--- path name of program for initialization key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes # # SVr1 capabilities stop here. IBM's version of terminfo is the same as # SVr4 up to this point, but has a different set afterwards. # # HPUX defines these if __HP_CURSES_COMPAT is defined: memory_lock meml str ml - - ----K lock memory above cursor memory_unlock memu str mu - - ----K unlock memory # # plab_norm pln str pn - - ----- program label #1 to show string #2 label_on smln str LO - - ----- turn on soft labels label_off rmln str LF - - ----- turn off soft labels key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key key_f20 kf20 str FA KEY_F(20) - ----E F20 function key key_f21 kf21 str FB KEY_F(21) - ----E F21 function key key_f22 kf22 str FC KEY_F(22) - ----E F22 function key key_f23 kf23 str FD KEY_F(23) - ----E F23 function key key_f24 kf24 str FE KEY_F(24) - ----E F24 function key key_f25 kf25 str FF KEY_F(25) - ----E F25 function key key_f26 kf26 str FG KEY_F(26) - ----E F26 function key key_f27 kf27 str FH KEY_F(27) - ----E F27 function key key_f28 kf28 str FI KEY_F(28) - ----E F28 function key key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key key_f30 kf30 str FK KEY_F(30) - ----E F30 function key key_f31 kf31 str FL KEY_F(31) - ----E F31 function key key_f32 kf32 str FM KEY_F(32) - ----E F32 function key key_f33 kf33 str FN KEY_F(33) - ----E F33 function key key_f34 kf34 str FO KEY_F(34) - ----E F34 function key key_f35 kf35 str FP KEY_F(35) - ----E F35 function key key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key key_f37 kf37 str FR KEY_F(37) - ----E F37 function key key_f38 kf38 str FS KEY_F(38) - ----E F38 function key key_f39 kf39 str FT KEY_F(39) - ----E F39 function key key_f40 kf40 str FU KEY_F(40) - ----E F40 function key key_f41 kf41 str FV KEY_F(41) - ----E F41 function key key_f42 kf42 str FW KEY_F(42) - ----E F42 function key key_f43 kf43 str FX KEY_F(43) - ----E F43 function key key_f44 kf44 str FY KEY_F(44) - ----E F44 function key key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key # end of strings in HPUX 9 char_padding rmp str rP - - ----- like ip but when in insert mode acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 key_btab kcbt str kB KEY_BTAB 0541 ----- back-tab key enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking enter_am_mode smam str SA - - ----- turn on automatic margins exit_am_mode rmam str RA - - ----- turn off automatic margins xon_character xonc str XN - - ----- XON character xoff_character xoffc str XF - - ----- XOFF character ena_acs enacs str eA - - ----- enable alternate char set key_beg kbeg str @1 KEY_BEG 0542 ----- begin key key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key key_close kclo str @3 KEY_CLOSE 0544 ----- close key key_command kcmd str @4 KEY_COMMAND 0545 ----- command key key_copy kcpy str @5 KEY_COPY 0546 ----- copy key key_create kcrt str @6 KEY_CREATE 0547 ----- create key key_end kend str @7 KEY_END 0550 ----- end key key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key key_exit kext str @9 KEY_EXIT 0551 ----- exit key key_find kfnd str @0 KEY_FIND 0552 ----- find key key_help khlp str %1 KEY_HELP 0553 ----- help key key_mark kmrk str %2 KEY_MARK 0554 ----- mark key key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key key_move kmov str %4 KEY_MOVE 0556 ----- move key key_next knxt str %5 KEY_NEXT 0557 ----- next key key_open kopn str %6 KEY_OPEN 0560 ----- open key key_options kopt str %7 KEY_OPTIONS 0561 ----- options key key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key key_print kprt str %9 KEY_PRINT 0532 ----- print key key_redo krdo str %0 KEY_REDO 0563 ----- redo key key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key key_restart krst str &4 KEY_RESTART 0567 ----- restart key key_resume kres str &5 KEY_RESUME 0570 ----- resume key key_save ksav str &6 KEY_SAVE 0571 ----- save key key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key key_undo kund str &8 KEY_UNDO 0630 ----- undo key key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key key_select kslt str *6 KEY_SELECT 0601 ----- select key key_send kEND str *7 KEY_SEND 0602 ----- shifted end key key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key req_for_input rfi str RF - - ----- send next input char (for ptys) clr_bol el1 str cb - - ----- Clear to beginning of line clear_margins mgc str MC - - ----- clear right and left soft margins set_left_margin smgl str ML - - ----- set left soft margin at current column. (ML is not in BSD termcap). set_right_margin smgr str MR - - ----- set right soft margin at current column label_format fln str Lf - - ----- label format set_clock sclk str SC - - ----- set clock, #1 hrs #2 mins #3 secs display_clock dclk str DK - - ----- display clock remove_clock rmclk str RC - - ----- remove clock create_window cwin str CW - - ----- define a window #1 from #2,#3 to #4,#5 goto_window wingo str WG - - ----- go to window #1 hangup hup str HU - - ----- hang-up phone dial_phone dial str DI - - ----- dial number #1 quick_dial qdial str QD - - ----- dial number #1 without checking tone tone str TO - - ----- select touch tone dialing pulse pulse str PU - - ----- select pulse dialing flash_hook hook str fh - - ----- flash switch hook fixed_pause pause str PA - - ----- pause for 2-3 seconds wait_tone wait str WA - - ----- wait for dial-tone user0 u0 str u0 - - ----- User string #0 user1 u1 str u1 - - ----- User string #1 user2 u2 str u2 - - ----- User string #2 user3 u3 str u3 - - ----- User string #3 user4 u4 str u4 - - ----- User string #4 user5 u5 str u5 - - ----- User string #5 user6 u6 str u6 - - ----- User string #6 user7 u7 str u7 - - ----- User string #7 user8 u8 str u8 - - ----- User string #8 user9 u9 str u9 - - ----- User string #9 # # SVr4 added these capabilities to support color # orig_pair op str op - - ----- Set default pair to its original value orig_colors oc str oc - - ----- Set all color pairs to the original ones initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) set_color_pair scp str sp - - ----- Set current color pair to #1 set_foreground setf str Sf - - ----- Set foreground color #1 set_background setb str Sb - - ----- Set background color #1 # # SVr4 added these capabilities to support printers # change_char_pitch cpi str ZA - - ----- Change number of characters per inch to #1 change_line_pitch lpi str ZB - - ----- Change number of lines per inch to #1 change_res_horz chr str ZC - - ----- Change horizontal resolution to #1 change_res_vert cvr str ZD - - ----- Change vertical resolution to #1 define_char defc str ZE - - ----- Define a character #1, #2 dots wide, descender #3 enter_doublewide_mode swidm str ZF - - ----- Enter double-wide mode enter_draft_quality sdrfq str ZG - - ----- Enter draft-quality mode enter_italics_mode sitm str ZH - - ----- Enter italic mode enter_leftward_mode slm str ZI - - ----- Start leftward carriage motion enter_micro_mode smicm str ZJ - - ----- Start micro-motion mode enter_near_letter_quality snlq str ZK - - ----- Enter NLQ mode enter_normal_quality snrmq str ZL - - ----- Enter normal-quality mode enter_shadow_mode sshm str ZM - - ----- Enter shadow-print mode enter_subscript_mode ssubm str ZN - - ----- Enter subscript mode enter_superscript_mode ssupm str ZO - - ----- Enter superscript mode enter_upward_mode sum str ZP - - ----- Start upward carriage motion exit_doublewide_mode rwidm str ZQ - - ----- End double-wide mode exit_italics_mode ritm str ZR - - ----- End italic mode exit_leftward_mode rlm str ZS - - ----- End left-motion mode exit_micro_mode rmicm str ZT - - ----- End micro-motion mode exit_shadow_mode rshm str ZU - - ----- End shadow-print mode exit_subscript_mode rsubm str ZV - - ----- End subscript mode exit_superscript_mode rsupm str ZW - - ----- End superscript mode exit_upward_mode rum str ZX - - ----- End reverse character motion micro_column_address mhpa str ZY - - ----- Like column_address in micro mode micro_down mcud1 str ZZ - - ----- Like cursor_down in micro mode micro_left mcub1 str Za - - ----- Like cursor_left in micro mode micro_right mcuf1 str Zb - - ----- Like cursor_right in micro mode micro_row_address mvpa str Zc - - ----- Like row_address #1 in micro mode micro_up mcuu1 str Zd - - ----- Like cursor_up in micro mode order_of_pins porder str Ze - - ----- Match software bits to print-head pins parm_down_micro mcud str Zf - - ----- Like parm_down_cursor in micro mode parm_left_micro mcub str Zg - - ----- Like parm_left_cursor in micro mode parm_right_micro mcuf str Zh - - ----- Like parm_right_cursor in micro mode parm_up_micro mcuu str Zi - - ----- Like parm_up_cursor in micro mode select_char_set scs str Zj - - ----- Select character set, #1 set_bottom_margin smgb str Zk - - ----- Set bottom margin at current line set_bottom_margin_parm smgbp str Zl - - ----- Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom set_left_margin_parm smglp str Zm - - ----- Set left (right) margin at column #1 set_right_margin_parm smgrp str Zn - - ----- Set right margin at column #1 set_top_margin smgt str Zo - - ----- Set top margin at current line set_top_margin_parm smgtp str Zp - - ----- Set top (bottom) margin at row #1 start_bit_image sbim str Zq - - ----- Start printing bit image graphics start_char_set_def scsd str Zr - - ----- Start character set definition #1, with #2 characters in the set stop_bit_image rbim str Zs - - ----- Stop printing bit image graphics stop_char_set_def rcsd str Zt - - ----- End definition of character set #1 subscript_characters subcs str Zu - - ----- List of subscriptable characters superscript_characters supcs str Zv - - ----- List of superscriptable characters these_cause_cr docr str Zw - - ----- Printing any of these characters causes CR zero_motion zerom str Zx - - ----- No motion for subsequent character #%.TE #%.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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 # ############################################################################# ncurses-6.4-20240113/include/MKkey_defs.sh0000755000000000000000000001273414264566452016465 0ustar rootroot#! /bin/sh # $Id: MKkey_defs.sh,v 1.23 2022/07/16 16:54:02 tom Exp $ ############################################################################## # Copyright 2019-2020,2022 Thomas E. Dickey # # Copyright 2001-2013,2017 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # MKkey_defs.sh -- generate function-key definitions for curses.h # # Author: Thomas E. Dickey 2001 # # Extract function-key definitions from the Caps file # : "${AWK-awk}" test $# = 0 && set Caps data=data$$ pass1=pass1_$$ pass2=pass2_$$ pass3=pass3_$$ pass4=pass4_$$ trap 'rm -f $data pass[1234]_$$; exit 1' 1 2 3 15 trap 'rm -f $data pass[1234]_$$' 0 # change repeated tabs (used for readability) to single tabs (needed to make # awk see the right field alignment of the corresponding columns): if sort -k 6 "$@" >$data 2>/dev/null then # POSIX sed -e 's/[ ][ ]*/ /g' "$@" |sort -n -k 6 >$data elif sort -n +5 "$@" >$data 2>/dev/null then # SunOS (and SVr4, marked as obsolete but still recognized) sed -e 's/[ ][ ]*/ /g' "$@" |sort -n +5 >$data else echo "Your sort utility is broken. Please install one that works." >&2 exit 1 fi # add keys that we generate automatically: cat >>$data <$output <$data ' function print_cols(text,cols) { printf "%s", text len = length(text); while (len < cols) { printf " " len += 8; } } function decode(keycode) { result = 0; if (substr(keycode, 1, 2) == "0x") { digits="0123456789abcdef"; } else if (substr(keycode, 1, 1) == "0") { digits="01234567"; } else { digits="0123456789"; } while (length(keycode) != 0) { digit=substr(keycode, 1, 1); keycode=substr(keycode, 2); result = result * length(digits) + index(digits, digit) - 1; } return result; } BEGIN { maxkey='$maxkey'; pass='$pass'; key_max=1; bits=1; while (key_max < maxkey) { bits = bits + 1; key_max = (key_max * 2) + 1; } octal_fmt = sprintf ("%%0%do", (bits + 2) / 3 + 1); } /^$/ {next;} /^#/ {next;} /^capalias/ {next;} /^infoalias/ {next;} /^used_by/ {next;} /^userdef/ {next;} $5 != "-" && $6 != "-" { if ($6 == "+") { if (pass == 1 || pass == 2) next; thiskey=maxkey + 1; } else { if (pass == 3) next; thiskey=decode($6); } if (thiskey > maxkey) maxkey = thiskey; if (pass == 2 || pass == 3) { showkey=sprintf(octal_fmt, thiskey); ifdef = 0; if (index($7,"NCURSES_") == 1) { ifdef = 1; printf "\n"; printf "#ifdef %s\n", $7; } if ($5 == "KEY_F(0)" ) { printf "#define " print_cols("KEY_F0", 16); print_cols(showkey, 16); print "/* Function keys. Space for 64 */"; printf "#define " print_cols("KEY_F(n)", 16); print_cols("(KEY_F0+(n))", 16); print "/* Value of function key n */" } else { printf "#define " print_cols($5, 16); print_cols(showkey, 16); printf "/*" for (i = 8; i <= NF; i++) printf " %s", $i print " */" } if (ifdef != 0) { printf "#endif\n"; } } } END { if (pass == 1) { print maxkey; } else if (pass == 4) { print ""; printf "#define "; print_cols("KEY_MAX", 16); result = sprintf (octal_fmt, key_max); print_cols(result, 16); printf "/* Maximum key value is "; printf octal_fmt, maxkey; print " */"; } } ' if test $pass = 1 ; then maxkey=`cat $pass1` fi done cat $pass2 cat $pass3 cat $pass4 ncurses-6.4-20240113/include/MKparametrized.sh0000755000000000000000000000721713615656212017354 0ustar rootroot#!/bin/sh ############################################################################## # Copyright 2019,2020 Thomas E. Dickey # # Copyright 1998-2014,2017 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # $Id: MKparametrized.sh,v 1.10 2020/02/02 23:34:34 tom Exp $ # # MKparametrized.sh -- generate indirection vectors for various sort methods # # The output of this script is C source for an array specifying whether # termcap strings should undergo parameter and padding translation. # [ $# = 0 ] && set - Caps cat < #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 */ ncurses-6.4-20240113/include/Makefile.in0000644000000000000000000001342514070131363016130 0ustar rootroot# $Id: Makefile.in,v 1.53 2021/07/03 18:56:51 tom Exp $ ############################################################################## # Copyright 2019-2020,2021 Thomas E. Dickey # # Copyright 1998-2013,2015 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1996-on # # Makefile for ncurses source code. # # This makes/installs ncurses include-files # # The variable 'srcdir' refers to the source-distribution, and can be set with # the configure script by "--srcdir=DIR". # turn off _all_ suffix rules; we'll generate our own .SUFFIXES: SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile DESTDIR = @DESTDIR@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ includedir = @includedir@ includesubdir = @includesubdir@ INCLUDEDIR = $(DESTDIR)$(includedir)$(includesubdir) INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ AWK = @AWK@ LN_S = @LN_S@ CC = @CC@ CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ CPPFLAGS = -DHAVE_CONFIG_H -I. @CPPFLAGS@ CTAGS = @CTAGS@ ETAGS = @ETAGS@ VERSION = @cf_cv_rel_version@ # The "Caps" file specifies the terminfo database format, as well as the list # of function keys. TERMINFO_CAPS = $(srcdir)/@TERMINFO_CAPS@ CAPLIST = $(TERMINFO_CAPS) \ $(srcdir)/Caps-ncurses # These files are generated by the configure script CONFIG_SRC = \ MKterm.h.awk \ curses.head \ ncurses_dll.h \ termcap.h \ unctrl.h # These files are generated by this makefile AUTO_SRC = \ curses.h \ hashsize.h \ ncurses_def.h \ parametrized.h \ config.h \ term.h ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : check @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : depend @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.libs @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.libs all \ libs \ depend \ sources \ install :: $(AUTO_SRC) curses.h : $(CAPLIST) \ curses.head \ $(srcdir)/curses.tail \ $(srcdir)/MKkey_defs.sh cat curses.head >$@ AWK=$(AWK) $(SHELL) $(srcdir)/MKkey_defs.sh $(CAPLIST) >>$@ $(SHELL) -c 'if test "@NCURSES_WGETCH_EVENTS@" = "1" ; then cat $(srcdir)/curses.events >>$@ ; fi' $(SHELL) -c 'if test "@NCURSES_CH_T@" = "cchar_t" ; then cat $(srcdir)/curses.wide >>$@ ; fi' cat $(srcdir)/curses.tail >>$@ term.h: $(CAPLIST) \ MKterm.h.awk $(AWK) -f MKterm.h.awk $(CAPLIST) > $@ $(SHELL) $(srcdir)/edit_cfg.sh ../include/ncurses_cfg.h $@ hashsize.h: $(CAPLIST) \ $(srcdir)/MKhashsize.sh $(SHELL) $(srcdir)/MKhashsize.sh $(CAPLIST) >$@ ncurses_def.h: $(srcdir)/ncurses_defs $(srcdir)/MKncurses_def.sh AWK=$(AWK) $(SHELL) $(srcdir)/MKncurses_def.sh $(srcdir)/ncurses_defs >$@ parametrized.h: $(CAPLIST) \ $(srcdir)/MKparametrized.sh AWK=$(AWK) $(SHELL) $(srcdir)/MKparametrized.sh $(CAPLIST) >$@ # This is required by pthread.h on MinGW config.h: touch $@ tags: $(CTAGS) *.[ch] @MAKE_UPPER_TAGS@TAGS: @MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] mostlyclean :: -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace clean :: mostlyclean -rm -f $(AUTO_SRC) -rm -rf *.dSYM distclean :: clean -rm -f Makefile $(CONFIG_SRC) config.h realclean :: distclean # Verify that each header-file can be compiled without including another. check: @$(SHELL) -c "for header in *.h;\ do \ echo \"** testing \$${header}\" ; \ echo \"#include <\$${header}>\" >headers.c; \ echo \"int main(void) { return 0; }\" >>headers.c; \ $(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \ done" -@rm -f headers.* ############################################################################### # The remainder of this file is automatically generated during configuration ############################################################################### ncurses-6.4-20240113/include/nc_tparm.h0000644000000000000000000001131514417033410016032 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/include/ncurses_defs0000644000000000000000000001405714425504517016504 0ustar rootroot# $Id: ncurses_defs,v 1.109 2023/05/06 17:07:27 tom Exp $ ############################################################################## # Copyright 2018-2022,2023 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_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 ncurses-6.4-20240113/include/nc_access.h0000644000000000000000000000650614425430777016176 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/include/Caps.osf1r50000644000000000000000000015440314550604463016025 0ustar rootroot############################################################################## # 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.20 2024/01/13 22:05:39 tom Exp $ # # This is an adaptation of ncurses' termcap/terminfo capability table, which # is designed to align with OSF/1 version 5 (Tru64) terminfo. # # This table is used to generate initializers for tables that drive tic, # infocmp, and the library compilation code used to support the termcap # compatibility hack. It is also used to generate the tabular portion of the # terminfo(5) man page; lines beginning with `#%' are passed through to become # the terminfo table. # # This file has three major sections; a standard-capabilities table, two # extension-capability tables, and a section of aliases declarations. # The first two have the same format, as follows: # # FILE FORMAT # # Column 1: terminfo variable name # Column 2: terminfo capability name # Column 3: capability type (Boolean, numeric, or string) # Column 4: termcap capability name # Column 5: KEY_xxx name, if any, `-' otherwise # Column 6: value for KEY_xxx name, if any, `-' otherwise # Column 7: Lead with `Y' if capability should be emitted in termcap # translations, `-' otherwise # Column 8: capability description # # The codes following [Y-] in column 7 describe the versions of termcap which # use the given capability. This information is not used by the curses library # proper; rather, it is there to help the terminfo maintainer avoid emitting # termcap entry translations that are more than 1023 bytes long (and tank a # lot of old termcap-using programs). The codes read as follows: # B = mentioned in the BSD man page for 4.4BSD curses # C = used by the 4.4BSD curses library # G = mentioned in the documentation for GNU termcap # E = used by GNU Emacs # K = remove this terminfo capability when translating to standard format # The important codes are C and E. A cap with C or E should be preserved in # translation if possible. The problem is that preserving all such caps may # lead to some termcap translations being too long. The termcap maintainer # has a bit of a juggling act to do...potential problem cases are marked with # an asterisk (*). # # The aliases section has the following format: # # Column 1: either `capalias' or `infoalias' # Column 2: name to be aliased # Column 3: what name it should translate to. The name IGNORE means it # should be discarded with a warning message. # Column 4: name of the extension set (used for compiler warning messages) # Column 5: capability description (usually an associated terminfo variable) # # HANDLING TERMCAP AND TERMINFO EXTENSIONS # # There are basically five different ways to handle termcap and terminfo # extensions: # # 1. Don't list the capname here, or list it but comment it out (the latter # is preferable; someone might want to handle it in the future). If you do # this, the capability will be treated as unknown and raise a warning from # the compiler. # # 2. Alias it. This is appropriate if the capability has the same meaning # as an already-supported one. The compiler will handle aliasing, emitting # an appropriate informational message whenever an alias fires. # # 3. List it in the standard table. You almost certainly do *not* want # to do this -- the capabilities in that one, and their order, have been # carefully chosen to be SVr4-binary-compatible when they're written out # as a terminfo object, and breaking this would be bad. It is up to the ncurses # library what to do with the terminfo data after it is read in. # # 4. List it in the aliases table with an IGNORE target field. If you # do this, the capability will be ignored on input (though the user will # get a warning message about it). # # 5. List it in the extensions table. If you do this, the compiler will # silently accept the capability, but the curses library proper will never # see it (because it won't be written out as part of the terminfo object # format). It is up to you what you have the compiler do with it. # # There are two opposite reasons to choose option 5. One is when you want # to eat the capability silently and discard it when doing translations # to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are # in this class. Nothing will ever use them again. # # More usually, you want the compiler to try to deduce something from the # capability value that it can use to translate it into your output format. # You'll need to write custom code, probably in postprocess_termcap() or # postprocess_terminfo(), to handle the translation. # # CONTROLLING ENTRY LENGTH # # Notes on specific elisions made to fit translations within 1023 bytes: # # Machines with IBM PC-like keyboards want to be able to define the following # keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- # only environments for End or Home-Down), key_dc, and key_ic. This is also # the set of keys the `joe' editor will be upset if it can't see. So don't # trim those out of the set to be translated to termcap, or various users of # the termcap file will become irate. # # It might look tempting to leave those long init strings out of translations. # We can't do it (yet); 4.4BSD tput and tset use them. # # We retain the sgr capability in translation in spite of the fact that neither # 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are # hard to understand without it, and (b) the entries in which it is long tend # to be older types that don't use up a lot of string space on function keys. # The tic(1) translation code will complain and elide it if it makes a critical # difference (there is special code in tic to recognize this situation). # # Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion # optimizer in BSD curses didn't use them. This omission seems to be the # single most effective one, it shortened the resolved length of all thirteen # problem entries in the 9.9.0 version of the terminfo master below critical. # # It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap # translations go back over critical if we do this. As 4.4BSD curses fades # into history and GNU termcap's application base shrinks towards being GNU # Emacs only, we'll probably elide out some BSD-only capabilities in order # to buy space for non-essentials Emacs is still using. Capabilities high # on that hit list: rc, sc, uc. # ############################################################################# # # STANDARD CAPABILITIES # #%The following is a complete table of the capabilities included in a #%terminfo description block and available to terminfo-using code. #%In each line of the table, #%.bP #%The \fBvariable\fR is the name by which the programmer (at the terminfo level) #%accesses the capability. #%.bP #%The \fBcapname\fR (\fICap-name\fP) #%is the short name used in the text of the database, #%and is used by a person updating the database. #%.IP #%Whenever possible, capnames are chosen to be the same as or similar to #%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses #%identical or very similar names). #%Semantics are also intended to match those of the specification. #%.IP #%Capability names have no hard length limit, but an informal limit of 5 #%characters has been adopted to keep them short and to allow the tabs in #%the source file #%.B Caps #%to line up nicely. #%.bP #%The \fBtermcap\fP (\fITcap\fP) code is the old capability name #%(some capabilities are new, and have names which termcap did not originate). #%.bP #%Finally, the \fBdescription\fP field attempts to convey the semantics of the #%capability. #%.PP #%You may find some codes in the description field: #%.TP #%(P) #%indicates that padding may be specified #%.TP #%#[1-9] #%in the description field indicates that the string is passed #%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP). #%.IP #%If no parameters are listed in the description, #%passing the string through \fBtparm\fP(3X) may give unexpected results, #%e.g., if it contains percent (%%) signs. #%.TP #%(P*) #%indicates that padding may vary in proportion to the number of #%lines affected #%.TP #%(#\d\fIi\fP\u) #%indicates the \fIi\fP\uth\d parameter. #%. #%.PP #%.TS #%center; #%Lb Cb S Lb #%Lb Lb Lb Lb #%Lb Lb Lb 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 #%Lb Lb Lb 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 #%Lb Lb Lb 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 key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key key_f10 kf10 str k; KEY_F(10) - ----E F10 function key key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key key_home khome str kh KEY_HOME 0406 YBCGE home key key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key keypad_local rmkx str ke - - YBCGE leave 'keyboard_transmit' mode keypad_xmit smkx str ks - - YBCGE enter 'keyboard_transmit' mode lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 lab_f10 lf10 str la - - ----- label on function key f10 if not f10 lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 meta_off rmm str mo - - YB-G-* turn off meta mode meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) newline nel str nw - - YB-G-* newline (behave like cr followed by lf) pad_char pad str pc - - YBCGE padding char (instead of null) parm_dch dch str DC - - YB-GE delete #1 characters (P*) parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) parm_ich ich str IC - - YB-GE insert #1 characters (P*) parm_index indn str SF - - YBCG- scroll forward #1 lines (P) parm_insert_line il str AL - - YBCGE insert #1 lines (P*) parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 print_screen mc0 str ps - - -B-G-* print contents of screen prtr_off mc4 str pf - - -B-G-* turn off printer prtr_on mc5 str po - - -B-G-* turn on printer repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) reset_1string rs1 str r1 - - -B--- reset string reset_2string rs2 str r2 - - -B--- reset string reset_3string rs3 str r3 - - -B--- reset string reset_file rf str rf - - -B--- name of reset file restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) save_cursor sc str sc - - YBCG- save current cursor position (P) scroll_forward ind str sf - - YBCGE scroll text up (P) scroll_reverse ri str sr - - YBCGE scroll text down (P) set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) set_tab hts str st - - YB-G- set a tab in every row, current columns set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 tab ht str ta - - YBCGE tab to next 8-space hardware tab stop to_status_line tsl str ts - - YB-G- move to status line, column #1 underline_char uc str uc - - YBCG- underline char and move past it up_half_line hu str hu - - YB-G- half a line up init_prog iprog str iP - - -B--- path name of program for initialization key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes # # SVr1 capabilities stop here. IBM's version of terminfo is the same as # SVr4 up to this point, but has a different set afterwards. # # OSF1 differences start here, based on IBM version: # box_chars_1 box1 str bx - - ----K box characters primary set box_chars_2 box2 str by - - ----K box characters secondary set box_attr_1 batt1 str Bx - - ----K attributes for box1 box_attr_2 batt2 str By - - ----K attributes for box2 color_bg_0 colb0 str d0 - - ----K background color 0 color_bg_1 colb1 str d1 - - ----K background color 1 color_bg_2 colb2 str d2 - - ----K background color 2 color_bg_3 colb3 str d3 - - ----K background color 3 color_bg_4 colb4 str d4 - - ----K background color 4 color_bg_5 colb5 str d5 - - ----K background color 5 color_bg_6 colb6 str d6 - - ----K background color 6 color_bg_7 colb7 str d7 - - ----K background color 7 color_fg_0 colf0 str c0 - - ----K foreground color 0 color_fg_1 colf1 str c1 - - ----K foreground color 1 color_fg_2 colf2 str c2 - - ----K foreground color 2 color_fg_3 colf3 str c3 - - ----K foreground color 3 color_fg_4 colf4 str c4 - - ----K foreground color 4 color_fg_5 colf5 str c5 - - ----K foreground color 5 color_fg_6 colf6 str c6 - - ----K foreground color 6 color_fg_7 colf7 str c7 - - ----K foreground color 7 font_0 font0 str f0 - - ----- select font 0 font_1 font1 str f1 - - ----- select font 1 font_2 font2 str f2 - - ----- select font 2 font_3 font3 str f3 - - ----- select font 3 font_4 font4 str f4 - - ----K select font 4 font_5 font5 str f5 - - ----K select font 5 font_6 font6 str f6 - - ----K select font 6 font_7 font7 str f7 - - ----K select font 7 key_back_tab kbtab str k0 - - ----- backtab key key_do kdo str ki - - ----K do request key key_command kcmd str kc KEY_COMMAND 0545 ----- command key key_command_pane kcpn str kW - - ----K command-pane key key_end kend str @7 KEY_END 0550 ----- end key key_help khlp str %1 KEY_HELP 0553 ----- help key key_newline knl str nl - - ----K newline key key_next_pane knpn str kv - - ----K next-pane key key_prev_cmd kppn str kp - - ----K previous-command key key_prev_pane kppn str kV - - ----K previous-pane key key_quit kquit str kQ - - ----K quit key key_select kslt str *6 KEY_SELECT 0601 ----- select key key_scroll_left kscl str kz - - ----K scroll left key_scroll_right kscr str kZ - - ----K scroll right key_tab ktab str ko - - ----K tab key key_smap_in1 kmpf1 str Kv - - ----K special mapped key 1 input key_smap_out1 kmpt1 str KV - - ----K special mapped key 1 output key_smap_in2 kmpf2 str Kw - - ----K special mapped key 2 input key_smap_out2 kmpt2 str KW - - ----K special mapped key 2 output key_smap_in3 kmpf3 str Kx - - ----K special mapped key 3 input key_smap_out3 kmpt3 str KX - - ----K special mapped key 3 output key_smap_in4 kmpf4 str Ky - - ----K special mapped key 4 input key_smap_out4 kmpt4 str KY - - ----K special mapped key 4 output key_smap_in5 kmpf5 str Kz - - ----K special mapped key 5 input key_smap_out5 kmpt5 str KZ - - ----K special mapped key 5 output appl_defined_str apstr str za - - ----K application-defined string # The key_smap_in[6789] and key_smap_out[6789] capabilities are described in # the Tru64 manual pages. key_smap_in6 kmpf6 str Kr - - ----K special mapped key 6 input key_smap_out6 kmpt6 str KR - - ----K special mapped key 6 output key_smap_in7 kmpf7 str Ks - - ----K special mapped key 7 input key_smap_out7 kmpt7 str KS - - ----K special mapped key 7 output key_smap_in8 kmpf8 str Kt - - ----K special mapped key 8 input key_smap_out8 kmpt8 str KT - - ----K special mapped key 8 output key_smap_in9 kmpf9 str Ku - - ----K special mapped key 9 input key_smap_out9 kmpt9 str KU - - ----K special mapped key 9 output key_sf1 ksf1 str S1 - - ----K special function key 1 key_sf2 ksf2 str S2 - - ----K special function key 2 key_sf3 ksf3 str S3 - - ----K special function key 3 key_sf4 ksf4 str S4 - - ----K special function key 4 key_sf5 ksf5 str S5 - - ----K special function key 5 key_sf6 ksf6 str S6 - - ----K special function key 6 key_sf7 ksf7 str S7 - - ----K special function key 7 key_sf8 ksf8 str S8 - - ----K special function key 8 key_sf9 ksf9 str S9 - - ----K special function key 9 key_sf10 ksf10 str SA - - ----K special function key 10 # key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key key_f20 kf20 str FA KEY_F(20) - ----E F20 function key key_f21 kf21 str FB KEY_F(21) - ----E F21 function key key_f22 kf22 str FC KEY_F(22) - ----E F22 function key key_f23 kf23 str FD KEY_F(23) - ----E F23 function key key_f24 kf24 str FE KEY_F(24) - ----E F24 function key key_f25 kf25 str FF KEY_F(25) - ----E F25 function key key_f26 kf26 str FG KEY_F(26) - ----E F26 function key key_f27 kf27 str FH KEY_F(27) - ----E F27 function key key_f28 kf28 str FI KEY_F(28) - ----E F28 function key key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key key_f30 kf30 str FK KEY_F(30) - ----E F30 function key key_f31 kf31 str FL KEY_F(31) - ----E F31 function key key_f32 kf32 str FM KEY_F(32) - ----E F32 function key key_f33 kf33 str FN KEY_F(33) - ----E F33 function key key_f34 kf34 str FO KEY_F(34) - ----E F34 function key key_f35 kf35 str FP KEY_F(35) - ----E F35 function key key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key key_action kact str kJ KEY_ACTION 0541 ----K sent by action key acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 alt_scancode_esc scesa str S8 - - ----- Alternate escape for scancode emulation bit_image_repeat birep str Xy - - ----- Repeat bit image cell #1 #2 times bit_image_newline binel str Zz - - ----- Move to next row of the bit image bit_image_carriage_return bicr str Yv - - ----- Move to beginning of same row change_char_pitch cpi str ZA - - ----- Change number of characters per inch to #1 change_line_pitch lpi str ZB - - ----- Change number of lines per inch to #1 change_res_horz chr str ZC - - ----- Change horizontal resolution to #1 change_res_vert cvr str ZD - - ----- Change vertical resolution to #1 char_padding rmp str rP - - ----- like ip but when in insert mode char_set_names csnm str Zy - - ----- Produce #1'th item from list of character set names clear_margins mgc str MC - - ----- clear right and left soft margins clr_bol el1 str cb - - ----- Clear to beginning of line code_set_init csin str ci - - ----- Init sequence for multiple codesets color_names colornm str Yw - - ----- Give name for color #1 create_window cwin str CW - - ----- define a window #1 from #2,#3 to #4,#5 define_bit_image_region defbi str Yx - - ----- Define rectangular bit image region define_char defc str ZE - - ----- Define a character #1, #2 dots wide, descender #3 device_type devt str dv - - ----- Indicate language/codeset support dial_phone dial str DI - - ----- dial number #1 display_clock dclk str DK - - ----- display clock display_pc_char dispc str S1 - - ----- Display PC character #1 ena_acs enacs str eA - - ----- enable alternate char set end_bit_image_region endbi str Yy - - ----- End a bit-image region enter_am_mode smam str SA - - ----- turn on automatic margins enter_doublewide_mode swidm str ZF - - ----- Enter double-wide mode enter_draft_quality sdrfq str ZG - - ----- Enter draft-quality mode enter_italics_mode sitm str ZH - - ----- Enter italic mode enter_leftward_mode slm str ZI - - ----- Start leftward carriage motion enter_micro_mode smicm str ZJ - - ----- Start micro-motion mode enter_near_letter_quality snlq str ZK - - ----- Enter NLQ mode enter_normal_quality snrmq str ZL - - ----- Enter normal-quality mode enter_pc_charset_mode smpch str S2 - - ----- Enter PC character display mode enter_scancode_mode smsc str S4 - - ----- Enter PC scancode mode enter_shadow_mode sshm str ZM - - ----- Enter shadow-print mode enter_subscript_mode ssubm str ZN - - ----- Enter subscript mode enter_superscript_mode ssupm str ZO - - ----- Enter superscript mode enter_upward_mode sum str ZP - - ----- Start upward carriage motion enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking exit_am_mode rmam str RA - - ----- turn off automatic margins exit_doublewide_mode rwidm str ZQ - - ----- End double-wide mode exit_italics_mode ritm str ZR - - ----- End italic mode exit_leftward_mode rlm str ZS - - ----- End left-motion mode exit_micro_mode rmicm str ZT - - ----- End micro-motion mode exit_pc_charset_mode rmpch str S3 - - ----- Exit PC character display mode exit_scancode_mode rmsc str S5 - - ----- Exit PC scancode mode exit_shadow_mode rshm str ZU - - ----- End shadow-print mode exit_subscript_mode rsubm str ZV - - ----- End subscript mode exit_superscript_mode rsupm str ZW - - ----- End superscript mode exit_upward_mode rum str ZX - - ----- End reverse character motion exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking fixed_pause pause str PA - - ----- pause for 2-3 seconds flash_hook hook str fh - - ----- flash switch hook get_mouse getm str Gm - - ----- Curses should get button events, parameter #1 not documented. goto_window wingo str WG - - ----- go to window #1 hangup hup str HU - - ----- hang-up phone initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) key_beg kbeg str @1 KEY_BEG 0542 ----- begin key key_btab kcbt str kB KEY_BTAB 0632 ----- back-tab key key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key key_close kclo str @3 KEY_CLOSE 0544 ----- close key key_copy kcpy str @5 KEY_COPY 0546 ----- copy key key_create kcrt str @6 KEY_CREATE 0547 ----- create key key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key key_exit kext str @9 KEY_EXIT 0551 ----- exit key key_f37 kf37 str FR KEY_F(37) - ----E F37 function key key_f38 kf38 str FS KEY_F(38) - ----E F38 function key key_f39 kf39 str FT KEY_F(39) - ----E F39 function key key_f40 kf40 str FU KEY_F(40) - ----E F40 function key key_f41 kf41 str FV KEY_F(41) - ----E F41 function key key_f42 kf42 str FW KEY_F(42) - ----E F42 function key key_f43 kf43 str FX KEY_F(43) - ----E F43 function key key_f44 kf44 str FY KEY_F(44) - ----E F44 function key key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key key_find kfnd str @0 KEY_FIND 0552 ----- find key key_mark kmrk str %2 KEY_MARK 0554 ----- mark key key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key key_mouse kmous str Km KEY_MOUSE 0631 ----- Mouse event has occurred key_move kmov str %4 KEY_MOVE 0556 ----- move key key_next knxt str %5 KEY_NEXT 0557 ----- next key key_open kopn str %6 KEY_OPEN 0560 ----- open key key_options kopt str %7 KEY_OPTIONS 0561 ----- options key key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key key_print kprt str %9 KEY_PRINT 0532 ----- print key key_redo krdo str %0 KEY_REDO 0563 ----- redo key key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key key_restart krst str &4 KEY_RESTART 0567 ----- restart key key_resume kres str &5 KEY_RESUME 0570 ----- resume key key_save ksav str &6 KEY_SAVE 0571 ----- save key key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key key_send kEND str *7 KEY_SEND 0602 ----- shifted end key key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key key_undo kund str &8 KEY_UNDO 0630 ----- undo key label_format fln str Lf - - ----- label format label_off rmln str LF - - ----- turn off soft labels label_on smln str LO - - ----- turn on soft labels micro_column_address mhpa str ZY - - ----- Like column_address in micro mode micro_down mcud1 str ZZ - - ----- Like cursor_down in micro mode micro_left mcub1 str Za - - ----- Like cursor_left in micro mode micro_right mcuf1 str Zb - - ----- Like cursor_right in micro mode micro_row_address mvpa str Zc - - ----- Like row_address #1 in micro mode micro_up mcuu1 str Zd - - ----- Like cursor_up in micro mode mouse_info minfo str Mi - - ----- Mouse status information order_of_pins porder str Ze - - ----- Match software bits to print-head pins orig_colors oc str oc - - ----- Set all color pairs to the original ones orig_pair op str op - - ----- Set default pair to its original value parm_down_micro mcud str Zf - - ----- Like parm_down_cursor in micro mode parm_left_micro mcub str Zg - - ----- Like parm_left_cursor in micro mode parm_right_micro mcuf str Zh - - ----- Like parm_right_cursor in micro mode parm_up_micro mcuu str Zi - - ----- Like parm_up_cursor in micro mode pc_term_options pctrm str S6 - - ----- PC terminal options pkey_plab pfxl str xl - - ----- Program function key #1 to type string #2 and show string #3 plab_norm pln str pn - - ----- program label #1 to show string #2 pulse pulse str PU - - ----- select pulse dialing quick_dial qdial str QD - - ----- dial number #1 without checking req_for_input rfi str RF - - ----- send next input char (for ptys) req_mouse_pos reqmp str RQ - - ----- Request mouse position remove_clock rmclk str RC - - ----- remove clock scancode_escape scesc str S7 - - ----- Escape for scancode emulation select_char_set scs str Zj - - ----- Select character set, #1 set0_des_seq s0ds str s0 - - ----- Shift to codeset 0 (EUC set 0, ASCII) set1_des_seq s1ds str s1 - - ----- Shift to codeset 1 set2_des_seq s2ds str s2 - - ----- Shift to codeset 2 set3_des_seq s3ds str s3 - - ----- Shift to codeset 3 set_a_background setab str AB - - ----- Set background color to #1, using ANSI escape set_a_foreground setaf str AF - - ----- Set foreground color to #1, using ANSI escape set_background setb str Sb - - ----- Set background color #1 set_bottom_margin smgb str Zk - - ----- Set bottom margin at current line set_bottom_margin_parm smgbp str Zl - - ----- Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom set_clock sclk str SC - - ----- set clock, #1 hrs #2 mins #3 secs set_color_band setcolor str Yz - - ----- Change to ribbon color #1 set_color_pair scp str sp - - ----- Set current color pair to #1 set_foreground setf str Sf - - ----- Set foreground color #1 set_left_margin smgl str ML - - ----- set left soft margin at current column. (ML is not in BSD termcap). set_left_margin_parm smglp str Zm - - ----- Set left (right) margin at column #1 set_lr_margin smglr str ML - - ----- Set both left and right margins to #1, #2. (ML is not in BSD termcap). set_page_length slines str YZ - - ----- Set page length to #1 lines set_right_margin smgr str MR - - ----- set right soft margin at current column set_right_margin_parm smgrp str Zn - - ----- Set right margin at column #1 set_tb_margin smgtb str MT - - ----- Sets both top and bottom margins to #1, #2 set_top_margin smgt str Zo - - ----- Set top margin at current line set_top_margin_parm smgtp str Zp - - ----- Set top (bottom) margin at row #1 start_bit_image sbim str Zq - - ----- Start printing bit image graphics start_char_set_def scsd str Zr - - ----- Start character set definition #1, with #2 characters in the set stop_bit_image rbim str Zs - - ----- Stop printing bit image graphics stop_char_set_def rcsd str Zt - - ----- End definition of character set #1 subscript_characters subcs str Zu - - ----- List of subscriptable characters superscript_characters supcs str Zv - - ----- List of superscriptable characters these_cause_cr docr str Zw - - ----- Printing any of these characters causes CR tone tone str TO - - ----- select touch tone dialing user0 u0 str u0 - - ----- User string #0 user1 u1 str u1 - - ----- User string #1 user2 u2 str u2 - - ----- User string #2 user3 u3 str u3 - - ----- User string #3 user4 u4 str u4 - - ----- User string #4 user5 u5 str u5 - - ----- User string #5 user6 u6 str u6 - - ----- User string #6 user7 u7 str u7 - - ----- User string #7 user8 u8 str u8 - - ----- User string #8 user9 u9 str u9 - - ----- User string #9 wait_tone wait str WA - - ----- wait for dial-tone xoff_character xoffc str XF - - ----- XOFF character xon_character xonc str XN - - ----- XON character zero_motion zerom str Zx - - ----- No motion for subsequent character set_pglen_inch slength str YI - - ----- Set page length to #1 hundredth of an inch (some implementations use sL for termcap). enter_horizontal_hl_mode ehhlm str Xh - - ----- Enter horizontal highlight mode enter_left_hl_mode elhlm str Xl - - ----- Enter left highlight mode enter_low_hl_mode elohlm str Xo - - ----- Enter low highlight mode enter_right_hl_mode erhlm str Xr - - ----- Enter right highlight mode enter_top_hl_mode ethlm str Xt - - ----- Enter top highlight mode enter_vertical_hl_mode evhlm str Xv - - ----- Enter vertical highlight mode set_a_attributes sgr1 str sA - - ----- Define second set of video attributes #1-#6 # # # # %%-STOP-HERE-%% # # Don't move this casually! In fact, don't move it at all unless you're # either doing it to add System V or XPG4 extensions, or have decided you # don't care about SVr4 binary compatibility. # ############################################################################# # # TERMCAP EXTENSION CAPABILITIES # # The capabilities below are either obsolete or extensions on certain systems. # They are not used by SVR4 terminfo. Some are used by captoinfo to translate # termcap sources; the rest are listed for completeness, and in case somebody # cares about them enough to hack in code that will translate them into # terminfo capabilities. # # The first part of the list is from Ross Ridge's `mytinfo' package # (comp.sources.unix, volume 26); the variable names and terminfo names (as # well as the termcap codes) match his list. # # This group of codes is not marked obsolete in 4.4BSD, but have no direct # terminfo equivalents. The rs capability is specially translated to terminfo # r2, and vice versa, if an entry does not already have an r2. Similarly, # i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2). # The ug capability is thrown away, but assumed to be whatever sg is if the # latter is nonzero and we're dumping in termcap format. # termcap_init2 OTi2 str i2 - - YB--- secondary initialization string termcap_reset OTrs str rs - - YB-G- terminal reset string magic_cookie_glitch_ul OTug num ug - - YBCGE number of blanks left by ul # # Obsolete termcap capabilities. Some are used for termcap translation. The # code uses the 'OT' prefix we put on obsolete capabilities to suppress # printing them in terminfo source dumps of compiled entries. # backspaces_with_bs OTbs bool bs - - YBCGE uses ^H to move left crt_no_scrolling OTns bool ns - - YBCG- crt cannot scroll no_correctly_working_cr OTnc bool nc - - YBCG- no way to go to start of line carriage_return_delay OTdC num dC - - YB-G- pad needed for CR new_line_delay OTdN num dN - - YB-G- pad needed for LF linefeed_if_not_lf OTnl str nl - - YBCGE use to move down backspace_if_not_bs OTbc str bc - - YBCGE move left, if not ^H # # GNU termcap library extensions. The GNU termcap file distributed with # Emacs no longer uses these, but MT showed up in pre-9.0 versions of the # BSD termcap file. The name clash with terminfo MT is resolved by type # info; MT is converted to km. # gnu_has_meta_key OTMT bool MT - - ----E has meta key # gnu_tab_width OTtw num tw - - ----E tab width in spaces # # GNU termcap *does* include the following extended capability, Only the # now-obsolete Ann Arbor terminals used it. # # gnu_change_scroll_region OTcS str cS - - ---GE alternate set scrolling region # # The following comments describe capnames so ancient that I believe no # software uses them any longer. Some of these have to go because they # clash with terminfo names in ways that cannot be resolved by type # information. # # These mytinfo codes are not used in the 4.4BSD curses code. They are # marked obsolete in the 4.4BSD manual pages. # # There is one conflict with terminfo; ma is in both. This conflict is # resolved by type information. # # The `ko' capability is translated by special code. It should contain a # comma-separated list of capabilities for which there are corresponding keys. # The `kn' code is accepted but ignored. # # The `ma' capability was a 4.0BSD feature used by vi version 2. # It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh. # Besides being obsolete, that interpretation conflicts with max_attributes. # # Here is a description of memory_lock_above and memory_unlock: # "You can 'freeze' data on the screen by turning on Memory Lock in a line of # text. All lines above the cursor's current line become locked in place on # the screen. Then enter data normally. When the screen fills up, any # further data entered forces the first line of unfrozen line text to scroll # under the frozen data. Lines scrolled off the screen are inserted into # memory immediately preceding the first frozen line." (from the HP 700/96 # User's manual). VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l. # # Applications that use terminfo are supposed to behave as though xr is # always true. # linefeed_is_newline OTNL bool NL - - YB--- move down with \n # even_parity OTEP bool EP - - -B--- terminal requires even parity # odd_parity OTOP bool OP - - -B--- terminal requires odd parity # half_duplex OTHD bool HD - - -B--- terminal is half-duplex # lower_case_only OTLC bool LC - - -B--- terminal has only lower case # upper_case_only OTUC bool UC - - -B--- terminal has only upper case backspace_delay OTdB num dB - - YB-G- padding required for ^H # form_feed_delay OTdF num dF - - -B-G- padding required for ^L horizontal_tab_delay OTdT num dT - - YB-G- padding required for ^I # vertical_tab_delay OTdV num dV - - -B--- padding required for ^V number_of_function_keys OTkn num kn - - -B-G- count of function keys other_non_function_keys OTko str ko - - -B-G- list of self-mapped keycaps arrow_key_map OTma str ma - - YBC-- map motion-keys for vi version 2 # memory_lock_above OTml str ml - - -B--- lock visible screen memory above the current line # memory_unlock OTmu str mu - - -B--- unlock visible screen memory above the current line has_hardware_tabs OTpt bool pt - - YB--- has 8-char tabs invoked with ^I return_does_clr_eol OTxr bool xr - - YB--- return clears the line # tek_4025_insert_line OTxx bool xx - - -BC-- Tektronix 4025 insert-line glitch # # mytinfo described this as a termcap capability, but it is not listed in the # 4.4BSD man pages, and not found in the 4.4BSD termcap file. The ncurses # package, like System V, behaves as though it is always true. # # rind_only_at_top OTxq bool xq - - ----- reverse index only works from top line # # University of Waterloo termcap extensions (as described in mytinfo). # The `xl' termcap file clashes with a terminfo name; this ambiguity cannot # be resolved by a type check. The descriptions are guesses from what was # in the mytinfo tables. # # key_interrupt_char OTki str ki - - ----- string set by interrupt key (?) # key_kill_char OTkk str kk - - ----- string set by kill key (?) # key_suspend_char OTkz str kz - - ----- string set by suspend key (?) # initialization_messy OTxc bool xc - - ----- initialization leaves garbage on the screen (?) # ind_at_bottom_does_cr OTxl bool xl - - ----- index does a carriage return # # Nonstandard capabilities unique to Ross Ridge's `mytinfo' package. # SR clashes with a terminfo name; this ambiguity cannot be resolved by a type # check. # # scroll_left OTsl1 str Sl - - ----- scroll screen leftward # scroll_right OTsr1 str Sr - - ----- scroll screen rightward # parm_scroll_left OTsl str SL - - ----- scroll screen leftward #1 characters # parm_scroll_right OTsr str SR - - ----- scroll screen rightward #1 characters # # The mytinfo capabilities end here. # # XENIX extensions: # # Xenix defined its own set of forms-drawing capabilities: # # cap IBM ASCII description ACS ASCII # --- ----------- -------------------- ------------- ------ # G1 191 \277 M-? single upper right ACS_URCORNER # G2 218 \332 M-Z single upper left ACS_ULCORNER # G3 192 \300 M-@ single lower left ACS_LLCORNER # G4 217 \331 M-Y single lower right ACS_LRCORNER # G5 187 \273 M-; double upper right # G6 201 \311 M-I double upper left # G7 200 \310 M-H double lower left # G8 188 \274 M-< double lower right # GC 197 \305 M-E single intersection ACS_PLUS _ _ # GD 194 \302 M-B single down-tick ACS_TTEE | # GH 196 \304 M-D single horizontal line ACS_HLINE # GL 180 \264 M-4 single left tick ACS_RTEE -| # GR 195 \303 M-C single right tick ACS_LTEE |- # GU 193 \301 M-A single up tick ACS_BTEE _|_ # GV 179 \263 M-3 single vertical line ACS_VLINE # Gc 206 \316 M-N double intersection # Gd 203 \313 M-K double down tick # Gh 205 \315 M-M double horizontal line # Gl 204 \204 M-L double left tick # Gr 185 \271 M-9 double right tick # Gu 202 \312 M-J double up tick # Gv 186 \272 M-: double vertical line # # The compiler will translate the single-line caps and discard the others # (via IGNORE aliases further down). We don't want to do normal pad # translation on these, they're often single-character printable ASCII # strings that happen to be numerics. There's awk code in parametrized.sh # that detects the acs_ prefix and uses it to suppress pad translation. # These terminfo names are invented. # acs_ulcorner OTG2 str G2 - - ----- single upper left acs_llcorner OTG3 str G3 - - ----- single lower left acs_urcorner OTG1 str G1 - - ----- single upper right acs_lrcorner OTG4 str G4 - - ----- single lower right acs_ltee OTGR str GR - - ----- tee pointing right acs_rtee OTGL str GL - - ----- tee pointing left acs_btee OTGU str GU - - ----- tee pointing up acs_ttee OTGD str GD - - ----- tee pointing down acs_hline OTGH str GH - - ----- single horizontal line acs_vline OTGV str GV - - ----- single vertical line acs_plus OTGC str GC - - ----- single intersection # ############################################################################# # # TERMINFO EXTENSION CAPABILITIES # # (see Caps-ncurses for the complete set of comments) # memory_lock meml str ml - - ----K lock memory above cursor memory_unlock memu str mu - - ----K unlock memory # ############################################################################# ncurses-6.4-20240113/include/nc_alloc.h0000644000000000000000000001134314146302722016006 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/include/nc_mingw.h0000644000000000000000000000653214376464234016055 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2023 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.10 2023/02/25 19:59:24 tom Exp $ */ #ifndef NC_MINGW_H #define NC_MINGW_H 1 #ifdef _WIN32 #ifdef WINVER # if WINVER < 0x0501 # error WINVER must at least be 0x0501 # endif #else # define WINVER 0x0501 #endif #include #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 #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(wchar_t); #ifdef __cplusplus } #endif #endif /* _WIN32 */ #endif /* NC_MINGW_H */ ncurses-6.4-20240113/include/term_entry.h0000644000000000000000000002071214420761412016424 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/include/nc_termios.h0000644000000000000000000001173713722540077016413 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/include/edit_cfg.sh0000755000000000000000000000571214264576470016207 0ustar rootroot#!/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 ncurses-6.4-20240113/README0000644000000000000000000002411214517217540013323 0ustar rootroot------------------------------------------------------------------------------- -- 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 ncurses-6.4-20240113/dist.mk0000644000000000000000000001640114550575647013755 0ustar rootroot############################################################################## # 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.1593 2024/01/13 21:07:51 tom Exp $ # Makefile for creating ncurses distributions. # # This only needs to be used directly as a makefile by developers, but # configure mines the current version number out of here. To move # to a new version number, just edit this file and run configure. # SHELL = /bin/sh # These define the major/minor/patch versions of ncurses. NCURSES_MAJOR = 6 NCURSES_MINOR = 4 NCURSES_PATCH = 20240113 # 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 ncurses-6.4-20240113/Makefile.in0000644000000000000000000001130714316142360014504 0ustar rootroot# $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 :: ncurses-6.4-20240113/MANIFEST0000644000000000000000000011073614523412072013576 0ustar rootroot./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-ncurses6.lintian-overrides ./package/debian-mingw/rules ./package/debian-mingw/source/format ./package/debian-mingw/watch ./package/debian-mingw64/changelog ./package/debian-mingw64/compat ./package/debian-mingw64/control ./package/debian-mingw64/copyright ./package/debian-mingw64/mingw64-ncurses6.lintian-overrides ./package/debian-mingw64/rules ./package/debian-mingw64/source/format ./package/debian-mingw64/watch ./package/debian/changelog ./package/debian/compat ./package/debian/control ./package/debian/copyright ./package/debian/ncurses6.lintian-overrides ./package/debian/ncurses6.triggers ./package/debian/ncursest6.lintian-overrides ./package/debian/ncursest6.triggers ./package/debian/rules ./package/debian/source/format ./package/debian/watch ./package/mingw-ncurses.nsi ./package/mingw-ncurses.spec ./package/ncurses.map ./package/ncurses.spec ./package/ncurses.sym ./package/ncursest.map ./package/ncursest.spec ./package/ncursest.sym ./package/ncursestw.map ./package/ncursestw.sym ./package/ncursesw.map ./package/ncursesw.sym ./panel/Makefile.in ./panel/headers ./panel/llib-lpanel ./panel/llib-lpanelt ./panel/llib-lpaneltw ./panel/llib-lpanelw ./panel/modules ./panel/p_above.c ./panel/p_below.c ./panel/p_bottom.c ./panel/p_delete.c ./panel/p_hidden.c ./panel/p_hide.c ./panel/p_move.c ./panel/p_new.c ./panel/p_replace.c ./panel/p_show.c ./panel/p_top.c ./panel/p_update.c ./panel/p_user.c ./panel/p_win.c ./panel/panel.c ./panel/panel.h ./panel/panel.priv.h ./progs/MKtermsort.sh ./progs/Makefile.in ./progs/capconvert ./progs/clear.c ./progs/clear.sh ./progs/clear_cmd.c ./progs/clear_cmd.h ./progs/dump_entry.c ./progs/dump_entry.h ./progs/infocmp.c ./progs/modules ./progs/progs.priv.h ./progs/reset_cmd.c ./progs/reset_cmd.h ./progs/tabs.c ./progs/tic.c ./progs/toe.c ./progs/tparm_type.c ./progs/tparm_type.h ./progs/tput.c ./progs/transform.c ./progs/tset.c ./progs/tty_settings.c ./progs/tty_settings.h ./test/Makefile.in ./test/README ./test/aclocal.m4 ./test/back_ground.c ./test/background.c ./test/blue.c ./test/bs.6 ./test/bs.c ./test/bulgarian-utf8-tabs.txt ./test/bulgarian-utf8.txt ./test/cardfile.c ./test/cardfile.dat ./test/chgat.c ./test/clip_printw.c ./test/color_content.c ./test/color_name.h ./test/color_set.c ./test/combine.c ./test/configure ./test/configure.in ./test/demo_altkeys.c ./test/demo_defkey.c ./test/demo_forms.c ./test/demo_forms.txt ./test/demo_keyok.c ./test/demo_menus.c ./test/demo_new_pair.c ./test/demo_panels.c ./test/demo_tabs.c ./test/demo_termcap.c ./test/demo_terminfo.c ./test/ditto.c ./test/dots.c ./test/dots_curses.c ./test/dots_mvcur.c ./test/dots_termcap.c ./test/dots_xcurses.c ./test/dump_window.c ./test/dump_window.h ./test/dup_field.c ./test/echochar.c ./test/edit_field.c ./test/edit_field.h ./test/escherknot.xbm ./test/extended_color.c ./test/filter.c ./test/firework.c ./test/firstlast.c ./test/foldkeys.c ./test/form_driver_w.c ./test/gdc.6 ./test/gdc.c ./test/hanoi.c ./test/hashtest.c ./test/inch_wide.c ./test/inchs.c ./test/ins_wide.c ./test/insdelln.c ./test/inserts.c ./test/key_names.c ./test/keynames.c ./test/knight.c ./test/linedata.h ./test/linux-color.dat ./test/list_keys.c ./test/listused.sh ./test/lrtest.c ./test/make-tar.sh ./test/mensetmanus.xbm ./test/mini.xterm_48x48.xpm ./test/mk-test.awk ./test/modules ./test/move_field.c ./test/movewindow.c ./test/ncurses.c ./test/ncurses_tst.hin ./test/newdemo.c ./test/package/debian-mingw/compat ./test/package/debian-mingw/control ./test/package/debian-mingw/copyright ./test/package/debian-mingw/docs ./test/package/debian-mingw/rules ./test/package/debian-mingw/source/format ./test/package/debian-mingw/watch ./test/package/debian-mingw64/compat ./test/package/debian-mingw64/control ./test/package/debian-mingw64/copyright ./test/package/debian-mingw64/docs ./test/package/debian-mingw64/rules ./test/package/debian-mingw64/source/format ./test/package/debian-mingw64/watch ./test/package/debian/compat ./test/package/debian/control ./test/package/debian/copyright ./test/package/debian/docs ./test/package/debian/rules ./test/package/debian/source/format ./test/package/debian/watch ./test/package/mingw-ncurses-examples.spec ./test/package/ncurses-examples.spec ./test/padview.c ./test/pair_content.c ./test/parse_rgb.h ./test/picsmap.c ./test/picsmap.h ./test/popup_msg.c ./test/popup_msg.h ./test/programs ./test/railroad.c ./test/rain.c ./test/redraw.c ./test/savescreen.c ./test/savescreen.sh ./test/sp_tinfo.c ./test/tclock.c ./test/terminal.xbm ./test/test.priv.h ./test/test_add_wchstr.c ./test/test_addchstr.c ./test/test_addstr.c ./test/test_addwstr.c ./test/test_arrays.c ./test/test_delwin.c ./test/test_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 ncurses-6.4-20240113/ANNOUNCE0000644000000000000000000006333514354116727013612 0ustar rootroot Announcing ncurses 6.4 Overview The ncurses (new curses) library is a free software emulation of curses in System V Release 4.0 (SVr4), and more. It uses terminfo format, supports pads and color and multiple highlights and forms characters and function-key mapping, and has all the other SVr4-curses enhancements over BSD curses. SVr4 curses became the basis of X/Open Curses. In mid-June 1995, the maintainer of 4.4BSD curses declared that he considered 4.4BSD curses obsolete, and encouraged the keepers of unix releases such as BSD/OS, FreeBSD and NetBSD to switch over to ncurses. Since 1995, ncurses has been ported to many systems: * It is used in almost every system based on the Linux kernel (aside from some embedded applications). * It is used as the system curses library on OpenBSD, FreeBSD and MacOS. * It is used in environments such as Cygwin and MinGW. The first of these was EMX on OS/2 Warp. * It is used (though usually not as the system curses) on all of the vendor unix systems, e.g., AIX, HP-UX, IRIX64, SCO, Solaris, Tru64. * It should work readily on any ANSI/POSIX-conforming unix. The distribution includes the library and support utilities, including * captoinfo, a termcap conversion tool * clear, utility for clearing the screen * infocmp, the terminfo decompiler * tabs, set tabs on a terminal * tic, the terminfo compiler * toe, list (table of) terminfo entries * tput, utility for retrieving terminal capabilities in shell scripts * tset, to initialize the terminal Full manual pages are provided for the library and tools. The ncurses distribution is available at ncurses' homepage: https://invisible-island.net/archives/ncurses/ or https://invisible-mirror.net/archives/ncurses/ . It is also available at the GNU distribution site https://ftp.gnu.org/gnu/ncurses/ . Release Notes These notes are for ncurses 6.4, released December 31, 2022. This release is designed to be source-compatible with ncurses 5.0 through 6.3; providing extensions to the application binary interface (ABI). Although the source can still be configured to support the ncurses 5 ABI, the reason for the release is to reflect improvements to the ncurses 6 ABI and the supporting utility programs. There are, of course, numerous other improvements, listed in this announcement. The most important bug-fixes/improvements dealt with robustness issues. The release notes also mention some other bug-fixes, but are focused on new features and improvements to existing features since ncurses 6.3 release. Library improvements New features There are no new features in this release. Other improvements These are improvements to existing features: * modify delscreen to more effectively delete all windows on the given screen. * modify wnoutrefresh to call pnoutrefresh if its parameter is a pad, rather than treating it as an error, and modify new_panel to permit its window-parameter to be a pad * modify curses_trace() to show the trace-mask as symbols, e.g., TRACE_ORDINARY, DEBUG_LEVEL(3). * improve checks for valid mouse events when an intermediate mouse state is not part of the mousemask specified by the caller * allow extended-color number in opts parameter of wattr_on. * improve _tracecchar_t2 formatting of base+combining character. * trim out some unwanted linker options from ncurses*config and .pc files seen in Fedora 36+. * improve shell-scripts with shellcheck * improve use of "trap" in shell scripts, using a script. * modify make-tar.sh scripts to make timestamps more predictable. These are corrections to existing features: * modify misc/gen-pkgconfig.in to allow for the case where the library directory does not yet exist, since this is processed before doing an install * set trailing null on string passed from winsnstr to wins_nwstr. * modify waddch_literal to allow for double-width base character when merging a combining character Program improvements Several improvements were made to the utility programs: infocmp + rewrite canonical_name function of infocmp to ensure buffer size + improve readability of long parameterized expressions with the infocmp "-f" option by allowing split before a "%p" marker. + modify verbose-option of infocmp, tic, toe to enable debug-tracing if that is configured. tabs limit tab-stop values to max-columns tic add consistency check in tic for u6/u7/u8/u9 and NQ capabilities. tput corrected use of original tty-modes in init/reset subcommands Examples Along with the library and utilities, improvements were made to the ncurses-examples. Most of this activity aimed at improving the test-packages: * add minimal -h (usage) and -V (version) getopt logic to all ncurses-examples programs. * fix an error in "@" command in test/ncurses.c F-menu * add curses_trace to ifdef's for START_TRACE in test/test.priv.h * improve pthread-configuration for test/worm.c * add setlocale call to several test-programs. * workaround in test/picsmap.c for use of floating point for rgb values by ImageMagick 6.9.11, which appears to use the wrong upper limit. * use static libraries for AdaCurses test-package for Mageia, since no gprbuild package is available. * install Ada95 sample programs in libexecdir, adding a wrapper script to invoke those. * install ncurses-examples programs in libexecdir, adding a wrapper script to invoke those. There are other new demo/test programs and reusable examples: test/combine demonstrate combining characters test/test_delwin demonstrate deleting a window test/test_mouse observe mouse events in the raw terminal or parsed ncurses modes test/test_unget_wch demonstrate the unget_wch and unget functions Terminal database There are several new terminal descriptions: * mosh * mosh-256color * teken-16color * teken-sc * teken-vt * xgterm There are many changes to existing terminal descriptions. Some were updates to several descriptions: * make description-fields distinct * fix errata in description fields * add/use several building-blocks: + aixterm+sl + ansi+cpr + apollo+vt132 + decid+cpr + ncr260vp+sl + wyse+sl + x10term+sl + xterm+acs + xterm+alt47 while others affected specific descriptions. These were retested, to take into account changes by their developers: * kitty * teken while these are specific fixes based on reviewing documentation, user reports, or warnings from tic: att610+cvis0 amended note as per documentation for att610, att620, att730 kon, kon2, jfbterm revise to undo "linux2.6" change to smacs/rmacs/enacs st-0.6 add dim, ecma+strikeout foot+base add xterm+sl-alt dec+sl correct dsl in dec+sl mintty and tmux correct setal in mintty/tmux entries, add to vte-2018 nsterm modify nsterm to use xterm+alt1049 putty modify putty to use xterm+alt1049 vte-2018 add blink and setal A few entries use extensions (user-defined terminal capabilities): * use ansi+enq and decid+cpr in cases where the terminal probably supported the u6-u9 extension * remove u6-u9 from teken-2018 * use NQ to flag entries where the terminal does not support query and response * add/use bracketed+paste to help identify terminals supporting this xterm feature * modify samples for xterm mouse 1002/1003 modes to use 1006 mode, and also provide for focus in/out responses * xterm patch #371 supports DEC-compatible status-line. add dec+sl to xterm-new, per xterm #371, add xterm-p371, add xterm-p370, for use in older terminals, and set "xterm-new" to "xterm-p370" (to ease adoption). Documentation As usual, this release * improves documentation by describing new features, * attempts to improve the description of features which users have found confusing * fills in overlooked descriptions of features which were described in the NEWS file but treated sketchily in manual pages. In addition to providing background information to explain these features and show how they evolved, there are corrections, clarifications, etc.: * Corrections: + remove a stray '/' from description of %g in terminfo(5). + correct/improve font-formatting in curs_getch.3x, as well as other manual pages. * New/improved history and portability sections: + add portability notes for delscreen and delwin in manual. + improve curs_slk.3x discussion of extensions and portability * Other improvements: + improve curs_bkgd.3x, explaining that bkgdset can affect results for bkgd + add note on portable memory-leak checking in curs_memleaks.3x + expanded description in resizeterm.3x + add section on releasing memory to curs_termcap.3x and curs_terminfo.3x manpages. + add clarification of the scope of dynamic variables in terminfo(5). + improve formatting of ncurses-intro.html and hackguide.html + improve curs_clear.3x links to other pages + update ncurses-howto, making documentation fixes along with corrections to example programs. + use newer version 1.36 of gnathtml for generating Ada html files. + update external links in Ada95.html There are no new manual pages (all of the manual page updates are to existing pages). Interesting bug-fixes While there were many bugs fixed during development of ncurses 6.4, only a few (the reason for this release) were both important and interesting. Most of the bug-fixes were for local issues which did not affect compatibility across releases. Since those are detailed in the NEWS file no elaboration is needed here. The interesting bugs were those dealing with memory leaks and buffer overflows. Although the utilities are designed for text files (which they do properly), some choose to test them with non-text files. * Text files contain no embedded nulls. Also, they end with a newline. Feeding tic non-text files exposed a few cases where the program did not check for those issues. As a result, further processing of the input found limit-checks whose assumptions were invalid. * Fixing the limit-checks (first) found a problem with tic managing the list of strings in a terminal description. In merging two terminal descriptions (i.e., the "use=" feature), tic was not allocating a complete copy. A quick repair for that introduced a memory leak. * The checks for non-text files are improved (i.e., embedded nulls in the input file will cause tic to reject it rather than attempting to process it). * The string allocations in tic are likewise improved. Configuration changes Major changes There are no major changes. No new options were added. Several improvements were made to configure checks. Configuration options There are a few new/modified configure options: --with-abi-version add ABI 7 defaults to configure script. --with-caps add warning in configure script if file specified for "--with-caps" does not exist. --with-manpage-format bzip2 and xz compression are now supported --with-xterm-kbs add check/warning in configure script if option "--with-xterm-kbs" is missing or inconsistent Portability Many of the portability changes are implemented via the configure script: * amend configure option's auto-search to account for systems where none of the directories known to pkg-config exist * corrected regex needed for older pkg-config used in Solaris 10 * improve handling of --with-pkg-config-libdir option, allowing for the case where either $PKG_CONFIG_LIBDIR or the option value has a colon-separated list of directories * if the --with-pkg-config-libdir option is not given, use ${libdir}/pkgconfig as a default * improve search-path check for pkg-config, e.g., for Debian testing which installs pkg-config with architecture-prefixes. * build-fix for cross-compiling to MingW, conditionally add -lssp * improve configure check for getttynam * fixes to build with dietlibc: + add configure check for fpathconf + add configure check for math sine/cosine, needed in test/tclock, and eliminate pow() from test/hanoi + use wcsnlen as an alternative to wmemchr if it is not found * modify configure macro CF_BUILD_CC to check if the build-compiler works, rather than that it is different from the cross-compiler, e.g., to accommodate a compiler which can be used for either purpose with different flags * modify configure/scripts to work around interference by GNU grep 3.8 Here are some of the other portability fixes: * change man_db.renames to template, to handle ncurses*-config script with the --extra-suffix configure option. * update CF_XOPEN_SOURCE macro, adding variants "gnueabi" and "gnueabihf" to get _DEFAULT_SOURCE special case, as well as adding GNU libc suffixes for "abi64", "abin32", "x32" to distinguish it from other libc flavors. * work around musl's nonstandard use of feature test macros by adding a definition for NCURSES_WIDECHAR to the generated ".pc" and *-config files. * use "command -v" rather than "type" in Ada95/gen/Makefile.in to fix a portability issue. _________________________________________________________________ Features of ncurses The ncurses package is fully upward-compatible with SVr4 (System V Release 4) curses: * All of the SVr4 calls have been implemented (and are documented). * ncurses supports all of the for SVr4 curses features including keyboard mapping, color, forms-drawing with ACS characters, and automatic recognition of keypad and function keys. * ncurses provides these SVr4 add-on libraries (not part of X/Open Curses): + the panels library, supporting a stack of windows with backing store. + the menus library, supporting a uniform but flexible interface for menu programming. + the form library, supporting data collection through on-screen forms. * ncurses's terminal database is fully compatible with that used by SVr4 curses. + ncurses supports user-defined capabilities which it can see, but which are hidden from SVr4 curses applications using the same terminal database. + It can be optionally configured to match the format used in related systems such as AIX and Tru64. + Alternatively, ncurses can be configured to use hashed databases rather than the directory of files used by SVr4 curses. * The ncurses utilities have options to allow you to filter terminfo entries for use with less capable curses/terminfo versions such as the HP-UX and AIX ports. The ncurses package also has many useful extensions over SVr4: * The API is 8-bit clean and base-level conformant with the X/OPEN curses specification, XSI curses (that is, it implements all BASE level features, and most EXTENDED features). It includes many function calls not supported under SVr4 curses (but portability of all calls is documented so you can use the SVr4 subset only). * Unlike SVr3 curses, ncurses can write to the rightmost-bottommost corner of the screen if your terminal has an insert-character capability. * Ada95 and C++ bindings. * Support for mouse event reporting with X Window xterm and FreeBSD and OS/2 console windows. * Extended mouse support via Alessandro Rubini's gpm package. * The function wresize allows you to resize windows, preserving their data. * The function use_default_colors allows you to use the terminal's default colors for the default color pair, achieving the effect of transparent colors. * The functions keyok and define_key allow you to better control the use of function keys, e.g., disabling the ncurses KEY_MOUSE, or by defining more than one control sequence to map to a given key code. * Support for direct-color terminals, such as modern xterm. * Support for 256-color terminals, such as modern xterm. * Support for 16-color terminals, such as aixterm and modern xterm. * Better cursor-movement optimization. The package now features a cursor-local-movement computation more efficient than either BSD's or System V's. * Super hardware scrolling support. The screen-update code incorporates a novel, simple, and cheap algorithm that enables it to make optimal use of hardware scrolling, line-insertion, and line-deletion for screen-line movements. This algorithm is more powerful than the 4.4BSD curses quickch routine. * Real support for terminals with the magic-cookie glitch. The screen-update code will refrain from drawing a highlight if the magic- cookie unattributed spaces required just before the beginning and after the end would step on a non-space character. It will automatically shift highlight boundaries when doing so would make it possible to draw the highlight without changing the visual appearance of the screen. * It is possible to generate the library with a list of pre-loaded fallback entries linked to it so that it can serve those terminal types even when no terminfo tree or termcap file is accessible (this may be useful for support of screen-oriented programs that must run in single-user mode). * The tic/captoinfo utility provided with ncurses has the ability to translate many termcaps from the XENIX, IBM and AT&T extension sets. * A BSD-like tset utility is provided. * The ncurses library and utilities will automatically read terminfo entries from $HOME/.terminfo if it exists, and compile to that directory if it exists and the user has no write access to the system directory. This feature makes it easier for users to have personal terminfo entries without giving up access to the system terminfo directory. * You may specify a path of directories to search for compiled descriptions with the environment variable TERMINFO_DIRS (this generalizes the feature provided by TERMINFO under stock System V.) * In terminfo source files, use capabilities may refer not just to other entries in the same source file (as in System V) but also to compiled entries in either the system terminfo directory or the user's $HOME/.terminfo directory. * The table-of-entries utility toe makes it easy for users to see exactly what terminal types are available on the system. * The library meets the XSI requirement that every macro entry point has a corresponding function which may be linked (and will be prototype-checked) if the macro definition is disabled with #undef. * Extensive documentation is provided (see the Additional Reading section of the ncurses FAQ for online documentation). Applications using ncurses The ncurses distribution includes a selection of test programs (including a few games). These are available separately as ncurses-examples The ncurses library has been tested with a wide variety of applications including: aptitude FrontEnd to Apt, the debian package manager https://wiki.debian.org/Aptitude cdk Curses Development Kit https://invisible-island.net/cdk/ ded directory-editor https://invisible-island.net/ded/ dialog the underlying application used in Slackware's setup, and the basis for similar install/configure applications on many systems. https://invisible-island.net/dialog/ lynx the text WWW browser https://lynx.invisible-island.net/ mutt mail utility http://www.mutt.org/ ncftp file-transfer utility https://www.ncftp.com/ nvi New vi uses ncurses. https://sites.google.com/a/bostic.com/keithbostic/vi ranger A console file manager with VI key bindings in Python. https://ranger.github.io/ tin newsreader, supporting color, MIME http://www.tin.org/ vifm File manager with vi like keybindings https://vifm.info/ as well as some that use ncurses for the terminfo support alone: minicom terminal emulator for serial modem connections https://alioth.debian.org/projects/minicom/ mosh a replacement for ssh. https://mosh.org/ tack terminfo action checker https://invisible-island.net/ncurses/tack.html tmux terminal multiplexor https://github.com/tmux/tmux/wiki vile vi-like-emacs may be built to use the terminfo, termcap or curses interfaces. https://invisible-island.net/vile/ and finally, those which use only the termcap interface: emacs text editor https://www.gnu.org/software/emacs/ less The most commonly used pager (a program that displays text files). http://www.greenwoodsoftware.com/less/ screen terminal multiplexor https://www.gnu.org/software/screen/ vim text editor https://www.vim.org/ Development activities Zeyd Ben-Halim started ncurses from a previous package pcurses, written by Pavel Curtis. Eric S. Raymond continued development. Juergen Pfeifer wrote most of the form and menu libraries. Ongoing development work is done by Thomas E. Dickey. Thomas E. Dickey has acted as the maintainer for the Free Software Foundation, which held a copyright on ncurses for releases 4.2 through 6.1. Following the release of ncurses 6.1, effective as of release 6.2, copyright for ncurses reverted to Thomas E. Dickey (see the ncurses FAQ for additional information). Contact the current maintainers at bug-ncurses@gnu.org To join the ncurses mailing list, please write email to bug-ncurses-request@gnu.org containing the line: subscribe @ This list is open to anyone interested in helping with the development and testing of this package. Beta versions of ncurses are made available at https://invisible-island.net/archives/ncurses/current/ and https://invisible-mirror.net/archives/ncurses/current/ . Patches to the current release are made available at https://invisible-island.net/archives/ncurses/6.3/ and https://invisible-mirror.net/archives/ncurses/6.3/ . There is an archive of the mailing list here: http://lists.gnu.org/archive/html/bug-ncurses (also https) Related resources The release notes make scattered references to these pages, which may be interesting by themselves: * ncurses licensing * Symbol versioning in ncurses * Comments on ncurses versus slang (S-Lang) * Comments on OpenBSD * tack - terminfo action checker * tctest - termcap library checker * Terminal Database Other resources The distribution provides a newer version of the terminfo-format terminal description file once maintained by Eric Raymond . Unlike the older version, the termcap and terminfo data are provided in the same file, which also provides several user-definable extensions beyond the X/Open specification. You can find lots of information on terminal-related topics not covered in the terminfo file at Richard Shuford's archive . The collection of computer manuals at bitsavers.org has also been useful. * Overview * Release Notes + Library improvements o New features o Other improvements + Program improvements o Utilities o Examples + Terminal database + Documentation + Interesting bug-fixes + Configuration changes o Major changes o Configuration options + Portability * Features of ncurses * Applications using ncurses * Development activities * Related resources * Other resources ncurses-6.4-20240113/AUTHORS0000644000000000000000000000510714062736236013521 0ustar rootroot------------------------------------------------------------------------------- -- Copyright 2020,2021 Thomas E. Dickey -- -- Copyright 2006,2017 Free Software Foundation, Inc. -- -- -- -- Permission is hereby granted, free of charge, to any person obtaining a -- -- copy of this software and associated documentation files (the -- -- "Software"), to deal in the Software without restriction, including -- -- without limitation the rights to use, copy, modify, merge, publish, -- -- distribute, distribute with modifications, sublicense, and/or sell copies -- -- of the Software, and to permit persons to whom the Software is furnished -- -- to do so, subject to the following conditions: -- -- -- -- The above copyright notice and this permission notice shall be included -- -- in all copies or substantial portions of the Software. -- -- -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- -- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- -- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- -- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- -- USE OR OTHER DEALINGS IN THE SOFTWARE. -- -- -- -- Except as contained in this notice, the name(s) of the above copyright -- -- holders shall not be used in advertising or otherwise to promote the -- -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------- -- $Id: AUTHORS,v 1.5 2021/06/17 21:20:30 tom Exp $ ------------------------------------------------------------------------------- These are the principal authors/contributors of ncurses since 1.9.9e, in decreasing order of their contribution: TD Thomas E. Dickey JPF Juergen Pfeifer ESR Eric S Raymond AVL Alexander V Lukyanov PB Philippe Blain SV Sven Verdoolaege NB Nicolas Boulenguez ncurses-6.4-20240113/Makefile.os20000644000000000000000000002117314062736236014614 0ustar rootroot############################################################################## # 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 ncurses-6.4-20240113/menu/0000755000000000000000000000000014501355076013407 5ustar rootrootncurses-6.4-20240113/menu/m_pad.c0000644000000000000000000001050014062736236014632 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/READ.ME0000644000000000000000000000530714062736236014355 0ustar rootroot------------------------------------------------------------------------------- -- 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 ncurses-6.4-20240113/menu/m_req_name.c0000644000000000000000000001217114062735154015661 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_new.c0000644000000000000000000001334314062736752014672 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_win.c0000644000000000000000000001063114062736236014670 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_cursor.c0000644000000000000000000001126714027741725015416 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/llib-lmenut0000644000000000000000000002542614062736236015572 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/menu/m_sub.c0000644000000000000000000001064314062736236014667 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_item_new.c0000644000000000000000000002162114062736752015706 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_item_opt.c0000644000000000000000000001417114062736236015716 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_userptr.c0000644000000000000000000001005413765010366015574 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_format.c0000644000000000000000000001263514027741725015371 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_opts.c0000644000000000000000000001624213765010360015054 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/eti.h0000644000000000000000000000563113615656212014347 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/menu/headers0000644000000000000000000000441413615656212014751 0ustar rootroot############################################################################## # 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 ncurses-6.4-20240113/menu/m_item_use.c0000644000000000000000000001005313765010360015673 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_item_cur.c0000644000000000000000000001164114062736236015704 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_item_val.c0000644000000000000000000001113414062735154015670 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/menu.h0000644000000000000000000002714313765010352014527 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/mf_common.h0000644000000000000000000000766413615656212015550 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_driver.c0000644000000000000000000004043314027741725015371 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2012,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1995,1997 * ****************************************************************************/ /*************************************************************************** * Module m_driver * * Central dispatching routine * ***************************************************************************/ #include "menu.priv.h" MODULE_ID("$Id: m_driver.c,v 1.37 2021/03/27 23:46:29 tom Exp $") /* Macros */ /* Remove the last character from the match pattern buffer */ #define Remove_Character_From_Pattern(menu) \ (menu)->pattern[--((menu)->pindex)] = '\0' /* Add a new character to the match pattern buffer */ #define Add_Character_To_Pattern(menu,ch) \ { (menu)->pattern[((menu)->pindex)++] = (char) (ch);\ (menu)->pattern[(menu)->pindex] = '\0'; } /*--------------------------------------------------------------------------- | Facility : libnmenu | Function : static bool Is_Sub_String( | bool IgnoreCaseFlag, | const char *part, | const char *string) | | Description : Checks whether or not part is a substring of string. | | Return Values : TRUE - if it is a substring | FALSE - if it is not a substring +--------------------------------------------------------------------------*/ static bool Is_Sub_String( bool IgnoreCaseFlag, const char *part, const char *string ) { assert(part && string); if (IgnoreCaseFlag) { while (*string && *part) { if (toupper(UChar(*string++)) != toupper(UChar(*part))) break; part++; } } else { while (*string && *part) if (*part != *string++) break; part++; } return ((*part) ? FALSE : TRUE); } /*--------------------------------------------------------------------------- | Facility : libnmenu | Function : int _nc_Match_Next_Character_In_Item_Name( | MENU *menu, | int ch, | ITEM **item) | | Description : This internal routine is called for a menu positioned | at an item with three different classes of characters: | - a printable character; the character is added to | the current pattern and the next item matching | this pattern is searched. | - NUL; the pattern stays as it is and the next item | matching the pattern is searched | - BS; the pattern stays as it is and the previous | item matching the pattern is searched | | The item parameter contains on call a pointer to | the item where the search starts. On return - if | a match was found - it contains a pointer to the | matching item. | | Return Values : E_OK - an item matching the pattern was found | E_NO_MATCH - nothing found +--------------------------------------------------------------------------*/ MENU_EXPORT(int) _nc_Match_Next_Character_In_Item_Name (MENU *menu, int ch, ITEM **item) { bool found = FALSE, passed = FALSE; int idx, last; T((T_CALLED("_nc_Match_Next_Character(%p,%d,%p)"), (void *)menu, ch, (void *)item)); assert(menu && item && *item); idx = (*item)->index; if (ch && ch != BS) { /* if we become to long, we need no further checking : there can't be a match ! */ if ((menu->pindex + 1) > menu->namelen) RETURN(E_NO_MATCH); Add_Character_To_Pattern(menu, ch); /* we artificially position one item back, because in the do...while loop we start with the next item. This means, that with a new pattern search we always start the scan with the actual item. If we do a NEXT_PATTERN or PREV_PATTERN search, we start with the one after or before the actual item. */ if (--idx < 0) idx = menu->nitems - 1; } last = idx; /* this closes the cycle */ do { if (ch == BS) { /* we have to go backward */ if (--idx < 0) idx = menu->nitems - 1; } else { /* otherwise we always go forward */ if (++idx >= menu->nitems) idx = 0; } if (Is_Sub_String((bool)((menu->opt & O_IGNORECASE) != 0), menu->pattern, menu->items[idx]->name.str) ) found = TRUE; else passed = TRUE; } while (!found && (idx != last)); if (found) { if (!((idx == (*item)->index) && passed)) { *item = menu->items[idx]; RETURN(E_OK); } /* This point is reached, if we fully cycled through the item list and the only match we found is the starting item. With a NEXT_PATTERN or PREV_PATTERN scan this means, that there was no additional match. If we searched with an expanded new pattern, we should never reach this point, because if the expanded pattern matches also the actual item we will find it in the first attempt (passed==FALSE) and we will never cycle through the whole item array. */ assert(ch == 0 || ch == BS); } else { if (ch && ch != BS && menu->pindex > 0) { /* if we had no match with a new pattern, we have to restore it */ Remove_Character_From_Pattern(menu); } } RETURN(E_NO_MATCH); } /*--------------------------------------------------------------------------- | Facility : libnmenu | Function : int menu_driver(MENU* menu, int c) | | Description : Central dispatcher for the menu. Translates the logical | request 'c' into a menu action. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid menu pointer | E_BAD_STATE - menu is in user hook routine | E_NOT_POSTED - menu is not posted +--------------------------------------------------------------------------*/ MENU_EXPORT(int) menu_driver(MENU *menu, int c) { #define NAVIGATE(dir) \ if (!item->dir)\ result = E_REQUEST_DENIED;\ else\ item = item->dir int result = E_OK; ITEM *item; int my_top_row; T((T_CALLED("menu_driver(%p,%d)"), (void *)menu, c)); if (!menu) RETURN(E_BAD_ARGUMENT); if (menu->status & _IN_DRIVER) RETURN(E_BAD_STATE); if (!(menu->status & _POSTED)) RETURN(E_NOT_POSTED); item = menu->curitem; my_top_row = menu->toprow; assert(item); if ((c > KEY_MAX) && (c <= MAX_MENU_COMMAND)) { int rdiff; if (!((c == REQ_BACK_PATTERN) || (c == REQ_NEXT_MATCH) || (c == REQ_PREV_MATCH))) { assert(menu->pattern); Reset_Pattern(menu); } switch (c) { case REQ_LEFT_ITEM: /*=================*/ NAVIGATE(left); break; case REQ_RIGHT_ITEM: /*==================*/ NAVIGATE(right); break; case REQ_UP_ITEM: /*===============*/ NAVIGATE(up); break; case REQ_DOWN_ITEM: /*=================*/ NAVIGATE(down); break; case REQ_SCR_ULINE: /*=================*/ if (my_top_row == 0 || !(item->up)) result = E_REQUEST_DENIED; else { --my_top_row; item = item->up; } break; case REQ_SCR_DLINE: /*=================*/ if ((my_top_row + menu->arows >= menu->rows) || !(item->down)) { /* only if the menu has less items than rows, we can deny the request. Otherwise the epilogue of this routine adjusts the top row if necessary */ result = E_REQUEST_DENIED; } else { my_top_row++; item = item->down; } break; case REQ_SCR_DPAGE: /*=================*/ rdiff = menu->rows - (menu->arows + my_top_row); if (rdiff > menu->arows) rdiff = menu->arows; if (rdiff <= 0) result = E_REQUEST_DENIED; else { my_top_row += rdiff; while (rdiff-- > 0 && item != 0 && item->down != 0) item = item->down; } break; case REQ_SCR_UPAGE: /*=================*/ rdiff = (menu->arows < my_top_row) ? menu->arows : my_top_row; if (rdiff <= 0) result = E_REQUEST_DENIED; else { my_top_row -= rdiff; while (rdiff-- > 0 && item != 0 && item->up != 0) item = item->up; } break; case REQ_FIRST_ITEM: /*==================*/ item = menu->items[0]; break; case REQ_LAST_ITEM: /*=================*/ item = menu->items[menu->nitems - 1]; break; case REQ_NEXT_ITEM: /*=================*/ if ((item->index + 1) >= menu->nitems) { if (menu->opt & O_NONCYCLIC) result = E_REQUEST_DENIED; else item = menu->items[0]; } else item = menu->items[item->index + 1]; break; case REQ_PREV_ITEM: /*=================*/ if (item->index <= 0) { if (menu->opt & O_NONCYCLIC) result = E_REQUEST_DENIED; else item = menu->items[menu->nitems - 1]; } else item = menu->items[item->index - 1]; break; case REQ_TOGGLE_ITEM: /*===================*/ if (menu->opt & O_ONEVALUE) { result = E_REQUEST_DENIED; } else { if (menu->curitem->opt & O_SELECTABLE) { menu->curitem->value = !menu->curitem->value; Move_And_Post_Item(menu, menu->curitem); _nc_Show_Menu(menu); } else result = E_NOT_SELECTABLE; } break; case REQ_CLEAR_PATTERN: /*=====================*/ /* already cleared in prologue */ break; case REQ_BACK_PATTERN: /*====================*/ if (menu->pindex > 0) { assert(menu->pattern); Remove_Character_From_Pattern(menu); pos_menu_cursor(menu); } else result = E_REQUEST_DENIED; break; case REQ_NEXT_MATCH: /*==================*/ assert(menu->pattern); if (menu->pattern[0]) result = _nc_Match_Next_Character_In_Item_Name(menu, 0, &item); else { if ((item->index + 1) < menu->nitems) item = menu->items[item->index + 1]; else { if (menu->opt & O_NONCYCLIC) result = E_REQUEST_DENIED; else item = menu->items[0]; } } break; case REQ_PREV_MATCH: /*==================*/ assert(menu->pattern); if (menu->pattern[0]) result = _nc_Match_Next_Character_In_Item_Name(menu, BS, &item); else { if (item->index) item = menu->items[item->index - 1]; else { if (menu->opt & O_NONCYCLIC) result = E_REQUEST_DENIED; else item = menu->items[menu->nitems - 1]; } } break; default: /*======*/ result = E_UNKNOWN_COMMAND; break; } } else { /* not a command */ if (!(c & ~((int)MAX_REGULAR_CHARACTER)) && isprint(UChar(c))) result = _nc_Match_Next_Character_In_Item_Name(menu, c, &item); #ifdef NCURSES_MOUSE_VERSION else if (KEY_MOUSE == c) { MEVENT event; WINDOW *uwin = Get_Menu_UserWin(menu); getmouse(&event); if ((event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED | BUTTON1_TRIPLE_CLICKED)) && wenclose(uwin, event.y, event.x)) { /* we react only if the click was in the userwin, that means * inside the menu display area or at the decoration window. */ WINDOW *sub = Get_Menu_Window(menu); int ry = event.y, rx = event.x; /* screen coordinates */ result = E_REQUEST_DENIED; if (mouse_trafo(&ry, &rx, FALSE)) { /* rx, ry are now "curses" coordinates */ if (ry < sub->_begy) { /* we clicked above the display region; this is * interpreted as "scroll up" request */ if (event.bstate & BUTTON1_CLICKED) result = menu_driver(menu, REQ_SCR_ULINE); else if (event.bstate & BUTTON1_DOUBLE_CLICKED) result = menu_driver(menu, REQ_SCR_UPAGE); else if (event.bstate & BUTTON1_TRIPLE_CLICKED) result = menu_driver(menu, REQ_FIRST_ITEM); RETURN(result); } else if (ry > sub->_begy + sub->_maxy) { /* we clicked below the display region; this is * interpreted as "scroll down" request */ if (event.bstate & BUTTON1_CLICKED) result = menu_driver(menu, REQ_SCR_DLINE); else if (event.bstate & BUTTON1_DOUBLE_CLICKED) result = menu_driver(menu, REQ_SCR_DPAGE); else if (event.bstate & BUTTON1_TRIPLE_CLICKED) result = menu_driver(menu, REQ_LAST_ITEM); RETURN(result); } else if (wenclose(sub, event.y, event.x)) { /* Inside the area we try to find the hit item */ int x, y; ry = event.y; rx = event.x; if (wmouse_trafo(sub, &ry, &rx, FALSE)) { int i; for (i = 0; i < menu->nitems; i++) { int err = _nc_menu_cursor_pos(menu, menu->items[i], &y, &x); if (E_OK == err) { if ((ry == y) && (rx >= x) && (rx < x + menu->itemlen)) { item = menu->items[i]; result = E_OK; break; } } } if (E_OK == result) { /* We found an item, now we can handle the click. * A single click just positions the menu cursor * to the clicked item. A double click toggles * the item. */ if (event.bstate & BUTTON1_DOUBLE_CLICKED) { _nc_New_TopRow_and_CurrentItem(menu, my_top_row, item); menu_driver(menu, REQ_TOGGLE_ITEM); result = E_UNKNOWN_COMMAND; } } } } } } else { if (menu->opt & O_MOUSE_MENU) ungetmouse(&event); /* let someone else handle this */ result = E_REQUEST_DENIED; } } #endif /* NCURSES_MOUSE_VERSION */ else result = E_UNKNOWN_COMMAND; } if (item == 0) { result = E_BAD_STATE; } else if (E_OK == result) { /* Adjust the top row if it turns out that the current item unfortunately doesn't appear in the menu window */ if (item->y < my_top_row) my_top_row = item->y; else if (item->y >= (my_top_row + menu->arows)) my_top_row = item->y - menu->arows + 1; _nc_New_TopRow_and_CurrentItem(menu, my_top_row, item); } RETURN(result); } /* m_driver.c ends here */ ncurses-6.4-20240113/menu/modules0000644000000000000000000000652213615656212015010 0ustar rootroot# $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 ncurses-6.4-20240113/menu/llib-lmenutw0000644000000000000000000002542614062736236015761 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/menu/Makefile.in0000644000000000000000000001452514070103035015446 0ustar rootroot# $Id: Makefile.in,v 1.71 2021/07/03 15:45:33 tom Exp $ ############################################################################## # Copyright 2020,2021 Thomas E. Dickey # # Copyright 1998-2015,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1996-on # # Makefile for menu source code. # # This makes the following: # libraries (normal/debug/profile/shared) # # The variable 'srcdir' refers to the source-distribution, and can be set with # the configure script by "--srcdir=DIR". # # The rules are organized to produce the libraries for the configured models, # turn off _all_ suffix rules; we'll generate our own .SUFFIXES: SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile x = @EXEEXT@ o = .@OBJEXT@ MODEL = @DFT_LWR_MODEL@ DESTDIR = @DESTDIR@ top_srcdir = @top_srcdir@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ includesubdir = @includesubdir@ INCLUDEDIR = $(DESTDIR)$(includedir)$(includesubdir) PACKAGE = @PACKAGE@ LIBTOOL = @LIBTOOL@ LIBTOOL_OPTS = @LIBTOOL_OPTS@ @EXPORT_SYMS@ LIBTOOL_CLEAN = @LIB_CLEAN@ LIBTOOL_COMPILE = @LIB_COMPILE@ LIBTOOL_LINK = @LIB_LINK@ LIBTOOL_INSTALL = @LIB_INSTALL@ LIBTOOL_UNINSTALL = @LIB_UNINSTALL@ LT_UNDEF = @LT_UNDEF@ INSTALL = @INSTALL@ INSTALL_LIB = @INSTALL@ @INSTALL_LIB@ INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ INSTALL_DATA = @INSTALL_DATA@ AR = @AR@ ARFLAGS = @ARFLAGS@ AWK = @AWK@ LD = @LD@ LN_S = @LN_S@ CTAGS = @CTAGS@ ETAGS = @ETAGS@ CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ INCDIR = $(top_srcdir)/include BASE_DIR = $(top_srcdir)/ncurses CPPFLAGS = -I$(BASE_DIR) -DHAVE_CONFIG_H -DBUILDING_MENU @CPPFLAGS@ CCFLAGS = $(CPPFLAGS) $(CFLAGS) CFLAGS_LIBTOOL = $(CCFLAGS) CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) LINK = $(LIBTOOL_LINK) LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@ SHLIB_DIRS = -L../lib SHLIB_LIST = $(SHLIB_DIRS) -lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@ RPATH_LIST = @RPATH_LIST@ RESULTING_SYMS = @RESULTING_SYMS@ VERSIONED_SYMS = @VERSIONED_SYMS@ MK_SHARED_LIB = @MK_SHARED_LIB@ NCURSES_MAJOR = @NCURSES_MAJOR@ NCURSES_MINOR = @NCURSES_MINOR@ REL_VERSION = @cf_cv_rel_version@ ABI_VERSION = @cf_cv_abi_version@ RANLIB = @LIB_PREP@ LIBRARIES = @Libs_To_Make@ LINT = @LINT@ LINT_OPTS = @LINT_OPTS@ LINT_LIBS = -lmenu -lncurses @LIBS@ AUTO_SRC = \ ../include/menu.h \ ../include/eti.h \ ../include/mf_common.h ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.libs @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.libs all \ libs \ install :: $(AUTO_SRC) $(LIBRARIES) sources : $(AUTO_SRC) $(DESTDIR)$(bindir) \ $(DESTDIR)$(libdir) : mkdir -p $@ # make copies to simplify include-paths while still keeping menu's include # file in this directory. ../include/menu.h : $(srcdir)/menu.h -rm -f $@ cp $(srcdir)/menu.h $@ ../include/eti.h : $(srcdir)/eti.h -rm -f $@ cp $(srcdir)/eti.h $@ ../include/mf_common.h : $(srcdir)/mf_common.h -rm -f $@ cp $(srcdir)/mf_common.h $@ HEADER_DEPS = \ ../include/curses.h \ ../include/ncurses_cfg.h \ ../include/ncurses_def.h \ ../include/ncurses_dll.h \ ../include/term.h \ ../include/unctrl.h \ $(BASE_DIR)/curses.priv.h \ $(BASE_DIR)/new_pair.h \ $(INCDIR)/nc_alloc.h \ $(INCDIR)/nc_panel.h \ $(INCDIR)/nc_string.h \ $(INCDIR)/nc_termios.h \ $(INCDIR)/nc_tparm.h \ $(INCDIR)/term_entry.h \ $(srcdir)/menu.priv.h \ $(AUTO_SRC) tags: $(CTAGS) *.[ch] @MAKE_UPPER_TAGS@TAGS: @MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] mostlyclean :: -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace clean :: mostlyclean -rm -f $(AUTO_SRC) -rm -rf .libs *.dSYM distclean :: clean -rm -f Makefile realclean :: distclean ############################################################################### # The remainder of this file is automatically generated during configuration ############################################################################### ncurses-6.4-20240113/menu/llib-lmenuw0000644000000000000000000002542614062736236015575 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/menu/m_trace.c0000644000000000000000000000621213765010366015167 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/menu/m_item_vis.c0000644000000000000000000000706614062736236015722 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2004,2010 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1995,1997 * ****************************************************************************/ /*************************************************************************** * Module m_item_vis * * Tell if menu item is visible * ***************************************************************************/ #include "menu.priv.h" MODULE_ID("$Id: m_item_vis.c,v 1.20 2021/06/17 21:20:30 tom Exp $") /*--------------------------------------------------------------------------- | Facility : libnmenu | Function : bool item_visible(const ITEM *item) | | Description : A item is visible if it currently appears in the | subwindow of a posted menu. | | Return Values : TRUE if visible | FALSE if invisible +--------------------------------------------------------------------------*/ MENU_EXPORT(bool) item_visible(const ITEM *item) { MENU *menu; T((T_CALLED("item_visible(%p)"), (const void *)item)); if (item && (menu = item->imenu) && (menu->status & _POSTED) && ((menu->toprow + menu->arows) > (item->y)) && (item->y >= menu->toprow)) returnBool(TRUE); else returnBool(FALSE); } /* m_item_vis.c ends here */ ncurses-6.4-20240113/menu/m_items.c0000644000000000000000000001173414062736236015221 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_global.c0000644000000000000000000004342714501355076015341 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/menu.priv.h0000644000000000000000000001570413662350204015505 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1995,1997 * ****************************************************************************/ /* $Id: menu.priv.h,v 1.29 2020/05/24 01:40:20 anonymous.maarten Exp $ */ /*************************************************************************** * Module menu.priv.h * * Top level private header file for all libnmenu modules * ***************************************************************************/ #ifndef MENU_PRIV_H_incl #define MENU_PRIV_H_incl 1 /* *INDENT-OFF* */ #include "curses.priv.h" #define NCURSES_OPAQUE_MENU 0 #include "mf_common.h" #include "menu.h" /* Backspace code */ #define BS (8) extern MENU_EXPORT_VAR(ITEM) _nc_Default_Item; extern MENU_EXPORT_VAR(MENU) _nc_Default_Menu; /* Normalize item to default if none was given */ #define Normalize_Item( item ) ((item)=(item)?(item):&_nc_Default_Item) /* Normalize menu to default if none was given */ #define Normalize_Menu( menu ) ((menu)=(menu)?(menu):&_nc_Default_Menu) #define Get_Menu_Screen( menu ) (menu->userwin ? \ _nc_screen_of(menu->userwin) : CURRENT_SCREEN) /* Get the user defined (framing) window of the menu */ #define Get_Menu_UserWin(menu) ((menu)->userwin ? \ (menu)->userwin : CURRENT_SCREEN->_stdscr) /* Normalize menu window */ #define Get_Menu_Window( menu ) \ ((menu)->usersub ? (menu)->usersub : Get_Menu_UserWin(menu)) /* menu specific status flags */ #define _LINK_NEEDED (0x04) #define _MARK_ALLOCATED (0x08) #define ALL_MENU_OPTS ( \ O_ONEVALUE | \ O_SHOWDESC | \ O_ROWMAJOR | \ O_IGNORECASE | \ O_SHOWMATCH | \ O_NONCYCLIC | \ O_MOUSE_MENU ) #define ALL_ITEM_OPTS (O_SELECTABLE) /* Move to the window position of an item and draw it */ #define Move_And_Post_Item(menu,item) \ {wmove((menu)->win,(menu)->spc_rows*(item)->y,((menu)->itemlen+(menu)->spc_cols)*(item)->x);\ _nc_Post_Item((menu),(item));} #define Move_To_Current_Item(menu,item) \ if ( (item) != (menu)->curitem)\ {\ Move_And_Post_Item(menu,item);\ Move_And_Post_Item(menu,(menu)->curitem);\ } /* This macro ensures, that the item becomes visible, if possible with the specified row as the top row of the window. If this is not possible, the top row will be adjusted and the value is stored in the row argument. */ #define Adjust_Current_Item(menu,row,item) \ { if ((item)->y < row) \ row = (short) (item)->y; \ if ( (item)->y >= (row + (menu)->arows) ) \ row = (short) (( (item)->y < ((menu)->rows - row) ) \ ? (item)->y \ : (menu)->rows - (menu)->arows); \ _nc_New_TopRow_and_CurrentItem(menu,row,item); } /* Reset the match pattern buffer */ #define Reset_Pattern(menu) \ { (menu)->pindex = 0; \ (menu)->pattern[0] = '\0'; } #define UChar(c) ((unsigned char)(c)) /* Internal functions. */ extern MENU_EXPORT(void) _nc_Draw_Menu (const MENU *); extern MENU_EXPORT(void) _nc_Show_Menu (const MENU *); extern MENU_EXPORT(void) _nc_Calculate_Item_Length_and_Width (MENU *); extern MENU_EXPORT(int) _nc_Calculate_Text_Width(const TEXT *); extern MENU_EXPORT(void) _nc_Post_Item (const MENU *, const ITEM *); extern MENU_EXPORT(bool) _nc_Connect_Items (MENU *, ITEM **); extern MENU_EXPORT(void) _nc_Disconnect_Items (MENU *); extern MENU_EXPORT(void) _nc_New_TopRow_and_CurrentItem (MENU *,int, ITEM *); extern MENU_EXPORT(void) _nc_Link_Items (MENU *); extern MENU_EXPORT(int) _nc_Match_Next_Character_In_Item_Name (MENU*,int,ITEM**); extern MENU_EXPORT(int) _nc_menu_cursor_pos (const MENU* menu, const ITEM* item, int* pY, int* pX); #ifdef TRACE #define returnItem(code) TRACE_RETURN1(code,item) #define returnItemPtr(code) TRACE_RETURN1(code,item_ptr) #define returnItemOpts(code) TRACE_RETURN1(code,item_opts) #define returnMenu(code) TRACE_RETURN1(code,menu) #define returnMenuHook(code) TRACE_RETURN1(code,menu_hook) #define returnMenuOpts(code) TRACE_RETURN1(code,menu_opts) extern MENU_EXPORT(ITEM *) _nc_retrace_item (ITEM *); extern MENU_EXPORT(ITEM **) _nc_retrace_item_ptr (ITEM **); extern MENU_EXPORT(Item_Options) _nc_retrace_item_opts (Item_Options); extern MENU_EXPORT(MENU *) _nc_retrace_menu (MENU *); extern MENU_EXPORT(Menu_Hook) _nc_retrace_menu_hook (Menu_Hook); extern MENU_EXPORT(Menu_Options) _nc_retrace_menu_opts (Menu_Options); #else /* !TRACE */ #define returnItem(code) return code #define returnItemPtr(code) return code #define returnItemOpts(code) return code #define returnMenu(code) return code #define returnMenuHook(code) return code #define returnMenuOpts(code) return code #endif /* TRACE/!TRACE */ /* *INDENT-ON* */ #endif /* MENU_PRIV_H_incl */ ncurses-6.4-20240113/menu/llib-lmenu0000644000000000000000000002542614062736236015406 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/menu/m_post.c0000644000000000000000000002554414313550044015057 0ustar rootroot/**************************************************************************** * Copyright 2020-2021,2022 Thomas E. Dickey * * Copyright 1998-2010,2012 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Juergen Pfeifer, 1995,1997 * ****************************************************************************/ /*************************************************************************** * Module m_post * * Write or erase menus from associated subwindows * ***************************************************************************/ #include "menu.priv.h" MODULE_ID("$Id: m_post.c,v 1.38 2022/09/24 09:38:44 tom Exp $") /*--------------------------------------------------------------------------- | Facility : libnmenu | Function : void _nc_Post_Item(MENU *menu, ITEM *item) | | Description : Draw the item in the menus window at the current | window position | | Return Values : - +--------------------------------------------------------------------------*/ MENU_EXPORT(void) _nc_Post_Item(const MENU *menu, const ITEM *item) { int i; chtype ch; int item_x, item_y; int count = 0; bool isfore = FALSE, isback = FALSE, isgrey = FALSE; int name_len; assert(menu->win); getyx(menu->win, item_y, item_x); /* We need a marker iff - it is a onevalued menu and it is the current item - or it has a selection value */ wattron(menu->win, (int)menu->back); if (item->value || (item == menu->curitem)) { if (menu->marklen) { /* In a multi selection menu we use the fore attribute for a selected marker that is not the current one. This improves visualization of the menu, because now always the 'normal' marker denotes the current item. */ if (!(menu->opt & O_ONEVALUE) && item->value && item != menu->curitem) { wattron(menu->win, (int)menu->fore); isfore = TRUE; } waddstr(menu->win, menu->mark); if (isfore) { wattron(menu->win, (int)menu->fore); isfore = FALSE; } } } else /* otherwise we have to wipe out the marker area */ for (ch = ' ', i = menu->marklen; i > 0; i--) waddch(menu->win, ch); wattroff(menu->win, (int)menu->back); count += menu->marklen; /* First we have to calculate the attribute depending on selectability and selection status */ if (!(item->opt & O_SELECTABLE)) { wattron(menu->win, (int)menu->grey); isgrey = TRUE; } else { if (item->value || item == menu->curitem) { wattron(menu->win, (int)menu->fore); isfore = TRUE; } else { wattron(menu->win, (int)menu->back); isback = TRUE; } } waddnstr(menu->win, item->name.str, item->name.length); name_len = _nc_Calculate_Text_Width(&(item->name)); for (ch = ' ', i = menu->namelen - name_len; i > 0; i--) { waddch(menu->win, ch); } count += menu->namelen; /* Show description if required and available */ if ((menu->opt & O_SHOWDESC) && menu->desclen > 0) { int m = menu->spc_desc / 2; int cy = -1, cx = -1; int desc_len; for (ch = ' ', i = 0; i < menu->spc_desc; i++) { if (i == m) { waddch(menu->win, menu->pad); getyx(menu->win, cy, cx); } else waddch(menu->win, ch); } if (item->description.length) waddnstr(menu->win, item->description.str, item->description.length); desc_len = _nc_Calculate_Text_Width(&(item->description)); for (ch = ' ', i = menu->desclen - desc_len; i > 0; i--) { waddch(menu->win, ch); } count += menu->desclen + menu->spc_desc; if (menu->spc_rows > 1) { int j, k, ncy, ncx; assert(cx >= 0 && cy >= 0); getyx(menu->win, ncy, ncx); if (isgrey) wattroff(menu->win, (int)menu->grey); else if (isfore) wattroff(menu->win, (int)menu->fore); wattron(menu->win, (int)menu->back); for (j = 1; j < menu->spc_rows; j++) { if ((item_y + j) < getmaxy(menu->win)) { wmove(menu->win, item_y + j, item_x); for (k = 0; k < count; k++) waddch(menu->win, ' '); } if ((cy + j) < getmaxy(menu->win)) (void)mvwaddch(menu->win, cy + j, cx - 1, menu->pad); } wmove(menu->win, ncy, ncx); if (!isback) wattroff(menu->win, (int)menu->back); } } /* Remove attributes */ if (isfore) wattroff(menu->win, (int)menu->fore); if (isback) wattroff(menu->win, (int)menu->back); if (isgrey) wattroff(menu->win, (int)menu->grey); } /*--------------------------------------------------------------------------- | Facility : libnmenu | Function : void _nc_Draw_Menu(const MENU *) | | Description : Display the menu in its windows | | Return Values : - +--------------------------------------------------------------------------*/ MENU_EXPORT(void) _nc_Draw_Menu(const MENU *menu) { ITEM *item = menu->items[0]; ITEM *lastvert; ITEM *hitem; chtype s_bkgd; assert(item && menu->win); s_bkgd = getbkgd(menu->win); wbkgdset(menu->win, menu->back); werase(menu->win); wbkgdset(menu->win, s_bkgd); lastvert = (menu->opt & O_NONCYCLIC) ? (ITEM *)0 : item; if (item != NULL) { int y = 0; do { ITEM *lasthor; wmove(menu->win, y, 0); hitem = item; lasthor = (menu->opt & O_NONCYCLIC) ? (ITEM *)0 : hitem; do { _nc_Post_Item(menu, hitem); wattron(menu->win, (int)menu->back); if (((hitem = hitem->right) != lasthor) && hitem) { int i, j, cy, cx; chtype ch = ' '; getyx(menu->win, cy, cx); for (j = 0; j < menu->spc_rows; j++) { wmove(menu->win, cy + j, cx); for (i = 0; i < menu->spc_cols; i++) { waddch(menu->win, ch); } } wmove(menu->win, cy, cx + menu->spc_cols); } } while (hitem && (hitem != lasthor)); wattroff(menu->win, (int)menu->back); item = item->down; y += menu->spc_rows; } while (item && (item != lastvert)); } } /*--------------------------------------------------------------------------- | Facility : libnmenu | Function : int post_menu(MENU* menu) | | Description : Post a menu to the screen. This makes it visible. | | Return Values : E_OK - success | E_BAD_ARGUMENT - not a valid menu pointer | E_SYSTEM_ERROR - error in lower layers | E_NOT_CONNECTED - No items connected to menu | E_BAD_STATE - Menu in userexit routine | E_POSTED - Menu already posted +--------------------------------------------------------------------------*/ MENU_EXPORT(int) post_menu(MENU *menu) { T((T_CALLED("post_menu(%p)"), (void *)menu)); if (!menu) RETURN(E_BAD_ARGUMENT); if (menu->status & _IN_DRIVER) RETURN(E_BAD_STATE); if (menu->status & _POSTED) RETURN(E_POSTED); if (menu->items && *(menu->items)) { int h = 1 + menu->spc_rows * (menu->rows - 1); WINDOW *win = Get_Menu_Window(menu); int maxy = getmaxy(win); if ((menu->win = newpad(h, menu->width))) { int y = (maxy >= h) ? h : maxy; if (y >= menu->height) y = menu->height; if (!(menu->sub = subpad(menu->win, y, menu->width, 0, 0))) RETURN(E_SYSTEM_ERROR); } else RETURN(E_SYSTEM_ERROR); if (menu->status & _LINK_NEEDED) _nc_Link_Items(menu); } else RETURN(E_NOT_CONNECTED); SetStatus(menu, _POSTED); if (!(menu->opt & O_ONEVALUE)) { ITEM **items; for (items = menu->items; *items; items++) { (*items)->value = FALSE; } } _nc_Draw_Menu(menu); Call_Hook(menu, menuinit); Call_Hook(menu, iteminit); _nc_Show_Menu(menu); RETURN(E_OK); } /*--------------------------------------------------------------------------- | Facility : libnmenu | Function : int unpost_menu(MENU*) | | Description : Detach menu from screen | | Return Values : E_OK - success | E_BAD_ARGUMENT - not a valid menu pointer | E_BAD_STATE - menu in userexit routine | E_NOT_POSTED - menu is not posted +--------------------------------------------------------------------------*/ MENU_EXPORT(int) unpost_menu(MENU *menu) { WINDOW *win; T((T_CALLED("unpost_menu(%p)"), (void *)menu)); if (!menu) RETURN(E_BAD_ARGUMENT); if (menu->status & _IN_DRIVER) RETURN(E_BAD_STATE); if (!(menu->status & _POSTED)) RETURN(E_NOT_POSTED); Call_Hook(menu, itemterm); Call_Hook(menu, menuterm); win = Get_Menu_Window(menu); werase(win); wsyncup(win); assert(menu->sub); delwin(menu->sub); menu->sub = (WINDOW *)0; assert(menu->win); delwin(menu->win); menu->win = (WINDOW *)0; ClrStatus(menu, _POSTED); RETURN(E_OK); } /* m_post.c ends here */ ncurses-6.4-20240113/menu/m_spacing.c0000644000000000000000000001140513765010366015515 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_attribs.c0000644000000000000000000001531214062736236015544 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_item_top.c0000644000000000000000000001114314062735154015710 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_item_nam.c0000644000000000000000000000752214062736236015671 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_hook.c0000644000000000000000000001663314062736752015046 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_pattern.c0000644000000000000000000001221614062736236015551 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/menu/m_scale.c0000644000000000000000000000732714062736236015172 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/config.sub0000755000000000000000000010722314501160441014421 0ustar rootroot#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2023 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2023-09-15' # 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-2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ | 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 ;; *-*) # A lone config we happen to match not fitting any pattern case $field1-$field2 in decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 basic_os=$field2 ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* \ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ | ultra | tti* | harris | dolphin | highlevel | gould \ | cbm | ns | masscomp | apple | axis | knuth | cray \ | microblaze* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 basic_os= ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; convex-c1) basic_machine=c1-convex basic_os=bsd ;; convex-c2) basic_machine=c2-convex basic_os=bsd ;; convex-c32) basic_machine=c32-convex basic_os=bsd ;; convex-c34) basic_machine=c34-convex basic_os=bsd ;; convex-c38) basic_machine=c38-convex basic_os=bsd ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull basic_os=sysv3 ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next case $basic_os in openstep*) ;; nextstep*) ;; ns2*) basic_os=nextstep2 ;; *) basic_os=nextstep3 ;; esac ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read cpu vendor <&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|'` ;; *-*) # shellcheck disable=SC2162 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-dietlibc*- | linux-android*- | linux-newlib*- \ | linux-musl*- | linux-relibc*- | linux-uclibc*- | linux-mlibc*- ) ;; uclinux-uclibc*- ) ;; managarm-mlibc*- | managarm-kernel*- ) ;; windows*-gnu*- | windows*-msvc*-) ;; -dietlibc*- | -newlib*- | -musl*- | -relibc*- | -uclibc*- | -mlibc*- ) # 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*- | kopensolaris*-gnu*-) ;; vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) ;; nto-qnx*-) ;; os2-emx-) ;; *-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*) 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: ncurses-6.4-20240113/install-sh0000755000000000000000000003577613761220263014465 0ustar rootroot#!/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: ncurses-6.4-20240113/man/0000755000000000000000000000000014550613657013224 5ustar rootrootncurses-6.4-20240113/man/curs_mouse.3x0000644000000000000000000003704714550604463015672 0ustar rootroot'\" 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.86 2024/01/13 22:05:39 tom Exp $ .TH curs_mouse 3X 2024-01-13 "ncurses 6.4" "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 \fBint getmouse(MEVENT *\fIevent\fP); \fBint ungetmouse(MEVENT *\fIevent\fP); .PP \fBmmask_t mousemask(mmask_t \fInewmask\fP, mmask_t *\fIoldmask\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, \fBint* \fIpY\fB, int* \fIpX\fB, bool \fIto_screen\fB);\fR .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 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 mousemask 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. .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 window-relative coordinates due to the mechanism to reserve lines on top or bottom of the screen for other purposes (see the \fB\%ripoffline\fP 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 window-relative coordinates and returned through the pointers. If the conversion was successful, the function returns \fBTRUE\fP. .bP If one of the parameters was \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 window-relative coordinates. They are converted to \fB\%stdscr\fP-relative coordinates if the window \fIwin\fP encloses this point. In this case the function returns \fBTRUE\fP. .bP If one of the parameters is \fBNULL\fP or the point is not inside the window, \fBFALSE\fP is returned. The referenced coordinates are only replaced by the converted coordinates if the transformation was successful. .SS mouse_trafo 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 thousands of a second) that can elapse between press and release events for them to be recognized as a click. Use \fB\%mouseinterval(0)\fP to disable click resolution. This function returns the previous interval value. Use \fB\%mouseinterval(\-1)\fP to obtain the interval without altering it. The default is one sixth of a second. .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 Note that mouse events will be ignored when input is in cooked mode, and will cause an error beep when cooked mode is being simulated in a window by a function such as \fB\%getstr\fP that expects a linefeed for input-loop termination. .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 an error 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 .I \%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 .I \%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 .I curses. They were not part of the X Consortium's .I \%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. .I \%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 Mouse event reports from .I \%xterm are not detected correctly in a window with keypad application mode disabled, since they are interpreted as a variety of function key. 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_slk\fP(3X), \fB\%curs_variables\fP(3X) ncurses-6.4-20240113/man/form_data.3x0000644000000000000000000000603714530376627015443 0ustar rootroot'\" t .\"*************************************************************************** .\" Copyright 2018-2022,2023 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.30 2023/11/25 13:58:47 tom Exp $ .TH form_data 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/menu_hook.3x0000644000000000000000000001067314530376627015474 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.30 2023/11/25 13:58:47 tom Exp $ .TH menu_hook 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/default_colors.3x0000644000000000000000000001537514537404526016516 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.48 2023/12/16 20:32:22 tom Exp $ .TH default_colors 3X 2023-12-16 "ncurses 6.4" "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 .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) ncurses-6.4-20240113/man/mitem_name.3x0000644000000000000000000000606314530376627015621 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.29 2023/11/25 13:58:47 tom Exp $ .TH mitem_name 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/key_defined.3x0000644000000000000000000000622014537404526015744 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.32 2023/12/16 20:32:22 tom Exp $ .TH key_defined 3X 2023-12-16 "ncurses 6.4" "Library calls" .SH NAME \fB\%key_defined\fP \- test whether a \fIcurses\fR keycode is defined .SH SYNOPSIS .nf \fB#include .PP \fBint key_defined(const char *\fIdefinition\fP); .fi .SH DESCRIPTION This is an extension to the \fIcurses\fP library. It permits an application to determine if a string is currently bound to any keycode. .SH RETURN VALUE If the string is bound to a keycode, its value (greater than zero) is returned. If no keycode is bound, zero is returned. If the string conflicts with longer strings which are bound to keys, \-1 is returned. .SH PORTABILITY This routine is specific to \fI\%ncurses\fP. It was 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\%define_key\fP(3X) ncurses-6.4-20240113/man/curs_instr.3x0000644000000000000000000001145514537404526015677 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.44 2023/12/16 20:32:22 tom Exp $ .TH curs_instr 3X 2023-12-16 "ncurses 6.4" "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\%innstr\fP, \fB\%winstr\fP, \fB\%winnstr\fP, \fB\%mvinstr\fP, \fB\%mvinnstr\fP, \fB\%mvwinstr\fP, \fB\%mvwinnstr\fP \- get a string from a \fIcurses\fR window .SH SYNOPSIS .nf \fB#include .PP \fBint instr(char *\fIstr\fP); \fBint innstr(char *\fIstr\fP, int \fIn\fP); \fBint winstr(WINDOW *\fIwin\fP, char *\fIstr\fP); \fBint winnstr(WINDOW *\fIwin\fP, char *\fIstr\fP, int \fIn\fP); .PP \fBint mvinstr(int \fIy\fP, int \fIx\fP, char *\fIstr\fP); \fBint mvinnstr(int \fIy\fP, int \fIx\fP, char *\fIstr\fP, int \fIn\fP); \fBint mvwinstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, char *\fIstr\fP); \fBint mvwinnstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, char *\fIstr\fP, int \fIn\fP); .fi .SH DESCRIPTION These routines return a string of characters in \fIstr\fP, starting at the current cursor position in the named window. Attributes are stripped from 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 NUL). Transfer stops at the end of the current line, or when \fIn\fP characters have been stored at the location referenced by \fIstr\fP. .SH RETURN VALUE All of the functions return \fBERR\fP upon failure, or the number of characters actually read into the string. .PP X/Open Curses defines no error conditions. This implementation returns an error .bP if the \fIwin\fP parameter is null or .bP if the \fIchstr\fP parameter is null. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES All routines except \fBwinnstr\fP may be macros. .PP Reading a line that overflows the array pointed to by \fIstr\fP with \fBinstr\fP, \fBmvinstr\fP, \fBmvwinstr\fP or \fBwinstr\fP causes undefined results. Therefore, the use of \fBinnstr\fP, \fBmvinnstr\fP, \fBmvwinnstr\fP, or \fBwinnstr\fP is recommended. .SH PORTABILITY SVr4 does not document whether a length limit includes or excludes the trailing NUL. .PP The \fI\%ncurses\fP library extends the XSI description by allowing a negative value for \fIn\fP. In this case, the functions return the string ending at the right margin. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_inch\fP(3X), \fB\%curs_inchstr\fP(3X), \fB\%curs_inwstr\fP(3X), \fB\%curs_in_wchstr\fP(3X) ncurses-6.4-20240113/man/form_cursor.3x0000644000000000000000000000637014530376627016047 0ustar rootroot'\" t .\"*************************************************************************** .\" Copyright 2018-2022,2023 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.29 2023/11/25 13:58:47 tom Exp $ .TH form_cursor 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_inch.3x0000644000000000000000000001221214550604463015446 0ustar rootroot'\" 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.44 2024/01/13 22:05:39 tom Exp $ .TH curs_inch 3X 2024-01-13 "ncurses 6.4" "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); .PP \fBchtype mvinch(int \fIy\fP, int \fIx\fP); \fBchtype mvwinch(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP); .fi .SH DESCRIPTION These routines return the character, of type \fBchtype\fP, at the current position in the named window. If any attributes are set for that position, their values are OR'ed into the value returned. Constants defined in \fB\fP can be used with the \fB&\fP (logical AND) operator to extract the character or attributes alone. . .SS Attributes The following bit masks may be AND-ed with characters returned by \fBwinch\fP. .PP .TS Lb Lb Lb Lx. Name Description _ A_CHARTEXT Extract character A_ATTRIBUTES Extract attributes A_COLOR Extract color pair information .TE .SH RETURN VALUE Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .PP The \fBwinch\fP function does not return an error if the window contains characters larger than 8-bits (255). Only the low-order 8 bits of the character are used by \fBwinch\fP. .SH NOTES Note that all of these routines may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. .PP Very old systems (before standardization) provide a different function with the same name: .bP The \fBwinch\fP function was part of the original BSD curses library, which stored a 7-bit character combined with the \fIstandout\fP attribute. .IP In BSD curses, \fBwinch\fP returned only the character (as an integer) with the \fIstandout\fP attribute removed. .bP System V curses added support for several video attributes which could be combined with characters in the window. .IP Reflecting this improvement, the function was altered to return the character combined with all video attributes in a \fBchtype\fP value. .PP X/Open Curses does not specify the size and layout of attributes, color and character values in \fBchtype\fP; it is implementation-dependent. This implementation uses 8 bits for character values. An application using more bits, e.g., a Unicode value, should use the wide-character equivalents to these functions. .SH SEE ALSO .TP \fB\%curses\fP(3X) gives an overview of the \fB\%WINDOW\fP and \fB\%chtype\fP data types. .TP \fB\%curs_attr\fP(3X) goes into more detail, pointing out portability problems and constraints on the use of \fB\%chtype\fP for returning window information. .TP \fB\%curs_in_wch\fP(3X) describes comparable functions for the wide-character (ncursesw) library. ncurses-6.4-20240113/man/curs_addwstr.3x0000644000000000000000000001163314526225077016206 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2022,2023 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.29 2023/11/18 21:18:55 tom Exp $ .TH curs_addwstr 3X 2023-11-18 "ncurses 6.4" "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\%addnwstr\fP, \fB\%waddwstr\fP, \fB\%waddnwstr\fP, \fB\%mvaddwstr\fP, \fB\%mvaddnwstr\fP, \fB\%mvwaddwstr\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 addnwstr(const wchar_t *\fIwstr\fP, int \fIn\fP); \fBint waddwstr(WINDOW *\fIwin\fP, const wchar_t *\fIwstr\fP); \fBint waddnwstr(WINDOW *\fIwin\fP, const wchar_t *\fIwstr\fP, int \fIn\fP); .PP \fBint mvaddwstr(int \fIy\fP, int \fIx\fP, const wchar_t *\fIwstr\fP); \fBint mvaddnwstr(int \fIy\fP, int \fIx\fP, const wchar_t *\fIwstr\fP, int \fIn\fP); \fBint mvwaddwstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const wchar_t *\fIwstr\fP); \fBint mvwaddnwstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const wchar_t *\fIwstr\fP, int \fIn\fP); .fi .SH DESCRIPTION These functions write the characters of the (null-terminated) \fBwchar_t\fP character string \fIwstr\fP on the given window. It is similar to constructing a \fBcchar_t\fP for each \fBwchar_t\fR in the string, then calling \fBwadd_wch\fP(3X) for the resulting \fBcchar_t\fP: .bP spacing and non-spacing characters in the string are processed one at a time, and .bP control characters are processed as in \fBwaddch\fP(3X). .PP The \fImv\fP functions perform cursor movement once, before writing any characters. Thereafter, the cursor is advanced as a side-effect of writing to the window. .PP The four functions with \fIn\fP as the last argument write at most \fIn\fP \fBwchar_t\fP characters, or until a terminating null is reached. If \fIn\fP is \-1, then the entire string will be added. .SH RETURN VALUE All functions return the integer \fBERR\fP upon failure and \fBOK\fP on success. .PP X/Open does not define any error conditions. This implementation returns an error .bP if the window pointer is null or .bP if the string pointer is null or .bP if the corresponding calls to \fBwadd_wch\fP return an error. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES All of these functions except \fBwaddnwstr\fP may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_addch\fP(3X), \fB\%curs_addchstr\fP(3X), \fB\%curs_addstr\fP(3X), \fB\%curs_add_wch\fP(3X), \fB\%curs_add_wchstr\fP(3X) ncurses-6.4-20240113/man/make_sed.sh0000755000000000000000000000717414534216373015340 0ustar rootroot#!/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 ncurses-6.4-20240113/man/curs_insch.3x0000644000000000000000000000763014541602314015632 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.36 2023/12/23 16:03:24 tom Exp $ .TH curs_insch 3X 2023-12-23 "ncurses 6.4" "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\fR 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 \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 using \fB\%wmove\fP and fail if the position .RI ( y , .IR x ) is outside the window. .SH NOTES A terminal's .B \%insert_character .RB ( ich1 ) capability is not necessarily employed. .PP \fB\%insch\fP, \fB\%mvinsch\fP, and \fB\%mvwinsch\fP may be implemented as macros. .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 "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) ncurses-6.4-20240113/man/menu_mark.3x0000644000000000000000000000751614530376627015470 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.33 2023/11/25 13:58:47 tom Exp $ .TH menu_mark 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/form_new_page.3x0000644000000000000000000000671714530376627016324 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.32 2023/11/25 13:58:47 tom Exp $ .TH form_new_page 3X 2023-11-25 "ncurses 6.4" "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. ncurses-6.4-20240113/man/tput.10000644000000000000000000005547314550611364014311 0ustar rootroot'\" 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.102 2024/01/13 22:47:16 tom Exp $ .TH @TPUT@ 1 2024-01-13 "ncurses 6.4" "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 .. .ds d @TERMINFO@ .SH NAME \fB\%@TPUT@\fP, \fB\%init\fP, \fB\%reset\fP \- initialize a terminal, exercise its capabilities, or query \fI\%term\%info\fP database .SH SYNOPSIS \fB@TPUT@\fP [\fB\-T\fP \fIterminal-type\fP] {\fIcap-code\fP [\fIparameter\fP .\|.\|.\&]} .\|.\|. .PP \fB@TPUT@\fP [\fB\-T\fP \fIterminal-type\fP] [\fB\-x\fP] \fBclear\fP .PP \fB@TPUT@\fP [\fB\-T\fP \fIterminal-type\fP] \fBinit\fP .PP \fB@TPUT@\fP [\fB\-T\fP \fIterminal-type\fP] \fB\%reset\fP .PP \fB@TPUT@\fP [\fB\-T\fP \fIterminal-type\fP] \fB\%longname\fP .PP \fB@TPUT@ \-S\fP .PP \fB@TPUT@ \-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 .I 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 .I 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 .I 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 the capability is of string type and takes parameters, the arguments following the capability will be used as its parameters. .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" \*(''. (The \fB\%@TSET@\fP(1) utility also treats a link named .B \%reset specially.) .PP If \fB\%@TPUT@\fP is invoked by a link named .BR \%init , this has the same effect as .RB \%\*(`` "@TPUT@ init" \*(''. Such a link is seldom employed because another program of that name is in widespread use. .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 .I \%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 .I 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 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 command 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 \*d 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 .I \%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 .I \%term\%info. .I termcap uses the code .B DL for .BR \%parm_delete_line . .I \%term\%info uses the code .B dch1 for .BR \%delete_line . .bP The .I cap-code .B ed means .B \%exit_delete_mode to .I termcap but .B \%clr_eos to .I \%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 .I 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 names rather than .I \%term\%info capability names in their respective .B tput commands. Since 2010, NetBSD's .B tput uses .I \%term\%info names. Before that, it (like FreeBSD) recognized .I termcap names. .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 .I curses, no system with a .I curses implementation provides a .B tput utility that does not also support standard .I 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 cancelled numeric capability for an (unsigned) exit status. .PP The various System\ V implementations (AIX, HP-UX, Solaris) use the same exit statuses as .I \%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 names 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 The \fB\%@TSET@\fP program waits one second when resetting, in case the terminal happens to be a hardware device. .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 row 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 row 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) ncurses-6.4-20240113/man/form_field_new.3x0000644000000000000000000001113214530376627016456 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.39 2023/11/25 13:58:47 tom Exp $ .TH form_field_new 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/form_opts.3x0000644000000000000000000000756014530376627015521 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.32 2023/11/25 13:58:47 tom Exp $ .TH form_opts 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/MKada_config.in0000644000000000000000000001136714537414735016067 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2021,2023 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.32 2023/12/16 21:42:53 tom Exp $ .TH adacurses@USE_CFG_SUFFIX@\-config 1 2023-12-16 "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 ' ' .\} .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 .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 .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) ncurses-6.4-20240113/man/curs_deleteln.3x0000644000000000000000000001052014537413656016330 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.34 2023/12/16 21:33:34 tom Exp $ .TH curs_deleteln 3X 2023-12-16 "ncurses 6.4" "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\%insdelln\fP, \fB\%winsdelln\fP, \fB\%insertln\fP, \fB\%winsertln\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 insdelln(int \fIn\fP); \fBint winsdelln(WINDOW *\fIwin\fP, int \fIn\fP); .PP \fBint insertln(void); \fBint winsertln(WINDOW *\fIwin\fP); .fi .SH DESCRIPTION The \fBdeleteln\fP and \fBwdeleteln\fP routines delete the line under the cursor in the window; all lines below the current line are moved up one line. The bottom line of the window is cleared. The cursor position does not change. .PP The \fBinsdelln\fP and \fBwinsdelln\fP routines, for positive \fIn\fP, insert \fIn\fP lines into the specified window above the current line. The \fIn\fP bottom lines are lost. For negative \fIn\fP, delete \fIn\fP lines (starting with the one under the cursor), and move the remaining lines up. The bottom \fIn\fP lines are cleared. The current cursor position remains the same. .PP The \fBinsertln\fP and \fBwinsertln\fP routines insert a blank line above the current line and the bottom line is lost. .SH RETURN VALUE 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, if the window parameter is null, an error is returned. .SH NOTES Note that all but \fBwinsdelln\fP may be macros. .PP These routines do not require a hardware line delete or insert feature in the terminal. In fact, they will not use hardware line delete/insert unless \fBidlok(..., TRUE)\fP has been set on the current window. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. The standard specifies that they return \fBERR\fP on failure, but specifies no error conditions. .SH SEE ALSO \fB\%curses\fP(3X) ncurses-6.4-20240113/man/curs_getyx.3x0000644000000000000000000001143714537413641015676 0ustar rootroot.\"*************************************************************************** .\" Copyright 2020-2022,2023 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.40 2023/12/16 21:33:21 tom Exp $ .TH curs_getyx 3X 2023-12-16 "ncurses 6.4" "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 getparyx(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); .fi .SH DESCRIPTION The \fB\%getyx\fP macro places the current cursor position of the given window in the two integer variables \fIy\fP and \fIx\fP. .PP If \fIwin\fP is a subwindow, the \fB\%getparyx\fP macro places the beginning coordinates of the subwindow relative to the parent window into two integer variables \fIy\fP and \fIx\fP. Otherwise, \fB\-1\fP is placed into \fIy\fP and \fIx\fP. .PP Like \fB\%getyx\fP, the \fB\%getbegyx\fP and \fB\%getmaxyx\fP macros store the current beginning coordinates and size of the specified window. .SH RETURN VALUE The return values of these macros are undefined (i.e., they should not be used as the right-hand side of assignment statements). .SH NOTES All of these interfaces are macros. A \*(``&\*('' is not necessary before the variables \fIy\fP and \fIx\fP. .SH PORTABILITY The \fB\%getyx\fP, \fB\%getparyx\fP, \fB\%getbegyx\fP and \fB\%getmaxyx\fP macros are described in the XSI Curses standard, Issue 4. .PP This implementation also provides functions \fB\%getbegx\fP, \fB\%getbegy\fP, \fB\%getcurx\fP, \fB\%getcury\fP, \fB\%getmaxx\fP, \fB\%getmaxy\fP, \fB\%getparx\fP and \fB\%getpary\fP for compatibility with older versions of \fIcurses\fP; see \fB\%curs_legacy\fP(3X). .PP Although X/Open Curses does not address this, many implementations provide members of the \fB\%WINDOW\fP structure containing values corresponding to these macros. For best portability, do not rely on using the data in \fB\%WINDOW\fP, since some implementations make \fB\%WINDOW\fP opaque (do not allow direct use of its members). .PP Besides the problem of opaque structures, the data stored in like-named members may not have like-values in different implementations. For example, the \fB\%WINDOW._maxx\fP and \fB\%WINDOW._maxy\fP values in \fI\%ncurses\fP have (at least since release 1.8.1) differed by one from some other implementations. The difference is hidden by means of the macro \fB\%getmaxyx\fP. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_legacy\fP(3X), \fB\%curs_opaque\fP(3X) ncurses-6.4-20240113/man/form_field_info.3x0000644000000000000000000001025114530376627016621 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.30 2023/11/25 13:58:47 tom Exp $ .TH form_field_info 3X 2023-11-25 "ncurses 6.4" "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. ncurses-6.4-20240113/man/term.70000644000000000000000000002307714532714315014265 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2021,2023 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.46 2023/12/02 20:51:25 tom Exp $ .TH term 7 2023-12-02 "ncurses 6.4" Miscellaneous .ie \n(.g \{\ .ds `` \(lq .ds '' \(rq .\} .el \{\ .ie t .ds `` `` .el .ds `` "" .ie t .ds '' '' .el .ds '' "" .\} . .ds d @TERMINFO@ .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 \*d. To browse a list of all terminal names recognized by the system, do .sp @TOE@ | more .sp from your shell. These capability files are in a binary format optimized for retrieval speed (unlike the old text-based \fBtermcap\fP format they replace); to examine an entry, you must use the \fB@INFOCMP@\fP(1M) command. Invoke it as follows: .sp @INFOCMP@ \fIentry_name\fP .sp where \fIentry_name\fP is the name of the type you wish to examine (and the name of its capability file the subdirectory of \*d named for its first letter). This command dumps a capability file in the text format described by \fBterminfo\fP(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 \*d 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) ncurses-6.4-20240113/man/form_field_just.3x0000644000000000000000000000714114530376627016657 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.33 2023/11/25 13:58:47 tom Exp $ .TH form_field_just 3X 2023-11-25 "ncurses 6.4" "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. ncurses-6.4-20240113/man/curs_scroll.3x0000644000000000000000000001137514537425063016036 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.36 2023/12/16 22:52:35 tom Exp $ .TH curs_scroll 3X 2023-12-16 "ncurses 6.4" "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\fR 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 \fBscroll\fP 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 blank characters; see \fB\%bkgd\fP(3X) or \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 \fB\%scrl\fP and \fB\%wscrl\fP scroll .B \%stdscr or the specified window up or down depending on the sign of .I n. .bP For positive .I n, line \fIi\fP+\fIn\fP becomes \fIi\fP (scrolling up); .bP for negative .I n, line \fIi\fP-\fIn\fP becomes \fIi\fP (scrolling down). .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 \fBERR\fP 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 Unusually, there is no \fB\%wscroll\fP function; \fBscroll\fP behaves as one would expect \fB\%wscroll\fP to, accepting a \fI\%WINDOW\fP pointer argument. .PP \fB\%scrl\fP and \fB\%scroll\fP may be implemented as macros. .SH PORTABILITY X/Open Curses, Issue 4, describes these functions. It defines no error conditions. .PP SVr4 specifies only \*(``an integer value other than \fBERR\fP\*('' 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 will occur, to leave open the possibility of smarter optimization of multiple scroll actions on the next update. .PP Neither SVr4 .I curses nor X/Open Curses specify whether the current attribute or current color pair of blanks generated by the scroll function are zeroed. .I \%ncurses does so. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_outopts\fP(3X) ncurses-6.4-20240113/man/curs_threads.3x0000644000000000000000000004204214550604463016163 0ustar rootroot'\" 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.54 2024/01/13 22:05:39 tom Exp $ .TH curs_threads 3X 2024-01-13 "ncurses 6.4" "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) ncurses-6.4-20240113/man/menu_requestname.3x0000644000000000000000000000656714537404526017071 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.31 2023/12/16 20:32:22 tom Exp $ .TH menu_requestname 3X 2023-12-16 "ncurses 6.4" "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) ncurses-6.4-20240113/man/menu_spacing.3x0000644000000000000000000001062714537404526016154 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.35 2023/12/16 20:32:22 tom Exp $ .TH menu_spacing 3X 2023-12-16 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_terminfo.3x0000644000000000000000000007356714550605633016374 0ustar rootroot'\" 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.129 2024/01/13 22:15:55 tom Exp $ .TH curs_terminfo 3X 2024-01-13 "ncurses 6.4" "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\%mvcur\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 mvcur(int \fIoldrow\fP, int \fIoldcol\fP, int \fInewrow\fP, int \fInewcol\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 .I 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 .I descriptor. In .I 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 .I 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" \fB\%setupterm\fP stores its information about the terminal in a .I \%TERMINAL structure pointed to by the global variable \fB\%cur_term\fP. If it detects an error, or decides that the terminal is unsuitable (hardcopy or generic), it discards this information, making it not available to applications. .PP If \fB\%setupterm\fP is called repeatedly for the same terminal type, it will reuse the information. It maintains only one copy of a given terminal's capabilities in memory. If it is called for different terminal types, \fB\%setupterm\fP allocates new storage for each set of terminal capabilities. .PP \fB\%set_curterm\fP sets \fB\%cur_term\fP to .I \%nterm, and makes all of the .I \%term\%info Boolean, numeric, and string variables use the values from .I \%nterm. It returns the old value of \fB\%cur_term\fP. .PP \fB\%del_curterm\fP frees the space pointed to by .I \%oterm and makes it available for further use. If .I \%oterm is the same as \fB\%cur_term\fP, references to any of the .I \%term\%info Boolean, numeric, and string variables thereafter may refer to invalid memory locations until another \fB\%setupterm\fP has been called. .PP \fB\%restartterm\fP is similar to \fB\%setupterm\fP and \fB\%initscr\fP, except that it is called after restoring memory to a previous state (for example, when reloading a game saved as a core image dump). \fB\%restartterm\fP assumes that the windows and the input and output options are the same as when memory was saved, but the terminal type and baud rate may be different. Accordingly, \fB\%restartterm\fP saves various terminal state bits, calls \fB\%setupterm\fP, and then restores the bits. .\" ******************************************************************** .SS "Formatting Output" \fB\%tparm\fP instantiates the string .I str with parameters .I 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 \fB\%tparm\fP, \fB\%tiparm\fP, \fB\%tgetstr\fP, or \fB\%tgoto\fP. .IP The \fB\%tgetstr\fP and \fB\%tgoto\fP functions are part of the .I termcap interface, which happens to share these function names with the .I \%term\%info API. .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 .I attrs, which is any combination of the attributes listed in \fB\%curses\fP(3X). The characters are passed to the .IR \%putchar -like function .I 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 .I \%attrs, of type .I \%attr_t, for the attributes and .bP .I pair, of type .I 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 \fB\%mvcur\fP 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 or pass an output function parameter, \fB\%mvcur\fP uses an output file descriptor derived from the output stream parameter of \fB\%newterm\fP(3X). .PP While \fB\%putp\fP and \fB\%mvcur\fP are low-level functions that do not use high-level .I curses state, .I \%ncurses declares them 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 .I 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 .I \%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 an error. .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 .I \%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 .I 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 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 cleanup on receiving .BR SIGTSTP . .PP The current version (ncurses6) uses output buffers managed directly by .I \%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, in some cases applying it needlessly to values are already constant, and in most cases overlooking parameters which normally would use .I \%const. Using constant parameters for functions which do not use .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 an error 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, \fB\%set_curterm\fP returns an .I int, .B OK or .BR ERR . We have chosen to implement the X/Open Curses semantics. .PP In SVr4, the third argument of \fB\%tputs\fP 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 \fB\%tputs\fP. It instead returns the length of the string, and does no error checking. .PP X/Open Curses notes that after calling \fB\%mvcur\fP, the .I curses state may not match the actual terminal state, and that an application should touch and refresh the window before resuming normal .I curses calls. Both .I \%ncurses and SVr4 .I curses implement \fB\%mvcur\fP using the .I SCREEN data allocated in either \fB\%initscr\fP or \fB\%newterm\fP. So though it is documented as a .I \%term\%info function, \fB\%mvcur\fP is really a .I curses function that is not well specified. .PP X/Open notes that after calling \fB\%mvcur\fP, the .I curses state may not match the actual terminal state, and that an application should touch and refresh the window before resuming normal .I curses calls. Both .I \%ncurses and SVr4 .I curses implement \fB\%mvcur\fP using the .I SCREEN data allocated in either \fB\%initscr\fP or \fB\%newterm\fP. So though it is documented as a .I \%term\%info function, \fB\%mvcur\fP is really a .I curses function that is not well specified. .PP X/Open Curses states that the old location must be given for \fB\%mvcur\fP to accommodate terminals that lack absolute cursor positioning. .\" X/Open Curses Issue 7, p. 161 .I \%ncurses allows the caller to use \-1 for either or both old coordinates. The \-1 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 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 .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) ncurses-6.4-20240113/man/menu_opts.3x0000644000000000000000000001041414530376627015512 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.33 2023/11/25 13:58:47 tom Exp $ .TH menu_opts 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_in_wch.3x0000644000000000000000000000731114526175653016007 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.24 2023/11/18 18:00:11 tom Exp $ .TH curs_in_wch 3X 2023-11-18 "ncurses 6.4" "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\%mvin_wch\fP, \fB\%mvwin_wch\fP, \fB\%win_wch\fP \- get a \fIcurses\fR complex character from a window .SH SYNOPSIS .nf \fB#include .PP \fBint in_wch(cchar_t *\fIwcval\fP); \fBint win_wch(WINDOW *\fIwin\fP, cchar_t *\fIwcval\fP); .PP \fBint mvin_wch(int \fIy\fP, int \fIx\fP, cchar_t *\fIwcval\fP); \fBint mvwin_wch(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, cchar_t *\fIwcval\fP); .fi .SH DESCRIPTION These functions extract the complex character and rendition from the current position in the named window into the \fBcchar_t\fP object referenced by wcval. .SH RETURN VALUE No errors are defined in the XSI Curses standard. This implementation checks for null pointers, returns \fBERR\fP in that case. Also, the \fImv\fP routines check for error moving the cursor, returning \fBERR\fP in that case. Otherwise they return \fBOK\fP. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES Note that all of these routines may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_inch\fP(3X), \fB\%curs_inchstr\fP(3X), \fB\%curs_instr\fP(3X), \fB\%curs_inwstr\fP(3X) ncurses-6.4-20240113/man/tic.1m0000644000000000000000000005031014544106540014230 0ustar rootroot.\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: tic.1m,v 1.106 2023/12/30 21:36:32 tom Exp $ .TH @TIC@ 1M 2023-12-30 "ncurses 6.4" "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 .. . .ds d @TERMINFO@ .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\*d\fP. The compiled terminal description can be placed in a different terminfo database. There are two ways to achieve this: .bP First, you may override the system default either by using the \fB\-o\fP option, or by setting the variable \fI\%TERMINFO\fP in your shell environment to a valid database location. .bP Secondly, if \fB@TIC@\fP cannot write in \fI\*d\fP or the location specified using your \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\*d\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 5 \fB\-U\fP tells \fB@TIC@\fP to not post-process the data after parsing the source file. Normally, it infers data which is commonly missing in older terminfo data, or in termcaps. .TP \fB\-V\fP reports the version of \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\*d\fP to complete the entry. (Entries created from \fIfile\fP will be used first. \fB@TIC@\fP duplicates the capabilities in \fIentry\fP\-\fIname\fP for the current entry, with the exception of those capabilities that explicitly are defined in the current entry. .PP When an entry, e.g., \fBentry_name_1\fP, contains a \fBuse=\fIentry\fR_\fIname\fR_\fI2\fR field, any canceled capabilities in \fIentry\fR_\fIname\fR_\fI2\fP must also appear in \fBentry_name_1\fP before \fBuse=\fP for these capabilities to be canceled in \fBentry_name_1\fP. .PP Total compiled entries cannot exceed 4096 bytes 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 \*d 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 cancelled capabilities. .PP System V Release 3 provided a different \fBtic\fP utility, written by Pavel Curtis, (originally named \*(``compile\*('' in \fIpcurses\fP). This added an option \fB\-c\fP to check the file for errors, with the caveat that errors in \*(``use=\*('' links would not be reported. System V Release 3 documented a few warning messages which did not appear in \fIpcurses\fP. While the program itself was changed little as development continued with System V Release 4, the table of capabilities grew from 180 (\fIpcurses\fP) to 464 (Solaris). .PP In early development of \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) ncurses-6.4-20240113/man/curs_addstr.3x0000644000000000000000000001105214526225077016012 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-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. * .\"*************************************************************************** .\" .\" $Id: curs_addstr.3x,v 1.37 2023/11/18 21:18:55 tom Exp $ .TH curs_addstr 3X 2023-11-18 "ncurses 6.4" "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\%addnstr\fP, \fB\%waddstr\fP, \fB\%waddnstr\fP, \fB\%mvaddstr\fP, \fB\%mvaddnstr\fP, \fB\%mvwaddstr\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 addnstr(const char *\fIstr\fP, int \fIn\fP); \fBint waddstr(WINDOW *\fIwin\fP, const char *\fIstr\fP); \fBint waddnstr(WINDOW *\fIwin\fP, const char *\fIstr\fP, int \fIn\fP); .PP \fBint mvaddstr(int \fIy\fP, int \fIx\fP, const char *\fIstr\fP); \fBint mvaddnstr(int \fIy\fP, int \fIx\fP, const char *\fIstr\fP, int \fIn\fP); \fBint mvwaddstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const char *\fIstr\fP); \fBint mvwaddnstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const char *\fIstr\fP, int \fIn\fP); .fi .SH DESCRIPTION These functions write the (null-terminated) character string \fIstr\fP on the given window. It is similar to calling \fBwaddch\fP once for each byte in the string. .PP The \fImv\fP functions perform cursor movement once, before writing any characters. Thereafter, the cursor is advanced as a side-effect of writing to the window. .PP The four functions with \fIn\fP as the last argument write at most \fIn\fP bytes, or until a terminating null is reached. If \fIn\fP is \-1, then the entire string will be added. .SH RETURN VALUE All functions return the integer \fBERR\fP upon failure and \fBOK\fP on success. .PP X/Open does not define any error conditions. This implementation returns an error .bP if the window pointer is null or .bP if the string pointer is null or .bP if the corresponding calls to \fBwaddch\fP return an error. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES All of these functions except \fBwaddnstr\fP may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_addch\fP(3X), \fB\%curs_addchstr\fP(3X), \fB\%curs_addwstr\fP(3X), \fB\%curs_add_wchstr\fP(3X) ncurses-6.4-20240113/man/curs_kernel.3x0000644000000000000000000002136114546074322016012 0ustar rootroot.\"*************************************************************************** .\" 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.53 2024/01/05 21:46:58 tom Exp $ .TH curs_kernel 3X 2024-01-05 "ncurses 6.4" "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\%ripoffline\fP, \fB\%curs_set\fP, \fB\%napms\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 ripoffline(int \fIline\fP, int (*\fIinit\fP)(WINDOW *, int)); \fBint curs_set(int \fIvisibility\fP); \fBint napms(int \fIms\fP); .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 The \fBgetsyx\fP routine returns the current coordinates of the \fIvirtual screen\fP cursor in \fIy\fP and \fIx\fP. If \fBleaveok\fP is currently \fBTRUE\fP, then \fB\-1\fP,\fB\-1\fP is returned. If lines have been removed from the top of the screen, using \fBripoffline\fP, \fIy\fP and \fIx\fP include these lines; therefore, \fIy\fP and \fIx\fP should be used only as arguments for \fBsetsyx\fP. .PP Few applications will use this feature, most use \fBgetyx\fP instead. .SS setsyx The \fBsetsyx\fP routine sets the \fIvirtual screen\fP cursor to \fIy\fP, \fIx\fP. If \fIy\fP and \fIx\fP are both \fB\-1\fP, then \fBleaveok\fP is set. The two routines \fBgetsyx\fP and \fBsetsyx\fP are designed to be used by a library routine, which manipulates \fBcurses\fP windows but does not want to change the current position of the program's cursor. The library routine would call \fBgetsyx\fP at the beginning, do its manipulation of its own windows, do a \fBwnoutrefresh\fP on its windows, call \fBsetsyx\fP, and then call \fBdoupdate\fP. .PP Few applications will use this feature, most use \fBwmove\fP instead. .SS ripoffline The \fBripoffline\fP routine provides access to the same facility that \fBslk_init\fP [see \fBcurs_slk\fP(3X)] uses to reduce the size of the screen. \fBripoffline\fP must be called before \fBinitscr\fP or \fBnewterm\fP is called, to prepare these initial actions: .bP If \fIline\fP is positive, a line is removed from the top of \fBstdscr\fP. .bP if \fIline\fP is negative, a line is removed from the bottom. .PP When the resulting initialization is done inside \fBinitscr\fP, the routine \fBinit\fP (supplied by the user) is called with two arguments: .bP a window pointer to the one-line window that has been allocated and .bP an integer with the number of columns in the window. .PP Inside this initialization routine, the integer variables \fBLINES\fP and \fBCOLS\fP (defined in \fB\fP) are not guaranteed to be accurate and \fBwrefresh\fP or \fBdoupdate\fP must not be called. It is allowable to call \fBwnoutrefresh\fP during the initialization routine. .PP \fBripoffline\fP can be called up to five times before calling \fBinitscr\fP or \fBnewterm\fP. .SS curs_set The \fBcurs_set\fP routine sets the cursor state to invisible, normal, or very visible for \fBvisibility\fP equal to \fB0\fP, \fB1\fP, or \fB2\fP respectively. If the terminal supports the \fIvisibility\fP requested, the previous \fIcursor\fP state is returned; otherwise, \fBERR\fP is returned. .SS napms The \fBnapms\fP routine is used to sleep for \fIms\fP milliseconds. If the value of \fIms\fP exceeds 30,000 (thirty seconds), it is capped at that value. .SH RETURN VALUE Except for \fBcurs_set\fP, these routines always return \fBOK\fP. .PP \fBcurs_set\fP returns the previous cursor state, or \fBERR\fP if the requested \fIvisibility\fP is not supported. .PP X/Open defines no error conditions. In this implementation .TP 5 \fBdef_prog_mode\fP, \fBdef_shell_mode\fP, \fBreset_prog_mode\fP, \fBreset_shell_mode\fP return an error if the terminal was not initialized, or if the I/O call to obtain the terminal settings fails. .TP 5 \fBripoffline\fP returns an error if the maximum number of ripped-off lines exceeds the maximum (5). .SH NOTES Note that \fBgetsyx\fP is a macro, so \fB&\fP is not necessary before the variables \fIy\fP and \fIx\fP. .PP Older SVr4 man pages warn that the return value of \fBcurs_set\fP \*(``is currently incorrect\*(''. This implementation gets it right, but it may be unwise to count on the correctness of the return value anywhere else. .PP Both \fI\%ncurses\fP and SVr4 will call \fBcurs_set\fP in \fBendwin\fP if \fBcurs_set\fP has been called to make the cursor other than normal, i.e., either invisible or very visible. There is no way for \fI\%ncurses\fP to determine the initial cursor state to restore that. .SH PORTABILITY The \fIvirtual screen\fP functions \fBsetsyx\fP and \fBgetsyx\fP are not described in the XSI Curses standard, Issue 4. All other functions are as described in XSI Curses. .PP The SVr4 documentation describes \fBsetsyx\fP and \fBgetsyx\fP as having return type int. This is misleading, as they are macros with no documented semantics for the return value. .PP If interrupted, \fI\%ncurses\fP restarts \fBnapms\fP. That, and the limitation to 30 seconds, are different 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) ncurses-6.4-20240113/man/MKncu_config.in0000644000000000000000000001073414541670332016114 0ustar rootroot.\"*************************************************************************** .\" Copyright 2020-2021,2023 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.22 2023/12/23 23:44:26 tom Exp $ .TH @LIB_NAME@@DFT_ARG_SUFFIX@@cf_cv_abi_version@-config 1 2023-12-23 "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) ncurses-6.4-20240113/man/curs_addch.3x0000644000000000000000000003155314541605207015576 0ustar rootroot'\" t .\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: curs_addch.3x,v 1.76 2023/12/23 16:27:51 tom Exp $ .TH curs_addch 3X 2023-12-23 "ncurses 6.4" "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\%addch\fP, \fB\%waddch\fP, \fB\%mvaddch\fP, \fB\%mvwaddch\fP, \fB\%echochar\fP, \fB\%wechochar\fP \- add a \fIcurses\fR 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 "Adding Characters" The \fBaddch\fP, \fBwaddch\fP, \fBmvaddch\fP and \fBmvwaddch\fP routines put the character \fIch\fP into the given window at its current window position, which is then advanced. They are analogous to the standard C library's \fI\%putchar\fP(3). If the advance is at the right margin: .bP The cursor automatically wraps to the beginning of the next line. .bP At the bottom of the current scrolling region, and if \fB\%scrollok\fP(3X) is enabled, the scrolling region is scrolled up one line. .bP If \fB\%scrollok\fP(3X) is not enabled, writing a character at the lower right margin succeeds. However, an error is returned because it is not possible to wrap to a new line. .PP If \fIch\fP is a tab, newline, carriage return or backspace, the cursor is moved appropriately within the window: .bP Backspace moves the cursor one character left; at the left edge of a window it does nothing. .bP Carriage return moves the cursor to the window left margin on the current line. .bP Newline does a \fBclrtoeol\fP, then moves the cursor to the window left margin on the next line, scrolling the window if on the last line. .bP Tabs are considered to be at every eighth column. The tab interval may be altered by setting the \fBTABSIZE\fP variable. .PP If \fIch\fP is any other nonprintable character, it is drawn in printable form, using the same convention as \fB\%unctrl\fP(3X): .bP Control characters are displayed in the \fB^\fIX\fR notation. .bP Values above 128 are either meta characters (if the screen has not been initialized, or if \fB\%meta\fP(3X) has been called with a \fBTRUE\fP E 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 Calling \fBwinch\fP after adding a nonprintable character does not return the character itself, but instead returns the printable representation of the character. .PP Video attributes can be combined with a character argument passed to \fBaddch\fP or related functions by logical-ORing them into the character. (Thus, text, including attributes, can be copied from one place to another using \fB\%inch\fP(3X) and \fBaddch\fP.) See the \fB\%curs_attr\fP(3X) page for values of predefined video attribute constants that can be usefully OR'ed into characters. .SS "Echoing Characters" The \fBechochar\fP and \fBwechochar\fP routines are equivalent to a call to \fBaddch\fP followed by a call to \fB\%refresh\fP(3X), or a call to \fBwaddch\fP followed by a call to \fBwrefresh\fP. The knowledge that only a single character is being output is used and, for non-control characters, a considerable performance gain may be seen by using these routines instead of their equivalents. .SS "Line Graphics" The following variables may be used to add line drawing characters to the screen with routines of the \fBaddch\fP family. The default character listed below is used if the \fBacsc\fP capability does not define a terminal-specific replacement for it, or if the terminal and locale configuration requires Unicode but the library is unable to use Unicode. .PP The names are taken from VT100 nomenclature. .PP .TS l l l l l l l l _ _ _ _ l l l l. \fBACS\fP \fBACS\fP \fBacsc\fP \fBGlyph\fP \fBName\fP \fBDefault\fP \fBchar\fP \fBName\fP ACS_BLOCK # 0 solid square block ACS_BOARD # h board of squares ACS_BTEE + v bottom tee ACS_BULLET o ~ bullet ACS_CKBOARD : a checker board (stipple) ACS_DARROW v . arrow pointing down ACS_DEGREE ' f degree symbol ACS_DIAMOND + \(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 All routines return the integer \fBERR\fP upon failure and \fBOK\fP on success (the SVr4 manuals specify only \*(``an integer value other than \fBERR\fP\*('') upon successful completion, unless otherwise noted in the preceding routine descriptions. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .PP If it is not possible to add a complete character, an error is returned: .bP If \fB\%scrollok\fP(3X) is not enabled, writing a character at the lower right margin succeeds. However, an error is returned because it is not possible to wrap to a new line. .bP If an error is detected when converting a multibyte character to a sequence of bytes, or if it is not possible to add all of the resulting bytes in the window, an error is returned. .SH NOTES Note that \fBaddch\fP, \fBmvaddch\fP, \fBmvwaddch\fP, and \fBechochar\fP may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. The defaults specified for forms-drawing characters apply in the POSIX locale. .SS "ACS Symbols" X/Open Curses states that the \fBACS_\fP definitions are \fBchar\fP constants. For the wide-character implementation (see \fBcurs_add_wch\fP), there are analogous \fBWACS_\fP definitions which are \fBcchar_t\fP constants. Some implementations are problematic: .bP Some implementations define the ACS symbols to a constant (such as Solaris), while others define those to entries in an array. .IP This implementation uses an array \fBacs_map\fP, as done in SVr4 curses. NetBSD also uses an array, actually named \fB_acs_char\fP, with a \fB#define\fP for compatibility. .bP 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. .bP X/Open Curses (issues 2 through 7) has a typographical error for the ACS_LANTERN symbol, equating its \*(``VT100+ Character\*('' to \fBI\fP (capital I), while the header files for SVr4 curses and the various implementations use \fBi\fP (lowercase). .IP None of the terminal descriptions on Unix platforms use uppercase-I, except for Solaris (i.e., \fBscreen\fP's terminal description, apparently based on the X/Open documentation around 1995). On the other hand, the terminal description \fIgs6300\fP (AT&T PC6300 with EMOTS Terminal Emulator) uses lowercase-i. .LP Some ACS symbols (ACS_S3, ACS_S7, ACS_LEQUAL, ACS_GEQUAL, ACS_PI, ACS_NEQUAL, ACS_STERLING) were not documented in any publicly released System V. However, many publicly available terminfos include \fBacsc\fP strings in which their key characters (pryz{|}) are embedded, and a second-hand list of their character descriptions has come to light. The ACS-prefixed names for them were invented for \fB\%ncurses\fP(3X). .LP The \fIdisplayed\fP values for the \fBACS_\fP and \fBWACS_\fP constants depend on .bP the library configuration, i.e., \fI\%ncurses\fP versus \fI\%ncursesw\fP, where the latter is capable of displaying Unicode while the former is not, and .bP whether the \fIlocale\fP uses UTF-8 encoding. .LP In certain cases, the terminal is unable to display line-drawing characters except by using UTF-8 (see the discussion of \fB\%NCURSES_NO_UTF8_ACS\fP in \fB\%ncurses\fP(3X)). .SS "Character Set" X/Open Curses assumes that the parameter passed to \fBwaddch\fP contains a single character. As discussed in \fB\%curs_attr\fP(3X), that character may have been more than eight bits in an SVr3 or SVr4 implementation, but in the X/Open Curses model, the details are not given. The important distinction between SVr4 curses and X/Open Curses is that the non-character information (attributes and color) was separated from the character information which is packed in a \fBchtype\fP to pass to \fBwaddch\fP. .PP In this implementation, \fBchtype\fP holds an eight-bit character. But \fI\%ncurses\fP allows multibyte characters to be passed in a succession of calls to \fBwaddch\fP. The other implementations do not do this; a call to \fBwaddch\fP passes exactly one character which may be rendered as one or more cells on the screen depending on whether it is printable. .PP Depending on the locale settings, \fI\%ncurses\fP will inspect the byte passed in each call to \fBwaddch\fP, and check if the latest call will continue a multibyte sequence. When a character is \fIcomplete\fP, \fI\%ncurses\fP displays the character and moves to the next position in the screen. .PP If the calling application interrupts the succession of bytes in a multibyte character by moving the current location (e.g., using \fBwmove\fP), \fI\%ncurses\fP discards the partially built character, starting over again. .PP For portability to other implementations, do not rely upon this behavior: .bP check if a character can be represented as a single byte in the current locale before attempting call \fBwaddch\fP, and .bP call \fBwadd_wch\fP for characters which cannot be handled by \fBwaddch\fP. .SS TABSIZE The \fBTABSIZE\fP variable is implemented in SVr4 and other versions of curses, but is not part of X/Open curses (see \fBcurs_variables\fP(3X) for more details). .LP If \fIch\fP is a carriage return, the cursor is moved to the beginning of the current row of the window. This is true of other implementations, but is not documented. .SH SEE ALSO \fB\%curses\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\%putc\fP(3) .PP Comparable functions in the wide-character (ncursesw) library are described in \fB\%curs_add_wch\fP(3X). ncurses-6.4-20240113/man/keybound.3x0000644000000000000000000000650314537404526015322 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.34 2023/12/16 20:32:22 tom Exp $ .TH keybound 3X 2023-12-16 "ncurses 6.4" "Library calls" .SH NAME \fB\%keybound\fP \- get definition of \fIcurses\fR keycode .SH SYNOPSIS .nf \fB#include .PP \fBchar * keybound(int \fIkeycode\fP, int \fIcount\fP); .fi .SH DESCRIPTION This is an extension to the \fIcurses\fP library. It permits an application to determine the string which is defined in the terminfo for specific keycodes. .SH RETURN VALUE The \fIkeycode\fP parameter must be greater than zero, else \fBNULL\fP is returned. If it does not correspond to a defined key, then \fBNULL\fP is returned. The \fIcount\fP parameter is used to allow the application to iterate through multiple definitions, counting from zero. When successful, the function returns a string which must be freed by the caller. .SH PORTABILITY This routine is specific to \fI\%ncurses\fP. It was 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\%define_key\fP(3X), \fB\%keyok\fP(3X) ncurses-6.4-20240113/man/tset.10000644000000000000000000004337014541604267014271 0ustar rootroot.\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: tset.1,v 1.79 2023/12/23 16:20:07 tom Exp $ .TH @TSET@ 1 2023-12-23 "ncurses 6.4" "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 .. . .ds d @TERMINFO@ .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 \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 \*d 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 \fBsetupterm\fP, 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 the terminal description is common to both implementations, but considered obsolescent. Its only practical use is for hardware terminals. Generally speaking, a window size would be unset only if there were some problem obtaining the value from the operating system (and \fBsetupterm\fP would still fail). For that reason, the \fILINES\fP and \fI\%COLUMNS\fP environment variables may be useful for working around window-size problems. Those have the drawback that if the window is resized, those variables must be recomputed and reassigned. To do this more easily, use the \fBresize\fP(1) program. .SH 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) ncurses-6.4-20240113/man/form_driver.3x0000644000000000000000000002376314550604463016024 0ustar rootroot'\" 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.57 2024/01/13 22:05:39 tom Exp $ .TH form_driver 3X 2024-01-13 "ncurses 6.4" "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 \fIwch\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) ncurses-6.4-20240113/man/form_hook.3x0000644000000000000000000001052014546074322015454 0ustar rootroot.\"*************************************************************************** .\" 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.34 2024/01/05 21:46:58 tom Exp $ .TH form_hook 3X 2024-01-05 "ncurses 6.4" "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_init 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) ncurses-6.4-20240113/man/curs_delch.3x0000644000000000000000000000737614537410767015632 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.30 2023/12/16 21:09:11 tom Exp $ .TH curs_delch 3X 2023-12-16 "ncurses 6.4" "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 the character at the cursor in 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 These routines delete the character under the cursor; all characters to the right of the cursor on the same line are moved to the left one position and the last character on the line is filled with a blank. The cursor position does not change (after moving to \fIy\fP, \fIx\fP, if specified). (This does not imply use of the hardware delete character feature.) .SH RETURN VALUE All routines return the integer \fBERR\fP upon failure and an \fBOK\fP (SVr4 specifies only \*(``an integer value other than \fBERR\fP\*('') upon successful completion. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES Note that \fBdelch\fP, \fBmvdelch\fP, and \fBmvwdelch\fP may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. The standard specifies that they return \fBERR\fP on failure, but specifies no error conditions. .SH SEE ALSO \fB\%curses\fP(3X) ncurses-6.4-20240113/man/tabs.10000644000000000000000000002425614541602771014243 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2021,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. * .\"*************************************************************************** .\" .\" $Id: tabs.1,v 1.52 2023/12/23 16:08:25 tom Exp $ .TH @TABS@ 1 2023-12-23 "ncurses 6.4" "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 provide the capability for changing their left/right margins. The @TABS@ program has an option to use this feature: .TP 5 .BI +m \ margin The effect depends on whether the terminal has the margin capabilities: .RS .bP If the terminal provides the capability for setting the left margin, @TABS@ uses this, and adjusts the available width for tab-stops. .bP If the terminal does not provide the margin capabilities, @TABS@ imitates the effect, putting the tab stops at the appropriate place on each line. The terminal's left-margin is not modified. .RE .IP If the \fImargin\fP parameter is omitted, the default is 10. Use \fB+m0\fP to reset the left margin, i.e., to the left edge of the terminal's display. Before setting a left-margin, @TABS@ resets the margin to reduce problems which might arise on moving the cursor before the current left-margin. .PP When setting or resetting the left-margin, @TABS@ may reset the right-margin. .SH FILES .TP .I @DATADIR@/tabset tab stop initialization database .SH PORTABILITY \fIIEEE Std 1003.1/The Open Group Base Specifications Issue 7\fP (POSIX.1-2008) describes a \fBtabs\fP utility. However .bP This standard describes a \fB+m\fP option, to set a terminal's left-margin. Very few of the entries in the terminal database provide the \fBsmgl\fP (\fBset_left_margin\fP) or \fBsmglp\fP (\fBset_left_margin_parm\fP) capability needed to support the feature. .bP There is no counterpart in X/Open Curses Issue 7 for this utility, unlike \fB@TPUT@\fP(1). .PP The \fB\-d\fP (debug) and \fB\-n\fP (no-op) options are extensions not provided by other implementations. .SH HISTORY A \fBtabs\fP 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 a \*(``\-n\*('' option to set the first tab stop at the left margin. That option is not documented by POSIX. .PP The PWB/Unix \fBtabs\fP utility returned in System III (1980), and used built-in tables rather than the terminal database, to support a half-dozen hardcopy terminal (printer) types. It also had built-in logic to support 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. In an earlier development effort, the tab stop initialization provided by \fBtset\fP(1) (1982), and incorporated into \fBtput\fP(1) uses the terminal database, .PP The \fB+m\fP 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 \fI\*(``and optionally adjusts the margin\*(''\fP remains, overlooked in the removal. The \fBtabs\fP utility documented in Issues 6 and later has no mechanism for setting margins. The \fB+m\fP option in .I \%ncurses \fBtabs\fP 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 \fBtabs\fP utility. While some terminals may not accept an arbitrary number of tab stops, .I \%ncurses \fBtabs\fP 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 \fBtabs\fP reference page .\" https://pubs.opengroup.org/onlinepubs/009604499/utilities/tabs.html details how the committee considered redesigning the \fBtabs\fP and \fBtput\fP utilities, without settling on an improved solution. It claims that .RS 5 .PP no known historical version of tabs supports the capability of setting arbitrary tab stops. .RE .PP Nevertheless, the feature described in subsection \*(``Explicit Lists\*('' above was implemented in PWB/Unix, and permits the setting of abitrary tab stops. .SH SEE ALSO \fB\%@INFOCMP@\fP(1M), \fB\%@TSET@\fP(1), \fB\%curses\fP(3X), \fB\%terminfo\fP(5) ncurses-6.4-20240113/man/curs_clear.3x0000644000000000000000000001270314546074322015620 0ustar rootroot.\"*************************************************************************** .\" 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.44 2024/01/05 21:46:58 tom Exp $ .TH curs_clear 3X 2024-01-05 "ncurses 6.4" "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 an error if it is null .bP \fBwclrtoeol\fP returns an error if the cursor position is about to wrap. .SH NOTES Note that \fBerase\fP, \fBwerase\fP, \fBclear\fP, \fBwclear\fP, \fBclrtobot\fP, and \fBclrtoeol\fP may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. .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) ncurses-6.4-20240113/man/form_field_userptr.3x0000644000000000000000000000644614530376627017405 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.28 2023/11/25 13:58:47 tom Exp $ .TH form_field_userptr 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_printw.3x0000644000000000000000000001601614541570603016054 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.47 2023/12/23 14:41:07 tom Exp $ .TH curs_printw 3X 2023-12-23 "ncurses 6.4" "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 .I \%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 with a \*(``mv\*('' prefix first perform a cursor movement using \fB\%wmove\fP, and fail if the position is outside the window. .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 .I 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) ncurses-6.4-20240113/man/legacy_coding.3x0000644000000000000000000000733514537404526016275 0ustar rootroot.\"*************************************************************************** .\" Copyright 2020-2022,2023 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.24 2023/12/16 20:32:22 tom Exp $ .TH legacy_coding 3X 2023-12-16 "ncurses 6.4" "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 The \fBuse_legacy_coding\fP function is an extension to the curses library. It allows the caller to change the result of \fBunctrl\fP, and suppress related checks within the library that would normally cause nonprinting characters to be rendered in visible form. This affects only 8-bit characters. .PP The \fIlevel\fP parameter controls the result: .RS .TP 5 0 the library functions normally, rendering nonprinting characters as described in \fBunctrl\fP. .TP 1 the library ignores \fBisprintf\fP for codes in the range 160-255. .TP 2 the library ignores \fBisprintf\fP for codes in the range 128-255. It also modifies the output of \fBunctrl\fP, showing codes in the range 128-159 as is. .RE .SH RETURN VALUE If the screen has not been initialized, or the \fIlevel\fP parameter is out of range, the function returns \fBERR\fP. Otherwise, it returns the previous level: \fB0\fP, \fB1\fP or \fB2\fP. .SH PORTABILITY This routine is specific to \fI\%ncurses\fP. It was 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 NCURSES_VERSION. .SH AUTHORS Thomas Dickey (to support lynx's font-switching feature). .SH SEE ALSO \fB\%unctrl\fP(3X) ncurses-6.4-20240113/man/manlinks.sed0000644000000000000000000001046114501534071015523 0ustar rootroot# $Id: manlinks.sed,v 1.19 2023/09/17 08:26:33 tom Exp $ ############################################################################## # Copyright 2020-2021,2023 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 # # 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/{ /^[^(]*$/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 ncurses-6.4-20240113/man/curs_refresh.3x0000644000000000000000000001523014546074322016166 0ustar rootroot.\"*************************************************************************** .\" 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.42 2024/01/05 21:46:58 tom Exp $ .TH curs_refresh 3X 2024-01-05 "ncurses 6.4" "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 X/Open does not define any error conditions. In this implementation .RS 3 .TP 5 \fBwnoutrefresh\fP returns an error if the window pointer is null, or if the window is really a pad. .TP 5 \fBwredrawln\fP returns an error if the associated call to \fBtouchln\fP returns an error. .RE .SH NOTES Note that \fBrefresh\fP and \fBredrawwin\fP may be macros. .SH PORTABILITY The XSI Curses standard, Issue 4 describes these functions. .PP Whether \fBwnoutrefresh\fP copies to the virtual screen the entire contents of a window or just its changed portions has never been well-documented in historic curses versions (including SVr4). It might be unwise to rely on either behavior in programs that might have to be linked with other curses implementations. Instead, you can do an explicit \fBtouchwin\fP before the \fBwnoutrefresh\fP call to guarantee an entire-contents copy anywhere. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_outopts\fP(3X) \fB\%curs_variables\fP(3X) ncurses-6.4-20240113/man/menu_attributes.3x0000644000000000000000000001111414530376627016711 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.34 2023/11/25 13:58:47 tom Exp $ .TH menu_attributes 3X 2023-11-25 "ncurses 6.4" "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. ncurses-6.4-20240113/man/toe.1m0000644000000000000000000001650014550604463014247 0ustar rootroot'\" 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.62 2024/01/13 22:05:39 tom Exp $ .TH @TOE@ 1M 2024-01-13 "ncurses 6.4" "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 .. .ds d @TERMINFO@ .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 the \fB\-s\fP option is also given, \fB\%@TOE@\fP adds a column to the report, showing (like \fB\%conflict\fP(1)) which entries belong 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 \*d 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)' .TS Lf(\*(CW)2 Lf(\*(CW). 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 .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))' .TS lf(\*(CW). \-\-> /etc/terminfo \-\-\-\-> /lib/terminfo \-\-\-\-\-\-> /usr/share/terminfo .TE .TS lf(\*(CW)1 lf(\*(CW)2 lf(\*(CW). \-\-*\-\-\-: 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 .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) ncurses-6.4-20240113/man/curs_sp_funcs.3x0000644000000000000000000003304114541605035016344 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.46 2023/12/23 16:26:05 tom Exp $ .TH curs_sp_funcs 3X 2023-12-23 "ncurses 6.4" "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 *\fIch\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 \fIch\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 *\fIch\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 \fIwch\fP); \fBint ungetch_sp(SCREEN* \fIsp\fP, int \fIch\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 *\fIch\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 \fIc\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) ncurses-6.4-20240113/man/curs_get_wstr.3x0000644000000000000000000001751714537404526016403 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.42 2023/12/16 20:32:22 tom Exp $ .TH curs_get_wstr 3X 2023-12-16 "ncurses 6.4" "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 getn_wstr(wint_t *\fIwstr\fP, int \fIn\fP); \fBint wget_wstr(WINDOW *\fIwin\fP, wint_t *\fIwstr\fP); \fBint wgetn_wstr(WINDOW *\fIwin\fP, wint_t *\fIwstr\fP, int \fIn\fP); .PP \fBint mvget_wstr(int \fIy\fP, int \fIx\fP, wint_t *\fIwstr\fP); \fBint mvgetn_wstr(int \fIy\fP, int \fIx\fP, wint_t *\fIwstr\fP, int \fIn\fP); \fBint mvwget_wstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, wint_t *\fIwstr\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 an error .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 with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES 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 These functions are described in The Single Unix Specification, Version 2. No error conditions are defined. .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\%curses\fP(3X), \fB\%curs_getstr\fP(3X), \fB\%curs_get_wch\fP(3X) ncurses-6.4-20240113/man/man_db.renames.in0000644000000000000000000002356314546074322016431 0ustar rootroot############################################################################## # 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.69 2024/01/05 21:46:58 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 bkgd.3x bkgd.3ncurses bkgrnd.3x bkgrnd.3ncurses clearok.3x clearok.3ncurses curs_set.3x curs_set.3ncurses curscr.3x curscr.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 endwin.3x endwin.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 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_scrollok.3x is_scrollok.3ncurses keyname.3x keyname.3ncurses keypad.3x keypad.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 nodelay.3x nodelay.3ncurses notimeout.3x notimeout.3ncurses putwin.3x putwin.3ncurses refresh.3x refresh.3ncurses reset_shell_mode.3x reset_shell_mode.3ncurses restartterm.3x restartterm.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 tigetstr.3x tigetstr.3ncurses tparm.3x tparm.3ncurses tputs.3x tputs.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 vidputs.3x vidputs.3ncurses wadd_wch.3x wadd_wch.3ncurses waddch.3x waddch.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 wget_wch.3x wget_wch.3ncurses wgetch.3x wgetch.3ncurses wgetstr.3x wgetstr.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 # # 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 ncurses-6.4-20240113/man/curs_beep.3x0000644000000000000000000000647014510345513015443 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2021,2023 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.25 2023/10/07 21:19:07 tom Exp $ .TH curs_beep 3X 2023-10-07 "ncurses 6.4" "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 The \fBbeep\fP and \fBflash\fP routines are used to alert the terminal user. The routine \fBbeep\fP sounds an audible alarm on the terminal, if possible; otherwise it flashes the screen (visible bell). The routine \fBflash\fP flashes the screen, and if that is not possible, sounds the alert. If neither alert is possible, nothing happens. Nearly all terminals have an audible alert (bell or beep), but only some can flash the screen. .SH RETURN VALUE These routines return \fBOK\fP if they succeed in beeping or flashing, \fBERR\fP otherwise. .SH EXTENSIONS SVr4's beep and flash routines always returned \fBOK\fP, so it was not possible to tell when the beep or flash failed. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. Like SVr4, it specifies that they always return \fBOK\fP. .SH SEE ALSO \fB\%curses\fP(3X) ncurses-6.4-20240113/man/infocmp.1m0000644000000000000000000005442114550604463015117 0ustar rootroot'\" 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.107 2024/01/13 22:05:39 tom Exp $ .TH @INFOCMP@ 1M 2024-01-13 "ncurses 6.4" "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 .. . .ds d @TERMINFO@ .SH NAME \fB@INFOCMP@\fP \- compare or print out \fIterminfo\fP descriptions .SH SYNOPSIS \fB@INFOCMP@\fP [\fB\-\ 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\ \fP] [\fB\-v\fR \fIn\fR] [\fB\-s d\fR| \fBi\fR| \fBl\fR| \fBc\fR] [\fB\-Q\fR \fIn\fR] [\fB\-R \fBsubset\fR] [\fB\-w\fP\ \fIwidth\fP] [\fB\-A\fP\ \fIdirectory\fP] [\fB\-B\fP\ \fIdirectory\fP] [\fIterminal-type\fP ...] .SH DESCRIPTION \fB@INFOCMP@\fP can be used to compare a binary \fBterminfo\fP entry with other terminfo entries, rewrite a \fBterminfo\fP description to take advantage of the \fBuse=\fP terminfo field, or print out a \fBterminfo\fP description from the binary file (\fBterm\fP) in a variety of formats. In all cases, the Boolean fields will be printed first, followed by the numeric fields, followed by the string fields. .SS "Default Options" If no options are specified and zero or one \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 \fIcancelled\fP capabilities. .PP These options produce a list which you can use to compare two or more terminal descriptions: .TP 5 \fB\-d\fP produces a list of each capability that is \fIdifferent\fP between two entries. Each item in the list shows \*(``:\*('' after the capability name, followed by the capability values, separated by a comma. .TP \fB\-c\fP produces a list of each capability that is \fIcommon\fP between two or more entries. Missing capabilities are ignored. Each item in the list shows \*(``=\*('' after the capability name, followed by the capability value. .IP The \fB\-u\fP option provides a related output, showing the first terminal description rewritten to use the second as a building block via the \*(``use=\*('' clause. .TP \fB\-n\fP produces a list of each capability that is in \fInone\fP of the given entries. Each item in the list shows \*(``!\*('' before the capability name. .IP Normally only the conventional capabilities are shown. Use the \fB\-x\fP option to add the BSD-compatibility capabilities (names prefixed with \*(``OT\*(''). .IP If no \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 \fIdirectory\fR] [\-B \fIdirectory\fR]" 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 cancelled capabilities. .bP Omit the \*(``Reconstructed from\*('' comment for source listings. .RE .TP 5 \fB\-R\fIsubset\fR Restrict output to a given subset. This option is for use with archaic versions of terminfo like those on SVr1, Ultrix, or HP-UX that do not support the full set of SVR4/XSI Curses terminfo; and variants such as AIX that have their own extensions incompatible with SVr4/XSI. .RS .bP Available terminfo subsets are \*(``SVr1\*('', \*(``Ultrix\*('', \*(``HP\*('', and \*(``AIX\*(''; see \fBterminfo\fP(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 \*d compiled terminal description database .SH EXTENSIONS The \fB\-0\fP, \fB\-1\fP, \fB\-E\fP, \fB\-F\fP, \fB\-G\fP, \fB\-Q\fP, \fB\-R\fP, \fB\-T\fP, \fB\-V\fP, \fB\-a\fP, \fB\-e\fP, \fB\-f\fP, \fB\-g\fP, \fB\-i\fP, \fB\-l\fP, \fB\-p\fP, \fB\-q\fP and \fB\-t\fP options are not supported in SVr4 curses. .PP SVr4 infocmp does not distinguish between absent and cancelled capabilities. Also, it shows missing integer capabilities as \fB\-1\fP (the internal value used to represent missing integers). This implementation shows those as \*(``NULL\*('', for consistency with missing strings. .PP The \fB\-r\fP option's notion of \*(``termcap\*('' capabilities is System V Release 4's. Actual BSD curses versions will have a more restricted set. To see only the 4.4BSD set, use \fB\-r\fP \fB\-RBSD\fP. .SH PORTABILITY X/Open Curses, Issue 7 (2009) provides a description of \fBinfocmp\fP. It does not mention the options used for converting to termcap format. .SH 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 ncurses-6.4-20240113/man/curs_pad.3x0000644000000000000000000002375314546074322015305 0ustar rootroot.\"*************************************************************************** .\" 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.53 2024/01/05 21:46:58 tom Exp $ .TH curs_pad 3X 2024-01-05 "ncurses 6.4" "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 *\fIorig\fP, int \fInlines\fP, int \fIncols\fP, \fBint \fIbegin_y\fB, int \fIbegin_x\fB);\fR \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 \fBint pechochar(WINDOW *\fIpad\fB, chtype \fIch\fB);\fR \fBint pecho_wchar(WINDOW *\fIpad\fB, const cchar_t *\fIwch\fB);\fR .fi .SH DESCRIPTION .SS newpad \fB\%newpad\fP creates and returns a pointer to a new pad data structure with the given number of lines, \fInlines\fP, and columns, \fIncols\fP. A pad is like a window, except that it is not restricted by the screen size, and is not necessarily associated with a particular part of the screen. Pads can be used when a large window is needed, and only a part of the window will be on the screen at one time. Automatic refreshes of pads (as from scrolling or echoing of input) do not occur. .PP It is not valid to call \fB\%wrefresh\fP with a \fIpad\fP argument; call \fB\%prefresh\fP or \fB\%pnoutrefresh\fP instead. They require additional parameters to specify the part of the pad to be displayed and the location on the screen to be used for the display. .SS subpad The \fB\%subpad\fP routine creates and returns a pointer to a subwindow within a pad with the given number of lines, \fInlines\fP, and columns, \fIncols\fP. Unlike \fB\%subwin\fP, which uses screen coordinates, the window is at position (\fIbegin\fR_\fIx\fB,\fR \fIbegin\fR_\fIy\fR) on the pad. The window is made in the middle of the window \fIorig\fP, so that changes made to one window affect both windows. During the use of this routine, it will often be necessary to call \fB\%touchwin\fP or \fB\%touchline\fP on \fIorig\fP before calling \fB\%prefresh\fP. .SS "prefresh, pnoutrefresh" The \fB\%prefresh\fP and \fB\%pnoutrefresh\fP routines are analogous to \fB\%wrefresh\fP and \fB\%wnoutrefresh\fP except that they relate to pads instead of windows. The additional parameters are needed to indicate what part of the pad and screen are involved. .bP The \fIpminrow\fP and \fIpmincol\fP parameters specify the upper left-hand corner of the rectangle to be displayed in the pad. .bP The \fIsminrow\fP, \fIsmincol\fP, \fIsmaxrow\fP, and \fIsmaxcol\fP parameters specify the edges of the rectangle to be displayed on the screen. .PP The lower right-hand corner of the rectangle to be displayed in the pad is calculated from the screen coordinates, since the rectangles must be the same size. Both rectangles must be entirely contained within their respective structures. Negative values of \fIpminrow\fP, \fIpmincol\fP, \fIsminrow\fP, or \fIsmincol\fP are treated as if they were zero. .SS pechochar The \fB\%pechochar\fP routine is functionally equivalent to a call to \fB\%addch\fP followed by a call to \fB\%refresh\fP(3X), a call to \fB\%waddch\fP followed by a call to \fB\%wrefresh\fP, or a call to \fB\%waddch\fP followed by a call to \fB\%prefresh\fP. The knowledge that only a single character is being output is taken into consideration and, for non-control characters, a considerable performance gain might be seen by using these routines instead of their equivalents. In the case of \fB\%pechochar\fP, the last location of the pad on the screen is reused for the arguments to \fB\%prefresh\fP. .SS pecho_wchar The \fB\%pecho_wchar\fP function is the analogous wide-character form of \fB\%pechochar\fP. It outputs one character to a pad and immediately refreshes the pad. It does this by a call to \fB\%wadd_wch\fP followed by a call to \fB\%prefresh\fP. .SH RETURN VALUE Functions 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 Functions that return pointers return \fBNULL\fP on error, and set \fB\%errno\fP to \fB\%ENOMEM\fP. .PP X/Open Curses does not define any error conditions. In this implementation .RS 3 .TP 5 \fB\%prefresh\fP and \fB\%pnoutrefresh\fP return an error if the window pointer is null, or if the window is not really a pad or if the area to refresh extends off-screen or if the minimum coordinates are greater than the maximum. .TP 5 \fBpechochar\fP returns an error if the window is not really a pad, and the associated call to \fB\%wechochar\fP returns an error. .TP 5 \fBpecho_wchar\fP returns an error if the window is not really a pad, and the associated call to \fB\%wecho_wchar\fP returns an error. .RE .SH NOTES \fB\%pechochar\fP may be a macro. .SH PORTABILITY BSD \fIcurses\fP has no \fIpad\fP 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 The XSI Curses standard, Issue 4 describes these functions, without significant change from the SVr3 documentation. It describes no error conditions. 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) ncurses-6.4-20240113/man/ncurses.3x0000644000000000000000000016524114550571357015173 0ustar rootroot'\" 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.197 2024/01/13 20:30:39 tom Exp $ .TH ncurses 3X 2024-01-13 "ncurses 6.4" "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 .. . .ds d @TERMINFO@ .SH NAME \fB\%ncurses\fP \- character-cell terminal interface with optimized output .SH SYNOPSIS .nf \fB#include .fi .SH DESCRIPTION The \fI\%ncurses\fP library routines give the user a terminal-independent method of updating character screens with reasonable optimization. This implementation is \*(``new curses\*('' (\fI\%ncurses\fP) and is the approved replacement for 4.4BSD classic curses, which has been discontinued. This describes \fI\%ncurses\fP version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@). .PP The \fI\%ncurses\fP library emulates the curses library of System V Release 4 Unix (\*(``SVr4\*(''), and XPG4 (X/Open Portability Guide) curses (also known as XSI curses). XSI stands for X/Open System Interfaces Extension. The \fI\%ncurses\fP library is freely redistributable in source form. .PP \fI\%ncurses\fP man pages employ several sections to clarify matters of usage and interoperability with other \fIcurses\fP implementations. .bP \*(``NOTES\*('' describes matters and caveats of which any user of the \fI\%ncurses\fP 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 that will be significant to the programmer but which are not standardized. .bP \*(``EXTENSIONS\*('' presents \fI\%ncurses\fP innovations beyond the X/Open Curses standard and/or the SVr4 \fIcurses\fP implementation. They are termed \fIextensions\fP 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 \fIcurses\fP standard, or to multiple implementations. .bP \*(``HISTORY\*('' examines points of detail in \fI\%ncurses\fP and other \fIcurses\fP 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 program using these routines must be linked with the \fB\-lncurses\fP option, or (if it has been generated) with the debugging library \fB\-lncurses_g\fP. (Your system integrator may also have installed these libraries under the names \fB\-lcurses\fP and \fB\-lcurses_g\fP.) The ncurses_g library generates trace logs (in a file called \*(``trace\*('' in the current directory) that describe curses actions. See section \*(``ALTERNATE CONFIGURATIONS\*('' below. .PP The \fI\%ncurses\fP package supports: overall screen, window and pad manipulation; output to windows and pads; reading terminal input; control over terminal and \fBcurses\fP input and output options; environment query routines; color manipulation; use of soft label keys; terminfo capabilities; and access to low-level terminal-manipulation routines. .SS Initialization The library uses the locale which the calling program has initialized. That is normally done with \fBsetlocale\fP(3): .PP .RS 4 .EX \fBsetlocale(LC_ALL, "");\fP .EE .RE .PP If the locale is not initialized, the library assumes that characters are printable as in ISO\-8859\-1, to work with certain legacy programs. You should initialize the locale and not rely on specific details of the library when the locale has not been setup. .PP The function \fBinitscr\fP or \fBnewterm\fP must be called to initialize the library before any of the other routines that deal with windows and screens are used. The routine \fBendwin\fP(3X) must be called before exiting. .PP To get character-at-a-time input without echoing (most interactive, screen oriented programs want this), the following sequence should be used: .PP .RS 4 .EX \fBinitscr(); cbreak(); noecho();\fP .EE .RE .PP Most programs would additionally use the sequence: .PP .RS 4 .EX \fBintrflush(stdscr, FALSE);\fP \fBkeypad(stdscr, TRUE);\fP .EE .RE .PP Before a \fBcurses\fP program is run, the tab stops of the terminal should be set and its initialization strings, if defined, must be output. This can be done by executing the \fB@TPUT@ init\fP command after the shell environment variable \fITERM\fP has been exported. (The BSD-style \fB\%@TSET@\fP(1) utility also performs this function.) See subsection \*(``Tabs and Initialization\*('' of \fBterminfo\fP(5). .SS Overview A .I curses library abstracts the terminal screen by representing all or part of it as a .I \%WINDOW data structure. A .I window is a rectangular grid of character cells, addressed by row and column coordinates .RI ( y , .IR x ), with the upper left corner as (0, 0). A window called \fB\%stdscr\fP, 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. (See \fBpanel\fP(3X) if you desire this.) You can either use \fB\%stdscr\fP to manage one screen-filling window, or tile the screen into non-overlapping windows and not use \fB\%stdscr\fP 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 output operation will occur. Among those, the most basic are \fBmove\fP(3X) and \fB\%addch\fP(3X): these place the cursor and write a character to .BR \%stdscr , respectively. As a rule, window-addressing functions feature names prefixed (or infixed, see below) with \*(``w\*(''; these allow the user to specify a pointer to a .I \%WINDOW. Counterparts not thus prefixed (or infixed) affect \fB\%stdscr\fP. Because moving the cursor prior to another operation is so common, .I curses generally also provides functions with a \*(``mv\*('' prefix as a convenience. Thus, the library defines all of \fB\%addch\fP, \fB\%waddch\fP, \fB\%mvaddch\fP, and \fB\%mvwaddch\fP. When both prefixes are present, the order of arguments is a .I \%WINDOW pointer first, then a .I y and .I x coordinate pair. .PP Updating the terminal screen with every .I curses call can cause unpleasant flicker or inefficient use of the communications channel to the device. 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. .I \%ncurses .\" 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 number 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 \fIpads\fP may also be manipulated. These are windows that are not constrained to the size of the terminal screen and whose contents need not be completely displayed. See \fB\%curs_pad\fP(3X). .PP In addition to drawing characters on the screen, rendering attributes and colors may be supported, causing the characters to show up in such modes as underlined, in reverse video, or in color on terminals that support such display enhancements. See \fB\%curs_attr\fP(3X). .PP .I curses predefines constants for a small set of line-drawing and other graphics corresponding to the DEC Alternate Character Set (ACS), a feature of VT100 and other terminals. See \fB\%waddch\fP(3X) and \fB\%wadd_wch\fP(3X). .PP .I curses is implemented using the operating system's terminal driver; keystroke events are received not as scan codes but as byte sequences. Graphical keycaps (alphanumeric and punctuation keys, and the space) appear as-is. Everything else, including the tab, enter/return, keypad, arrow, and function keys, appears as a control character or a multibyte .I "escape sequence." .I curses translates these into unique .I "key codes." See \fB\%getch\fP(3X). .SS "Effects of GUIs and Environment Variables" 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 the environment variables \fILINES\fP and \fI\%COLUMNS\fP 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 \fI\%TERMINFO\fP is defined, a .I curses program checks first for a terminal type description in the location it identifies. .I \%TERMINFO is useful for developing experimental type descriptions or when write permission to \fI\*d\fP is not available. .PP See section \*(``ENVIRONMENT\*('' below. .SS "Naming Conventions" Many .I curses functions have two or more versions. Those prefixed with \*(``w\*('' require a window argument. Four functions prefixed with \*(``p\*('' require a pad argument. Those without a prefix generally operate on \fB\%stdscr\fP. .PP In function synopses, .I \%ncurses man pages apply the following names to parameters. .PP .TS center; Li L. bf \fIbool\fP (\fBTRUE\fP or \fBFALSE\fP) win pointer to \fIWINDOW\fP pad pointer to \fIWINDOW\fP that is a pad .TE .SS "Wide and Non-wide Character Configurations" This manual page describes 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 in a .I \%chtype datum, which is often an alias of .I int. .IP Attributes alone (with no corresponding character) can be stored in variables of .I \%chtype or .I \%attr_t type. In either case, they are represented as an integral bit mask. .IP Each cell of a .I \%WINDOW is stored as a .I \%chtype. .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 adds about one third more calls using additional data types that can store such .I multibyte characters. .RS 10 \" same as foregoing tag width .TP 9 \" "cchar_t" + 2n .I \%cchar_t corresponds to the non-wide configuration's .I \%chtype. It always a structure type, because it stores more data than fits into an integral type. A character code may not be representable as a .I \%char, and moreover more than one character may occupy a cell (as with accent marks and other diacritics). Each character is of type .I \%wchar_t; a complex character contains one spacing character and zero or more non-spacing characters (see below). Attributes and color data are stored in separate fields of the structure, not combined as in .I \%chtype. .PP Each cell of a .I \%WINDOW is stored as a .I \%cchar_t. .PP The \fB\%setcchar\fP(3X) and \fB\%getcchar\fP(3X) functions store and retrieve the data from a .I \%cchar_t structure. 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 .I \%chtype, it may be an alias of .I int. Depending on the character encoding, a wide character may be .I spacing, meaning that it occupies a character cell by itself and typically accompanies cursor advancement, or .I 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 .BR \%WEOF , analogously to the .IR int -sized character manipulation functions of ISO C and its constant .BR \%EOF . .RE .IP The wide library 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. .IP This convention is inapplicable to some non-wide function names, so other transformations are used for the wide configuration: in the window background management functions, \*(``bkgd\*('' becomes \*(``bkgrnd\*(''; the window border-drawing and -clearing functions are suffixed with \*(``_set\*(''. .\" .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_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_terminfo\fP(3X) mvdelch/\fBcurs_delch\fP(3X) mvderwin/\fBcurs_window\fP(3X) mvget_wch/\fBcurs_get_wch\fP(3X) mvget_wstr/\fBcurs_get_wstr\fP(3X) mvgetch/\fBcurs_getch\fP(3X) mvgetn_wstr/\fBcurs_get_wstr\fP(3X) mvgetnstr/\fBcurs_getstr\fP(3X) mvgetstr/\fBcurs_getstr\fP(3X) mvhline/\fBcurs_border\fP(3X) mvhline_set/\fBcurs_border_set\fP(3X) mvin_wch/\fBcurs_in_wch\fP(3X) mvin_wchnstr/\fBcurs_in_wchstr\fP(3X) mvin_wchstr/\fBcurs_in_wchstr\fP(3X) mvinch/\fBcurs_inch\fP(3X) mvinchnstr/\fBcurs_inchstr\fP(3X) mvinchstr/\fBcurs_inchstr\fP(3X) mvinnstr/\fBcurs_instr\fP(3X) mvinnwstr/\fBcurs_inwstr\fP(3X) mvins_nwstr/\fBcurs_ins_wstr\fP(3X) mvins_wch/\fBcurs_ins_wch\fP(3X) mvins_wstr/\fBcurs_ins_wstr\fP(3X) mvinsch/\fBcurs_insch\fP(3X) mvinsnstr/\fBcurs_insstr\fP(3X) mvinsstr/\fBcurs_insstr\fP(3X) mvinstr/\fBcurs_instr\fP(3X) mvinwstr/\fBcurs_inwstr\fP(3X) mvprintw/\fBcurs_printw\fP(3X) mvscanw/\fBcurs_scanw\fP(3X) mvvline/\fBcurs_border\fP(3X) mvvline_set/\fBcurs_border_set\fP(3X) mvwadd_wch/\fBcurs_add_wch\fP(3X) mvwadd_wchnstr/\fBcurs_add_wchstr\fP(3X) mvwadd_wchstr/\fBcurs_add_wchstr\fP(3X) mvwaddch/\fBcurs_addch\fP(3X) mvwaddchnstr/\fBcurs_addchstr\fP(3X) mvwaddchstr/\fBcurs_addchstr\fP(3X) mvwaddnstr/\fBcurs_addstr\fP(3X) mvwaddnwstr/\fBcurs_addwstr\fP(3X) mvwaddstr/\fBcurs_addstr\fP(3X) mvwaddwstr/\fBcurs_addwstr\fP(3X) mvwchgat/\fBcurs_attr\fP(3X) mvwdelch/\fBcurs_delch\fP(3X) mvwget_wch/\fBcurs_get_wch\fP(3X) mvwget_wstr/\fBcurs_get_wstr\fP(3X) mvwgetch/\fBcurs_getch\fP(3X) mvwgetn_wstr/\fBcurs_get_wstr\fP(3X) mvwgetnstr/\fBcurs_getstr\fP(3X) mvwgetstr/\fBcurs_getstr\fP(3X) mvwhline/\fBcurs_border\fP(3X) mvwhline_set/\fBcurs_border_set\fP(3X) mvwin/\fBcurs_window\fP(3X) mvwin_wch/\fBcurs_in_wch\fP(3X) mvwin_wchnstr/\fBcurs_in_wchstr\fP(3X) mvwin_wchstr/\fBcurs_in_wchstr\fP(3X) mvwinch/\fBcurs_inch\fP(3X) mvwinchnstr/\fBcurs_inchstr\fP(3X) mvwinchstr/\fBcurs_inchstr\fP(3X) mvwinnstr/\fBcurs_instr\fP(3X) mvwinnwstr/\fBcurs_inwstr\fP(3X) mvwins_nwstr/\fBcurs_ins_wstr\fP(3X) mvwins_wch/\fBcurs_ins_wch\fP(3X) mvwins_wstr/\fBcurs_ins_wstr\fP(3X) mvwinsch/\fBcurs_insch\fP(3X) mvwinsnstr/\fBcurs_insstr\fP(3X) mvwinsstr/\fBcurs_insstr\fP(3X) mvwinstr/\fBcurs_instr\fP(3X) mvwinwstr/\fBcurs_inwstr\fP(3X) mvwprintw/\fBcurs_printw\fP(3X) mvwscanw/\fBcurs_scanw\fP(3X) mvwvline/\fBcurs_border\fP(3X) mvwvline_set/\fBcurs_border_set\fP(3X) napms/\fBcurs_kernel\fP(3X) newpad/\fBcurs_pad\fP(3X) newterm/\fBcurs_initscr\fP(3X) newwin/\fBcurs_window\fP(3X) nl/\fBcurs_inopts\fP(3X) nocbreak/\fBcurs_inopts\fP(3X) nodelay/\fBcurs_inopts\fP(3X) noecho/\fBcurs_inopts\fP(3X) nofilter/\fBcurs_util\fP(3X)* nonl/\fBcurs_inopts\fP(3X) noqiflush/\fBcurs_inopts\fP(3X) noraw/\fBcurs_inopts\fP(3X) notimeout/\fBcurs_inopts\fP(3X) overlay/\fBcurs_overlay\fP(3X) overwrite/\fBcurs_overlay\fP(3X) pair_content/\fBcurs_color\fP(3X) pecho_wchar/\fBcurs_pad\fP(3X) pechochar/\fBcurs_pad\fP(3X) pnoutrefresh/\fBcurs_pad\fP(3X) prefresh/\fBcurs_pad\fP(3X) printw/\fBcurs_printw\fP(3X) putp/\fBcurs_terminfo\fP(3X) putwin/\fBcurs_util\fP(3X) qiflush/\fBcurs_inopts\fP(3X) raw/\fBcurs_inopts\fP(3X) redrawwin/\fBcurs_refresh\fP(3X) refresh/\fBcurs_refresh\fP(3X) reset_color_pairs/\fBcurs_color\fP(3X)* reset_prog_mode/\fBcurs_kernel\fP(3X) reset_shell_mode/\fBcurs_kernel\fP(3X) resetty/\fBcurs_kernel\fP(3X) resize_term/\fBresizeterm\fP(3X)* resizeterm/\fBresizeterm\fP(3X)* restartterm/\fBcurs_terminfo\fP(3X) ripoffline/\fBcurs_kernel\fP(3X) savetty/\fBcurs_kernel\fP(3X) scanw/\fBcurs_scanw\fP(3X) scr_dump/\fBcurs_scr_dump\fP(3X) scr_init/\fBcurs_scr_dump\fP(3X) scr_restore/\fBcurs_scr_dump\fP(3X) scr_set/\fBcurs_scr_dump\fP(3X) scrl/\fBcurs_scroll\fP(3X) scroll/\fBcurs_scroll\fP(3X) scrollok/\fBcurs_outopts\fP(3X) set_curterm/\fBcurs_terminfo\fP(3X) set_term/\fBcurs_initscr\fP(3X) setcchar/\fBcurs_getcchar\fP(3X) setscrreg/\fBcurs_outopts\fP(3X) setsyx/\fBcurs_kernel\fP(3X) setupterm/\fBcurs_terminfo\fP(3X) slk_attr/\fBcurs_slk\fP(3X)* slk_attr_off/\fBcurs_slk\fP(3X) slk_attr_on/\fBcurs_slk\fP(3X) slk_attr_set/\fBcurs_slk\fP(3X) slk_attroff/\fBcurs_slk\fP(3X) slk_attron/\fBcurs_slk\fP(3X) slk_attrset/\fBcurs_slk\fP(3X) slk_clear/\fBcurs_slk\fP(3X) slk_color/\fBcurs_slk\fP(3X) slk_init/\fBcurs_slk\fP(3X) slk_label/\fBcurs_slk\fP(3X) slk_noutrefresh/\fBcurs_slk\fP(3X) slk_refresh/\fBcurs_slk\fP(3X) slk_restore/\fBcurs_slk\fP(3X) slk_set/\fBcurs_slk\fP(3X) slk_touch/\fBcurs_slk\fP(3X) slk_wset/\fBcurs_slk\fP(3X) standend/\fBcurs_attr\fP(3X) standout/\fBcurs_attr\fP(3X) start_color/\fBcurs_color\fP(3X) subpad/\fBcurs_pad\fP(3X) subwin/\fBcurs_window\fP(3X) syncok/\fBcurs_window\fP(3X) term_attrs/\fBcurs_termattrs\fP(3X) termattrs/\fBcurs_termattrs\fP(3X) termname/\fBcurs_termattrs\fP(3X) tgetent/\fBcurs_termcap\fP(3X) tgetflag/\fBcurs_termcap\fP(3X) tgetnum/\fBcurs_termcap\fP(3X) tgetstr/\fBcurs_termcap\fP(3X) tgoto/\fBcurs_termcap\fP(3X) tigetflag/\fBcurs_terminfo\fP(3X) tigetnum/\fBcurs_terminfo\fP(3X) tigetstr/\fBcurs_terminfo\fP(3X) timeout/\fBcurs_inopts\fP(3X) tiparm/\fBcurs_terminfo\fP(3X) 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_tioctl/\fBcurs_util\fP(3X)* vid_attr/\fBcurs_terminfo\fP(3X) vid_puts/\fBcurs_terminfo\fP(3X) vidattr/\fBcurs_terminfo\fP(3X) vidputs/\fBcurs_terminfo\fP(3X) vline/\fBcurs_border\fP(3X) vline_set/\fBcurs_border_set\fP(3X) vw_printw/\fBcurs_printw\fP(3X) vw_scanw/\fBcurs_scanw\fP(3X) vwprintw/\fBcurs_printw\fP(3X) vwscanw/\fBcurs_scanw\fP(3X) wadd_wch/\fBcurs_add_wch\fP(3X) wadd_wchnstr/\fBcurs_add_wchstr\fP(3X) wadd_wchstr/\fBcurs_add_wchstr\fP(3X) waddch/\fBcurs_addch\fP(3X) waddchnstr/\fBcurs_addchstr\fP(3X) waddchstr/\fBcurs_addchstr\fP(3X) waddnstr/\fBcurs_addstr\fP(3X) waddnwstr/\fBcurs_addwstr\fP(3X) waddstr/\fBcurs_addstr\fP(3X) waddwstr/\fBcurs_addwstr\fP(3X) wattr_get/\fBcurs_attr\fP(3X) wattr_off/\fBcurs_attr\fP(3X) wattr_on/\fBcurs_attr\fP(3X) wattr_set/\fBcurs_attr\fP(3X) wattroff/\fBcurs_attr\fP(3X) wattron/\fBcurs_attr\fP(3X) wattrset/\fBcurs_attr\fP(3X) wbkgd/\fBcurs_bkgd\fP(3X) wbkgdset/\fBcurs_bkgd\fP(3X) wbkgrnd/\fBcurs_bkgrnd\fP(3X) wbkgrndset/\fBcurs_bkgrnd\fP(3X) wborder/\fBcurs_border\fP(3X) wborder_set/\fBcurs_border_set\fP(3X) wchgat/\fBcurs_attr\fP(3X) wclear/\fBcurs_clear\fP(3X) wclrtobot/\fBcurs_clear\fP(3X) wclrtoeol/\fBcurs_clear\fP(3X) wcolor_set/\fBcurs_attr\fP(3X) wcursyncup/\fBcurs_window\fP(3X) wdelch/\fBcurs_delch\fP(3X) wdeleteln/\fBcurs_deleteln\fP(3X) wecho_wchar/\fBcurs_add_wch\fP(3X) wechochar/\fBcurs_addch\fP(3X) wenclose/\fBcurs_mouse\fP(3X)* werase/\fBcurs_clear\fP(3X) wget_wch/\fBcurs_get_wch\fP(3X) wget_wstr/\fBcurs_get_wstr\fP(3X) wgetbkgrnd/\fBcurs_bkgrnd\fP(3X) wgetch/\fBcurs_getch\fP(3X) wgetdelay/\fBcurs_opaque\fP(3X)* wgetn_wstr/\fBcurs_get_wstr\fP(3X) wgetnstr/\fBcurs_getstr\fP(3X) wgetparent/\fBcurs_opaque\fP(3X)* wgetscrreg/\fBcurs_opaque\fP(3X)* wgetstr/\fBcurs_getstr\fP(3X) whline/\fBcurs_border\fP(3X) whline_set/\fBcurs_border_set\fP(3X) win_wch/\fBcurs_in_wch\fP(3X) win_wchnstr/\fBcurs_in_wchstr\fP(3X) win_wchstr/\fBcurs_in_wchstr\fP(3X) winch/\fBcurs_inch\fP(3X) winchnstr/\fBcurs_inchstr\fP(3X) winchstr/\fBcurs_inchstr\fP(3X) winnstr/\fBcurs_instr\fP(3X) winnwstr/\fBcurs_inwstr\fP(3X) wins_nwstr/\fBcurs_ins_wstr\fP(3X) wins_wch/\fBcurs_ins_wch\fP(3X) wins_wstr/\fBcurs_ins_wstr\fP(3X) winsch/\fBcurs_insch\fP(3X) winsdelln/\fBcurs_deleteln\fP(3X) winsertln/\fBcurs_deleteln\fP(3X) winsnstr/\fBcurs_insstr\fP(3X) winsstr/\fBcurs_insstr\fP(3X) winstr/\fBcurs_instr\fP(3X) winwstr/\fBcurs_inwstr\fP(3X) wmouse_trafo/\fBcurs_mouse\fP(3X)* wmove/\fBcurs_move\fP(3X) wnoutrefresh/\fBcurs_refresh\fP(3X) wprintw/\fBcurs_printw\fP(3X) wredrawln/\fBcurs_refresh\fP(3X) wrefresh/\fBcurs_refresh\fP(3X) wresize/\fBwresize\fP(3X)* wscanw/\fBcurs_scanw\fP(3X) wscrl/\fBcurs_scroll\fP(3X) wsetscrreg/\fBcurs_outopts\fP(3X) wstandend/\fBcurs_attr\fP(3X) wstandout/\fBcurs_attr\fP(3X) wsyncdown/\fBcurs_window\fP(3X) wsyncup/\fBcurs_window\fP(3X) wtimeout/\fBcurs_inopts\fP(3X) wtouchln/\fBcurs_touch\fP(3X) wunctrl/\fBcurs_util\fP(3X) wvline/\fBcurs_border\fP(3X) wvline_set/\fBcurs_border_set\fP(3X) .TE .PP Depending on the configuration, additional sets of functions may be available: .RS 3 .TP 5 \fBcurs_memleaks\fP(3X) - curses memory-leak checking .TP 5 \fBcurs_sp_funcs\fP(3X) - curses screen-pointer extension .TP 5 \fBcurs_threads\fP(3X) - curses thread support .TP 5 \fBcurs_trace\fP(3X) - curses debugging routines .RE .SH RETURN VALUE Unless otherwise noted, functions that return an integer return \fBOK\fP on success and \fBERR\fP on failure. Functions that return pointers return \fBNULL\fP on failure. Typically, .I \%ncurses treats a null pointer passed as a function parameter as a failure. .PP Functions with a \*(``mv\*('' prefix first perform cursor movement using \fB\%wmove\fP and fail if the position is outside the window, or (for \*(``mvw\*('' functions) if the .I \%WINDOW pointer is null. .SH ENVIRONMENT The following environment symbols are useful for customizing the runtime behavior of the \fI\%ncurses\fP library. The most important ones have been already discussed in detail. .SS "\fICC\fP (command character)" When set, change the .B \%command_character .RB ( \%cmdch ) capability value of loaded .I \%term\%info entries 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 represent the C compiler's name, \fI\%ncurses\fP ignores it if it does not happen to be a single character. .SS "\fIBAUDRATE\fP" The debugging library checks this environment variable when the application has redirected output to a file. The variable's numeric value is used for the baudrate. If no value is found, \fI\%ncurses\fP uses 9600. This allows testers to construct repeatable test-cases that take into account costs that depend on baudrate. .SS "\fICOLUMNS\fP" Specify the width of the screen in characters. Applications running in a windowing environment usually are able to obtain the width of the window in which they are executing. If neither the \fI\%COLUMNS\fP value nor the terminal's screen size is available, \fI\%ncurses\fP uses the size which may be specified in the terminfo database (i.e., the \fBcols\fP capability). .PP It is important that your application use a correct size for the screen. This is not always possible because your application may be running on a host which does not honor NAWS (Negotiations About Window Size), or because you are temporarily running as another user. However, setting \fI\%COLUMNS\fP and/or \fILINES\fP overrides the library's use of the screen size obtained from the operating system. .PP Either \fI\%COLUMNS\fP or \fILINES\fP symbols may be specified independently. This is mainly useful to circumvent legacy misfeatures of terminal descriptions, e.g., xterm which commonly specifies a 65 line screen. For best results, \fBlines\fP and \fBcols\fP should not be specified in a terminal description for terminals which are run as emulations. .PP Use the \fBuse_env\fP function to disable all use of external environment (but not including system calls) to determine the screen size. Use the \fBuse_tioctl\fP function to update \fI\%COLUMNS\fP or \fILINES\fP to match the screen size obtained from system calls or the terminal database. .SS "\fIESCDELAY\fP" Specifies the total time, in milliseconds, for which \fI\%ncurses\fP will await a character sequence, e.g., a function key. The default value, 1000 milliseconds, is enough for most uses. However, it is made a variable to accommodate unusual applications. .PP The most common instance where you may wish to change this value is to work with slow hosts, e.g., running on a network. If the host cannot read characters rapidly enough, it will have the same effect as if the terminal did not send characters rapidly enough. The library will still see a timeout. .PP Note that xterm mouse events are built up from character sequences received from the xterm. If your application makes heavy use of multiple-clicking, you may wish to lengthen this default value because the timeout applies to the composed multi-click event as well as the individual clicks. .PP In addition to the environment variable, this implementation provides a global variable with the same name. Portable applications should not rely upon the presence of \fB\%ESCDELAY\fP in either form, but setting the environment variable rather than the global variable does not create problems when compiling an application. .SS "\fIHOME\fP" Tells \fI\%ncurses\fP where your home directory is. That is where it may read and write auxiliary terminal descriptions: .PP .RS 4 .EX $HOME/.termcap $HOME/.terminfo .EE .RE .SS "\fILINES\fP" Like \fI\%COLUMNS\fP, specify the height of the screen in characters. See \fI\%COLUMNS\fP for a detailed description. .SS "\fIMOUSE_BUTTONS_123\fP" This applies only to the OS/2 EMX port. It specifies the order of buttons on the mouse. OS/2 numbers a 3-button mouse inconsistently from other platforms: .PP .RS 4 .EX 1 = left 2 = right 3 = middle. .EE .RE .PP This variable lets you customize the mouse. The variable must be three numeric digits 1\-3 in any order, e.g., 123 or 321. If it is not specified, \fI\%ncurses\fP uses 132. .SS "\fINCURSES_ASSUMED_COLORS\fP" Override the compiled-in assumption that the terminal's default colors are white-on-black (see \fBdefault_colors\fP(3X)). You may set the foreground and background color values with this environment variable by proving a 2-element list: foreground,background. For example, to tell \fI\%ncurses\fP to not assume anything about the colors, set this to "\-1,\-1". To make it green-on-black, set it to "2,0". Any positive value from zero to the terminfo \fBmax_colors\fP value is allowed. .SS "\fINCURSES_CONSOLE2\fP" This applies only to the MinGW port of \fI\%ncurses\fP. .PP The \fBConsole2\fP program's handling of the Microsoft Console API call \fBCreateConsoleScreenBuffer\fP is defective. Applications which use this will hang. However, it is possible to simulate the action of this call by mapping coordinates, explicitly saving and restoring the original screen contents. Setting the environment variable \fBNCGDB\fP has the same effect. .SS "\fINCURSES_GPM_TERMS\fP" This applies only to \fI\%ncurses\fP configured to use the GPM interface. .PP If present, the environment variable is a list of one or more terminal names against which the \fITERM\fP environment variable is matched. Setting it to an empty value disables the GPM interface; using the built-in support for xterm, etc. .PP If the environment variable is absent, \fI\%ncurses\fP will attempt to open GPM if \fITERM\fP contains \*(``linux\*(''. .SS "\fINCURSES_NO_HARD_TABS\fP" \fI\%ncurses\fP may use tabs as part of cursor movement optimization. In some cases, your terminal driver may not handle these properly. Set this environment variable to any value to disable the feature. You can also adjust your \fBstty\fP(1) settings to avoid the problem. .SS "\fINCURSES_NO_MAGIC_COOKIE\fP" Some terminals use a magic-cookie feature which requires special handling to make highlighting and other video attributes display properly. You can suppress the highlighting entirely for these terminals by setting this environment variable to any value. .SS "\fINCURSES_NO_PADDING\fP" Most of the terminal descriptions in the terminfo database are written for real \*(``hardware\*('' terminals. Many people use terminal emulators which run in a windowing environment and use curses-based applications. Terminal emulators can duplicate all of the important aspects of a hardware terminal, but they do not have the same limitations. The chief limitation of a hardware terminal from the standpoint of your application is the management of dataflow, i.e., timing. Unless a hardware terminal is interfaced into a terminal concentrator (which does flow control), it (or your application) must manage dataflow, preventing overruns. The cheapest solution (no hardware cost) is for your program to do this by pausing after operations that the terminal does slowly, such as clearing the display. .PP As a result, many terminal descriptions (including the vt100) have delay times embedded. You may wish to use these descriptions, but not want to pay the performance penalty. .PP Set the \fI\%NCURSES_NO_PADDING\fP environment variable to disable all but mandatory padding. Mandatory padding is used as a part of special control sequences such as \fBflash\fP. .SS "\fINCURSES_NO_SETBUF\fP" This setting is obsolete. Before changes .RS 3 .bP started with 5.9 patch 20120825 and .bP continued though 5.9 patch 20130126 .RE .PP \fI\%ncurses\fP enabled buffered output during terminal initialization. This was done (as in SVr4 curses) for performance reasons. For testing purposes, both of \fI\%ncurses\fP and certain applications, this feature was made optional. Setting the \fI\%NCURSES_NO_SETBUF\fP variable disabled output buffering, leaving the output in the original (usually line buffered) mode. .PP In the current implementation, \fI\%ncurses\fP performs its own buffering and does not require this workaround. It does not modify the buffering of the standard output. .PP The reason for the change was to make the behavior for interrupts and other signals more robust. One drawback is that certain nonconventional programs would mix ordinary \fI\%stdio\fP(3) calls with \fI\%ncurses\fP calls and (usually) work. This is no longer possible since \fI\%ncurses\fP is not using the buffered standard output but its own output (to the same file descriptor). As a special case, the low-level calls such as \fBputp\fP still use the standard output. But high-level curses calls do not. .SS "\fINCURSES_NO_UTF8_ACS\fP" During initialization, the \fI\%ncurses\fP library checks for special cases where VT100 line-drawing (and the corresponding alternate character set capabilities) described in the terminfo are known to be missing. Specifically, when running in a UTF\-8 locale, the Linux console emulator and the GNU screen program ignore these. \fI\%ncurses checks the \fITERM\fP environment variable for these. For other special cases, you should set this environment variable. Doing this tells \fI\%ncurses\fP to use Unicode values which correspond to the VT100 line-drawing glyphs. That works for the special cases cited, and is likely to work for terminal emulators. .PP When setting this variable, you should set it to a nonzero value. Setting it to zero (or to a nonnumber) disables the special check for \*(``linux\*('' and \*(``screen\*(''. .PP As an alternative to the environment variable, \fI\%ncurses\fP checks for an extended terminfo capability \fBU8\fP. This is a numeric capability which can be compiled using \fB@TIC@\ \-x\fP. For example .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 name \*(``U8\*('' is chosen to be two characters, to permit it to be used by applications that use \fI\%ncurses\fP' termcap interface. .SS "\fINCURSES_TRACE\fP" During initialization, the \fI\%ncurses\fP debugging library checks the \fI\%NCURSES_TRACE\fP environment variable. If it is defined, to a numeric value, \fI\%ncurses\fP calls the \fBtrace\fP function, using that value as the argument. .PP The argument values, which are defined in \fBcurses.h\fP, provide several types of information. When running with traces enabled, your application will write the file \fBtrace\fP to the current directory. .PP See \fBcurs_trace\fP(3X) for more information. .SS "\fITERM\fP" Denotes your terminal type. Each terminal type is distinct, though many are similar. .PP \fITERM\fP is commonly set by terminal emulators to help applications find a workable terminal description. Some of those choose a popular approximation, e.g., \*(``ansi\*('', \*(``vt100\*('', \*(``xterm\*('' rather than an exact fit. Not infrequently, your application will have problems with that approach, e.g., incorrect function-key definitions. .PP If you set \fITERM\fP in your environment, it has no effect on the operation of the terminal emulator. It only affects the way applications work within the terminal. Likewise, as a general rule (\fBxterm\fP(1) being a rare exception), terminal emulators which allow you to specify \fITERM\fP as a parameter or configuration value do not change their behavior to match that setting. .SS "\fITERMCAP\fP" If the \fI\%ncurses\fP library has been configured with \fItermcap\fP support, \fI\%ncurses\fP will check for a terminal's description in termcap form if it is not available in the terminfo database. .PP The \fI\%TERMCAP\fP environment variable contains either a terminal description (with newlines stripped out), or a file name telling where the information denoted by the \fITERM\fP environment variable exists. In either case, setting it directs \fI\%ncurses\fP to ignore the usual place for this information, e.g., /etc/termcap. .SS "\fITERMINFO\fP" \fI\%ncurses\fP can be configured to read from multiple terminal databases. The \fI\%TERMINFO\fP variable overrides the location for the default terminal database. Terminal descriptions (in terminal format) are stored in terminal databases: .bP Normally these are stored in a directory tree, using subdirectories named by the first letter of the terminal names therein. .IP This is the scheme used in System V, which legacy Unix systems use, and the \fI\%TERMINFO\fP variable is used by \fIcurses\fP applications on those systems to override the default location of the terminal database. .IP \(bu 4 If \fI\%ncurses\fP is built to use hashed databases, then each entry in this list may be the path of a hashed database file, e.g., .RS 4 .PP .RS 4 .EX /usr/share/terminfo.db .EE .RE .PP rather than .PP .RS 4 .EX /usr/share/terminfo/ .EE .RE .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, reading it directly rather than using the terminfo library calls. .RE .bP If \fI\%ncurses\fP is built with a support for reading termcap files directly, then an entry in this list may be the path of a termcap file. .IP \(bu 4 If the \fI\%TERMINFO\fP variable begins with \*(``hex:\*('' or \*(``b64:\*('', \fI\%ncurses\fP uses the remainder of that variable as a compiled terminal description. You might produce the base64 format using \fBinfocmp\fP(1M): .RS 4 .PP .RS 4 .EX TERMINFO="$(infocmp \-0 \-Q2 \-q)" export TERMINFO .EE .RE .PP The compiled description is used if it corresponds to the terminal identified by the \fITERM\fP variable. .RE .PP Setting \fI\%TERMINFO\fP is the simplest, but not the only way to set location of the default terminal database. The complete list of database locations in order follows: .RS 3 .bP the last terminal database to which \fI\%ncurses\fP wrote, if any, is searched first .bP the location specified by the \fI\%TERMINFO\fP environment variable .bP $HOME/.terminfo .bP locations listed in the \fI\%TERMINFO_DIRS\fP environment variable .bP one or more locations whose names are configured and compiled into the \fI\%ncurses\fP library, i.e., .RS 3 .bP @TERMINFO_DIRS@ (corresponding to the \fI\%TERMINFO_DIRS\fP variable) .bP @TERMINFO@ (corresponding to the \fITERMINFO\fP variable) .RE .RE .SS "\fITERMINFO_DIRS\fP" Specifies a list of locations to search for terminal descriptions. Each location in the list is a terminal database as described in the section on the \fI\%TERMINFO\fP variable. The list is separated by colons (i.e., ":") on Unix, semicolons on OS/2 EMX. .PP There is no corresponding feature in System V terminfo; it is an extension developed for \fI\%ncurses\fP. .SS "\fITERMPATH\fP" If \fI\%TERMCAP\fP does not hold a file name then \fI\%ncurses\fP checks the \fI\%TERMPATH\fP environment variable. This is a list of filenames separated by spaces or colons (i.e., ":") on Unix, semicolons on OS/2 EMX. .PP If the \fI\%TERMPATH\fP environment variable is not set, \fI\%ncurses\fP looks in the files .PP .RS 4 .EX /etc/termcap, /usr/share/misc/termcap and $HOME/.termcap, .EE .RE .PP in that order. .PP The library may be configured to disregard the following variables when the current user is the superuser (root), or if the application uses setuid or setgid permissions: .PP .RS 4 .EX $TERMINFO, $TERMINFO_DIRS, $TERMPATH, as well as $HOME. .EE .RE .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 .I \%ncurses. .TP 5 \-\-disable\-overwrite The standard include for \fI\%ncurses\fP is as noted in \fBSYNOPSIS\fP: .RS 5 .PP .RS 4 .EX \fB#include \fP .EE .RE .PP This option is used to avoid filename conflicts when \fI\%ncurses\fP is not the main implementation of curses of the computer. If \fI\%ncurses\fP is installed disabling overwrite, it puts its headers in a subdirectory, e.g., .PP .RS 4 .EX \fB#include \fP .EE .RE .PP It also omits a symbolic link which would allow you to use \fB\-lcurses\fP to build executables. .RE .TP 5 \-\-enable\-widec The configure script renames the library and (if the \fB\-\-disable\-overwrite\fP option is used) puts the header files in a different subdirectory. All of the library names have a \*(``w\*('' appended to them, i.e., instead of .RS 5 .PP .RS 4 .EX \fB\-lncurses\fP .EE .RE .PP you link with .PP .RS 4 .EX \fB\-lncursesw\fP .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 XSI 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 \-\-with\-pthread The configure script renames the library. All of the library names have a \*(``t\*('' appended to them (before any \*(``w\*('' added by \fB\-\-enable\-widec\fP). .IP The global variables such as \fBLINES\fP are replaced by macros to allow read-only access. At the same time, setter-functions are provided to set these values. Some applications (very few) may require changes to work with this convention. .TP 5 \-\-with\-shared .TP \-\-with\-normal .TP \-\-with\-debug .TP \-\-with\-profile The shared and normal (static) library names differ by their suffixes, e.g., \fBlibncurses.so\fP and \fBlibncurses.a\fP. The debug and profiling libraries add a \*(``_g\*('' and a \*(``_p\*('' to the root names respectively, e.g., \fBlibncurses_g.a\fP and \fBlibncurses_p.a\fP. .TP 5 \-\-with\-termlib Low-level functions which do not depend upon whether the library supports wide-characters, are provided in the tinfo library. .IP By doing this, it is possible to share the tinfo library between wide/normal configurations as well as reduce the size of the library when only low-level functions are needed. .IP Those functions are described in these pages: .RS .bP \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 \-\-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 \*d 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 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. .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 .I \%xterm; 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 .I \%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 sequences at runtime; see \fB\%define_key\fP(3X), \fB\%key_defined\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 choose to hide the internal details of .I \%WINDOW structures, instead using accessor functions such as \fB\%is_scrollok\fP(3X). .PP .I \%ncurses enables an application to direct application 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 Some extensions are only available if .I \%ncurses is compiled to support them; see section \*(``ALTERNATE CONFIGURATIONS\*('' above. .bP Rudimentary support for multi-threaded applications may be available; see \fBcurs_threads\fP(3X). .bP Functions that ease the management of multiple screens can be exposed; see \fBcurs_sp_funcs\fP(3X). .bP The compiler option .B \%\-DUSE_GETCAP causes the library to fall back to reading .I \%/etc/termcap if the terminal setup code cannot find a .I \%term\%info entry corresponding to .I 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 nearly all its enhanced features. .\" XXX: What's missing? GBR counts untic(1), and that's all. .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, this one checks parameters such as pointers to \fI\%WINDOW\fP structures to ensure they are not null. The main reason for providing this behavior is to guard against programmer error. The standard interface does not provide a way for the library to tell an application which of several possible errors were detected. Relying on this (or some other) extension will adversely affect the portability of curses applications. .SS "Padding Differences" In historic curses versions, delays embedded in the capabilities \fBcr\fP, \fBind\fP, \fBcub1\fP, \fBff\fP and \fBtab\fP activated corresponding delay bits in the Unix tty driver. In this implementation, all padding is done by sending NUL bytes. This method is slightly more expensive, but narrows the interface to the Unix kernel significantly and increases the package's portability correspondingly. .SS "Header Files" The header file \fI\%curses.h\fP itself includes the header files \fI\%stdio.h\fP and \fI\%unctrl.h\fP. .PP X/Open Curses has more to say, but does not finish the story: .RS 4 .PP The inclusion of may make visible all symbols from the headers , , , and . .RE .PP Here is a more complete story: .bP Starting with BSD curses, all implementations have included . .IP BSD curses included and from an internal header file .I \%curses.ext (\*(``ext\*('' abbreviated \*(``externs\*(''). .IP BSD curses used internally (for \fBprintw\fP and \fBscanw\fP), but nothing in itself relied upon . .bP SVr2 curses added \fBnewterm\fP(3X), which relies upon . That is, the function prototype uses \fBFILE\fP. .IP SVr4 curses added \fBputwin\fP and \fBgetwin\fP, which also use . .IP X/Open Curses documents all three of these functions. .IP SVr4 curses and X/Open Curses do not require the developer to include before including . Both document curses showing as the only required header. .IP As a result, standard will always include . .bP X/Open Curses is inconsistent with respect to SVr4 regarding . .IP As noted in \fBcurs_util\fP(3X), \fI\%ncurses\fP includes from (like SVr4). .bP X/Open's comments about and may refer to HP-UX and AIX: .IP HP-UX curses includes from to declare \fBsetupterm\fP in curses.h, but \fI\%ncurses\fP (and Solaris curses) do not. .IP AIX curses includes and . Again, \fI\%ncurses\fP (and Solaris curses) do not. .bP X/Open says that \fImay\fP include , but there is no requirement that it do that. .IP Some programs use functions declared in both and , and must include both headers in the same module. Very old versions of AIX curses required including before including . .IP Because \fI\%ncurses\fP header files include the headers needed to define datatypes used in the headers, \fI\%ncurses\fP header files can be included in any order. But for portability, you should include before . .bP X/Open Curses says \fI"may make visible"\fP because including a header file does not necessarily make all symbols in it visible (there are ifdef's to consider). .IP For instance, in \fI\%ncurses\fP \fImay\fP be included if the proper symbol is defined, and if \fI\%ncurses\fP is configured for wide-character support. If the header is included, its symbols may be made visible. That depends on the value used for \fB_XOPEN_SOURCE\fP feature test macro. .bP X/Open Curses documents one required header, in a special case: before to prototype the \fBvw_printw\fP and \fBvw_scanw\fP functions (as well as the obsolete the \fBvwprintw\fP and \fBvwscanw\fP functions). Each of those uses a \fBva_list\fP parameter. .IP The two obsolete functions were introduced in SVr3. The other functions were introduced in X/Open Curses. In between, SVr4 curses provided for the possibility that an application might include either or . Initially, that was done by using \fBvoid*\fP for the \fBva_list\fP parameter. Later, a special type (defined in ) was introduced, to allow for compiler type-checking. That special type is always available, because is always included by . .IP None of the X/Open Curses implementations require an application to include before because they either have allowed for a special type, or (like \fI\%ncurses\fP) include directly to provide a portable interface. .SH AUTHORS Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey. Based on \fIpcurses\fP by Pavel Curtis. .SH SEE ALSO \fB\%curs_variables\fP(3X), \fB\%terminfo\fP(5), \fB\%user_caps\fP(5) ncurses-6.4-20240113/man/curs_insstr.3x0000644000000000000000000001220614530355236016051 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2022,2023 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.46 2023/11/25 11:29:34 tom Exp $ .TH curs_insstr 3X 2023-11-25 "ncurses 6.4" "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\%insnstr\fP, \fB\%winsstr\fP, \fB\%winsnstr\fP, \fB\%mvinsstr\fP, \fB\%mvinsnstr\fP, \fB\%mvwinsstr\fP, \fB\%mvwinsnstr\fP \- insert a string in a \fIcurses\fR window .SH SYNOPSIS .nf \fB#include \fBint insstr(const char *\fIstr\fP); \fBint insnstr(const char *\fIstr\fP, int \fIn\fP); \fBint winsstr(WINDOW *\fIwin\fP, const char *\fIstr\fP); \fBint winsnstr(WINDOW *\fIwin\fP, const char *\fIstr\fP, int \fIn\fP); .PP \fBint mvinsstr(int \fIy\fP, int \fIx\fP, const char *\fIstr\fP); \fBint mvinsnstr(int \fIy\fP, int \fIx\fP, const char *\fIstr\fP, int \fIn\fP); \fBint mvwinsstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const char *\fIstr\fP); \fBint mvwinsnstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const char *\fIstr\fP, int \fIn\fP); .fi .SH DESCRIPTION These routines insert a character string (as many characters as will fit on the line) before the character under the cursor, as if calling \fBwinsch\fP(3X). All characters to the right of the cursor are shifted right, with the possibility of the rightmost characters on the line being lost. No wrapping is performed. .PP The cursor position does not change (after moving to \fIy\fP, \fIx\fP, if specified). .PP The functions with \fIn\fP as the last argument insert a leading substring of at most \fIn\fP characters. If \fIn\fP is less than zero, the entire string is inserted (stopping on a NUL character). .PP Special characters are handled as in \fBwaddch\fP(3X). .SH RETURN VALUE All functions return the integer \fBERR\fP upon failure and \fBOK\fP on success. .PP X/Open does not define any error conditions. This implementation returns an error .bP if the \fIwin\fP parameter is null or .bP if the \fIstr\fP parameter is null or .bP the \fBwinsch\fP(3X) function returns an error. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP(3X), and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES All but \fBwinsnstr\fP may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4, which adds \fI\%const\fP qualifiers to the arguments. .PP The Single Unix Specification, Version 2 states that \fBinsnstr\fP and \fBwinsnstr\fP perform wrapping. This is probably an error, since it makes this group of functions inconsistent. Also, no implementation of curses documents this inconsistency. .PP X/Open states that the entire string is inserted if \fIn\fP is less than 1. This is probably an error, because it is inconsistent with other functions, and differs from the SVr4 and X/Open implementations on Solaris. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_inch\fP(3X), \fB\%curs_ins_wstr\fP(3X), \fB\%curs_util\fP(3X) ncurses-6.4-20240113/man/form_field_attributes.3x0000644000000000000000000001015214530376627020054 0ustar rootroot'\" t .\"*************************************************************************** .\" Copyright 2018-2022,2023 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.33 2023/11/25 13:58:47 tom Exp $ .TH form_field_attributes 3X 2023-11-25 "ncurses 6.4" "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. ncurses-6.4-20240113/man/curs_touch.3x0000644000000000000000000001314714530377705015663 0ustar rootroot.\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: curs_touch.3x,v 1.42 2023/11/25 14:08:05 tom Exp $ .TH curs_touch 3X 2023-11-25 "ncurses 6.4" "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 X/Open does not define any error conditions. In this implementation .RS 3 .TP 5 \fBis_linetouched\fP returns an error if the window pointer is null, or if the line number is outside the window. .IP The constant \fBERR\fP is distinct from \fBTRUE\fP and \fBFALSE\fP, which are the normal return values of this function. Because the function returns a \fBbool\fP, returning \fBERR\fP (which is neither \fBTRUE\fP nor \fBFALSE\fP) may not be supported by the compiler. .IP To provide error-checking and also match the X/Open function prototype, the \fBERR\fP is provided by a macro named \fB\%is_linetouched\fP. The actual function returns \fBFALSE\fP when it detects an error. .TP 5 \fBwtouchln\fP returns an error if the window pointer is null, or if the line number is outside the window. .RE .SH 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 The XSI Curses standard, Issue 4 describes these functions, but defines no error conditions. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_refresh\fP(3X), \fB\%curs_variables\fP(3X) ncurses-6.4-20240113/man/curs_scr_dump.3x0000644000000000000000000001225714544106323016345 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.37 2023/12/30 21:34:11 tom Exp $ .TH curs_scr_dump 3X 2023-12-30 "ncurses 6.4" "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 \fB\%scr_dump\fP writes to .I filename the contents of the virtual screen; see \fB\%curscr\fP(3X). .SS scr_restore \fB\%scr_restore\fP updates the virtual screen to contain the contents of .I filename (if it was validly written with \fB\%scr_dump\fP). No refresh is performed; after performing any further desired updates, call \fB\%doupdate\fP(3X) or similar. .SS scr_init \fB\%scr_init\fP reads .I filename, using it to initialize .I curses data structures describing the state of the terminal screen. If these data are valid, .I curses bases its next update of the screen on this information rather than clearing it and starting from scratch. .PP The data fail the validity check .bP if the terminal employs .I \%term\%info capabilities .B \%exit_ca_mode .RB ( \%rmcup ) or .B \%non_rev_rmcup .RB ( \%nrrmc ) are defined, or .bP if .I curses knows that the terminal has been written to since the preceding \fB\%scr_dump\fP call. .PP \fB\%scr_init\fP could be used after \fB\%initscr\fP(3X) or \fB\%system\fP(3) to share the screen with another process that has done a \fBscr_dump\fP after \fB\%endwin\fP(3X). .SS scr_set The \fBscr_set\fP routine is a combination of \fBscr_restore\fP and \fBscr_init\fP. It tells the program that the information in \fIfilename\fP is what is currently on the screen, and also what the program wants on the screen. This can be thought of as a screen inheritance function. .SH RETURN VALUE These functions return \fBOK\fP on success and \fBERR\fP on failure. .PP X/Open defines no failure conditions. In this implementation, each function fails if it cannot open .I filename. .SH NOTES \fB\%scr_init\fP, \fB\%scr_set\fP, and \fB\%scr_restore\fP may be macros. .SH PORTABILITY X/Open Curses, Issue 4, describes these functions. .PP .\" SVID 4, p. 529 SVr4 omitted the .I \%const qualifiers. .PP SVr4 documentation describes \fB\%scr_init\fP such that the dump data is also considered invalid \*(``if the time-stamp of the tty is old\*('' but does not define \*(``old\*(''. .SH SEE ALSO \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) ncurses-6.4-20240113/man/curs_add_wchstr.3x0000644000000000000000000001232514530377115016653 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2022,2023 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.32 2023/11/25 14:01:49 tom Exp $ .TH curs_add_wchstr 3X 2023-11-25 "ncurses 6.4" "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\%add_wchnstr\fP, \fB\%wadd_wchstr\fP, \fB\%wadd_wchnstr\fP, \fB\%mvadd_wchstr\fP, \fB\%mvadd_wchnstr\fP, \fB\%mvwadd_wchstr\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 add_wchnstr(const cchar_t *\fIwchstr\fP, int \fIn\fP); \fBint wadd_wchstr(WINDOW * \fIwin\fP, const cchar_t *\fIwchstr\fP); \fBint wadd_wchnstr(WINDOW * \fIwin\fP, const cchar_t *\fIwchstr\fP, int \fIn\fP); .PP \fBint mvadd_wchstr(int \fIy\fP, int \fIx\fP, const cchar_t *\fIwchstr\fP); \fBint mvadd_wchnstr(int \fIy\fP, int \fIx\fP, const cchar_t *\fIwchstr\fP, int \fIn\fP); \fBint mvwadd_wchstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const cchar_t *\fIwchstr\fP); \fBint mvwadd_wchnstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const cchar_t *\fIwchstr\fP, int \fIn\fP); .fi .SH DESCRIPTION These functions copy the (null-terminated) array of complex characters \fIwchstr\fP into the window image structure starting at the current cursor position. .PP The four functions with \fIn\fP as the last argument copy at most \fIn\fP elements, but no more than will fit on the line. If \fBn\fP=\fB\-1\fP then the whole array is copied, to the maximum number of characters that will fit on the line. .PP The window cursor is \fInot\fP advanced. These functions are faster than \fBwaddnstr\fP. On the other hand: .bP they do not perform checking (such as for the newline, backspace, or carriage return characters), .bP they do not advance the current cursor position, .bP they do not expand other control characters to ^-escapes, and .bP they truncate the string if it crosses the right margin, rather than wrapping it around to the new line. .PP These functions end successfully on encountering a null \fBcchar_t\fP, or when they have filled the current line. If a complex character cannot completely fit at the end of the current line, the remaining columns are filled with the background character and rendition. .SH RETURN VALUE All functions return the integer \fBERR\fP upon failure and \fBOK\fP on success. .PP X/Open does not define any error conditions. This implementation returns an error .bP if the \fIwin\fP parameter is null or .bP if the \fIwchstr\fP parameter is null. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES All functions except \fBwadd_wchnstr\fP may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_addch\fP(3X), \fB\%curs_addchstr\fP(3X), \fB\%curs_addstr\fP(3X), \fB\%curs_addwstr\fP(3X), \fB\%curs_add_wch\fP(3X) ncurses-6.4-20240113/man/form_new.3x0000644000000000000000000000712414530376627015321 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.30 2023/11/25 13:58:47 tom Exp $ .TH form_new 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/menu_userptr.3x0000644000000000000000000000642314530376627016236 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.31 2023/11/25 13:58:47 tom Exp $ .TH menu_userptr 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/form_field_opts.3x0000644000000000000000000001263114530376627016657 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.42 2023/11/25 13:58:47 tom Exp $ .TH form_field_opts 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/new_pair.3x0000644000000000000000000001475214537404526015313 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-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. * .\"*************************************************************************** .\" .\" Author: Thomas E. Dickey .\" .\" $Id: new_pair.3x,v 1.44 2023/12/16 20:32:22 tom Exp $ .TH new_pair 3X 2023-12-16 "ncurses 6.4" "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) ncurses-6.4-20240113/man/form_userptr.3x0000644000000000000000000000645614530376627016243 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.34 2023/11/25 13:58:47 tom Exp $ .TH form_userptr 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/manhtml.externs0000644000000000000000000000523314550612276016275 0ustar rootroot# $Id: manhtml.externs,v 1.21 2024/01/13 22:54:54 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) atoi(3) bash(1) conflict(1) cron(1) csh(1) ded(1) emacs(1) environ(7) errno(3) file(1) getty(8) jove(1) lynx(1) mutt(1) nvi(1) od(1) ioctl(2) printf(3) profile(5) putc(3) putchar(3) putwc(3) read(2) readline(3) resize(1) scanf(3) scanf(3S) screen(1) setlocale(3) sh(1) sscanf(3) stdio(3) stty(1) swprintf(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) ncurses-6.4-20240113/man/form_variables.3x0000644000000000000000000000672114510345513016466 0ustar rootroot.\"*************************************************************************** .\" Copyright 2020-2021,2023 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.16 2023/10/07 21:19:07 tom Exp $ .TH form_variables 3X 2023-10-07 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_getcchar.3x0000644000000000000000000001677414537410614016324 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2021,2023 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.43 2023/12/16 21:07:24 tom Exp $ .TH curs_getcchar 3X 2023-12-16 "ncurses 6.4" "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 string .SH SYNOPSIS .nf \fB#include .PP \fBint getcchar( .B " const cchar_t *\fIwcval\fP," .B " wchar_t *\fIwch\fP," .B " attr_t *\fIattrs\fP," .B " short *\fIcolor_pair\fP," .B " void *\fIopts\fP );" .PP .B "int setcchar(" .B " cchar_t *\fIwcval\fP," .B " const wchar_t *\fIwch\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 \fIwch\fP is not a null pointer, the \fBgetcchar\fP function does the following: .bP Extracts information from a \fBcchar_t\fP value \fIwcval\fP .bP Stores the character attributes in the location pointed to by \fIattrs\fP .bP Stores the color pair in the location pointed to by \fIcolor_pair\fP .bP Stores the wide-character string, characters referenced by \fIwcval\fP, into the array pointed to by \fIwch\fP. .PP When \fIwch\fP is a null pointer, the \fBgetcchar\fP function does the following: .bP Obtains the number of wide characters pointed to by \fIwcval\fP .bP Does not change the data referenced by \fIattrs\fP or \fIcolor_pair\fP .SS setcchar The \fBsetcchar\fP function initializes the location pointed to by \fIwcval\fP by using: .bP The character attributes in \fIattrs\fP .bP The color pair in \fIcolor_pair\fP .bP The wide-character string pointed to by \fIwch\fP. The string must be L'\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 \fIwch\fP is a null pointer, \fBgetcchar\fP returns the number of wide characters referenced by \fIwcval\fP, including one for a trailing null. .PP When \fIwch\fP is not a null pointer, \fBgetcchar\fP returns \fBOK\fP upon successful completion, and \fBERR\fP otherwise. .PP Upon successful completion, \fBsetcchar\fP returns \fBOK\fP. Otherwise, it returns \fBERR\fP. .SH NOTES The \fIwcval\fP argument may be a value generated by a call to \fBsetcchar\fP or by a function that has a \fBcchar_t\fP output argument. If \fIwcval\fP is constructed by any other means, the effect is unspecified. .SH 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) ncurses-6.4-20240113/man/curs_getch.3x0000644000000000000000000003541514541606202015622 0ustar rootroot'\" t .\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: curs_getch.3x,v 1.77 2023/12/23 16:36:18 tom Exp $ .TH curs_getch 3X 2023-12-23 "ncurses 6.4" "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\%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 .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 \fIch\fP); .PP \fI/* extension */\fP .B int has_key(int \fIch\fP); .fi .SH DESCRIPTION .SS "Reading Characters" The \fBgetch\fP, \fBwgetch\fP, \fBmvgetch\fP and \fBmvwgetch\fP, routines read a character from the window. In no-delay mode, if no input is waiting, the value \fBERR\fP is returned. In delay mode, the program waits until the system passes text through to the program. Depending on the setting of \fBcbreak\fP, this is after one character (cbreak mode), or after the first newline (nocbreak mode). In half-delay mode, the program waits until a character is typed or the specified timeout has been reached. .PP If \fBecho\fP is enabled, and the window is not a pad, then the character will also be echoed into the designated window according to the following rules: .bP If the character is the current erase character, left arrow, or backspace, the cursor is moved one space to the left and that screen position is erased as if \fBdelch\fP had been called. .bP If the character value is any other \fBKEY_\fP define, the user is alerted with a \fBbeep\fP call. .bP If the character is a carriage-return, and if \fBnl\fP is enabled, it is translated to a line-feed after echoing. .bP Otherwise the character is simply output to the screen. .PP If the window is not a pad, and it has been moved or modified since the last call to \fBwrefresh\fP, \fBwrefresh\fP will be called before another character is read. .SS "Keypad Mode" If \fBkeypad\fP is \fBTRUE\fP, and a function key is pressed, the token for that function key is returned instead of the raw characters: .bP The predefined function keys are listed in \fB\fP as macros with values outside the range of 8-bit characters. Their names begin with \fBKEY_\fP. .bP Other (user-defined) function keys which may be defined using \fBdefine_key\fP(3X) have no names, but also are expected to have values outside the range of 8-bit characters. .PP Thus, a variable intended to hold the return value of a function key must be of short size or larger. .PP When a character that could be the beginning of a function key is received (which, on modern terminals, means an escape character), \fBcurses\fP sets a timer. If the remainder of the sequence does not come in within the designated time, the character is passed through; otherwise, the function key value is returned. For this reason, many terminals experience a delay between the time a user presses the escape key and the escape is returned to the program. .PP In \fI\%ncurses\fP, the timer normally expires after the value in \fBESCDELAY\fP (see \fBcurs_variables\fP(3X)). If \fBnotimeout\fP is \fBTRUE\fP, the timer does not expire; it is an infinite (or very large) value. Because function keys usually begin with an escape character, the terminal may appear to hang in notimeout mode after pressing the escape key until another key is pressed. .SS "Ungetting Characters" The \fBungetch\fP routine places \fIch\fP back onto the input queue to be returned by the next call to \fBwgetch\fP. There is just one input queue for all windows. .SS "Predefined Key Codes" The following special keys are defined in \fB\fP. .bP Except for the special case \fBKEY_RESIZE\fP, it is necessary to enable \fBkeypad\fP for \fBgetch\fP to return these codes. .bP Not all of these are necessarily supported on any particular terminal. .bP The naming convention may seem obscure, with some apparent misspellings (such as \*(``RSUME\*('' for \*(``resume\*(''). The names correspond to the long terminfo capability names for the keys, and were defined long ago, in the 1980s. .PP .RS .TS tab(/) ; l l . \fBName\fP/\fBKey\fP \fBname\fP _ KEY_BREAK/Break key KEY_DOWN/The four arrow keys ... KEY_UP KEY_LEFT KEY_RIGHT KEY_HOME/Home key (upward+left arrow) KEY_BACKSPACE/Backspace KEY_F0/T{ Function keys; space for 64 keys is reserved. T} KEY_F(\fIn\fP)/T{ For 0 \(<= \fIn\fP \(<= 63 T} KEY_DL/Delete line KEY_IL/Insert line KEY_DC/Delete character KEY_IC/Insert char or enter insert mode KEY_EIC/Exit insert char mode KEY_CLEAR/Clear screen KEY_EOS/Clear to end of screen KEY_EOL/Clear to end of line KEY_SF/Scroll 1 line forward KEY_SR/Scroll 1 line backward (reverse) KEY_NPAGE/Next page KEY_PPAGE/Previous page KEY_STAB/Set tab KEY_CTAB/Clear tab KEY_CATAB/Clear all tabs KEY_ENTER/Enter or send KEY_SRESET/Soft (partial) reset KEY_RESET/Reset or hard reset KEY_PRINT/Print or copy KEY_LL/Home down or bottom (lower left) KEY_A1/Upper left of keypad KEY_A3/Upper right of keypad KEY_B2/Center of keypad KEY_C1/Lower left of keypad KEY_C3/Lower right of keypad KEY_BTAB/Back tab key KEY_BEG/Beg(inning) key KEY_CANCEL/Cancel key KEY_CLOSE/Close key KEY_COMMAND/Cmd (command) key KEY_COPY/Copy key KEY_CREATE/Create key KEY_END/End key KEY_EXIT/Exit key KEY_FIND/Find key KEY_HELP/Help key KEY_MARK/Mark key KEY_MESSAGE/Message key KEY_MOUSE/Mouse event occurred KEY_MOVE/Move key KEY_NEXT/Next object key KEY_OPEN/Open key KEY_OPTIONS/Options key KEY_PREVIOUS/Previous object key KEY_REDO/Redo key KEY_REFERENCE/Ref(erence) key KEY_REFRESH/Refresh key KEY_REPLACE/Replace key KEY_RESIZE/Screen resized KEY_RESTART/Restart key KEY_RESUME/Resume key KEY_SAVE/Save key KEY_SBEG/Shifted beginning key KEY_SCANCEL/Shifted cancel key KEY_SCOMMAND/Shifted command key KEY_SCOPY/Shifted copy key KEY_SCREATE/Shifted create key KEY_SDC/Shifted delete char key KEY_SDL/Shifted delete line key KEY_SELECT/Select key KEY_SEND/Shifted end key KEY_SEOL/Shifted clear line key KEY_SEXIT/Shifted exit key KEY_SFIND/Shifted find key KEY_SHELP/Shifted help key KEY_SHOME/Shifted home key KEY_SIC/Shifted insert key KEY_SLEFT/Shifted left arrow key KEY_SMESSAGE/Shifted message key KEY_SMOVE/Shifted move key KEY_SNEXT/Shifted next key KEY_SOPTIONS/Shifted options key KEY_SPREVIOUS/Shifted prev key KEY_SPRINT/Shifted print key KEY_SREDO/Shifted redo key KEY_SREPLACE/Shifted replace key KEY_SRIGHT/Shifted right arrow key KEY_SRSUME/Shifted resume key KEY_SSAVE/Shifted save key KEY_SSUSPEND/Shifted suspend key KEY_SUNDO/Shifted undo key KEY_SUSPEND/Suspend key KEY_UNDO/Undo key .TE .RE .PP Keypad is arranged like this: .PP .RS .TS allbox tab(/) ; c c c . \fBA1\fP/\fBup\fP/\fBA3\fP \fBleft\fP/\fBB2\fP/\fBright\fP \fBC1\fP/\fBdown\fP/\fBC3\fP .TE .RE .sp A few of these predefined values do \fInot\fP correspond to a real key: .bP .B KEY_RESIZE is returned when the \fBSIGWINCH\fP signal has been detected (see \fBinitscr\fP(3X) and \fBresizeterm\fP(3X)). This code is returned whether or not \fBkeypad\fP has been enabled. .bP .B KEY_MOUSE is returned for mouse-events (see \fBcurs_mouse\fP(3X)). This code relies upon whether or not \fBkeypad\fP(3X) has been enabled, because (e.g., with \fBxterm\fP(1) mouse prototocol) \fI\%ncurses\fP must read escape sequences, just like a function key. .SS "Testing Key Codes" The \fBhas_key\fP routine takes a key-code value from the above list, and returns \fBTRUE\fP or \fBFALSE\fP according to whether the current terminal type recognizes a key with that value. .PP The library also supports these extensions: .RS 3 .TP 5 .B define_key defines a key-code for a given string (see \fBdefine_key\fP(3X)). .TP 5 .B key_defined checks if there is a key-code defined for a given string (see \fBkey_defined\fP(3X)). .RE .SH RETURN VALUE All routines return the integer \fBERR\fP upon failure and an integer value other than \fBERR\fP (\fBOK\fP in the case of \fBungetch\fP) upon successful completion. .RS 3 .TP 5 \fBungetch\fP returns \fBERR\fP if there is no more room in the FIFO. .TP \fBwgetch\fP returns \fBERR\fP if the window pointer is null, or if its timeout expires without having any data, or if the execution was interrupted by a signal (\fBerrno\fP will be set to \fBEINTR\fP). .RE .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES Use of the escape key by a programmer for a single character function is discouraged, as it will cause a delay of up to one second while the keypad code looks for a following function-key sequence. .PP Some keys may be the same as commonly used control keys, e.g., \fBKEY_ENTER\fP versus control/M, \fBKEY_BACKSPACE\fP versus control/H. Some curses implementations may differ according to whether they treat these control keys specially (and ignore the terminfo), or use the terminfo definitions. \fI\%ncurses\fP uses the terminfo definition. If it says that \fBKEY_ENTER\fP is control/M, \fBgetch\fP will return \fBKEY_ENTER\fP when you press control/M. .PP Generally, \fBKEY_ENTER\fP denotes the character(s) sent by the \fIEnter\fP key on the numeric keypad: .bP the terminal description lists the most useful keys, .bP the \fIEnter\fP key on the regular keyboard is already handled by the standard ASCII characters for carriage-return and line-feed, .bP depending on whether \fBnl\fP or \fBnonl\fP was called, pressing \*(``Enter\*('' on the regular keyboard may return either a carriage-return or line-feed, and finally .bP \*(``Enter or send\*('' is the standard description for this key. .PP When using \fBgetch\fP, \fBwgetch\fP, \fBmvgetch\fP, or \fBmvwgetch\fP, nocbreak mode (\fBnocbreak\fP) and echo mode (\fBecho\fP) should not be used at the same time. Depending on the state of the tty driver when each character is typed, the program may produce undesirable results. .PP Note that \fBgetch\fP, \fBmvgetch\fP, and \fBmvwgetch\fP may be macros. .PP Historically, the set of keypad macros was largely defined by the extremely function-key-rich keyboard of the AT&T 7300, aka 3B1, aka Safari 4. Modern personal computers usually have only a small subset of these. IBM PC-style consoles typically support little more than \fBKEY_UP\fP, \fBKEY_DOWN\fP, \fBKEY_LEFT\fP, \fBKEY_RIGHT\fP, \fBKEY_HOME\fP, \fBKEY_END\fP, \fBKEY_NPAGE\fP, \fBKEY_PPAGE\fP, and function keys 1 through 12. The Ins key is usually mapped to \fBKEY_IC\fP. .SH EXTENSIONS \fB\%has_key\fP was designed for \fB\%ncurses\fP(3X), and is 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 X/Open Curses, Issue 4, Version 2, describes \fB\%getch\fP, \fB\%wgetch\fP, \fB\%mvgetch\fP, \fB\%mvwgetch\fP, and \fB\%ungetch\fP. They read single-byte characters only. The standard specifies that they return \fBERR\fP on failure, but describes no failure conditions. .PP The echo behavior of these functions on input of .B KEY_ or backspace characters was not specified in the SVr4 documentation. This description is adapted from X/Open Curses. .PP The behavior of \fBgetch\fP and friends in the presence of signal handlers is unspecified in the SVr4 documentation and X/Open Curses. Under historical curses implementations, it varied depending on whether the operating system's dispatch of a signal to a handler interrupts a \fBread\fP(2) call in progress or not, and also (in some implementations) whether an input timeout or non-blocking mode has been set. .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 is an extension first implemented for .I \%ncurses. NetBSD .I curses later added this extension. .PP Programmers concerned about portability should be prepared for either of two cases: (a) signal receipt does not interrupt \fBgetch\fP; (b) signal receipt interrupts \fBgetch\fP and causes it to return \fBERR\fP with \fBerrno\fP set to \fBEINTR\fP. .PP The \fBhas_key\fP function is unique to \fI\%ncurses\fP. We recommend that any code using it be conditionalized on the \fBNCURSES_VERSION\fP feature macro. .SH SEE ALSO \fB\%curses\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) .PP Comparable functions in the wide-character (ncursesw) library are described in \fB\%curs_get_wch\fP(3X). ncurses-6.4-20240113/man/menu_post.3x0000644000000000000000000000741014530376627015514 0ustar rootroot.\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: menu_post.3x,v 1.34 2023/11/25 13:58:47 tom Exp $ .TH menu_post 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_inchstr.3x0000644000000000000000000001251114526251032016172 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.40 2023/11/19 00:08:58 tom Exp $ .TH curs_inchstr 3X 2023-11-18 "ncurses 6.4" "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 an error .bP if the \fIwin\fP parameter is null or .bP if the \fIchstr\fP parameter is null. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES All 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 the XSI Curses standard, Issue 4. It is no more specific than the SVr4 documentation on the trailing 0. It does specify that the successful return of the functions is \fBOK\fP. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_inch\fP(3X), \fB\%curs_inwstr\fP(3X), \fB\%curs_in_wchstr\fP(3X) ncurses-6.4-20240113/man/curs_window.3x0000644000000000000000000002377414537404526016056 0ustar rootroot.\"*************************************************************************** .\" Copyright 2020-2022,2023 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.44 2023/12/16 20:32:22 tom Exp $ .TH curs_window 3X 2023-12-16 "ncurses 6.4" "Library calls" .de bP .ie n .IP \(bu 4 .el .IP \(bu 2 .. .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( \fBint \fInlines\fB, int \fIncols\fB,\fR \fBint \fIbegin_y\fB, int \fIbegin_x\fB);\fR \fBint delwin(WINDOW *\fIwin\fB);\fR \fBint mvwin(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB);\fR \fBWINDOW *subwin(WINDOW *\fIorig\fB,\fR \fBint \fInlines\fB, int \fIncols\fB,\fR \fBint \fIbegin_y\fB, int \fIbegin_x\fB);\fR \fBWINDOW *derwin(WINDOW *\fIorig\fB,\fR \fBint \fInlines\fB, int \fIncols\fB,\fR \fBint \fIbegin_y\fB, int \fIbegin_x\fB);\fR \fBint mvderwin(WINDOW *\fIwin\fB, int \fIpar_y\fB, int \fIpar_x\fB);\fR \fBWINDOW *dupwin(WINDOW *\fIwin\fB);\fR \fBvoid wsyncup(WINDOW *\fIwin\fB);\fR \fBint syncok(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR \fBvoid wcursyncup(WINDOW *\fIwin\fB);\fR \fBvoid wsyncdown(WINDOW *\fIwin\fB);\fR .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 an error if the window pointer is null, or if the window is the parent of another window. .TP 5 \fBderwin\fP returns an error if the parent window pointer is null, or if any of its ordinates or dimensions is negative, or if the resulting window does not fit inside the parent window. .TP 5 \fBdupwin\fP returns an error if the window pointer is null. .IP This implementation also maintains a list of windows, and checks that the pointer passed to \fBdelwin\fP is one that it created, returning an error if it was not.. .TP 5 \fBmvderwin\fP returns an error if the window pointer is null, or if some part of the window would be placed off-screen. .TP 5 \fBmvwin\fP returns an error if the window pointer is null, or if the window is really a pad, or if some part of the window would be placed off-screen. .TP 5 \fBnewwin\fP will fail if either of its beginning ordinates is negative, or if either the number of lines or columns is negative. .TP 5 \fBsyncok\fP returns an error if the window pointer is null. .TP 5 \fBsubwin\fP returns an error if the parent window pointer is null, or if any of its ordinates or dimensions is negative, or if the resulting window does not fit inside the parent window. .PP The functions which return a window pointer may also fail if there is insufficient memory for its data structures. Any of these functions will fail if the screen has not been initialized, i.e., with \fBinitscr\fP or \fBnewterm\fP. .SH NOTES If many small changes are made to the window, the \fBwsyncup\fP option could degrade performance. .PP Note that \fBsyncok\fP may be a macro. .SH PORTABILITY The XSI Curses standard, Issue 4 describes these functions. .PP X/Open Curses states regarding \fBdelwin\fP: .bP It must delete subwindows before deleting their parent. .bP If \fBdelwin\fP is asked to delete a parent window, it can only succeed if the curses library keeps a list of the subwindows. SVr4 curses kept a count of the number of subwindows rather than a list. It simply returned \fBERR\fP when asked to delete a subwindow. Solaris X/Open curses does not even make that check, and will delete a parent window which still has subwindows. .bP Since release 4.0 (1996), \fI\%ncurses\fP maintains a list of windows for each screen, to ensure that a window has no subwindows before allowing deletion. .bP NetBSD copied this feature of \fI\%ncurses\fP in 2003. .br PDCurses follows the scheme used in Solaris X/Open curses. .SH BUGS The subwindow functions \fB\%subwin\fP, \fB\%derwin\fP, \fB\%mvderwin\fP, \fB\%wsyncup\fP, \fB\%wsyncdown\fP, \fB\%wcursyncup\fP, and \fB\%syncok\fP are flaky, incompletely implemented, and not well tested. .PP System\ V's \fIcurses\fP documentation is unclear about what \fB\%wsyncup\fP and \fB\%wsyncdown\fP 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 language here, and behavior of \fI\%ncurses\fP, 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) ncurses-6.4-20240113/man/curs_extend.3x0000644000000000000000000001041214541606202016005 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.44 2023/12/23 16:36:18 tom Exp $ .TH curs_extend 3X 2023-12-23 "ncurses 6.4" "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 \fIenable\fP); .fi .SH DESCRIPTION These functions are extensions to the curses library which do not fit easily into other categories. .SS curses_version Use \fBcurses_version\fP to get the version number, including patch level of the library, prefixed by \*(``ncurses\*('', e.g., .RS .sp .B ncurses 5.0.19991023 .RE .SS use_extended_names The \fBuse_extended_names\fP function controls whether the calling application is able to use user-defined or nonstandard names which may be compiled into the terminfo description, i.e., via the terminfo or termcap interfaces. Normally these names are available for use, since the essential decision is made by using the \fB\-x\fP option of \fB@TIC@\fP to compile extended terminal definitions. However you can disable this feature to ensure compatibility with other implementations of curses. .SH RETURN VALUE \fBcurses_version\fP returns a pointer to static memory; you should not free this in your application. .PP \fBuse_extended_names\fP returns the previous state, allowing you to save this and restore it. .SH 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 \fB\%curs_getch\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\%resizeterm\fP(3X), \fB\%wresize\fP(3X) ncurses-6.4-20240113/man/mitem_opts.3x0000644000000000000000000000726714530376627015675 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.31 2023/11/25 13:58:47 tom Exp $ .TH mitem_opts 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/define_key.3x0000644000000000000000000000705414537404526015606 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.40 2023/12/16 20:32:22 tom Exp $ .TH define_key 3X 2023-12-16 "ncurses 6.4" "Library calls" .SH NAME \fB\%define_key\fP \- define a \fIcurses\fR keycode .SH SYNOPSIS .nf \fB#include .PP \fBint define_key(const char *\fIdefinition\fP, int \fIkeycode\fP); .fi .SH DESCRIPTION This is an extension to the \fIcurses\fP library. It permits an application to define keycodes with their corresponding control strings, so that the \fI\%ncurses\fP library will interpret them just as it would the predefined codes in the terminfo database. .PP If \fIdefinition\fP is \fBNULL\fP, any existing one for the keycode is removed. Similarly, if the given keycode is negative or zero, any existing string for the given definition is removed. .SH RETURN VALUE Either \fIkeycode\fP must be greater than zero, or \fIdefinition\fP must be non-\fBNULL\fP, otherwise \fBERR\fP is returned. \fBERR\fP may also be returned if there is insufficient memory to allocate the data to store the definition. If no error is detected, \fBOK\fP is returned. .SH PORTABILITY These routines are specific to \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\%keyok\fP(3X), \fB\%key_defined\fP(3X) ncurses-6.4-20240113/man/resizeterm.3x0000644000000000000000000001734414537404526015700 0ustar rootroot.\"*************************************************************************** .\" 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: Thomas E. Dickey 1996-on .\" .\" $Id: resizeterm.3x,v 1.54 2023/12/16 20:32:22 tom Exp $ .TH resizeterm 3X 2023-12-16 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_variables.3x0000644000000000000000000002517114546074322016505 0ustar rootroot.\"*************************************************************************** .\" 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.43 2024/01/05 21:46:58 tom Exp $ .TH curs_variables 3X 2024-01-05 "ncurses 6.4" "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 .. . .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 \fIcurses\fP to distinguish an escape character corresponding to a user's press of an \*(``Escape\*('' key on the input device from one included in a control sequence used by a cursor movement or function key, the library waits to see if another key event occurs after the escape character. \fB\%ESCDELAY\fP stores this interval in milliseconds. .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 \fI\%ncurses\fP is configured to provide separate \fIcurses\fP and \fIterminfo\fP libraries, most of these variables reside in the \fIcurses\fP library. .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\*('' (\fB\%init_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 \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) .PP [UAX #29] \*(``Unicode Standard Annex #29: Unicode Text Segmentation\*(''; \% ncurses-6.4-20240113/man/keyok.3x0000644000000000000000000000642314537404526014625 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.38 2023/12/16 20:32:22 tom Exp $ .TH keyok 3X 2023-12-16 "ncurses 6.4" "Library calls" .SH NAME \fB\%keyok\fP \- enable or disable a \fIcurses\fR keycode .SH SYNOPSIS .nf \fB#include .PP \fBint keyok(int \fIkeycode\fP, bool \fIenable\fP); .fi .SH DESCRIPTION This is an extension to the \fIcurses\fP library. It permits an application to disable specific keycodes, rather than use the \fB\%keypad\fP function to disable all keycodes. Keys that have been disabled can be re-enabled. .SH RETURN VALUE The keycode must be greater than zero, else \fBERR\fP is returned. If it does not correspond to a defined key, then \fBERR\fP is returned. If the \fIenable\fP parameter is true, then the key must have been disabled, and vice versa. Otherwise, the function returns \fBOK\fP. .SH PORTABILITY This routine is specific to \fI\%ncurses\fP. It was 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\%define_key\fP(3X) ncurses-6.4-20240113/man/Makefile.in0000644000000000000000000001023614325016030015251 0ustar rootroot# $Id: Makefile.in,v 1.54 2022/10/22 16:36:40 tom Exp $ ############################################################################## # Copyright 2019-2021,2022 Thomas E. Dickey # # Copyright 1998-2013,2015 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1996,1997 # # Makefile for ncurses manual pages. # # NOTE: When you add or rename a man page, make sure you update both # the top-level MANIFEST and any man/*.renames files! SHELL = @SHELL@ VPATH = @srcdir@ DESTDIR = @DESTDIR@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ mandir = @mandir@ includesubdir = @includesubdir@ INCLUDEDIR = $(DESTDIR)$(includedir)$(includesubdir) INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : depend @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.man @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.man all \ sources : terminfo.5 depend : tags : $(DESTDIR)$(mandir) : mkdir -p $@ EDITARGS = $(DESTDIR)$(mandir) $(srcdir) terminfo.5 *-config.1 $(srcdir)/*.[0-9]* install install.man : terminfo.5 $(DESTDIR)$(mandir) $(SHELL) ../edit_man.sh normal installing $(EDITARGS) uninstall uninstall.man : -$(SHELL) ../edit_man.sh normal removing $(EDITARGS) # We compose terminfo.5 from the real sources... CAPLIST = \ $(srcdir)/../include/@TERMINFO_CAPS@ \ $(srcdir)/../include/Caps-ncurses terminfo.5: $(srcdir)/terminfo.head \ $(CAPLIST) \ $(srcdir)/terminfo.tail \ Makefile $(srcdir)/MKterminfo.sh $(SHELL) $(srcdir)/MKterminfo.sh $(srcdir)/terminfo.head $(CAPLIST) $(srcdir)/terminfo.tail >terminfo.5 mostlyclean : -rm -f core tags TAGS *~ *.bak *.ln *.atac trace clean: mostlyclean rm -f terminfo.5 ../edit_man.sed : make_sed.sh $(SHELL) $(srcdir)/make_sed.sh @MANPAGE_RENAMES@ >../edit_man.sed distclean realclean: clean -rm -f Makefile *-config.1 ../edit_man.* ../man_alias.* man_db.renames ncurses-6.4-20240113/man/curs_legacy.3x0000644000000000000000000001242114541606552015774 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2022,2023 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.30 2023/12/23 16:40:10 tom Exp $ .TH curs_legacy 3X 2023-12-23 "ncurses 6.4" "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 NOTES All of these interfaces are implemented as macros and functions. The macros are suppressed (and only the functions provided) in an \*(``opaque\*('' .I \%ncurses build, which defines the preprocessor symbol .BR \%NCURSES_OPAQUE . See section \*(``ALTERNATE CONFIGURATIONS\*('' in \fB\%ncurses\fP(3X). .PP The standard forms such as \fB\%getyx\fP .I must be implemented as macros, and (in this implementation) are defined in terms of the functions described here, to avoid reliance on internal details of the \fI\%WINDOW\fP structure. .SH PORTABILITY These functions were supported on Version 7, BSD or System V implementations. None of those implementations checked the window parameter. .PP The \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) ncurses-6.4-20240113/man/curs_ins_wch.3x0000644000000000000000000001015314541602314016152 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2022,2023 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.26 2023/12/23 16:03:24 tom Exp $ .TH curs_ins_wch 3X 2023-12-23 "ncurses 6.4" "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\%mvins_wch\fP, \fB\%mvwins_wch\fP, \fB\%wins_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 using \fB\%wmove\fP and fail if the position .RI ( y , .IR x ) is outside the window. .SH NOTES A terminal's .B \%insert_character .RB ( ich1 ) capability is not necessarily employed. .PP \fB\%ins_wch\fP, \fB\%mvins_wch\fP, and \fB\%mvwins_wch\fP may be implemented as macros. .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 SVr4 (1989) implemented these functions under the names .BR inswch , .BR winswch , .BR mvinswch , and .BR mvwinswch . .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) ncurses-6.4-20240113/man/form_post.3x0000644000000000000000000000721114530376627015512 0ustar rootroot.\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: form_post.3x,v 1.31 2023/11/25 13:58:47 tom Exp $ .TH form_post 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/form.3x0000644000000000000000000002073514541602771014445 0ustar rootroot'\" t .\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: form.3x,v 1.52 2023/12/23 16:08:25 tom Exp $ .TH form 3X 2023-12-23 "ncurses 6.4" "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 \- curses extension for programming forms .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. ncurses-6.4-20240113/man/curs_bkgrnd.3x0000644000000000000000000001634214541606076016006 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.36 2023/12/23 16:35:10 tom Exp $ .TH curs_bkgrnd 3X 2023-12-23 "ncurses 6.4" "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 The .I background of a .I curses window (in the library's \*(``wide\*('' configuration) is a .I \%cchar_t combining a set of attributes (see \fB\%curs_attr\fP(3X)) with a complex character called the .I "blank character." .PP The blank character is a spacing character that populates a window's character cells when their contents are erased without replacement. The background's attributes are combined with all non-blank characters written to the window, as with the \fB\%wadd_wch\fP(3X) and \fB\%wins_wch\fP(3X) families of functions. .PP The blank character and attributes of the background combine with characters written to the window as described below. 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 blank character; if they match, .I \%ncurses writes the new blank 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 .I \%ncurses treats a background character value of zero (0) as a blank character. .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 .I \%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 .I \%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 .I curses. .SH SEE ALSO \fB\%curs_bkgd\fP(3X) describes the corresponding functions in the non-\*(``wide\*('' configuration of .I \%ncurses. .PP \fB\%curses\fP(3X), \fB\%curs_add_wch\fP(3X), \fB\%curs_attr\fP(3X) ncurses-6.4-20240113/man/menu_new.3x0000644000000000000000000000703414530376627015322 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.33 2023/11/25 13:58:47 tom Exp $ .TH menu_new 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/infotocap.1m0000644000000000000000000000735614535343533015454 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.39 2023/12/10 14:12:43 tom Exp $ .TH @INFOTOCAP@ 1M 2023-12-10 "ncurses 6.4" "User commands" .ie \n(.g \{\ .ds `` \(lq .ds '' \(rq .\} .el \{\ .ie t .ds `` `` .el .ds `` "" .ie t .ds '' '' .el .ds '' "" .\} . .ds d @TERMINFO@ .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 \*d 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) ncurses-6.4-20240113/man/curs_print.3x0000644000000000000000000001000314541606202015646 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.36 2023/12/23 16:36:18 tom Exp $ .TH curs_print 3X 2023-12-23 "ncurses 6.4" "Library calls" .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 This function uses the \fBmc5p\fP or \fBmc4\fP and \fBmc5\fP capabilities, if they are present, to ship given data to a printer attached to the terminal. .PP Note that the \fB\%mcprint\fP code has no way to do flow control with the printer or to know how much buffering it has. Your application is responsible for keeping the rate of writes to the printer below its continuous throughput rate (typically about half of its nominal cps rating). Dot-matrix printers and 6-page-per-minute lasers can typically handle 80cps, so a good conservative rule of thumb is to sleep for a second after shipping each 80-character line. . .SH RETURN VALUE The \fB\%mcprint\fP function returns \fBERR\fP if the write operation aborted for some reason. In this case, \fB\%errno\fP will contain either an error associated with \fBwrite\fP(2) or one of the following: .TP 5 \fBENODEV\fP Capabilities for printer redirection do not exist. .TP 5 \fBENOMEM\fP Couldn't allocate sufficient memory to buffer the printer write. .PP When \fB\%mcprint\fP succeeds, it returns the number of characters actually sent to the printer. .SH EXTENSIONS \fB\%mcprint\fP was designed for \fB\%ncurses\fP(3X), and was not found in SVr4 .IR curses , 4.4BSD .IR curses , or any other previous 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 BUGS Padding in the \fBmc5p\fP, \fBmc4\fP, and \fBmc5\fP capabilities is not interpreted. .SH SEE ALSO \fB\%curses\fP(3X) ncurses-6.4-20240113/man/form_page.3x0000644000000000000000000001031514537404526015435 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.35 2023/12/16 20:32:22 tom Exp $ .TH form_page 3X 2023-12-16 "ncurses 6.4" "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) ncurses-6.4-20240113/man/captoinfo.1m0000644000000000000000000001607314541605257015451 0ustar rootroot'\" t .\"*************************************************************************** .\" Copyright 2018-2022,2023 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.58 2023/12/23 16:28:31 tom Exp $ .TH @CAPTOINFO@ 1M 2023-12-23 "ncurses 6.4" "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 .I \%/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 (SVr4/XSI Curses) \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 .TS center; Cb S Cb Cb Cb Cb Cb Cb C Lb. Name 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 Name 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 XSI _ 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 .I 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) ncurses-6.4-20240113/man/form_field_validation.3x0000644000000000000000000001737214537404526020030 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.51 2023/12/16 20:32:22 tom Exp $ .TH form_field_validation 3X 2023-12-16 "ncurses 6.4" "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) ncurses-6.4-20240113/man/form_win.3x0000644000000000000000000001015314530376627015321 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.33 2023/11/25 13:58:47 tom Exp $ .TH form_win 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/MKterminfo.sh0000755000000000000000000001101414550572224015625 0ustar rootroot#!/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" ncurses-6.4-20240113/man/curs_get_wch.3x0000644000000000000000000001542314541606076016156 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.31 2023/12/23 16:35:10 tom Exp $ .TH curs_get_wch 3X 2023-12-23 "ncurses 6.4" "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 .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 \fIwch\fP); .fi .SH DESCRIPTION .SS wget_wch The \fBget_wch\fP, \fBwget_wch\fP, \fBmvget_wch\fP, and \fBmvwget_wch\fP functions read a character from the terminal associated with the current or specified window. In no-delay mode, if no input is waiting, the value \fBERR\fP is returned. In delay mode, the program waits until the system passes text through to the program. Depending on the setting of \fBcbreak\fP, this is after one character (cbreak mode), or after the first newline (nocbreak mode). In half-delay mode, the program waits until the user types a character or the specified timeout interval has elapsed. .PP Unless \fBnoecho\fP has been set, these routines echo the character into the designated window. .PP If the window is not a pad and has been moved or modified since the last call to \fBwrefresh\fP, \fBwrefresh\fP will be called before another character is read. .PP If \fBkeypad\fP is enabled, these functions respond to the pressing of a function key by setting the object pointed to by \fIwch\fP to the keycode assigned to the function key, and returning \fBKEY_CODE_YES\fP. If a character (such as escape) that could be the beginning of a function key is received, curses sets a timer. If the remainder of the sequence does arrive within the designated time, curses passes through the character; otherwise, curses returns the function key value. For this reason, many terminals experience a delay between the time a user presses the escape key and the time the escape is returned to the program. .PP The keycodes returned by these functions are the same as those returned by \fBwgetch\fP: .bP The predefined function keys are listed in \fB\fP as macros with values outside the range of 8-bit characters. Their names begin with \fBKEY_\fP. .bP Other (user-defined) function keys which may be defined using \fBdefine_key\fP(3X) have no names, but also are expected to have values outside the range of 8-bit characters. .SS unget_wch The \fBunget_wch\fP function pushes the wide character \fIwch\fP back onto the head of the input queue, so the wide character is returned by the next call to \fBget_wch\fP. The pushback of one character is guaranteed. If the program calls \fBunget_wch\fP too many times without an intervening call to \fBget_wch\fP, the operation may fail. .PP Unlike \fBungetch\fP and \fBwgetch\fP, \fBunget_wch\fP cannot distinguish special characters returned by \fBwget_wch\fP from ordinary characters. An application can push special keys which it may read via \fBwget_wch\fP by checking for the \fBKEY_CODE_YES\fP result, and using \fBungetch\fP for those special keys. .SH RETURN VALUE When \fBget_wch\fP, \fBwget_wch\fP, \fBmvget_wch\fP, and \fBmvwget_wch\fP functions successfully report the pressing of a function key, they return \fBKEY_CODE_YES\fP. When they successfully report a wide character, they return \fBOK\fP. Otherwise, they return \fBERR\fP. .PP Upon successful completion, \fBunget_wch\fP returns \fBOK\fP. Otherwise, the function returns \fBERR\fP. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES Applications should not define the escape key by itself as a single-character function. .PP When using \fBget_wch\fP, \fBwget_wch\fP, \fBmvget_wch\fP, or \fBmvwget_wch\fP, applications should not use \fBnocbreak\fP mode and \fBecho\fP mode at the same time. Depending on the state of the tty driver when each character is typed, the program may produce undesirable results. .PP All of these functions except \fB\%wget_wch\fP and \fB\%unget_wch\fP may be implemented as macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_getch\fP(3X), \fB\%curs_inopts\fP(3X), \fB\%curs_ins_wch\fP(3X), \fB\%curs_move\fP(3X), \fB\%curs_refresh\fP(3X) ncurses-6.4-20240113/man/menu_driver.3x0000644000000000000000000001567714541602771016032 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.45 2023/12/23 16:08:25 tom Exp $ .TH menu_driver 3X 2023-12-23 "ncurses 6.4" "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) ncurses-6.4-20240113/man/menu_items.3x0000644000000000000000000000761414530376627015656 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,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. * .\"*************************************************************************** .\" .\" $Id: menu_items.3x,v 1.32 2023/11/25 13:58:47 tom Exp $ .TH menu_items 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_trace.3x0000644000000000000000000002310614541602771015627 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2022,2023 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.42 2023/12/23 16:08:25 tom Exp $ .TH curs_trace 3X 2023-12-23 "ncurses 6.4" "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\%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 \fIparam\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 \fIch\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 \fIparam\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 Initialization These functions check the \fI\%NCURSES_TRACE\fP environment variable, to set the tracing feature as if \fBcurses_trace\fP was called: .RS 4 .PP filter, initscr, new_prescr, newterm, nofilter, restartterm, ripoffline, setupterm, slk_init, tgetent, use_env, use_extended_names, use_tioctl .RE .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 PORTABILITY These functions are not part of the XSI interface. Some other curses implementations are known to have similar features, but they are not compatible with \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) ncurses-6.4-20240113/man/curs_border.3x0000644000000000000000000001376614537410767016030 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.44 2023/12/16 21:09:11 tom Exp $ .TH curs_border 3X 2023-12-16 "ncurses 6.4" "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 X/Open does not define any error conditions. This implementation returns an error if the window pointer is null. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES The borders generated by these functions are \fIinside\fP borders (this is also true of SVr4 curses, though the fact is not documented). .PP Note that \fBborder\fP and \fBbox\fP may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_outopts\fP(3X) ncurses-6.4-20240113/man/form_field.3x0000644000000000000000000001005114530376627015604 0ustar rootroot'\" t .\"*************************************************************************** .\" Copyright 2018-2022,2023 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.32 2023/11/25 13:58:47 tom Exp $ .TH form_field 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/form_field_buffer.3x0000644000000000000000000001351114537404526017136 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.43 2023/12/16 20:32:22 tom Exp $ .TH form_field_buffer 3X 2023-12-16 "ncurses 6.4" "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. ncurses-6.4-20240113/man/menu_cursor.3x0000644000000000000000000000634214530376627016047 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.28 2023/11/25 13:58:47 tom Exp $ .TH menu_cursor 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_color.3x0000644000000000000000000005426714544104601015653 0ustar rootroot.\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: curs_color.3x,v 1.96 2023/12/30 21:20:01 tom Exp $ .TH curs_color 3X 2023-12-30 "ncurses 6.4" "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 an error 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 XSI 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) ncurses-6.4-20240113/man/curs_memleaks.3x0000644000000000000000000001306014541604460016322 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2022,2023 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.33 2023/12/23 16:22:08 tom Exp $ .TH curs_memleaks 3X 2023-12-23 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_slk.3x0000644000000000000000000002754114537412065015331 0ustar rootroot.\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: curs_slk.3x,v 1.67 2023/12/16 21:18:45 tom Exp $ .TH curs_slk 3X 2023-12-16 "ncurses 6.4" "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 (\fB\%slk_set\fP) or wide-character strings (\fB\%slk_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 an error if the terminal or the softkeys were not initialized. .TP 5 \fBslk_attrset\fP returns an error if the terminal or the softkeys were not initialized. .TP 5 \fBslk_attr_set\fP returns an error if the terminal or the softkeys were not initialized, or the color pair is outside the range 0..\fBCOLOR_PAIRS\fP\-1. .TP 5 \fBslk_color\fP returns an error if the terminal or the softkeys were not initialized, or the color pair is outside the range 0..\fBCOLOR_PAIRS\fP\-1. .TP 5 \fBslk_init\fP returns an error if the format parameter is outside the range 0..3. .TP 5 \fBslk_label\fP returns \fBNULL\fP on error. .TP 5 \fBslk_set\fP returns an error if the terminal or the softkeys were not initialized, or the \fIlabnum\fP parameter is outside the range of label counts, or if the format parameter is outside the range 0..2, or if memory for the labels cannot be allocated. .RE .SH 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 an error. .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) ncurses-6.4-20240113/man/terminfo.head0000644000000000000000000002120114550613657015666 0ustar rootroot.\"*************************************************************************** .\" 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.63 2024/01/13 23:07:27 tom Exp $ .TH terminfo 5 2024-01-13 "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 .. . .ds d @TERMINFO@ .SH NAME \fB\%terminfo\fP \- terminal capability database .SH SYNOPSIS \*d/*/* .SH DESCRIPTION .I Terminfo is a database describing terminals, used by screen-oriented programs such as \fBnvi\fP(1), \fBlynx\fP(1), \fBmutt\fP(1), and other curses applications, using high-level calls to libraries such as \fBcurses\fP(3X). It is also used via low-level calls by non-curses applications which may be screen-oriented (such as \fB@CLEAR@\fP(1)) or non-screen (such as \fB@TABS@\fP(1)). .PP .I Terminfo describes terminals by giving a set of capabilities which they have, by specifying how to perform screen operations, and by specifying padding requirements and initialization sequences. .PP This manual describes \fI\%ncurses\fP 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 ncurses-6.4-20240113/man/wresize.3x0000644000000000000000000000726314530402026015160 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.34 2023/11/25 14:26:30 tom Exp $ .TH wresize 3X 2023-11-25 "ncurses 6.4" "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 This \fI\%ncurses\fP extension to standard \fIcurses\fP reallocates storage for a \fIcurses\fP window to adjust its dimensions to the specified values. If either dimension is larger than its current value, the expanded part of the window is filled with blanks merged with current background rendition (as set by \fB\%wbkgdset\fP(3X)). .SH RETURN VALUE \fB\%wresize\fP returns \fBERR\fP upon failure and \fBOK\fP on success. It will fail if either of the dimensions is less than or equal to zero, or if an error occurs while (re)allocating memory for the window. .SH NOTES The only restriction placed on the dimensions is that they be greater than zero. They are \fInot\fP compared to the \fIcurses\fP screen dimensions; this keeps the logic of \fB\%resizeterm\fP(3X) simple. The caller must ensure that the window's dimensions fit within the actual screen dimensions. .SH PORTABILITY It is not possible to resize windows with SVr4 \fIcurses\fP. .PP \fI\%ncurses\fP introduced this extension in mid-1995. NetBSD \fIcurses\fP adopted it in 2001, and \fI\%PDCurses\fP in 2003. .SH AUTHORS Thomas Dickey (from an equivalent function written in 1988 for BSD \fIcurses\fP). .SH SEE ALSO \fB\%resizeterm\fP(3X) ncurses-6.4-20240113/man/menu_format.3x0000644000000000000000000000754214530376627016025 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.33 2023/11/25 13:58:47 tom Exp $ .TH menu_format 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_ins_wstr.3x0000644000000000000000000001227614537405077016414 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2022,2023 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.30 2023/12/16 20:36:15 tom Exp $ .TH curs_ins_wstr 3X 2023-12-16 "ncurses 6.4" "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\%ins_nwstr\fP, \fB\%wins_wstr\fP, \fB\%wins_nwstr\fP, \fB\%mvins_wstr\fP, \fB\%mvins_nwstr\fP, \fB\%mvwins_wstr\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 ins_nwstr(const wchar_t *\fIwstr\fP, int \fIn\fP); \fBint wins_wstr(WINDOW *\fIwin\fP, const wchar_t *\fIwstr\fP); \fBint wins_nwstr(WINDOW *\fIwin\fP, const wchar_t *\fIwstr\fP, int \fIn\fP); .PP \fBint mvins_wstr(int \fIy\fP, int \fIx\fP, const wchar_t *\fIwstr\fP); \fBint mvins_nwstr(int \fIy\fP, int \fIx\fP, const wchar_t *\fIwstr\fP, int \fIn\fP); \fBint mvwins_wstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const wchar_t *\fIwstr\fP); \fBint mvwins_nwstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const wchar_t *\fIwstr\fP, int \fIn\fP); .fi .SH DESCRIPTION These routines insert a \fBwchar_t\fP character string (as many characters as will fit on the line) before the character under the cursor, as if calling \fBwins_wch\fP(3X). All characters to the right of the cursor are shifted right, with the possibility of the rightmost characters on the line being lost. No wrapping is performed. .PP The cursor position does not change (after moving to \fIy\fP, \fIx\fP, if specified). .PP The functions with \fIn\fP as the last argument insert a leading substring of at most \fIn\fP \fBwchar_t\fP characters. If \fIn\fP is less than zero, the entire string is inserted (stopping on a L'\e0' character). .PP Special characters are handled as in \fBwadd_wch\fP(3X). .SH RETURN VALUE All functions return the integer \fBERR\fP upon failure and \fBOK\fP on success. .PP X/Open does not define any error conditions. This implementation returns an error .bP if the \fIwin\fP parameter is null or .bP if the \fIwstr\fP parameter is null or .bP if the \fBwins_wch\fP function returns an error. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP(3X), and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES All but \fBwins_nwstr\fP may be macros. .PP If the first character in the string is a non-spacing character, these functions will fail. XSI does not define what will happen if a non-spacing character follows a control character. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4, which adds \fI\%const\fP qualifiers to the arguments. .PP X/Open states that the entire string is inserted if \fIn\fP is less than 1. This is probably an error, because it is inconsistent with other functions, and differs from the X/Open implementation on Solaris. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_insstr\fP(3X), \fB\%curs_ins_wch\fP(3X), \fB\%curs_in_wch\fP(3X) ncurses-6.4-20240113/man/manhtml.aliases0000644000000000000000000001122214544134764016225 0ustar rootroot# $Id: manhtml.aliases,v 1.31 2023/12/31 00:46:44 tom Exp $ #*************************************************************************** # Copyright 2019-2022,2023 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) bkgd(3X) curs_bkgd(3X) bkgrnd(3X) curs_bkgrnd(3X) clearok(3X) curs_outopts(3X) curs_set(3X) curs_kernel(3X) curscr(3X) curs_variables(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) endwin(3X) curs_initscr(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) 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_scrollok(3X) curs_opaque(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) putwin(3X) curs_util(3X) refresh(3X) curs_refresh(3X) reset_shell_mode(3X) curs_kernel(3X) restartterm(3X) curs_terminfo(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) tigetstr(3X) curs_terminfo(3X) tparm(3X) curs_terminfo(3X) tputs(3X) curs_terminfo(3X) use_default_colors(3X) default_colors(3X) use_env(3X) curs_util(3X) use_extended_names(3X) curs_extend(3X) use_legacy_coding(3X) legacy_coding(3X) vidputs(3X) curs_terminfo(3X) wadd_wch(3X) curs_add_wch(3X) waddch(3X) curs_addch(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) wget_wch(3X) curs_get_wch(3X) wgetch(3X) curs_getch(3X) wgetstr(3X) curs_getstr(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) ncurses-6.4-20240113/man/curs_inopts.3x0000644000000000000000000003662514541606202016050 0ustar rootroot'\" t .\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: curs_inopts.3x,v 1.60 2023/12/23 16:36:18 tom Exp $ .TH curs_inopts 3X 2023-12-23 "ncurses 6.4" "Library calls" .ie \n(.g \{\ .ds `` \(lq .ds '' \(rq .\} .el \{\ .ie t .ds `` `` .el .ds `` "" .ie t .ds '' '' .el .ds '' "" .\} .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, bool \fIbf\fP); \fBint keypad(WINDOW *\fIwin\fP, bool \fIbf\fP); \fBint meta(WINDOW *\fIwin\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 \fBint raw(void); \fBint noraw(void); .PP \fBvoid qiflush(void); \fBvoid noqiflush(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 \%ncurses provides several functions that let an application change the way input from the terminal is handled. Some are global, applying to all windows. Others apply only to a specific window. Window-specific settings are not automatically applied to new or derived windows. An application must apply these to each window if the same behavior is desired. .\" .SS "cbreak, nocbreak" Normally, the terminal driver buffers typed characters until a newline or carriage return is typed. The \fB\%cbreak\fP routine disables line buffering and erase/kill character-processing (interrupt and flow control characters are unaffected), making characters typed by the user immediately available to the program. The \fB\%nocbreak\fP routine returns the terminal to normal (cooked) mode. .PP Initially the terminal may or may not be in \fB\%cbreak\fP mode, as the mode is inherited; therefore, a program should call \fB\%cbreak\fP or \fB\%nocbreak\fP explicitly. Most interactive programs using .I curses set the \fB\%cbreak\fP mode. Note that \fB\%cbreak\fP overrides \fBraw\fP. [See \fB\%curs_getch\fP(3X) for a discussion of how these routines interact with \fBecho\fP and \fB\%noecho\fP.] .\" .SS "echo, noecho" The \fBecho\fP and \fB\%noecho\fP routines control whether characters typed by the user are echoed by \fB\%getch\fP(3X) as they are typed. Echoing by the terminal driver is always disabled, but initially \fB\%getch\fP is in echo mode, so characters typed are echoed. Authors of most interactive programs prefer to do their own echoing in a controlled area of the screen, or not to echo at all, so they disable echoing by calling \fB\%noecho\fP. [See \fB\%curs_getch\fP(3X) for a discussion of how these routines interact with \fB\%cbreak\fP and \fB\%nocbreak\fP.] .\" .SS halfdelay The \fB\%halfdelay\fP routine is used for half-delay mode, which is similar to \fB\%cbreak\fP mode in that characters typed by the user are immediately available to the program. However, after blocking for \fItenths\fP tenths of seconds, \fBERR\fP is returned if nothing has been typed. The value of \fItenths\fP must be a number between 1 and 255. Use \fB\%nocbreak\fP to leave half-delay mode. .\" .SS intrflush If the \fB\%intrflush\fP option is enabled .RI ( bf is .BR TRUE ), and an interrupt key is pressed on the keyboard (interrupt, break, quit), all output in the terminal driver queue is flushed, giving the effect of faster response to the interrupt, but causing .I curses to have the wrong idea of what is on the screen. Disabling the option .RI ( bf is .BR FALSE ), prevents the flush. The default for the option is inherited from the terminal driver settings. The .I win argument is ignored. .\" .SS keypad The \fB\%keypad\fP option enables the keypad of the user's terminal. If enabled .RI ( bf is .BR TRUE ), the user can press a function key (such as an arrow key) and \fB\%wgetch\fP(3X) returns a single value representing the function key, as in \fB\%KEY_LEFT\fP. If disabled (\fIbf\fP is \fBFALSE\fP), .I curses does not treat function keys specially and the program has to interpret the escape sequences itself. If the keypad in the terminal can be turned on (made to transmit) and off (made to work locally), turning on this option causes the terminal keypad to be turned on when \fB\%wgetch\fP(3X) is called. The default value for keypad is \fBFALSE\fP. .\" .SS meta Initially, whether the terminal returns 7 or 8 significant bits on input depends on the control mode of the terminal driver [see \fI\%termios\fP(3)]. To force 8 bits to be returned, invoke \fBmeta\fP(\fIwin\fP, \fBTRUE\fP); this is equivalent, under POSIX, to setting the CS8 flag on the terminal. To force 7 bits to be returned, invoke \fBmeta\fP(\fIwin\fP, \fBFALSE\fP); this is equivalent, under POSIX, to setting the CS7 flag on the terminal. The window argument, .I win, is always ignored. If the terminfo capabilities \fBsmm\fP (meta_on) and \fBrmm\fP (meta_off) are defined for the terminal, \fBsmm\fP is sent to the terminal when \fBmeta\fP(\fIwin\fP, \fBTRUE\fP) is called and \fBrmm\fP is sent when \fBmeta\fP(\fIwin\fP, \fBFALSE\fP) is called. .\" .SS "nl, nonl" The \fBnl\fP and \fBnonl\fP routines control whether the underlying display device translates the return key into newline on input. .\" .SS nodelay The \fB\%nodelay\fP option causes \fB\%getch\fP to be a non-blocking call. If no input is ready, \fB\%getch\fP returns \fBERR\fP. If disabled .RI ( bf is .BR FALSE ), \fB\%getch\fP waits until a key is pressed. .SS notimeout When interpreting an escape sequence, \fB\%wgetch\fP(3X) sets a timer while waiting for the next character. If \fB\%notimeout(\fIwin\fR, \fBTRUE\fP) is called, then \fB\%wgetch\fP does not set a timer. The purpose of the timeout is to distinguish sequences produced by a function key from those typed by a user. .\" .SS "raw, noraw" The \fBraw\fP and \fB\%noraw\fP routines place the terminal into or out of raw mode. Raw mode is similar to \fB\%cbreak\fP mode, in that characters typed are immediately passed through to the user program. The differences are that in raw mode, the interrupt, quit, suspend, and flow control characters are all passed through uninterpreted, instead of generating a signal. The behavior of the BREAK key depends on other bits in the terminal driver that are not set by .I curses. .\" .SS "qiflush, nqiflush" When the \fB\%noqiflush\fP routine is used, normal flush of input and output queues associated with the \fBINTR\fP, \fBQUIT\fP and \fBSUSP\fP characters will not be done [see \fB\%termios\fP(3)]. When \fB\%qiflush\fP is called, the queues will be flushed when these control characters are read. You may want to call \fB\%noqiflush\fP in a signal handler if you want output to continue as though the interrupt had not occurred, after the handler exits. .\" .SS "timeout, wtimeout" The \fB\%timeout\fP and \fB\%wtimeout\fP routines set blocking or non-blocking read for a given window. If \fIdelay\fP is negative, a blocking read is used (i.e., waits indefinitely for input). If \fIdelay\fP is zero, then a non-blocking read is used (i.e., .I read returns \fBERR\fP if no input is waiting). If \fIdelay\fP is positive, then .I read blocks for \fIdelay\fP milliseconds, and returns \fBERR\fP if there is still no input. Hence, these routines provide the same functionality as \fB\%nodelay\fP, plus the additional capability of being able to block for only \fIdelay\fP milliseconds (where \fIdelay\fP is positive). .\" .SS typeahead .I curses does \*(``line-breakout optimization\*('' by looking for typeahead periodically while updating the screen. If input is found, and it is coming from a terminal, the current update is postponed until \fB\%refresh\fP(3X) or \fB\%doupdate\fP is called again. This allows faster response to commands typed in advance. Normally, the input .I FILE pointer passed to \fB\%newterm\fP, or \fBstdin\fP in the case that \fB\%initscr\fP was used, will be used to do this typeahead checking. The \fB\%typeahead\fP routine specifies that the file descriptor \fIfd\fP is to be used to check for typeahead instead. If \fIfd\fP is \-1, then no typeahead checking is done. .\" .SH RETURN VALUE All routines that return an integer return \fBERR\fP upon failure and \fBOK\fP (SVr4 specifies only \*(``an integer value other than \fBERR\fP\*('') upon successful completion, unless otherwise noted in the preceding routine descriptions. .PP X/Open does not define any error conditions. In this implementation, functions with a window parameter will return an error if it is null. Any function will also return an error if the terminal was not initialized. Also, .RS 3 .TP 5 \fB\%halfdelay\fP returns an error if its parameter is outside the range 1..255. .RE .SH NOTES \fBecho\fP, \fB\%noecho\fP, \fB\%halfdelay\fP, \fB\%intrflush\fP, \fBmeta\fP, \fBnl\fP, \fBnonl\fP, \fB\%nodelay\fP, \fB\%notimeout\fP, \fB\%noqiflush\fP, \fB\%qiflush\fP, \fB\%timeout\fP, and \fB\%wtimeout\fP may be implemented as macros. .PP \fB\%noraw\fP and \fB\%nocbreak\fP follow historical practice in that they attempt to restore normal (\*(``cooked\*('') mode from raw and cbreak modes respectively. Mixing \fBraw\fP/\fB\%noraw\fP and \fB\%cbreak\fP/\fB\%nocbreak\fP 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 that may be used to detect if the corresponding flags were set or reset. .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 4 \" "-1" + 2n 1 if the flag is set, .TP 0 if the flag is reset, or .TP \-1 if the library is not initialized. .PP They were designed for \fB\%ncurses\fP(3X), and are 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, Version 2 describes these functions. .PP .I \%ncurses follows X/Open Curses and the historical practice of AT&T .I curses implementations, in that the echo bit is cleared when .I curses initializes the terminal state. BSD .I curses differed from this slightly; it left the echo bit on at initialization, but the BSD \fBraw\fP call turned it off as a side effect. For best portability, set \fBecho\fP or \fB\%noecho\fP explicitly just after initialization, even if your program remains in cooked mode. .PP X/Open Curses is ambiguous regarding whether \fBraw\fP should disable the CR/LF translations controlled by \fBnl\fP and \fBnonl\fP. BSD .I curses did turn off these translations; AT&T .I curses (at least as late as SVr1) 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 \fB\%keypad\fP is first enabled, .I \%ncurses loads the key definitions for the current terminal description. If the terminal description includes extended string capabilities, e.g., from using the .B \-x option of \fB\%@TIC@\fP, then .I \%ncurses also defines keys for the capabilities whose names begin with \*(``k\*(''. The corresponding keycodes are generated and (depending on previous loads of terminal descriptions) may differ from one execution of a program to the next. The generated keycodes are recognized by the \fB\%keyname\fP(3X) function (which will then return a name beginning with \*(``k\*('' denoting the terminfo 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 establish a specific keycode for a given string. This makes it possible for an application to check for an extended capability's presence with \fB\%tigetstr\fP, and reassign the keycode to match its own needs. .PP Low-level applications can use \fB\%tigetstr\fP to obtain the definition of any particular string capability. Higher-level applications which use the .I curses \fB\%wgetch\fP and similar functions to return keycodes rely upon the order in which the strings are loaded. If more than one key definition has the same string value, then \fB\%wgetch\fP can return only one keycode. Most .I curses implementations (including .IR \%ncurses ) load key definitions in the order defined by the array of string capability names. The last key to be loaded determines the keycode which will be returned. In .I \%ncurses, you may also have extended capabilities interpreted as key definitions. These are loaded after the predefined keys, and if a capability's value is the same as a previously-loaded key definition, the later definition is the one used. .SH 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) ncurses-6.4-20240113/man/menu_win.3x0000644000000000000000000001015214530376627015321 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.30 2023/11/25 13:58:47 tom Exp $ .TH menu_win 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/form_requestname.3x0000644000000000000000000000656314537404526017064 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.33 2023/12/16 20:32:22 tom Exp $ .TH form_requestname 3X 2023-12-16 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_outopts.3x0000644000000000000000000002217214546074322016250 0ustar rootroot.\"*************************************************************************** .\" 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.56 2024/01/05 21:46:58 tom Exp $ .TH curs_outopts 3X 2024-01-05 "ncurses 6.4" "Library calls" .de bP .ie n .IP \(bu 4 .el .IP \(bu 2 .. .SH NAME \fB\%clearok\fP, \fB\%idlok\fP, \fB\%idcok\fP, \fB\%immedok\fP, \fB\%leaveok\fP, \fB\%setscrreg\fP, \fB\%wsetscrreg\fP, \fB\%scrollok\fP \- set \fIcurses\fR output options .SH SYNOPSIS .nf \fB#include .PP \fBint clearok(WINDOW *\fIwin\fP, bool \fIbf\fP); \fBint idlok(WINDOW *\fIwin\fP, bool \fIbf\fP); \fBvoid idcok(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 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 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 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 X/Open Curses does not define any error conditions. .PP In this implementation, .bP those functions that have a window pointer will return an error if the window pointer is null .bP \fBwsetscrreg\fP returns an error if the scrolling region limits extend outside the window. .PP X/Open does not define any error conditions. This implementation returns an error if the window pointer is null. .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 These functions are described in the XSI Curses standard, Issue 4. .PP From the outset, \fI\%ncurses\fP used \fBnl\fP/\fBnonl\fP to control the conversion of newlines to carriage return/line-feed on output as well as input. XSI Curses documents only the use of these functions for input. This difference arose from converting the \fIpcurses\fP source (which used \fBioctl\fP calls with the \fBsgttyb\fP structure) to termios (i.e., the POSIX terminal interface). In the former, both input and output were controlled via a single option \fBCRMOD\fP, while the latter separates these features. Because that conversion interferes with output optimization, \fBnl\fP/\fBnonl\fP were amended after \fI\%ncurses\fP 6.2 to eliminate their effect on output. .PP Some historic curses implementations had, as an undocumented feature, the ability to do the equivalent of \fBclearok(..., 1)\fP by saying \fBtouchwin(stdscr)\fP or \fBclear(stdscr)\fP. This will not work under \fI\%ncurses\fP. .PP Earlier System V curses implementations specified that with \fBscrollok\fP enabled, any window modification triggering a scroll also forced a physical refresh. XSI Curses does not require this, and \fI\%ncurses\fP avoids doing it to perform better vertical-motion optimization at \fBwrefresh\fP time. .PP The XSI Curses standard does not mention that the cursor should be made invisible as a side-effect of \fBleaveok\fP. SVr4 curses documentation does this, but the code does not. Use \fBcurs_set\fP to make the cursor invisible. .SH 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) ncurses-6.4-20240113/man/menu_pattern.3x0000644000000000000000000000775314530376627016216 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.36 2023/11/25 13:58:47 tom Exp $ .TH menu_pattern 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_opaque.3x0000644000000000000000000001365314537404526016034 0ustar rootroot.\"*************************************************************************** .\" Copyright 2020-2022,2023 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.41 2023/12/16 20:32:22 tom Exp $ .TH curs_opaque 3X 2023-12-16 "ncurses 6.4" "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) ncurses-6.4-20240113/man/user_caps.50000644000000000000000000004014314550604463015273 0ustar rootroot'\" 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.47 2024/01/13 22:05:39 tom Exp $ .TH user_caps 5 2024-01-13 "ncurses 6.4" "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 the Single Unix Specification beginning in 1995. .PP Most of the \fIextensions\fP in this fixed repertoire were additions to the tables of Boolean, numeric and string capabilities. Rather than change the meaning of an existing capability, a new name was added. The terminfo database uses a binary format; binary compatibility was ensured by using a header which gave the number of items in the tables for each type of capability. The standardization was incomplete: .bP The \fIbinary format\fP itself is not described in the X/Open Curses documentation. Only the \fIsource format\fP is described. .IP Library developers rely upon the SVr4 documentation, and reverse-engineering the compiled terminfo files to match the binary format. .bP Lacking a standard for the binary format, most implementations copy the SVr2 binary format, which uses 16-bit signed integers, and is limited to 4096-byte entries. .IP The format cannot represent very large numeric capabilities, nor can it represent large numbers of special keyboard definitions. .bP The tables of capability names differ between implementations. .IP Although they \fImay\fP provide all of the standard capability names, the position in the tables differs because some features were added as needed, while others were added (out of order) to comply with X/Open Curses. .IP While \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. ncurses-6.4-20240113/man/curs_border_set.3x0000644000000000000000000001474514530412514016662 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2022,2023 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.31 2023/11/25 15:39:56 tom Exp $ .TH curs_border_set 3X 2023-11-25 "ncurses 6.4" "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 an error if it is null. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH 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 the XSI Curses standard, 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) ncurses-6.4-20240113/man/curs_termattrs.3x0000644000000000000000000001331114546074322016553 0ustar rootroot.\"*************************************************************************** .\" 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.34 2024/01/05 21:46:58 tom Exp $ .TH curs_termattrs 3X 2024-01-05 "ncurses 6.4" "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 \- \fIcurses\fR environment query routines .SH SYNOPSIS .nf \fB#include .PP \fBint baudrate(void); \fBchar erasechar(void); \fBint erasewchar(wchar_t *\fIch\fP); \fBbool has_ic(void); \fBbool has_il(void); \fBchar killchar(void); \fBint killwchar(wchar_t *\fIch\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 \fIch\fP. If no erase character has been defined, the routine fails and the location referenced by \fIch\fP is not changed. .SS "has_is, has_il" 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 \fIch\fP. If no line-kill character has been defined, the routine fails and the location referenced by \fIch\fP is not changed. .SS longname 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 The XSI Curses standard, Issue 4 describes these functions. It changes the return type of \fBtermattrs\fP to the new type \fBattr_t\fP. Most versions of curses truncate the result returned by \fBtermname\fP to 14 characters. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_initscr\fP(3X), \fB\%curs_outopts\fP(3X) ncurses-6.4-20240113/man/curs_scanw.3x0000644000000000000000000002063414541570656015655 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.47 2023/12/23 14:41:50 tom Exp $ .TH curs_scanw 3X 2023-12-23 "ncurses 6.4" "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 .I \%ncurses, failure occurs if \fI\%vsscanf\fP(3) returns \fBEOF\fP, or if the window pointer .I win is null. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fB\%wmove\fP, and fail if the position is outside the window. .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 .I 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 .I 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) ncurses-6.4-20240113/man/mitem_current.3x0000644000000000000000000001047114530376627016361 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.35 2023/11/25 13:58:47 tom Exp $ .TH mitem_current 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_initscr.3x0000644000000000000000000003017714541605155016211 0ustar rootroot.\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: curs_initscr.3x,v 1.60 2023/12/23 16:27:25 tom Exp $ .TH curs_initscr 3X 2023-12-23 "ncurses 6.4" "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 \fBinitscr\fP is normally the first \fBcurses\fP routine to call when initializing a program. A few special routines sometimes need to be called before it; these are \fBslk_init\fP(3X), \fBfilter\fP, \fBripoffline\fP, \fBuse_env\fP. For multiple-terminal applications, \fBnewterm\fP may be called before \fBinitscr\fP. .PP The initscr code determines the terminal type and initializes all \fBcurses\fP data structures. \fBinitscr\fP also causes the first call to \fBrefresh\fP(3X) to clear the screen. If errors occur, \fBinitscr\fP writes an appropriate error message to standard error and exits; otherwise, a pointer is returned to \fBstdscr\fP. .SS newterm A program that outputs to more than one terminal should use the \fBnewterm\fP routine for each terminal instead of \fBinitscr\fP. A program that needs to inspect capabilities, so it can continue to run in a line-oriented mode if the terminal cannot support a screen-oriented program, would also use \fBnewterm\fP. .PP The routine \fBnewterm\fP should be called once for each terminal. It returns a variable of type \fISCREEN *\fP which should be saved as a reference to that terminal. \fBnewterm\fP's arguments are .bP the \fItype\fP of the terminal to be used in place of \fB$TERM\fP, .bP an output stream connected to the terminal, and .bP an input stream connected to the terminal .PP If the \fItype\fP parameter is \fBNULL\fP, \fB$TERM\fP will be used. .PP The file descriptor of the output stream is passed to \fBsetupterm\fP(3X), which returns a pointer to a \fI\%TERMINAL\fP structure. \fBnewterm\fP's return value holds a pointer to the \fI\%TERMINAL\fP structure. .SS endwin The program must also call \fBendwin\fP for each terminal being used before exiting from \fBcurses\fP. If \fBnewterm\fP is called more than once for the same terminal, the first terminal referred to must be the last one for which \fBendwin\fP is called. .PP A program should always call \fBendwin\fP before exiting or escaping from \fBcurses\fP mode temporarily. This routine .bP resets colors to correspond with the default color pair 0, .bP moves the cursor to the lower left-hand corner of the screen, .bP clears the remainder of the line so that it uses the default colors, .bP sets the cursor to normal visibility (see \fBcurs_set\fP(3X)), .bP stops cursor-addressing mode using the \fIexit_ca_mode\fP terminal capability, .bP restores tty modes (see \fBreset_shell_mode\fP(3X)). .PP Calling \fBrefresh\fP(3X) or \fBdoupdate\fP(3X) after a temporary escape causes the program to resume visual mode. .SS isendwin The \fBisendwin\fP routine returns \fBTRUE\fP if \fBendwin\fP has been called without any subsequent calls to \fBwrefresh\fP, and \fBFALSE\fP otherwise. .SS set_term The \fBset_term\fP routine is used to switch between different terminals. The screen reference \fInew\fP becomes the new current terminal. The previous terminal is returned by the routine. This is the only routine which manipulates \fISCREEN\fP pointers; all other routines affect only the current terminal. .SS delscreen The \fBdelscreen\fP routine frees storage associated with the \fISCREEN\fP data structure. The \fBendwin\fP routine does not do this, so \fBdelscreen\fP should be called after \fBendwin\fP if a particular \fISCREEN\fP is no longer needed. .SH RETURN VALUE \fBendwin\fP returns the integer \fBERR\fP upon failure and \fBOK\fP upon successful completion. .PP Routines that return pointers always return \fBNULL\fP on error. .PP X/Open defines no error conditions. In this implementation .bP \fBendwin\fP returns an error if .RS .bP the terminal was not initialized, or .bP \fBendwin\fP is called more than once without updating the screen, or .bP \fBreset_shell_mode\fP(3X) returns an error. .RE .bP \fBnewterm\fP returns an error if it cannot allocate the data structures for the screen, or for the top-level windows within the screen, i.e., \fBcurscr\fP, \fBnewscr\fP, or \fBstdscr\fP. .bP \fBset_term\fP returns no error. .SH PORTABILITY These functions were described in the XSI Curses standard, Issue 4. As of 2015, the current document is X/Open Curses, Issue 7. .SS Differences X/Open specifies that portable applications must not call \fBinitscr\fP more than once: .bP The portable way to use \fBinitscr\fP is once only, using \fB\%refresh\fP(3X) to restore the screen after \fBendwin\fP. .bP This implementation allows using \fBinitscr\fP after \fBendwin\fP. .PP Old versions of curses, e.g., BSD 4.4, would return a null pointer from \fBinitscr\fP when an error is detected, rather than exiting. It is safe but redundant to check the return value of \fBinitscr\fP in XSI Curses. .PP Calling \fBendwin\fP does not dispose of the memory allocated in \fBinitscr\fP or \fBnewterm\fP. Deleting a \fISCREEN\fP provides a way to do this: .bP X/Open Curses does not say what happens to \fI\%WINDOW\fPs when \fBdelscreen\fP \*(``frees storage associated with the \fISCREEN\fP\*('' nor does the SVr4 documentation help, adding that it should be called after \fBendwin\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 \fBdelscreen\fP to deal with these. .bP SVr4 curses deletes the standard \fI\%WINDOW\fP structures \fBstdscr\fP and \fBcurscr\fP as well as a work area \fBnewscr\fP. SVr4 curses ignores other windows. .bP Since version 4.0 (1996), \fI\%ncurses\fP has maintained a list of all windows for each screen, using that information to delete those windows when \fBdelscreen\fP is called. .bP NetBSD copied this feature of \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 \fBnewterm\fP) and \fI\%TERMINAL\fP (returned by \fBsetupterm\fP(3X)) hold file descriptors for the output stream. If an application switches screens using \fBset_term\fR, or switches terminals using \fBset_curterm\fP(3X), applications which use the output file descriptor can have different behavior depending on which structure holds the corresponding descriptor. .PP For example .bP NetBSD's \fBbaudrate\fP(3X) function uses the descriptor in \fI\%TERMINAL\fP. \fI\%ncurses\fP and SVr4 use the descriptor in \fISCREEN\fP. .bP NetBSD and \fI\%ncurses\fP use the descriptor in \fI\%TERMINAL\fP for terminal I/O modes, e.g., \fBdef_shell_mode\fP(3X), \fBdef_prog_mode\fP(3X). SVr4 curses uses the descriptor in \fISCREEN\fP. .SS "Unset \fITERM\fP Variable" If the \fITERM\fP variable is missing or empty, \fBinitscr\fP uses the value \*(``unknown\*('', which normally corresponds to a terminal entry with the \fIgeneric\fP (\fIgn\fP) capability. Generic entries are detected by \fBsetupterm\fP(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., \fBinitscr\fP or \fBnewterm\fP. Applications which must handle these signals should set up the corresponding handlers \fIafter\fP initializing the library: .TP 5 .B SIGINT The handler \fIattempts\fP to cleanup the screen on exit. Although it \fIusually\fP works as expected, there are limitations: .RS 5 .bP Walking the \fISCREEN\fP list is unsafe, since all list management is done without any signal blocking. .bP On systems which have \fBREENTRANT\fP turned on, \fBset_term\fP uses functions which could deadlock or misbehave in other ways. .bP \fBendwin\fP calls other functions, many of which use \fI\%stdio\fP(3) or other library functions which are clearly unsafe. .RE .TP 5 .B SIGTERM This uses the same handler as \fBSIGINT\fP, with the same limitations. It is not mentioned in X/Open Curses, but is more suitable for this purpose than \fBSIGQUIT\fP (which is used in debugging). .TP 5 .B SIGTSTP This handles the \fIstop\fP signal, used in job control. When resuming the process, this implementation discards pending input with \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 which is later tested in \fB\%wgetch\fP(3X). If \fBkeypad\fP has been enabled for the corresponding window, \fBwgetch\fP returns the key symbol \fBKEY_RESIZE\fP. At the same time, \fBwgetch\fP calls \fBresizeterm\fP to adjust the standard screen \fBstdscr\fP, and update other data such as \fBLINES\fP and \fBCOLS\fP. .SH SEE ALSO \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) ncurses-6.4-20240113/man/curs_bkgd.3x0000644000000000000000000001767514541606076015460 0ustar rootroot.\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: curs_bkgd.3x,v 1.55 2023/12/23 16:35:10 tom Exp $ .TH curs_bkgd 3X 2023-12-23 "ncurses 6.4" "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 The .I background of a .I curses window (in the library's non-\*(``wide\*('' configuration) is a .I \%chtype combining a set of attributes (see \fB\%curs_attr\fP(3X)) with a character called the .I "blank character." .PP The blank character is a spacing character that populates a window's character cells when their contents are erased without replacement. The background's attributes are combined with all non-blank characters written to the window, as with the \fB\%waddch\fP(3X) and \fB\%winsch\fP(3X) families of functions. .PP The blank character and attributes of the background combine with characters written to the window as described below. 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 blank character; if they match, .I \%ncurses writes the new blank 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 .I \%ncurses treats a background character value of zero (0) as a blank character. .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. .I \%ncurses, like SVr4 .I 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 .I \%ncurses. .PP \fB\%curses\fP(3X), \fB\%curs_addch\fP(3X), \fB\%curs_attr\fP(3X) ncurses-6.4-20240113/man/form_fieldtype.3x0000644000000000000000000001444214530376627016516 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.44 2023/11/25 13:58:47 tom Exp $ .TH form_fieldtype 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/mitem_userptr.3x0000644000000000000000000000641114530376627016402 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.32 2023/11/25 13:58:47 tom Exp $ .TH mitem_userptr 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/menu.3x0000644000000000000000000001667314541602771014454 0ustar rootroot'\" t .\"*************************************************************************** .\" Copyright 2018-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. * .\"*************************************************************************** .\" .\" $Id: menu.3x,v 1.43 2023/12/23 16:08:25 tom Exp $ .TH menu 3X 2023-12-23 "ncurses 6.4" "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 \- curses extension for programming menus .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. ncurses-6.4-20240113/man/scr_dump.50000644000000000000000000003250314544112154015116 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2021,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: scr_dump.5,v 1.42 2023/12/30 22:06:36 tom Exp $ .TH scr_dump 5 2023-12-30 "ncurses 6.4" "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 .I curses. This is odd, since Solaris was the first operating system to meet the SVr4 guidelines. Solaris furthermore supplies two versions of .I 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 .I /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) ncurses-6.4-20240113/man/curs_in_wchstr.3x0000644000000000000000000001207314526222266016532 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.32 2023/11/18 20:55:18 tom Exp $ .TH curs_in_wchstr 3X 2023-11-18 "ncurses 6.4" "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 in_wchnstr(cchar_t *\fIwchstr\fP, int \fIn\fP); \fBint win_wchstr(WINDOW *\fIwin\fP, cchar_t *\fIwchstr\fP); \fBint win_wchnstr(WINDOW *\fIwin\fP, cchar_t *\fIwchstr\fP, int \fIn\fP); .PP \fBint mvin_wchstr(int \fIy\fP, int \fIx\fP, cchar_t *\fIwchstr\fP); \fBint mvin_wchnstr(int \fIy\fP, int \fIx\fP, cchar_t *\fIwchstr\fP, int \fIn\fP); \fBint mvwin_wchstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, cchar_t *\fIwchstr\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 an error .bP if the \fIwin\fP parameter is null or .bP if the \fIwchstr\fP parameter is null. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES All 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 The XSI Curses defines no error conditions. This implementation checks for null pointers, returning \fBERR\fP in that case. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_inchstr\fP(3X), \fB\%curs_instr\fP(3X), \fB\%curs_inwstr\fP(3X), \fB\%curs_in_wch\fP(3X) ncurses-6.4-20240113/man/mitem_value.3x0000644000000000000000000000664414530376627016022 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.30 2023/11/25 13:58:47 tom Exp $ .TH mitem_value 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_add_wch.3x0000644000000000000000000003317014550604463016124 0ustar rootroot'\" 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.53 2024/01/13 22:05:39 tom Exp $ .TH curs_add_wch 3X 2024-01-13 "ncurses 6.4" "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 and advance 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 add_wch The \fBadd_wch\fP, \fBwadd_wch\fP, \fBmvadd_wch\fP, and \fBmvwadd_wch\fP functions put the complex character \fIwch\fP into the given window at its current position, which is then advanced. These functions perform wrapping and special-character processing as follows: .bP If \fIwch\fP refers to a spacing character, then any previous character at that location is removed. A new character specified by \fIwch\fP is placed at that location with rendition specified by \fIwch\fP. The cursor then advances after this spacing character, to prepare for writing the next character on the screen. .IP The newly added spacing character is the base of the active complex character. Subsequent non-spacing characters can be combined with this base until another spacing character is written to the screen, or the cursor is moved, e.g., using \fBwmove\fP. .bP If \fIwch\fP refers to a non-spacing character, it is appended to the active complex character, retaining the previous characters at that location. The rendition specified by \fIwch\fP is ignored. .IP The cursor is not advanced after adding a non-spacing character. Subsequent calls to add non-spacing characters will update the same position. .bP If the character part of \fIwch\fP is a tab, newline, backspace or other control character, the window is updated and the cursor moves as if \fBaddch\fP were called. .SS echo_wchar The \fBecho_wchar\fP function is functionally equivalent to a call to \fBadd_wch\fP followed by a call to \fB\%refresh\fP(3X). Similarly, the \fBwecho_wchar\fP is functionally equivalent to a call to \fBwadd_wch\fP followed by a call to \fBwrefresh\fP. The knowledge that only a single character is being output is taken into consideration and, for non-control characters, a considerable performance gain might be seen by using the *\fBecho\fP* functions instead of their equivalents. .SS "Line Graphics" Like \fB\%addch\fP(3X), \fBaddch_wch\fP accepts symbols which make it simple to draw lines and other frequently used special characters. These symbols correspond to the same VT100 line-drawing set as \fB\%addch\fP(3X). .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_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 All routines return the integer \fBERR\fP upon failure and \fBOK\fP on success. .PP X/Open does not define any error conditions. This implementation returns an error .bP if the window pointer is null or .bP if it is not possible to add a complete character in the window. .PP The latter may be due to different causes: .bP If \fB\%scrollok\fP(3X) is not enabled, writing a character at the lower right margin succeeds. However, an error is returned because it is not possible to wrap to a new line. .bP If an error is detected when converting a multibyte character to a sequence of bytes, or if it is not possible to add all of the resulting bytes in the window, an error is returned. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES Note that \fBadd_wch\fP, \fBmvadd_wch\fP, \fBmvwadd_wch\fP, and \fBecho_wchar\fP may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. The defaults specified for line-drawing characters apply in the POSIX locale. .SS "WACS Symbols" 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 define symbols for thick- or double-lines. SVr4 curses implementations defined their line-drawing symbols in terms of intermediate symbols. This implementation extends those symbols, providing new definitions which are not in the SVr4 implementations. .PP Not all Unicode-capable terminals provide support for VT100-style alternate character sets (i.e., the \fBacsc\fP capability), with their corresponding line-drawing characters. X/Open Curses did not address the aspect of integrating Unicode with line-drawing characters. Existing implementations of Unix curses (AIX, 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 \fBcchar_t\fR can store more than one wide character (\fBwchar_t\fR). The X/Open Curses description does not mention this possibility, describing only the cases where \fIwch\fP is a spacing character or a non-spacing character. .PP This implementation assumes that \fIwch\fP is constructed using \fB\%setcchar\fP(3X), and in turn that the result .bP contains at most one spacing character in the beginning of its list of wide characters, and zero or more non-spacing characters or .bP may hold one non-spacing character. .PP In the latter case, \fI\%ncurses\fP adds the non-spacing character to the active (base) spacing character. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_addch\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\%putwc\fP(3) ncurses-6.4-20240113/man/curs_overlay.3x0000644000000000000000000001107014546074322016207 0ustar rootroot.\"*************************************************************************** .\" 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.39 2024/01/05 21:46:58 tom Exp $ .TH curs_overlay 3X 2024-01-05 "ncurses 6.4" "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 an error if either of the window pointers are null, or if some part of the window would be placed off-screen. .SH NOTES Note that \fBoverlay\fP and \fBoverwrite\fP may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, 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) ncurses-6.4-20240113/man/term.50000644000000000000000000004147114550604463014263 0ustar rootroot'\" 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.73 2024/01/13 22:05:39 tom Exp $ .TH term 5 2024-01-13 "ncurses 6.4" "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 .. . .ds d @TERMINFO@ .SH NAME term \- compiled \fIterminfo\fR terminal description .SH SYNOPSIS .B term .SH DESCRIPTION .SS "Storage Location" Compiled terminfo descriptions are placed under the directory \fB\*d\fP. Two configurations are supported (when building the \fI\%ncurses\fP libraries): .TP 5 .B directory tree A two-level scheme is used to avoid a linear search of a huge Unix system directory: \fB\*d/c/name\fP where .I name is the name of the terminal, and .I c is the first character of .IR name . Thus, .I act4 can be found in the file \fB\*d/a/act4\fP. Synonyms for the same terminal are implemented by multiple links to the same compiled file. .TP 5 .B hashed database Using Berkeley database, two types of records are stored: the terminfo data in the same format as stored in a directory tree with the terminfo's primary name as a key, and records containing only aliases pointing to the primary name. .IP If built to write hashed databases, \fI\%ncurses\fP can still read terminfo databases organized as a directory tree, but cannot write entries into the directory tree. It can write (or rewrite) entries in the hashed database. .IP \fI\%ncurses\fP distinguishes the two cases in the \fI\%TERMINFO\fP and \fI\%TERMINFO_DIRS\fP environment variable by assuming a directory tree for entries that correspond to an existing directory, and hashed database otherwise. .SS "Legacy Storage Format" The format has been chosen so that it will be the same on all hardware. An 8 or more bit byte is assumed, but no assumptions about byte ordering or sign extension are made. .PP The compiled file is created with the \fB@TIC@\fP program, and read by the routine \fBsetupterm\fP(3X). The file is divided into six parts: .RS 5 .TP 3 a) \fIheader\fP, .TP 3 b) \fIterminal names\fP, .TP 3 c) \fIBoolean flags\fP, .TP 3 d) \fInumbers\fP, .TP 3 e) \fIstrings\fP, and .TP 3 f) \fIstring table\fP. .RE .PP The \fIheader\fP section begins the file. This section contains six short integers in the format described below. These integers are .RS 5 .TP 5 (1) the \fImagic number\fP (octal 0432); .TP 5 (2) the size, in bytes, of the \fIterminal names\fP section; .TP 5 (3) the number of bytes in the \fIBoolean flags\fP section; .TP 5 (4) the number of short integers in the \fInumbers\fP section; .TP 5 (5) the number of offsets (short integers) in the \fIstrings\fP section; .TP 5 (6) the size, in bytes, of the \fIstring table\fP. .RE .PP The capabilities in the \fIBoolean flags\fP, \fInumbers\fP, and \fIstrings\fP sections are in the same order as the file . .PP Short integers are signed, in the range \-32768 to 32767. They are stored as two 8-bit bytes. The first byte contains the least significant 8 bits of the value, and the second byte contains the most significant 8 bits. (Thus, the value represented is 256*second+first.) This format corresponds to the hardware of the \s-1VAX\s+1 and \s-1PDP\s+1-11 (that is, little-endian machines). Machines where this does not correspond to the hardware must read the integers as two bytes and compute the little-endian value. .PP Numbers in a terminal description, whether they are entries in the \fInumbers\fP or \fIstrings\fP table, are positive integers. Boolean flags are treated as positive one-byte integers. In each case, those positive integers represent a terminal capability. The terminal compiler @TIC@ uses negative integers to handle the cases where a capability is not available: .bP If a capability is absent from this terminal, @TIC@ stores a \-1 in the corresponding table. .IP The integer value \-1 is represented by two bytes 0377, 0377. .br Absent Boolean values are represented by the byte 0 (false). .bP If a capability has been canceled from this terminal, @TIC@ stores a \-2 in the corresponding table. .IP The integer value \-2 is represented by two bytes 0377, 0376. .br The Boolean value \-2 is represented by the byte 0376. .br .bP Other negative values are illegal. .PP The \fIterminal names\fP section comes after the \fIheader\fP. It contains the first line of the terminfo description, listing the various names for the terminal, separated by the \*(``|\*('' character. The \fIterminal names\fP section is terminated with an \s-1ASCII NUL\s+1 character. .PP The \fIBoolean flags\fP section has one byte for each flag. Boolean capabilities are either 1 or 0 (true or false) according to whether the terminal supports the given capability or not. .PP Between the \fIBoolean flags\fP section and the \fInumber\fP section, a null byte will be inserted, if necessary, to ensure that the \fInumber\fP section begins on an even byte This is a relic of the PDP\-11's word-addressed architecture, originally designed to avoid traps induced by addressing a word on an odd byte boundary. All short integers are aligned on a short word boundary. .PP The \fInumbers\fP section is similar to the \fIBoolean flags\fP section. Each capability takes up two bytes, and is stored as a little-endian short integer. .PP The \fIstrings\fP section is also similar. Each capability is stored as a short integer. The capability value is an index into the \fIstring table\fP. .PP The \fIstring table\fP is the last section. It contains all of the values of string capabilities referenced in the \fIstrings\fP section. Each string is null-terminated. Special characters in \*^X or \ec notation are stored in their interpreted form, not the printing representation. Padding information $ and parameter information %x are stored intact in uninterpreted form. .SS "Extended Storage Format" The previous section describes the conventional terminfo binary format. With some minor variations of the offsets (see PORTABILITY), the same binary format is used in all modern Unix systems. Each system uses a predefined set of Boolean, number or string capabilities. .PP The \fI\%ncurses\fP libraries and applications support extended terminfo binary format, allowing users to define capabilities which are loaded at runtime. This extension is made possible by using the fact that the other implementations stop reading the terminfo data when they have reached the end of the size given in the header. \fI\%ncurses\fP checks the size, and if it exceeds that due to the predefined data, continues to parse according to its own scheme. .PP First, it reads the extended header (5 short integers): .RS 5 .TP 5 (1) count of extended Boolean capabilities .TP 5 (2) count of extended numeric capabilities .TP 5 (3) count of extended string capabilities .TP 5 (4) count of the items in extended string table .TP 5 (5) size of the extended string table in bytes .RE .PP The count- and size-values for the extended string table include the extended capability \fInames\fP as well as extended capability \fIvalues\fP. .PP Using the counts and sizes, \fI\%ncurses\fP allocates arrays and reads data for the extended capabilities in the same order as the header information. .PP The extended string table contains values for string capabilities. After the end of these values, it contains the names for each of the extended capabilities in order, e.g., Booleans, then numbers and finally strings. .PP By storing terminal descriptions in this way, \fI\%ncurses\fP is able to provide a database useful with legacy applications, as well as providing data for applications which need more than the predefined capabilities. See \fBuser_caps\fP(5) for an overview of the way \fI\%ncurses\fP uses this extended information. .PP Applications which manipulate terminal data can use the definitions described in \fBterm_variables\fP(3X) which associate the long capability names with members of a \fBTERMTYPE\fP structure. . .SS "Extended Number Format" On occasion, 16-bit signed integers are not large enough. With \fI\%ncurses\fP 6.1, a new format was introduced by making a few changes to the legacy format: .bP a different magic number (octal 01036) .bP changing the type for the \fInumber\fP array from signed 16-bit integers to signed 32-bit integers. .PP To maintain compatibility, the library presents the same data structures to direct users of the \fBTERMTYPE\fP structure as in previous formats. However, that cannot provide callers with the extended numbers. The library uses a similar but hidden data structure \fBTERMTYPE2\fP to provide data for the terminfo functions. .SH FILES .TP .I \*d 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 terminfo database. System V curses used a directory-tree of binary files, one per terminal description. .PP Despite the consistent use of little-endian for numbers and the otherwise self-describing format, it is not wise to count on portability of binary terminfo entries between commercial Unix versions. The problem is that there are at least three versions of terminfo (under HP\-UX, AIX, and OSF/1) which diverged from System V terminfo after SVr1, and have added extension capabilities to the string table that (in the binary format) collide with System V and XSI Curses extensions. See \fBterminfo\fP(5) for detailed discussion of terminfo source compatibility issues. .PP This implementation is by default compatible with the binary terminfo format used by Solaris curses, except in a few less-used details where it was found that the latter did not match X/Open Curses. The format used by the other Unix versions can be matched by building \fI\%ncurses\fP with different configuration options. .SS "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 \fBfile\fP(1) also use that to tell what the file-format is. System V defined more than one magic number, with 0433, 0435 as screen-dumps (see \fBscr_dump\fP(5)). This implementation uses 01036 as a continuation of that sequence, but with a different high-order byte to avoid confusion. .SS "The \fITERMTYPE\fP Structure" Direct access to the \fBTERMTYPE\fP structure is provided for legacy applications. Portable applications should use the \fBtigetflag\fP and related functions described in \fBcurs_terminfo\fP(3X) for reading terminal capabilities. .SS "Mixed-case Terminal Names" A small number of terminal descriptions use uppercase characters in their names. If the underlying filesystem ignores the difference between uppercase and lowercase, \fI\%ncurses\fP represents the \*(``first character\*('' of the terminal name used as the intermediate level of a directory tree in (two-character) hexadecimal form. .SS Limits \fI\%ncurses\fP stores compiled terminal descriptions in three related formats, described in the sections .bP \fBLEGACY STORAGE FORMAT\fP, and .bP \fBEXTENDED STORAGE FORMAT\fP, and .bP \fBEXTENDED NUMBER FORMAT\fP. .PP The legacy storage format and the extended number format differ by the types of numeric capability which they can store (i.e., 16-bit versus 32-bit integers). The extended storage format introduced by \fI\%ncurses\fP 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 As an example, here is a description for 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 and a hexadecimal dump of the compiled terminal description: .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 terminfo format for \fI\%ncurses\fP 5.0 .br hashed database support for \fI\%ncurses\fP 5.6 .br extended number support for \fI\%ncurses\fP 6.1 .sp Eric S. Raymond .br documented legacy terminfo format, e.g., from \fIpcurses\fP. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_terminfo\fP(3X), \fB\%terminfo\fP(5), \fB\%user_caps\fP(5) ncurses-6.4-20240113/man/terminfo.tail0000644000000000000000000022260314550604463015722 0ustar rootroot.\"*************************************************************************** .\" 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.143 2024/01/13 22:05:39 tom Exp $ .ps +1 .SS "User-Defined Capabilities" . The preceding section listed the \fIpredefined\fP capabilities. They deal with some special features for terminals no longer (or possibly never) produced. Occasionally there are special features of newer terminals which are awkward or impossible to represent by reusing the predefined capabilities. .PP \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\*d\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\*d\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 row, give this as .BR cr . (Normally this will be carriage return, control/M.) If there is a code to produce an audible signal (bell, beep, etc) give this as .BR bel . .PP If there is a code to move the cursor one position to the left (such as backspace) that capability should be given as .BR cub1 . Similarly, codes to move to the right, up, and down should be given as .BR cuf1 , .BR cuu1 , and .BR cud1 . These local cursor motions should not alter the text they pass over, for example, you would not normally use \*(``\fBcuf1\fP=\ \*('' because the space would erase the character moved over. .PP A very important point here is that the local cursor motions encoded in .I terminfo are undefined at the left and top edges of a \s-1CRT\s0 terminal. Programs should never attempt to backspace around the left edge, unless .B bw is given, and never attempt to go up locally off the top. In order to scroll text up, a program will go to the bottom left corner of the screen and send the .B ind (index) string. .PP To scroll text down, a program goes to the top left corner of the screen and sends the .B ri (reverse index) string. The strings .B ind and .B ri are undefined when not on their respective corners of the screen. .PP Parameterized versions of the scrolling sequences are .B indn and .B rin which have the same semantics as .B ind and .B ri except that they take one parameter, and scroll that many lines. They are also undefined except at the appropriate edge of the screen. .PP The \fBam\fP capability tells whether the cursor sticks at the right edge of the screen when text is output, but this does not necessarily apply to a .B cuf1 from the last column. The only local motion which is defined from the left edge is if .B bw is given, then a .B cub1 from the left edge will move to the right edge of the previous row. If .B bw is not given, the effect is undefined. This is useful for drawing a box around the edge of the screen, for example. If the terminal has switch selectable automatic margins, the .I terminfo file usually assumes that this is on; i.e., \fBam\fP. If the terminal has a command which moves to the first column of the next line, that command can be given as .B nel (newline). It does not matter if the command clears the remainder of the current line, so if the terminal has no .B cr and .B lf it may still be possible to craft a working .B nel out of one or both of them. .PP These capabilities suffice to describe hard-copy and \*(``glass-tty\*('' terminals. Thus the model 33 teletype is described as .PP .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 row and column to address to. (Rows and columns are numbered from zero and refer to the physical screen visible to the user, not to any unseen memory.) If the terminal has memory relative cursor addressing, that can be indicated by .BR mrcup . .PP The parameter mechanism uses a stack and special \fB%\fP codes to manipulate it. Typically a sequence will push one of the parameters onto the stack and then print it in some format. Print (e.g., \*(``%d\*('') is a special case. Other operations, including \*(``%t\*('' pop their operand from the stack. It is noted that more complex operations are often necessary, e.g., in the \fBsgr\fP string. .PP The \fB%\fP encodings have the following meanings: .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 row 3 and column 12, needs to be sent \eE&a12c03Y padded for 6 milliseconds. The order of the rows and columns is inverted here, and the row 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 row and column sent preceded by a \fB\*^T\fP, with the row 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 row 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 row or column absolute cursor addressing, these can be given as single parameter capabilities .B hpa (horizontal position absolute) and .B vpa (vertical position absolute). Sometimes these are shorter than the more general two parameter sequence (as with the hp2645) and can be used in preference to .BR cup . If there are parameterized local motions (e.g., move .I n spaces to the right) these can be given as .BR cud , .BR cub , .BR cuf , and .B cuu with a single parameter indicating how many spaces to move. These are primarily useful if the terminal does not have .BR cup , such as the \s-1TEKTRONIX\s+1 4025. .PP If the terminal needs to be in a special mode when running a program that uses these capabilities, the codes to enter and exit this mode can be given as \fBsmcup\fP and \fBrmcup\fP. This arises, for example, from terminals like the Concept with more than one page of memory. If the terminal has only memory relative cursor addressing and not screen relative cursor addressing, a one screen-sized window must be fixed into the terminal for cursor addressing to work properly. This is also used for the \s-1TEKTRONIX\s+1 4025, where .B smcup sets the command character to be the one used by terminfo. If the \fBsmcup\fP sequence will not restore the screen after an \fBrmcup\fP sequence is output (to the state prior to outputting \fBrmcup\fP), specify \fBnrrmc\fP. .SS Margins SVr4 (and X/Open Curses) list several string capabilities for setting margins. Two were intended for use with terminals, and another six were intended for use with printers. .bP The two terminal capabilities assume that the terminal may have the capability of setting the left and/or right margin at the current cursor column position. .bP The printer capabilities assume that the printer may have two types of capability: .RS .bP the ability to set a top and/or bottom margin using the current line position, and .bP parameterized capabilities for setting the top, bottom, left, right margins given the number of rows or columns. .RE .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 XSI Curses expect that \fBind\fP, \fBri\fP, \fBindn\fP, and \fBrin\fP will simulate destructive scrolling; their documentation cautions you not to define \fBcsr\fP unless this is true. This \fBcurses\fP implementation is more liberal and will do explicit erases after scrolling if \fBndsrc\fP is defined. .PP If the terminal has the ability to define a window as part of memory, which all commands affect, it should be given as the parameterized string .BR wind . The four parameters are the starting and ending lines in memory and the starting and ending columns in memory, in that order. .PP If the terminal can retain display memory above, then the \fBda\fP capability should be given; if display memory can be retained below, then \fBdb\fP should be given. These indicate that deleting a line or scrolling may bring non-blank lines up from below or that scrolling back with \fBri\fP may bring down non-blank lines. .SS "Insert/Delete Character" There are two basic kinds of intelligent terminals with respect to insert/delete character which can be described using .I terminfo. The most common insert/delete character operations affect only the characters on the current line and shift characters off the end of the line rigidly. Other terminals, such as the Concept 100 and the Perkin Elmer Owl, make a distinction between typed and untyped blanks on the screen, shifting upon an insert or delete only to an untyped blank on the screen which is either eliminated, or expanded to two untyped blanks. .PP You can determine the kind of terminal you have by clearing the screen and then typing text separated by cursor motions. Type \*(``abc\ \ \ \ def\*('' using local cursor motions (not spaces) between the \*(``abc\*('' and the \*(``def\*(''. Then position the cursor before the \*(``abc\*('' and put the terminal in insert mode. If typing characters causes the rest of the line to shift rigidly and characters to fall off the end, then your terminal does not distinguish between blanks and untyped positions. If the \*(``abc\*('' shifts over to the \*(``def\*('' which then move together around the end of the current line and onto the next as you insert, you have the second type of terminal, and should give the capability \fBin\fP, which stands for \*(``insert null\*(''. .PP While these are two logically separate attributes (one line versus multi-line insert mode, and special treatment of untyped spaces) we have seen no terminals whose insert mode cannot be described with the single attribute. .PP Terminfo can describe both terminals which have an insert mode, and terminals which send a simple sequence to open a blank position on the current line. Give as \fBsmir\fP the sequence to get into insert mode. Give as \fBrmir\fP the sequence to leave insert mode. Now give as \fBich1\fP any sequence needed to be sent just before sending the character to be inserted. Most terminals with a true insert mode will not give \fBich1\fP; terminals which send a sequence to open a screen position should give it here. .PP If your terminal has both, insert mode is usually preferable to \fBich1\fP. Technically, you should not give both unless the terminal actually requires both to be used in combination. Accordingly, some non-curses applications get confused if both are present; the symptom is doubled characters in an update using insert. This requirement is now rare; most \fBich\fP sequences do not require previous smir, and most smir insert modes do not require \fBich1\fP before each character. Therefore, the new \fBcurses\fP actually assumes this is the case and uses either \fBrmir\fP/\fBsmir\fP or \fBich\fP/\fBich1\fP as appropriate (but not both). If you have to write an entry to be used under new curses for a terminal old enough to need both, include the \fBrmir\fP/\fBsmir\fP sequences in \fBich1\fP. .PP If post insert padding is needed, give this as a number of milliseconds in \fBip\fP (a string option). Any other sequence which may need to be sent after an insert of a single character may also be given in \fBip\fP. If your terminal needs both to be placed into an \*(``insert mode\*('' and a special code to precede each inserted character, then both .BR smir / rmir and .B ich1 can be given, and both will be used. The .B ich capability, with one parameter, .IR n , will repeat the effects of .B ich1 .I n times. .PP If padding is necessary between characters typed while not in insert mode, give this as a number of milliseconds padding in \fBrmp\fP. .PP It is occasionally necessary to move around while in insert mode to delete characters on the same line (e.g., if there is a tab after the insertion position). If your terminal allows motion while in insert mode you can give the capability \fBmir\fP to speed up inserting in this case. Omitting \fBmir\fP will affect only speed. Some terminals (notably Datamedia's) must not have \fBmir\fP because of the way their insert mode works. .PP Finally, you can specify .B dch1 to delete a single character, .B dch with one parameter, .IR n , to delete .I n characters, and delete mode by giving \fBsmdc\fP and \fBrmdc\fP to enter and exit delete mode (any mode the terminal needs to be placed in for .B dch1 to work). .PP A command to erase .I n characters (equivalent to outputting .I n blanks without moving the cursor) can be given as .B ech with one parameter. .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 row). If a more complex sequence is needed to set the tabs than can be described by this, the sequence can be placed in .B is2 or .BR if . .PP The \fB@TPUT@ reset\fP command uses the same capability strings as the \fB@RESET@\fP command, although the two programs (\fB@TPUT@\fP and \fB@RESET@\fP) provide different command-line options. .PP In practice, these terminfo capabilities are not often used in initialization of tabs (though they are required for the \fB@TABS@\fP program): .bP Almost all hardware terminals (at least those which supported tabs) initialized those to every \fIeight\fP columns: .IP The only exception was the AT&T 2300 series, which set tabs to every \fIfive\fP columns. .bP In particular, developers of the hardware terminals which are commonly used as models for modern terminal emulators provided documentation demonstrating that \fIeight\fP columns were the standard. .bP Because of this, the terminal initialization programs \fB@TPUT@\fP and \fB@TSET@\fP use the \fBtbc\fP (\fBclear_all_tabs\fP) and \fBhts\fP (\fBset_tab\fP) capabilities directly only when the \fBit\fP (\fBinit_tabs\fP) capability is set to a value other than \fIeight\fP. .SS "Delays and Padding" 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 characters independently, mixing them into \fIN\fP\ *\ \fIN\fP color pairs. .bP On HP-like terminals, the user must set each color pair up separately (foreground and background are not independently settable). Up to \fIM\fP color pairs may be set up from 2*\fIM\fP different colors. ANSI-compatible terminals are Tektronix-like. .PP Some basic color capabilities are independent of the color method. The numeric capabilities \fBcolors\fP and \fBpairs\fP specify the maximum numbers of colors and color pairs that can be displayed simultaneously. The \fBop\fP (original pair) string resets foreground and background colors to their default values for the terminal. The \fBoc\fP string resets all colors or color pairs to their default values for the terminal. Some terminals (including many PC terminal emulators) erase screen areas with the current background color rather than the power-up default background; these should have the Boolean capability \fBbce\fP. .PP While the curses library works with \fIcolor pairs\fP (reflecting the inability of some devices to set foreground and background colors independently), there are separate capabilities for setting these features: .bP To change the current foreground or background color on a Tektronix-type terminal, use \fBsetaf\fP (set ANSI foreground) and \fBsetab\fP (set ANSI background) or \fBsetf\fP (set foreground) and \fBsetb\fP (set background). These take one parameter, the color number. The SVr4 documentation describes only \fBsetaf\fP/\fBsetab\fP; the XPG4 draft says that "If the terminal supports ANSI escape sequences to set background and foreground, they should be coded as \fBsetaf\fP and \fBsetab\fP, respectively. .bP If the terminal supports other escape sequences to set background and foreground, they should be coded as \fBsetf\fP and \fBsetb\fP, respectively. The \fBvidputs\fP and the \fBrefresh\fP(3X) functions use the \fBsetaf\fP and \fBsetab\fP capabilities if they are defined. .PP The \fBsetaf\fP/\fBsetab\fP and \fBsetf\fP/\fBsetb\fP capabilities take a single numeric argument each. Argument values 0-7 of \fBsetaf\fP/\fBsetab\fP are portably defined as follows (the middle column is the symbolic #define available in the header for the \fBcurses\fP or \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 .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 \*d 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 the XSI Curses standard. They are deduced from the documentation for the AT&T 505 terminal. .PP Be careful assigning the \fBkmous\fP capability. The \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 cancelled \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 XSI 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 (\fB\%set_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 XSI 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) ncurses-6.4-20240113/man/panel.3x0000644000000000000000000002416214541604501014570 0ustar rootroot.\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: panel.3x,v 1.61 2023/12/23 16:22:25 tom Exp $ .TH panel 3X 2023-12-23 "ncurses 6.4" "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 \- panel stack extension for \fIcurses\fP .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 an error if \fB\%mvwin\fP returns an error. .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) ncurses-6.4-20240113/man/curs_util.3x0000644000000000000000000004003314546074322015504 0ustar rootroot'\" 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.95 2024/01/05 21:46:58 tom Exp $ .TH curs_util 3X 2024-01-05 "ncurses 6.4" "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 \fIc\fP); \fBwchar_t *wunctrl(cchar_t *\fIc\fP); .PP \fBconst char *keyname(int \fIc\fP); \fBconst char *key_name(wchar_t \fIw\fP); .PP \fBvoid filter(void); .PP \fBvoid use_env(bool \fIf\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 \fIf\fP); .fi .SH DESCRIPTION .SS unctrl The \fBunctrl\fP routine returns a character string which is a printable representation of the character \fIc\fP: .bP Printable characters are displayed as themselves, e.g., a one-character string containing the key. .bP Control characters are displayed in the \fB^\fIX\fR notation. .bP 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 \fIc\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 \fIw\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 which 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{ This is the default behavior. \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 (\fI\%ncursesw\fP) and non-wide (\fI\%ncurses\fP) libraries. You can transfer data between the two, however. .bP the retrieved window is always created as a top-level window (or pad), rather than a subwindow. .bP the window's character cells contain the color pair \fIvalue\fP, but not the actual color \fInumbers\fP. If cells in the retrieved window use color pairs which have not been created in the application using \fBinit_pair\fP, they will not be colored when the window is refreshed. .SS delay_output 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 X/Open does not define any error conditions. In this implementation .RS 3 .TP 5 \fBflushinp\fP returns an error if the terminal was not initialized. .TP 5 \fBputwin\fP returns an error if the associated \fBfwrite\fP calls return an error. .RE .SH PORTABILITY .SS filter The SVr4 documentation describes the action of \fBfilter\fP only in the vaguest terms. The description here is adapted from the XSI Curses standard (which erroneously fails to describe the disabling of \fBcuu\fP). .SS "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 which are defined in the terminfo entry via the \fB\-x\fP option of \fB@TIC@\fP. This implementation automatically assigns at run-time keycodes to user-defined strings which begin with \*(``k\*(''. The keycodes start at KEY_MAX, but are not guaranteed to be the same value for different runs because user-defined codes are merged from all terminal descriptions which have been loaded. The \fBuse_extended_names\fP(3X) function controls whether this data is loaded when the terminal description is read by the library. .SS "nofilter, use_tioctl" 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 which use binary dumps use block-I/O (the \fBfwrite\fP and \fBfread\fP functions). Those that use textual dumps use buffered-I/O. A few applications may happen to write extra data in the file using these functions. Doing that can run into problems mixing block- and buffered-I/O. This implementation reduces the problem on writes by flushing the output. However, reading from a file written using mixed schemes may not be successful. .SS "unctrl, wunctrl" The XSI Curses standard, Issue 4 describes these functions. It states that \fBunctrl\fP and \fBwunctrl\fP will return a null pointer if unsuccessful, but does not define any error conditions. This implementation checks for three cases: .bP the parameter is a 7-bit US\-ASCII code. This is the case that X/Open Curses documented. .bP the parameter is in the range 128\-159, i.e., a C1 control code. If \fBuse_legacy_coding\fP(3X) has been called with a \fB2\fP parameter, \fBunctrl\fP returns the parameter, i.e., a one-character string with the parameter as the first character. Otherwise, it returns \*(``~@\*('', \*(``~A\*('', etc., analogous to \*(``^@\*('', \*(``^A\*('', C0 controls. .IP X/Open Curses does not document whether \fBunctrl\fP can be called before initializing curses. This implementation permits that, and returns the \*(``~@\*('', etc., values in that case. .bP parameter values outside the 0 to 255 range. \fBunctrl\fP returns a null pointer. .PP The strings returned by \fBunctrl\fP in this implementation are determined at compile time, showing C1 controls from the upper-128 codes with a \*(``~\*('' prefix rather than \*(``^\*(''. Other implementations have different conventions. For example, they may show both sets of control characters with \*(``^\*('', and strip the parameter to 7 bits. Or they may ignore C1 controls and treat all of the upper-128 codes as printable. This implementation uses 8 bits but does not modify the string to reflect locale. The \fBuse_legacy_coding\fP(3X) function allows the caller to change the output of \fBunctrl\fP. .PP Likewise, the \fBmeta\fP(3X) function allows the caller to change the output of \fBkeyname\fP, i.e., it determines whether to use the \*(``M\-\*('' prefix for \*(``meta\*('' keys (codes in the range 128 to 255). Both \fBuse_legacy_coding\fP(3X) and \fBmeta\fP(3X) succeed only after curses is initialized. X/Open Curses does not document the treatment of codes 128 to 159. When treating them as \*(``meta\*('' keys (or if \fBkeyname\fP is called before initializing curses), this implementation returns strings \*(``M\-^@\*('', \*(``M\-^A\*('', etc. .PP X/Open Curses documents \fBunctrl\fP as declared in \fB\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 SEE ALSO \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) ncurses-6.4-20240113/man/curs_addchstr.3x0000644000000000000000000001152514530377115016326 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-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. * .\"*************************************************************************** .\" .\" $Id: curs_addchstr.3x,v 1.38 2023/11/25 14:01:49 tom Exp $ .TH curs_addchstr 3X 2023-11-25 "ncurses 6.4" "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\%addchnstr\fP, \fB\%waddchstr\fP, \fB\%waddchnstr\fP, \fB\%mvaddchstr\fP, \fB\%mvaddchnstr\fP, \fB\%mvwaddchstr\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 addchnstr(const chtype *\fIchstr\fP, int \fIn\fP); \fBint waddchstr(WINDOW *\fIwin\fP, const chtype *\fIchstr\fP); \fBint waddchnstr(WINDOW *\fIwin\fP, const chtype *\fIchstr\fP, int \fIn\fP); .PP \fBint mvaddchstr(int \fIy\fP, int \fIx\fP, const chtype *\fIchstr\fP); \fBint mvaddchnstr(int \fIy\fP, int \fIx\fP, const chtype *\fIchstr\fP, int \fIn\fP); \fBint mvwaddchstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const chtype *\fIchstr\fP); \fBint mvwaddchnstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const chtype *\fIchstr\fP, int \fIn\fP); .fi .SH DESCRIPTION These functions copy the (null-terminated) \fIchstr\fP array into the window image structure starting at the current cursor position. .PP The four functions with \fIn\fP as the last argument copy at most \fIn\fP elements, but no more than will fit on the line. If \fBn\fP=\fB\-1\fP then the whole array is copied, to the maximum number of characters that will fit on the line. .PP The window cursor is \fInot\fP advanced. These functions are faster than \fBwaddnstr\fP. On the other hand: .bP they do not perform checking (such as for the newline, backspace, or carriage return characters), .bP they do not advance the current cursor position, .bP they do not expand other control characters to ^-escapes, and .bP they truncate the string if it crosses the right margin, rather than wrapping it around to the new line. .SH RETURN VALUE All functions return the integer \fBERR\fP upon failure and \fBOK\fP on success. .PP X/Open does not define any error conditions. This implementation returns an error .bP if the \fIwin\fP parameter is null or .bP if the \fIwchstr\fP parameter is null. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES All functions except \fBwaddchnstr\fP may be macros. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_addch\fP(3X), \fB\%curs_addstr\fP(3X), \fB\%curs_addwstr\fP(3X), \fB\%curs_add_wchstr\fP(3X) ncurses-6.4-20240113/man/mitem_new.3x0000644000000000000000000000757614530376627015504 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.34 2023/11/25 13:58:47 tom Exp $ .TH mitem_new 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/term_variables.3x0000644000000000000000000001572414541602771016503 0ustar rootroot.\"*************************************************************************** .\" Copyright 2019-2022,2023 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.34 2023/12/23 16:08:25 tom Exp $ .TH term_variables 3X 2023-12-23 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_inwstr.3x0000644000000000000000000001225214544106200016044 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.36 2023/12/30 21:32:48 tom Exp $ .TH curs_inwstr 3X 2023-12-30 "ncurses 6.4" "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\%innwstr\fP, \fB\%winwstr\fP, \fB\%winnwstr\fP, \fB\%mvinwstr\fP, \fB\%mvinnwstr\fP, \fB\%mvwinwstr\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 innwstr(wchar_t *\fIwstr\fP, int \fIn\fP); \fBint winwstr(WINDOW *\fIwin\fP, wchar_t *\fIwstr\fP); \fBint winnwstr(WINDOW *\fIwin\fP, wchar_t *\fIwstr\fP, int \fIn\fP); .PP \fBint mvinwstr(int \fIy\fP, int \fIx\fP, wchar_t *\fIwstr\fP); \fBint mvinnwstr(int \fIy\fP, int \fIx\fP, wchar_t *\fIwstr\fP, int \fIn\fP); \fBint mvwinwstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, wchar_t *\fIwstr\fP); \fBint mvwinnwstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, wchar_t *\fIwstr\fP, int \fIn\fP); .fi .SH DESCRIPTION These routines return a string of \fBwchar_t\fP wide characters in \fIwstr\fP, starting at the current cursor position in the named window. .PP The four functions with \fIn\fP as the last argument return a leading substring at most \fIn\fP characters long (exclusive of the trailing NUL). Transfer stops at the end of the current line, or when \fIn\fP characters have been stored at the location referenced by \fIwstr\fP. .PP If the size \fIn\fP is not large enough to store a complete complex character, an error is generated. .SH RETURN VALUE All routines return \fBERR\fP upon failure. Upon successful completion, the *\fBinwstr\fP routines return \fBOK\fP, and the *\fBinnwstr\fP routines return the number of characters read into the string. .PP X/Open defines no error conditions. This implementation returns an error .bP if the \fIwin\fP parameter is null or .bP if the \fIwstr\fP parameter is null, or .bP if no characters could be read. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES All routines except \fBwinnwstr\fP may be macros. .PP Each cell in the window holds a complex character (a spacing character and zero or more non-spacing characters) together with attributes and color. These functions store only the wide characters, ignoring attributes and color. Use \fBin_wchstr\fP to return the complex characters from a window. .PP Reading a line that overflows the array pointed to by \fIwstr\fP with \fBinwstr\fP, \fBmvinwstr\fP, \fBmvwinwstr\fP or \fBwinwstr\fP causes undefined results. Therefore, the use of \fBinnwstr\fP, \fBmvinnwstr\fP, \fBmvwinnwstr\fP, or \fBwinnwstr\fP is recommended. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_inch\fP(3X), \fB\%curs_inchstr\fP(3X), \fB\%curs_instr\fP(3X), \fB\%curs_in_wchstr\fP(3X) ncurses-6.4-20240113/man/curs_attr.3x0000644000000000000000000005411414550604463015506 0ustar rootroot'\" 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.96 2024/01/13 22:05:39 tom Exp $ .TH curs_attr 3X 2024-01-13 "ncurses 6.4" "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 \fBint\fP datatype used in the legacy routines is treated as if it is the same size as \fBchtype\fP (used by \fBaddch\fP(3X)). It holds the common video attributes (such as bold, reverse), as well as a few bits for color. Those bits correspond to the \fBA_COLOR\fP symbol. The \fBCOLOR_PAIR\fP macro provides a value which can be OR'd into the attribute parameter. For example, as long as that value fits into the \fBA_COLOR\fP mask, then these calls produce similar results: .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 \fI\%ncurses\fP \fBA_COLOR\fP has eight (8) bits, then \fBCOLOR_PAIR(\fI259\fB)\fR is 4 (i.e., 259 is 4 more than the limit 255). .PP The \fBPAIR_NUMBER\fP macro extracts a pair number from an \fBint\fP (or \fBchtype\fP). For example, the \fIinput\fP and \fIoutput\fP values in these statements would be the same: .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 curses but kept in X/Open Curses for the same reason that SVr4 curses kept it: compatibility. .PP The remaining \fBattr\fP* functions operate exactly like the corresponding \fBattr_\fP* functions, except that they take arguments of type \fBint\fP rather than \fBattr_t\fP. .PP There is no corresponding \fB\%attrget\fP function as such in X/Open Curses, although \fI\%ncurses\fP 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 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 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 All routines return the integer \fBOK\fP on success, or \fBERR\fP on failure. .PP X/Open does not define any error conditions. .PP This implementation .bP returns an error if the window pointer is null. .bP returns an error if the color pair parameter for \fBwcolor_set\fP is outside the range 0..COLOR_PAIRS\-1. .bP does not return an error if either of the parameters of \fBwattr_get\fP used for retrieving attribute or color pair values is \fBNULL\fP. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .\" --------------------------------------------------------------------------- .SH 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, \fI\%ncurses\fP ABI 4 and 5 simply OR this value within the alternate functions. You must use \fI\%ncurses\fP 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 \fBint\fP, and used to set the color pair instead of the \fBshort\fP \fIpair\fP parameter. .bP For functions which retrieve the color, e.g., \fBwattr_get\fP, if \fIopts\fP is set it is treated as a pointer to \fBint\fP, and used to retrieve the color pair as an \fBint\fP value, in addition to retrieving it via the standard pointer to \fBshort\fP parameter. .bP For functions which turn attributes off, e.g., \fBwattr_off\fP, the \fIopts\fP parameter is ignored except except to check that it is \fBNULL\fP. .\" --------------------------------------------------------------------------- .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. The standard defined the dedicated type for highlights, \fBattr_t\fP, which was not defined in SVr4 curses. The functions taking \fBattr_t\fP arguments were not supported under SVr4. .PP Very old versions of this library did not force an update of the screen when changing the attributes. Use \fBtouchwin\fP to force the screen to match the updated attributes. .PP The XSI Curses standard states that whether the traditional functions \fBattron\fP/\fBattroff\fP/\fBattrset\fP can manipulate attributes other than \fBA_BLINK\fP, \fBA_BOLD\fP, \fBA_DIM\fP, \fBA_REVERSE\fP, \fBA_STANDOUT\fP, or \fBA_UNDERLINE\fP is \*(``unspecified\*(''. Under this implementation as well as SVr4 curses, these functions correctly manipulate all other highlights (specifically, \fBA_ALTCHARSET\fP, \fBA_PROTECT\fP, and \fBA_INVIS\fP). .PP XSI Curses added these entry points: .sp .RS \fBattr_get\fP, \fBattr_on\fP, \fBattr_off\fP, \fBattr_set\fP, \fBwattr_on\fP, \fBwattr_off\fP, \fBwattr_get\fP, \fBwattr_set\fP .RE .PP The new functions are intended to work with a new series of highlight macros prefixed with \fBWA_\fP. The older macros have direct counterparts in the newer set of names: .PP .RS .ne 9 .TS 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 XSI curses does not assign values to these symbols, nor does it state whether or not they are related to the similarly-named A_NORMAL, etc.: .bP The XSI curses standard specifies that each pair of corresponding \fBA_\fP and \fBWA_\fP-using functions operates on the same current-highlight information. .bP However, in some implementations, those symbols have unrelated values. .IP For example, the Solaris \fIxpg4\fP (X/Open) curses declares \fBattr_t\fP to be an unsigned short integer (16-bits), while \fBchtype\fP is a unsigned integer (32-bits). The \fBWA_\fP symbols in this case are different from the \fBA_\fP symbols because they are used for a smaller datatype which does not represent \fBA_CHARTEXT\fP or \fBA_COLOR\fP. .IP In this implementation (as in many others), the values happen to be the same because it simplifies copying information between \fBchtype\fP and \fBcchar_t\fP variables. .bP Because \fI\%ncurses\fP's \fBattr_t\fP can hold a color pair (in the \fBA_COLOR\fP field), a call to \fBwattr_on\fP, \fBwattr_off\fP, or \fBwattr_set\fP may alter the window's color. If the color pair information in the attribute parameter is zero, no change is made to the window's color. .IP This is consistent with SVr4 curses; X/Open Curses does not specify this. .PP The XSI standard extended conformance level adds new highlights \fBA_HORIZONTAL\fP, \fBA_LEFT\fP, \fBA_LOW\fP, \fBA_RIGHT\fP, \fBA_TOP\fP, \fBA_VERTICAL\fP (and corresponding \fBWA_\fP macros for each). As of August 2013, no known terminal provides these highlights (i.e., via the \fBsgr1\fP capability). .\" --------------------------------------------------------------------------- .SH HISTORY X/Open Curses is largely based on SVr4 curses, adding support for \*(``wide-characters\*('' (not specific to Unicode). Some of the X/Open differences from SVr4 curses address the way video attributes can be applied to wide-characters. But aside from that, \fBattrset\fP and \fBattr_set\fP are similar. SVr4 curses provided the basic features for manipulating video attributes. However, earlier versions of curses provided a part of these features. .PP As seen in 2.8BSD, curses assumed 7-bit characters, using the eighth bit of a byte to represent the \fIstandout\fP feature (often implemented as bold and/or reverse video). The BSD curses library provided functions \fBstandout\fP and \fBstandend\fP which were carried along into X/Open Curses due to their pervasive use in legacy applications. .PP Some terminals in the 1980s could support a variety of video attributes, although the BSD curses library could do nothing with those. System V (1983) provided an improved curses library. It defined the \fBA_\fP symbols for use by applications to manipulate the other attributes. There are few useful references for the chronology. .PP Goodheart's book \fIUNIX Curses Explained\fP (1991) describes SVr3 (1987), commenting on several functions: .bP the \fBattron\fP, \fBattroff\fP, \fBattrset\fP functions (and most of the functions found in SVr4 but not in BSD curses) were introduced by System V, .bP the alternate character set feature with \fBA_ALTCHARSET\fP was added in SVr2 and improved in SVr3 (by adding \fBacs_map[]\fP), .bP \fBstart_color\fP and related color-functions were introduced by System V.3.2, .bP pads, soft-keys were added in SVr3, and .PP Goodheart did not mention the background character or the \fBcchar_t\fP type. Those are respectively SVr4 and X/Open features. He did mention the \fBA_\fP constants, but did not indicate their values. Those were not the same in different systems, even for those marked as System V. .PP Different Unix systems used different sizes for the bit-fields in \fBchtype\fP for \fIcharacters\fP and \fIcolors\fP, and took into account the different integer sizes (32-bit versus 64-bit). .PP This table showing the number of bits for \fBA_COLOR\fP and \fBA_CHARTEXT\fP was gleaned from the curses header files for various operating systems and architectures. The inferred architecture and notes reflect the format and size of the defined constants as well as clues such as the alternate character set implementation. A 32-bit library can be used on a 64-bit system, but not necessarily the reverse. .PP .TS Lb Lb Lb Cb S Lb Lb2 Lb Lb2 Lbz 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 curses was dropped with HP-UX 11.30 in 2006. .PP Regarding OSF/1 (and Tru64), .bP These used 64-bit hardware. Like \fI\%ncurses\fP, the OSF/1 curses interface is not customized for 32-bit and 64-bit versions. .bP Unlike other systems which evolved from AT&T code, OSF/1 provided a new implementation for X/Open curses. .PP Regarding Solaris, .bP The initial release of Solaris was in 1992. .bP The \fIxpg4\fP (X/Open) curses was developed by MKS from 1990 to 1995. Sun's copyright began in 1996. .bP Sun updated the X/Open curses interface after 64-bit support was introduced in 1997, but did not modify the SVr4 curses interface. .PP Regarding U/Win, .bP Development of the curses library began in 1991, stopped in 2000. .bP Color support was added in 1998. .bP The library uses only \fBchtype\fP (no \fBcchar_t\fP). .RE .PP Once X/Open curses was adopted in the mid-1990s, the constraint of a 32-bit interface with many colors and wide-characters for \fBchtype\fP became a moot point. The \fBcchar_t\fP structure (whose size and members are not specified in X/Open Curses) could be extended as needed. .PP Other interfaces are rarely used now: .bP BSD curses was improved slightly in 1993/1994 using Keith Bostic's modification to make the library 8-bit clean for \fBnvi\fP(1). He moved \fIstandout\fP attribute to a structure member. .IP The resulting 4.4BSD curses was replaced by \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) ncurses-6.4-20240113/man/curs_move.3x0000644000000000000000000000661414537413624015506 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.33 2023/12/16 21:33:08 tom Exp $ .TH curs_move 3X 2023-12-16 "ncurses 6.4" "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 These routines move the cursor associated with the window to line \fIy\fP and column \fIx\fP. This routine does not move the physical cursor of the terminal until \fBrefresh\fP(3X) is called. The position specified is relative to the upper left-hand corner of the window, which is (0,0). .SH RETURN VALUE These routines return the integer \fBERR\fP upon failure and an \fBOK\fP (SVr4 specifies only \*(``an integer value other than \fBERR\fP\*('') upon successful completion. .PP Specifically, they return an error if the window pointer is null, or if the position is outside the window. .SH NOTES Note that \fBmove\fP may be a macro. .SH PORTABILITY These functions are described in the XSI Curses standard, Issue 4. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_refresh\fP(3X) ncurses-6.4-20240113/man/curs_getstr.3x0000644000000000000000000002463014537404526016047 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.52 2023/12/16 20:32:22 tom Exp $ .TH curs_getstr 3X 2023-12-16 "ncurses 6.4" "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\%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 getnstr(char *\fIstr\fP, int \fIn\fP); \fBint wgetstr(WINDOW *\fIwin\fP, char *\fIstr\fP); \fBint wgetnstr(WINDOW *\fIwin\fP, char *\fIstr\fP, int \fIn\fP); .PP \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); \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 The function \fBwgetnstr\fP is equivalent to a series of calls to \fBwgetch\fP(3X), until a newline or carriage return terminates the series: .bP The terminating character is not included in the returned string. .bP In all instances, the end of the string is terminated by a NUL. .bP The function stores the result in the area pointed to by the \fIstr\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 \fBgetnstr\fP, \fBmvgetnstr\fP, \fBmvwgetnstr\fP, and \fBwgetnstr\fP functions are identical to the \fBgetstr\fP, \fBmvgetstr\fP, \fBmvwgetstr\fP, and \fBwgetstr\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. (SVr4 specifies only \*(``an integer value other than \fBERR\fP\*('') If unsuccessful, they return \fBERR\fP. .PP X/Open defines no error conditions. .PP In this implementation, these functions return an error .bP if the window pointer is null, .bP if its timeout expires without having any data, or .bP if the associated call to \fBwgetch\fP failed. .PP This implementation provides an extension as well. If a \fBSIGWINCH\fP interrupts the function, it will return \fBKEY_RESIZE\fP rather than \fBOK\fP or \fBERR\fP. .PP Functions with a \*(``mv\*('' prefix first perform a cursor movement using \fBwmove\fP, and return an error if the position is outside the window, or if the window pointer is null. .SH NOTES Any of these functions other than \fBwgetnstr\fP may be macros. .PP Using \fBgetstr\fP, \fBmvgetstr\fP, \fBmvwgetstr\fP, or \fBwgetstr\fP to read a line that overflows the array pointed to by \fBstr\fP causes undefined results. The use of \fBgetnstr\fP, \fBmvgetnstr\fP, \fBmvwgetnstr\fP, or \fBwgetnstr\fP, respectively, is recommended. .SH PORTABILITY These functions are described in The Single Unix Specification, Version 2. No error conditions are defined. .PP This implementation returns \fBERR\fP if the window pointer is null, or if the lower-level \fBwgetch\fP(3X) call returns an \fBERR\fP. .PP SVr3 and early SVr4 curses implementations did not reject function keys; the SVr4.0 documentation claimed that \*(``special keys\*('' (such as function keys, \*(``home\*('' key, \*(``clear\*('' key, \fIetc\fP.) are \*(``interpreted\*('', without giving details. It lied. In fact, the \*(``character\*('' value appended to the string by those implementations was predictable but not useful (being, in fact, the low-order eight bits of the key's KEY_ value). .PP The functions \fBgetnstr\fP, \fBmvgetnstr\fP, and \fBmvwgetnstr\fP were present but not documented in SVr4. .PP X/Open Curses, Issue 5 (2007) stated that these functions \*(``read at most \fIn\fP bytes\*('' but did not state whether the terminating NUL is counted in that limit. X/Open Curses, Issue 7 (2009) changed that to say they \*(``read at most \fIn\fP\-1 bytes\*('' to allow for the terminating NUL. As of 2018, some implementations count it, some do not: .bP \fI\%ncurses\fP 6.1 and PDCurses do not count the NUL in the given limit, while .bP Solaris SVr4 and NetBSD curses count the NUL as part of the limit. .bP Solaris xcurses provides both: its wide-character \fBwget_nstr\fP reserves a NUL, but its \fBwgetnstr\fP does not count the NUL consistently. .PP In SVr4 curses, a negative value of \fIn\fP tells \fBwgetnstr\fP to assume that the caller's buffer is large enough to hold the result, i.e., to act like \fBwgetstr\fP. X/Open Curses does not mention this (or anything related to negative or zero values of \fIn\fP), however most implementations use the feature, with different limits: .bP Solaris SVr4 curses and PDCurses limit the result to 255 bytes. Other Unix systems than Solaris are likely to use the same limit. .bP Solaris xcurses limits the result to \fBLINE_MAX\fP bytes. .bP NetBSD 7 assumes no particular limit for the result from \fBwgetstr\fP. However, it limits the \fBwgetnstr\fP parameter \fIn\fP to ensure that it is greater than zero. .IP A comment in NetBSD's source code states that this is specified in SUSv2. .bP \fI\%ncurses\fP (before 6.2) assumes no particular limit for the result from \fBwgetstr\fP, and treats the \fIn\fP parameter of \fBwgetnstr\fP like SVr4 curses. .bP \fI\%ncurses\fP 6.2 uses \fBLINE_MAX\fP, or a larger (system-dependent) value which the \fBsysconf\fP function may provide. If neither \fBLINE_MAX\fP or \fBsysconf\fP is available, \fI\%ncurses\fP uses the POSIX value for \fBLINE_MAX\fP (a 2048 byte limit). In either case, it reserves a byte for the terminating NUL. .PP Although \fBgetnstr\fP is equivalent to a series of calls to \fBgetch\fP, it also makes changes to the curses modes to allow simple editing of the input buffer: .bP \fBgetnstr\fP saves the current value of the \fBnl\fP, \fBecho\fP, \fBraw\fP and \fBcbreak\fP modes, and sets \fBnl\fP, \fBnoecho\fP, \fBnoraw\fP, and \fBcbreak\fP. .IP \fBgetnstr\fP handles the echoing of characters, rather than relying on the caller to set an appropriate mode. .bP It also obtains the \fIerase\fP and \fIkill\fP characters from \fBerasechar\fP and \fBkillchar\fP, respectively. .bP On return, \fBgetnstr\fP restores the modes to their previous values. .PP Other implementations differ in their treatment of special characters: .bP While they may set the \fIecho\fP mode, other implementations do not modify the \fIraw\fP mode, They may take the \fIcbreak\fP mode set by the caller into account when deciding whether to handle echoing within \fBgetnstr\fP or as a side-effect of the \fBgetch\fP calls. .bP The original \fI\%ncurses\fP (as \fIpcurses\fP in 1986) set \fBnoraw\fP and \fBcbreak\fP when accepting input for \fBgetnstr\fP. That may have been done to make function- and cursor-keys work; it is not necessary with \fI\%ncurses\fP. .IP Since 1995, \fI\%ncurses\fP has provided signal handlers for INTR and QUIT (e.g., \fB^C\fP or \fB^\e\fP). With the \fBnoraw\fP and \fBcbreak\fP settings, those may catch a signal and stop the program, where other implementations allow one to enter those characters in the buffer. .bP Starting in 2021 (\fI\%ncurses\fP 6.3), \fBgetnstr\fP sets \fBraw\fP, rather than \fBnoraw\fP and \fBcbreak\fP for better compatibility with SVr4-curses, e.g., allowing one to enter a \fB^C\fP into the buffer. .SH SEE ALSO \fB\%curses\fP(3X), \fB\%curs_getch\fP(3X), \fB\%curs_termattrs\fP(3X), \fB\%curs_variables\fP(3X) ncurses-6.4-20240113/man/clear.10000644000000000000000000001447014537404526014400 0ustar rootroot.\"*************************************************************************** .\" 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. * .\"*************************************************************************** .\" .\" $Id: clear.1,v 1.46 2023/12/16 20:32:22 tom Exp $ .TH @CLEAR@ 1 2023-12-16 "ncurses 6.4" "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) ncurses-6.4-20240113/man/mitem_visible.3x0000644000000000000000000000562514530401050016314 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.25 2023/11/25 14:18:16 tom Exp $ .TH mitem_visible 3X 2023-11-25 "ncurses 6.4" "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) ncurses-6.4-20240113/man/curs_termcap.3x0000644000000000000000000004440514544105472016170 0ustar rootroot.\"*************************************************************************** .\" Copyright 2018-2022,2023 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.81 2023/12/30 21:27:22 tom Exp $ .TH curs_termcap 3X 2023-12-30 "ncurses 6.4" "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\%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\%ncurses\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 (\fB\%tgetent\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); \fI\%ncurses\fP 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) marks the \fItermcap\fP interface (along with \fB\%vwprintw\fP and \fB\%vwscanw\fP) as withdrawn. .PP Neither X/Open Curses nor the SVr4 man pages documented the return values of \fB\%tgetent\fP 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 \fB\%tgetent\fP returns \fBOK\fP or \fBERR\fP. Because the purpose of these functions is to provide compatibility with the \fItermcap\fP library, that is a defect in X/Open Curses, Issue 4, Version 2 rather than in \fI\%ncurses\fP. .SS "Compatibility with BSD \fItermcap\fP" Externally visible variables are provided for support of certain \fItermcap\fP 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 \fB\%ospeed\fP. .PP The constraint that only the first two characters of the \fIid\fP parameter are used escapes many application developers. The BSD \fItermcap\fP library did not require a trailing null character on the capability identifier passed to \fB\%tgetstr\fP, \fB\%tgetnum\fP, and \fB\%tgetflag\fP. .\" See . Some applications thus assume that the \fItermcap\fP interface does not require the trailing null character for the capability identifier. .bP .I \%ncurses disallows matches by the \fItermcap\fP interface against extended capability names that are longer than two characters; see \fB\%user_caps\fP(5). .PP The BSD \fItermcap\fP function \fB\%tgetent\fP returns the text of a \fItermcap\fP entry in the buffer passed as an argument. This library, like other \fI\%term\%info\fP 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 \fI\%termcap.h\fP header for compatibility with other implementations, but the header is rarely used because the other implementations are not strictly compatible. .SH HISTORY .\" See https://www.oreilly.com/openbook/opensources/book/kirkmck.html .\" for much BSD release history. Bill Joy originated a forerunner of \fItermcap\fP 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 \fItermcap\fP, such as \fB\%tgetent\fP, \fB\%tgetflag\fP, \fB\%tgetnum\fP, and \fB\%tgetstr\fP. .PP A clear descendant, the \fItermlib\fP library, .\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=2BSD/src/termlib/ followed in 2BSD (May 1979), adding \fB\%tgoto\fP and \fB\%tputs\fP. 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 \fI\%termlib\fP 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 \fItermlib\fP to \fItermcap\fP .\" ...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 though 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 \fI\%termcap.h\fP header files over time. .bP One was used internally by \fBjove\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 \fItermcap\fP variables that it used. .bP The other appeared in 4.4BSD-Lite Release 2 (June 1995) as part of \fIlibedit\fP (also known as the \fI\%edit\%line\fP library). CSRG source history shows that this was added in mid-1992. The \fIlibedit\fP header file was used internally as a convenience for compiling the \fI\%edit\%line\fP library. It declared function prototypes, but no global variables. This header file was added to NetBSD's \fItermcap\fP library in mid-1994. .PP Meanwhile, GNU \fItermcap\fP began development in 1990. Its first release (1.0) in 1991 included a \fI\%termcap.h\fP header. Its second (1.1) in September 1992 modified the header to use \fIconst\fP for the function prototypes in the header where one would expect the parameters to be read-only. BSD \fItermcap\fP did not. The prototype for \fB\%tputs\fP also differed, but in that instance, it was \fIlibedit\fP that differed from BSD \fItermcap\fP. .PP GNU \fItermcap\fP 1.3 was bundled with \fIbash\fP(1) in mid-1993 to support the \fI\%readline\fP(3) library. .PP \fI\%ncurses\fP 1.8.1 (November 1993) provided a \fI\%termcap.h\fP file. It reflected influence from GNU \fItermcap\fP and \fBemacs\fP(1) (rather than \fBjove\fP(1)), providing the following interface: .bP global symbols used by \fIemacs\fP, .bP \fIconst\fP-qualified function prototypes, and .bP a prototype for \fBtparam\fP, a GNU \fItermcap\fP feature. .PP Later (in mid-1996) the \fB\%tparam\fP function was removed from \fI\%ncurses\fP. Any two of the four implementations thus differ, and programs that intend to work with all \fItermcap\fP 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 expand \fI\%term\%info\fP-style strings 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" \fB\%curses\fP(3X), \fB\%curs_terminfo\fP(3X), \fB\%putc\fP(3), \fB\%term_variables\fP(3X), \fB\%terminfo\fP(5) .PP https://invisible\-island.net/ncurses/tctest.html ncurses-6.4-20240113/panel/0000755000000000000000000000000014135023106013527 5ustar rootrootncurses-6.4-20240113/panel/llib-lpanelw0000644000000000000000000001150414062736236016053 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/p_move.c0000644000000000000000000000601013662350204015163 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/p_bottom.c0000644000000000000000000000643214062736236015541 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/panel.priv.h0000644000000000000000000002144413733701354015776 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/panel/p_win.c0000644000000000000000000000536213662350204015023 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/headers0000644000000000000000000000437513615656212015112 0ustar rootroot############################################################################## # 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 ncurses-6.4-20240113/panel/p_new.c0000644000000000000000000001121714135023106015005 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/p_show.c0000644000000000000000000000626314062736236015217 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/llib-lpanelt0000644000000000000000000001150414062736236016050 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/p_top.c0000644000000000000000000000533213662350204015025 0ustar rootroot/**************************************************************************** * 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)); } ncurses-6.4-20240113/panel/p_user.c0000644000000000000000000000577014062736236015217 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/llib-lpanel0000644000000000000000000001150414062736236015664 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/panel.h0000644000000000000000000001064013700164323015004 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/panel/p_delete.c0000644000000000000000000000603513771700036015471 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/p_replace.c0000644000000000000000000000565013662350204015641 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/modules0000644000000000000000000000555013615656212015143 0ustar rootroot# $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 ncurses-6.4-20240113/panel/Makefile.in0000644000000000000000000001431114070103035015572 0ustar rootroot# $Id: Makefile.in,v 1.76 2021/07/03 15:45:33 tom Exp $ ############################################################################## # Copyright 2020,2021 Thomas E. Dickey # # Copyright 1998-2015,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1996-on # # Makefile for panels source code. # # This makes the following: # libraries (normal/debug/profile/shared) # # The variable 'srcdir' refers to the source-distribution, and can be set with # the configure script by "--srcdir=DIR". # # The rules are organized to produce the libraries for the configured models, # turn off _all_ suffix rules; we'll generate our own .SUFFIXES: SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile x = @EXEEXT@ o = .@OBJEXT@ MODEL = @DFT_LWR_MODEL@ DESTDIR = @DESTDIR@ top_srcdir = @top_srcdir@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ datarootdir = @datarootdir@ datadir = @datadir@ includesubdir = @includesubdir@ INCLUDEDIR = $(DESTDIR)$(includedir)$(includesubdir) PACKAGE = @PACKAGE@ LIBTOOL = @LIBTOOL@ LIBTOOL_OPTS = @LIBTOOL_OPTS@ @EXPORT_SYMS@ LIBTOOL_CLEAN = @LIB_CLEAN@ LIBTOOL_COMPILE = @LIB_COMPILE@ LIBTOOL_LINK = @LIB_LINK@ LIBTOOL_INSTALL = @LIB_INSTALL@ LIBTOOL_UNINSTALL = @LIB_UNINSTALL@ LT_UNDEF = @LT_UNDEF@ INSTALL = @INSTALL@ INSTALL_LIB = @INSTALL@ @INSTALL_LIB@ INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ INSTALL_DATA = @INSTALL_DATA@ AR = @AR@ ARFLAGS = @ARFLAGS@ AWK = @AWK@ LD = @LD@ LN_S = @LN_S@ CTAGS = @CTAGS@ ETAGS = @ETAGS@ CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ INCDIR = $(top_srcdir)/include BASE_DIR = $(top_srcdir)/ncurses CPPFLAGS = -I$(BASE_DIR) -DHAVE_CONFIG_H -DBUILDING_PANEL @CPPFLAGS@ CCFLAGS = $(CPPFLAGS) $(CFLAGS) CFLAGS_LIBTOOL = $(CCFLAGS) CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) LINK = $(LIBTOOL_LINK) LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@ SHLIB_DIRS = -L../lib SHLIB_LIST = $(SHLIB_DIRS) -lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@ RPATH_LIST = @RPATH_LIST@ RESULTING_SYMS = @RESULTING_SYMS@ VERSIONED_SYMS = @VERSIONED_SYMS@ MK_SHARED_LIB = @MK_SHARED_LIB@ NCURSES_MAJOR = @NCURSES_MAJOR@ NCURSES_MINOR = @NCURSES_MINOR@ REL_VERSION = @cf_cv_rel_version@ ABI_VERSION = @cf_cv_abi_version@ RANLIB = @LIB_PREP@ LIBRARIES = @Libs_To_Make@ LINT = @LINT@ LINT_OPTS = @LINT_OPTS@ LINT_LIBS = -lpanel -lncurses @LIBS@ AUTO_SRC = \ ../include/panel.h ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.libs @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.libs all \ libs \ install :: $(AUTO_SRC) $(LIBRARIES) sources: $(AUTO_SRC) $(DESTDIR)$(bindir) \ $(DESTDIR)$(libdir) : mkdir -p $@ # make a copy to simplify include-paths while still keeping panel's include # file in this directory. ../include/panel.h : $(srcdir)/panel.h -rm -f $@ cp $(srcdir)/panel.h $@ HEADER_DEPS = \ ../include/curses.h \ ../include/ncurses_cfg.h \ ../include/ncurses_def.h \ ../include/ncurses_dll.h \ ../include/term.h \ ../include/unctrl.h \ $(BASE_DIR)/curses.priv.h \ $(BASE_DIR)/new_pair.h \ $(INCDIR)/nc_alloc.h \ $(INCDIR)/nc_panel.h \ $(INCDIR)/nc_string.h \ $(INCDIR)/nc_termios.h \ $(INCDIR)/nc_tparm.h \ $(INCDIR)/term_entry.h \ $(srcdir)/panel.priv.h \ $(srcdir)/panel.h tags: $(CTAGS) *.[ch] @MAKE_UPPER_TAGS@TAGS: @MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] mostlyclean :: -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace clean :: mostlyclean -rm -f $(AUTO_SRC) -rm -rf .libs *.dSYM distclean :: clean -rm -f Makefile realclean :: distclean ############################################################################### # The remainder of this file is automatically generated during configuration ############################################################################### ncurses-6.4-20240113/panel/p_hidden.c0000644000000000000000000000563513662350204015464 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/llib-lpaneltw0000644000000000000000000001150414062736236016237 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/p_hide.c0000644000000000000000000000566513733701073015150 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/p_above.c0000644000000000000000000000711513662350204015320 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/panel/panel.c0000644000000000000000000001361213733701335015007 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/panel/p_update.c0000644000000000000000000000641313662350204015506 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/panel/p_below.c0000644000000000000000000000722013662350204015331 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/NEWS0000644000000000000000000255153114550604142013151 0ustar rootroot------------------------------------------------------------------------------- -- 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.4064 2024/01/13 22:02:10 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. 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_wnstr(). + 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 INSTALLATION file, as part of workarounds for upgrading an ncurses library using the "--with-shared" option. + modify test/ncurses.c c/C tests to cycle through subsets of the total number of colors, to better illustrate 8/16/88/256-colors by providing directly comparable screens. + add test/dots_curses.c, for comparison with the low-level examples. 20140614 + fix dereference before null check found by Coverity in tic.c (cf: 20140524). + fix sign-extension bug in read_entry.c which prevented "toe" from reading empty "screen+italics" entry. + modify sgr for screen.xterm-new to support dim capability -TD + add dim capability to nsterm+7 -TD + cancel dim capability for iterm -TD + add dim, invis capabilities to vte-2012 -TD + add sitm/ritm to konsole-base and mlterm3 -TD 20140609 > fix regression in screen terminfo entries (reports by Christian Ebert, Gabriele Balducci) -TD + revert the change to screen; see notes for why this did not work -TD + cancel sitm/ritm for entries which extend "screen", to work around screen's hardcoded behavior for SGR 3 -TD 20140607 + separate masking for sgr in vidputs from sitm/ritm, which do not overlap with sgr functionality. + remove unneeded -i option from adacurses-config; put -a in the -I option for consistency (patch by Pascal Pignard). + update xterm-new terminfo entry to xterm patch #305 -TD + change format of test-scripts for Debian Ada95 and ncurses-examples packages to quilted to work around Debian #700177 (cf: 20130907). + build fix for form_driver_w.c as part of ncurses-examples package for older ncurses than 20131207. + add Hello World example to adacurses-config manpage. + remove unused --enable-pc-files option from Ada95/configure. + add --disable-gnat-projects option for testing. + revert changes to Ada95 project-files configuration (cf: 20140524). + corrected usage message in adacurses-config. 20140524 + fix typo in ncurses manpage for the NCURSES_NO_MAGIC_COOKIE environment variable. + improve discussion of input-echoing in curs_getch.3x + clarify discussion in curs_addch.3x of wrapping. + modify parametrized.h to make fln non-padded. + correct several entries which had termcap-style padding used in terminfo: adm21, aj510, alto-h19, att605-pc, x820 -TD + correct syntax for padding in some entries: dg211, h19 -TD + correct ti924-8 which had confused padding versus octal escapes -TD + correct padding in sbi entry -TD + fix an old bug in the termcap emulation; "%i" was ignored in tparm() because the parameters to be incremented were already on the internal stack (report by Corinna Vinschen). + modify tic's "-c" option to take into account the "-C" option to activate additional checks which compare the results from running tparm() on the terminfo expressions versus the translated termcap expressions. + modify tic to allow it to read from FIFOs (report by Matthieu Fronton, cf: 20120324). > patches by Nicolas Boulenguez: + explicit dereferences to suppress some style warnings. + when c_varargs_to_ada.c includes its header, use double quotes instead of <>. + samples/ncurses2-util.adb: removed unused with clause. The warning was removed by an obsolete pragma. + replaced Unreferenced pragmas with Warnings (Off). The latter, available with older GNATs, needs no configure test. This also replaces 3 untested Unreferenced pragmas. + simplified To_C usage in trace handling. Using two parameters allows some basic formatting, and avoids a warning about security with some compiler flags. + for generated Ada sources, replace many snippets with one pure package. + removed C_Chtype and its conversions. + removed C_AttrType and its conversions. + removed conversions between int, Item_Option_Set, Menu_Option_Set. + removed int, Field_Option_Set, Item_Option_Set conversions. + removed C_TraceType, Attribute_Option_Set conversions. + replaced C.int with direct use of Eti_Error, now enumerated. As it was used in a case statement, values were tested by the Ada compiler to be consecutive anyway. + src/Makefile.in: remove duplicate stanza + only consider using a project for shared libraries. + style. Silent gnat-4.9 warning about misplaced "then". + generate shared library project to honor ADAFLAGS, LDFLAGS. 20140510 + cleanup recently introduced compiler warnings for MingW port. + workaround for ${MAKEFLAGS} configure check versus GNU make 4.0, which introduces more than one gratuitous incompatibility. 20140503 + add vt520ansi terminfo entry (patch by Mike Gran) + further improve MinGW support for the scenario where there is an ANSI-escapes handler such as ansicon running in the console window (patch by Juergen Pfeifer). 20140426 + add --disable-lib-suffixes option (adapted from patch by Juergen Pfeifer). + merge some changes from Juergen Pfeifer's work with MSYS2, to simplify later merging: + use NC_ISATTY() macro for isatty() in library + add _nc_mingw_isatty() and related functions to windows-driver + rename terminal driver entrypoints to simplify grep's + remove a check in the sp-funcs flavor of newterm() which allowed only the first call to newterm() to succeed (report by Thomas Beierlein, cf: 20090927). 20140419 + update config.guess, config.sub from http://git.savannah.gnu.org/cgit/config.git 20140412 + modify configure script: + drop the -no-gcc option from Intel compiler, from lynx changes. + extend the --with-hashed-db configure option to simplify building with different versions of Berkeley database using FreeBSD ports. + improve initialization for MinGW port (Juergen Pfeifer): + enforce Windows-style path-separator if cross-compiling, + add a driver-name method to each of the drivers, + allow the Windows driver name to match "unknown", ignoring case, + lengthen the built-in name for the Windows console driver to "#win32console", and + move the comparison of driver-names allowing abbreviation, e.g., to "#win32con" into the Windows console driver. 20140329 + add check in tic for mismatch between ccc and initp/initc + cancel ccc in putty-256color and konsole-256color for consistency with the cancelled initc capability (patch by Sven Zuhlsdorf). + add xterm+256setaf building block for various terminals which only get the 256-color feature half-implemented -TD + updated "st" entry (leaving the 0.1.1 version as "simpleterm") to 0.4.1 -TD 20140323 + fix typo in "mlterm" entry (report by Gabriele Balducci) -TD 20140322 + use types from 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 addwnstr() handle non-spacing characters (patch by Sven Verdoolaege). 20010630 + add configure check to define _GNU_SOURCE, needed to prop up glibc header files. + split-out include/curses.wide to solve spurious redefinitions caused by defining _GNU_SOURCE, and move includes for 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: ncurses-6.4-20240113/test/0000755000000000000000000000000014546071001013412 5ustar rootrootncurses-6.4-20240113/test/test_mouse.c0000644000000000000000000001670014417031057015755 0ustar rootroot/**************************************************************************** * Copyright 2022,2023 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.28 2023/04/16 17:36:47 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) static int logoffset = 0; static int raw_loop(void) { struct termios tty; struct termios old; char *xtermcap; tcgetattr(0, &old); #if HAVE_CFMAKERAW cfmakeraw(&tty); #else tty = old; tty.c_iflag &= (unsigned) (~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON)); tty.c_oflag &= (unsigned) (~OPOST); tty.c_lflag &= (unsigned) (~(ECHO | ECHONL | ICANON | ISIG | IEXTEN)); tty.c_cflag &= (unsigned) (~(CSIZE | PARENB)); tty.c_cflag |= CS8; tcsetattr(0, TCSANOW, &tty); #endif setupterm(NULL, 0, 0); xtermcap = tigetstr("XM"); if (!VALID_STRING(xtermcap)) { fprintf(stderr, "couldn't get XM terminfo"); return 1; } putp(tgoto(xtermcap, 1, 1)); fflush(stdout); tcsetattr(0, TCSANOW, &tty); while (1) { int c = getc(stdin); const char *pretty; if (c == -1 || c == '\003') { break; } else if (c == '\033') { printf("\r\n\\E"); } else if ((pretty = unctrl((chtype) c)) != NULL) { printf("%s", pretty); } else if (isprint(c)) { printf("%c", c); } else { printf("{%x}", UChar(c)); } } putp(tgoto(xtermcap, 0, 0)); fflush(stdout); tcsetattr(0, TCSANOW, &old); return 0; } static void logw(const char *fmt, ...) GCC_PRINTFLIKE(1, 2); static void logw(const char *fmt, ...) { int row = getcury(stdscr); va_list args; va_start(args, fmt); wmove(stdscr, row++, 0); vw_printw(stdscr, fmt, args); va_end(args); clrtoeol(); row %= (getmaxy(stdscr) - logoffset); if (row < logoffset) { row = logoffset; } wmove(stdscr, row, 0); wprintw(stdscr, ">"); clrtoeol(); } static void usage(int ok) { static const char *msg[] = { "Usage: test_mouse [options]" ,"" ,"Test mouse events. These examples for $TERM demonstrate xterm" ,"features:" ," xterm" ," xterm-1002" ," xterm-1003" ,"" ,USAGE_COMMON ,"Options:" ," -r show raw input stream, injecting a new line before every ESC" ," -i n set mouse interval to n; default is 0 (no double-clicks)" ," -T term use terminal description other than $TERM" }; unsigned n; for (n = 0; n < sizeof(msg) / sizeof(char *); ++n) { fprintf(stderr, "%s\n", msg[n]); } ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { bool rawmode = FALSE; int interval = 0; int ch; MEVENT event; char *my_environ = NULL; const char *term_format = "TERM=%s"; while ((ch = getopt(argc, argv, OPTS_COMMON "i:rT:")) != -1) { switch (ch) { case 'i': interval = atoi(optarg); break; case 'r': rawmode = TRUE; break; case 'T': my_environ = malloc(strlen(term_format) + strlen(optarg)); if (my_environ != NULL) { sprintf(my_environ, term_format, optarg); putenv(my_environ); } break; case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) { usage(FALSE); ExitProgram(EXIT_FAILURE); } if (rawmode) { printf("Entering raw mode. Ctrl-c to quit.\n"); return raw_loop(); } initscr(); noecho(); cbreak(); /* Line buffering disabled; pass everything */ nonl(); keypad(stdscr, TRUE); /* Get all the mouse events */ mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL); mouseinterval(interval); logw("Ctrl-c to quit"); logw("--------------"); if (my_environ) logw("%s", my_environ); logoffset = getcury(stdscr); while (1) { int c = getch(); switch (c) { case KEY_MOUSE: if (getmouse(&event) == OK) { unsigned btn; mmask_t events; #if NCURSES_MOUSE_VERSION > 1 const unsigned max_btn = 5; #else const unsigned max_btn = 4; #endif const mmask_t btn_mask = (NCURSES_BUTTON_RELEASED | NCURSES_BUTTON_PRESSED | NCURSES_BUTTON_CLICKED | NCURSES_DOUBLE_CLICKED | NCURSES_TRIPLE_CLICKED); bool found = FALSE; for (btn = 1; btn <= max_btn; btn++) { events = (mmask_t) (event.bstate & NCURSES_MOUSE_MASK(btn, btn_mask)); if (events == 0) continue; #define ShowQ(btn,name) \ (((event.bstate & NCURSES_MOUSE_MASK(btn, NCURSES_ ## name)) != 0) \ ? (" " #name) \ : "") #define ShowM(name) \ (((event.bstate & NCURSES_MOUSE_MASK(btn, BUTTON_ ## name)) != 0) \ ? (" " #name) \ : "") #define ShowP() \ ((event.bstate & REPORT_MOUSE_POSITION) != 0 \ ? " position" \ : "") logw("[%08lX] button %d%s%s%s%s%s%s%s%s%s @ %d, %d", (unsigned long) events, btn, ShowQ(btn, BUTTON_RELEASED), ShowQ(btn, BUTTON_PRESSED), ShowQ(btn, BUTTON_CLICKED), ShowQ(btn, DOUBLE_CLICKED), ShowQ(btn, TRIPLE_CLICKED), ShowM(SHIFT), ShowM(CTRL), ShowM(ALT), ShowP(), event.y, event.x); found = TRUE; } /* * A position report need not have a button associated with it. * The modifiers probably are unused. */ if (!found && (event.bstate & REPORT_MOUSE_POSITION)) { logw("[%08lX]%s%s%s%s @ %d, %d", (unsigned long) events, ShowM(SHIFT), ShowM(CTRL), ShowM(ALT), ShowP(), event.y, event.x); } } break; case '\003': goto end; default: logw("got another char: 0x%x", UChar(c)); } refresh(); } end: endwin(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the ncurses library\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/escherknot.xbm0000644000000000000000000010272505557407512016312 0ustar rootroot#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 }; ncurses-6.4-20240113/test/test_unget_wch.c0000644000000000000000000000736014345213323016610 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/test/edit_field.h0000644000000000000000000000551713615656212015674 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/test/make-tar.sh0000755000000000000000000001260114331536155015462 0ustar rootroot#!/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 ncurses-6.4-20240113/test/railroad.c0000644000000000000000000001452314345220135015361 0ustar rootroot/**************************************************************************** * Copyright 2019-2020,2022 Thomas E. Dickey * * Copyright 2000-2013,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * Author: Thomas E. Dickey - 2000 * * $Id: railroad.c,v 1.26 2022/12/11 00:12:13 tom Exp $ * * A simple demo of the termcap interface. */ #define USE_TINFO #include #if HAVE_TGETENT static char *wipeit; static char *moveit; static int length; static int height; static char *finisC; static char *finisS; static char *finisU; static char *startC; static char *startS; static char *startU; static char *backup; static bool interrupted = FALSE; static TPUTS_PROTO(outc, c) { int rc = OK; if (interrupted) { char tmp = (char) c; if (write(STDOUT_FILENO, &tmp, (size_t) 1) == -1) rc = ERR; } else { if (putc(c, stdout) == EOF) rc = ERR; } TPUTS_RETURN(rc); } static void PutChar(int ch) { putchar(ch); fflush(stdout); napms(moveit ? 10 : 50); /* not really termcap... */ } static void Backup(void) { tputs(backup != 0 ? backup : "\b", 1, outc); } static void MyShowCursor(int flag) { if (startC != 0 && finisC != 0) { tputs(flag ? startC : finisC, 1, outc); } } static void StandOut(int flag) { if (startS != 0 && finisS != 0) { tputs(flag ? startS : finisS, 1, outc); } } static void Underline(int flag) { if (startU != 0 && finisU != 0) { tputs(flag ? startU : finisU, 1, outc); } } static void ShowSign(char *string) { char *base = string; int first, last; if (moveit != 0) { tputs(tgoto(moveit, 0, height - 1), 1, outc); tputs(wipeit, 1, outc); } while (*string != 0) { int ch = *string; if (ch != ' ') { if (moveit != 0) { for (first = length - 2; first >= (string - base); first--) { if (first < length - 1) { tputs(tgoto(moveit, first + 1, height - 1), 1, outc); PutChar(' '); } tputs(tgoto(moveit, first, height - 1), 1, outc); PutChar(ch); } } else { last = ch; if (isalpha(ch)) { first = isupper(ch) ? 'A' : 'a'; } else if (isdigit(ch)) { first = '0'; } else { first = ch; } if (first < last) { Underline(1); while (first < last) { PutChar(first); Backup(); first++; } Underline(0); } } if (moveit != 0) Backup(); } StandOut(1); PutChar(ch); StandOut(0); fflush(stdout); string++; } if (moveit != 0) tputs(wipeit, 1, outc); putchar('\n'); } static void cleanup(void) { Underline(0); StandOut(0); MyShowCursor(1); } static void onsig(int n GCC_UNUSED) { interrupted = TRUE; cleanup(); ExitProgram(EXIT_FAILURE); } static void railroad(char **args) { NCURSES_CONST char *name = getenv("TERM"); char buffer[1024]; char area[1024], *ap = area; int z; if (name == 0) #ifdef EXP_WIN32_DRIVER name = "ms-terminal"; #else name = "dumb"; #endif InitAndCatch(z = tgetent(buffer, name), onsig); if (z >= 0) { wipeit = tgetstr("ce", &ap); height = tgetnum("li"); length = tgetnum("co"); moveit = tgetstr("cm", &ap); if (wipeit == 0 || moveit == 0 || height <= 0 || length <= 0) { wipeit = 0; moveit = 0; height = 0; length = 0; } startS = tgetstr("so", &ap); finisS = tgetstr("se", &ap); startU = tgetstr("us", &ap); finisU = tgetstr("ue", &ap); backup = tgetstr("le", &ap); startC = tgetstr("ve", &ap); finisC = tgetstr("vi", &ap); MyShowCursor(0); while (*args) { ShowSign(*args++); } MyShowCursor(1); } } static void usage(int ok) { static const char *msg[] = { "Usage: railroad [options]" ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) { railroad(argv + optind); } else { static char world[] = "Hello World"; static char *hello[] = {world, 0}; railroad(hello); } ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires termcap\n"); exit(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/dots_xcurses.c0000644000000000000000000001551514356325054016323 0ustar rootroot/**************************************************************************** * Copyright 2018-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. * ****************************************************************************/ /* * Author: Thomas E. Dickey * * $Id: dots_xcurses.c,v 1.29 2023/01/07 17:21:48 tom Exp $ * * A simple demo of the wide-curses interface used for comparison with termcap. */ #include #if !defined(_NC_WINDOWS) #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 ncurses-6.4-20240113/test/programs0000644000000000000000000001573414523414226015206 0ustar rootroot# $Id: programs,v 1.57 2023/11/10 11:48:38 tom Exp $ ############################################################################## # 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 # # 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 test_inwstr $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_inwstr test_mouse $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_mouse test_opaque $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_opaque test_setupterm $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_setupterm test_sgr $(LDFLAGS_TINFO) $(LOCAL_LIBS) test_sgr test_termattrs $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_termattrs test_tparm $(LDFLAGS_TINFO) $(LOCAL_LIBS) test_tparm test_unget_wch $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_unget_wch test_vid_puts $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_vid_puts test_vidputs $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_vidputs testaddch $(LDFLAGS_CURSES) $(LOCAL_LIBS) testaddch testcurs $(LDFLAGS_CURSES) $(LOCAL_LIBS) testcurs testscanw $(LDFLAGS_CURSES) $(LOCAL_LIBS) testscanw view $(LDFLAGS_CURSES) $(LOCAL_LIBS) view popup_msg worm $(LDFLAGS_THREADS) $(LOCAL_LIBS) worm xmas $(LDFLAGS_CURSES) $(LOCAL_LIBS) xmas # vile:makemode ncurses-6.4-20240113/test/test_delwin.c0000644000000000000000000001102314434464553016112 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/test/test_tparm.c0000644000000000000000000004271414523551023015752 0ustar rootroot/**************************************************************************** * Copyright 2020-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: test_tparm.c,v 1.39 2023/11/11 01:00:03 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(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, 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; 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) { 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 */ ncurses-6.4-20240113/test/widechars-utf8-tabs.txt0000644000000000000000000000132013172501521017732 0ustar rootrootAPPLE -- 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 ncurses-6.4-20240113/test/knight.c0000644000000000000000000005602514342766153015067 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,2022 Thomas E. Dickey * * Copyright 1998-2013,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * Knight's Tour - a brain game * * The original of this game was anonymous. It had an unbelievably bogus * interface, you actually had to enter square coordinates! Redesign by * Eric S. Raymond July 22 1995. Mouse support * added September 20th 1995. * * $Id: knight.c,v 1.52 2022/12/04 00:40:11 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, 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); } ncurses-6.4-20240113/test/dots_termcap.c0000644000000000000000000001754114376447511016270 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 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.32 2023/02/25 18:11:21 tom Exp $ * * A simple demo of the termcap interface. */ #define USE_TINFO #include #if !defined(_NC_WINDOWS) #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(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) 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); char *value = env ? getenv(env) : 0; if (value != 0 && *value != 0) { char *next = 0; long check = strtol(value, &next, 10); if (check > 0 && *next == '\0') result = (int) check; } return result; } static void usage(int ok) { static const char *msg[] = { "Usage: dots_termcap [options]" ,"" ,USAGE_COMMON ,"Options:" ," -T TERM override $TERM" ," -e allow environment $LINES / $COLUMNS" ," -m SIZE set margin (default: 2)" ," -r SECS self-interrupt/exit after specified number of seconds" ," -s MSECS delay 1% of the time (default: 1 msecs)" }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; int num_colors; int num_lines; int num_columns; int e_option = 0; int m_option = 2; int r_option = 0; int s_option = 1; double r; double c; char buffer[1024]; char area[1024]; char *name; size_t need; char *my_env; while ((ch = getopt(argc, argv, OPTS_COMMON "T:em:r:s:")) != -1) { switch (ch) { case 'T': need = 6 + strlen(optarg); 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 ncurses-6.4-20240113/test/picsmap.c0000644000000000000000000012032414421336505015221 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 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.149 2023/04/23 23:20:37 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; char *tc; int num; char chr; int found = 0; while (*t != '\0') { if (*t == '-') { if (sscanf(t, "-%d%c", &num, &chr) == 2 && chr == 'c' && (tc = strchr(t, chr)) != 0 && !(strncmp) (tc, "color", 5)) { found = 1; } break; } ++t; } if (found && (t != s) && (strncmp) (s, "xterm", (size_t) (t - s))) { _nc_SPRINTF(s, _nc_SLIMIT(need - (size_t) (s - full_name)) "xterm%s", filename + (t - s)); } else { continue; } } if (tries & 2) { int len = (int) strlen(filename); if (len <= 4 || strcmp(filename + len - 4, ".dat")) { _nc_STRCAT(full_name, ".dat", need); } else { continue; } } if (is_file(full_name, &sb)) goto ok; } goto failed; ok: result = read_file(full_name); failed: free(full_name); } return result; } static void init_palette(const char *palette_file) { if (palette_file != 0) { char **data = read_palette(palette_file); all_colors = typeMalloc(RGB_DATA, (unsigned) COLORS); how_much.data += (sizeof(RGB_DATA) * (unsigned) COLORS); #if HAVE_COLOR_CONTENT { int cp; for (cp = 0; cp < COLORS; ++cp) { color_content((short) cp, &all_colors[cp].red, &all_colors[cp].green, &all_colors[cp].blue); } } #else memset(all_colors, 0, sizeof(RGB_DATA) * (size_t) COLORS); #endif if (data != 0) { int n; int red, green, blue; int scale = MaxSCALE; int c; for (n = 0; data[n] != 0; ++n) { if (sscanf(data[n], "scale:%d", &c) == 1) { scale = c; } else if (sscanf(data[n], "%d:%d %d %d", &c, &red, &green, &blue) == 4 && okCOLOR(c) && okSCALE(red) && okSCALE(green) && okSCALE(blue)) { /* *INDENT-EQLS* */ all_colors[c].red = ScaledColor(red); all_colors[c].green = ScaledColor(green); all_colors[c].blue = ScaledColor(blue); } } } free_data(data); /* *INDENT-EQLS* */ } else if (COLORS > 1) { int power2 = 1; int shift = 0; while (power2 < COLORS) { ++shift; power2 <<= 1; } if ((power2 != COLORS) || ((shift % 3) != 0)) { if (all_colors == 0) { init_palette(getenv("TERM")); if (all_colors == 0) { giveup("With %d colors, you need a palette-file", COLORS); } } } } } /* * Map the 24-bit RGB value to a color index if using a palette, otherwise to a * direct color value. */ static int map_color(int value) { int result = value; if (result < 0) { result = -1; } else { /* *INDENT-EQLS* */ int red = (value & 0xff0000) >> 16; int green = (value & 0x00ff00) >> 8; int blue = (value & 0x0000ff) >> 0; if (all_colors != 0) { #define Diff2(n,m) ((m) - all_colors[n].m) * ((m) - all_colors[n].m) #define Diff2S(n) Diff2(n,red) + Diff2(n,green) + Diff2(n,blue) int d2 = Diff2S(0); int n; /* *INDENT-EQLS* */ red = Scaled256(red); green = Scaled256(green); blue = Scaled256(blue); for (result = 0, n = 1; n < COLORS; ++n) { int d = Diff2(n, red) + Diff2(n, green) + Diff2(n, blue); if (d < d2) { d2 = d; result = n; } } } else { /* direct color */ int power2 = 1; int shifts = 8; while (power2 < COLORS) { power2 <<= 3; shifts--; } if (shifts > 0) { /* TODO: round up */ red >>= shifts; green >>= shifts; blue >>= shifts; result = ((red << (2 * (8 - shifts))) + (green << (8 - shifts)) + blue); } } } return result; } static int bytes_of(int value) { if (value & 7) { value |= 7; value++; } return value; } static int match_c(const char *, const char *, ...) GCC_SCANFLIKE(2,3); static char * skip_s(char *s) { while (isspace(UChar(*s))) s++; return s; } static const char * skip_cs(const char *s) { while (isspace(UChar(*s))) s++; return s; } static char * skip_word(char *s) { s = skip_s(s); while (isgraph(UChar(*s))) s++; return s; } static int match_c(const char *source, const char *pattern, ...) { int limit = (int) strlen(source); const char *last_s = source + limit; va_list ap; int ch; int *ip; char *cp; float *fp; long lv; va_start(ap, pattern); limit = -1; while (*pattern != '\0') { ch = UChar(*pattern++); /* blank in the pattern matches zero-or-more blanks in source */ if (isspace(ch)) { source = skip_cs(source); continue; } /* %c, %d, %s are like sscanf except for special treatment of blanks */ if (ch == '%' && *pattern != '\0' && strchr("%cdnfsx", *pattern)) { bool found = FALSE; ch = *pattern++; switch (ch) { case '%': source++; break; case 'c': cp = va_arg(ap, char *); do { *cp++ = *source++; } while (--limit > 0); break; case 'd': case 'x': limit = -1; ip = va_arg(ap, int *); lv = strtol(source, &cp, ch == 'd' ? 10 : 16); if (cp != 0 && cp != source) { *ip = (int) lv; source = cp; } else { goto finish; } break; case 'f': /* floating point for pixels... */ fp = va_arg(ap, float *); lv = strtol(source, &cp, 10); if (cp == 0 || cp == source) goto finish; *fp = (float) lv; source = cp; if (*source == '.') { lv = strtol(++source, &cp, 10); if (cp == 0 || cp == source) goto finish; { float scale = 1.0f; int digits = (int) (cp - source); while (digits-- > 0) { scale *= 10.0f; } *fp += (float) lv / scale; } source = cp; } break; case 'n': /* not really sscanf... */ limit = *va_arg(ap, int *); break; case 's': limit = -1; cp = va_arg(ap, char *); while (*source != '\0') { ch = UChar(*source); if (isspace(ch)) { break; } else if (found && (ch == *skip_cs(pattern))) { break; } else { *cp++ = *source++; found = TRUE; } } *cp = '\0'; break; } continue; } /* other characters are matched literally */ if (*source++ != ch) { break; } } finish: va_end(ap); if (source > last_s) source = last_s; return (*source || *pattern) ? 0 : 1; } static int match_colors(const char *source, int cpp, char *arg1, char *arg2, char *arg3) { int result = 0; /* most files use a quasi-fixed format */ if (match_c(source, " \"%n%c %s %s \" , ", &cpp, arg1, arg2, arg3)) { arg1[cpp] = '\0'; result = 1; } else { const char *s = skip_cs(source); size_t have = strlen(source); if (*s++ == '"' && have > ((size_t) cpp + 2)) { memcpy(arg1, s, (size_t) cpp); s += cpp; while (*s++ == '\t') { char *t; for (t = arg2; (*s != '\0') && strchr("\t\"", *s) == 0;) { if (*s == ' ') { s = skip_cs(s); break; } *t++ = *s++; *t = '\0'; } for (t = arg3; (*s != '\0') && strchr("\t\"", *s) == 0;) { *t++ = *s++; *t = '\0'; } if (!strcmp(arg2, "c")) { result = 1; break; } } } } return result; } static RGB_NAME * parse_rgb(char **data) { char buf[BUFSIZ]; int n; unsigned long r, g, b; char *s, *t; size_t item = 0; size_t need; RGB_NAME *result = 0; for (need = 0; data[need] != 0; ++need) ; result = typeCalloc(RGB_NAME, need + 2); how_much.name += (sizeof(RGB_NAME) * (need + 2)); for (n = 0; data[n] != 0; ++n) { if (strlen(t = data[n]) >= sizeof(buf) - 1) continue; if (*(s = skip_s(t)) == '!') continue; r = strtoul(s, &t, 10); s = skip_s(t); g = strtoul(s, &t, 10); s = skip_s(t); b = strtoul(s, &t, 10); s = skip_s(t); result[item].name = s; t = s + strlen(s); while (t-- != s && isspace(UChar(*t))) { *t = '\0'; } result[item].value = (int) ((r & 0xff) << 16 | (g & 0xff) << 8 | (b & 0xff)); ++item; } result[item].name = "none"; result[item].value = -1; return result; } #define LOWERCASE(c) ((isalpha(UChar(c)) && isupper(UChar(c))) ? tolower(UChar(c)) : (c)) static int CaselessCmp(const char *a, const char *b) { /* strcasecmp isn't portable */ while (*a && *b) { int cmp = LOWERCASE(*a) - LOWERCASE(*b); if (cmp != 0) break; a++, b++; } return LOWERCASE(*a) - LOWERCASE(*b); } static RGB_NAME * lookup_rgb(const char *name) { RGB_NAME *result = 0; if (rgb_table != 0) { int n; for (n = 0; rgb_table[n].name != 0; ++n) { if (!CaselessCmp(name, rgb_table[n].name)) { result = &rgb_table[n]; break; } } } return result; } static PICS_HEAD * parse_xbm(char **data) { int n; int state = 0; char buf[2048]; int num; char ch; char *s; char *t; PICS_HEAD *result; size_t which = 0; size_t cells = 0; debugmsg("called parse_xbm"); result = typeCalloc(PICS_HEAD, 1); how_much.head += sizeof(PICS_HEAD); begin_c_values(2); gather_c_values(0); gather_c_values(0xffffff); for (n = 0; data[n] != 0; ++n) { if (strlen(s = data[n]) >= sizeof(buf) - 1) continue; switch (state) { case 0: case 1: case 2: if (sscanf(s, "#define %1024s %d%c", buf, &num, &ch) >= 2) { if ((t = strstr(buf, "_width")) != 0) { state |= 1; result->wide = (short) bytes_of(num); } else if ((t = strstr(buf, "_height")) != 0) { state |= 2; result->high = (short) num; } else { break; } *t = '\0'; if (result->name) { if (strcmp(result->name, buf)) { goto finish; } } else { result->name = strdup(buf); } } break; case 3: if (sscanf(s, "static char %1024[^_ ]_bits[]%c", buf, &ch) >= 1) { if (strcmp(result->name, buf)) { goto finish; } state = 4; cells = (size_t) (result->wide * result->high); result->cells = typeCalloc(PICS_CELL, cells); how_much.cell += (sizeof(PICS_CELL) * cells); if ((s = strchr(s, L_CURLY)) == 0) break; ++s; } else { break; } case 4: while (*s != '\0') { while (isspace(UChar(*s))) { ++s; } if (isdigit(UChar(*s))) { long value = strtol(s, &t, 0); int b; if (t != s || value > MaxRGB || value < 0) { s = t; } else { state = -1; goto finish; } for (b = 0; b < 8; ++b) { if (((1L << b) & value) != 0) { result->cells[which].ch = '*'; result->cells[which].fg = 1; reading_ncols[1].count++; } else { result->cells[which].ch = ' '; result->cells[which].fg = 0; reading_ncols[0].count++; } if (++which > cells) { state = -1; goto finish; } } } if (*s == R_CURLY) { state = 5; goto finish; } else if (*s == ',') { ++s; } } break; default: break; } } finish: if (state < 4) { debugmsg("...state was only %d", state); if (result) { result = free_pics_head(result); } } else { finish_c_values(result); } return result; } static PICS_HEAD * parse_xpm(char **data) { int state = 0; PICS_HEAD *result; RGB_NAME *by_name; int n; int cells = 0; int cpp = 1; /* chars per pixel */ int num[6]; int found; int which = 0; int num_colors = 0; char ch; const char *cs; char *s; char buf[BUFSIZ]; char arg1[BUFSIZ]; char arg2[BUFSIZ]; char arg3[BUFSIZ]; char **list = 0; debugmsg("called parse_xpm"); result = typeCalloc(PICS_HEAD, 1); how_much.head += sizeof(PICS_HEAD); for (n = 0; data[n] != 0; ++n) { if (strlen(s = data[n]) >= sizeof(buf) - 1) continue; switch (state) { case 0: if (match_c(s, " /* XPM */ ")) { state = 1; } break; case 1: if (match_c(s, " static char * %s [] = %c ", arg1, &ch) && ch == L_CURLY) { result->name = strdup(arg1); state = 2; } break; case 2: if (match_c(s, " \" %d %d %d %d \" , ", num + 0, num + 1, num + 2, num + 3) || match_c(s, " \" %d %d %d %d %d %d \" , ", num + 0, num + 1, num + 2, num + 3, num + 4, num + 5)) { result->wide = (short) num[0]; result->high = (short) num[1]; result->colors = num[2]; begin_c_values(num[2]); cells = (result->wide * result->high); result->cells = typeCalloc(PICS_CELL, cells); how_much.cell += sizeof(PICS_CELL) * (size_t) cells; list = typeCalloc(char *, result->colors + 1); how_much.list += sizeof(char *) * (size_t) (result->colors + 1); cpp = num[3]; state = 3; } break; case 3: if (!match_colors(s, cpp, arg1, arg2, arg3)) { break; } num_colors++; free(list[reading_last]); list[reading_last] = strdup(arg1); if ((by_name = lookup_rgb(arg3)) != 0) { found = gather_c_values(by_name->value); } else if (*arg3 == '#') { char *rgb = arg3 + 1; unsigned long value = strtoul(rgb, &s, 16); switch ((int) strlen(rgb)) { case 6: break; case 12: value = (((value >> 24) & 0xff0000L) | ((value >> 16) & 0xff00L) | ((value >> 8) & 0xffL)); break; default: warning("unexpected rgb value %s", rgb); break; } found = gather_c_values((int) value); } else { found = gather_c_values(0); /* actually an error */ } debugmsg(" [%d:%d] %06X", num_colors, result->colors, reading_ncols[(found >= 0) ? found : 0].fgcol); if (num_colors >= result->colors) { finish_c_values(result); state = 4; if (list[0] == 0) list[0] = strdup("\033"); } break; case 4: if (*(cs = skip_cs(s)) == '"') { ++cs; while (*cs != '\0' && *cs != '"') { int c; /* FIXME - factor out */ for (c = 0; c < result->colors; ++c) { if (list[c] == 0) { /* should not happen... */ continue; } if (!(strncmp) (cs, list[c], (size_t) cpp)) { result->cells[which].ch = list[c][0]; result->cells[which].fg = c; result->fgcol[c].count++; break; } } if (result->cells[which].ch == 0) { result->cells[which].ch = '?'; result->cells[which].fg = 0; } if (++which >= cells) { state = 5; break; } for (c = cpp; c > 0; --c, ++cs) { if (*cs == '\0') break; } } } break; } } if (result && list) { for (n = 0; n < result->colors; ++n) free(list[n]); free(list); } if (state < 5) { debugmsg("...state was only %d", state); result = free_pics_head(result); } if (result) { debugmsg("...allocated %d colors", result->colors); } return result; } /* * The obscurely-named "convert" is provided by ImageMagick */ static PICS_HEAD * parse_img(const char *filename) { size_t need = strlen(filename) + 256; char *cmd = malloc(need); FILE *pp; char buffer[BUFSIZ]; char dummy[BUFSIZ]; bool okay = TRUE; PICS_HEAD *result; int pic_x = 0; int pic_y = 0; int width = in_curses ? COLS : 80; _nc_SPRINTF(cmd, _nc_SLIMIT(need) "identify \"%s\"", filename); if (quiet) _nc_STRCAT(cmd, " 2>/dev/null", need); logmsg("...opening pipe to %s", cmd); result = typeCalloc(PICS_HEAD, 1); how_much.head += sizeof(PICS_HEAD); if ((pp = popen(cmd, "r")) != 0) { if (fgets(buffer, sizeof(buffer), pp) != 0) { size_t n = strlen(filename); debugmsg2("...read %s", buffer); if (strlen(buffer) > n && !(strncmp) (buffer, filename, n) && isspace(UChar(buffer[n])) && sscanf(skip_word(buffer + n), " %dx%d ", &pic_x, &pic_y) == 2) { /* distort image to make it show normally on terminal */ pic_x = (int) ((double) pic_x / aspect_ratio); } else { pic_x = pic_y = 0; } } pclose(pp); } if (pic_x <= 0 || pic_y <= 0) goto finish; _nc_SPRINTF(cmd, _nc_SLIMIT(need) "convert " "-resize %dx%d\\! " "-thumbnail %dx \"%s\" " "-define txt:compliance=SVG txt:-", pic_x, pic_y, width, filename); if (quiet) _nc_STRCAT(cmd, " 2>/dev/null", need); logmsg("...opening pipe to %s", cmd); if ((pp = popen(cmd, "r")) != 0) { int count = 0; int col = 0; int row = 0; int len = 0; while (fgets(buffer, sizeof(buffer), pp) != 0) { debugmsg2("[%5d] %s", count + 1, buffer); if (strlen(buffer) > 160) { /* 80 columns would be enough */ okay = FALSE; break; } if (count++ == 0) { if (match_c(buffer, "# ImageMagick pixel enumeration: %d,%d,%d,%s ", &col, &row, &len, dummy)) { result->name = strdup(filename); result->wide = (short) col; result->high = (short) row; begin_c_values(256); result->cells = typeCalloc(PICS_CELL, (size_t) (col * row)); how_much.cell += (sizeof(PICS_CELL) * (size_t) (col * row)); } else { okay = FALSE; break; } } else { /* * subsequent lines begin "col,row: (r,g,b,a) #RGB". * Those r/g/b could be integers (0..255) or float-percentages. */ int r, g, b, nocolor; float rf, gf, bf; unsigned check; char *t; char *s = t = strchr(buffer, '#'); bool matched = FALSE; if (s != 0) { /* after the "#RGB", there are differences - just ignore */ while (*s != '\0' && !isspace(UChar(*s))) ++s; *++s = '\0'; } if (match_c(buffer, "%d,%d: (%d,%d,%d,%d) #%x ", &col, &row, &r, &g, &b, &nocolor, &check)) { matched = TRUE; } else if (match_c(buffer, "%d,%d: (%f%%,%f%%,%f%%,%d) #%x ", &col, &row, &rf, &gf, &bf, &nocolor, &check) || match_c(buffer, "%d,%d: (%f%%,%f%%,%f%%) #%x ", &col, &row, &rf, &gf, &bf, &check)) { matched = TRUE; #define fp_fix(n) (int) (MaxRGB * (((n) > 100.0 ? 100.0 : (n)) / 100.0)) r = fp_fix(rf); g = fp_fix(gf); b = fp_fix(bf); } if ((s - t) > 8) /* 6 hex digits vs 8 */ check /= 256; if (matched) { int which, c; int want_r = (check >> 16) & 0xff; int want_g = (check >> 8) & 0xff; int want_b = (check >> 0) & 0xff; #define fp_err(tst,ref) ((tst > MaxRGB) || ((tst - ref)*(tst - ref)) > 4) if (fp_err(r, want_r) || fp_err(g, want_g) || fp_err(b, want_b)) { okay = FALSE; break; } c = gather_c_values((int) check); which = col + (row * result->wide); result->cells[which].ch = ((in_curses || check == 0xffffff) ? ' ' : '#'); if (c >= 0 && c < reading_last) { result->cells[which].fg = c; reading_ncols[c].count++; } else { result->cells[which].fg = -1; } } else { okay = FALSE; break; } } } finish_c_values(result); pclose(pp); if (okay) { /* FIXME - is this trimming needed? */ for (len = result->colors; len > 3; len--) { if (result->fgcol[len - 1].fgcol == 0) { result->colors = len - 1; } else { break; } } } } finish: free(cmd); if (!okay) { result = free_pics_head(result); } return result; } static PICS_HEAD * read_picture(const char *filename, char **data) { PICS_HEAD *pics; if ((pics = parse_xbm(data)) == 0) { dispose_c_values(); if ((pics = parse_xpm(data)) == 0) { dispose_c_values(); if ((pics = parse_img(filename)) == 0) { dispose_c_values(); free_data(data); warning("unexpected file-format for \"%s\"", filename); } else if (pics->high == 0 || pics->wide == 0) { dispose_c_values(); free_data(data); pics = free_pics_head(pics); warning("no picture found in \"%s\"", filename); } } } return pics; } #define fg_color(pics,n) (pics->fgcol[n].fgcol) static void dump_picture(PICS_HEAD * pics) { int y, x; printf("Name %s\n", pics->name); printf("Size %dx%d\n", pics->high, pics->wide); printf("Color\n"); for (y = 0; y < pics->colors; ++y) { if (fg_color(pics, y) < 0) { printf(" %3d: %d\n", y, fg_color(pics, y)); } else { printf(" %3d: #%06x\n", y, fg_color(pics, y)); } } for (y = 0; y < pics->high; ++y) { for (x = 0; x < pics->wide; ++x) { putchar(pics->cells[y * pics->wide + x].ch); } putchar('\n'); } } #ifndef USE_DISPLAY_DRIVER static void init_display(const char *palette_path, int opt_d) { (void) opt_d; if (isatty(fileno(stdout))) { in_curses = TRUE; setlocale(LC_ALL, ""); initscr(); cbreak(); noecho(); curs_set(0); if (has_colors()) { start_color(); #if HAVE_USE_DEFAULT_COLORS if (opt_d) use_default_colors(); #endif init_palette(palette_path); } scrollok(stdscr, FALSE); stop_curses(); } } static void show_picture(PICS_HEAD * pics) { int y, x; int n; debugmsg("called show_picture"); logmsg("...using %dx%d screen", LINES, COLS); #if HAVE_RESET_COLOR_PAIRS reset_color_pairs(); #elif HAVE_CURSCR wclear(curscr); clear(); #endif if (has_colors()) { logmsg("...using %d colors", pics->colors); for (n = 0; n < pics->colors; ++n) { int my_pair = (n + 1); int my_color = map_color(fg_color(pics, n)); #if USE_EXTENDED_COLORS if (use_extended_pairs) { init_extended_pair(my_pair, my_color, my_color); } else #endif { my_pair &= 0x7fff; my_color &= 0x7fff; init_pair((short) my_pair, (short) my_color, (short) my_color); } } attrset(COLOR_PAIR(1)); erase(); } for (y = 0; y < pics->high; ++y) { if (y >= LINES) break; move(y, 0); for (x = 0; x < pics->wide; ++x) { int my_pair; if (x >= COLS) break; n = (y * pics->wide + x); my_pair = pics->cells[n].fg + 1; #if USE_EXTENDED_COLORS if (use_extended_pairs) { cchar_t temp; wchar_t wch[2]; wch[0] = (wchar_t) pics->cells[n].ch; wch[1] = 0; setcchar(&temp, wch, A_NORMAL, (short) my_pair, &my_pair); add_wch(&temp); } else #endif { attrset(COLOR_PAIR(my_pair)); addch((chtype) pics->cells[n].ch); } } } if (slow_time >= 0) { refresh(); if (slow_time > 0) { #ifdef NCURSES_VERSION napms(1000 * slow_time); #else sleep((unsigned) slow_time); #endif } } else { wmove(stdscr, 0, 0); getch(); } if (!quiet) endwin(); } #endif static int compare_fg_counts(const void *a, const void *b) { const FG_NODE *p = (const FG_NODE *) a; const FG_NODE *q = (const FG_NODE *) b; return (q->count - p->count); } static void report_colors(PICS_HEAD * pics) { int accum; double level; int j; int shift; int total; char buffer[256]; if (logfp == 0) return; qsort(pics->fgcol, (size_t) pics->colors, sizeof(FG_NODE), compare_fg_counts); /* * For debugging, show a (short) list of the colors used. */ if (debugging && (pics->colors < 1000)) { int digits = 0; int high; int wide = 4; for (j = pics->colors; j != 0; j /= 10) { ++digits; if (j < 10) ++digits; } if (digits > 8) digits = 8; logmsg("These colors were used:"); high = (pics->colors + wide - 1) / wide; for (j = 0; j < high && j < pics->colors; ++j) { int k; char *s = buffer; *s = '\0'; for (k = 0; k < wide; ++k) { int n = j + (k * high); size_t want = (sizeof(buffer) - (size_t) (s - buffer)); if (want < 100 || want >= sizeof(buffer)) break; if (n >= pics->colors) break; if (k) { *s++ = ' '; if (digits < 8) { _nc_SPRINTF(s, _nc_SLIMIT(want) "%*s", 8 - digits, " "); s += strlen(s); } } if (pics->fgcol[n].fgcol >= 0) { _nc_SPRINTF(s, _nc_SLIMIT(want) "%3d #%06X %*d", n, pics->fgcol[n].fgcol, digits, pics->fgcol[n].count); } else { _nc_SPRINTF(s, _nc_SLIMIT(want) "%3d (empty) %*d", n, digits, pics->fgcol[n].count); } s += strlen(s); if ((s - buffer) > 100) break; } logmsg("%s", buffer); } } /* * Given the list of colors sorted by the number of times they are used, * log a short report showing the number of colors for 90%, 99%, 99.9%, * etc. */ logmsg("Number of colors versus number of cells"); total = pics->high * pics->wide; accum = 0; level = 0.1; shift = 1; for (j = 0; j < pics->colors; ++j) { accum += pics->fgcol[j].count; if (accum >= (total * (1.0 - level))) { int after = (shift > 2) ? shift - 2 : 0; logmsg("%8d colors (%.1f%%) in %d cells (%.*f%%)", j + 1, (100.0 * (j + 1)) / pics->colors, accum, after, (100.0 * accum) / total); if (accum >= total) break; level /= 10.0; shift++; } } } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; int opt_d = FALSE; char ignore_ch; const char *palette_path = 0; const char *rgb_path = RGB_PATH; while ((ch = getopt(argc, argv, OPTS_COMMON "a:dLl:p:qr:s:x:")) != -1) { switch (ch) { case 'a': if (sscanf(optarg, "%lf%c", &aspect_ratio, &ignore_ch) != 1 || aspect_ratio < 0.1 || aspect_ratio > 10.) { fprintf(stderr, "Expected a number in [0.1 to 10.]: %s\n", optarg); usage(FALSE); } break; #if HAVE_USE_DEFAULT_COLORS case 'd': opt_d = TRUE; break; #endif case 'L': debugging = TRUE; break; case 'l': if ((logfp = fopen(optarg, "a")) == 0) failed(optarg); break; case 'p': palette_path = optarg; break; case 'q': quiet = TRUE; break; case 'r': rgb_path = optarg; break; case 's': slow_time = atoi(optarg); break; #if USE_EXTENDED_COLORS case 'x': { char *s = optarg; while (*s) { switch (*s++) { case 'p': use_extended_pairs = TRUE; break; case 'c': use_extended_colors = TRUE; break; default: usage(FALSE); break; } } } break; #endif case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) { char **rgb_data = read_file(rgb_path); int n; if (rgb_data) rgb_table = parse_rgb(rgb_data); init_display(palette_path, opt_d); if (optind >= argc) giveup("expected at least one image filename"); for (n = optind; n < argc; ++n) { PICS_HEAD *pics; char **data = read_file(argv[n]); if (data == 0) { warning("cannot read \"%s\"", argv[n]); continue; } if ((pics = read_picture(argv[n], data)) != 0) { if (in_curses) { show_picture(pics); } else { dump_picture(pics); } report_colors(pics); dispose_c_values(); free_data(data); free_pics_head(pics); } } free_data(rgb_data); free(rgb_table); free(all_colors); } else { usage(FALSE); } cleanup(EXIT_SUCCESS); } ncurses-6.4-20240113/test/configure.in0000644000000000000000000003350414421312556015735 0ustar rootrootdnl*************************************************************************** dnl Copyright 2018-2022,2023 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.173 2023/04/23 20:30:38 tom Exp $ dnl This is a simple configuration-script for the ncurses test programs that dnl allows the test-directory to be separately configured against a reference dnl system (i.e., sysvr4 curses) dnl dnl If you're configuring ncurses, you shouldn't need to use this script. dnl It's only for testing purposes. dnl dnl For additional information, see dnl https://invisible-island.net/autoconf/ dnl https://invisible-island.net/autoconf/my-autoconf.html dnl https://invisible-island.net/ncurses/ncurses-examples.html dnl --------------------------------------------------------------------------- AC_PREREQ(2.52.20210509) AC_INIT(ncurses.c) AC_CONFIG_HEADER(ncurses_cfg.h:ncurses_tst.hin) CF_INHERIT_SCRIPT(config.guess) CF_INHERIT_SCRIPT(config.sub) CF_CHECK_CACHE AC_ARG_PROGRAM CF_HELP_MESSAGE(General Options:) AC_PROG_MAKE_SET CF_PROG_CC AC_C_INLINE AC_PROG_CPP AC_PROG_AWK CF_PROG_INSTALL CF_INSTALL_OPTS CF_PROG_LINT CF_MAKE_PHONY CF_MAKE_TAGS CF_MATH_LIB(MATH_LIB,pow(sin(x),x)) AC_SUBST(MATH_LIB) dnl Things that we don't need (or must override) if we're not building ncurses CF_TOP_BUILDDIR CC_G_OPT="-g" AC_SUBST(CC_G_OPT) CC_SHARED_OPTS=unknown AC_SUBST(CC_SHARED_OPTS) CPPFLAGS="$CPPFLAGS" AC_SUBST(CPPFLAGS) DFT_DEP_SUFFIX="" AC_SUBST(DFT_DEP_SUFFIX) DFT_OBJ_SUBDIR=`pwd|sed -e's:.*/::'` AC_SUBST(DFT_OBJ_SUBDIR) DFT_UPR_MODEL="NORMAL" AC_SUBST(DFT_UPR_MODEL) LD="ld" AC_SUBST(LD) LDFLAGS_SHARED="" AC_SUBST(LDFLAGS_SHARED) LDFLAGS_STATIC="" AC_SUBST(LDFLAGS_STATIC) LD_MODEL="" AC_SUBST(LD_MODEL) LD_SHARED_OPTS="" AC_SUBST(LD_SHARED_OPTS) LIBTOOL="" AC_SUBST(LIBTOOL) LIBTOOL_OPTS="" AC_SUBST(LIBTOOL_OPTS) LIB_CLEAN="" AC_SUBST(LIB_CLEAN) LIB_COMPILE="" AC_SUBST(LIB_COMPILE) LIB_LINK='${CC}' AC_SUBST(LIB_LINK) LINK_TESTS="" AC_SUBST(LINK_TESTS) LOCAL_LDFLAGS="" AC_SUBST(LOCAL_LDFLAGS) PACKAGE="ncurses-examples" AC_SUBST(PACKAGE) PTHREAD="-lm" AC_SUBST(PTHREAD) TEST_ARGS="" AC_SUBST(TEST_ARGS) TEST_DEPS="" AC_SUBST(TEST_DEPS) TEST_LIBS="" AC_SUBST(TEST_LIBS) TINFO_LDFLAGS='' AC_SUBST(TINFO_LDFLAGS) TINFO_LIBS='$(LIBS_CURSES)' AC_SUBST(TINFO_LIBS) cf_cv_abi_version="" AC_SUBST(cf_cv_abi_version) cf_cv_rel_version="" AC_SUBST(cf_cv_rel_version) includesubdir="" AC_SUBST(includesubdir) cf_cv_screen=curses cf_cv_libtype= AC_EXEEXT AC_OBJEXT CF_GCC_ATTRIBUTES CF_ENABLE_STRING_HACKS CF_XOPEN_SOURCE(600) 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 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( \ getopt.h \ locale.h \ math.h \ stdarg.h \ sys/ioctl.h \ sys/select.h \ sys/time.h \ termios.h \ unistd.h \ ) CF_GETOPT_HEADER CF_FUNC_GETTIME AC_CHECK_FUNCS( \ cfmakeraw \ 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 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, 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 ncurses-6.4-20240113/test/mensetmanus.xbm0000644000000000000000000004427705557407507016517 0ustar rootroot#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 }; ncurses-6.4-20240113/test/bulgarian-utf8-tabs.txt0000644000000000000000000000044713172227101017735 0ustar rootrootПоказване на помощна информация -- 1 Създаване на дялове -- 2 Избор на дял и форматиране -- 3 Записване в избрания дял -- 4 Инсталиране на LILO -- 5 Изход от програмата -- 6 ncurses-6.4-20240113/test/linux-color.dat0000644000000000000000000000521513617625116016374 0ustar rootroot############################################################################## # 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 ncurses-6.4-20240113/test/background.c0000644000000000000000000001670014345204042015701 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,2022 Thomas E. Dickey * * Copyright 2003-2014,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: background.c,v 1.24 2022/12/10 22:28:50 tom Exp $ */ #define NEED_COLOR_CODE 1 #define NEED_COLOR_NAME 1 #include #include static int default_bg = COLOR_BLACK; static int default_fg = COLOR_WHITE; static void test_background(void) { NCURSES_COLOR_T f, b; int row; int chr; if (pair_content(0, &f, &b) == ERR) { printw("pair 0 contains no data\n"); } else { printw("pair 0 contains (%d,%d)\n", (int) f, (int) b); } dump_window(stdscr); printw("Initializing pair 1 to red/%s\n", color_name(default_bg)); init_pair(1, COLOR_RED, (NCURSES_COLOR_T) default_bg); bkgdset((chtype) (' ' | COLOR_PAIR(1))); printw("RED/BLACK\n"); dump_window(stdscr); printw("Initializing pair 2 to %s/blue\n", color_name(default_fg)); init_pair(2, (NCURSES_COLOR_T) default_fg, COLOR_BLUE); bkgdset((chtype) (' ' | COLOR_PAIR(2))); printw("This line should be %s/blue\n", color_name(default_fg)); dump_window(stdscr); printw("Initializing pair 3 to %s/cyan (ACS_HLINE)\n", color_name(default_fg)); init_pair(3, (NCURSES_COLOR_T) default_fg, COLOR_CYAN); printw("...and drawing a box which should be followed by lines\n"); bkgdset(ACS_HLINE | (chtype) COLOR_PAIR(3)); /* * Characters from vt100 line-drawing should be mapped to line-drawing, * since A_ALTCHARSET is set in the background, and the character part * of the background is replaced by the nonblank characters written. * * Characters not in the line-drawing range are usually sent as-is. * * With SVr4 curses it is possible to rely on this to mix uppercase text * with the (lowercase) line-drawing characters. ncurses uses some of * the uppercase characters for encoding thick- and double-lines. */ row = 7; mvprintw(row++, 10, "l"); for (chr = 0; chr < 32; ++chr) AddCh(' '); printw("x\n"); chr = 32; while (chr < 128) { if ((chr % 32) == 0) mvprintw(row++, 10, "x"); AddCh((chr == 127) ? ' ' : chr); if ((++chr % 32) == 0) printw("x\n"); } mvprintw(row++, 10, "m"); for (chr = 0; chr < 32; ++chr) AddCh(' '); printw("j\n"); dump_window(stdscr); bkgdset((chtype) (' ' | COLOR_PAIR(0))); printw("Default Colors\n"); dump_window(stdscr); printw("Resetting colors to pair 1\n"); bkgdset((chtype) (' ' | COLOR_PAIR(1))); printw("This line should be red/%s\n", color_name(default_bg)); dump_window(stdscr); printw("Setting screen to pair 0\n"); bkgd((chtype) (' ' | COLOR_PAIR(0))); dump_window(stdscr); printw("Setting screen to pair 1\n"); bkgd((chtype) (' ' | COLOR_PAIR(1))); dump_window(stdscr); printw("Setting screen to pair 2\n"); bkgd((chtype) (' ' | COLOR_PAIR(2))); dump_window(stdscr); printw("Setting screen to pair 3\n"); bkgd((chtype) (' ' | COLOR_PAIR(3))); dump_window(stdscr); printw("Setting screen to pair 0\n"); bkgd((chtype) (' ' | COLOR_PAIR(0))); dump_window(stdscr); } static void usage(int ok) { static const char *msg[] = { "Usage: background [options]" ,"" ,USAGE_COMMON ,"Options:" #if HAVE_ASSUME_DEFAULT_COLORS ," -a invoke assume_default_colors, repeat to use in init_pair" #endif ," -b XXX specify background color" #if HAVE_USE_DEFAULT_COLORS ," -d invoke use_default_colors, repeat to use in init_pair" #endif ," -f XXX specify foreground color" ," -l FILE log window-dumps to this file" }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { #if HAVE_ASSUME_DEFAULT_COLORS int a_option = 0; #endif #if HAVE_USE_DEFAULT_COLORS int d_option = 0; #endif int ch; setlocale(LC_ALL, ""); while ((ch = getopt(argc, argv, OPTS_COMMON "ab:df:l:")) != -1) { switch (ch) { #if HAVE_ASSUME_DEFAULT_COLORS case 'a': ++a_option; break; #endif case 'b': default_bg = color_code(optarg); break; #if HAVE_USE_DEFAULT_COLORS case 'd': ++d_option; break; #endif case 'f': default_fg = color_code(optarg); break; case 'l': if (!open_dump(optarg)) usage(FALSE); break; case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } #if HAVE_USE_DEFAULT_COLORS && HAVE_ASSUME_DEFAULT_COLORS if (a_option && d_option) { fprintf(stderr, "Use either -a or -d option, but not both\n"); ExitProgram(EXIT_FAILURE); } #endif initscr(); cbreak(); noecho(); if (has_colors()) { start_color(); #if HAVE_USE_DEFAULT_COLORS if (d_option) { printw("Using default colors...\n"); use_default_colors(); if (d_option > 1) { default_fg = -1; default_bg = -1; } } #endif #if HAVE_ASSUME_DEFAULT_COLORS if (a_option) { printw("Using assumed colors %s/%s...\n", color_name(default_fg), color_name(default_bg)); assume_default_colors(default_fg, default_bg); if (a_option > 1) { default_fg = -1; default_bg = -1; } } #endif test_background(); } else { printw("This demo requires a color terminal"); getch(); } endwin(); close_dump(); ExitProgram(EXIT_SUCCESS); } ncurses-6.4-20240113/test/ncurses.c0000644000000000000000000055522014523553657015272 0ustar rootroot/**************************************************************************** * 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. * ****************************************************************************/ /**************************************************************************** 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.538 2023/11/11 01:23: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(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(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 = 0; if ((fg != COLOR_BLACK) || (bg != COLOR_BLACK)) { pair = 1; if (init_pair(pair, fg, bg) == ERR) { beep(); } else { normal |= (chtype) COLOR_PAIR(pair); } } if (tx >= 0) { pair = 2; if (init_pair(pair, tx, bg) == ERR) { beep(); } else { extras |= (chtype) COLOR_PAIR(pair); normal &= ~A_COLOR; } } } bkgd(normal); bkgdset(normal); erase(); box(stdscr, 0, 0); MvAddStr(0, 20, "Character attribute test display"); for (j = 0; j < my_size; ++j) { bool arrow = (j == k); row = show_attr(my_wins[j], row, n, arrow, normal | extras | my_list[j].attr | my_list[k].attr, my_list[j].name); } MvPrintw(row, COLS_PRE_ATTRS, "This terminal does %shave the magic-cookie glitch", get_xmc() > -1 ? "" : "not "); MvPrintw(row + 1, COLS_PRE_ATTRS, "Enter '?' for help."); show_color_attr(fg, bg, tx); printw(" ACS (%d)", ac != 0); refresh(); } while (attr_getc(&n, &fg, &bg, &tx, &ac, &k, my_size)); bkgdset(A_NORMAL | BLANK); erase(); endwin(); return OK; } else { Cannot("does not support video attributes."); return ERR; } } #if USE_WIDEC_SUPPORT static bool use_fullwidth; static wchar_t wide_attr_test_string[MAX_ATTRSTRING + 1]; #define FULL_LO 0xff00 #define FULL_HI 0xff5e #define HALF_LO 0x20 #define isFullWidth(ch) ((int)(ch) >= FULL_LO && (int)(ch) <= FULL_HI) #define ToNormalWidth(ch) (wchar_t) (((int)(ch) - FULL_LO) + HALF_LO) #define ToFullWidth(ch) (wchar_t) (((int)(ch) - HALF_LO) + FULL_LO) /* * Returns an ASCII code in [32..126] */ static wchar_t normal_wchar(int ch) { wchar_t result = (wchar_t) ch; if (isFullWidth(ch)) result = ToNormalWidth(ch); return result; } /* * Returns either an ASCII code in in [32..126] or full-width in * [0xff00..0xff5e], according to use_fullwidth setting. */ static wchar_t target_wchar(int ch) { wchar_t result = (wchar_t) ch; if (use_fullwidth) { if (!isFullWidth(ch)) result = ToFullWidth(ch); } else { if (isFullWidth(ch)) result = ToNormalWidth(ch); } return result; } static void wide_adjust_attr_string(int adjust) { wchar_t save = wide_attr_test_string[0]; int first = ((int) normal_wchar(save)) + adjust; if (first >= ATTRSTRING_1ST) { int j, k; for (j = 0, k = first; j < MAX_ATTRSTRING; ++j, ++k) { if (k > ATTRSTRING_END) break; wide_attr_test_string[j] = target_wchar(k); if (((k + 1 - first) % 5) == 0) { if (++j >= MAX_ATTRSTRING) break; wide_attr_test_string[j] = ' '; } } if ((LEN_ATTRSTRING - j) > 5) { wide_attr_test_string[0] = save; wide_adjust_attr_string(adjust - 1); } else { while (j < MAX_ATTRSTRING) wide_attr_test_string[j++] = ' '; wide_attr_test_string[j] = '\0'; } } } static void wide_init_attr_string(void) { use_fullwidth = FALSE; wide_attr_test_string[0] = (wchar_t) default_attr_string(); wide_adjust_attr_string(0); } static void set_wide_background(NCURSES_PAIRS_T pair) { cchar_t normal; wchar_t blank[2]; blank[0] = ' '; blank[1] = 0; setcchar(&normal, blank, A_NORMAL, pair, 0); bkgrnd(&normal); bkgrndset(&normal); } static attr_t get_wide_background(void) { attr_t result = WA_NORMAL; attr_t attr; cchar_t ch; NCURSES_PAIRS_T pair; memset(&ch, 0, sizeof(ch)); if (getbkgrnd(&ch) != ERR) { wchar_t wch[CCHARW_MAX]; if (getcchar(&ch, wch, &attr, &pair, 0) != ERR) { result = attr; } } return result; } static int wide_show_attr(WINDOW *win, int row, int skip, bool arrow, attr_t attr, NCURSES_PAIRS_T pair, const char *name) { int ncv = get_ncv(); attr_t test = attr & ~WA_ALTCHARSET; if (arrow) MvPrintw(row, COLS_PRE_ATTRS - 3, "-->"); MvPrintw(row, COLS_PRE_ATTRS, "%s mode:", name); MvPrintw(row, COL_ATTRSTRING - 1, "|"); if (skip) printw("%*s", skip, " "); /* * Just for testing, write text using the alternate character set one * character at a time (to pass its rendition directly), and use the * string operation for the other attributes. */ wmove(win, 0, 0); werase(win); if (attr & WA_ALTCHARSET) { const wchar_t *s; cchar_t ch; for (s = wide_attr_test_string; *s != L'\0'; ++s) { wchar_t fill[2]; fill[0] = *s; fill[1] = L'\0'; setcchar(&ch, fill, attr, pair, 0); (void) wadd_wch(win, &ch); } } else { attr_t old_attr = 0; NCURSES_PAIRS_T old_pair = 0; (void) (wattr_get) (win, &old_attr, &old_pair, 0); (void) wattr_set(win, attr, pair, 0); (void) waddwstr(win, wide_attr_test_string); (void) wattr_set(win, old_attr, old_pair, 0); } if (skip) printw("%*s", skip, " "); MvPrintw(row, COL_ATTRSTRING + LEN_ATTRSTRING, "|"); if (test != A_NORMAL) { if (!(term_attrs() & test)) { printw(" (N/A)"); } else { if (ncv > 0 && (get_wide_background() & A_COLOR)) { static const attr_t table[] = { WA_STANDOUT, WA_UNDERLINE, WA_REVERSE, WA_BLINK, WA_DIM, WA_BOLD, WA_INVIS, WA_PROTECT, WA_ALTCHARSET }; unsigned n; bool found = FALSE; for (n = 0; n < SIZEOF(table); n++) { if ((table[n] & attr) != 0 && ((1 << n) & ncv) != 0) { found = TRUE; break; } } if (found) printw(" (NCV)"); } if ((term_attrs() & test) != test) { printw(" (Part)"); } } } return row + 2; } static bool wide_attr_getc(int *skip, NCURSES_COLOR_T *fg, NCURSES_COLOR_T *bg, NCURSES_COLOR_T *tx, int *ac, unsigned *kc, unsigned limit) { bool result = TRUE; bool error = FALSE; WINDOW *helpwin; do { int ch = Getchar(); error = FALSE; if (ch < 256 && isdigit(ch)) { *skip = (ch - '0'); } else { switch (ch) { case CTRL('L'): Repaint(); break; case HELP_KEY_1: if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) { box_set(helpwin, 0, 0); attr_legend(helpwin); wGetchar(helpwin); delwin(helpwin); } break; case 'a': *ac = 0; break; case 'A': *ac = A_ALTCHARSET; break; case 'v': if (*kc == 0) *kc = limit - 1; else *kc -= 1; break; case 'V': *kc += 1; if (*kc >= limit) *kc = 0; break; case 'w': use_fullwidth = FALSE; wide_adjust_attr_string(0); break; case 'W': use_fullwidth = TRUE; wide_adjust_attr_string(0); break; case '<': wide_adjust_attr_string(-1); break; case '>': wide_adjust_attr_string(1); break; case case_QUIT: result = FALSE; break; default: error = cycle_color_attr(ch, fg, bg, tx); break; } } } while (error); return result; } static int x_attr_test(bool recur GCC_UNUSED) /* test text attributes using wide-character calls */ { int n; int skip = get_xmc(); NCURSES_COLOR_T fg = COLOR_BLACK; /* color pair 0 is special */ NCURSES_COLOR_T bg = COLOR_BLACK; NCURSES_COLOR_T tx = -1; int ac = 0; W_ATTR_TBL my_list[SIZEOF(w_attrs_to_test)]; WINDOW *my_wins[SIZEOF(w_attrs_to_test)]; unsigned my_size = init_w_attr_list(my_list, term_attrs()); if (my_size > 1) { unsigned j, k; for (j = 0; j < my_size; ++j) { my_wins[j] = subwin(stdscr, 1, LEN_ATTRSTRING, 2 + (int) (2 * j), COL_ATTRSTRING); scrollok(my_wins[j], FALSE); } if (skip < 0) skip = 0; n = skip; /* make it easy */ k = my_size - 1; wide_init_attr_string(); do { int row = 2; NCURSES_PAIRS_T pair = 0; NCURSES_PAIRS_T extras = 0; if (UseColors) { pair = (NCURSES_PAIRS_T) (fg != COLOR_BLACK || bg != COLOR_BLACK); if (pair != 0) { pair = 1; if (init_pair(pair, fg, bg) == ERR) { beep(); } } extras = pair; if (tx >= 0) { extras = 2; if (init_pair(extras, tx, bg) == ERR) { beep(); } } } set_wide_background(pair); erase(); box_set(stdscr, 0, 0); MvAddStr(0, 20, "Character attribute test display"); for (j = 0; j < my_size; ++j) { row = wide_show_attr(my_wins[j], row, n, (j == k), ((attr_t) ac | my_list[j].attr | my_list[k].attr), extras, my_list[j].name); } MvPrintw(row, COLS_PRE_ATTRS, "This terminal does %shave the magic-cookie glitch", get_xmc() > -1 ? "" : "not "); MvPrintw(row + 1, COLS_PRE_ATTRS, "Enter '?' for help."); show_color_attr(fg, bg, tx); printw(" ACS (%d)", ac != 0); refresh(); } while (wide_attr_getc(&n, &fg, &bg, &tx, &ac, &k, my_size)); set_wide_background(0); erase(); endwin(); return OK; } else { Cannot("does not support extended video attributes."); return ERR; } } #endif /**************************************************************************** * * Color support tests * ****************************************************************************/ static NCURSES_CONST char *the_color_names[] = { "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", "BLACK", "RED", "GREEN", "YELLOW", "BLUE", "MAGENTA", "CYAN", "WHITE" }; static void show_color_name(int y, int x, int color, bool wide, int zoom) { if (move(y, x) != ERR) { char temp[80]; int width = 8; if (wide || zoom) { _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%02d", color); if (wide) width = 4; if ((int) strlen(temp) >= width) { int pwr2 = 0; while ((1 << pwr2) < color) ++pwr2; _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) width > 4 ? "2^%d" : "^%d", pwr2); } } else if (color >= 8) { _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "[%02d]", color); } else if (color < 0) { _nc_STRCPY(temp, "default", sizeof(temp)); } else { _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%.*s", 16, the_color_names[color]); } printw("%-*.*s", width, width, temp); } } static void color_legend(WINDOW *helpwin, bool wide) { int row = 1; int col = 1; MvWPrintw(helpwin, row++, col, "ESC to exit."); ++row; MvWPrintw(helpwin, row++, col, "Use up/down arrow to scroll through the display if it is"); MvWPrintw(helpwin, row++, col, "longer than one screen. Control/N and Control/P can be used"); MvWPrintw(helpwin, row++, col, "in place of up/down arrow. Use pageup/pagedown to scroll a"); MvWPrintw(helpwin, row++, col, "full screen; control/B and control/F can be used here."); ++row; MvWPrintw(helpwin, row++, col, "Toggles:"); MvWPrintw(helpwin, row++, col, " a/A toggle altcharset off/on"); MvWPrintw(helpwin, row++, col, " b/B toggle bold off/on"); if (has_colors()) { MvWPrintw(helpwin, row++, col, " c/C cycle used-colors through 8,16,...,COLORS"); } MvWPrintw(helpwin, row++, col, " n/N toggle text/number on/off"); MvWPrintw(helpwin, row++, col, " r/R toggle reverse on/off"); MvWPrintw(helpwin, row++, col, " w/W switch width between 4/8 columns"); MvWPrintw(helpwin, row++, col, " z/Z zoom out (or in)"); #if USE_WIDEC_SUPPORT if (wide) { MvWPrintw(helpwin, row++, col, "Wide characters:"); MvWPrintw(helpwin, row, col, " x/X toggle text between ASCII and wide-character"); } #else (void) wide; #endif } #define set_color_test(name, value) if (name != value) { name = value; base_row = 0; } static int color_cycle(int current, int step) { int result = current; if (step < 0) { if (current <= 8) { result = COLORS; } else { result = 8; if ((result * 2) > COLORS) { result = COLORS; } else { while ((result * 2) < current) { result *= 2; } } } } else { if (current >= COLORS) { result = 8; } else { result *= 2; } if (result > COLORS) result = COLORS; } return result; } /* generate a color test pattern */ static int color_test(bool recur GCC_UNUSED) { NCURSES_PAIRS_T i; int top = 0, width; int base_row = 0; int grid_top = top + 3; int page_size = (LINES - grid_top); int pairs_max; int colors_max = COLORS; int col_limit; int row_limit; int per_row; char *numbered = 0; const char *hello; bool done = FALSE; bool opt_acsc = FALSE; bool opt_bold = FALSE; bool opt_revs = FALSE; bool opt_nums = FALSE; bool opt_wide = FALSE; int opt_zoom = 0; WINDOW *helpwin; if (!UseColors) { Cannot("does not support color."); return ERR; } numbered = typeCalloc(char, COLS + 1); done = ((COLS < 16) || (numbered == 0)); /* * Because the number of colors is usually a power of two, we also use * a power of two for the number of colors shown per line (to be tidy). */ for (col_limit = 1; col_limit * 2 < COLS; col_limit *= 2) ; reloop: while (!done) { int shown = 0; int zoom_size = (1 << opt_zoom); int colors_max1 = colors_max / zoom_size; double colors_max2 = (double) colors_max1 * (double) colors_max1; pairs_max = PAIR_NUMBER(A_COLOR) + 1; if (colors_max2 <= COLOR_PAIRS) { int limit = (colors_max1 - MinColors) * (colors_max1 - MinColors); if (pairs_max > limit) pairs_max = limit; } if (pairs_max > COLOR_PAIRS) pairs_max = COLOR_PAIRS; if (pairs_max < colors_max1) pairs_max = colors_max1; /* this assumes an 80-column line */ if (opt_wide) { width = 4; hello = "Test"; per_row = (col_limit / ((colors_max1 > 8) ? width : 8)); } else { width = 8; hello = "Hello"; per_row = (col_limit / width); } per_row -= MinColors; row_limit = (pairs_max + per_row - 1) / per_row; move(0, 0); (void) printw("There are %d color pairs and %d colors", pairs_max, COLORS); if (colors_max1 != COLORS) (void) printw(" (using %d colors)", colors_max1); if (MinColors) (void) addstr(" besides 'default'"); if (opt_zoom) (void) printw(" zoom:%d", opt_zoom); clrtobot(); MvPrintw(top + 1, 0, "%dx%d matrix of foreground/background colors, bold *%s*\n", row_limit, per_row, opt_bold ? "on" : "off"); /* show color names/numbers across the top */ for (i = 0; i < per_row; i++) { show_color_name(top + 2, (i + 1) * width, (int) i * zoom_size + MinColors, opt_wide, opt_zoom); } /* show a grid of colors, with color names/ numbers on the left */ for (i = (NCURSES_PAIRS_T) (base_row * per_row); i < pairs_max; i++) { int row = grid_top + (i / per_row) - base_row; int col = (i % per_row + 1) * width; NCURSES_PAIRS_T pair = i; if ((i / per_row) > row_limit) break; #define InxToFG(i) (int)((((unsigned long)(i) * (unsigned long)zoom_size) % (unsigned long)(colors_max1 - MinColors)) + (unsigned long)MinColors) #define InxToBG(i) (int)((((unsigned long)(i) * (unsigned long)zoom_size) / (unsigned long)(colors_max1 - MinColors)) + (unsigned long)MinColors) if (row >= 0 && move(row, col) != ERR) { NCURSES_COLOR_T fg = (NCURSES_COLOR_T) InxToFG(i); NCURSES_COLOR_T bg = (NCURSES_COLOR_T) InxToBG(i); init_pair(pair, fg, bg); attron(COLOR_PAIR(pair)); if (opt_acsc) attron(A_ALTCHARSET); if (opt_bold) attron(A_BOLD); if (opt_revs) attron(A_REVERSE); if (opt_nums) { _nc_SPRINTF(numbered, _nc_SLIMIT((size_t) (COLS + 1)) "{%02X}", (int) i); hello = numbered; } printw("%-*.*s", width, width, hello); (void) attrset(A_NORMAL); if ((i % per_row) == 0 && InxToFG(i) == MinColors) { show_color_name(row, 0, InxToBG(i), opt_wide, opt_zoom); } ++shown; } else if (shown) { break; } } switch (wGetchar(stdscr)) { case 'a': opt_acsc = FALSE; break; case 'A': opt_acsc = TRUE; break; case 'b': opt_bold = FALSE; break; case 'B': opt_bold = TRUE; break; case 'c': colors_max = color_cycle(colors_max, -1); break; case 'C': colors_max = color_cycle(colors_max, 1); break; case 'n': opt_nums = FALSE; break; case 'N': opt_nums = TRUE; break; case 'r': opt_revs = FALSE; break; case 'R': opt_revs = TRUE; break; case case_QUIT: done = TRUE; continue; case 'w': set_color_test(opt_wide, FALSE); break; case 'W': set_color_test(opt_wide, TRUE); break; case 'z': if (opt_zoom <= 0) { beep(); } else { --opt_zoom; goto reloop; } break; case 'Z': if ((1 << opt_zoom) >= colors_max) { beep(); } else { ++opt_zoom; goto reloop; } break; case CTRL('p'): case KEY_UP: if (base_row <= 0) { beep(); } else { base_row -= 1; } break; case CTRL('n'): case KEY_DOWN: if (base_row + page_size >= row_limit) { beep(); } else { base_row += 1; } break; case CTRL('b'): case KEY_PREVIOUS: case KEY_PPAGE: if (base_row <= 0) { beep(); } else { base_row -= (page_size - 1); if (base_row < 0) base_row = 0; } break; case CTRL('f'): case KEY_NEXT: case KEY_NPAGE: if (base_row + page_size >= row_limit) { beep(); } else { base_row += page_size - 1; if (base_row + page_size >= row_limit) { base_row = row_limit - page_size - 1; } } break; case HELP_KEY_1: if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) { box(helpwin, 0, 0); color_legend(helpwin, FALSE); wGetchar(helpwin); delwin(helpwin); } break; default: beep(); continue; } } erase(); endwin(); free(numbered); return OK; } #if USE_WIDEC_SUPPORT #if USE_EXTENDED_COLOR #define InitExtendedPair(p,f,g) init_extended_pair((p),(f),(g)) #define ExtendedColorSet(p) color_set((NCURSES_PAIRS_T) (p), &(p)) #define EXTENDED_PAIRS_T int #else #define InitExtendedPair(p,f,g) init_pair((NCURSES_PAIRS_T) (p),(NCURSES_COLOR_T)(f),(NCURSES_COLOR_T)(g)) #define ExtendedColorSet(p) color_set((NCURSES_PAIRS_T) (p), NULL) #define EXTENDED_PAIRS_T NCURSES_PAIRS_T #endif /* generate a color test pattern */ static int x_color_test(bool recur GCC_UNUSED) { long i; int top = 0, width; int base_row = 0; int grid_top = top + 3; int page_size = (LINES - grid_top); int pairs_max; int colors_max = COLORS; int col_limit; int row_limit; int per_row; char *numbered = 0; const char *hello; bool done = FALSE; bool opt_acsc = FALSE; bool opt_bold = FALSE; bool opt_revs = FALSE; bool opt_wide = FALSE; bool opt_nums = FALSE; bool opt_xchr = FALSE; int opt_zoom = 0; wchar_t *buffer = 0; WINDOW *helpwin; if (!UseColors) { Cannot("does not support color."); return ERR; } numbered = typeCalloc(char, COLS + 1); buffer = typeCalloc(wchar_t, COLS + 1); done = ((COLS < 16) || (numbered == 0) || (buffer == 0)); /* * Because the number of colors is usually a power of two, we also use * a power of two for the number of colors shown per line (to be tidy). */ for (col_limit = 1; col_limit * 2 < COLS; col_limit *= 2) ; reloop: while (!done) { int shown = 0; int zoom_size = (1 << opt_zoom); int colors_max1 = colors_max / zoom_size; double colors_max2 = (double) colors_max1 * (double) colors_max1; pairs_max = ((unsigned) (-1)) / 2; if (colors_max2 <= COLOR_PAIRS) { int limit = (colors_max1 - MinColors) * (colors_max1 - MinColors); if (pairs_max > limit) pairs_max = limit; } if (pairs_max > COLOR_PAIRS) pairs_max = COLOR_PAIRS; if (pairs_max < colors_max1) pairs_max = colors_max1; if (opt_wide) { width = 4; hello = "Test"; per_row = (col_limit / ((colors_max1 > 8) ? width : 8)); } else { width = 8; hello = "Hello"; per_row = (col_limit / width); } per_row -= MinColors; if (opt_xchr) { make_fullwidth_text(buffer, hello); width *= 2; per_row /= 2; } else { make_narrow_text(buffer, hello); } row_limit = (pairs_max + per_row - 1) / per_row; move(0, 0); (void) printw("There are %d color pairs and %d colors", pairs_max, COLORS); if (colors_max1 != COLORS) (void) printw(" (using %d colors)", colors_max1); if (MinColors) (void) addstr(" besides 'default'"); if (opt_zoom) (void) printw(" zoom:%d", opt_zoom); clrtobot(); MvPrintw(top + 1, 0, "%dx%d matrix of foreground/background colors, bold *%s*\n", row_limit, per_row, opt_bold ? "on" : "off"); /* show color names/numbers across the top */ for (i = 0; i < per_row; i++) { show_color_name(top + 2, ((int) i + 1) * width, (int) i * zoom_size + MinColors, opt_wide, opt_zoom); } /* show a grid of colors, with color names/ numbers on the left */ for (i = (base_row * per_row); i < pairs_max; i++) { int row = grid_top + ((int) i / per_row) - base_row; int col = ((int) i % per_row + 1) * width; int pair = (int) i; if ((i / per_row) > row_limit) break; if (row >= 0 && move(row, col) != ERR) { InitExtendedPair(pair, InxToFG(i), InxToBG(i)); (void) ExtendedColorSet(pair); if (opt_acsc) attr_on(WA_ALTCHARSET, NULL); if (opt_bold) attr_on(WA_BOLD, NULL); if (opt_revs) attr_on(WA_REVERSE, NULL); if (opt_nums) { _nc_SPRINTF(numbered, _nc_SLIMIT((size_t) (COLS + 1) * sizeof(wchar_t)) "{%02X}", (unsigned) i); if (opt_xchr) { make_fullwidth_text(buffer, numbered); } else { make_narrow_text(buffer, numbered); } } addnwstr(buffer, width); (void) attr_set(A_NORMAL, 0, NULL); if ((i % per_row) == 0 && InxToFG(i) == MinColors) { show_color_name(row, 0, InxToBG(i), opt_wide, opt_zoom); } ++shown; } else if (shown) { break; } } switch (wGetchar(stdscr)) { case 'a': opt_acsc = FALSE; break; case 'A': opt_acsc = TRUE; break; case 'b': opt_bold = FALSE; break; case 'B': opt_bold = TRUE; break; case 'c': colors_max = color_cycle(colors_max, -1); break; case 'C': colors_max = color_cycle(colors_max, 1); break; case 'n': opt_nums = FALSE; break; case 'N': opt_nums = TRUE; break; case 'r': opt_revs = FALSE; break; case 'R': opt_revs = TRUE; break; case case_QUIT: done = TRUE; continue; case 'w': set_color_test(opt_wide, FALSE); break; case 'W': set_color_test(opt_wide, TRUE); break; case 'x': opt_xchr = FALSE; break; case 'X': opt_xchr = TRUE; break; case 'z': if (opt_zoom <= 0) { beep(); } else { --opt_zoom; goto reloop; } break; case 'Z': if ((1 << opt_zoom) >= colors_max) { beep(); } else { ++opt_zoom; goto reloop; } break; case CTRL('p'): case KEY_UP: if (base_row <= 0) { beep(); } else { base_row -= 1; } break; case CTRL('n'): case KEY_DOWN: if (base_row + page_size >= row_limit) { beep(); } else { base_row += 1; } break; case CTRL('b'): case KEY_PREVIOUS: case KEY_PPAGE: if (base_row <= 0) { beep(); } else { base_row -= (page_size - 1); if (base_row < 0) base_row = 0; } break; case CTRL('f'): case KEY_NEXT: case KEY_NPAGE: if (base_row + page_size >= row_limit) { beep(); } else { base_row += page_size - 1; if (base_row + page_size >= row_limit) { base_row = row_limit - page_size - 1; } } break; case HELP_KEY_1: if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) { box(helpwin, 0, 0); color_legend(helpwin, TRUE); wGetchar(helpwin); delwin(helpwin); } break; default: beep(); continue; } } erase(); endwin(); free(numbered); free(buffer); return OK; } #endif /* USE_WIDEC_SUPPORT */ #if HAVE_COLOR_CONTENT static void change_color(NCURSES_PAIRS_T current, int field, int value, int usebase) { NCURSES_COLOR_T red, green, blue; color_content(current, &red, &green, &blue); switch (field) { case 0: red = (NCURSES_COLOR_T) (usebase ? (red + value) : value); break; case 1: green = (NCURSES_COLOR_T) (usebase ? (green + value) : value); break; case 2: blue = (NCURSES_COLOR_T) (usebase ? (blue + value) : value); break; } if (init_color(current, red, green, blue) == ERR) beep(); } static void reset_all_colors(void) { NCURSES_PAIRS_T c; for (c = 0; c < COLORS; ++c) init_color(c, all_colors[c].red, all_colors[c].green, all_colors[c].blue); } #define okCOLOR(n) ((n) >= 0 && (n) < MaxColors) #define okRGB(n) ((n) >= 0 && (n) <= 1000) #define DecodeRGB(n) (NCURSES_COLOR_T) ((n * 1000) / 0xffff) static void init_all_colors(bool xterm_colors, char *palette_file) { NCURSES_PAIRS_T cp; all_colors = typeMalloc(RGB_DATA, (unsigned) MaxColors); if (!all_colors) failed("all_colors"); for (cp = 0; cp < MaxColors; ++cp) { color_content(cp, &all_colors[cp].red, &all_colors[cp].green, &all_colors[cp].blue); } /* xterm and compatible terminals can read results of an OSC string * asking for the current color palette. */ if (xterm_colors) { int n; char result[BUFSIZ]; int check_n; unsigned check_r, check_g, check_b; raw(); noecho(); for (n = 0; n < MaxColors; ++n) { int got; fprintf(stderr, "\033]4;%d;?\007", n); got = (int) read(0, result, sizeof(result) - 1); if (got < 0) break; result[got] = '\0'; if (sscanf(result, "\033]4;%d;rgb:%x/%x/%x\007", &check_n, &check_r, &check_g, &check_b) == 4 && check_n == n) { all_colors[n].red = DecodeRGB(check_r); all_colors[n].green = DecodeRGB(check_g); all_colors[n].blue = DecodeRGB(check_b); } else { break; } } reset_prog_mode(); } if (palette_file != 0) { FILE *fp = fopen(palette_file, "r"); if (fp != 0) { char buffer[BUFSIZ]; int red, green, blue; int scale = 1000; int c; while (fgets(buffer, sizeof(buffer), fp) != 0) { if (sscanf(buffer, "scale:%d", &c) == 1) { scale = c; if (scale < 100) scale = 100; if (scale > 1000) scale = 1000; } else if (sscanf(buffer, "%d:%d %d %d", &c, &red, &green, &blue) == 4 && okCOLOR(c) && okRGB(red) && okRGB(green) && okRGB(blue)) { #define Scaled(n) (NCURSES_COLOR_T) (((n) * 1000) / scale) all_colors[c].red = Scaled(red); all_colors[c].green = Scaled(green); all_colors[c].blue = Scaled(blue); } } fclose(fp); } } } #define scaled_rgb(n) ((255 * (n)) / 1000) static int color_edit(bool recur GCC_UNUSED) /* display the color test pattern, without trying to edit colors */ { int i; int current; int this_c, value, field; int last_c; int top_color; int page_size; if (!UseColors) { Cannot("does not support color."); return ERR; } else if (!can_change_color()) { Cannot("has hardwired color values."); return ERR; } reset_all_colors(); #ifdef KEY_RESIZE retry: #endif current = 0; this_c = 0; value = 0; field = 0; top_color = 0; page_size = (LINES - 6); erase(); for (i = 0; i < MaxColors; i++) init_pair((NCURSES_PAIRS_T) i, (NCURSES_COLOR_T) COLOR_WHITE, (NCURSES_COLOR_T) i); MvPrintw(LINES - 2, 0, "Number: %d", value); do { NCURSES_COLOR_T red, green, blue; attron(A_BOLD); MvAddStr(0, 20, "Color RGB Value Editing"); attroff(A_BOLD); for (i = (NCURSES_COLOR_T) top_color; (i - top_color < page_size) && (i < MaxColors); i++) { char numeric[80]; _nc_SPRINTF(numeric, _nc_SLIMIT(sizeof(numeric)) "[%d]", i); MvPrintw(2 + i - top_color, 0, "%c %-8s:", (i == current ? '>' : ' '), (i < (int) SIZEOF(the_color_names) ? the_color_names[i] : numeric)); (void) attrset(AttrArg(COLOR_PAIR(i), 0)); addstr(" "); (void) attrset(A_NORMAL); color_content((NCURSES_PAIRS_T) i, &red, &green, &blue); addstr(" R = "); if (current == i && field == 0) attron(A_STANDOUT); printw("%04d", (int) red); if (current == i && field == 0) (void) attrset(A_NORMAL); addstr(", G = "); if (current == i && field == 1) attron(A_STANDOUT); printw("%04d", (int) green); if (current == i && field == 1) (void) attrset(A_NORMAL); addstr(", B = "); if (current == i && field == 2) attron(A_STANDOUT); printw("%04d", (int) blue); if (current == i && field == 2) (void) attrset(A_NORMAL); (void) attrset(A_NORMAL); printw(" ( %3d %3d %3d )", (int) scaled_rgb(red), (int) scaled_rgb(green), (int) scaled_rgb(blue)); } MvAddStr(LINES - 3, 0, "Use up/down to select a color, left/right to change fields."); MvAddStr(LINES - 2, 0, "Modify field by typing nnn=, nnn-, or nnn+. ? for help."); move(2 + current - top_color, 0); last_c = this_c; this_c = Getchar(); if (this_c < 256 && isdigit(this_c) && !isdigit(last_c)) value = 0; switch (this_c) { #ifdef KEY_RESIZE case KEY_RESIZE: move(0, 0); goto retry; #endif case '!': ShellOut(FALSE); /* FALLTHRU */ case CTRL('r'): endwin(); refresh(); break; case CTRL('l'): refresh(); break; case CTRL('b'): case KEY_PPAGE: if (current > 0) current -= (page_size - 1); else beep(); break; case CTRL('f'): case KEY_NPAGE: if (current < (MaxColors - 1)) current += (page_size - 1); else beep(); break; case CTRL('p'): case KEY_UP: current = (current == 0 ? (MaxColors - 1) : current - 1); break; case CTRL('n'): case KEY_DOWN: current = (current == (MaxColors - 1) ? 0 : current + 1); break; case '\t': case KEY_RIGHT: field = (field == 2 ? 0 : field + 1); break; case KEY_BTAB: case KEY_LEFT: field = (field == 0 ? 2 : field - 1); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': value = value * 10 + (this_c - '0'); break; case '+': change_color((NCURSES_PAIRS_T) current, field, value, 1); break; case '-': change_color((NCURSES_PAIRS_T) current, field, -value, 1); break; case '=': change_color((NCURSES_PAIRS_T) current, field, value, 0); break; case HELP_KEY_1: erase(); P(" RGB Value Editing Help"); P(""); P("You are in the RGB value editor. Use the arrow keys to select one of"); P("the fields in one of the RGB triples of the current colors; the one"); P("currently selected will be reverse-video highlighted."); P(""); P("To change a field, enter the digits of the new value; they are echoed"); P("as entered. Finish by typing `='. The change will take effect instantly."); P("To increment or decrement a value, use the same procedure, but finish"); P("with a `+' or `-'."); P(""); P("Use `!' to shell-out, ^R or ^L to repaint the screen."); P(""); P("Press 'm' to invoke the top-level menu with the current color settings."); P("To quit, do ESC"); Pause(); erase(); break; case 'm': endwin(); main_menu(FALSE); for (i = 0; i < MaxColors; i++) init_pair((NCURSES_PAIRS_T) i, (NCURSES_COLOR_T) COLOR_WHITE, (NCURSES_COLOR_T) i); refresh(); break; case case_QUIT: break; default: beep(); break; } if (current < 0) current = 0; if (current >= MaxColors) current = MaxColors - 1; if (current < top_color) top_color = current; if (current - top_color >= page_size) top_color = current - (page_size - 1); MvPrintw(LINES - 1, 0, "Number: %d", value); clrtoeol(); } while (!isQuit(this_c, TRUE)); erase(); /* * ncurses does not reset each color individually when calling endwin(). */ reset_all_colors(); endwin(); return OK; } #endif /* HAVE_COLOR_CONTENT */ /**************************************************************************** * * Alternate character-set stuff * ****************************************************************************/ static bool cycle_attr(int ch, unsigned *at_code, 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]; 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 { int count; TEST_CCHAR(src, count, { attr |= (test_attrs & A_ALTCHARSET); setcchar(dst, test_wch, attr, pair, NULL); }, { ; }); } while (0); return dst; } /* * Header/legend take up no more than 8 lines, leaving 16 lines on a 24-line * display. If there are no repeats, we could normally display 16 lines of 64 * characters (1024 total). However, taking repeats and double-width cells * into account, use 256 characters for the page. */ static void show_paged_widechars(unsigned base, unsigned pagesize, int repeat, int space, attr_t attr, NCURSES_PAIRS_T pair) { unsigned first = base * pagesize; unsigned last = first + pagesize - 1; int per_line = 16; cchar_t temp; wchar_t code; wchar_t codes[10]; erase(); attron(A_BOLD); MvPrintw(0, 20, "Display of Character Codes %#x to %#x", first, last); attroff(A_BOLD); for (code = (wchar_t) first; code <= (wchar_t) last; code++) { int row = (2 + (int) (code - (wchar_t) first) / per_line); int col = 5 * ((int) code % per_line); int count; memset(&codes, 0, sizeof(codes)); codes[0] = code; setcchar(&temp, codes, attr, pair, 0); move(row, col); if (wcwidth(code) == 0 && code != 0) { AddCh((chtype) space | (A_REVERSE ^ attr) | (attr_t) COLOR_PAIR(pair)); } add_wch(&temp); for (count = 1; count < repeat; ++count) { add_wch(&temp); } } } static void show_upper_widechars(unsigned first, int repeat, int space, attr_t attr, NCURSES_PAIRS_T pair) { cchar_t temp; wchar_t code; unsigned last = first + 31; erase(); attron(A_BOLD); MvPrintw(0, 20, "Display of Character Codes %d to %d", first, last); attroff(A_BOLD); for (code = (wchar_t) first; code <= (wchar_t) last; code++) { int row = 2 + ((int) (code - (wchar_t) first) % 16); int col = ((int) (code - (wchar_t) first) / 16) * COLS / 2; wchar_t codes[10]; char tmp[80]; int count = repeat; _nc_SPRINTF(tmp, _nc_SLIMIT(sizeof(tmp)) "%3ld (0x%lx)", (long) code, (long) code); MvPrintw(row, col, "%*s: ", COLS / 4, tmp); memset(&codes, 0, sizeof(codes)); codes[0] = code; setcchar(&temp, codes, attr, pair, 0); do { int y, x; /* * Give non-spacing characters something to combine with. If we * don't, they'll bunch up in a heap on the space after the ":". * Mark them with reverse-video to make them simpler to find on * the display. */ if (wcwidth(code) == 0) { AddCh((chtype) space | (A_REVERSE ^ attr) | (attr_t) COLOR_PAIR(pair)); } /* * This uses echo_wchar(), for comparison with the normal 'f' * test (and to make a test-case for echo_wchar()). The screen * may flicker because the erase() at the top of the function * is met by the builtin refresh() in echo_wchar(). */ echo_wchar(&temp); /* * The repeat-count may make text wrap - avoid that. */ getyx(stdscr, y, x); (void) y; if (x >= col + (COLS / 2) - 2) break; } while (--count > 0); } } static int show_1_wacs(int n, int repeat, const char *name, const cchar_t *code) { const int height = 16; int row = 2 + (n % height); int col = (n / height) * COLS / 2; MvPrintw(row, col, "%*s : ", COLS / 4, name); while (--repeat >= 0) { add_wch(code); } return n + 1; } #define MERGE_ATTR(wch) merge_wide_attr(&temp, wch, attr, pair) static void show_wacs_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair) /* display the wide-ACS character set */ { cchar_t temp; int n; /*#define BOTH2(name) #name, &(name) */ #define BOTH2(name) #name, MERGE_ATTR(name) erase(); attron(A_BOLD); MvAddStr(0, 20, "Display of the Wide-ACS Character Set"); attroff(A_BOLD); refresh(); n = show_1_wacs(0, repeat, BOTH2(WACS_ULCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_URCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_LLCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_LRCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_LTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_RTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_TTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_BTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_HLINE)); n = show_1_wacs(n, repeat, BOTH2(WACS_VLINE)); n = show_1_wacs(n, repeat, BOTH2(WACS_LARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_RARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_UARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_DARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_BLOCK)); n = show_1_wacs(n, repeat, BOTH2(WACS_BOARD)); n = show_1_wacs(n, repeat, BOTH2(WACS_LANTERN)); n = show_1_wacs(n, repeat, BOTH2(WACS_BULLET)); n = show_1_wacs(n, repeat, BOTH2(WACS_CKBOARD)); n = show_1_wacs(n, repeat, BOTH2(WACS_DEGREE)); n = show_1_wacs(n, repeat, BOTH2(WACS_DIAMOND)); n = show_1_wacs(n, repeat, BOTH2(WACS_PLMINUS)); n = show_1_wacs(n, repeat, BOTH2(WACS_PLUS)); #ifdef CURSES_WACS_ARRAY n = show_1_wacs(n, repeat, BOTH2(WACS_GEQUAL)); n = show_1_wacs(n, repeat, BOTH2(WACS_NEQUAL)); n = show_1_wacs(n, repeat, BOTH2(WACS_LEQUAL)); n = show_1_wacs(n, repeat, BOTH2(WACS_STERLING)); n = show_1_wacs(n, repeat, BOTH2(WACS_PI)); n = show_1_wacs(n, repeat, BOTH2(WACS_S1)); n = show_1_wacs(n, repeat, BOTH2(WACS_S3)); n = show_1_wacs(n, repeat, BOTH2(WACS_S7)); (void) show_1_wacs(n, repeat, BOTH2(WACS_S9)); #endif } #ifdef WACS_D_PLUS static void show_wacs_chars_double(int repeat, attr_t attr, NCURSES_PAIRS_T pair) /* display the wide-ACS character set */ { cchar_t temp; int n; /*#define BOTH2(name) #name, &(name) */ #define BOTH2(name) #name, MERGE_ATTR(name) erase(); attron(A_BOLD); MvAddStr(0, 20, "Display of the Wide-ACS Character Set"); attroff(A_BOLD); refresh(); n = show_1_wacs(0, repeat, BOTH2(WACS_D_ULCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_D_URCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_D_LLCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_D_LRCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_D_LTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_D_RTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_D_TTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_D_BTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_D_HLINE)); n = show_1_wacs(n, repeat, BOTH2(WACS_D_VLINE)); n = show_1_wacs(n, repeat, BOTH2(WACS_LARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_RARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_UARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_DARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_BLOCK)); n = show_1_wacs(n, repeat, BOTH2(WACS_BOARD)); n = show_1_wacs(n, repeat, BOTH2(WACS_LANTERN)); n = show_1_wacs(n, repeat, BOTH2(WACS_BULLET)); n = show_1_wacs(n, repeat, BOTH2(WACS_CKBOARD)); n = show_1_wacs(n, repeat, BOTH2(WACS_DEGREE)); n = show_1_wacs(n, repeat, BOTH2(WACS_DIAMOND)); n = show_1_wacs(n, repeat, BOTH2(WACS_PLMINUS)); n = show_1_wacs(n, repeat, BOTH2(WACS_D_PLUS)); #ifdef CURSES_WACS_ARRAY n = show_1_wacs(n, repeat, BOTH2(WACS_GEQUAL)); n = show_1_wacs(n, repeat, BOTH2(WACS_NEQUAL)); n = show_1_wacs(n, repeat, BOTH2(WACS_LEQUAL)); n = show_1_wacs(n, repeat, BOTH2(WACS_STERLING)); n = show_1_wacs(n, repeat, BOTH2(WACS_PI)); n = show_1_wacs(n, repeat, BOTH2(WACS_S1)); n = show_1_wacs(n, repeat, BOTH2(WACS_S3)); n = show_1_wacs(n, repeat, BOTH2(WACS_S7)); (void) show_1_wacs(n, repeat, BOTH2(WACS_S9)); #endif } #endif #ifdef WACS_T_PLUS static void show_wacs_chars_thick(int repeat, attr_t attr, NCURSES_PAIRS_T pair) /* display the wide-ACS character set */ { cchar_t temp; int n; /*#define BOTH2(name) #name, &(name) */ #define BOTH2(name) #name, MERGE_ATTR(name) erase(); attron(A_BOLD); MvAddStr(0, 20, "Display of the Wide-ACS Character Set"); attroff(A_BOLD); refresh(); n = show_1_wacs(0, repeat, BOTH2(WACS_T_ULCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_T_URCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_T_LLCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_T_LRCORNER)); n = show_1_wacs(n, repeat, BOTH2(WACS_T_LTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_T_RTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_T_TTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_T_BTEE)); n = show_1_wacs(n, repeat, BOTH2(WACS_T_HLINE)); n = show_1_wacs(n, repeat, BOTH2(WACS_T_VLINE)); n = show_1_wacs(n, repeat, BOTH2(WACS_LARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_RARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_UARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_DARROW)); n = show_1_wacs(n, repeat, BOTH2(WACS_BLOCK)); n = show_1_wacs(n, repeat, BOTH2(WACS_BOARD)); n = show_1_wacs(n, repeat, BOTH2(WACS_LANTERN)); n = show_1_wacs(n, repeat, BOTH2(WACS_BULLET)); n = show_1_wacs(n, repeat, BOTH2(WACS_CKBOARD)); n = show_1_wacs(n, repeat, BOTH2(WACS_DEGREE)); n = show_1_wacs(n, repeat, BOTH2(WACS_DIAMOND)); n = show_1_wacs(n, repeat, BOTH2(WACS_PLMINUS)); n = show_1_wacs(n, repeat, BOTH2(WACS_T_PLUS)); #ifdef CURSES_WACS_ARRAY n = show_1_wacs(n, repeat, BOTH2(WACS_GEQUAL)); n = show_1_wacs(n, repeat, BOTH2(WACS_NEQUAL)); n = show_1_wacs(n, repeat, BOTH2(WACS_LEQUAL)); n = show_1_wacs(n, repeat, BOTH2(WACS_STERLING)); n = show_1_wacs(n, repeat, BOTH2(WACS_PI)); n = show_1_wacs(n, repeat, BOTH2(WACS_S1)); n = show_1_wacs(n, repeat, BOTH2(WACS_S3)); n = show_1_wacs(n, repeat, BOTH2(WACS_S7)); (void) show_1_wacs(n, repeat, BOTH2(WACS_S9)); #endif } #endif #undef MERGE_ATTR #define MERGE_ATTR(n,wch) merge_wide_attr(&temp[n], wch, attr, pair) static void show_wbox_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair) { cchar_t temp[8]; (void) repeat; erase(); attron(A_BOLD); MvAddStr(0, 20, "Display of the Wide-ACS Line-Drawing Set"); attroff(A_BOLD); refresh(); wborder_set(stdscr, MERGE_ATTR(0, WACS_VLINE), MERGE_ATTR(1, WACS_VLINE), MERGE_ATTR(2, WACS_HLINE), MERGE_ATTR(3, WACS_HLINE), MERGE_ATTR(4, WACS_ULCORNER), MERGE_ATTR(5, WACS_URCORNER), MERGE_ATTR(6, WACS_LLCORNER), MERGE_ATTR(7, WACS_LRCORNER)); /* *INDENT-OFF* */ (void) mvhline_set(LINES / 2, 0, MERGE_ATTR(0, WACS_HLINE), COLS); (void) mvvline_set(0, COLS / 2, MERGE_ATTR(0, WACS_VLINE), LINES); (void) mvadd_wch(0, COLS / 2, MERGE_ATTR(0, WACS_TTEE)); (void) mvadd_wch(LINES / 2, COLS / 2, MERGE_ATTR(0, WACS_PLUS)); (void) mvadd_wch(LINES - 1, COLS / 2, MERGE_ATTR(0, WACS_BTEE)); (void) mvadd_wch(LINES / 2, 0, MERGE_ATTR(0, WACS_LTEE)); (void) mvadd_wch(LINES / 2, COLS - 1, MERGE_ATTR(0, WACS_RTEE)); /* *INDENT-ON* */ } #undef MERGE_ATTR static int show_2_wacs(int n, const char *name, const char *code, attr_t attr, NCURSES_PAIRS_T pair) { const int height = 16; int row = 2 + (n % height); int col = (n / height) * COLS / 2; char temp[80]; MvPrintw(row, col, "%*s : ", COLS / 4, name); (void) attr_set(attr, pair, 0); _nc_STRNCPY(temp, code, 20); addstr(temp); (void) attr_set(A_NORMAL, 0, 0); return n + 1; } #define SHOW_UTF8(n, name, code) show_2_wacs(n, name, code, attr, pair) static void show_utf8_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair) { int n; (void) repeat; erase(); attron(A_BOLD); MvAddStr(0, 20, "Display of the Wide-ACS Character Set"); attroff(A_BOLD); refresh(); /* *INDENT-OFF* */ n = SHOW_UTF8(0, "WACS_ULCORNER", "\342\224\214"); n = SHOW_UTF8(n, "WACS_URCORNER", "\342\224\220"); n = SHOW_UTF8(n, "WACS_LLCORNER", "\342\224\224"); n = SHOW_UTF8(n, "WACS_LRCORNER", "\342\224\230"); n = SHOW_UTF8(n, "WACS_LTEE", "\342\224\234"); n = SHOW_UTF8(n, "WACS_RTEE", "\342\224\244"); n = SHOW_UTF8(n, "WACS_TTEE", "\342\224\254"); n = SHOW_UTF8(n, "WACS_BTEE", "\342\224\264"); n = SHOW_UTF8(n, "WACS_HLINE", "\342\224\200"); n = SHOW_UTF8(n, "WACS_VLINE", "\342\224\202"); n = SHOW_UTF8(n, "WACS_LARROW", "\342\206\220"); n = SHOW_UTF8(n, "WACS_RARROW", "\342\206\222"); n = SHOW_UTF8(n, "WACS_UARROW", "\342\206\221"); n = SHOW_UTF8(n, "WACS_DARROW", "\342\206\223"); n = SHOW_UTF8(n, "WACS_BLOCK", "\342\226\256"); n = SHOW_UTF8(n, "WACS_BOARD", "\342\226\222"); n = SHOW_UTF8(n, "WACS_LANTERN", "\342\230\203"); n = SHOW_UTF8(n, "WACS_BULLET", "\302\267"); n = SHOW_UTF8(n, "WACS_CKBOARD", "\342\226\222"); n = SHOW_UTF8(n, "WACS_DEGREE", "\302\260"); n = SHOW_UTF8(n, "WACS_DIAMOND", "\342\227\206"); n = SHOW_UTF8(n, "WACS_PLMINUS", "\302\261"); n = SHOW_UTF8(n, "WACS_PLUS", "\342\224\274"); n = SHOW_UTF8(n, "WACS_GEQUAL", "\342\211\245"); n = SHOW_UTF8(n, "WACS_NEQUAL", "\342\211\240"); n = SHOW_UTF8(n, "WACS_LEQUAL", "\342\211\244"); n = SHOW_UTF8(n, "WACS_STERLING", "\302\243"); n = SHOW_UTF8(n, "WACS_PI", "\317\200"); n = SHOW_UTF8(n, "WACS_S1", "\342\216\272"); n = SHOW_UTF8(n, "WACS_S3", "\342\216\273"); n = SHOW_UTF8(n, "WACS_S7", "\342\216\274"); (void) SHOW_UTF8(n, "WACS_S9", "\342\216\275"); /* *INDENT-ON* */ } /* display the wide-ACS character set */ static int x_acs_test(bool recur GCC_UNUSED) { int c = 'a'; unsigned digit = 0; int repeat = 1; int space = ' '; unsigned pagesize = 32; attr_t attr = WA_NORMAL; int fg = COLOR_BLACK; int bg = COLOR_BLACK; unsigned at_code = 0; NCURSES_PAIRS_T pair = 0; void (*last_show_wacs) (int, attr_t, NCURSES_PAIRS_T) = 0; W_ATTR_TBL my_list[SIZEOF(w_attrs_to_test)]; unsigned my_size = init_w_attr_list(my_list, term_attrs()); char at_page[20]; bool pending_code = FALSE; at_page[0] = '\0'; do { switch (c) { case CTRL('L'): Repaint(); break; case 'a': ToggleAcs(last_show_wacs, show_wacs_chars); break; #ifdef WACS_D_PLUS case 'd': ToggleAcs(last_show_wacs, show_wacs_chars_double); break; #endif #ifdef WACS_T_PLUS case 't': ToggleAcs(last_show_wacs, show_wacs_chars_thick); break; #endif case 'w': if (pagesize == 32) { pagesize = 256; } else { pagesize = 32; } break; case 'x': ToggleAcs(last_show_wacs, show_wbox_chars); break; case 'u': ToggleAcs(last_show_wacs, show_utf8_chars); break; case '@': pending_code = !pending_code; if (pending_code) { _nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x", digit); } else if (at_page[0] != '\0') { sscanf(at_page, "%x", &digit); } break; default: if (pending_code && isxdigit(c)) { size_t len = strlen(at_page); if (len && at_page[0] == '0') { memmove(at_page, at_page + 1, len--); } if (len < sizeof(at_page) - 1) { at_page[len++] = (char) c; at_page[len] = '\0'; } } else if (pending_code && (c == '\b' || c == KEY_BACKSPACE || c == KEY_DC)) { size_t len = strlen(at_page); if (len) at_page[--len] = '\0'; } else if (c < 256 && isdigit(c)) { digit = (unsigned) (c - '0'); last_show_wacs = 0; } else if (c == '+') { ++digit; _nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x", digit); last_show_wacs = 0; } else if (c == '-' && digit > 0) { --digit; _nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x", UChar(digit)); last_show_wacs = 0; } else if (c == '>' && repeat < (COLS / 4)) { ++repeat; } else if (c == '<' && repeat > 1) { --repeat; } else if (c == '_') { space = (space == ' ') ? '_' : ' '; last_show_wacs = 0; } else if (cycle_w_attr(c, &at_code, &attr, my_list, my_size) || cycle_colors(c, &fg, &bg, &pair)) { if (last_show_wacs != 0) break; } else { beep(); break; } break; } if (pagesize != 32) { show_paged_widechars(digit, pagesize, repeat, space, attr, pair); } else if (last_show_wacs != 0) { last_show_wacs(repeat, attr, pair); } else { show_upper_widechars(digit * 32 + 128, repeat, space, attr, pair); } MvPrintw(LINES - 4, 0, "Select: a/d/t WACS, w=%d/page, @", pagesize); printw("%s", pending_code ? at_page : "page"); addstr(", x=box, u UTF-8, ^L repaint"); MvPrintw(LINES - 3, 2, "0-9,+/- non-ASCII, repeat, _ space, ESC=quit"); if (UseColors) { MvPrintw(LINES - 2, 2, "v/V, f/F, b/B cycle through video attributes (%s) and color %d/%d.", my_list[at_code].name, fg, bg); } else { MvPrintw(LINES - 2, 2, "v/V cycles through video attributes (%s).", my_list[at_code].name); } refresh(); } while (!isQuit(c = Getchar(), TRUE)); Pause(); erase(); endwin(); return OK; } #endif /* * Graphic-rendition test (adapted from vttest) */ static int sgr_attr_test(bool recur GCC_UNUSED) { int pass; for (pass = 0; pass < 2; pass++) { chtype normal = ((pass == 0 ? A_NORMAL : A_REVERSE)) | BLANK; /* Use non-default colors if possible to exercise bce a little */ if (UseColors) { init_pair(1, COLOR_WHITE, COLOR_BLUE); normal |= (chtype) COLOR_PAIR(1); } bkgdset(normal); erase(); MvPrintw(1, 20, "Graphic rendition test pattern:"); MvPrintw(4, 1, "vanilla"); #define set_sgr(mask) bkgdset((normal^(mask))); set_sgr(A_BOLD); MvPrintw(4, 40, "bold"); set_sgr(A_UNDERLINE); MvPrintw(6, 6, "underline"); set_sgr(A_BOLD | A_UNDERLINE); MvPrintw(6, 45, "bold underline"); set_sgr(A_BLINK); MvPrintw(8, 1, "blink"); set_sgr(A_BLINK | A_BOLD); MvPrintw(8, 40, "bold blink"); set_sgr(A_UNDERLINE | A_BLINK); MvPrintw(10, 6, "underline blink"); set_sgr(A_BOLD | A_UNDERLINE | A_BLINK); MvPrintw(10, 45, "bold underline blink"); set_sgr(A_REVERSE); MvPrintw(12, 1, "negative"); set_sgr(A_BOLD | A_REVERSE); MvPrintw(12, 40, "bold negative"); set_sgr(A_UNDERLINE | A_REVERSE); MvPrintw(14, 6, "underline negative"); set_sgr(A_BOLD | A_UNDERLINE | A_REVERSE); MvPrintw(14, 45, "bold underline negative"); set_sgr(A_BLINK | A_REVERSE); MvPrintw(16, 1, "blink negative"); set_sgr(A_BOLD | A_BLINK | A_REVERSE); MvPrintw(16, 40, "bold blink negative"); set_sgr(A_UNDERLINE | A_BLINK | A_REVERSE); MvPrintw(18, 6, "underline blink negative"); set_sgr(A_BOLD | A_UNDERLINE | A_BLINK | A_REVERSE); MvPrintw(18, 45, "bold underline blink negative"); bkgdset(normal); MvPrintw(LINES - 2, 1, "%s background. ", pass == 0 ? "Dark" : "Light"); clrtoeol(); Pause(); } bkgdset(A_NORMAL | BLANK); erase(); endwin(); return OK; } /**************************************************************************** * * Windows and scrolling tester. * ****************************************************************************/ #define BOTLINES 4 /* number of line stolen from screen bottom */ typedef struct { int y, x; } pair; #define FRAME struct frame FRAME { FRAME *next, *last; bool do_scroll; bool do_keypad; WINDOW *wind; }; #if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS #if (NCURSES_VERSION_PATCH < 20070331) #define is_keypad(win) (win)->_use_keypad #define is_scrollok(win) (win)->_scroll #endif #else #define is_keypad(win) FALSE #define is_scrollok(win) FALSE #endif static WINDOW * frame_win(FRAME * curp) { return (curp != 0) ? curp->wind : stdscr; } /* We need to know if these flags are actually set, so don't look in FRAME. * These names are known to work with SVr4 curses as well as ncurses. The * _use_keypad name does not work with Solaris 8. */ static bool HaveKeypad(FRAME * curp) { WINDOW *win = frame_win(curp); (void) win; return is_keypad(win); } static bool HaveScroll(FRAME * curp) { WINDOW *win = frame_win(curp); (void) win; return is_scrollok(win); } static void newwin_legend(FRAME * curp) { #define DATA(num, name) { name, num } static const struct { const char *msg; int code; } legend[] = { DATA(0, "^C = create window"), DATA(0, "^N = next window"), DATA(0, "^P = previous window"), DATA(0, "^F = scroll forward"), DATA(0, "^B = scroll backward"), DATA(1, "^K = keypad(%s)"), DATA(2, "^S = scrollok(%s)"), DATA(0, "^W = save window"), DATA(0, "^R = restore window"), #if HAVE_WRESIZE DATA(0, "^X = resize"), #endif DATA(3, "^Q%s = exit") }; #undef DATA size_t n; bool do_keypad = HaveKeypad(curp); bool do_scroll = HaveScroll(curp); char buf[BUFSIZ]; move(LINES - 4, 0); for (n = 0; n < SIZEOF(legend); n++) { int x; switch (legend[n].code) { default: _nc_STRCPY(buf, legend[n].msg, sizeof(buf)); break; case 1: _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) legend[n].msg, do_keypad ? "yes" : "no"); break; case 2: _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) legend[n].msg, do_scroll ? "yes" : "no"); break; case 3: _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) legend[n].msg, do_keypad ? "/ESC" : ""); break; } x = getcurx(stdscr); addstr((COLS < (x + 3 + (int) strlen(buf))) ? "\n" : (n ? ", " : "")); addstr(buf); } clrtoeol(); } static void transient(FRAME * curp, NCURSES_CONST char *msg) { newwin_legend(curp); if (msg) { MvAddStr(LINES - 1, 0, msg); refresh(); napms(1000); } move(LINES - 1, 0); printw("%s characters are echoed, window should %sscroll.", HaveKeypad(curp) ? "Non-arrow" : "All other", HaveScroll(curp) ? "" : "not "); clrtoeol(); } static void newwin_report(FRAME * curp) /* report on the cursor's current position, then restore it */ { WINDOW *win = frame_win(curp); int y, x; if (win != stdscr) transient(curp, (char *) 0); getyx(win, y, x); move(LINES - 1, COLS - 17); printw("Y = %2d X = %2d", y, x); if (win != stdscr) refresh(); else wmove(win, y, x); } static pair * selectcell(int uli, int ulj, int lri, int lrj) /* arrows keys move cursor, return location at current on non-arrow key */ { static pair res; /* result cell */ int si = lri - uli + 1; /* depth of the select area */ int sj = lrj - ulj + 1; /* width of the select area */ int i = 0, j = 0; /* offsets into the select area */ res.y = uli; res.x = ulj; for (;;) { move(uli + i, ulj + j); newwin_report((FRAME *) 0); switch (Getchar()) { case KEY_UP: i += si - 1; break; case KEY_DOWN: i++; break; case KEY_LEFT: j += sj - 1; break; case KEY_RIGHT: j++; break; case case_QUIT: return ((pair *) 0); #ifdef NCURSES_MOUSE_VERSION case KEY_MOUSE: { MEVENT event; getmouse(&event); if (event.y > uli && event.x > ulj) { i = event.y - uli; j = event.x - ulj; } else { beep(); break; } } #endif /* FALLTHRU */ default: res.y = uli + i; res.x = ulj + j; return (&res); } i %= si; j %= sj; } } static void outerbox(pair ul, pair lr, bool onoff) /* draw or erase a box *outside* the given pair of corners */ { MvAddCh(ul.y - 1, lr.x - 1, onoff ? ACS_ULCORNER : ' '); MvAddCh(ul.y - 1, lr.x + 1, onoff ? ACS_URCORNER : ' '); MvAddCh(lr.y + 1, lr.x + 1, onoff ? ACS_LRCORNER : ' '); MvAddCh(lr.y + 1, ul.x - 1, onoff ? ACS_LLCORNER : ' '); move(ul.y - 1, ul.x); hline(onoff ? ACS_HLINE : ' ', lr.x - ul.x + 1); move(ul.y, ul.x - 1); vline(onoff ? ACS_VLINE : ' ', lr.y - ul.y + 1); move(lr.y + 1, ul.x); hline(onoff ? ACS_HLINE : ' ', lr.x - ul.x + 1); move(ul.y, lr.x + 1); vline(onoff ? ACS_VLINE : ' ', lr.y - ul.y + 1); } static WINDOW * getwindow(void) /* Ask user for a window definition */ { WINDOW *rwindow; pair ul, lr, *tmp; move(0, 0); clrtoeol(); addstr("Use arrows to move cursor, anything else to mark corner 1"); refresh(); if ((tmp = selectcell(2, 1, LINES - BOTLINES - 2, COLS - 2)) == (pair *) 0) return ((WINDOW *) 0); memcpy(&ul, tmp, sizeof(pair)); MvAddCh(ul.y - 1, ul.x - 1, ACS_ULCORNER); move(0, 0); clrtoeol(); addstr("Use arrows to move cursor, anything else to mark corner 2"); refresh(); if ((tmp = selectcell(ul.y, ul.x, LINES - BOTLINES - 2, COLS - 2)) == (pair *) 0) return ((WINDOW *) 0); memcpy(&lr, tmp, sizeof(pair)); rwindow = subwin(stdscr, lr.y - ul.y + 1, lr.x - ul.x + 1, ul.y, ul.x); outerbox(ul, lr, TRUE); refresh(); if (rwindow != 0) wrefresh(rwindow); move(0, 0); clrtoeol(); return (rwindow); } static void newwin_move(FRAME * curp, int dy, int dx) { WINDOW *win = frame_win(curp); int cur_y, cur_x; int max_y, max_x; getyx(win, cur_y, cur_x); getmaxyx(win, max_y, max_x); if ((cur_x += dx) < 0) cur_x = 0; else if (cur_x >= max_x) cur_x = max_x - 1; if ((cur_y += dy) < 0) cur_y = 0; else if (cur_y >= max_y) cur_y = max_y - 1; wmove(win, cur_y, cur_x); } static FRAME * delete_framed(FRAME * fp, bool showit) { FRAME *np = 0; if (fp != 0) { fp->last->next = fp->next; fp->next->last = fp->last; if (showit) { werase(fp->wind); wrefresh(fp->wind); } delwin(fp->wind); np = (fp == fp->next) ? NULL : fp->next; free(fp); } return np; } static int scroll_test(bool recur GCC_UNUSED) /* Demonstrate windows */ { int c; FRAME *current = (FRAME *) 0, *neww; WINDOW *usescr; #if HAVE_PUTWIN && HAVE_GETWIN FILE *fp; #endif #define DUMPFILE "screendump" #ifdef NCURSES_MOUSE_VERSION mousemask(BUTTON1_CLICKED, (mmask_t *) 0); #endif c = CTRL('C'); raw(); do { transient((FRAME *) 0, (char *) 0); switch (c) { case CTRL('C'): if ((neww = typeCalloc(FRAME, (size_t) 1)) == 0) { failed("scroll_test"); goto breakout; } if ((neww->wind = getwindow()) == (WINDOW *) 0) { failed("scroll_test"); free(neww); goto breakout; } if (current == 0) { /* First element, */ neww->next = neww; /* so point it at itself */ neww->last = neww; } else { neww->next = current->next; neww->last = current; neww->last->next = neww; neww->next->last = neww; } current = neww; /* SVr4 curses sets the keypad on all newly-created windows to * false. Someone reported that PDCurses makes new windows inherit * this flag. Remove the following 'keypad()' call to test this */ keypad(current->wind, TRUE); current->do_keypad = HaveKeypad(current); current->do_scroll = HaveScroll(current); break; case CTRL('N'): /* go to next window */ if (current) current = current->next; break; case CTRL('P'): /* go to previous window */ if (current) current = current->last; break; case CTRL('F'): /* scroll current window forward */ if (current) wscrl(frame_win(current), 1); break; case CTRL('B'): /* scroll current window backwards */ if (current) wscrl(frame_win(current), -1); break; case CTRL('K'): /* toggle keypad mode for current */ if (current) { current->do_keypad = !current->do_keypad; keypad(current->wind, current->do_keypad); } break; case CTRL('S'): if (current) { current->do_scroll = !current->do_scroll; scrollok(current->wind, current->do_scroll); } break; #if HAVE_PUTWIN && HAVE_GETWIN case CTRL('W'): /* save and delete window */ if ((current != 0) && (current == current->next)) { transient(current, "Will not save/delete ONLY window"); break; } else if ((fp = fopen(DUMPFILE, "w")) == (FILE *) 0) { transient(current, "Can't open screen dump file"); } else { int rc = putwin(frame_win(current), fp); (void) fclose(fp); if (rc == OK) { current = delete_framed(current, TRUE); } else { transient(current, "Can't write screen dump file"); } } break; case CTRL('R'): /* restore window */ if ((fp = fopen(DUMPFILE, "r")) == (FILE *) 0) { transient(current, "Can't open screen dump file"); } else { if ((neww = typeCalloc(FRAME, (size_t) 1)) != 0) { neww->next = current ? current->next : 0; neww->last = current; if (neww->last != 0) neww->last->next = neww; if (neww->next != 0) neww->next->last = neww; neww->wind = getwin(fp); wrefresh(neww->wind); } else { failed("scroll_test"); } (void) fclose(fp); } break; #endif #if HAVE_WRESIZE case CTRL('X'): /* resize window */ if (current) { pair *tmp, ul, lr; int mx, my; move(0, 0); clrtoeol(); addstr("Use arrows to move cursor, anything else to mark new corner"); refresh(); getbegyx(current->wind, ul.y, ul.x); tmp = selectcell(ul.y, ul.x, LINES - BOTLINES - 2, COLS - 2); if (tmp == (pair *) 0) { beep(); break; } getmaxyx(current->wind, lr.y, lr.x); lr.y += (ul.y - 1); lr.x += (ul.x - 1); outerbox(ul, lr, FALSE); wnoutrefresh(stdscr); /* strictly cosmetic hack for the test */ getmaxyx(current->wind, my, mx); if (my > tmp->y - ul.y) { getyx(current->wind, lr.y, lr.x); wmove(current->wind, tmp->y - ul.y + 1, 0); wclrtobot(current->wind); wmove(current->wind, lr.y, lr.x); } if (mx > tmp->x - ul.x) { int i; for (i = 0; i < my; i++) { wmove(current->wind, i, tmp->x - ul.x + 1); wclrtoeol(current->wind); } } wnoutrefresh(current->wind); memcpy(&lr, tmp, sizeof(pair)); (void) wresize(current->wind, lr.y - ul.y + 0, lr.x - ul.x + 0); getbegyx(current->wind, ul.y, ul.x); getmaxyx(current->wind, lr.y, lr.x); lr.y += (ul.y - 1); lr.x += (ul.x - 1); outerbox(ul, lr, TRUE); wnoutrefresh(stdscr); wnoutrefresh(current->wind); move(0, 0); clrtoeol(); doupdate(); } break; #endif /* HAVE_WRESIZE */ case KEY_UP: newwin_move(current, -1, 0); break; case KEY_DOWN: newwin_move(current, 1, 0); break; case KEY_LEFT: newwin_move(current, 0, -1); break; case KEY_RIGHT: newwin_move(current, 0, 1); break; case KEY_BACKSPACE: /* FALLTHROUGH */ case KEY_DC: { int y, x; getyx(frame_win(current), y, x); if (--x < 0) { if (--y < 0) break; x = getmaxx(frame_win(current)) - 1; } (void) mvwdelch(frame_win(current), y, x); } break; case '\r': c = '\n'; /* FALLTHROUGH */ default: if (current) waddch(current->wind, (chtype) c); else beep(); break; } newwin_report(current); usescr = frame_win(current); wrefresh(usescr); } while (!isQuit(c = wGetchar(usescr), TRUE) && (c != ERR)); breakout: while (current != 0) current = delete_framed(current, FALSE); scrollok(stdscr, TRUE); /* reset to driver's default */ #ifdef NCURSES_MOUSE_VERSION mousemask(0, (mmask_t *) 0); #endif noraw(); erase(); endwin(); return OK; } /**************************************************************************** * * Panels tester * ****************************************************************************/ #if USE_LIBPANEL static int nap_msec = 1; static NCURSES_CONST char *mod[] = { "test ", "TEST ", "(**) ", "*()* ", "<--> ", "LAST " }; /*+------------------------------------------------------------------------- wait_a_while(msec) --------------------------------------------------------------------------*/ static void wait_a_while(int msec GCC_UNUSED) { #if HAVE_NAPMS if (nap_msec == 1) wGetchar(stdscr); else napms(nap_msec); #else if (nap_msec == 1) wGetchar(stdscr); else if (msec > 1000) sleep((unsigned) msec / 1000); else sleep(1); #endif } /* end of wait_a_while */ /*+------------------------------------------------------------------------- saywhat(text) --------------------------------------------------------------------------*/ static void saywhat(NCURSES_CONST char *text) { wmove(stdscr, LINES - 1, 0); wclrtoeol(stdscr); if (text != 0 && *text != '\0') { waddstr(stdscr, text); waddstr(stdscr, "; "); } waddstr(stdscr, "press any key to continue"); } /* end of saywhat */ /*+------------------------------------------------------------------------- mkpanel(rows,cols,tly,tlx) - alloc a win and panel and associate them --------------------------------------------------------------------------*/ static PANEL * mkpanel(NCURSES_COLOR_T color, int rows, int cols, int tly, int tlx) { WINDOW *win; PANEL *pan = 0; if ((win = newwin(rows, cols, tly, tlx)) != 0) { if ((pan = new_panel(win)) == 0) { delwin(win); } else if (UseColors) { NCURSES_COLOR_T fg = (NCURSES_COLOR_T) ((color == COLOR_BLUE) ? COLOR_WHITE : COLOR_BLACK); NCURSES_COLOR_T bg = color; init_pair(color, fg, bg); wbkgdset(win, (attr_t) (COLOR_PAIR(color) | ' ')); } else { wbkgdset(win, A_BOLD | ' '); } } return pan; } /* end of mkpanel */ /*+------------------------------------------------------------------------- rmpanel(pan) --------------------------------------------------------------------------*/ static void rmpanel(PANEL *pan) { WINDOW *win = panel_window(pan); del_panel(pan); delwin(win); } /* end of rmpanel */ /*+------------------------------------------------------------------------- pflush() --------------------------------------------------------------------------*/ static void pflush(void) { update_panels(); doupdate(); } /* end of pflush */ /*+------------------------------------------------------------------------- fill_panel(win) --------------------------------------------------------------------------*/ static void init_panel(WINDOW *win) { register int y, x; for (y = 0; y < LINES - 1; y++) { for (x = 0; x < COLS; x++) wprintw(win, "%d", (y + x) % 10); } } static void fill_panel(PANEL *pan) { WINDOW *win = panel_window(pan); const char *userptr = (const char *) panel_userptr(pan); int num = (userptr && *userptr) ? userptr[1] : '?'; int y, x; wmove(win, 1, 1); wprintw(win, "-pan%c-", num); wclrtoeol(win); box(win, 0, 0); for (y = 2; y < getmaxy(win) - 1; y++) { for (x = 1; x < getmaxx(win) - 1; x++) { wmove(win, y, x); waddch(win, UChar(num)); } } } #if USE_WIDEC_SUPPORT static void init_wide_panel(WINDOW *win) { int digit; cchar_t temp[10]; for (digit = 0; digit < 10; ++digit) make_fullwidth_digit(&temp[digit], digit); do { int y, x; getyx(stdscr, y, x); digit = (y + x / 2) % 10; } while (wadd_wch(win, &temp[digit]) != ERR); } static void fill_wide_panel(PANEL *pan) { WINDOW *win = panel_window(pan); const char *userptr = (const char *) panel_userptr(pan); int num = (userptr && *userptr) ? userptr[1] : '?'; int y, x; wmove(win, 1, 1); wprintw(win, "-pan%c-", num); wclrtoeol(win); box(win, 0, 0); for (y = 2; y < getmaxy(win) - 1; y++) { for (x = 1; x < getmaxx(win) - 1; x++) { wmove(win, y, x); waddch(win, UChar(num)); } } } #endif #define MAX_PANELS 5 static void canned_panel(PANEL *px[MAX_PANELS + 1], NCURSES_CONST char *cmd) { int which = cmd[1] - '0'; saywhat(cmd); switch (*cmd) { case 'h': hide_panel(px[which]); break; case 's': show_panel(px[which]); break; case 't': top_panel(px[which]); break; case 'b': bottom_panel(px[which]); break; case 'd': rmpanel(px[which]); break; } pflush(); wait_a_while(nap_msec); } static int demo_panels(void (*InitPanel) (WINDOW *), void (*FillPanel) (PANEL *)) { int count; int itmp; PANEL *px[MAX_PANELS + 1]; scrollok(stdscr, FALSE); /* we don't want stdscr to scroll! */ refresh(); InitPanel(stdscr); for (count = 0; count < 5; count++) { px[1] = mkpanel(COLOR_RED, LINES / 2 - 2, COLS / 8 + 1, 0, 0); set_panel_userptr(px[1], (NCURSES_CONST void *) "p1"); px[2] = mkpanel(COLOR_GREEN, LINES / 2 + 1, COLS / 7, LINES / 4, COLS / 10); set_panel_userptr(px[2], (NCURSES_CONST void *) "p2"); px[3] = mkpanel(COLOR_YELLOW, LINES / 4, COLS / 10, LINES / 2, COLS / 9); set_panel_userptr(px[3], (NCURSES_CONST void *) "p3"); px[4] = mkpanel(COLOR_BLUE, LINES / 2 - 2, COLS / 8, LINES / 2 - 2, COLS / 3); set_panel_userptr(px[4], (NCURSES_CONST void *) "p4"); px[5] = mkpanel(COLOR_MAGENTA, LINES / 2 - 2, COLS / 8, LINES / 2, COLS / 2 - 2); set_panel_userptr(px[5], (NCURSES_CONST void *) "p5"); FillPanel(px[1]); FillPanel(px[2]); FillPanel(px[3]); FillPanel(px[4]); FillPanel(px[5]); hide_panel(px[4]); hide_panel(px[5]); pflush(); saywhat(""); wait_a_while(nap_msec); saywhat("h3 s1 s2 s4 s5"); move_panel(px[1], 0, 0); hide_panel(px[3]); show_panel(px[1]); show_panel(px[2]); show_panel(px[4]); show_panel(px[5]); pflush(); wait_a_while(nap_msec); canned_panel(px, "s1"); canned_panel(px, "s2"); saywhat("m2"); move_panel(px[2], LINES / 3 + 1, COLS / 8); pflush(); wait_a_while(nap_msec); canned_panel(px, "s3"); saywhat("m3"); move_panel(px[3], LINES / 4 + 1, COLS / 15); pflush(); wait_a_while(nap_msec); canned_panel(px, "b3"); canned_panel(px, "s4"); canned_panel(px, "s5"); canned_panel(px, "t3"); canned_panel(px, "t1"); canned_panel(px, "t2"); canned_panel(px, "t3"); canned_panel(px, "t4"); for (itmp = 0; itmp < 6; itmp++) { WINDOW *w4 = panel_window(px[4]); WINDOW *w5 = panel_window(px[5]); saywhat("m4"); wmove(w4, LINES / 8, 1); waddstr(w4, mod[itmp]); move_panel(px[4], LINES / 6, itmp * (COLS / 8)); wmove(w5, LINES / 6, 1); waddstr(w5, mod[itmp]); pflush(); wait_a_while(nap_msec); saywhat("m5"); wmove(w4, LINES / 6, 1); waddstr(w4, mod[itmp]); move_panel(px[5], LINES / 3 - 1, (itmp * 10) + 6); wmove(w5, LINES / 8, 1); waddstr(w5, mod[itmp]); pflush(); wait_a_while(nap_msec); } saywhat("m4"); move_panel(px[4], LINES / 6, itmp * (COLS / 8)); pflush(); wait_a_while(nap_msec); canned_panel(px, "t5"); canned_panel(px, "t2"); canned_panel(px, "t1"); canned_panel(px, "d2"); canned_panel(px, "h3"); canned_panel(px, "d1"); canned_panel(px, "d4"); canned_panel(px, "d5"); canned_panel(px, "d3"); wait_a_while(nap_msec); if (nap_msec == 1) break; nap_msec = 100L; } erase(); endwin(); return OK; } #if USE_LIBPANEL static int panel_test(bool recur GCC_UNUSED) { return demo_panels(init_panel, fill_panel); } #endif #if USE_WIDEC_SUPPORT && USE_LIBPANEL static int x_panel_test(bool recur GCC_UNUSED) { return demo_panels(init_wide_panel, fill_wide_panel); } #endif #endif /* USE_LIBPANEL */ /**************************************************************************** * * Pad tester * ****************************************************************************/ #if HAVE_NEWPAD /* The behavior of mvhline, mvvline for negative/zero length is unspecified, * though we can rely on negative x/y values to stop the macro. */ static void do_h_line(int y, int x, chtype c, int to) { if ((to) > (x)) MvHLine(y, x, c, (to) - (x)); } static void do_v_line(int y, int x, chtype c, int to) { if ((to) > (y)) MvVLine(y, x, c, (to) - (y)); } #define GRIDSIZE 3 static bool pending_pan = FALSE; static bool show_panner_legend = TRUE; static int panner_legend(int line) { static const char *const legend[] = { "Use arrow keys (or U,D,L,R) to pan, ESC to quit, ! to shell-out.", "Use +,- (or j,k) to grow/shrink the panner vertically.", "Use <,> (or h,l) to grow/shrink the panner horizontally.", "Number repeats. Toggle legend:? filler:a timer:t scrollmark:s." }; int n = ((int) SIZEOF(legend) - (LINES - line)); if (n >= 0 && n < (int) SIZEOF(legend)) { if (move(line, 0) != ERR) { if (show_panner_legend) printw("%s", legend[n]); clrtoeol(); return show_panner_legend; } } return FALSE; } static void panner_h_cleanup(int from_y, int from_x, int to_x) { if (!panner_legend(from_y)) do_h_line(from_y, from_x, ' ', to_x); } static void panner_v_cleanup(int from_y, int from_x, int to_y) { if (!panner_legend(from_y)) do_v_line(from_y, from_x, ' ', to_y); } static void fill_pad(WINDOW *panpad, bool pan_lines, bool colored) { int y, x; unsigned gridcount = 0; chtype fill = 0; #ifdef A_COLOR if (colored) fill = (chtype) COLOR_PAIR(1); #endif wmove(panpad, 0, 0); for (y = 0; y < getmaxy(panpad); y++) { for (x = 0; x < getmaxx(panpad); x++) { if (y % GRIDSIZE == 0 && x % GRIDSIZE == 0) { if (y == 0 && x == 0) waddch(panpad, pan_lines ? ACS_ULCORNER : '+'); else if (y == 0) waddch(panpad, pan_lines ? ACS_TTEE : '+'); else if (y == 0 || x == 0) waddch(panpad, pan_lines ? ACS_LTEE : '+'); else waddch(panpad, (chtype) ((pan_lines ? 'a' : 'A') + (int) (gridcount++ % 26)) | fill); } else if (y % GRIDSIZE == 0) waddch(panpad, pan_lines ? ACS_HLINE : '-'); else if (x % GRIDSIZE == 0) waddch(panpad, pan_lines ? ACS_VLINE : '|'); else waddch(panpad, ' '); } } } static void panner(WINDOW *pad, int top_x, int top_y, int porty, int portx, int (*pgetc) (WINDOW *), bool colored) { 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; ITEM *i, **p; for (;;) { bool changed = FALSE; switch (menu_driver(m, menu_virtualize(wGetchar(menu_win(m))))) { case E_UNKNOWN_COMMAND: return FALSE; default: items = menu_items(m); i = current_item(m); if (i == items[0]) { if (item_value(i)) { for (p = items + 1; *p != 0; p++) if (item_value(*p)) { set_item_value(*p, FALSE); changed = TRUE; } } } else { for (p = items + 1; *p != 0; p++) if (item_value(*p)) { set_item_value(items[0], FALSE); changed = TRUE; break; } } if (!changed) return TRUE; } } } static int trace_set(bool recur GCC_UNUSED) /* interactively set the trace level */ { MENU *m; ITEM *items[SIZEOF(t_tbl)]; ITEM **ip = items; int mrows, mcols; unsigned newtrace; int n; WINDOW *menuwin; MvAddStr(0, 0, "Interactively set trace level:"); MvAddStr(2, 0, " Press space bar to toggle a selection."); MvAddStr(3, 0, " Use up and down arrow to move the select bar."); MvAddStr(4, 0, " Press return to set the trace level."); MvPrintw(6, 0, "(Current trace level is %s)", tracetrace(_nc_tracing)); refresh(); for (n = 0; t_tbl[n].name != 0; n++) { if ((*ip = new_item(t_tbl[n].name, "")) != 0) { ++ip; } } *ip = (ITEM *) 0; m = new_menu(items); set_menu_format(m, 0, 2); scale_menu(m, &mrows, &mcols); menu_opts_off(m, O_ONEVALUE); menuwin = newwin(mrows + 2, mcols + 2, MENU_Y, MENU_X); set_menu_win(m, menuwin); keypad(menuwin, TRUE); box(menuwin, 0, 0); set_menu_sub(m, derwin(menuwin, mrows, mcols, 1, 1)); post_menu(m); for (ip = menu_items(m); *ip; ip++) { unsigned mask = t_tbl[item_index(*ip)].mask; if (mask == 0) set_item_value(*ip, _nc_tracing == 0); else if ((mask & _nc_tracing) == mask) set_item_value(*ip, TRUE); } while (run_trace_menu(m)) { /* 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) { char *source = field_buffer(me, 1); size_t have = (source ? strlen(source) : 0) + 1; size_t need = 80 + have; char *temp = malloc(need); if (temp != 0) { size_t len; _nc_STRNCPY(temp, source ? source : "", have + 1); len = (size_t) (char *) field_userptr(me); if (c <= KEY_MAX) { if (isgraph(c) && (len + 1) < sizeof(temp)) { temp[len++] = (char) c; temp[len] = 0; set_field_buffer(me, 1, temp); c = '*'; } else { c = 0; } } else { switch (c) { case REQ_BEG_FIELD: case REQ_CLR_EOF: case REQ_CLR_EOL: case REQ_DEL_LINE: case REQ_DEL_WORD: case REQ_DOWN_CHAR: case REQ_END_FIELD: case REQ_INS_CHAR: case REQ_INS_LINE: case REQ_LEFT_CHAR: case REQ_NEW_LINE: case REQ_NEXT_WORD: case REQ_PREV_WORD: case REQ_RIGHT_CHAR: case REQ_UP_CHAR: c = 0; /* we don't want to do inline editing */ break; case REQ_CLR_FIELD: if (len) { temp[0] = 0; set_field_buffer(me, 1, temp); } break; case REQ_DEL_CHAR: case REQ_DEL_PREV: if (len) { temp[--len] = 0; set_field_buffer(me, 1, temp); } break; } } set_field_userptr(me, (void *) len); free(temp); } } return c; } static int form_virtualize(FORM *f, WINDOW *w) { /* *INDENT-OFF* */ static const struct { int code; int result; } lookup[] = { { CTRL('A'), REQ_NEXT_CHOICE }, { CTRL('B'), REQ_PREV_WORD }, { CTRL('C'), REQ_CLR_EOL }, { CTRL('D'), REQ_DOWN_FIELD }, { CTRL('E'), REQ_END_FIELD }, { CTRL('F'), REQ_NEXT_PAGE }, { CTRL('G'), REQ_DEL_WORD }, { CTRL('H'), REQ_DEL_PREV }, { CTRL('I'), REQ_INS_CHAR }, { CTRL('K'), REQ_CLR_EOF }, { CTRL('L'), REQ_LEFT_FIELD }, { CTRL('M'), REQ_NEW_LINE }, { CTRL('N'), REQ_NEXT_FIELD }, { CTRL('O'), REQ_INS_LINE }, { CTRL('P'), REQ_PREV_FIELD }, { CTRL('R'), REQ_RIGHT_FIELD }, { CTRL('S'), REQ_BEG_FIELD }, { CTRL('U'), REQ_UP_FIELD }, { CTRL('V'), REQ_DEL_CHAR }, { CTRL('W'), REQ_NEXT_WORD }, { CTRL('X'), REQ_CLR_FIELD }, { CTRL('Y'), REQ_DEL_LINE }, { CTRL('Z'), REQ_PREV_CHOICE }, { ESCAPE, MAX_FORM_COMMAND + 1 }, { KEY_BACKSPACE, REQ_DEL_PREV }, { KEY_DOWN, REQ_DOWN_CHAR }, { KEY_END, REQ_LAST_FIELD }, { KEY_HOME, REQ_FIRST_FIELD }, { KEY_LEFT, REQ_LEFT_CHAR }, { KEY_LL, REQ_LAST_FIELD }, { KEY_NEXT, REQ_NEXT_FIELD }, { KEY_NPAGE, REQ_NEXT_PAGE }, { KEY_PPAGE, REQ_PREV_PAGE }, { KEY_PREVIOUS, REQ_PREV_FIELD }, { KEY_RIGHT, REQ_RIGHT_CHAR }, { KEY_UP, REQ_UP_CHAR }, { QUIT, MAX_FORM_COMMAND + 1 } }; /* *INDENT-ON* */ static int mode = REQ_INS_MODE; int c = wGetchar(w); FIELD *me = current_field(f); bool current = TRUE; if (c == CTRL(']')) { if (mode == REQ_INS_MODE) { mode = REQ_OVL_MODE; } else { mode = REQ_INS_MODE; } c = mode; } else { unsigned n; for (n = 0; n < SIZEOF(lookup); n++) { if (lookup[n].code == c) { c = lookup[n].result; break; } } } MvPrintw(0, COLS - 6, "(%s)", mode == REQ_INS_MODE ? "INS" : "OVL"); /* * Force the field that the user is typing into to be in reverse video, * while the other fields are shown underlined. */ switch (c) { case REQ_BEG_FIELD: case REQ_CLR_EOF: case REQ_CLR_EOL: case REQ_CLR_FIELD: case REQ_DEL_CHAR: case REQ_DEL_LINE: case REQ_DEL_PREV: case REQ_DEL_WORD: case REQ_END_FIELD: case REQ_INS_CHAR: case REQ_INS_LINE: case REQ_LEFT_CHAR: case REQ_LEFT_FIELD: case REQ_NEXT_WORD: case REQ_RIGHT_CHAR: current = TRUE; break; default: current = (c < KEY_MAX); break; } if (current) { c = edit_secure(me, c); set_field_back(me, A_REVERSE); } else { c = edit_secure(me, c); set_field_back(me, A_UNDERLINE); } return c; } static int my_form_driver(FORM *form, int c) { if (c == (MAX_FORM_COMMAND + 1) && form_driver(form, REQ_VALIDATION) == E_OK) return (TRUE); else { beep(); return (FALSE); } } #ifdef NCURSES_VERSION #define FIELDCHECK_CB(func) bool func(FIELD * fld, const void * data GCC_UNUSED) #define CHAR_CHECK_CB(func) bool func(int ch, const void *data GCC_UNUSED) #else #define FIELDCHECK_CB(func) int func(FIELD * fld, char * data GCC_UNUSED) #define CHAR_CHECK_CB(func) int func(int ch, char *data GCC_UNUSED) #endif /* * Allow a middle initial, optionally with a '.' to end it. */ static FIELDCHECK_CB(mi_field_check) { char *s = field_buffer(fld, 0); int state = 0; int n; for (n = 0; s[n] != '\0'; ++n) { switch (state) { case 0: if (s[n] == '.') { if (n != 1) return FALSE; state = 2; } else if (isspace(UChar(s[n]))) { state = 2; } break; case 2: if (!isspace(UChar(s[n]))) return FALSE; break; } } /* force the form to display a leading capital */ if (islower(UChar(s[0]))) { s[0] = (char) toupper(UChar(s[0])); set_field_buffer(fld, 0, s); } return TRUE; } static CHAR_CHECK_CB(mi_char_check) { return ((isalpha(ch) || ch == '.') ? TRUE : FALSE); } /* * Passwords should be at least 6 characters. */ static FIELDCHECK_CB(pw_field_check) { char *s = field_buffer(fld, 0); int n; for (n = 0; s[n] != '\0'; ++n) { if (isspace(UChar(s[n]))) { if (n < 6) return FALSE; } } return TRUE; } static CHAR_CHECK_CB(pw_char_check) { return (isgraph(ch) ? TRUE : FALSE); } static int form_test(bool recur GCC_UNUSED) { FORM *form; FIELD *f[12], *secure; FIELDTYPE *fty_middle = new_fieldtype(mi_field_check, mi_char_check); FIELDTYPE *fty_passwd = new_fieldtype(pw_field_check, pw_char_check); int c; unsigned n = 0; #ifdef NCURSES_MOUSE_VERSION mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); #endif move(18, 0); addstr("Defined edit/traversal keys: ^Q/ESC- exit form\n"); addstr("^N -- go to next field ^P -- go to previous field\n"); addstr("Home -- go to first field End -- go to last field\n"); addstr("^L -- go to field to left ^R -- go to field to right\n"); addstr("^U -- move upward to field ^D -- move downward to field\n"); addstr("^W -- go to next word ^B -- go to previous word\n"); addstr("^S -- go to start of field ^E -- go to end of field\n"); addstr("^H -- delete previous char ^Y -- delete line\n"); addstr("^G -- delete current word ^C -- clear to end of line\n"); addstr("^K -- clear to end of field ^X -- clear field\n"); addstr("Arrow keys move within a field as you would expect. ^] toggles overlay mode."); MvAddStr(4, 57, "Forms Entry Test"); refresh(); /* describe the form */ memset(f, 0, sizeof(f)); f[n++] = make_label(0, 15, "Sample Form"); f[n++] = make_label(2, 0, "Last Name"); f[n++] = make_field(3, 0, 1, 18, FALSE); set_field_type(f[n - 1], TYPE_ALPHA, 1); f[n++] = make_label(2, 20, "First Name"); f[n++] = make_field(3, 20, 1, 12, FALSE); set_field_type(f[n - 1], TYPE_ALPHA, 1); f[n++] = make_label(2, 34, "Middle Name"); f[n++] = make_field(3, 34, 1, 12, FALSE); set_field_type(f[n - 1], fty_middle); f[n++] = make_label(5, 0, "Comments"); f[n++] = make_field(6, 0, 4, 46, FALSE); f[n++] = make_label(5, 20, "Password:"); secure = f[n++] = make_field(5, 30, 1, 9, TRUE); set_field_type(f[n - 1], fty_passwd); f[n] = (FIELD *) 0; if ((form = new_form(f)) != 0) { WINDOW *w; int finished = 0; display_form(form); w = form_win(form); raw(); nonl(); /* lets us read ^M's */ while (!finished) { switch (form_driver(form, c = form_virtualize(form, w))) { case E_OK: MvAddStr(5, 57, field_buffer(secure, 1)); clrtoeol(); refresh(); break; case E_UNKNOWN_COMMAND: finished = my_form_driver(form, c); break; default: beep(); break; } } erase_form(form); free_form(form); } for (c = 0; f[c] != 0; c++) free_field(f[c]); free_fieldtype(fty_middle); free_fieldtype(fty_passwd); noraw(); nl(); #ifdef NCURSES_MOUSE_VERSION mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); #endif return OK; } #endif /* USE_LIBFORM */ /**************************************************************************** * * Overlap test * ****************************************************************************/ #if HAVE_COPYWIN /* ...and overlay, overwrite */ static const int overlap_HEAD = 1; static const int overlap_FOOT = 6; static WINDOW * make_overlap(int n) { WINDOW *result; int y, x; getmaxyx(stdscr, y, x); if (y < 23 || x < 80) { Cannot("The screen is too small for this test"); result = 0; } else { int ymax = y - (overlap_HEAD + overlap_FOOT); int high = ymax / 5; /* equal-sized parts for cross */ int xmax = x - 2; /* margin */ int wide = (xmax / 5) & ~1; int lmar, tmar; if (high > 8) high = 8; if (wide > 8) wide = 8; tmar = (ymax - (5 * high)) / 2 + overlap_HEAD; lmar = (xmax - (5 * wide)) / 2; if (n == 0) { result = newwin(3 * high, 3 * wide, tmar, lmar); } else { result = newwin(3 * high, 3 * wide, tmar + 2 * high, lmar + 2 * wide); } } return result; } static void clear_overlap(void) { int row; for (row = overlap_HEAD; row < LINES - overlap_FOOT; ++row) { move(row, 0); clrtoeol(); } } static int move_overlap(int shift, WINDOW *win1) { int ymax = getmaxy(stdscr) - (overlap_HEAD + overlap_FOOT); int high = ymax / 5; /* equal-sized parts for cross */ int tmar; int xmax1 = getmaxx(win1) + 1; int lmar1 = (COLS - (5 * (xmax1) / 3)) / 2; int rc = ERR; if (high > 8) high = 8; tmar = (ymax - (5 * high)) / 2 + overlap_HEAD; rc = mvwin(win1, tmar, lmar1 + shift); return rc; } static void fillwin(WINDOW *win, char ch) { int y, x; int y1, x1; getmaxyx(win, y1, x1); for (y = 0; y < y1; y++) { wmove(win, y, 0); for (x = 0; x < x1; x++) waddch(win, UChar(ch)); } } #define InCross(x,y, x1,y1) \ (((x > (x1 - 1) / 3) && (x <= (2 * (x1 - 1)) / 3)) \ || (((y > (y1 - 1) / 3) && (y <= (2 * (y1 - 1)) / 3)))) static void crosswin(WINDOW *win, char ch) { int y, x; int y1, x1; int xw = 1; getmaxyx(win, y1, x1); for (y = 0; y < y1; y++) { for (x = 0; x < x1; x += xw) { if (InCross(x, y, x1, y1)) { wmove(win, y, x); waddch(win, UChar(ch)); } } } } /* * Match "crosswin()", but using line-drawing characters. This could be done * a little simpler using box(), but the reason for this example is to test * hline/vline and addch with line-drawing vs the copy/overlay functions. */ static void crossbox(WINDOW *win) { int y1, x1; int ymax, xmax; getmaxyx(win, y1, x1); ymax = (y1 + 1); xmax = (x1 + 1); mvwhline(win, 0, (xmax / 3), ACS_HLINE, (xmax / 3)); mvwhline(win, ymax / 3, 0, ACS_HLINE, xmax); mvwhline(win, ((2 * ymax) / 3) - 1, 0, ACS_HLINE, xmax); mvwhline(win, y1 - 1, (xmax / 3), ACS_HLINE, (xmax / 3)); mvwvline(win, (ymax / 3), 0, ACS_VLINE, (ymax / 3)); mvwvline(win, 0, xmax / 3, ACS_VLINE, ymax); mvwvline(win, 0, ((2 * xmax) / 3) - 1, ACS_VLINE, ymax); mvwvline(win, (ymax / 3), x1 - 1, ACS_VLINE, (ymax / 3)); mvwaddch(win, 0, (xmax / 3), ACS_ULCORNER); mvwaddch(win, 0, ((2 * xmax) / 3) - 1, ACS_URCORNER); mvwaddch(win, y1 - 1, (xmax / 3), ACS_LLCORNER); mvwaddch(win, y1 - 1, ((2 * xmax) / 3) - 1, ACS_LRCORNER); mvwaddch(win, (ymax / 3), 0, ACS_ULCORNER); mvwaddch(win, ((2 * ymax) / 3) - 1, 0, ACS_LLCORNER); mvwaddch(win, (ymax / 3), x1 - 1, ACS_URCORNER); mvwaddch(win, ((2 * ymax) / 3) - 1, x1 - 1, ACS_LRCORNER); mvwaddch(win, (ymax / 3), (xmax / 3), ACS_PLUS); mvwaddch(win, (ymax / 3), ((2 * xmax) / 3) - 1, ACS_PLUS); mvwaddch(win, ((2 * ymax) / 3) - 1, ((2 * xmax) / 3) - 1, ACS_PLUS); mvwaddch(win, ((2 * ymax) / 3) - 1, (xmax / 3), ACS_PLUS); } typedef enum { otBASE_refresh = 0 ,otBASE_fill ,otBASE_draw ,otBASE_clear ,otBASE_copy } otBASE; #define OVERLAP_FLAVORS 6 typedef enum { otFILL_normal = 0 ,otFILL_bold ,otFILL_color ,otFILL_bright } otFILL; #define LimitFILL() UseColors ? 4 : 2 typedef enum { otDRAW_text_cross = 0 ,otDRAW_line_box ,otDRAW_line_cross ,otDRAW_set_bg ,otDRAW_reset_bg } otDRAW; #define LimitDRAW() UseColors ? 5 : 3 typedef enum { otCOPY_overwrite = 0 ,otCOPY_merge ,otCOPY_force ,otCOPY_overlay } otCOPY; #define LimitCOPY() 4 static void overlap_helpitem(int state, int item, char *message) { int row = (item / 2); int col = ((item % 2) ? COLS / 2 : 0); move(LINES - 6 + row, col); printw("%c%c = %s", state == row ? '>' : ' ', 'a' + item, message); clrtoeol(); } static void overlap_test_1_attr(WINDOW *win, int flavor, int col) { NCURSES_PAIRS_T cpair = (NCURSES_PAIRS_T) (1 + (flavor * 2) + col); switch ((otFILL) flavor) { case otFILL_normal: (void) wattrset(win, A_NORMAL); break; case otFILL_bold: (void) wattrset(win, A_BOLD); break; case otFILL_color: init_pair(cpair, COLOR_BLUE, COLOR_WHITE); (void) wattrset(win, AttrArg(COLOR_PAIR(cpair), A_NORMAL)); break; case otFILL_bright: init_pair(cpair, COLOR_WHITE, COLOR_BLUE); (void) wattrset(win, AttrArg(COLOR_PAIR(cpair), A_BOLD)); break; } } static void overlap_test_2_attr(WINDOW *win, int flavor, int col) { NCURSES_PAIRS_T cpair = (NCURSES_PAIRS_T) (9 + (flavor * 2) + col); switch ((otDRAW) flavor) { case otDRAW_text_cross: /* no effect */ break; case otDRAW_line_box: /* no effect */ break; case otDRAW_line_cross: /* no effect */ break; case otDRAW_set_bg: init_pair(cpair, COLOR_RED, COLOR_GREEN); wbkgdset(win, colored_chtype(' ', A_BLINK, cpair)); break; case otDRAW_reset_bg: wbkgdset(win, ' ' | A_NORMAL); break; } } static int overlap_help(int state, int flavors[OVERLAP_FLAVORS]) { int item; int limit[OVERLAP_FLAVORS]; char msg[80]; if (state < 0) state += OVERLAP_FLAVORS; state = state % OVERLAP_FLAVORS; assert(state >= 0 && state < OVERLAP_FLAVORS); for (item = 0; item < (2 * OVERLAP_FLAVORS); ++item) { int row = item / 2; int col = item % 2; const char *ths = col ? "B" : "A"; const char *tht = col ? "A" : "B"; switch ((otBASE) row) { case otBASE_refresh: limit[row] = 1; flavors[row] = 0; _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "refresh %s, then %s, then doupdate.", ths, tht); break; case otBASE_fill: limit[row] = LimitFILL(); flavors[row] %= limit[row]; overlap_test_1_attr(stdscr, flavors[row], col); _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "fill window %s with letter %s.", ths, ths); break; case otBASE_draw: limit[row] = LimitDRAW(); flavors[row] %= limit[row]; switch ((otDRAW) flavors[row]) { case otDRAW_text_cross: _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "cross text-pattern in window %s.", ths); break; case otDRAW_line_box: _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "draw line-box in window %s.", ths); break; case otDRAW_line_cross: _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "draw line-cross in window %s.", ths); break; case otDRAW_set_bg: _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "set background of window %s.", ths); break; case otDRAW_reset_bg: _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "reset background of window %s.", ths); break; } break; case otBASE_clear: limit[row] = 1; flavors[row] = 0; _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "clear window %s.", ths); break; case otBASE_copy: limit[row] = LimitCOPY(); flavors[row] %= limit[row]; switch ((otCOPY) flavors[row]) { case otCOPY_overwrite: _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "overwrite %s onto %s.", ths, tht); break; case otCOPY_merge: _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "copywin(FALSE) %s onto %s.", ths, tht); break; case otCOPY_force: _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "copywin(TRUE) %s onto %s.", ths, tht); break; case otCOPY_overlay: _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) "overlay %s onto %s.", ths, tht); break; } break; } overlap_helpitem(state, item, msg); (void) wattrset(stdscr, A_NORMAL); wbkgdset(stdscr, ' ' | A_NORMAL); } move(LINES - 1, 0); printw("^Q/ESC = terminate test. shift. Up/down/space select (row %d", state + 1); if (limit[state] > 1) printw(" test %d:%d", 1 + flavors[state], limit[state]); printw(")."); clrtoeol(); return state; } static void overlap_test_0(WINDOW *a, WINDOW *b) { touchwin(a); touchwin(b); wnoutrefresh(a); wnoutrefresh(b); doupdate(); } static void overlap_test_1(int flavor, int col, WINDOW *a, char fill) { overlap_test_1_attr(a, flavor, col); fillwin(a, fill); (void) wattrset(a, A_NORMAL); } static void overlap_test_2(int flavor, int col, WINDOW *a, char fill) { overlap_test_2_attr(a, flavor, col); switch ((otDRAW) flavor) { case otDRAW_text_cross: crosswin(a, fill); break; case otDRAW_line_box: box(a, 0, 0); break; case otDRAW_line_cross: crossbox(a); break; case otDRAW_set_bg: /* done in overlap_test_2_attr */ break; case otDRAW_reset_bg: /* done in overlap_test_2_attr */ break; } } static void overlap_test_3(WINDOW *a) { wclear(a); wmove(a, 0, 0); } static void overlap_test_4(int flavor, WINDOW *a, WINDOW *b) { switch ((otCOPY) flavor) { case otCOPY_overwrite: overwrite(a, b); break; case otCOPY_merge: copywin(a, b, 0, 0, 0, 0, getmaxy(b), getmaxx(b), FALSE); break; case otCOPY_force: copywin(a, b, 0, 0, 0, 0, getmaxy(b), getmaxx(b), TRUE); break; case otCOPY_overlay: overlay(a, b); break; } } /* test effects of overlapping windows */ static int overlap_test(bool recur GCC_UNUSED) { WINDOW *win1, *win2; int ch; int shift = 0, last_refresh = -1; int state, flavor[OVERLAP_FLAVORS]; if ((win1 = make_overlap(0)) == 0) { return ERR; } else if ((win2 = make_overlap(1)) == 0) { delwin(win1); return ERR; } curs_set(0); raw(); refresh(); move(0, 0); printw("Test wnoutrefresh() for two overlapping windows:"); memset(flavor, 0, sizeof(flavor)); state = overlap_help(0, flavor); while (!isQuit(ch = Getchar(), TRUE)) { switch (ch) { case 'a': /* refresh window A first, then B */ overlap_test_0(win1, win2); break; case 'b': /* refresh window B first, then A */ overlap_test_0(win2, win1); break; case 'c': /* fill window A so it is visible */ overlap_test_1(flavor[otBASE_fill], 0, win1, 'A'); break; case 'd': /* fill window B so it is visible */ overlap_test_1(flavor[otBASE_fill], 1, win2, 'B'); break; case 'e': /* cross test pattern in window A */ overlap_test_2(flavor[otBASE_draw], 0, win1, 'A'); break; case 'f': /* cross test pattern in window A */ overlap_test_2(flavor[otBASE_draw], 1, win2, 'B'); break; case 'g': /* clear window A */ overlap_test_3(win1); break; case 'h': /* clear window B */ overlap_test_3(win2); break; case 'i': /* overwrite A onto B */ overlap_test_4(flavor[otBASE_copy], win1, win2); break; case 'j': /* overwrite B onto A */ overlap_test_4(flavor[otBASE_copy], win2, win1); break; case CTRL('n'): case KEY_DOWN: state = overlap_help(state + 1, flavor); break; case CTRL('p'): case KEY_UP: state = overlap_help(state - 1, flavor); break; case ' ': flavor[state] += 1; state = overlap_help(state, flavor); break; case HELP_KEY_1: state = overlap_help(state, flavor); break; case '<': /* FALLTHRU */ case '>': /* see below */ break; default: beep(); break; } switch (ch) { case 'a': /* FALLTHRU */ case 'b': last_refresh = ch; break; case '<': shift -= 2; /* FALLTHRU */ case '>': shift += 1; if (move_overlap(shift, win1) != OK) { flash(); shift += (ch == '>') ? -1 : 1; } else if (last_refresh > 0) { clear_overlap(); wnoutrefresh(stdscr); if (last_refresh == 'a') overlap_test_0(win1, win2); else overlap_test_0(win2, win1); } break; default: last_refresh = -1; break; } } delwin(win2); delwin(win1); erase(); stop_curses(); return OK; } #if USE_WIDEC_SUPPORT static void x_fillwin(WINDOW *win, wchar_t ch) { int y, x; int y1, x1; getmaxyx(win, y1, x1); x1 /= 2; for (y = 0; y < y1; y++) { wmove(win, y, 0); for (x = 0; x < x1; x++) waddnwstr(win, &ch, 1); } } static void x_crosswin(WINDOW *win, wchar_t ch) { int y, x; int y1, x1; int xw = 2; getmaxyx(win, y1, x1); for (y = 0; y < y1; y++) { for (x = 0; x < x1; x += xw) { if (InCross(x, y, x1, y1)) { wmove(win, y, x); waddnwstr(win, &ch, 1); } } } } static void x_overlap_test_1(int flavor, int col, WINDOW *a, wchar_t fill) { overlap_test_1_attr(a, flavor, col); x_fillwin(a, fill); (void) wattrset(a, A_NORMAL); } static void x_overlap_test_2(int flavor, int col, WINDOW *a, wchar_t fill) { overlap_test_2_attr(a, flavor, col); switch ((otDRAW) flavor) { case otDRAW_text_cross: x_crosswin(a, fill); break; case otDRAW_line_box: box(a, 0, 0); break; case otDRAW_line_cross: crossbox(a); break; case otDRAW_set_bg: /* done in overlap_test_2_attr */ break; case otDRAW_reset_bg: /* done in overlap_test_2_attr */ break; } } /* test effects of overlapping windows */ static int x_overlap_test(bool recur GCC_UNUSED) { const wchar_t WIDE_A = 0xff21; const wchar_t WIDE_B = 0xff22; WINDOW *win1, *win2; int ch; int shift = 0, last_refresh = -1; int state, flavor[OVERLAP_FLAVORS]; if ((win1 = make_overlap(0)) == 0) { return ERR; } else if ((win2 = make_overlap(1)) == 0) { delwin(win1); return ERR; } curs_set(0); raw(); refresh(); move(0, 0); printw("Test wnoutrefresh() for overlapping windows with double-cell characters:"); memset(flavor, 0, sizeof(flavor)); state = overlap_help(0, flavor); while (!isQuit(ch = Getchar(), TRUE)) { switch (ch) { case 'a': /* refresh window A first, then B */ overlap_test_0(win1, win2); break; case 'b': /* refresh window B first, then A */ overlap_test_0(win2, win1); break; case 'c': /* fill window A so it is visible */ x_overlap_test_1(flavor[otBASE_fill], 0, win1, WIDE_A); break; case 'd': /* fill window B so it is visible */ x_overlap_test_1(flavor[otBASE_fill], 1, win2, WIDE_B); break; case 'e': /* cross test pattern in window A */ x_overlap_test_2(flavor[otBASE_draw], 0, win1, WIDE_A); break; case 'f': /* cross test pattern in window A */ x_overlap_test_2(flavor[otBASE_draw], 1, win2, WIDE_B); break; case 'g': /* clear window A */ overlap_test_3(win1); break; case 'h': /* clear window B */ overlap_test_3(win2); break; case 'i': /* overwrite A onto B */ overlap_test_4(flavor[otBASE_copy], win1, win2); break; case 'j': /* overwrite B onto A */ overlap_test_4(flavor[otBASE_copy], win2, win1); break; case CTRL('n'): case KEY_DOWN: state = overlap_help(state + 1, flavor); break; case CTRL('p'): case KEY_UP: state = overlap_help(state - 1, flavor); break; case ' ': flavor[state] += 1; state = overlap_help(state, flavor); break; case HELP_KEY_1: state = overlap_help(state, flavor); break; case '<': /* FALLTHRU */ case '>': /* see below */ break; default: beep(); break; } switch (ch) { case 'a': /* FALLTHRU */ case 'b': last_refresh = ch; break; case '<': shift -= 2; /* FALLTHRU */ case '>': shift += 1; if (move_overlap(shift, win1) != OK) { flash(); shift += (ch == '>') ? -1 : 1; } else if (last_refresh > 0) { clear_overlap(); wnoutrefresh(stdscr); if (last_refresh == 'a') overlap_test_0(win1, win2); else overlap_test_0(win2, win1); } break; default: last_refresh = -1; break; } } delwin(win2); delwin(win1); erase(); stop_curses(); return OK; } #endif /* USE_WIDEC_SUPPORT */ #endif /* HAVE_COPYWIN */ static void show_setting_name(const char *name) { printw("%-25s ", name); } static void show_string_setting(const char *name, const char *value) { show_setting_name(name); if (value) { printw("\"%s\"", value); } else { attron(A_REVERSE); addstr(""); attroff(A_REVERSE); } AddCh('\n'); } static void show_number_setting(const char *name, int value) { show_setting_name(name); if (value >= 0) { printw("%d", value); } else { attron(A_REVERSE); printw("%d", value); attroff(A_REVERSE); } AddCh('\n'); } static void show_boolean_setting(const char *name, int value) { show_setting_name(name); if (value >= 0) { printw("%s", value ? "TRUE" : "FALSE"); } else { attron(A_REVERSE); printw("%d", value); attroff(A_REVERSE); } AddCh('\n'); } static int settings_test(bool recur GCC_UNUSED) { #if USE_WIDEC_SUPPORT wchar_t ch; #endif move(0, 0); show_string_setting("termname", termname()); show_string_setting("longname", longname()); show_number_setting("baudrate", baudrate()); if (erasechar() > 0) { show_string_setting("unctrl(erasechar)", unctrl((chtype) erasechar())); show_string_setting("keyname(erasechar)", keyname(erasechar())); } if (killchar() > 0) { show_string_setting("unctrl(killchar)", unctrl((chtype) killchar())); show_string_setting("keyname(killchar)", keyname(killchar())); } #if USE_WIDEC_SUPPORT if (erasewchar(&ch) == OK) { show_string_setting("key_name(erasewchar)", key_name(ch)); } if (killwchar(&ch) == OK) { show_string_setting("key_name(killwchar)", key_name(ch)); } #endif show_boolean_setting("has_ic", has_ic()); show_boolean_setting("has_il", has_il()); show_boolean_setting("has_colors", has_colors()); #if HAVE_COLOR_CONTENT show_boolean_setting("can_change_color", can_change_color()); #endif show_setting_name("LINES"); printw("%d\n", LINES); show_setting_name("COLS"); printw("%d\n", COLS); Pause(); erase(); stop_curses(); return OK; } /**************************************************************************** * * Main sequence * ****************************************************************************/ static void usage(int ok) { static const char *const tbl[] = { "Usage: ncurses [options]" ,"" ,USAGE_COMMON ,"Options:" #ifdef NCURSES_VERSION ," -a f,b set default-colors (assumed white-on-black)" ," -d use default-colors if terminal supports them" #endif #if HAVE_USE_ENV ," -E call use_env(FALSE) to ignore $LINES and $COLUMNS" #endif #if USE_SOFTKEYS ," -e fmt specify format for soft-keys test (e)" #endif #if HAVE_RIPOFFLINE ," -F rip-off footer line (can repeat)" ," -H rip-off header line (can repeat)" #endif ," -m do not use colors" #if HAVE_COLOR_CONTENT ," -p file rgb values to use in 'd' rather than ncurses's builtin" #endif #if USE_LIBPANEL ," -s msec specify nominal time for panel-demo (default: 1, to hold)" #endif #if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20120714) && !defined(_NC_WINDOWS) ," -T call use_tioctl(TRUE) to allow SIGWINCH to override environment" #endif #ifdef TRACE ," -t mask specify default trace-level (may toggle with ^T)" #endif #if HAVE_COLOR_CONTENT ," -x use xterm-compatible control for reading color palette" #endif }; size_t n; for (n = 0; n < SIZEOF(tbl); n++) fprintf(stderr, "%s\n", tbl[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } static void set_terminal_modes(void) { noraw(); cbreak(); noecho(); scrollok(stdscr, TRUE); idlok(stdscr, TRUE); keypad(stdscr, TRUE); } #ifdef SIGUSR1 static void announce_sig(int sig) { (void) fprintf(stderr, "Handled signal %d\r\n", sig); } #endif #if HAVE_RIPOFFLINE static int rip_footer(WINDOW *win, int cols) { wbkgd(win, A_REVERSE); werase(win); wmove(win, 0, 0); wprintw(win, "footer: window %p, %d columns", (void *) win, cols); wnoutrefresh(win); return OK; } static int rip_header(WINDOW *win, int cols) { wbkgd(win, A_REVERSE); werase(win); wmove(win, 0, 0); wprintw(win, "header: window %p, %d columns", (void *) win, cols); wnoutrefresh(win); return OK; } #endif /* HAVE_RIPOFFLINE */ static void main_menu(bool top) { #if USE_WIDEC_SUPPORT typedef struct { bool recur; int (*narrow_func) (bool); int (*wide_func) (bool); int code; const char *help; } MyCmds; #define BOTH(a) a, x_ ## a #define ONLY(a) a, NULL #define CMDS(recur, funcs,code,help) { recur, funcs, code, help } #else typedef struct { bool recur; int (*narrow_func) (bool); int code; const char *help; } MyCmds; #define BOTH(a) a #define ONLY(a) a #define CMDS(recur, funcs,code,help) { recur, funcs, code, help } #endif /* *INDENT-OFF* */ static MyCmds cmds[] = { CMDS(TRUE, BOTH(getch_test), 'a', "keyboard and mouse input test"), CMDS(TRUE, BOTH(attr_test), 'b', "character attribute test"), CMDS(TRUE, BOTH(color_test), 'c', "color test pattern"), #if HAVE_COLOR_CONTENT CMDS(FALSE, ONLY(color_edit), 'd', "edit RGB color values"), #endif #if USE_SOFTKEYS CMDS(TRUE, BOTH(slk_test), 'e', "exercise soft keys"), #endif CMDS(TRUE, BOTH(acs_test), 'f', "display ACS characters"), CMDS(TRUE, ONLY(scroll_test), 'g', "display windows and scrolling"), CMDS(TRUE, ONLY(flushinp_test), 'i', "test flushinp()"), CMDS(TRUE, ONLY(sgr_attr_test), 'k', "display character attributes"), #if USE_LIBMENU CMDS(TRUE, ONLY(menu_test), 'm', "exercise menu library"), #endif #if USE_LIBPANEL CMDS(TRUE, BOTH(panel_test), 'o', "exercise panel library"), #endif #if HAVE_NEWPAD CMDS(TRUE, ONLY(pad_test), 'p', "exercise pad features"), #endif CMDS(TRUE, ONLY(NULL), 'q', "quit"), #if USE_LIBMENU CMDS(TRUE, ONLY(form_test), 'r', "exercise form library"), #endif #if HAVE_COPYWIN CMDS(TRUE, BOTH(overlap_test), 's', "overlapping-refresh test"), #endif #if USE_LIBMENU && defined(TRACE) CMDS(TRUE, ONLY(trace_set), 't', "set trace level"), #endif CMDS(TRUE, ONLY(settings_test), 'v', "show terminal name and settings"), CMDS(FALSE, ONLY(NULL), '?', "repeat this command summary") }; /* *INDENT-ON* */ int (*doit) (bool); char command; unsigned n; do { printf("This is the ncurses main menu (uppercase for wide-characters)\n"); for (n = 0; n < SIZEOF(cmds); ++n) { if (top || cmds[n].recur) { putchar(' '); #if USE_WIDEC_SUPPORT if (cmds[n].wide_func) { printf("%c,", toupper(cmds[n].code)); } #endif printf("%c\t= %s\n", cmds[n].code, cmds[n].help); } } (void) fputs("> ", stdout); (void) fflush(stdout); /* necessary under SVr4 curses */ /* * This used to be an 'fgets()' call (until 1996/10). However with * some runtime libraries, mixing stream I/O and 'read()' causes the * input stream to be flushed when switching between the two. */ command = 0; for (;;) { char ch = '\0'; if (read(fileno(stdin), &ch, (size_t) 1) <= 0) { int save_err = errno; perror("\nOOPS"); if (save_err == EINTR) { clearerr(stdin); continue; } else if (command == 0) { command = 'q'; } break; } else if (command == 0 && !isspace(UChar(ch))) { command = ch; } else if (ch == '\n' || ch == '\r') { if ((command == 'd') && !top) { (void) fputs("Do not nest test-d\n", stdout); command = 0; } if (command != 0) break; (void) fputs("> ", stdout); (void) fflush(stdout); } } doit = NULL; for (n = 0; n < SIZEOF(cmds); ++n) { if (cmds[n].code == command) { doit = cmds[n].narrow_func; break; } #if USE_WIDEC_SUPPORT if (toupper(cmds[n].code) == command) { doit = cmds[n].wide_func; break; } #endif } if (doit != NULL && doit(FALSE) == OK) { /* * This may be overkill; it is intended to reset everything back * to the initial terminal modes so that tests don't get in * each other's way. */ flushinp(); set_terminal_modes(); reset_prog_mode(); clear(); refresh(); endwin(); if (command == '?') { (void) puts("This is the ncurses capability tester."); (void) puts("You may select a test from the main menu by typing the"); (void) puts("key letter of the choice (the letter to left of the =)"); (void) puts("at the > prompt. Type `q' to exit."); } continue; } } while (command != 'q'); } /*+------------------------------------------------------------------------- main(argc,argv) --------------------------------------------------------------------------*/ /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; int my_e_param = 1; #ifdef NCURSES_VERSION_PATCH #if HAVE_USE_DEFAULT_COLORS int default_fg = COLOR_WHITE; int default_bg = COLOR_BLACK; bool default_colors = FALSE; #if HAVE_ASSUME_DEFAULT_COLORS bool assumed_colors = FALSE; #endif #endif #endif bool monochrome = FALSE; #if HAVE_COLOR_CONTENT bool xterm_colors = FALSE; char *palette_file = 0; #endif setlocale(LC_ALL, ""); while ((ch = getopt(argc, argv, OPTS_COMMON "a:dEe:FHmp:s:Tt:x")) != -1) { switch (ch) { #ifdef NCURSES_VERSION_PATCH #if HAVE_USE_DEFAULT_COLORS #if HAVE_ASSUME_DEFAULT_COLORS case 'a': assumed_colors = TRUE; switch (sscanf(optarg, "%d,%d", &default_fg, &default_bg)) { case 0: default_fg = COLOR_WHITE; /* FALLTHRU */ case 1: default_bg = COLOR_BLACK; break; } break; #endif case 'd': default_colors = TRUE; break; #endif #endif #if HAVE_USE_ENV case 'E': use_env(FALSE); break; #endif case 'e': my_e_param = atoi(optarg); #ifdef NCURSES_VERSION if (my_e_param > 3) /* allow extended layouts */ usage(FALSE); #else if (my_e_param > 1) usage(FALSE); #endif break; #if HAVE_RIPOFFLINE case 'F': ripoffline(-1, rip_footer); break; case 'H': ripoffline(1, rip_header); break; #endif /* HAVE_RIPOFFLINE */ case 'm': monochrome = TRUE; break; #if HAVE_COLOR_CONTENT case 'p': palette_file = optarg; break; #endif #if USE_LIBPANEL case 's': nap_msec = (int) atol(optarg); break; #endif #if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20120714) && !defined(_NC_WINDOWS) case 'T': use_tioctl(TRUE); break; #endif #ifdef TRACE case 't': save_trace = (unsigned) strtol(optarg, 0, 0); break; #endif #if HAVE_COLOR_CONTENT case 'x': xterm_colors = TRUE; break; #endif case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } /* * If there's no menus (unlikely for ncurses!), then we'll have to set * tracing on initially, just in case the user wants to test something that * doesn't involve wGetchar. */ #ifdef TRACE /* enable debugging */ #if !USE_LIBMENU curses_trace(save_trace); #else if (!isatty(fileno(stdin))) curses_trace(save_trace); #endif /* USE_LIBMENU */ #endif /* TRACE */ #if USE_SOFTKEYS /* tell it we're going to play with soft keys */ slk_init(my_e_param); #endif #ifdef SIGUSR1 /* set up null signal catcher so we can see what interrupts to getch do */ signal(SIGUSR1, announce_sig); #endif /* we must initialize the curses data structure only once */ initscr(); bkgdset(BLANK); set_terminal_modes(); def_prog_mode(); /* tests, in general, will want these modes */ UseColors = (bool) (monochrome ? FALSE : has_colors()); if (UseColors) { start_color(); #ifdef NCURSES_VERSION_PATCH MaxColors = COLORS; /* was > 16 ? 16 : COLORS */ #if HAVE_USE_DEFAULT_COLORS if (default_colors) { use_default_colors(); MinColors = -1; } #if HAVE_ASSUME_DEFAULT_COLORS if (assumed_colors) assume_default_colors(default_fg, default_bg); #endif #endif #else /* normal SVr4 curses */ MaxColors = COLORS; /* was > 8 ? 8 : COLORS */ #endif max_pairs = COLOR_PAIRS; /* was > 256 ? 256 : COLOR_PAIRS */ #if HAVE_COLOR_CONTENT if (can_change_color()) { init_all_colors(xterm_colors, palette_file); } #endif } /* * Return to terminal mode, so we're guaranteed of being able to * select terminal commands even if the capabilities are wrong. */ endwin(); #if HAVE_CURSES_VERSION (void) printf("Welcome to %s. Press ? for help.\n", curses_version()); #elif defined(NCURSES_VERSION_MAJOR) && defined(NCURSES_VERSION_MINOR) && defined(NCURSES_VERSION_PATCH) (void) printf("Welcome to ncurses %d.%d.%d. Press ? for help.\n", NCURSES_VERSION_MAJOR, NCURSES_VERSION_MINOR, NCURSES_VERSION_PATCH); #else (void) puts("Welcome to ncurses. Press ? for help."); #endif main_menu(TRUE); ExitProgram(EXIT_SUCCESS); } /* ncurses.c ends here */ ncurses-6.4-20240113/test/echochar.c0000644000000000000000000001155214434462126015346 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/test/gdc.60000644000000000000000000000644013615656212014253 0ustar rootroot.\"*************************************************************************** .\" Copyright 2020 Thomas E. Dickey * .\" Copyright 1998-2006,2017 Free Software Foundation, Inc. * .\" * .\" Permission is hereby granted, free of charge, to any person obtaining a * .\" copy of this software and associated documentation files (the * .\" "Software"), to deal in the Software without restriction, including * .\" without limitation the rights to use, copy, modify, merge, publish, * .\" distribute, distribute with modifications, sublicense, and/or sell * .\" copies of the Software, and to permit persons to whom the Software is * .\" furnished to do so, subject to the following conditions: * .\" * .\" The above copyright notice and this permission notice shall be included * .\" in all copies or substantial portions of the Software. * .\" * .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * .\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * .\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * .\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * .\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * .\" * .\" Except as contained in this notice, the name(s) of the above copyright * .\" holders shall not be used in advertising or otherwise to promote the * .\" sale, use or other dealings in this Software without prior written * .\" authorization. * .\"*************************************************************************** .\" .\" $Id: gdc.6,v 1.6 2020/02/02 23:34:34 tom Exp $ .TH GDC 6 2020-02-02 ncurses-examples Games .SH NAME gdc \- grand digital clock (curses) .SH SYNOPSIS .B gdc \fP[\fIoptions\fP] [\fIn\fP] .SH DESCRIPTION .I Gdc runs a digital clock made of reverse-video blanks on a terminal screen. If the terminal supports color, the clock is drawn in red. You can make the clock stop, pause or resume by pressing a ``q'', ``s'' or space, respectively. .SH OPTIONS .TP .B \-d use terminal's default colors for the background. .TP .B \-n redirects input to /dev/null, making it ignore the stop/pause commands. You can still stop it by pressing the interrupt key. .TP .B \-s makes digits scroll as they change. When running on a fast display, the program breaks up the scrolling into subsecond repaints, making the operation appear smooth. .TP .B \-t \fIhh:mm:ss\fP specify starting time (default is ``now''). .PP With an optional numeric argument .I num it stops after .I num seconds. Normally it runs "forever" (counting down from 2 billion seconds). .SH AUTHOR Amos Shapir, modified for curses by John Lupien. .br Improvements for ncurses by Thomas Dickey. ncurses-6.4-20240113/test/tracemunch0000755000000000000000000010342714114645347015513 0ustar rootroot#!/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 ncurses-6.4-20240113/test/blue.c0000644000000000000000000003255314345213323014517 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,2022 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /***************************************************************************** * * * B l u e M o o n * * ================= * * V2.2 * * A patience game by T.A.Lister * * Integral screen support by Eric S. Raymond * * * *****************************************************************************/ /* * $Id: blue.c,v 1.55 2022/12/10 23:31:31 tom Exp $ */ #include #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) { char *check = nl_langinfo(CODESET); if (!strcmp(check, "UTF-8")) { #if USE_WIDEC_SUPPORT suits = uglyphs; #endif } else { #if HAVE_TIGETSTR if (!strcmp(check, "IBM437") || !strcmp(check, "CP437") || !strcmp(check, "IBM850") || !strcmp(check, "CP850")) { char *smacs = tigetstr("smacs"); char *smpch = tigetstr("smpch"); /* * The ncurses library makes this check to decide whether to allow * the alternate character set for the (normally) nonprinting codes. */ if (smacs != 0 && smpch != 0 && !strcmp(smacs, smpch)) { suits = glyphs; } } #endif } } #else #define use_pc_display() /* nothing */ #endif /* HAVE_LANGINFO_CODESET */ static void usage(int ok) { static const char *msg[] = { "Usage: blue [options]" ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) usage(FALSE); setlocale(LC_ALL, ""); use_pc_display(); InitAndCatch(initscr(), die); start_color(); init_pair(RED_ON_WHITE, COLOR_RED, COLOR_WHITE); init_pair(BLUE_ON_WHITE, COLOR_BLUE, COLOR_WHITE); init_pair(BLACK_ON_WHITE, COLOR_BLACK, COLOR_WHITE); cbreak(); if (argc == 2) srand((unsigned) atoi(argv[1])); else srand((unsigned) time((time_t *) 0)); init_vars(); do { deal_number++; shuffle(deck_size); deal_cards(); display_cards(deal_number); play_game(); } while ((deck_size = collect_discards()) != 0); game_finished(deal_number); die(SIGINT); /*NOTREACHED */ } /* blue.c ends here */ ncurses-6.4-20240113/test/widechars.h0000644000000000000000000000651213727262705015555 0ustar rootroot/**************************************************************************** * Copyright 2018,2020 Thomas E. Dickey * * Copyright 2012 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ #ifndef __WIDECHARS_H #define __WIDECHARS_H 1 #include #if USE_WIDEC_SUPPORT #if defined(_NC_WINDOWS) && !defined(_MSC_VER) && !defined(EXP_WIN32_DRIVER) /* * MinGW has wide-character functions, but they do not work correctly. */ extern int _nc_mbtowc(wchar_t *pwc, const char *s, size_t n); extern int __MINGW_NOTHROW _nc_mbtowc(wchar_t *pwc, const char *s, size_t n); #define mbtowc(pwc,s,n) _nc_mbtowc(pwc,s,n) extern int __MINGW_NOTHROW _nc_mblen(const char *, size_t); #define mblen(s,n) _nc_mblen(s, n) #endif /* _WIN32||_WIN64 */ #if HAVE_MBTOWC && HAVE_MBLEN #define reset_mbytes(state) IGNORE_RC(mblen(NULL, 0)), IGNORE_RC(mbtowc(NULL, NULL, 0)) #define count_mbytes(buffer,length,state) mblen(buffer,length) #define check_mbytes(wch,buffer,length,state) \ (int) mbtowc(&wch, buffer, length) #define state_unused #elif HAVE_MBRTOWC && HAVE_MBRLEN #define reset_mbytes(state) init_mb(state) #define count_mbytes(buffer,length,state) mbrlen(buffer,length,&state) #define check_mbytes(wch,buffer,length,state) \ (int) mbrtowc(&wch, buffer, length, &state) #else make an error #endif #else #endif /* USE_WIDEC_SUPPORT */ extern void widechars_stub(void); #endif /* __WIDECHARS_H */ ncurses-6.4-20240113/test/pair_content.c0000644000000000000000000001646414376435314016272 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/test/foldkeys.c0000644000000000000000000001754314376436165015431 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/test/demo_altkeys.c0000644000000000000000000001220414376447202016250 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 Thomas E. Dickey * * Copyright 2005-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: demo_altkeys.c,v 1.17 2023/02/25 18:08:02 tom Exp $ * * Demonstrate the define_key() function. * Thomas Dickey - 2005/10/22 */ #define NEED_TIME_H #include #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 ncurses-6.4-20240113/test/test_sgr.c0000644000000000000000000002221114434462126015416 0ustar rootroot/**************************************************************************** * Copyright 2019-2022,2023 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.22 2023/05/27 20:13:10 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, const char *sgr, const char *sgr0) { static const char sample[] = "abcdefghijklm"; static char params[] = "SURBDBIPA"; unsigned n; printf("%4u ", bits); bits &= ~ignore; for (n = 0; n < MAXPAR; ++n) { putchar((int) ((bits & (unsigned) (1 << n)) ? params[n] : '-')); } putchar(' '); putp(sgr); putp(sample); putp(sgr0); putchar('\n'); } static bool one_bit(unsigned a, unsigned b) { unsigned c = (a ^ b); bool result = FALSE; if (c) { while (!(c & 1)) { c >>= 1; } result = (c == 1); } return result; } static void brute_force(const char *name) { unsigned count; char *my_sgr; char *my_sgr0; char *my_bold; char *my_revs; char *my_smso; char *my_name = strdup(name); if (db_list) { putenv(next_dbitem()); } if (!q_opt) printf("Terminal type \"%s\"\n", my_name); if (no_init) { START_TRACE(); } else { setupterm((NCURSES_CONST char *) my_name, 1, (int *) 0); } if (!q_opt) { if (strcmp(my_name, ttytype)) printf("... actual \"%s\"\n", ttytype); } my_sgr = tigetstr("sgr"); my_sgr0 = tigetstr("sgr0"); my_bold = tigetstr("bold"); my_revs = tigetstr("rev"); my_smso = tigetstr("smso"); if (!VALID_STRING(my_sgr)) { fprintf(stderr, "no \"sgr\" capability found\n"); } else if (!VALID_STRING(my_sgr0)) { fprintf(stderr, "no \"sgr0\" capability found\n"); } else { char *values[MAXSGR + MAXPAR]; unsigned j; unsigned ignore = 0; unsigned reason = 0; unsigned repeat = 0; for (count = 0; count < MAXSGR; ++count) { values[count] = tparm(my_sgr, BITS2P(1), BITS2P(2), BITS2P(3), BITS2P(4), BITS2P(5), BITS2P(6), BITS2P(7), BITS2P(8), BITS2P(9)); if (values[count] != 0) { values[count] = strdup(values[count]); } } for (count = 0; count < MAXSGR; ++count) { if (values[count] != 0) { for (j = count + 1; j < MAXSGR; ++j) { if (values[j] == 0) continue; if (strcmp(values[count], values[j])) continue; if (one_bit(count, j)) { free(values[j]); values[j] = 0; } } } } for (j = 0; j < MAXPAR; ++j) { unsigned mask = (unsigned) (1 << j); for (count = 0; count < MAXSGR; ++count) { if ((count & mask) != 0) continue; if (values[count] != 0 && values[count + mask] != 0) { mask = 0; break; } } ignore |= mask; } /* smso is tested first, but often duplicates bold or reverse. */ if (VALID_STRING(my_smso)) { if (VALID_STRING(my_bold) && !strcmp(my_bold, my_smso)) { repeat |= MASK_SMSO; reason = MASK_BOLD; } if (VALID_STRING(my_revs) && !strcmp(my_revs, my_smso)) { repeat |= MASK_SMSO; reason = MASK_REV; } } for (count = 0; count < MAXSGR; ++count) { if (values[count] != 0) { bool found = FALSE; if ((repeat & MASK_SMSO) != 0 && (count & MASK_SMSO) != 0) { found = TRUE; } else { for (j = 0; j < count; ++j) { if (values[j] != 0 && !strcmp(values[j], values[count])) { if ((repeat & MASK_SMSO) != 0 && (j & MASK_SMSO) != 0 && (count & reason) != 0) { continue; } found = TRUE; break; } } } if (!found) { dumpit(count, ignore, values[count], my_sgr0); ++total_values; } } } for (count = 0; count < MAXSGR; ++count) { free(values[count]); } } free(my_name); del_curterm(cur_term); } static void usage(int ok) { static const char *msg[] = { "Usage: test_sgr [options] [terminal]" ,"" ,"Print all distinct combinations of sgr capability." ,"" ,USAGE_COMMON ,"Options:" ," -d LIST colon-separated list of databases to use" ," -e NAME environment variable to set with -d option" ," -n do not initialize terminal, to test error-checking" ," -q quiet (prints only counts)" }; unsigned n; for (n = 0; n < SIZEOF(msg); ++n) { fprintf(stderr, "%s\n", msg[n]); } ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; char *name; while ((ch = getopt(argc, argv, OPTS_COMMON "d:e:nq")) != -1) { switch (ch) { case 'd': d_opt = optarg; break; case 'e': e_opt = optarg; break; case 'n': no_init = TRUE; break; case 'q': q_opt = TRUE; break; case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } make_dblist(); if (optind < argc) { int n; for (n = optind; n < argc; ++n) { brute_force(argv[n]); } } else if ((name = getenv("TERM")) != 0) { brute_force(name); } else { static char dumb[] = "dumb"; brute_force(dumb); } printf("%ld distinct values\n", total_values); #if NO_LEAKS free_dblist(); #endif ExitProgram(EXIT_SUCCESS); } #else /* !HAVE_TIGETSTR */ int main(void) { failed("This program requires the terminfo functions such as tigetstr"); ExitProgram(EXIT_FAILURE); } #endif /* HAVE_TIGETSTR */ ncurses-6.4-20240113/test/demo_terminfo.c0000644000000000000000000005114514434462126016423 0ustar rootroot/**************************************************************************** * Copyright 2019-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 * * $Id: demo_terminfo.c,v 1.57 2023/05/27 20:13:10 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(const char *name) { #define MAX_FORCE 5 /* omit "colors", since CPU-time is a problem */ static const char legal[] = "\ 0123456789\ ABCDEFGHIJKLMNOPQRSTUVWXYZ\ abcdefghijklmnopqrstuvwxyz_"; int length; int j, k; bool carry; bool changed; char cap[MAX_FORCE + 1]; int item[MAX_FORCE + 1]; if (db_list) { putenv(next_dbitem()); } if (!q_opt) printf("Terminal type \"%s\"\n", name); setupterm((NCURSES_CONST char *) name, 1, (int *) 0); if (!q_opt) { if (strcmp(name, ttytype)) printf("... actual \"%s\"\n", ttytype); } for (length = 1; length <= MAX_FORCE; ++length) { /* set all digits to zeros */ for (j = 0; j < length; ++j) { item[j] = LegalItem(j, 0); } do { changed = FALSE; /* copy digits to cap-name */ for (j = 0; j < length; ++j) { cap[j] = legal[item[j]]; } cap[length] = '\0'; dumpit(cap, NULL); k = length - 1; do { carry = FALSE; for (; k >= 0; --k) { item[k] += 1; if (legal[item[k]]) { changed = TRUE; break; } if (k > 0 && legal[item[k - 1] + 1]) { for (j = k; j < length; ++j) { item[j] = LegalItem(j, 0); } carry = TRUE; changed = TRUE; } } } while (carry); } while (changed); } del_curterm(cur_term); } #if USE_CODE_LISTS #define fullname(type,n) f_opt ? type##fnames[n] : cap #else #define fullname(type,n) cap #endif static void demo_terminfo(char *name) { unsigned n; NCURSES_CONST char *cap; if (db_list) { putenv(next_dbitem()); } if (!q_opt) printf("Terminal type \"%s\"\n", name); setupterm(name, 1, (int *) 0); if (b_opt) { for (n = 0;; ++n) { cap = my_boolcodes[n]; if (cap == 0) break; dumpit(cap, fullname(bool, n)); } } if (n_opt) { for (n = 0;; ++n) { cap = my_numcodes[n]; if (cap == 0) break; dumpit(cap, fullname(num, n)); } } if (s_opt) { for (n = 0;; ++n) { cap = my_strcodes[n]; if (cap == 0) break; dumpit(cap, fullname(str, n)); } } #ifdef NCURSES_VERSION if (x_opt && (my_blob == 0)) { if (y_opt) { #if NCURSES_XNAMES TERMTYPE *term = (TERMTYPE *) cur_term; if (term != 0 && ((NUM_BOOLEANS(term) != BOOLCOUNT) || (NUM_NUMBERS(term) != NUMCOUNT) || (NUM_STRINGS(term) != STRCOUNT))) { for (n = BOOLCOUNT; n < NUM_BOOLEANS(term); ++n) { dumpit(ExtBoolname(term, (int) n, boolnames), NULL); } for (n = NUMCOUNT; n < NUM_NUMBERS(term); ++n) { dumpit(ExtNumname(term, (int) n, numnames), NULL); } for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) { dumpit(ExtStrname(term, (int) n, strnames), NULL); } } #endif } else { char temp[80]; static const char *xterm_keys[] = { "kDC", "kDN", "kEND", "kHOM", "kIC", "kLFT", "kNXT", "kPRV", "kRIT", "kUP", }; for (n = 0; n < SIZEOF(xterm_keys); ++n) { int mod; for (mod = 0; mod < 8; ++mod) { if (mod == 0) { /* these happen to be standard - avoid duplicates */ if (!strcmp(xterm_keys[n], "kDC") || !strcmp(xterm_keys[n], "kEND") || !strcmp(xterm_keys[n], "kHOM") || !strcmp(xterm_keys[n], "kLFT") || !strcmp(xterm_keys[n], "kRIT")) { continue; } _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%.*s", 8, xterm_keys[n]); } else { _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%.*s%d", 8, xterm_keys[n], mod); } dumpit(temp, NULL); } } } } #endif del_curterm(cur_term); } typedef enum { pDefault = 0 ,pComment ,pDescription ,pEscaped ,pNewline ,pName ,pNumber ,pString } STATE; static void parse_description(const char *input_name) { static char empty[1] = {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; char *name; int r_opt = 1; char *input_name = 0; while ((ch = getopt(argc, argv, OPTS_COMMON "abd:e:fi:nqr:sxy")) != -1) { switch (ch) { case 'a': a_opt = TRUE; break; case 'b': b_opt = TRUE; break; case 'd': d_opt = optarg; break; case 'e': e_opt = optarg; break; case 'f': f_opt = TRUE; break; case 'i': input_name = optarg; break; case 'n': n_opt = TRUE; break; case 'q': q_opt = TRUE; break; case 'r': if ((r_opt = atoi(optarg)) <= 0) usage(FALSE); break; case 's': s_opt = TRUE; break; case 'x': #ifdef NCURSES_VERSION x_opt = TRUE; #endif break; #ifdef NCURSES_VERSION case 'y': y_opt = TRUE; x_opt = TRUE; break; #endif case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } #if HAVE_USE_EXTENDED_NAMES use_extended_names(x_opt); #endif if (!(b_opt || n_opt || s_opt)) { b_opt = TRUE; n_opt = TRUE; s_opt = TRUE; } make_dblist(); if (a_opt) { for (repeat = 0; repeat < r_opt; ++repeat) { if (optind < argc) { for (n = optind; n < argc; ++n) { brute_force(argv[n]); } } else if ((name = getenv("TERM")) != 0) { brute_force(name); } else { static char dumb[] = "dumb"; brute_force(dumb); } } } else { if (input_name != 0) { parse_description(input_name); } #if USE_CODE_LISTS else { my_boolcodes = copy_code_list(boolnames); my_numcodes = copy_code_list(numnames); my_strcodes = copy_code_list(strnames); } #else else { failed("no capability-lists available (use -i option)"); } #endif /* USE_CODE_LISTS */ for (repeat = 0; repeat < r_opt; ++repeat) { if (optind < argc) { for (n = optind; n < argc; ++n) { demo_terminfo(argv[n]); } } else if ((name = getenv("TERM")) != 0) { demo_terminfo(name); } else { static char dumb[] = "dumb"; demo_terminfo(dumb); } } } #define PLURAL(n) n, (n != 1) ? "s" : "" printf("%ld value%s (%ld boolean%s, %ld number%s, %ld string%s)\n", PLURAL(total_values), PLURAL(total_b_values), PLURAL(total_n_values), PLURAL(total_s_values)); #if NO_LEAKS free_dblist(); if (input_name != 0) { if (my_blob != 0) { free(my_blob); free(my_boolcodes); free(my_numcodes); free(my_numvalues); free(my_strcodes); free(my_strvalues); } } #if USE_CODE_LISTS else { free_code_list(my_boolcodes); free_code_list(my_numcodes); free_code_list(my_strcodes); } #endif #endif /* NO_LEAKS */ ExitProgram(EXIT_SUCCESS); } #else /* !HAVE_TIGETSTR */ int main(void) { failed("This program requires the terminfo functions such as tigetstr"); ExitProgram(EXIT_FAILURE); } #endif /* HAVE_TIGETSTR */ ncurses-6.4-20240113/test/bs.c0000644000000000000000000007422314434462126014202 0ustar rootroot/**************************************************************************** * 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. * ****************************************************************************/ /* * 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.79 2023/05/27 20:13:10 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, ship_t * ss, int vis); #define SHIPIT(name, symbol, length) { name, 0, symbol, length, 0,0, 0, FALSE } /* "ply=player", "cpu=computer" */ static ship_t plyship[SHIPTYPES] = { SHIPIT(carrier, 'A', 5), SHIPIT(battle, 'B', 4), SHIPIT(destroy, 'D', 3), SHIPIT(sub, 'S', 3), SHIPIT(ptboat, 'P', 2), }; static ship_t cpuship[SHIPTYPES] = { SHIPIT(carrier, 'A', 5), SHIPIT(battle, 'B', 4), SHIPIT(destroy, 'D', 3), SHIPIT(sub, 'S', 3), SHIPIT(ptboat, 'P', 2), }; /* "Hits" board, and main board. */ static char hits[2][BWIDTH][BDEPTH]; static char board[2][BWIDTH][BDEPTH]; static int turn; /* 0=player, 1=computer */ static int plywon = 0, cpuwon = 0; /* How many games has each won? */ static int salvo, blitz, closepack; #define PR (void)addstr static GCC_NORETURN void uninitgame(int sig); static void uninitgame(int sig GCC_UNUSED) /* end the game, either normally or due to signal */ { clear(); (void) refresh(); (void) reset_shell_mode(); (void) echo(); (void) endwin(); free(your_name); ExitProgram(sig ? EXIT_FAILURE : EXIT_SUCCESS); } static void announceopts(void) /* announce which game options are enabled */ { if (salvo || blitz || closepack) { (void) printw("Playing optional game ("); if (salvo) (void) printw("salvo, "); else (void) printw("nosalvo, "); if (blitz) (void) printw("blitz "); else (void) printw("noblitz, "); if (closepack) (void) printw("closepack)"); else (void) printw("noclosepack)"); } else (void) printw( "Playing standard game (noblitz, nosalvo, noclosepack)"); } static void intro(void) { const char *tmpname; srand((unsigned) (time(0L) + getpid())); /* Kick the random number generator */ InitAndCatch(initscr(), uninitgame); if ((tmpname = getlogin()) != 0 && (your_name = strdup(tmpname)) != 0) { your_name[0] = (char) toupper(UChar(your_name[0])); } else { your_name = strdup(dftname); } keypad(stdscr, TRUE); (void) def_prog_mode(); (void) nonl(); (void) cbreak(); (void) noecho(); #ifdef PENGUIN (void) clear(); MvAddStr(4, 29, "Welcome to Battleship!"); (void) move(8, 0); PR(" \\\n"); PR(" \\ \\ \\\n"); PR(" \\ \\ \\ \\ \\_____________\n"); PR(" \\ \\ \\_____________ \\ \\/ |\n"); PR(" \\ \\/ \\ \\/ |\n"); PR(" \\/ \\_____/ |__\n"); PR(" ________________/ |\n"); PR(" \\ S.S. Penguin |\n"); PR(" \\ /\n"); PR(" \\___________________________________________________/\n"); MvAddStr(22, 27, "Hit any key to continue..."); (void) refresh(); (void) getch(); #endif /* PENGUIN */ #ifdef A_COLOR start_color(); init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK); init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK); init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK); init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK); init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK); init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK); #endif /* A_COLOR */ #ifdef NCURSES_MOUSE_VERSION (void) mousemask(BUTTON1_CLICKED, (mmask_t *) NULL); #endif /* NCURSES_MOUSE_VERSION */ } /* VARARGS1 */ static void prompt(int n, NCURSES_CONST char *f, const char *s) /* print a message at the prompt line */ { (void) move(PROMPTLINE + n, 0); (void) clrtoeol(); (void) printw(f, s); (void) refresh(); } static void error(NCURSES_CONST char *s) { (void) move(PROMPTLINE + 2, 0); (void) clrtoeol(); if (s) { (void) addstr(s); (void) beep(); } } static void placeship(int b, ship_t * ss, int vis) { int l; for (l = 0; l < ss->length; ++l) { int newx = ss->x + l * xincr[ss->dir]; int newy = ss->y + l * yincr[ss->dir]; board[b][newx][newy] = ss->symbol; if (vis) { pgoto(newy, newx); AddCh(ss->symbol); } } ss->hits = 0; } static int rnd(int n) { return (((rand() & 0x7FFF) % n)); } static void randomplace(int b, ship_t * ss) /* generate a valid random ship placement into px,py */ { do { ss->dir = rnd(2) ? dir_E : dir_S; ss->x = rnd(BWIDTH - (ss->dir == dir_E ? ss->length : 0)); ss->y = rnd(BDEPTH - (ss->dir == dir_S ? ss->length : 0)); } while (!checkplace(b, ss, FALSE)); } static void initgame(void) { int i, j, unplaced; ship_t *ss; (void) clear(); MvAddStr(0, 35, "BATTLESHIPS"); (void) move(PROMPTLINE + 2, 0); announceopts(); memset(board, 0, sizeof(char) * BWIDTH * BDEPTH * 2); memset(hits, 0, sizeof(char) * BWIDTH * BDEPTH * 2); for (i = 0; i < SHIPTYPES; i++) { ss = cpuship + i; ss->x = ss->y = ss->dir = ss->hits = 0; ss->placed = FALSE; ss = plyship + i; ss->x = ss->y = ss->dir = ss->hits = 0; ss->placed = FALSE; } /* draw empty boards */ MvAddStr(PYBASE - 2, PXBASE + 5, "Main Board"); MvAddStr(PYBASE - 1, PXBASE - 3, numbers); for (i = 0; i < BDEPTH; ++i) { MvAddCh(PYBASE + i, PXBASE - 3, (chtype) (i + 'A')); #ifdef A_COLOR if (has_colors()) attron(COLOR_PAIR(COLOR_BLUE)); #endif /* A_COLOR */ AddCh(' '); for (j = 0; j < BWIDTH; j++) (void) addstr(" . "); #ifdef A_COLOR (void) attrset(0); #endif /* A_COLOR */ AddCh(' '); AddCh(i + 'A'); } MvAddStr(PYBASE + BDEPTH, PXBASE - 3, numbers); MvAddStr(CYBASE - 2, CXBASE + 7, "Hit/Miss Board"); MvAddStr(CYBASE - 1, CXBASE - 3, numbers); for (i = 0; i < BDEPTH; ++i) { MvAddCh(CYBASE + i, CXBASE - 3, (chtype) (i + 'A')); #ifdef A_COLOR if (has_colors()) attron(COLOR_PAIR(COLOR_BLUE)); #endif /* A_COLOR */ AddCh(' '); for (j = 0; j < BWIDTH; j++) (void) addstr(" . "); #ifdef A_COLOR (void) attrset(0); #endif /* A_COLOR */ AddCh(' '); AddCh(i + 'A'); } MvAddStr(CYBASE + BDEPTH, CXBASE - 3, numbers); MvPrintw(HYBASE, HXBASE, "To position your ships: move the cursor to a spot, then"); MvPrintw(HYBASE + 1, HXBASE, "type the first letter of a ship type to select it, then"); MvPrintw(HYBASE + 2, HXBASE, "type a direction ([hjkl] or [4862]), indicating how the"); MvPrintw(HYBASE + 3, HXBASE, "ship should be pointed. You may also type a ship letter"); MvPrintw(HYBASE + 4, HXBASE, "followed by `r' to position it randomly, or type `R' to"); MvPrintw(HYBASE + 5, HXBASE, "place all remaining ships randomly."); MvAddStr(MYBASE, MXBASE, "Aiming keys:"); MvAddStr(SYBASE, SXBASE, "y k u 7 8 9"); MvAddStr(SYBASE + 1, SXBASE, " \\|/ \\|/ "); MvAddStr(SYBASE + 2, SXBASE, "h-+-l 4-+-6"); MvAddStr(SYBASE + 3, SXBASE, " /|\\ /|\\ "); MvAddStr(SYBASE + 4, SXBASE, "b j n 1 2 3"); /* have the computer place ships */ for (ss = cpuship; ss < cpuship + SHIPTYPES; ss++) { randomplace(COMPUTER, ss); placeship(COMPUTER, ss, FALSE); } do { char c, docked[SHIPTYPES + 2], *cp = docked; ss = (ship_t *) NULL; /* figure which ships still wait to be placed */ *cp++ = 'R'; for (i = 0; i < SHIPTYPES; i++) if (!plyship[i].placed) *cp++ = plyship[i].symbol; *cp = '\0'; /* get a command letter */ prompt(1, "Type one of [%s] to pick a ship.", docked + 1); do { c = (char) getcoord(PLAYER); } while (!(strchr) (docked, c)); if (c == 'R') (void) ungetch('R'); else { /* map that into the corresponding symbol */ for (ss = plyship; ss < plyship + SHIPTYPES; ss++) if (ss->symbol == c) break; prompt(1, "Type one of [hjklrR] to place your %s.", ss->name); pgoto(cury, curx); } do { c = (char) getch(); } while (!(strchr("hjkl8462rR", c) || c == FF || is_QUIT(c))); if (is_QUIT(c)) { uninitgame(0); } else if (c == FF) { (void) clearok(stdscr, TRUE); (void) refresh(); } else if (ss == 0) { beep(); /* simple to verify, unlikely to happen */ } else if (c == 'r') { prompt(1, "Random-placing your %s", ss->name); randomplace(PLAYER, ss); placeship(PLAYER, ss, TRUE); error((char *) NULL); ss->placed = TRUE; } else if (c == 'R') { prompt(1, "Placing the rest of your fleet at random...", ""); for (ss = plyship; ss < plyship + SHIPTYPES; ss++) if (!ss->placed) { randomplace(PLAYER, ss); placeship(PLAYER, ss, TRUE); ss->placed = TRUE; } error((char *) NULL); } else if (strchr("hjkl8462", c)) { ss->x = curx; ss->y = cury; switch (c) { case 'k': case '8': ss->dir = dir_N; break; case 'j': case '2': ss->dir = dir_S; break; case 'h': case '4': ss->dir = dir_W; break; case 'l': case '6': ss->dir = dir_E; break; } if (checkplace(PLAYER, ss, TRUE)) { placeship(PLAYER, ss, TRUE); error((char *) NULL); ss->placed = TRUE; } } for (unplaced = i = 0; i < SHIPTYPES; i++) unplaced += !plyship[i].placed; } while (unplaced); turn = rnd(2); MvPrintw(HYBASE, HXBASE, "To fire, move the cursor to your chosen aiming point "); MvPrintw(HYBASE + 1, HXBASE, "and strike any key other than a motion key. "); MvPrintw(HYBASE + 2, HXBASE, " "); MvPrintw(HYBASE + 3, HXBASE, " "); MvPrintw(HYBASE + 4, HXBASE, " "); MvPrintw(HYBASE + 5, HXBASE, " "); (void) prompt(0, "Press any key to start...", ""); (void) getch(); } static int getcoord(int atcpu) { if (atcpu) cgoto(cury, curx); else pgoto(cury, curx); (void) refresh(); for (;;) { int ny, nx, c; if (atcpu) { MvPrintw(CYBASE + BDEPTH + 1, CXBASE + 11, "(%d, %c)", curx, 'A' + cury); cgoto(cury, curx); } else { MvPrintw(PYBASE + BDEPTH + 1, PXBASE + 11, "(%d, %c)", curx, 'A' + cury); pgoto(cury, curx); } switch (c = getch()) { case 'k': case '8': case KEY_UP: ny = cury + BDEPTH - 1; nx = curx; break; case 'j': case '2': case KEY_DOWN: ny = cury + 1; nx = curx; break; case 'h': case '4': case KEY_LEFT: ny = cury; nx = curx + BWIDTH - 1; break; case 'l': case '6': case KEY_RIGHT: ny = cury; nx = curx + 1; break; case 'y': case '7': case KEY_A1: ny = cury + BDEPTH - 1; nx = curx + BWIDTH - 1; break; case 'b': case '1': case KEY_C1: ny = cury + 1; nx = curx + BWIDTH - 1; break; case 'u': case '9': case KEY_A3: ny = cury + BDEPTH - 1; nx = curx + 1; break; case 'n': case '3': case KEY_C3: ny = cury + 1; nx = curx + 1; break; case FF: nx = curx; ny = cury; (void) clearok(stdscr, TRUE); (void) refresh(); break; #ifdef NCURSES_MOUSE_VERSION case KEY_MOUSE: { MEVENT myevent; getmouse(&myevent); if (atcpu && myevent.y >= CY(0) && myevent.y <= CY(BDEPTH) && myevent.x >= CX(0) && myevent.x <= CX(BDEPTH)) { curx = CXINV(myevent.x); cury = CYINV(myevent.y); return (' '); } else { beep(); continue; } } /* no fall through */ #endif /* NCURSES_MOUSE_VERSION */ default: if (atcpu) MvAddStr(CYBASE + BDEPTH + 1, CXBASE + 11, " "); else MvAddStr(PYBASE + BDEPTH + 1, PXBASE + 11, " "); return (c); } curx = nx % BWIDTH; cury = ny % BDEPTH; } } static bool collidecheck(int b, int y, int x) /* is this location on the selected zboard adjacent to a ship? */ { bool collide; /* anything on the square */ if ((collide = IS_SHIP(board[b][x][y])) != FALSE) return (collide); /* anything on the neighbors */ if (!closepack) { int i; for (i = 0; i < dir_MAX; i++) { int xend, yend; yend = y + yincr[i]; xend = x + xincr[i]; if (ONBOARD(xend, yend) && IS_SHIP(board[b][xend][yend])) { collide = TRUE; break; } } } return (collide); } static bool checkplace(int b, ship_t * ss, int vis) { int l, xend, yend; /* first, check for board edges */ xend = ss->x + (ss->length - 1) * xincr[ss->dir]; yend = ss->y + (ss->length - 1) * yincr[ss->dir]; if (!ONBOARD(xend, yend)) { if (vis) switch (rnd(3)) { case 0: error("Ship is hanging from the edge of the world"); break; case 1: error("Try fitting it on the board"); break; case 2: error("Figure I won't find it if you put it there?"); break; } return (FALSE); } for (l = 0; l < ss->length; ++l) { if (collidecheck(b, ss->y + l * yincr[ss->dir], ss->x + l * xincr[ss->dir])) { if (vis) switch (rnd(3)) { case 0: error("There's already a ship there"); break; case 1: error("Collision alert! Aaaaaagh!"); break; case 2: error("Er, Admiral, what about the other ship?"); break; } return (FALSE); } } return (TRUE); } static int awinna(void) { int i, j; for (i = 0; i < 2; ++i) { ship_t *ss = (i) ? cpuship : plyship; for (j = 0; j < SHIPTYPES; ++j, ++ss) if (ss->length > ss->hits) break; if (j == SHIPTYPES) return (OTHER); } return (-1); } static ship_t * hitship(int x, int y) /* register a hit on the targeted ship */ { ship_t *sb, *ss; char sym; int oldx, oldy; getyx(stdscr, oldy, oldx); sb = (turn) ? plyship : cpuship; if ((sym = board[OTHER][x][y]) == 0) return ((ship_t *) NULL); for (ss = sb; ss < sb + SHIPTYPES; ++ss) if (ss->symbol == sym) { if (++ss->hits < ss->length) /* still afloat? */ return ((ship_t *) NULL); else { /* sunk! */ int i; if (!closepack) { int j; for (j = -1; j <= 1; j++) { int bx = ss->x + j * xincr[(ss->dir + 2) % dir_MAX]; int by = ss->y + j * yincr[(ss->dir + 2) % dir_MAX]; for (i = -1; i <= ss->length; ++i) { int x1, y1; x1 = bx + i * xincr[ss->dir]; y1 = by + i * yincr[ss->dir]; if (ONBOARD(x1, y1)) { hits[turn][x1][y1] = MARK_MISS; if (turn % 2 == PLAYER) { cgoto(y1, x1); #ifdef A_COLOR if (has_colors()) attron(COLOR_PAIR(COLOR_GREEN)); #endif /* A_COLOR */ AddCh(MARK_MISS); #ifdef A_COLOR (void) attrset(0); #endif /* A_COLOR */ } else { pgoto(y1, x1); AddCh(SHOWSPLASH); } } } } } for (i = 0; i < ss->length; ++i) { int x1 = ss->x + i * xincr[ss->dir]; int y1 = ss->y + i * yincr[ss->dir]; hits[turn][x1][y1] = ss->symbol; if (turn % 2 == PLAYER) { cgoto(y1, x1); AddCh(ss->symbol); } else { pgoto(y1, x1); #ifdef A_COLOR if (has_colors()) attron(COLOR_PAIR(COLOR_RED)); #endif /* A_COLOR */ AddCh(SHOWHIT); #ifdef A_COLOR (void) attrset(0); #endif /* A_COLOR */ } } (void) move(oldy, oldx); return (ss); } } (void) move(oldy, oldx); return ((ship_t *) NULL); } static bool plyturn(void) { ship_t *ss; bool hit; NCURSES_CONST char *m = NULL; prompt(1, "Where do you want to shoot? ", ""); for (;;) { (void) getcoord(COMPUTER); if (hits[PLAYER][curx][cury]) { prompt(1, "You shelled this spot already! Try again.", ""); beep(); } else break; } hit = IS_SHIP(board[COMPUTER][curx][cury]); hits[PLAYER][curx][cury] = (char) (hit ? MARK_HIT : MARK_MISS); cgoto(cury, curx); #ifdef A_COLOR if (has_colors()) { if (hit) attron(COLOR_PAIR(COLOR_RED)); else attron(COLOR_PAIR(COLOR_GREEN)); } #endif /* A_COLOR */ AddCh(hits[PLAYER][curx][cury]); #ifdef A_COLOR (void) attrset(0); #endif /* A_COLOR */ prompt(1, "You %s.", hit ? "scored a hit" : "missed"); if (hit && (ss = hitship(curx, cury))) { switch (rnd(5)) { case 0: m = " You sank my %s!"; break; case 1: m = " I have this sinking feeling about my %s...."; break; case 2: m = " My %s has gone to Davy Jones's locker!"; break; case 3: m = " Glub, glub -- my %s is headed for the bottom!"; break; case 4: m = " You'll pick up survivors from my %s, I hope...!"; break; } if (m != 0) { (void) printw(m, ss->name); } (void) beep(); } return (hit); } static int sgetc(const char *s) { (void) refresh(); for (;;) { int ch = getch(); const char *s1; if (islower(ch)) ch = toupper(ch); if (is_QUIT(ch)) uninitgame(0); for (s1 = s; *s1 && ch != *s1; ++s1) { /* 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 */ ncurses-6.4-20240113/test/testscanw.c0000644000000000000000000000724414345217765015620 0ustar rootroot/**************************************************************************** * Copyright 2019-2020,2022 Thomas E. Dickey * * Copyright 1998-2002,2006 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* gleaned from a web-search, shows a bug combining scanw and implicit scroll. * Date: 1997/03/17 * From: bayern@morpheus.cis.yale.edu * * $Id: testscanw.c,v 1.15 2022/12/11 00:10:29 tom Exp $ */ #include static void usage(int ok) { static const char *msg[] = { "Usage: testscanw [options] tokens" ,"" ,"Tokens are integers (starting line-number) or k+, k- to turn keypad on/off." ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { long badanswer = 1; long *response = &badanswer; int ch; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } setlocale(LC_ALL, ""); initscr(); scrollok(stdscr, TRUE); idlok(stdscr, TRUE); echo(); #if 0 curses_trace(TRACE_UPDATE | TRACE_CALLS); #endif while (optind < argc) { char *token = argv[optind++]; if (isdigit(UChar(*token))) move(atoi(token), 0); else if (!strcmp(token, "k+")) keypad(stdscr, TRUE); else if (!strcmp(token, "k-")) keypad(stdscr, FALSE); } while (badanswer) { printw("Enter a number (0 to quit):\n"); printw("--> "); scanw("%20ld", response); /* yes, it's a pointer */ } endwin(); ExitProgram(EXIT_SUCCESS); } ncurses-6.4-20240113/test/color_name.h0000644000000000000000000000667214041124351015711 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2021 Thomas E. Dickey * * Copyright 2011-2012,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: color_name.h,v 1.9 2021/04/24 23:25:29 tom Exp $ */ #ifndef __COLORNAME_H #define __COLORNAME_H 1 #ifndef __TEST_PRIV_H #include #endif static NCURSES_CONST char *const the_color_names[] = { "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", "BLACK", "RED", "GREEN", "YELLOW", "BLUE", "MAGENTA", "CYAN", "WHITE" }; #ifdef NEED_COLOR_CODE static int color_code(const char *color) { int result = 0; char *endp = 0; size_t n; if ((result = (int) strtol(color, &endp, 0)) >= 0 && (endp == 0 || *endp == 0)) { ; } else if (!strcmp(color, "default")) { result = -1; } else { for (n = 0; n < SIZEOF(the_color_names); ++n) { if (!strcmp(the_color_names[n], color)) { result = (int) n; break; } } } return result; } #endif /* NEED_COLOR_CODE */ #ifdef NEED_COLOR_NAME static const char * color_name(int color) { static char temp[20]; const char *result = 0; if (color >= (int) SIZEOF(the_color_names)) { _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%d", color); result = temp; } else if (color < 0) { result = "default"; } else { result = the_color_names[color]; } return result; } #endif /* NEED_COLOR_NAME */ #endif /* __COLORNAME_H */ ncurses-6.4-20240113/test/keynames.c0000644000000000000000000000711414342766153015412 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/test/savescreen.c0000644000000000000000000003506114345212357015731 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,2022 Thomas E. Dickey * * Copyright 2006-2017,2018 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: savescreen.c,v 1.62 2022/12/10 23:23:27 tom Exp $ * * Demonstrate save/restore functions from the curses library. * Thomas Dickey - 2007/7/14 */ #define NEED_TIME_H #include #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(char *filename) { int result; if (use_init) { if ((result = scr_init(filename)) != ERR) result = scr_restore(filename); } else { result = scr_set(filename); } return result; } /* * scr_restore() or scr_set() operates on curscr. If we read a character using * getch() that will refresh stdscr, wiping out the result. To avoid that, * copy the data back from curscr to stdscr. */ static void after_load(void) { overwrite(curscr, stdscr); doupdate(); } static void show_what(int color, int which, int last) { int y, x, n; time_t now; char *mytime; getyx(stdscr, y, x); move(0, 0); printw("Color %d. Saved %d of %d (? for help)", color, which, last + 1); now = time((time_t *) 0); mytime = ctime(&now); for (n = (int) strlen(mytime) - 1; n >= 0; --n) { if (isspace(UChar(mytime[n]))) { mytime[n] = '\0'; } else { break; } } mvprintw(0, (COLS - n - 2), " %s", mytime); move(y, x); refresh(); } static int get_command(int color, int which, int last) { int ch; timeout(50); do { show_what(color, which, last); ch = getch(); } while (ch == ERR); return ch; } static int dump_screen(char **files, int color, int which, int last, bool use_colors) { #if USE_WIDEC_SUPPORT cchar_t mycc; #endif char *filename = files[which]; bool dumped = FALSE; if (filename != 0) { dumped = TRUE; show_what(color, ++which, last); if (scr_dump(filename) == ERR) { endwin(); printf("Cannot write screen-dump %s\n", filename); cleanup(files); ExitProgram(EXIT_SUCCESS); } if (use_colors) { int cx, cy; int pair = 1 + (which % MAX_ANSI); /* * Change the background color, to make it more obvious. But that * changes the existing text-color. Copy the old values from the * currently displayed screen. */ bkgd((chtype) COLOR_PAIR(pair)); for (cy = 1; cy < LINES; ++cy) { for (cx = 0; cx < COLS; ++cx) { wmove(curscr, cy, cx); wmove(stdscr, cy, cx); #if USE_WIDEC_SUPPORT if (win_wch(curscr, &mycc) != ERR) { int myxx = wcwidth(BaseChar(mycc)); if (myxx > 0) { wadd_wchnstr(stdscr, &mycc, 1); cx += (myxx - 1); } } #else waddch(stdscr, winch(curscr)); #endif } } } } return dumped; } static void editor_help(void) { static const char *msgs[] = { "You are now in the screen-editor, which allows you to make some", "lines on the screen, as well as save copies of the screen to a", "temporary file", "", "Keys:", " q quit", " n run the screen-loader to show the saved screens", " dump a screen", "", " a toggle between '#' and graphic symbol for drawing", " c change color drawn by line to next in palette", " h,j,k,l or arrows to move around the screen, drawing", 0 }; popup_msg(stdscr, msgs); } static void replay_help(void) { static const char *msgs[] = { "You are now in the screen-loader, which allows you to view", "the dumped/restored screens.", "", "Keys:", " q quit", " 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; 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 ncurses-6.4-20240113/test/test_inwstr.c0000644000000000000000000001644414345216267016170 0ustar rootroot/**************************************************************************** * Copyright 2020,2022 Thomas E. Dickey * * Copyright 2007-2010,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: test_inwstr.c,v 1.8 2022/12/10 23:56:39 tom Exp $ * * Author: Thomas E Dickey * * Demonstrate the inwstr functions from the curses library. int inwstr(wchar_t *str); int innwstr(wchar_t *str, int n); int winwstr(WINDOW *win, wchar_t *str); int winnwstr(WINDOW *win, wchar_t *str, int n); int mvinwstr(int y, int x, wchar_t *str); int mvinnwstr(int y, int x, wchar_t *str, int n); int mvwinwstr(WINDOW *win, int y, int x, wchar_t *str); int mvwinnwstr(WINDOW *win, int y, int x, wchar_t *str, int n); */ #include #if USE_WIDEC_SUPPORT #define BASE_Y 6 #define MAX_COLS 1024 static bool Quit(int ch) { return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE); } static void show_1st(WINDOW *win, int line, wchar_t *buffer) { (void) mvwaddwstr(win, line, 5, buffer); } static void showmore(WINDOW *win, int line, wchar_t *buffer) { wmove(win, line, 0); wclrtoeol(win); show_1st(win, line, buffer); } static int recursive_test(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) { WINDOW *txtbox = 0; WINDOW *txtwin = 0; FILE *fp; int ch; int txt_x = 0, txt_y = 0; int base_y; int limit = getmaxx(strwin) - 5; wchar_t buffer[MAX_COLS]; if (argv[level] == 0) { beep(); return FALSE; } if (level > 1) { txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level); box(txtbox, 0, 0); wnoutrefresh(txtbox); txtwin = derwin(txtbox, getmaxy(txtbox) - 2, getmaxx(txtbox) - 2, 1, 1); base_y = 0; } else { txtwin = stdscr; base_y = BASE_Y; } keypad(txtwin, TRUE); /* enable keyboard mapping */ (void) cbreak(); /* take input chars one at a time, no wait for \n */ (void) noecho(); /* don't echo input */ txt_y = base_y; txt_x = 0; wmove(txtwin, txt_y, txt_x); if ((fp = fopen(argv[level], "r")) != 0) { while ((ch = fgetc(fp)) != EOF) { if (waddch(txtwin, UChar(ch)) != OK) { break; } } fclose(fp); } else { wprintw(txtwin, "Cannot open:\n%s", argv[1]); } while (!Quit(ch = mvwgetch(txtwin, txt_y, txt_x))) { switch (ch) { case KEY_DOWN: case 'j': if (txt_y < getmaxy(txtwin) - 1) txt_y++; else beep(); break; case KEY_UP: case 'k': if (txt_y > base_y) txt_y--; else beep(); break; case KEY_LEFT: case 'h': if (txt_x > 0) txt_x--; else beep(); break; case KEY_RIGHT: case 'l': if (txt_x < getmaxx(txtwin) - 1) txt_x++; else beep(); break; case 'w': recursive_test(level + 1, argv, chrwin, strwin); if (txtbox != 0) { touchwin(txtbox); wnoutrefresh(txtbox); } else { touchwin(txtwin); wnoutrefresh(txtwin); } break; case '-': if (limit > 0) { --limit; } else { beep(); } break; case '+': ++limit; break; default: beep(); break; } MvWPrintw(chrwin, 0, 0, "line:"); wclrtoeol(chrwin); if (txtwin != stdscr) { wmove(txtwin, txt_y, txt_x); if (winwstr(txtwin, buffer) != ERR) { show_1st(chrwin, 0, buffer); } if (mvwinwstr(txtwin, txt_y, txt_x, buffer) != ERR) { showmore(chrwin, 1, buffer); } } else { move(txt_y, txt_x); if (inwstr(buffer) != ERR) { show_1st(chrwin, 0, buffer); } if (mvinwstr(txt_y, txt_x, buffer) != ERR) { showmore(chrwin, 1, buffer); } } wnoutrefresh(chrwin); MvWPrintw(strwin, 0, 0, "%4d:", limit); wclrtobot(strwin); if (txtwin != stdscr) { wmove(txtwin, txt_y, txt_x); if (winnwstr(txtwin, buffer, limit) != ERR) { show_1st(strwin, 0, buffer); } if (mvwinnwstr(txtwin, txt_y, txt_x, buffer, limit) != ERR) { showmore(strwin, 1, buffer); } } else { move(txt_y, txt_x); if (innwstr(buffer, limit) != ERR) { show_1st(strwin, 0, buffer); } if (mvinnwstr(txt_y, txt_x, buffer, limit) != ERR) { showmore(strwin, 1, buffer); } } wnoutrefresh(strwin); } if (level > 1) { delwin(txtwin); delwin(txtbox); } return TRUE; } static void usage(int ok) { static const char *msg[] = { "Usage: test_inwstr [options] [file1 [...]]" ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { WINDOW *chrbox; WINDOW *chrwin; WINDOW *strwin; int ch; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } setlocale(LC_ALL, ""); if (optind + 1 > argc) usage(FALSE); initscr(); chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0); box(chrbox, 0, 0); wnoutrefresh(chrbox); chrwin = derwin(chrbox, 2, COLS - 2, 1, 1); strwin = derwin(chrbox, 2, COLS - 2, 3, 1); recursive_test(optind, argv, chrwin, strwin); endwin(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the wide-ncurses library\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/test_arrays.c0000644000000000000000000001506214345212357016132 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/test/popup_msg.h0000644000000000000000000000474413615656212015616 0ustar rootroot/**************************************************************************** * Copyright 2018,2020 Thomas E. Dickey * * Copyright 2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: popup_msg.h,v 1.5 2020/02/02 23:34:34 tom Exp $ * * Utility functions for a popup-message or help-screen. */ #ifndef POPUP_MSG_H_incl #define POPUP_MSG_H_incl 1 #include extern void popup_msg(WINDOW *parent, const char *const *msg); extern void popup_msg2(WINDOW *parent, char **msg); #endif /* POPUP_MSG_H_incl */ ncurses-6.4-20240113/test/package/0000755000000000000000000000000014546071001015005 5ustar rootrootncurses-6.4-20240113/test/package/ncurses-examples.spec0000644000000000000000000000550014376512571021174 0ustar rootrootSummary: 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 ncurses-6.4-20240113/test/package/mingw-ncurses-examples.spec0000644000000000000000000000646714376512552022327 0ustar rootrootSummary: 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 ncurses-6.4-20240113/test/package/debian-mingw64/0000755000000000000000000000000014546071001017520 5ustar rootrootncurses-6.4-20240113/test/package/debian-mingw64/copyright0000644000000000000000000000737614546071001021470 0ustar rootrootUpstream 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 ncurses-6.4-20240113/test/package/debian-mingw64/docs0000644000000000000000000000000711411671635020377 0ustar rootrootREADME ncurses-6.4-20240113/test/package/debian-mingw64/compat0000644000000000000000000000000314336245362020731 0ustar rootroot12 ncurses-6.4-20240113/test/package/debian-mingw64/rules0000755000000000000000000000452114340537664020620 0ustar rootroot#!/usr/bin/make -f # Made with the aid of dh_make, by Craig Small # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. # Some lines taken from debmake, by Cristoph Lameter. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic NCURSES_PKG = ncurses-examples TARGET = x86_64-w64-mingw32 MINGW_BIN = /usr/bin MINGW_TOP = /usr/$(TARGET) MINGW_TMP = $(CURDIR)/debian/mingw64-ncurses-examples CFLAGS = $(CC_NORMAL) ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif configure: configure-stamp configure-stamp: dh_testdir CFLAGS="$(CFLAGS)" ./configure \ --host=$(TARGET) \ --target=$(TARGET) \ --prefix=$(MINGW_TOP) \ --bindir=\$${prefix}/bin/$(NCURSES_PKG) \ --datadir=\$${prefix}/share/$(NCURSES_PKG) \ --with-screen=ncursesw6 \ --with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir $(MAKE) touch build-stamp clean: dh_testdir dh_testroot [ ! -f makefile ] || $(MAKE) distclean rm -f configure-stamp build-stamp install-stamp dh_clean install: install-stamp install-stamp: build-stamp dh_testdir dh_testroot dh_prep dh_installdirs $(MAKE) install DESTDIR=$(MINGW_TMP) touch install-stamp # Build architecture-independent files here. binary-indep: build install # No binary-indep target. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installdocs dh_installexamples dh_installchangelogs NEWS dh_strip dh_compress dh_fixperms dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install install-stamp ncurses-6.4-20240113/test/package/debian-mingw64/control0000644000000000000000000000115514336245400021130 0ustar rootrootSource: 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. ncurses-6.4-20240113/test/package/debian-mingw64/source/0000755000000000000000000000000012525673460021034 5ustar rootrootncurses-6.4-20240113/test/package/debian-mingw64/source/format0000644000000000000000000000001512525673460022243 0ustar rootroot3.0 (native) ncurses-6.4-20240113/test/package/debian-mingw64/watch0000644000000000000000000000017213213045134020547 0ustar rootrootversion=3 opts=passive ftp://ftp.invisible-island.net/ncurses-examples/ncurses-examples-([\d.]+)\.tgz \ debian uupdate ncurses-6.4-20240113/test/package/debian-mingw/0000755000000000000000000000000014546070737017365 5ustar rootrootncurses-6.4-20240113/test/package/debian-mingw/copyright0000644000000000000000000000737614546070737021335 0ustar rootrootUpstream 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 ncurses-6.4-20240113/test/package/debian-mingw/docs0000644000000000000000000000000711411671635020225 0ustar rootrootREADME ncurses-6.4-20240113/test/package/debian-mingw/compat0000644000000000000000000000000314336245335020557 0ustar rootroot12 ncurses-6.4-20240113/test/package/debian-mingw/rules0000755000000000000000000000451714340537664020453 0ustar rootroot#!/usr/bin/make -f # Made with the aid of dh_make, by Craig Small # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. # Some lines taken from debmake, by Cristoph Lameter. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic NCURSES_PKG = ncurses-examples TARGET = i686-w64-mingw32 MINGW_BIN = /usr/bin MINGW_TOP = /usr/$(TARGET) MINGW_TMP = $(CURDIR)/debian/mingw32-ncurses-examples CFLAGS = $(CC_NORMAL) ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif configure: configure-stamp configure-stamp: dh_testdir CFLAGS="$(CFLAGS)" ./configure \ --host=$(TARGET) \ --target=$(TARGET) \ --prefix=$(MINGW_TOP) \ --bindir=\$${prefix}/bin/$(NCURSES_PKG) \ --datadir=\$${prefix}/share/$(NCURSES_PKG) \ --with-screen=ncursesw6 \ --with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir $(MAKE) touch build-stamp clean: dh_testdir dh_testroot [ ! -f makefile ] || $(MAKE) distclean rm -f configure-stamp build-stamp install-stamp dh_clean install: install-stamp install-stamp: build-stamp dh_testdir dh_testroot dh_prep dh_installdirs $(MAKE) install DESTDIR=$(MINGW_TMP) touch install-stamp # Build architecture-independent files here. binary-indep: build install # No binary-indep target. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installdocs dh_installexamples dh_installchangelogs NEWS dh_strip dh_compress dh_fixperms dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install install-stamp ncurses-6.4-20240113/test/package/debian-mingw/control0000644000000000000000000000115514336245352020764 0ustar rootrootSource: 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. ncurses-6.4-20240113/test/package/debian-mingw/source/0000755000000000000000000000000012525673460020662 5ustar rootrootncurses-6.4-20240113/test/package/debian-mingw/source/format0000644000000000000000000000001512525673460022071 0ustar rootroot3.0 (native) ncurses-6.4-20240113/test/package/debian-mingw/watch0000644000000000000000000000017213213045141020373 0ustar rootrootversion=3 opts=passive ftp://ftp.invisible-island.net/ncurses-examples/ncurses-examples-([\d.]+)\.tgz \ debian uupdate ncurses-6.4-20240113/test/package/debian/0000755000000000000000000000000014546070702016236 5ustar rootrootncurses-6.4-20240113/test/package/debian/copyright0000644000000000000000000000737614546070702020206 0ustar rootrootUpstream 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 ncurses-6.4-20240113/test/package/debian/docs0000644000000000000000000000000711411671635017106 0ustar rootrootREADME ncurses-6.4-20240113/test/package/debian/compat0000644000000000000000000000000314336245323017435 0ustar rootroot12 ncurses-6.4-20240113/test/package/debian/rules0000755000000000000000000001102414157475544017327 0ustar rootroot#!/usr/bin/make -f # Made with the aid of dh_make, by Craig Small # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. # Some lines taken from debmake, by Cristoph Lameter. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # packages NCURSES_PKG = ncurses-examples NCURSEST_PKG = ncursest-examples PACKAGES.indep = # ncurses-examples-docs PACKAGES.arch = $(NCURSES_PKG) $(NCURSEST_PKG) # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) CFLAGS = $(shell dpkg-buildflags --get CFLAGS) CPPFLAGS = $(shell dpkg-buildflags --get CPPFLAGS) LDFLAGS = $(shell dpkg-buildflags --get LDFLAGS) ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif verbose = # -v configure = \ CFLAGS="$(CFLAGS)" \ CPPFLAGS="$(CPPFLAGS)" \ LDFLAGS="$(LDFLAGS)" ../../configure \ --host=$(DEB_HOST_GNU_TYPE) \ --build=$(DEB_BUILD_GNU_TYPE) \ --prefix=/usr \ --disable-rpath-hack .PHONY: all config build install binary clean config-indep config-arch \ build-indep build-arch install-indep install-arch binary-indep \ binary-arch all: build config: config-indep config-arch build: build-indep build-arch install: install-indep install-arch binary: binary-indep binary-arch clean: dh_testdir dh_testroot dh_clean $(verbose) rm -rf t config-indep: $(PACKAGES.indep:%=config-%-stamp) config-arch: $(PACKAGES.arch:%=config-%-stamp) build-indep: $(PACKAGES.indep:%=build-%-stamp) build-arch: $(PACKAGES.arch:%=build-%-stamp) install-indep: $(PACKAGES.indep:%=install-%-stamp) install-arch: $(PACKAGES.arch:%=install-%-stamp) config-$(NCURSES_PKG)-stamp: dh_testdir rm -rf t/ncurses6 mkdir -p t/ncurses6 cd t/ncurses6; $(configure) \ --datadir=\$${datarootdir}/$(NCURSES_PKG) \ --with-screen=ncursesw6 touch $@ config-$(NCURSEST_PKG)-stamp: dh_testdir rm -rf t/ncursest6 mkdir -p t/ncursest6 cd t/ncursest6; $(configure) \ --datadir=\$${datarootdir}/$(NCURSEST_PKG) \ --with-screen=ncursestw6 touch $@ build-$(NCURSES_PKG)-stamp: config-$(NCURSES_PKG)-stamp dh_testdir $(MAKE) -C t/ncurses6 touch $@ build-$(NCURSEST_PKG)-stamp: config-$(NCURSEST_PKG)-stamp dh_testdir $(MAKE) -C t/ncursest6 touch $@ install-$(NCURSES_PKG)-stamp: build-$(NCURSES_PKG)-stamp dh_testdir dh_testroot dh_installdirs $(verbose) dh_prep $(verbose) -p$(NCURSES_PKG) $(MAKE) -C t/ncurses6 install \ PACKAGE=$(NCURSES_PKG) \ DESTDIR=$(CURDIR)/debian/$(NCURSES_PKG) touch $@ install-$(NCURSEST_PKG)-stamp: build-$(NCURSEST_PKG)-stamp dh_testdir dh_testroot dh_installdirs $(verbose) dh_prep $(verbose) -p$(NCURSEST_PKG) $(MAKE) -C t/ncursest6 install \ PACKAGE=$(NCURSEST_PKG) \ DESTDIR=$(CURDIR)/debian/$(NCURSEST_PKG) touch $@ # Build architecture-independent files here. binary-indep: install-indep ifneq ($(PACKAGES.indep),) rm -f $(PACKAGES.indep:%=install-%-stamp) dh_testdir dh_testroot dh_installdocs $(verbose) $(PACKAGES.indep:%=-p%) dh_installman $(verbose) $(PACKAGES.indep:%=-p%) dh_installexamples $(verbose) $(PACKAGES.indep:%=-p%) dh_installchangelogs $(verbose) $(PACKAGES.indep:%=-p%) NEWS dh_compress $(verbose) $(PACKAGES.indep:%=-p%) dh_fixperms $(verbose) $(PACKAGES.indep:%=-p%) dh_installdeb $(verbose) $(PACKAGES.indep:%=-p%) dh_gencontrol $(verbose) $(PACKAGES.indep:%=-p%) dh_md5sums $(verbose) $(PACKAGES.indep:%=-p%) dh_builddeb $(verbose) $(PACKAGES.indep:%=-p%) endif # Build architecture-dependent files here. binary-arch: install-arch ifneq ($(PACKAGES.arch),) rm -f $(PACKAGES.arch:%=install-%-stamp) dh_testdir dh_testroot dh_installdocs $(verbose) $(PACKAGES.arch:%=-p%) dh_installchangelogs $(verbose) $(PACKAGES.arch:%=-p%) NEWS dh_strip $(verbose) $(PACKAGES.arch:%=-p%) dh_compress $(verbose) $(PACKAGES.arch:%=-p%) dh_fixperms $(verbose) $(PACKAGES.arch:%=-p%) dh_installdeb $(verbose) $(PACKAGES.arch:%=-p%) dh_makeshlibs $(verbose) $(PACKAGES.arch:%=-p%) dh_shlibdeps $(verbose) $(PACKAGES.arch:%=-p%) dh_gencontrol $(verbose) $(PACKAGES.arch:%=-p%) dh_md5sums $(verbose) $(PACKAGES.arch:%=-p%) dh_builddeb $(verbose) $(PACKAGES.arch:%=-p%) endif ncurses-6.4-20240113/test/package/debian/control0000644000000000000000000000155214336245306017645 0ustar rootrootSource: 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. ncurses-6.4-20240113/test/package/debian/source/0000755000000000000000000000000012525673460017543 5ustar rootrootncurses-6.4-20240113/test/package/debian/source/format0000644000000000000000000000001512525673460020752 0ustar rootroot3.0 (native) ncurses-6.4-20240113/test/package/debian/watch0000644000000000000000000000017213213045146017261 0ustar rootrootversion=3 opts=passive ftp://ftp.invisible-island.net/ncurses-examples/ncurses-examples-([\d.]+)\.tgz \ debian uupdate ncurses-6.4-20240113/test/dots_curses.c0000644000000000000000000001400214356325054016121 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/test/cardfile.c0000644000000000000000000003323614342766153015353 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,2022 Thomas E. Dickey * * Copyright 1999-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * Author: Thomas E. Dickey * * $Id: cardfile.c,v 1.51 2022/12/04 00:40:11 tom Exp $ * * File format: text beginning in column 1 is a title; other text is content. */ #include #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(char *title) { CARD *card; for (card = all_cards; card != 0; card = card->link) if (!strcmp(card->title, title)) break; return card; } static void read_data(char *fname) { FILE *fp; if ((fp = fopen(fname, "r")) != 0) { CARD *card = 0; char buffer[BUFSIZ]; while (fgets(buffer, sizeof(buffer), fp)) { trim(buffer); if (isspace(UChar(*buffer))) { if (card == 0) card = add_title(""); add_content(card, buffer); } else if ((card = find_card(buffer)) == 0) { card = add_title(buffer); } } fclose(fp); } } /*******************************************************************************/ static void write_data(const char *fname) { FILE *fp; if (!strcmp(fname, default_name)) fname = "cardfile.out"; if ((fp = fopen(fname, "w")) != 0) { CARD *p = 0; for (p = all_cards; p != 0; p = p->link) { FIELD **f = form_fields(p->form); int n; for (n = 0; f[n] != 0; n++) { char *s = field_buffer(f[n], 0); if (s != 0 && (s = strdup(s)) != 0) { trim(s); fprintf(fp, "%s%s\n", n ? "\t" : "", s); free(s); } } } fclose(fp); } } /*******************************************************************************/ /* * Count the cards */ static int count_cards(void) { CARD *p; int count = 0; for (p = all_cards; p != 0; p = p->link) count++; return count; } /* * Shuffle the panels to keep them in a natural hierarchy. */ static void order_cards(CARD * first, int depth) { if (first) { if (depth && first->link) order_cards(first->link, depth - 1); if (isVisible(first)) top_panel(first->panel); } } /* * Return the next card in the list */ static CARD * next_card(CARD * now) { if (now->link != 0) { CARD *tst = now->link; if (isVisible(tst)) now = tst; else (void) next_card(tst); } return now; } /* * Return the previous card in the list */ static CARD * prev_card(CARD * now) { CARD *p; for (p = all_cards; p != 0; p = p->link) { if (p->link == now) { if (!isVisible(p)) p = prev_card(p); return p; } } return now; } /* * Returns the first card in the list that we will display. */ static CARD * first_card(CARD * now) { if (now != NULL && !isVisible(now)) now = next_card(now); return now; } /*******************************************************************************/ static int form_virtualize(WINDOW *w) { int c = wgetch(w); switch (c) { case CTRL('W'): return (MY_CTRL_W); case CTRL('N'): return (MY_CTRL_N); case CTRL('P'): return (MY_CTRL_P); case QUIT: case ESCAPE: return (MY_CTRL_Q); case KEY_BACKSPACE: return (REQ_DEL_PREV); case KEY_DC: return (REQ_DEL_CHAR); case KEY_LEFT: return (REQ_LEFT_CHAR); case KEY_RIGHT: return (REQ_RIGHT_CHAR); case KEY_DOWN: case KEY_NEXT: return (REQ_NEXT_FIELD); case KEY_UP: case KEY_PREVIOUS: return (REQ_PREV_FIELD); default: return (c); } } static FIELD ** make_fields(CARD * p, int form_high, int form_wide) { FIELD **f = typeCalloc(FIELD *, (size_t) 3); f[0] = new_field(1, form_wide, 0, 0, 0, 0); set_field_back(f[0], A_REVERSE); set_field_buffer(f[0], 0, p->title); field_opts_off(f[0], O_BLANK); f[1] = new_field(form_high - 1, form_wide, 1, 0, 0, 0); set_field_buffer(f[1], 0, p->content); set_field_just(f[1], JUSTIFY_LEFT); field_opts_off(f[1], O_BLANK); f[2] = 0; return f; } static void show_legend(void) { erase(); move(LINES - 3, 0); addstr("^Q/ESC -- exit form ^W -- writes data to file\n"); addstr("^N -- go to next card ^P -- go to previous card\n"); addstr("Arrow keys move left/right within a field, up/down between fields"); } #if (defined(KEY_RESIZE) && HAVE_WRESIZE) || NO_LEAKS static void free_form_fields(FIELD **f) { int n; for (n = 0; f[n] != 0; ++n) { free_field(f[n]); } free(f); } #endif /*******************************************************************************/ static void cardfile(char *fname) { WINDOW *win; CARD *p; CARD *top_card; int visible_cards; int panel_wide; int panel_high; int form_wide; int form_high; int y; int x; int finished = FALSE; show_legend(); /* decide how many cards we can display */ visible_cards = count_cards(); while ( (panel_wide = COLS - (visible_cards * OFFSET_CARD)) < 10 || (panel_high = LINES - (visible_cards * OFFSET_CARD) - 5) < 5) { --visible_cards; } form_wide = panel_wide - 2; form_high = panel_high - 2; y = (visible_cards - 1) * OFFSET_CARD; x = 0; /* make a panel for each CARD */ for (p = all_cards; p != 0; p = p->link) { if ((win = newwin(panel_high, panel_wide, y, x)) == 0) break; wbkgd(win, (chtype) COLOR_PAIR(pair_2)); keypad(win, TRUE); p->panel = new_panel(win); box(win, 0, 0); p->form = new_form(make_fields(p, form_high, form_wide)); set_form_win(p->form, win); set_form_sub(p->form, derwin(win, form_high, form_wide, 1, 1)); post_form(p->form); y -= OFFSET_CARD; x += OFFSET_CARD; } top_card = first_card(all_cards); order_cards(top_card, visible_cards); while (!finished) { int ch = ERR; update_panels(); doupdate(); ch = form_virtualize(panel_window(top_card->panel)); switch (form_driver(top_card->form, ch)) { case E_OK: break; case E_UNKNOWN_COMMAND: switch (ch) { case MY_CTRL_Q: finished = TRUE; break; case MY_CTRL_P: top_card = prev_card(top_card); order_cards(top_card, visible_cards); break; case MY_CTRL_N: top_card = next_card(top_card); order_cards(top_card, visible_cards); break; case MY_CTRL_W: form_driver(top_card->form, REQ_VALIDATION); write_data(fname); break; #if defined(KEY_RESIZE) && HAVE_WRESIZE case KEY_RESIZE: /* resizeterm already did "something" reasonable, but it cannot * know much about layout. So let's make it nicer. */ panel_wide = COLS - (visible_cards * OFFSET_CARD); panel_high = LINES - (visible_cards * OFFSET_CARD) - 5; form_wide = panel_wide - 2; form_high = panel_high - 2; y = (visible_cards - 1) * OFFSET_CARD; x = 0; show_legend(); for (p = all_cards; p != 0; p = p->link) { FIELD **oldf = form_fields(p->form); WINDOW *olds = form_sub(p->form); if (!isVisible(p)) continue; win = form_win(p->form); /* move and resize the card as needed * FIXME: if the windows are shrunk too much, this won't do */ mvwin(win, y, x); wresize(win, panel_high, panel_wide); /* reconstruct each form. Forms are not resizable, and * there appears to be no good way to reload the text in * a resized window. */ werase(win); unpost_form(p->form); free_form(p->form); p->form = new_form(make_fields(p, form_high, form_wide)); set_form_win(p->form, win); set_form_sub(p->form, derwin(win, form_high, form_wide, 1, 1)); post_form(p->form); free_form_fields(oldf); delwin(olds); box(win, 0, 0); y -= OFFSET_CARD; x += OFFSET_CARD; } break; #endif default: beep(); break; } break; default: flash(); break; } } #if NO_LEAKS while (all_cards != 0) { p = all_cards; all_cards = all_cards->link; if (isVisible(p)) { FIELD **f = form_fields(p->form); unpost_form(p->form); /* ...so we can free it */ free_form(p->form); /* this also disconnects the fields */ free_form_fields(f); del_panel(p->panel); } free(p->title); free(p->content); free(p); } #endif } static void usage(int ok) { static const char *msg[] = { "Usage: cardfile [options] file" ,"" ,USAGE_COMMON ,"Options:" ," -c use color if terminal supports it" }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /*******************************************************************************/ /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; setlocale(LC_ALL, ""); while ((ch = getopt(argc, argv, OPTS_COMMON "c")) != -1) { switch (ch) { case 'c': try_color = TRUE; break; case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } initscr(); cbreak(); noecho(); if (try_color) { if (has_colors()) { start_color(); init_pair(pair_1, COLOR_WHITE, COLOR_BLUE); init_pair(pair_2, COLOR_WHITE, COLOR_CYAN); bkgd((chtype) COLOR_PAIR(pair_1)); } else { try_color = FALSE; } } if (optind + 1 == argc) { int n; for (n = 1; n < argc; n++) read_data(argv[n]); if (count_cards() == 0) new_card(); cardfile(argv[1]); } else { read_data(default_name); if (count_cards() == 0) new_card(); cardfile(default_name); } endwin(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the curses form and panel libraries\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/tput-initc0000755000000000000000000001057613615656212015462 0ustar rootroot#!/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 - ncurses-6.4-20240113/test/popup_msg.c0000644000000000000000000001120214157450127015573 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2021 Thomas E. Dickey * * Copyright 2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: popup_msg.c,v 1.11 2021/12/18 21:19:19 tom Exp $ * * Show a multi-line message in a window which may extend beyond the screen. * * Thomas Dickey - 2017/4/15. */ #include #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, const char *const *msg) { int x0 = 4; int y0 = 2; int y1 = 0; int y2 = 0; int wide = getmaxx(parent) - ((x0 + 1) * 2); int high = getmaxy(parent) - ((y0 + 1) * 2); WINDOW *help; WINDOW *data; int n; int width = 0; int length; int last_y; int ch = ERR; for (n = 0; msg[n] != 0; ++n) { int check = (int) strlen(msg[n]); if (width < check) width = check; } length = n; if ((help = newwin(high, wide, y0, x0)) == 0) return; if ((data = newpad(length + 1, width + 1)) == 0) { delwin(help); return; } begin_popup(); keypad(data, TRUE); for (n = 0; n < length; ++n) { waddstr(data, msg[n]); if ((n + 1) < length) { waddch(data, '\n'); } } y2 = getcury(data); last_y = (y2 - (high - 3)); do { switch (ch) { case KEY_HOME: y1 = 0; break; case KEY_END: y1 = last_y; break; case KEY_PREVIOUS: case KEY_PPAGE: if (y1 > 0) { y1 -= high / 2; if (y1 < 0) y1 = 0; } else { beep(); } break; case KEY_NEXT: case KEY_NPAGE: if (y1 < last_y) { y1 += high / 2; if (y1 > last_y) y1 = last_y; } else { beep(); } break; case CTRL('P'): case KEY_UP: if (y1 > 0) --y1; else beep(); break; case CTRL('N'): case KEY_DOWN: if (y1 < last_y) ++y1; else beep(); break; default: beep(); break; case ERR: break; } werase(help); box(help, 0, 0); wnoutrefresh(help); pnoutrefresh(data, y1, 0, y0 + 1, x0 + 1, high, wide); doupdate(); } while ((ch = wgetch(data)) != ERR && ch != QUIT && ch != ESCAPE); werase(help); wrefresh(help); delwin(help); delwin(data); end_popup(); } void popup_msg2(WINDOW *parent, char **msg) { popup_msg(parent, (const char *const *) msg); } #else void popup_msg(WINDOW *parent, const char *const *msg) { (void) parent; (void) msg; beep(); } #endif ncurses-6.4-20240113/test/test.priv.h0000644000000000000000000007615514523544576015560 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 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.217 2023/11/11 00:23:26 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) strcpy(buffer, curses_version()) #elif defined(NCURSES_VERSION_MAJOR) && defined(NCURSES_VERSION_MINOR) && defined(NCURSES_VERSION_PATCH) #define format_version(buffer) sprintf(buffer, "ncurses %d.%d.%d", \ NCURSES_VERSION_MAJOR, \ NCURSES_VERSION_MINOR, \ NCURSES_VERSION_PATCH) #else #define format_version(buffer) strcpy(buffer, "ncurses-examples") #endif #define VERSION_COMMON() \ static char *version_common(char **argv) { \ char *base = argv[0]; \ char *part = strrchr(base, '/'); \ char *result = malloc(strlen(base) + 80); \ if (result != NULL) { \ if (part++ == NULL) part = base; \ sprintf(result, "%.20s: ", part); \ format_version(result + strlen(result)); \ } \ return result; \ } \ static void show_version(char **argv) { \ char *value = version_common(argv); \ if (value != NULL) { \ puts(value); \ free(value); \ } \ } /* from nc_string.h, to make this stand alone */ #if HAVE_BSD_STRING_H #include #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, count, then_stmt, else_stmt) \ if ((count = getcchar(s, NULL, NULL, NULL, NULL)) > 0) { \ wchar_t test_wch[CCHARW_MAX + 2]; \ attr_t test_attrs; \ NCURSES_PAIRS_T test_pair; \ \ if (getcchar( s, test_wch, &test_attrs, &test_pair, NULL) == OK \ && test_wch[0] != L'\0') { \ then_stmt \ } else { \ else_stmt \ } \ } else { \ else_stmt \ } /* * These usually are implemented as macros, but may be functions. */ #if !defined(getcurx) && !HAVE_GETCURX #define getcurx(win) ((win) ? ((int)(win)->_curx) : ERR) #define getcury(win) ((win) ? ((int)(win)->_cury) : ERR) #endif #if !defined(getbegx) && !HAVE_GETBEGX #define getbegx(win) ((win) ? ((int)(win)->_begx) : ERR) #define getbegy(win) ((win) ? ((int)(win)->_begy) : ERR) #endif #if !defined(getmaxx) && !HAVE_GETMAXX #define getmaxx(win) ((win) ? ((int)(win)->_maxx + 1) : ERR) #define getmaxy(win) ((win) ? ((int)(win)->_maxy + 1) : ERR) #endif /* * Solaris 10 xpg4: #define __m_getparx(w) ((w)->_parent == (WINDOW *) 0 ? -1 \ : (w)->_begx - (w)->_parent->_begx) */ #if !defined(getparx) && !HAVE_GETPARX #ifdef __m_getparx #define getparx(win) __m_getparx(win) #define getpary(win) __m_getpary(win) #else #define getparx(win) ((win)?((win)->_parx + 1):ERR) #define getpary(win) ((win)?((win)->_pary + 1):ERR) #endif #endif #if !defined(mvwvline) && !HAVE_MVWVLINE #define mvwvline(w,y,x,ch,n) (move(y,x) == ERR ? ERR : wvline(w,ch,n)) #define mvwhline(w,y,x,ch,n) (move(y,x) == ERR ? ERR : whline(w,ch,n)) #endif #if !defined(mvvline) && !HAVE_MVVLINE #define mvvline(y,x,ch,n) (move(y,x) == ERR ? ERR : vline(ch,n)) #define mvhline(y,x,ch,n) (move(y,x) == ERR ? ERR : hline(ch,n)) #endif /* * Try to accommodate curses implementations that have no terminfo support. */ #if HAVE_TIGETNUM #define TIGETNUM(ti,tc) tigetnum(ti) #else #define TIGETNUM(ti,tc) tgetnum(tc) #endif #if HAVE_TIGETSTR #define TIGETSTR(ti,tc) tigetstr(ti) #else #define TIGETSTR(ti,tc) tgetstr(tc,&area_pointer) #endif /* * So far (2013 - more than ten years), only ncurses implements * use_extended_names(). */ #if defined(NCURSES_XNAMES) #elif defined(NCURSES_VERSION) && defined(HAVE_TERM_ENTRY_H) && HAVE_TERM_ENTRY_H #define NCURSES_XNAMES 1 #else #define NCURSES_XNAMES 0 #endif /* * ncurses restores the cursor in endwin(). Other libraries may not. */ #ifdef NCURSES_VERSION #define stop_curses() endwin() #else #define stop_curses() do { endwin(); curs_set(1); } while (0) #endif /* ncurses implements tparm() with varargs, X/Open with a fixed-parameter list * (which is incompatible with legacy usage, doesn't solve any problems). */ #define tparm3(a,b,c) tparm(a,b,c,0,0,0,0,0,0,0) #define tparm2(a,b) tparm(a,b,0,0,0,0,0,0,0,0) #define UChar(c) ((unsigned char)(c)) #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 #if (defined(_WIN32) || defined(_WIN64)) #define _NC_WINDOWS 1 #endif #if defined(_NC_WINDOWS) || defined(USE_WIN32CON_DRIVER) #if defined(PDCURSES) #ifdef WINVER # if WINVER < 0x0501 # error WINVER must at least be 0x0501 # endif #else # define WINVER 0x0501 #endif #include #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) || 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 */ ncurses-6.4-20240113/test/move_field.c0000644000000000000000000003260014523545243015701 0ustar rootroot/**************************************************************************** * Copyright 2020-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: move_field.c,v 1.15 2023/11/11 00:28:19 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" }, { KEY_F(1), MY_HELP, "show this screen", }, { KEY_BACKSPACE, REQ_DEL_PREV, "delete previous character" }, { KEY_BTAB, REQ_PREV_FIELD, "go to previous field" }, { KEY_DOWN, REQ_DOWN_CHAR, "move down 1 character" }, { KEY_END, REQ_LAST_FIELD, "go to last field" }, { KEY_HOME, REQ_FIRST_FIELD, "go to first field" }, { KEY_LEFT, REQ_LEFT_CHAR, "move left 1 character" }, { KEY_NEXT, REQ_NEXT_FIELD, "go to next field" }, { KEY_PREVIOUS, REQ_PREV_FIELD, "go to previous field" }, { KEY_RIGHT, REQ_RIGHT_CHAR, "move right 1 character" }, { KEY_UP, REQ_UP_CHAR, "move up 1 character" }, { DO_DEMO, MY_DEMO, "move current field with cursor keys" } }; /* *INDENT-ON* */ static void my_help_edit_field(void) { int used = 0; unsigned n; char **msgs = typeCalloc(char *, 3 + SIZEOF(commands)); msgs[used++] = strdup("Defined form edit/traversal keys:"); for (n = 0; n < SIZEOF(commands); ++n) { char *msg; const char *name; const char *code = keyname(commands[n].code); size_t need = 5; #ifdef NCURSES_VERSION if ((name = form_request_name(commands[n].result)) == 0) #endif name = commands[n].help; need = 5 + strlen(code) + strlen(name); msg = typeMalloc(char, need); _nc_SPRINTF(msg, _nc_SLIMIT(need) "%s -- %s", code, name); msgs[used++] = msg; } msgs[used++] = strdup("Arrow keys move within a field as you would expect."); msgs[used] = 0; popup_msg2(stdscr, msgs); for (n = 0; msgs[n] != 0; ++n) { free(msgs[n]); } free(msgs); } static FIELD * make_label(const char *label, int frow, int fcol) { FIELD *f = new_field(1, (int) strlen(label), frow, fcol, 0, 0); if (f) { set_field_buffer(f, 0, label); set_field_opts(f, (int) ((unsigned) field_opts(f) & (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(FIELD *f) { return (FieldAttrs *) field_userptr(f); } static int buffer_length(FIELD *f) { return my_field_attrs(f)->row_lengths[0]; } static void set_buffer_length(FIELD *f, int length) { my_field_attrs(f)->row_lengths[0] = length; } static int offset_in_field(FORM *form) { FIELD *field = current_field(form); int currow, curcol; form_getyx(form, currow, curcol); return curcol + currow * (int) field->dcols; } static void inactive_field(FIELD *f) { set_field_back(f, my_field_attrs(f)->background); } static int my_edit_field(FORM *form, int *result) { int ch = wgetch(form_win(form)); int status; FIELD *before; unsigned n; int before_row; int before_col; int before_off = offset_in_field(form); form_getyx(form, before_row, before_col); before = current_field(form); set_field_back(before, A_NORMAL); if (ch <= KEY_MAX) { set_field_back(before, A_REVERSE); } else if (ch <= MAX_FORM_COMMAND) { inactive_field(before); } *result = ch; for (n = 0; n < SIZEOF(commands); ++n) { if (commands[n].code == ch) { *result = commands[n].result; break; } } status = form_driver(form, *result); if (status == E_OK) { bool modified = TRUE; int length = buffer_length(before); if (length < before_off) length = before_off; switch (*result) { case REQ_CLR_EOF: length = before_off; break; case REQ_CLR_EOL: if ((int) (before_row + 1) == (int) (before->rows)) length = before_off; break; case REQ_CLR_FIELD: length = 0; break; case REQ_DEL_CHAR: if (length > before_off) --length; break; case REQ_DEL_PREV: if (length > 0) { if (before_col > 0) { --length; } else if (before_row > 0) { length -= (int) before->cols + before_col; } } break; case REQ_NEW_LINE: length += (int) before->cols; break; default: modified = (ch < MIN_FORM_COMMAND && isprint(ch)); break; } /* * If we do not force a re-validation, then field_buffer 0 will * be lagging by one character. */ if (modified && form_driver(form, REQ_VALIDATION) == E_OK && *result < MIN_FORM_COMMAND) ++length; set_buffer_length(before, length); } if (current_field(form) != before) inactive_field(before); return status; } static FIELD ** copy_fields(FIELD **source, size_t length) { FIELD **target = typeCalloc(FIELD *, length + 1); memcpy(target, source, length * sizeof(FIELD *)); return target; } /* display a status message to show what's happening */ static void show_status(FORM *form, FIELD *field) { WINDOW *sub = form_sub(form); int currow, curcol; getyx(stdscr, currow, curcol); mvprintw(LINES - 1, 0, "Field at [%d,%d]. Press %s to quit moving.", getbegy(sub) + form_field_row(field), getbegx(sub) + form_field_col(field), keyname(DO_DEMO)); clrtobot(); move(currow, curcol); refresh(); } /* * Move the current label+field in response to cursor-keys (or h,j,k,l) until * a control/F is read. */ static void do_demo(FORM *form) { int count = field_count(form); FIELD *my_field = current_field(form); FIELD **old_fields = form_fields(form); if (count > 0 && old_fields != NULL && my_field != NULL) { size_t needed = (size_t) count; FIELD **new_fields = copy_fields(old_fields, needed); if (new_fields != NULL) { bool found = FALSE; int ch; /* TODO: move the label too, in parallel with the editing field */ /* remove the current field from the newer list */ for (ch = 0; ch <= count; ++ch) { if (found) { new_fields[ch - 1] = new_fields[ch]; } else if (new_fields[ch] == my_field) { found = TRUE; } } if (found) { int currow, curcol; getyx(stdscr, currow, curcol); show_status(form, my_field); while ((ch = wgetch(form_win(form))) != DO_DEMO) { int field_y = form_field_row(my_field); int field_x = form_field_col(my_field); switch (ch) { case 'h': case KEY_LEFT: if (field_x > 0) field_x--; break; case 'j': case KEY_DOWN: field_y++; break; case 'k': case KEY_UP: if (field_y > 0) field_y--; break; case 'l': case KEY_RIGHT: field_x++; break; case CTRL('Q'): case CTRL('['): ch = DO_DEMO; /* FALLTHRU */ case DO_DEMO: break; default: continue; } if (ch == DO_DEMO) break; /* alter connected fields temporarily to move the field */ unpost_form(form); set_form_fields(form, new_fields); post_form(form); /* TODO: update screen position on success */ move_field(my_field, field_y, field_x); /* restore the form's list of fields */ unpost_form(form); set_form_fields(form, old_fields); post_form(form); show_status(form, my_field); } /* cleanup */ move(LINES - 1, 0); clrtobot(); move(currow, curcol); refresh(); } } free(new_fields); } } static int my_form_driver(FORM *form, int c) { switch (c) { case MY_QUIT: if (form_driver(form, REQ_VALIDATION) == E_OK) return (TRUE); break; case MY_HELP: my_help_edit_field(); break; case MY_DEMO: do_demo(form); break; default: beep(); break; } return (FALSE); } static void demo_forms(void) { FORM *form; int c; unsigned n = 0; const char *fname; /* describe the form */ all_fields[n++] = make_label("Sample Form", 0, 15); fname = "Last Name"; all_fields[n++] = make_label(fname, 2, 0); all_fields[n++] = make_field(3, 0, 1, 18); set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); fname = "First Name"; all_fields[n++] = make_label(fname, 2, 20); all_fields[n++] = make_field(3, 20, 1, 12); set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); fname = "Middle Name"; all_fields[n++] = make_label(fname, 2, 34); all_fields[n++] = make_field(3, 34, 1, 12); set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); fname = "Comments"; all_fields[n++] = make_label(fname, 5, 0); all_fields[n++] = make_field(6, 0, 4, 46); init_edit_field(all_fields[n - 1], empty); all_fields[n] = (FIELD *) 0; if ((form = new_form(all_fields)) != 0) { int finished = 0; post_form(form); while (!finished) { switch (my_edit_field(form, &c)) { case E_OK: break; case E_UNKNOWN_COMMAND: finished = my_form_driver(form, c); break; default: beep(); break; } } erase_form(form); free_form(form); } for (c = 0; all_fields[c] != 0; c++) { free_edit_field(all_fields[c]); free_field(all_fields[c]); } noraw(); nl(); } static void usage(int ok) { static const char *msg[] = { "Usage: move_field [options]" ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) usage(FALSE); setlocale(LC_ALL, ""); initscr(); cbreak(); noecho(); raw(); nonl(); /* lets us read ^M's */ intrflush(stdscr, FALSE); keypad(stdscr, TRUE); if (has_colors()) { start_color(); init_pair(1, COLOR_WHITE, COLOR_BLUE); init_pair(2, COLOR_GREEN, COLOR_BLACK); init_pair(3, COLOR_CYAN, COLOR_BLACK); bkgd((chtype) COLOR_PAIR(1)); refresh(); } demo_forms(); endwin(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the curses form library\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/movewindow.c0000644000000000000000000004252114434462126015770 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 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.54 2023/05/27 20:13:10 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, WINDOW *child, int uli, int ulj, int lri, int lrj, bool relative, bool * more) { static PAIR res; /* result cell */ int si = lri - uli + 1; /* depth of the select area */ int sj = lrj - ulj + 1; /* width of the select area */ int i = 0, j = 0; /* offsets into the select area */ res.y = uli; res.x = ulj; if (child != 0) { if (relative) { getparyx(child, i, j); } else { getbegyx(child, i, j); i -= uli + getbegy(parent); j -= ulj + getbegx(parent); } } if (more) *more = FALSE; for (;;) { bool moved = FALSE; tail_line("Upper left [%2d,%2d] Lower right [%2d,%2d] -> %d,%d -> %d,%d", uli, ulj, lri, lrj, i, j, uli + i, ulj + j); wmove(parent, uli + i, ulj + j); switch (wgetch(parent)) { case KEY_UP: i += si - 1; moved = TRUE; break; case KEY_DOWN: i++; moved = TRUE; break; case KEY_LEFT: j += sj - 1; moved = TRUE; break; case KEY_RIGHT: j++; moved = TRUE; break; case QUIT: /* FALLTHRU */ case ESCAPE: return ((PAIR *) 0); #ifdef NCURSES_MOUSE_VERSION case KEY_MOUSE: { MEVENT event; getmouse(&event); if (event.y > uli && event.x > ulj) { if (parent != stdscr) { i = event.y - getbegy(parent) - uli; j = event.x - getbegx(parent) - ulj; } else { i = event.y - uli; j = event.x - ulj; } } else { beep(); break; } } #endif /* FALLTHRU */ default: res.y = uli + i; res.x = ulj + j; return (&res); } if (si <= 0) i = 0; else i %= si; if (sj <= 0) j = 0; else j %= sj; /* * If the caller can handle continuous movement, return the result. */ if (moved && more) { *more = TRUE; res.y = uli + i; res.x = ulj + j; return (&res); } } } /* * Ask user for a window definition. */ static bool getwindow(WINDOW *parent, PAIR * ul, PAIR * lr) { int min_col = (parent == stdscr) ? COL_MIN : 0; int max_col = (parent == stdscr) ? COL_MAX : getmaxx(parent); int min_line = (parent == stdscr) ? LINE_MIN : 0; int max_line = (parent == stdscr) ? LINE_MAX : getmaxy(parent); PAIR *tmp; bool result = FALSE; head_line("Use arrows to move cursor, anything else to mark corner 1"); if ((tmp = selectcell(parent, 0, min_line, min_col, max_line, max_col, FALSE, (bool *) 0)) != 0) { *ul = *tmp; MvWAddCh(parent, ul->y, ul->x, '*'); head_line("Use arrows to move cursor, anything else to mark corner 2"); if ((tmp = selectcell(parent, 0, ul->y, ul->x, max_line, max_col, FALSE, (bool *) 0)) != 0) { *lr = *tmp; MvWAddCh(parent, lr->y, lr->x, '*'); wmove(parent, lr->y, lr->x); wsyncdown(parent); wrefresh(parent); result = (lr->y != ul->y && lr->x != ul->x); } } head_line("done"); return result; } /* * Draw a box inside the given window. */ static void box_inside(WINDOW *win) { int y0, x0; int y1, x1; getyx(win, y0, x0); getmaxyx(win, y1, x1); MvWHLine(win, 0, 0, ACS_HLINE, x1); MvWHLine(win, y1 - 1, 0, ACS_HLINE, x1); MvWVLine(win, 0, 0, ACS_VLINE, y1); MvWVLine(win, 0, x1 - 1, ACS_VLINE, y1); MvWAddCh(win, 0, 0, ACS_ULCORNER); MvWAddCh(win, y1 - 1, 0, ACS_LLCORNER); MvWAddCh(win, 0, x1 - 1, ACS_URCORNER); MvWAddCh(win, y1 - 1, x1 - 1, ACS_LRCORNER); wsyncdown(win); wmove(win, y0, x0); wrefresh(win); } /* * Add a window to our list. */ static void add_window(WINDOW *parent, WINDOW *child) { static unsigned have = 0; unsigned need = ((num_windows + 1) | 31) + 1; keypad(child, TRUE); if (need > have) { all_windows = typeRealloc(FRAME, need, all_windows); if (!all_windows) failed("add_window"); 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(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); PAIR *tmp; bool more; head_line("Select new position for %swindow", top ? "" : "sub"); while ((tmp = selectcell(parent, win, min_line, min_col, max_line, max_col, FALSE, &more)) != 0) { int y0, x0; getbegyx(parent, y0, x0); /* * Moving a subwindow has the effect of moving a viewport around * the screen. The parent window retains the contents of the * subwindow in the original location, but the viewport will show * the contents (again) at the new location. So it will look odd * when testing. */ if (mvwin(win, y0 + tmp->y, x0 + tmp->x) != ERR) { if (recur) { recur_move_window(win, tmp->y, tmp->x); } refresh_all(win); doupdate(); result = TRUE; } else { result = FALSE; } if (!more) break; } } head_line("done"); return result; } static void show_derwin(WINDOW *win) { int pary, parx, maxy, maxx; getmaxyx(win, maxy, maxx); getparyx(win, pary, parx); head_line("Select new position for derived window at %d,%d (%d,%d)", pary, parx, maxy, maxx); } /* * test mvderwin(). */ static bool move_derwin(WINDOW *win) { WINDOW *parent = parent_of(win); bool result = FALSE; if (parent != 0) { bool top = (parent == stdscr); int min_col = top ? COL_MIN : 0; int max_col = top ? COL_MAX : getmaxx(parent); int min_line = top ? LINE_MIN : 0; int max_line = top ? LINE_MAX : getmaxy(parent); PAIR *tmp; bool more; show_derwin(win); while ((tmp = selectcell(parent, win, min_line, min_col, max_line, max_col, TRUE, &more)) != 0) { if (mvderwin(win, tmp->y, tmp->x) != ERR) { refresh_all(win); doupdate(); repaint_one(win); doupdate(); result = TRUE; show_derwin(win); } else { flash(); } if (!more) break; } } head_line("done"); return result; } static void fill_window(WINDOW *win, chtype ch) { int y, x; int y0, x0; int y1, x1; getyx(win, y0, x0); getmaxyx(win, y1, x1); for (y = 0; y < y1; ++y) { for (x = 0; x < x1; ++x) { MvWAddCh(win, y, x, ch); } } wsyncdown(win); wmove(win, y0, x0); wrefresh(win); } static void fill_with_pattern(WINDOW *win) { int y, x; int y0, x0; int y1, x1; int ch = 'a'; getyx(win, y0, x0); getmaxyx(win, y1, x1); for (y = 0; y < y1; ++y) { for (x = 0; x < x1; ++x) { MvWAddCh(win, y, x, (chtype) ch); if (++ch > 'z') ch = 'a'; } } wsyncdown(win); wmove(win, y0, x0); wrefresh(win); } #define lines_of(ul,lr) (lr.y - ul.y + 1) #define cols_of(ul,lr) (lr.x - ul.x + 1) #define pair_of(ul) ul.y, ul.x static WINDOW * create_my_window(WINDOW *current) { PAIR ul, lr; WINDOW *result = 0; if (getwindow(stdscr, &ul, &lr)) { result = newwin(lines_of(ul, lr), cols_of(ul, lr), pair_of(ul)); if (result != 0) { fill_window(result, 'c'); add_window(stdscr, result); } } if (result == 0) result = current; return result; } static WINDOW * create_my_derwin(WINDOW *parent) { PAIR ul, lr; WINDOW *result = 0; if (getwindow(parent, &ul, &lr)) { result = derwin(parent, lines_of(ul, lr), cols_of(ul, lr), pair_of(ul)); if (result != 0) { fill_window(result, 'd'); add_window(parent, result); } } if (result == 0) result = parent; return result; } static WINDOW * create_my_subwin(WINDOW *parent) { PAIR ul, lr; WINDOW *result = 0; if (getwindow(parent, &ul, &lr)) { result = subwin(parent, lines_of(ul, lr), cols_of(ul, lr), ul.y + getbegy(parent), ul.x + getbegx(parent)); if (result != 0) { fill_window(result, 's'); add_window(parent, result); } } if (result == 0) result = parent; return result; } static void show_help(WINDOW *current) { /* *INDENT-OFF* */ static struct { int key; CONST_FMT char * msg; } help[] = { { HELP_KEY_1, "Show this screen" }, { 'b', "Draw a box inside the current window" }, { 'c', "Create a new window" }, { 'd', "Create a new derived window" }, { 'D', "Move derived window (moves viewport)" }, { 'f', "Fill the current window with the next character" }, { 'F', "Fill the current window with a pattern" }, { 'm', "Move the current window" }, { 'M', "Move the current window (and its children)" }, { 'q', "Quit" }, { 's', "Create a new subwindow" }, { CTRL('L'), "Repaint all windows, doing current one last" }, { CTRL('N'), "Cursor to next window" }, { CTRL('P'), "Cursor to previous window" }, }; /* *INDENT-ON* */ char **msgs = typeCalloc(char *, SIZEOF(help) + 1); size_t n; for (n = 0; n < SIZEOF(help); ++n) { size_t need = (21 + strlen(help[n].msg)); msgs[n] = typeMalloc(char, need); _nc_SPRINTF(msgs[n], _nc_SLIMIT(need) "%-20s%s", keyname(help[n].key), help[n].msg); } popup_msg2(current, msgs); for (n = 0; n < SIZEOF(help); ++n) { free(msgs[n]); } free(msgs); } static void usage(int ok) { static const char *msg[] = { "Usage: movewindow [options]" ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { WINDOW *current_win; int ch; bool done = FALSE; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) usage(FALSE); initscr(); cbreak(); noecho(); nonl(); intrflush(stdscr, FALSE); add_window(0, current_win = stdscr); #ifdef NCURSES_MOUSE_VERSION (void) mousemask(BUTTON1_CLICKED, (mmask_t *) NULL); #endif /* NCURSES_MOUSE_VERSION */ while (!done && (ch = wgetch(current_win)) != ERR) { int y, x; getyx(current_win, y, x); switch (ch) { case HELP_KEY_1: show_help(current_win); break; case 'b': box_inside(current_win); break; case 'c': current_win = create_my_window(current_win); break; case 'd': current_win = create_my_derwin(current_win); break; case 'D': if (!move_derwin(current_win)) { tail_line("error"); continue; } break; case 'f': fill_window(current_win, (chtype) wgetch(current_win)); break; case 'F': fill_with_pattern(current_win); break; case 'm': case 'M': if (!move_window(current_win, (ch == 'M'))) { tail_line("error"); continue; } break; case 'q': done = TRUE; break; case 's': current_win = create_my_subwin(current_win); break; case CTRL('L'): refresh_all(current_win); break; case CTRL('N'): current_win = next_window(current_win); break; case CTRL('P'): current_win = prev_window(current_win); break; #if 0 /* want to allow cursor to move around the current window too */ /* want to test the resizing of windows and subwindows too */ /* want to allow deleting a window also */ #endif default: wmove(current_win, y, x); tail_line("unrecognized key (use '?' for help)"); beep(); continue; } tail_line("size [%d,%d] begin [%d,%d] parent [%d,%d]", getmaxy(current_win), getmaxx(current_win), getbegy(current_win), getbegx(current_win), getpary(current_win), getparx(current_win)); wmove(current_win, 0, 0); } endwin(); #if NO_LEAKS free(all_windows); #endif ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the curses mvderwin and mvwin functions\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/linedata.h0000644000000000000000000000673013615656212015363 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/test/test_addchstr.c0000644000000000000000000003100014345204042016403 0ustar rootroot/**************************************************************************** * Copyright 2020,2022 Thomas E. Dickey * * Copyright 2009-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: test_addchstr.c,v 1.29 2022/12/10 22:28:50 tom Exp $ * * Demonstrate the waddchstr() and waddch functions. * Thomas Dickey - 2009/9/12 */ #include #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(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); } ncurses-6.4-20240113/test/demo_panels.c0000644000000000000000000004254014342766153016066 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2022 Thomas E. Dickey * * Copyright 2003-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: demo_panels.c,v 1.48 2022/12/04 00:40:11 tom Exp $ * * Demonstrate a variety of functions from the panel library. */ #include #if USE_LIBPANEL #include #define LAST_POS '@' #define TEMP_POS '>' typedef void (*InitPanel) (void); typedef void (*FillPanel) (PANEL *); static bool use_colors = FALSE; static bool unboxed = FALSE; static FILE *log_in; static FILE *log_out; static void close_input(void) { if (log_in != 0) { fclose(log_in); log_in = 0; } } static void close_output(void) { if (log_out != 0) { fclose(log_out); log_out = 0; } } static WINDOW * statusline(void) { WINDOW *result = stdscr; wmove(result, LINES - 1, 0); wclrtoeol(result); return result; } static void pflush(void) { update_panels(); doupdate(); } static void saywhat(NCURSES_CONST char *text) { WINDOW *win = statusline(); if (text != 0 && *text != '\0') { waddstr(win, text); waddstr(win, "; "); } waddstr(win, "press any key to continue"); } static void show_position(NCURSES_CONST char *text, NCURSES_CONST char *also, int which, int ypos, int xpos) { WINDOW *win = statusline(); wprintw(win, "%s for panel %d now %d,%d%s", text, which, ypos, xpos, also); wmove(stdscr, ypos, xpos); } static int get_position(NCURSES_CONST char *text, NCURSES_CONST char *also, int which, int *xpos, int *ypos) { int result = 0; int x1, y1; char cmd; getyx(stdscr, y1, x1); (void) statusline(); show_position(text, also, which, y1, x1); if (log_in != 0) { if (fscanf(log_in, "%c%d,%d\n", &cmd, &y1, &x1) == 3) { switch (cmd) { case LAST_POS: result = 1; (void) wgetch(stdscr); break; case TEMP_POS: result = 0; wrefresh(stdscr); napms(100); break; default: result = -1; break; } } else { result = -1; } } else { switch (wgetch(stdscr)) { case QUIT: case ESCAPE: case ERR: result = -1; break; case ' ': result = 1; break; case KEY_UP: if (y1 > 0) { --y1; } else { beep(); } break; case KEY_DOWN: if (y1 < getmaxy(stdscr)) { ++y1; } else { beep(); } break; case KEY_LEFT: if (x1 > 0) { --x1; } else { beep(); } break; case KEY_RIGHT: if (x1 < getmaxx(stdscr)) { ++x1; } else { beep(); } break; } } wmove(stdscr, y1, x1); *ypos = y1; *xpos = x1; if (result >= 0) { if (log_out) fprintf(log_out, "%c%d,%d\n", ((result > 0) ? LAST_POS : TEMP_POS), y1, x1); } return result; } static PANEL * mkpanel(short color, int rows, int cols, int tly, int tlx) { WINDOW *win; PANEL *pan = 0; char *userdata = typeMalloc(char, 6); if ((win = newwin(rows, cols, tly, tlx)) != 0) { keypad(win, TRUE); if ((pan = new_panel(win)) == 0) { delwin(win); } else if (use_colors) { short fg = (short) ((color == COLOR_BLUE) ? COLOR_WHITE : COLOR_BLACK); short bg = color; init_pair(color, fg, bg); wbkgdset(win, (chtype) (COLOR_PAIR(color) | ' ')); } else if (!unboxed) { wbkgdset(win, A_BOLD | ' '); } } _nc_SPRINTF(userdata, _nc_SLIMIT(4) "p%d", color % 8); set_panel_userptr(pan, (NCURSES_CONST void *) userdata); return pan; } static void my_remove_panel(PANEL **pans, int which) { if (pans[which] != 0) { PANEL *pan = pans[which]; WINDOW *win = panel_window(pan); char *user = (char *) panel_userptr(pan); free(user); del_panel(pan); delwin(win); pans[which] = 0; } } #undef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define ABS(a) ((a) < 0 ? -(a) : (a)) static void my_create_panel(PANEL **pans, int which, FillPanel myFill) { int code; short pair = (short) which; short fg = (short) ((pair == COLOR_BLUE) ? COLOR_WHITE : COLOR_BLACK); short bg = pair; int x0, y0, x1, y1; init_pair(pair, fg, bg); /* remove the old panel, if any */ my_remove_panel(pans, which); /* get the position of one corner */ wmove(stdscr, getmaxy(stdscr) / 2, getmaxx(stdscr) / 2); getyx(stdscr, y0, x0); while ((code = get_position("First corner", "", which, &x0, &y0)) == 0) { ; } if (code > 0) { char also[80]; _nc_SPRINTF(also, _nc_SLIMIT(sizeof(also)) " (first %d,%d)", y0, x0); /* get the position of the opposite corner */ while ((code = get_position("Opposite corner", also, which, &x1, &y1)) == 0) { ; } if (code > 0) { int tly = MIN(y0, y1); int tlx = MIN(x0, x1); PANEL *pan = mkpanel(pair, ABS(y1 - y0) + 1, ABS(x1 - x0) + 1, tly, tlx); /* finish */ myFill(pan); pans[which] = pan; pflush(); wmove(stdscr, y1, x1); } } } static void my_move_panel(PANEL **pans, int which, bool continuous) { if (pans[which] != 0) { int code; int y0, x0; int y1, x1; WINDOW *win = panel_window(pans[which]); char also[80]; getbegyx(win, y0, x0); _nc_SPRINTF(also, _nc_SLIMIT(sizeof(also)) " (start %d,%d)", y0, x0); wmove(stdscr, y0, x0); while ((code = get_position("Move panel", also, which, &x1, &y1)) == 0) { if (continuous) { move_panel(pans[which], y1, x1); pflush(); } } if (code > 0) { move_panel(pans[which], y1, x1); } } } static void my_resize_panel(PANEL **pans, int which, FillPanel myFill) { if (pans[which] != 0) { int code; int y0, x0; int y1, x1; WINDOW *win = panel_window(pans[which]); char also[80]; getbegyx(win, y0, x0); _nc_SPRINTF(also, _nc_SLIMIT(sizeof(also)) " (start %d,%d)", y0, x0); wmove(stdscr, y0, x0); while ((code = get_position("Resize panel", also, which, &x1, &y1)) == 0) { ; } if (code > 0) { WINDOW *next = newwin(ABS(y1 - y0) + 1, ABS(x1 - x0) + 1, MIN(y0, y1), MIN(x0, x1)); if (next != 0) { keypad(next, TRUE); if (use_colors) { wbkgdset(next, (chtype) (COLOR_PAIR(which) | ' ')); } else if (!unboxed) { wbkgdset(next, A_BOLD | ' '); } replace_panel(pans[which], next); myFill(pans[which]); delwin(win); } } } } static void init_panel(void) { register int y, x; for (y = 0; y < LINES - 1; y++) { for (x = 0; x < COLS; x++) wprintw(stdscr, "%d", (y + x) % 10); } } static void fill_panel(PANEL *pan) { WINDOW *win = panel_window(pan); const char *userptr = (const char *) panel_userptr(pan); int num = (userptr && *userptr) ? userptr[1] : '?'; int y, x; wmove(win, 1, 1); wprintw(win, "-pan%c-", num); wclrtoeol(win); box(win, 0, 0); for (y = 2; y < getmaxy(win) - 1; y++) { for (x = 1; x < getmaxx(win) - 1; x++) { wmove(win, y, x); waddch(win, UChar(num)); } } } static void fill_unboxed(PANEL *pan) { WINDOW *win = panel_window(pan); const char *userptr = (const char *) panel_userptr(pan); int num = (userptr && *userptr) ? userptr[1] : '?'; int y, x; for (y = 0; y < getmaxy(win); y++) { for (x = 0; x < getmaxx(win); x++) { wmove(win, y, x); waddch(win, UChar(num)); } } } #if USE_WIDEC_SUPPORT static void make_fullwidth_digit(cchar_t *target, int digit) { wchar_t source[2]; source[0] = (wchar_t) (digit + 0xff10); source[1] = 0; setcchar(target, source, A_NORMAL, 0, 0); } static void init_wide_panel(void) { int digit; cchar_t temp[10]; for (digit = 0; digit < 10; ++digit) make_fullwidth_digit(&temp[digit], digit); do { int y, x; getyx(stdscr, y, x); digit = (y + x / 2) % 10; } while (add_wch(&temp[digit]) != ERR); } static void fill_wide_panel(PANEL *pan) { WINDOW *win = panel_window(pan); int num = ((const char *) panel_userptr(pan))[1]; int y, x; wmove(win, 1, 1); wprintw(win, "-pan%c-", num); wclrtoeol(win); box(win, 0, 0); for (y = 2; y < getmaxy(win) - 1; y++) { for (x = 1; x < getmaxx(win) - 1; x++) { wmove(win, y, x); waddch(win, UChar(num)); } } } #endif #define MAX_PANELS 5 static int which_panel(PANEL *px[MAX_PANELS + 1], PANEL *pan) { int result = 0; int j; for (j = 1; j <= MAX_PANELS; ++j) { if (px[j] == pan) { result = j; break; } } return result; } static void show_help(WINDOW *win) { static const char *help[] = { "", "Commands are letter/digit pairs. Digits are the panel number.", "", " b - put the panel on the bottom of the stack", " c - create the panel", " d - delete the panel", " h - hide the panel", " m - move the panel (M for continuous move)", " r - resize the panel", " s - show the panel", " t - put the panel on the top of the stack" }; int j; for (j = 0; j < (int) SIZEOF(help); ++j) { if (wprintw(win, "%s\n", help[j]) == ERR) break; } } static void show_panels(PANEL *px[MAX_PANELS + 1]) { struct { bool valid; bool hidden; PANEL *above; PANEL *below; } table[MAX_PANELS + 1]; WINDOW *win; int j; memset(table, 0, sizeof(table)); for (j = 1; j <= MAX_PANELS; ++j) { table[j].valid = (px[j] != 0); if (table[j].valid) { table[j].hidden = panel_hidden(px[j]); table[j].above = panel_above(px[j]); table[j].below = panel_below(px[j]); } } if ((win = newwin(LINES - 1, COLS, 0, 0)) != 0) { PANEL *pan; keypad(win, TRUE); if ((pan = new_panel(win)) != 0) { werase(win); MvWPrintw(win, 0, 0, "Panels:\n"); for (j = 1; j <= MAX_PANELS; ++j) { if (table[j].valid) { wprintw(win, " %d:", j); if (table[j].hidden) { waddstr(win, " hidden"); } else { if (table[j].above) { wprintw(win, " above %d", which_panel(px, table[j].above)); } if (table[j].below) { wprintw(win, "%s below %d", table[j].above ? "," : "", which_panel(px, table[j].below)); } } waddch(win, '\n'); } } show_help(win); wgetch(win); del_panel(pan); pflush(); } delwin(win); } } #define wrapper(func) \ static int my_##func(PANEL *pan) \ { \ int code = ERR; \ if (pan != 0) { \ code = func(pan); \ } \ return code; \ } /* *INDENT-OFF* */ wrapper(bottom_panel) wrapper(hide_panel) wrapper(show_panel) wrapper(top_panel) /* *INDENT-ON* */ static void do_panel(PANEL *px[MAX_PANELS + 1], NCURSES_CONST char *cmd, FillPanel myFill) { int which = cmd[1] - '0'; if (which < 1 || which > MAX_PANELS) { beep(); return; } if (log_in != 0) { pflush(); } saywhat(cmd); switch (*cmd) { case 'b': my_bottom_panel(px[which]); break; case 'c': my_create_panel(px, which, myFill); break; case 'd': my_remove_panel(px, which); break; case 'h': my_hide_panel(px[which]); break; case 'm': my_move_panel(px, which, FALSE); break; case 'M': my_move_panel(px, which, TRUE); break; case 'r': my_resize_panel(px, which, myFill); break; case 's': my_show_panel(px[which]); break; case 't': my_top_panel(px[which]); break; } } static bool ok_letter(int ch) { return isalpha(UChar(ch)) && strchr("bcdhmMrst", ch) != 0; } static bool ok_digit(int ch) { return isdigit(UChar(ch)) && (ch >= '1') && (ch - '0' <= MAX_PANELS); } /* * A command consists of one or more letter/digit pairs separated by a space. * Digits are limited to 1..MAX_PANELS. * * End the command with a newline. Reject other characters. */ static bool get_command(PANEL *px[MAX_PANELS + 1], char *buffer, int limit) { int length = 0; int y0, x0; WINDOW *win; getyx(stdscr, y0, x0); win = statusline(); waddstr(win, "Command:"); buffer[length = 0] = '\0'; if (log_in != 0) { if (fgets(buffer, limit - 3, log_in) != 0) { length = (int) strlen(buffer); while (length > 0 && isspace(UChar(buffer[length - 1]))) buffer[--length] = '\0'; waddstr(win, buffer); } else { close_input(); } (void) wgetch(win); } else { int c0 = 0; for (;;) { int ch = wgetch(win); if (ch == ERR || ch == QUIT || ch == ESCAPE) { buffer[0] = '\0'; break; } else if (ch == CTRL('L')) { wrefresh(curscr); } else if (ch == '\n' || ch == KEY_ENTER) { break; } else if (ch == HELP_KEY_1) { show_panels(px); } else if (length + 3 < limit) { if (ch >= KEY_MIN) { beep(); } else if (ok_letter(UChar(ch))) { if (isalpha(UChar(c0))) { beep(); } else if (isdigit(UChar(c0))) { wprintw(win, " %c", ch); buffer[length++] = ' '; buffer[length++] = (char) (c0 = ch); } else { wprintw(win, "%c", ch); buffer[length++] = (char) (c0 = ch); } } else if (ok_digit(ch)) { if (isalpha(UChar(c0))) { wprintw(win, "%c", ch); buffer[length++] = (char) (c0 = ch); } else { beep(); } } else if (ch == ' ') { if (isdigit(UChar(c0))) { wprintw(win, "%c", ch); buffer[length++] = (char) (c0 = ch); } else { beep(); } } else { beep(); } } else { beep(); } } } wmove(stdscr, y0, x0); buffer[length] = '\0'; if (log_out && length) { fprintf(log_out, "%s\n", buffer); } return (length != 0); } static void demo_panels(InitPanel myInit, FillPanel myFill) { int itmp; PANEL *px[MAX_PANELS + 1]; char buffer[BUFSIZ]; scrollok(stdscr, FALSE); /* we don't want stdscr to scroll! */ refresh(); myInit(); memset(px, 0, sizeof(px)); while (get_command(px, buffer, sizeof(buffer))) { int limit = (int) strlen(buffer); for (itmp = 0; itmp < limit; itmp += 3) { do_panel(px, buffer + itmp, myFill); } pflush(); } #if NO_LEAKS for (itmp = 1; itmp <= MAX_PANELS; ++itmp) { my_remove_panel(px, itmp); } #endif } static void usage(int ok) { static const char *const tbl[] = { "Usage: demo_panels [options]" ,"" ,USAGE_COMMON ,"Options:" ," -i file read commands from file" ," -o file record commands in file" ," -m do not use colors" #if USE_WIDEC_SUPPORT ," -w use wide-characters in panels and background" #endif ," -x do not enclose panels in boxes" }; size_t n; for (n = 0; n < SIZEOF(tbl); n++) fprintf(stderr, "%s\n", tbl[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; bool monochrome = FALSE; InitPanel myInit = init_panel; FillPanel myFill = fill_panel; setlocale(LC_ALL, ""); while ((ch = getopt(argc, argv, OPTS_COMMON "i:o:mwx")) != -1) { switch (ch) { case 'i': log_in = fopen(optarg, "r"); break; case 'o': log_out = fopen(optarg, "w"); break; case 'm': monochrome = TRUE; break; #if USE_WIDEC_SUPPORT case 'w': myInit = init_wide_panel; myFill = fill_wide_panel; break; #endif case 'x': unboxed = TRUE; break; case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (unboxed) myFill = fill_unboxed; initscr(); cbreak(); noecho(); keypad(stdscr, TRUE); use_colors = monochrome ? FALSE : has_colors(); if (use_colors) start_color(); demo_panels(myInit, myFill); endwin(); close_input(); close_output(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the curses panel library\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/test_setupterm.c0000644000000000000000000001545614445575610016675 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/test/view.c0000644000000000000000000003657214342766153014562 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,2022 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * view.c -- a silly little viewer program * * written by Eric S. Raymond 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.145 2022/12/04 00:40:11 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 (;;) { int count; TEST_CCHAR(src, count, { int len = wcwidth(test_wch[0]); result += (len > 0) ? len : 1; ++src; } , { break; }) } #else while (*src++) result++; #endif return result; } static void finish(int sig) { endwin(); #if NO_LEAKS if (vec_lines != 0) { int n; for (n = 0; n < num_lines; ++n) { free(vec_lines[n]); } free(vec_lines); } #endif ExitProgram(sig != 0 ? EXIT_FAILURE : EXIT_SUCCESS); } static void show_all(const char *tag) { int i; int digits; char temp[BUFSIZ]; time_t this_time; for (digits = 1, i = num_lines; i > 0; i /= 10) { ++digits; } _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "view %.*s", (int) strlen(tag), tag); i = (int) strlen(temp); _nc_SPRINTF(temp + i, _nc_SLIMIT(sizeof(temp) - (size_t) i) " %.*s", (int) sizeof(temp) - i - 2, fname); move(0, 0); printw("%.*s", COLS, temp); clrtoeol(); this_time = time((time_t *) 0); _nc_STRNCPY(temp, ctime(&this_time), (size_t) 30); if ((i = (int) strlen(temp)) != 0) { temp[--i] = 0; if (move(0, COLS - i - 2) != ERR) printw(" %s", temp); } scrollok(stdscr, FALSE); /* prevent screen from moving */ for (i = 1; i < LINES; i++) { NCURSES_CH_T *s; int len; int actual = (int) (lptr + i - vec_lines); if (actual > num_lines) { if (i < LINES - 1) { int y, x; getyx(stdscr, y, x); move(i, 0); clrtobot(); move(y, x); } break; } move(i, 0); printw("%*d:", digits, actual); clrtoeol(); if ((s = lptr[i - 1]) == 0) { continue; } len = ch_len(s); if (len > shift) { #if USE_WIDEC_SUPPORT /* * An index into an array of cchar_t's is not necessarily the same * as the column-offset. A pad would do this directly. Here we * must translate (or compute a table of offsets). */ { int j; int width = 1; for (j = actual = 0; j < shift; ++j) { int count; TEST_CCHAR(s + j, count, { width = wcwidth(test_wch[0]); } , { width = 1; }); actual += width; if (actual > shift) { break; } else if (actual == shift) { ++j; break; } } if (actual < len) { if (actual > shift) addch('<'); add_wchstr(s + j + (actual > shift)); } } #else addchstr(s + shift); #endif } #if defined(NCURSES_VERSION) || defined(HAVE_WCHGAT) if (try_color) wchgat(stdscr, -1, WA_NORMAL, my_pair, NULL); #endif } setscrreg(1, LINES - 1); scrollok(stdscr, TRUE); refresh(); } static void read_file(const char *filename) { FILE *fp; int pass; int k; int width; size_t j; size_t len; struct stat sb; char *my_blob; char **my_vec = 0; WINDOW *my_win; if (stat(filename, &sb) != 0 || (sb.st_mode & S_IFMT) != S_IFREG) { failed("input is not a file"); } if (sb.st_size == 0) { failed("input is empty"); } if ((fp = fopen(filename, "r")) == 0) { failed("cannot open input-file"); } if ((my_blob = malloc((size_t) sb.st_size + 1)) == 0) { failed("cannot allocate memory for input-file"); } len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp); fclose(fp); if (len > (size_t) sb.st_size) len = (size_t) sb.st_size; my_blob[len] = '\0'; for (pass = 0; pass < 2; ++pass) { char *base = my_blob; k = 0; for (j = 0; j < len; ++j) { if (my_blob[j] == '\n') { if (pass) { my_vec[k] = base; my_blob[j] = '\0'; } base = my_blob + j + 1; ++k; } } if (base != (my_blob + j)) { if (pass) my_vec[k] = base; ++k; } num_lines = k; if (pass == 0) { if (((my_vec = typeCalloc(char *, (size_t) k + 2)) == 0)) { failed("cannot allocate line-vector #1"); } } else { if (my_vec[0] == NULL) my_vec[0] = my_blob; } } #if USE_WIDEC_SUPPORT if (!memcmp("\357\273\277", my_blob, 3)) { char *s = my_blob + 3; char *d = my_blob; Trace(("trim BOM")); do { } while ((*d++ = *s++) != '\0'); } #endif width = (int) strlen(my_vec[0]); for (k = 1; my_vec[k]; ++k) { int check = (int) (my_vec[k] - my_vec[k - 1]); if (width < check) width = check; } width = (width + 1) * 5; my_win = newwin(2, width, 0, 0); if (my_win == 0) { failed("cannot allocate temporary window"); } if ((vec_lines = typeCalloc(NCURSES_CH_T *, (size_t) num_lines + 2)) == 0) { failed("cannot allocate line-vector #2"); } /* * Use the curses library for rendering, including tab-conversion. This * will not make the resulting array's indices correspond to column for * lines containing double-width cells because the "in_wch" functions will * ignore the skipped cells. Use pads for that sort of thing. */ Trace(("slurp the file")); for (k = 0; my_vec[k]; ++k) { char *s; int y, x; #if USE_WIDEC_SUPPORT char *last = my_vec[k] + (int) strlen(my_vec[k]); wchar_t wch[2]; size_t rc; #ifndef state_unused mbstate_t state; #endif #endif /* USE_WIDEC_SUPPORT */ werase(my_win); wmove(my_win, 0, 0); #if USE_WIDEC_SUPPORT wch[1] = 0; reset_mbytes(state); #endif for (s = my_vec[k]; *s != '\0'; ++s) { #if USE_WIDEC_SUPPORT if (!n_option) { rc = (size_t) check_mbytes(wch[0], s, (size_t) (last - s), state); if ((long) rc == -1 || (long) rc == -2) { break; } s += rc - 1; waddwstr(my_win, wch); } else #endif waddch(my_win, *s & 0xff); } getyx(my_win, y, x); if (y) x = width - 1; wmove(my_win, 0, 0); /* "x + 1" works with standard curses; some implementations are buggy */ if ((vec_lines[k] = typeCalloc(NCURSES_CH_T, x + width + 1)) == 0) { failed("cannot allocate line-vector #3"); } #if USE_WIDEC_SUPPORT win_wchnstr(my_win, vec_lines[k], x); #else winchnstr(my_win, vec_lines[k], x); #endif } delwin(my_win); free(my_vec); free(my_blob); } static GCC_NORETURN void usage(int ok) { static const char *msg[] = { "Usage: view [options] file" ,"" ,USAGE_COMMON ,"Options:" ," -c use color if terminal supports it" ," -i ignore INT, QUIT, TERM signals" #if USE_WIDEC_SUPPORT ," -n use waddch (bytes) rather then wadd_wch (wide-chars)" #endif ," -s start in single-step mode, waiting for input" #ifdef TRACE ," -t trace screen updates" ," -T NUM specify trace mask" #endif }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { static const char *help[] = { "Commands:", " q,^Q,ESC - quit this program", "", " p, - 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(c))) { got_number = FALSE; value = 0; } } finish(0); /* we're done */ } ncurses-6.4-20240113/test/testcurs.c0000644000000000000000000004303714434661746015462 0ustar rootroot/* * 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.58 2023/05/28 14:23:34 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(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(key)) { if (islower(key)) key = toupper(key); for (n = 0; n < MAX_OPTIONS; ++n) { if (key == command[n].text[0]) { display_menu(old_option, new_option = n); key = ' '; break; } } } switch (key) { case 10: case 13: case KEY_ENTER: erase(); refresh(); (*command[new_option].function) (win); erase(); display_menu(old_option, new_option); break; case KEY_UP: new_option = ((new_option == 0) ? new_option : new_option - 1); display_menu(old_option, new_option); break; case KEY_DOWN: new_option = ((new_option == (MAX_OPTIONS - 1)) ? new_option : new_option + 1); display_menu(old_option, new_option); break; case 'Q': case 'q': quit = TRUE; break; default: beep(); break; case ' ': break; } if (quit == TRUE) break; } delwin(win); stop_curses(); #ifdef XCURSES XCursesExit(); #endif ExitProgram(EXIT_SUCCESS); } ncurses-6.4-20240113/test/list_keys.c0000644000000000000000000003121714523546071015601 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 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.33 2023/11/11 00:35:05 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) { 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) { 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 */ ncurses-6.4-20240113/test/test_addstr.c0000644000000000000000000002517414345204042016107 0ustar rootroot/**************************************************************************** * Copyright 2020,2022 Thomas E. Dickey * * Copyright 2009-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: test_addstr.c,v 1.20 2022/12/10 22:28:50 tom Exp $ * * Demonstrate the waddstr() and waddch functions. * Thomas Dickey - 2009/9/12 */ #include #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(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); } ncurses-6.4-20240113/test/xterm-88color.dat0000644000000000000000000001027113617625116016552 0ustar rootroot############################################################################## # 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 ncurses-6.4-20240113/test/xterm-256color.dat0000644000000000000000000001571413617625116016636 0ustar rootroot############################################################################## # 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 ncurses-6.4-20240113/test/demo_forms.c0000644000000000000000000003661014523545401015723 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 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.63 2023/11/11 00:29:53 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(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(FORM *form, 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, FORM *form) { FIELD *field; int field_rows, field_cols, field_max; int currow, curcol; if (has_colors()) { wbkgd(win, (chtype) COLOR_PAIR(1)); } werase(win); form_getyx(form, currow, curcol); wprintw(win, "Cursor: %d,%d", currow, curcol); if (data_ahead(form)) waddstr(win, " ahead"); if (data_behind(form)) waddstr(win, " behind"); waddch(win, '\n'); if ((field = current_field(form)) != 0) { FIELDTYPE *type; int nbuf; wprintw(win, "Page %d%s, Field %d/%d%s:", form_page(form), new_page(field) ? "*" : "", field_index(field), field_count(form), field_arg(field) ? "(arg)" : ""); if ((type = field_type(field)) != 0) { if (type == TYPE_ALNUM) waddstr(win, "ALNUM"); else if (type == TYPE_ALPHA) waddstr(win, "ALPHA"); else if (type == TYPE_ENUM) waddstr(win, "ENUM"); else if (type == TYPE_INTEGER) waddstr(win, "INTEGER"); #ifdef NCURSES_VERSION else if (type == TYPE_IPV4) waddstr(win, "IPV4"); #endif else if (type == TYPE_NUMERIC) waddstr(win, "NUMERIC"); else if (type == TYPE_REGEXP) waddstr(win, "REGEXP"); else waddstr(win, "other"); } if ((unsigned) field_opts(field) & O_EDIT) waddstr(win, " editable"); else waddstr(win, " readonly"); if (field_status(field)) waddstr(win, " modified"); if (dynamic_field_info(field, &field_rows, &field_cols, &field_max) != ERR) { wprintw(win, " size %dx%d (max %d)", field_rows, field_cols, field_max); } waddch(win, ' '); (void) wattrset(win, AttrArg(field_fore(field), 0)); waddstr(win, "fore"); wattroff(win, (int) field_fore(field)); waddch(win, '/'); (void) wattrset(win, AttrArg(field_back(field), 0)); waddstr(win, "back"); wattroff(win, (int) field_back(field)); wprintw(win, ", pad '%c'", field_pad(field)); waddstr(win, "\n"); for (nbuf = 0; nbuf <= 2; ++nbuf) { char *buffer; if ((buffer = field_buffer(field, nbuf)) != 0) { wprintw(win, "buffer %d:", nbuf); (void) wattrset(win, A_REVERSE); if (nbuf) { waddnstr(win, buffer, trimmed(buffer)); } else { waddstr(win, buffer); } wattroff(win, A_REVERSE); waddstr(win, "\n"); } } } wrefresh(win); } static void demo_forms(void) { FORM *form; FIELD *f[100]; /* will memset to zero */ int c; unsigned n = 0; int pg; const char *fname; static const char *my_enum[] = {"first", "second", "third", 0}; #ifdef NCURSES_MOUSE_VERSION mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); #endif help_edit_field(); MvAddStr(4, 57, "Forms Entry Test"); show_insert_mode(TRUE); refresh(); /* describe the form */ memset(f, 0, sizeof(f)); for (pg = 0; pg < 4; ++pg) { char label[80]; _nc_SPRINTF(label, _nc_SLIMIT(sizeof(label)) "Sample Form Page %d", pg + 1); f[n++] = make_label(label, 0, 15); set_new_page(f[n - 1], TRUE); switch (pg) { default: fname = "Last Name"; f[n++] = make_label(fname, 2, 0); f[n++] = make_field(fname, 3, 0, 1, 18); set_field_type(f[n - 1], TYPE_ALPHA, 1); fname = "First Name"; f[n++] = make_label(fname, 2, 20); f[n++] = make_field(fname, 3, 20, 1, 12); set_field_type(f[n - 1], TYPE_ALPHA, 1); fname = "Middle Name"; f[n++] = make_label(fname, 2, 34); f[n++] = make_field(fname, 3, 34, 1, 12); set_field_type(f[n - 1], TYPE_ALPHA, 1); break; case 1: fname = "Last Name"; f[n++] = make_label(fname, 2, 0); f[n++] = make_field(fname, 3, 0, 1, 12); set_field_type(f[n - 1], TYPE_ALPHA, 1); fname = "First Name"; f[n++] = make_label(fname, 2, 14); f[n++] = make_field(fname, 3, 14, 1, 12); set_field_type(f[n - 1], TYPE_ALPHA, 1); fname = "MI"; f[n++] = make_label(fname, 2, 28); f[n++] = make_field(fname, 3, 28, 1, 1); set_field_pad(f[n - 1], '?'); set_field_type(f[n - 1], TYPE_ALPHA, 1); fname = "First/Second/Third"; f[n++] = make_label(fname, 2, 32); f[n++] = make_field(fname, 3, 32, 1, 12); set_field_type(f[n - 1], TYPE_ENUM, my_enum, 0, 0); break; case 2: fname = "Host Name"; f[n++] = make_label(fname, 2, 0); f[n++] = make_field(fname, 3, 0, 1, 24); set_field_type(f[n - 1], TYPE_ALNUM, 1); #ifdef NCURSES_VERSION fname = "IP Address"; f[n++] = make_label(fname, 2, 26); f[n++] = make_field(fname, 3, 26, 1, 16); set_field_type(f[n - 1], TYPE_IPV4, 1); #endif break; case 3: fname = "Four digits"; f[n++] = make_label(fname, 2, 0); f[n++] = make_field(fname, 3, 0, 1, 10); set_field_type(f[n - 1], TYPE_INTEGER, 4, 0, 0); fname = "Numeric"; f[n++] = make_label(fname, 2, 13); f[n++] = make_field(fname, 3, 13, 1, 12); set_field_type(f[n - 1], TYPE_NUMERIC, 3, -10000.0, 100000000.0); fname = "Phone number"; f[n++] = make_label(fname, 2, 27); f[n++] = make_field(fname, 3, 27, 1, 16); set_field_type(f[n - 1], TYPE_REGEXP, "^([0-9]-)?[0-9]{3}-[0-9]{3}-[0-9]{4} *$");; break; } fname = "Comments"; f[n++] = make_label(fname, 5, 0); f[n++] = make_field(fname, 6, 0, 4, 46); init_edit_field(f[n - 1], get_data(fname)); } f[n] = (FIELD *) 0; if ((form = new_form(f)) != 0) { WINDOW *w; WINDOW *also; int finished = 0; display_form(form); w = form_win(form); also = newwin(getmaxy(stdscr) - getmaxy(w), COLS, getmaxy(w), 0); show_current_field(also, form); while (!finished) { switch (edit_field(form, &c)) { case E_OK: break; case E_UNKNOWN_COMMAND: finished = my_form_driver(form, c); break; default: beep(); break; } show_current_field(also, form); } erase_form(form); free_form(form); } for (c = 0; f[c] != 0; c++) { free_edit_field(f[c]); free_field(f[c]); } noraw(); nl(); #ifdef NCURSES_MOUSE_VERSION mousemask(0, (mmask_t *) 0); #endif } static void usage(int ok) { static const char *tbl[] = { "Usage: demo_forms [options] [data file]" ,"" ,USAGE_COMMON ,"Options:" ," -d make fields dynamic" ," -j NUM justify (1=left, 2=center, 3=right)" ," -m NUM set maximum size of dynamic fields" ," -o NUM specify number of offscreen rows in new_field()" ," -t NUM specify text to fill fields initially" }; unsigned int j; for (j = 0; j < SIZEOF(tbl); ++j) fprintf(stderr, "%s\n", tbl[j]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; setlocale(LC_ALL, ""); while ((ch = getopt(argc, argv, OPTS_COMMON "dj:m:o:t:")) != -1) { switch (ch) { case 'd': d_option = TRUE; break; case 'j': j_value = atoi(optarg); if (j_value < NO_JUSTIFICATION || j_value > JUSTIFY_RIGHT) usage(FALSE); break; case 'm': m_value = atoi(optarg); break; case 'o': o_value = atoi(optarg); break; case 't': t_value = optarg; break; case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } while (optind < argc) { read_data(argv[optind++]); } initscr(); cbreak(); noecho(); raw(); nonl(); /* lets us read ^M's */ intrflush(stdscr, FALSE); keypad(stdscr, TRUE); if (has_colors()) { start_color(); init_pair(1, COLOR_WHITE, COLOR_BLUE); init_pair(2, COLOR_GREEN, COLOR_BLACK); init_pair(3, COLOR_CYAN, COLOR_BLACK); bkgd((chtype) COLOR_PAIR(1)); refresh(); } demo_forms(); endwin(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the curses form library\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/xterm-color_48x48.xpm0000644000000000000000000000522612034777373017316 0ustar rootroot/* 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", "................................................", "......++++++++++++++++++++++++++++++++++........", ".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", ".....+@@@++++++++++++++++++++++++++++@@@+@+.....", ".....+@@++++++++++++++++++++++++++++++@@+@@+....", ".....+@++++++++++++++++++++++++++++++++@+@@@+...", ".....+@++###++++###++++++++++++++++++++@+@@@@+..", ".....+@+++##++++##+++++++++++++++++++++@+@@@@+..", ".....+@++++##++##++++++++++++++++++++++@+@@@@+..", ".....+@++++##++##++++++++++++++++++++++@+@@@@+..", ".....+@+++++####+++++++++++++++++++++++@+@@@@+..", ".....+@+++++####+++++++++++++++++++++++@+@@@@+..", ".....+@++++++##++++++++++++++++++++++++@+@@@@+..", ".....+@+++++####+++++++++++++++++++++++@+@@@@+..", ".....+@+++++####+++++++++++++++++++++++@+@@@@+..", ".....+@++++##++##++++++++++++++++++++++@+@@@@+..", ".....+@++++##++##++++++++++++++++++++++@+@@@@+..", ".....+@+++##++++##+++++++++++++++++++++@+@@@@+..", ".....+@++###++++###++++++++++++++++++++@+@@@@+..", ".....+@++++++++++++++++++++++++++++++++@+@@@@+..", ".....+@$+++++++++++++++++++++++++++++++@+@@@@+..", ".....+@%@@@@@@@+&&&&&++****+++==+++==++@+@@@@+..", ".....+@++++@++++&++++++*+++*++==+++==++@+@@@@+..", ".....+@++++@++++&++++++*+++*++=+=+=+=++@+@@@@+..", ".....+@++++@++++&&&&+++****+++=+=+=+=++@+@@@@+..", ".....+@++++@++++&++++++*+*++++=++=++=++@+@@@+...", ".....+@++++@++++&++++++*++*+++=++=++=++@+@@@+...", ".....+@++++@++++&&&&&++*+++*++=+++++=++@+@@+....", ".....+@++++++++++++++++++++++++++++++++@+@@+....", ".....+@++++++++++++++++++++++++++++++++@+@+.....", ".....+@@++++++++++++++++++++++++++++++@@+@+.....", ".....+@@@++++++++++++++++++++++++++++@@@++......", ".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", "......++++++++++++++++++++++++++++++++++........", "................................................", "................................................", "......++++++++++++++++++++++++++++++++++++......", ".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", ".....+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@++......", "....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@+......", "....+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@+@+......", "...+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@+......", "...+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@+@@+......", "..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@+.......", "..+@++@++++++++++++++++++++++++++@++@+@+........", ".+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@+.........", ".+++++++++++++++++++++++++++++++++++++..........", "................................................"}; ncurses-6.4-20240113/test/filter.c0000644000000000000000000002527114342766153015067 0ustar rootroot/**************************************************************************** * Copyright 2019-2020,2022 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * Author: Thomas E. Dickey 1998 * * $Id: filter.c,v 1.38 2022/12/04 00:40:11 tom Exp $ * * An example of the 'filter()' function in ncurses, this program prompts * for commands and executes them (like a command shell). It illustrates * how ncurses can be used to implement programs that are not full-screen. * * Ncurses differs slightly from SVr4 curses. The latter does not flush its * state when exiting program mode, so the attributes on the command lines of * this program 'bleed' onto the executed commands. Rather than use the * reset_shell_mode() and reset_prog_mode() functions, we could invoke endwin() * and refresh(), but that does not work any better. */ #define NEED_KEY_EVENT #include #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); 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 */ ncurses-6.4-20240113/test/hashtest.c0000644000000000000000000001546114342766153015425 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/test/test_endwin.c0000644000000000000000000001015714523444577016126 0ustar rootroot/**************************************************************************** * Copyright 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_endwin.c,v 1.2 2023/11/10 15:17:19 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; 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); } ncurses-6.4-20240113/test/edit_field.c0000644000000000000000000002637513615656212015674 0ustar rootroot/**************************************************************************** * Copyright 2019,2020 Thomas E. Dickey * * Copyright 2003-2014,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: edit_field.c,v 1.31 2020/02/02 23:34:34 tom Exp $ * * A wrapper for form_driver() which keeps track of the user's editing changes * for each field, and makes the resulting length available as a * null-terminated string in field_buffer(field,1). * * Thomas Dickey - 2003/4/26. */ #include #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", }, { KEY_F(1), MY_HELP, "show this screen", }, { KEY_BACKSPACE, REQ_DEL_PREV, "delete previous character" }, { KEY_DOWN, REQ_DOWN_CHAR, "move down 1 character" }, { KEY_END, REQ_LAST_FIELD, "go to last field" }, { KEY_HOME, REQ_FIRST_FIELD, "go to first field" }, { KEY_LEFT, REQ_LEFT_CHAR, "move left 1 character" }, { KEY_LL, REQ_LAST_FIELD, "go to last field" }, { KEY_NEXT, REQ_NEXT_FIELD, "go to next field" }, { KEY_NPAGE, REQ_NEXT_PAGE, "go to next page" }, { KEY_PPAGE, REQ_PREV_PAGE, "go to previous page" }, { KEY_PREVIOUS, REQ_PREV_FIELD, "go to previous field" }, { KEY_RIGHT, REQ_RIGHT_CHAR, "move right 1 character" }, { KEY_UP, REQ_UP_CHAR, "move up 1 character" } }; /* * Display a temporary window listing the keystroke-commands we recognize. */ void help_edit_field(void) { int used = 0; unsigned n; char **msgs = typeCalloc(char *, 3 + SIZEOF(commands)); msgs[used++] = strdup("Defined form edit/traversal keys:"); for (n = 0; n < SIZEOF(commands); ++n) { char *msg; const char *name; const char *code = keyname(commands[n].code); size_t need = 5; #ifdef NCURSES_VERSION if ((name = form_request_name(commands[n].result)) == 0) #endif name = commands[n].help; need = 5 + strlen(code) + strlen(name); msg = typeMalloc(char, need); _nc_SPRINTF(msg, _nc_SLIMIT(need) "%s -- %s", code, name); msgs[used++] = msg; } msgs[used++] = strdup("Arrow keys move within a field as you would expect."); msgs[used] = 0; popup_msg2(stdscr, msgs); for (n = 0; msgs[n] != 0; ++n) { free(msgs[n]); } free(msgs); } static int offset_in_field(FORM *form) { FIELD *field = current_field(form); int currow, curcol; form_getyx(form, currow, curcol); return curcol + currow * (int) field->dcols; } static void inactive_field(FIELD *f) { set_field_back(f, field_attrs(f)->background); } FieldAttrs * field_attrs(FIELD *f) { return (FieldAttrs *) field_userptr(f); } static int buffer_length(FIELD *f) { return field_attrs(f)->row_lengths[0]; } static void set_buffer_length(FIELD *f, int length) { field_attrs(f)->row_lengths[0] = length; } /* * The userptr is used in edit_field.c's inactive_field(), as well as for * keeping track of the actual lengths of lines in a multiline field. */ void init_edit_field(FIELD *f, char *value) { char empty[1]; FieldAttrs *ptr = field_attrs(f); if (ptr == 0) { int rows, cols, frow, fcol, nrow, nbuf; ptr = typeCalloc(FieldAttrs, (size_t) 1); ptr->background = field_back(f); if (field_info(f, &rows, &cols, &frow, &fcol, &nrow, &nbuf) == E_OK) { ptr->row_count = nrow; ptr->row_lengths = typeCalloc(int, (size_t) nrow + 1); } } if (value == 0) { value = empty; *value = '\0'; } set_field_userptr(f, (void *) ptr); set_field_buffer(f, 0, value); /* will be formatted */ set_field_buffer(f, 1, value); /* will be unformatted */ set_buffer_length(f, (int) strlen(value)); } int edit_field(FORM *form, int *result) { int ch = wgetch(form_win(form)); int status; FIELD *before; unsigned n; int length; int before_row; int before_col; int before_off = offset_in_field(form); form_getyx(form, before_row, before_col); before = current_field(form); set_field_back(before, A_NORMAL); if (ch <= KEY_MAX) { set_field_back(before, A_REVERSE); } else if (ch <= MAX_FORM_COMMAND) { inactive_field(before); } *result = ch; for (n = 0; n < SIZEOF(commands); ++n) { if (commands[n].code == ch) { *result = commands[n].result; break; } } status = form_driver(form, *result); if (status == E_OK) { bool modified = TRUE; length = buffer_length(before); if (length < before_off) length = before_off; switch (*result) { case REQ_CLR_EOF: length = before_off; break; case REQ_CLR_EOL: if ((int) (before_row + 1) == (int) (before->rows)) length = before_off; break; case REQ_CLR_FIELD: length = 0; break; case REQ_DEL_CHAR: if (length > before_off) --length; break; case REQ_DEL_PREV: if (length > 0) { if (before_col > 0) { --length; } else if (before_row > 0) { length -= (int) before->cols + before_col; } } break; case REQ_NEW_LINE: length += (int) before->cols; break; #if 0 /* FIXME: finish these */ case REQ_DEL_LINE: /* delete line */ case REQ_DEL_WORD: /* delete word at cursor */ case REQ_INS_CHAR: /* insert blank char at cursor */ case REQ_INS_LINE: /* insert blank line at cursor */ case REQ_INS_MODE: /* begin insert mode */ case REQ_OVL_MODE: /* begin overlay mode */ #endif /* ignore all of the motion commands */ case REQ_SCR_BCHAR: /* FALLTHRU */ case REQ_SCR_BHPAGE: /* FALLTHRU */ case REQ_SCR_BLINE: /* FALLTHRU */ case REQ_SCR_BPAGE: /* FALLTHRU */ case REQ_SCR_FCHAR: /* FALLTHRU */ case REQ_SCR_FHPAGE: /* FALLTHRU */ case REQ_SCR_FLINE: /* FALLTHRU */ case REQ_SCR_FPAGE: /* FALLTHRU */ case REQ_SCR_HBHALF: /* FALLTHRU */ case REQ_SCR_HBLINE: /* FALLTHRU */ case REQ_SCR_HFHALF: /* FALLTHRU */ case REQ_SCR_HFLINE: /* FALLTHRU */ case REQ_BEG_FIELD: /* FALLTHRU */ case REQ_BEG_LINE: /* FALLTHRU */ case REQ_DOWN_CHAR: /* FALLTHRU */ case REQ_DOWN_FIELD: /* FALLTHRU */ case REQ_END_FIELD: /* FALLTHRU */ case REQ_END_LINE: /* FALLTHRU */ case REQ_FIRST_FIELD: /* FALLTHRU */ case REQ_FIRST_PAGE: /* FALLTHRU */ case REQ_LAST_FIELD: /* FALLTHRU */ case REQ_LAST_PAGE: /* FALLTHRU */ case REQ_LEFT_CHAR: /* FALLTHRU */ case REQ_LEFT_FIELD: /* FALLTHRU */ case REQ_NEXT_CHAR: /* FALLTHRU */ case REQ_NEXT_CHOICE: /* FALLTHRU */ case REQ_NEXT_FIELD: /* FALLTHRU */ case REQ_NEXT_LINE: /* FALLTHRU */ case REQ_NEXT_PAGE: /* FALLTHRU */ case REQ_NEXT_WORD: /* FALLTHRU */ case REQ_PREV_CHAR: /* FALLTHRU */ case REQ_PREV_CHOICE: /* FALLTHRU */ case REQ_PREV_FIELD: /* FALLTHRU */ case REQ_PREV_LINE: /* FALLTHRU */ case REQ_PREV_PAGE: /* FALLTHRU */ case REQ_PREV_WORD: /* FALLTHRU */ case REQ_RIGHT_CHAR: /* FALLTHRU */ case REQ_RIGHT_FIELD: /* FALLTHRU */ case REQ_SFIRST_FIELD: /* FALLTHRU */ case REQ_SLAST_FIELD: /* FALLTHRU */ case REQ_SNEXT_FIELD: /* FALLTHRU */ case REQ_SPREV_FIELD: /* FALLTHRU */ case REQ_UP_CHAR: /* FALLTHRU */ case REQ_UP_FIELD: /* FALLTHRU */ case REQ_VALIDATION: /* FALLTHRU */ modified = FALSE; break; default: modified = FALSE; if (ch >= MIN_FORM_COMMAND) { beep(); } else if (isprint(ch)) { modified = TRUE; } break; } /* * If we do not force a re-validation, then field_buffer 0 will * be lagging by one character. */ if (modified && form_driver(form, REQ_VALIDATION) == E_OK && *result < MIN_FORM_COMMAND) ++length; set_buffer_length(before, length); } if (current_field(form) != before) inactive_field(before); return status; } void free_edit_field(FIELD *f) { FieldAttrs *ptr = field_attrs(f); if (ptr != 0) { free(ptr->row_lengths); free(ptr); } } #else extern void no_edit_field(void); void no_edit_field(void) { } #endif ncurses-6.4-20240113/test/terminal.xbm0000644000000000000000000000732605557407511015760 0ustar rootroot/*****************************************************************************/ /** 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}; ncurses-6.4-20240113/test/test_add_wchstr.c0000644000000000000000000003516614345204042016752 0ustar rootroot/**************************************************************************** * Copyright 2020-2021,2022 Thomas E. Dickey * * Copyright 2009-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: test_add_wchstr.c,v 1.34 2022/12/10 22:28:50 tom Exp $ * * Demonstrate the waddwchstr() and wadd_wch functions. * Thomas Dickey - 2009/9/12 * * Note: to provide inputs for *add_wch(), we use setcchar(). A quirk of the * X/Open definition for that function is that the string contains no * characters with negative width. Any control character (such as tab) falls * into that category. So it follows that *add_wch() cannot render a tab * character because there is no legal way to construct a cchar_t containing * one. X/Open does not document this, and it would be logical to assume that * *addwchstr() has the same limitation, but it uses a wchar_t string directly, * and does not document how tabs are handled. */ #include #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, 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 ncurses-6.4-20240113/test/demo_forms.txt0000644000000000000000000000035712154635507016324 0ustar rootroot# $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 . ncurses-6.4-20240113/test/listused.sh0000755000000000000000000001316014264564142015620 0ustar rootroot#!/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 ncurses-6.4-20240113/test/inserts.c0000644000000000000000000002570614345204042015257 0ustar rootroot/**************************************************************************** * Copyright 2020,2022 Thomas E. Dickey * * Copyright 2002-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: inserts.c,v 1.34 2022/12/10 22:28:50 tom Exp $ * * Demonstrate the winsstr() and winsch functions. * Thomas Dickey - 2002/10/19 */ #include #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(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 */ ncurses-6.4-20240113/test/back_ground.c0000644000000000000000000002116214345204042016036 0ustar rootroot/**************************************************************************** * Copyright 2021,2022 Thomas E. Dickey * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: back_ground.c,v 1.9 2022/12/10 22:28:50 tom Exp $ */ #include #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 wide_fill = L' '; static wchar_t decode_wchar(const char *value) { long result; char *next = NULL; int radix = 0; if (!strncmp(value, "U+", 2)) { value += 2; radix = 16; } result = strtol(value, &next, radix); if (next == value || (next == NULL || *next != '\0')) { fprintf(stderr, "decoding wchar_t: %s\n", value); exit(EXIT_FAILURE); } return (wchar_t) result; } static void test_background(void) { NCURSES_COLOR_T f, b; int row; int chr; wchar_t blank[2]; wchar_t graphics[2]; cchar_t data; if (pair_content(0, &f, &b) == ERR) { printw("pair 0 contains no data\n"); } else { printw("pair 0 contains (%d,%d)\n", (int) f, (int) b); } dump_window(stdscr); blank[0] = wide_fill; blank[1] = L'\0'; printw("Initializing pair 1 to red/%s\n", color_name(default_bg)); init_pair(1, COLOR_RED, (NCURSES_COLOR_T) default_bg); setcchar(&data, blank, A_NORMAL, 1, NULL); bkgrndset(&data); printw("RED/BLACK\n"); dump_window(stdscr); printw("Initializing pair 2 to %s/blue\n", color_name(default_fg)); init_pair(2, (NCURSES_COLOR_T) default_fg, COLOR_BLUE); setcchar(&data, blank, A_NORMAL, 2, NULL); bkgrndset(&data); printw("This line should be %s/blue\n", color_name(default_fg)); dump_window(stdscr); printw("Initializing pair 3 to %s/cyan (ACS_HLINE)\n", color_name(default_fg)); init_pair(3, (NCURSES_COLOR_T) default_fg, COLOR_CYAN); printw("...and drawing a box which should be followed by lines\n"); graphics[0] = ACS_HLINE & A_CHARTEXT; graphics[1] = L'\0'; setcchar(&data, graphics, A_ALTCHARSET, 3, NULL); bkgrndset(&data); /* * Characters from vt100 line-drawing should be mapped to line-drawing, * since A_ALTCHARSET is set in the background, and the character part * of the background is replaced by the nonblank characters written. * * Characters not in the line-drawing range are usually sent as-is. * * With SVr4 curses it is possible to rely on this to mix uppercase text * with the (lowercase) line-drawing characters. ncurses uses some of * the uppercase characters for encoding thick- and double-lines. */ row = 7; mvprintw(row++, 10, "l"); for (chr = 0; chr < 32; ++chr) AddCh(' '); printw("x\n"); chr = 32; while (chr < 128) { if ((chr % 32) == 0) mvprintw(row++, 10, "x"); AddCh((chr == 127) ? ' ' : chr); if ((++chr % 32) == 0) printw("x\n"); } mvprintw(row++, 10, "m"); for (chr = 0; chr < 32; ++chr) AddCh(' '); printw("j\n"); dump_window(stdscr); setcchar(&data, blank, A_NORMAL, 0, NULL); bkgrndset(&data); printw("Default Colors\n"); dump_window(stdscr); printw("Resetting colors to pair 1\n"); setcchar(&data, blank, A_NORMAL, 1, NULL); bkgrndset(&data); printw("This line should be red/%s\n", color_name(default_bg)); dump_window(stdscr); printw("Setting screen to pair 0\n"); setcchar(&data, blank, A_NORMAL, 0, NULL); bkgrndset(&data); dump_window(stdscr); printw("Setting screen to pair 1\n"); setcchar(&data, blank, A_NORMAL, 1, NULL); bkgrndset(&data); dump_window(stdscr); printw("Setting screen to pair 2\n"); setcchar(&data, blank, A_NORMAL, 2, NULL); bkgrndset(&data); dump_window(stdscr); printw("Setting screen to pair 3\n"); setcchar(&data, blank, A_NORMAL, 3, NULL); bkgrndset(&data); dump_window(stdscr); printw("Setting screen to pair 0\n"); setcchar(&data, blank, A_NORMAL, 0, NULL); bkgrndset(&data); dump_window(stdscr); } static void usage(int ok) { static const char *msg[] = { "Usage: background [options]" ,"" ,USAGE_COMMON ,"Options:" #if HAVE_ASSUME_DEFAULT_COLORS ," -a invoke assume_default_colors, repeat to use in init_pair" #endif ," -b XXX specify background color" #if HAVE_USE_DEFAULT_COLORS ," -d invoke use_default_colors, repeat to use in init_pair" #endif ," -f XXX specify foreground color" ," -l FILE log window-dumps to this file" ," -w fill background with stipple pattern" ," -W CODE fill background with this Unicode value" }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { #if HAVE_ASSUME_DEFAULT_COLORS int a_option = 0; #endif #if HAVE_USE_DEFAULT_COLORS int d_option = 0; #endif int ch; setlocale(LC_ALL, ""); while ((ch = getopt(argc, argv, OPTS_COMMON "ab:df:l:wW:")) != -1) { switch (ch) { #if HAVE_ASSUME_DEFAULT_COLORS case 'a': ++a_option; break; #endif case 'b': default_bg = color_code(optarg); break; #if HAVE_USE_DEFAULT_COLORS case 'd': ++d_option; break; #endif case 'f': default_fg = color_code(optarg); break; case 'l': if (!open_dump(optarg)) usage(FALSE); break; case 'w': wide_fill = L'\u2591'; break; case 'W': wide_fill = decode_wchar(optarg); break; case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } #if HAVE_USE_DEFAULT_COLORS && HAVE_ASSUME_DEFAULT_COLORS if (a_option && d_option) { fprintf(stderr, "Use either -a or -d option, but not both\n"); ExitProgram(EXIT_FAILURE); } #endif initscr(); cbreak(); noecho(); if (has_colors()) { start_color(); #if HAVE_USE_DEFAULT_COLORS if (d_option) { printw("Using default colors...\n"); use_default_colors(); if (d_option > 1) { default_fg = -1; default_bg = -1; } } #endif #if HAVE_ASSUME_DEFAULT_COLORS if (a_option) { printw("Using assumed colors %s/%s...\n", color_name(default_fg), color_name(default_bg)); assume_default_colors(default_fg, default_bg); if (a_option > 1) { default_fg = -1; default_bg = -1; } } #endif test_background(); } else { printw("This demo requires a color terminal"); getch(); } endwin(); close_dump(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the wide-curses library\n"); ExitProgram(EXIT_FAILURE); } #endif /* USE_WIDEC_SUPPORT */ ncurses-6.4-20240113/test/README0000644000000000000000000013306314530462152014304 0ustar rootroot------------------------------------------------------------------------------- -- Copyright 2018-2022,2023 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.80 2023/11/25 21:17:30 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_setupterm test_termattrs newterm_sp - newwin test: cardfile chgat clip_printw demo_defkey demo_forms demo_keyok demo_menus demo_panels ditto firstlast inch_wide inchs ins_wide insdelln inserts knight movewindow ncurses newdemo popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs view xmas newwin_sp lib: ncurses nl test: demo_forms dup_field move_field ncurses rain testcurs nl_sp lib: ncurses nocbreak test: testcurs nocbreak_sp test: sp_tinfo nodelay test: demo_new_pair ditto extended_color firework gdc lrtest ncurses newdemo padview rain tclock test_opaque view worm xmas noecho test: back_ground background bs cardfile chgat clip_printw color_content color_set combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels demo_tabs ditto dup_field extended_color firework firstlast foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts knight lrtest move_field movewindow ncurses padview pair_content picsmap rain redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testcurs view worm xmas noecho_sp lib: ncurses nofilter - nofilter_sp - nonl test: bs demo_forms dup_field hashtest move_field movewindow ncurses padview test_mouse view worm xmas nonl_sp lib: ncurses noqiflush - noqiflush_sp test: sp_tinfo noraw test: demo_forms demo_menus dup_field move_field ncurses testcurs noraw_sp test: sp_tinfo notimeout test: ncurses test_opaque numcodes test: demo_termcap test_arrays progs: dump_entry numfnames test: demo_terminfo test_arrays progs: dump_entry numnames test: demo_terminfo test_arrays progs: dump_entry infocmp ospeed test: demo_termcap progs: tset overlay test: ncurses testcurs xmas overwrite test: ncurses savescreen pair_content test: back_ground background color_set pair_content pair_content_sp lib: ncurses pecho_wchar - pechochar - pnoutrefresh test: ncurses padview popup_msg prefresh test: testcurs printw test: back_ground background blue bs color_content color_set combine demo_altkeys demo_defkey demo_keyok demo_tabs extended_color filter foldkeys ncurses pair_content savescreen test_delwin test_unget_wch testcurs testscanw view putp test: filter test_mouse test_sgr progs: tput putp_sp test: sp_tinfo putwin test: ncurses qiflush - qiflush_sp test: sp_tinfo raw test: demo_forms dup_field move_field ncurses redraw testcurs raw_sp test: sp_tinfo redrawwin test: combine padview redraw view refresh test: blue bs color_content demo_defkey demo_forms demo_keyok demo_menus demo_panels demo_tabs dots_curses dots_mvcur dots_xcurses dup_field echochar filter firstlast form_driver_w gdc hanoi hashtest lrtest move_field movewindow ncurses pair_content picsmap savescreen tclock test_delwin test_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_mouse test_setupterm test_sgr test_termattrs test_tparm test_vid_puts test_vidputs progs: clear tabs tput tset slk_attr - slk_attr_off - slk_attr_on - slk_attr_set test: ncurses slk_attr_set_sp - slk_attr_sp - slk_attroff lib: ncurses slk_attroff_sp - slk_attron lib: ncurses slk_attron_sp - slk_attrset test: extended_color ncurses slk_attrset_sp - slk_clear test: ncurses slk_clear_sp - slk_color test: ncurses slk_color_sp - slk_init test: extended_color ncurses slk_init_sp - slk_label test: ncurses slk_label_sp - slk_noutrefresh test: extended_color ncurses slk_noutrefresh_sp - slk_refresh test: ncurses slk_refresh_sp lib: ncurses slk_restore test: ncurses slk_restore_sp lib: ncurses slk_set test: extended_color ncurses slk_set_sp - slk_touch test: extended_color ncurses slk_touch_sp lib: ncurses slk_wset test: ncurses standend test: blue gdc ncurses standout test: blue ncurses start_color test: back_ground background blue bs cardfile chgat clip_printw color_content color_set demo_forms demo_menus demo_new_pair demo_panels dots_curses dots_xcurses dup_field echochar extended_color filter firework gdc hanoi ins_wide insdelln inserts knight move_field ncurses newdemo padview pair_content picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr testaddch testcurs view worm xmas start_color_sp - stdscr test: back_ground background bs chgat clip_printw color_content combine demo_altkeys demo_forms demo_menus demo_new_pair demo_panels ditto dup_field edit_field extended_color filter firework foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts key_names keynames knight lrtest move_field movewindow ncurses padview pair_content picsmap rain redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testcurs testscanw view worm xmas strcodes test: demo_termcap test_arrays progs: dump_entry strfnames test: demo_terminfo list_keys test_arrays progs: dump_entry strnames test: demo_terminfo foldkeys list_keys test_arrays test_tparm progs: dump_entry infocmp tic subpad test: testcurs subwin test: movewindow ncurses newdemo testcurs syncok test: test_opaque term_attrs test: ncurses test_termattrs term_attrs_sp - termattrs test: ncurses test_termattrs testcurs termattrs_sp lib: ncurses termname test: list_keys ncurses testcurs termname_sp test: sp_tinfo tgetent test: demo_termcap dots_termcap railroad tgetent_sp test: sp_tinfo tgetflag test: demo_termcap tgetflag_sp test: sp_tinfo tgetnum test: demo_termcap dots_termcap railroad tgetnum_sp test: sp_tinfo tgetstr test: demo_termcap dots_termcap railroad tgetstr_sp test: sp_tinfo tgoto test: dots_termcap railroad 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 ncurses-6.4-20240113/test/mk-test.awk0000644000000000000000000001540014157661714015520 0ustar rootroot# $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]; } } ncurses-6.4-20240113/test/dots_mvcur.c0000644000000000000000000001544514356325054015765 0ustar rootroot/**************************************************************************** * Copyright 2019-2022,2023 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.31 2023/01/07 17:21:48 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(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 ncurses-6.4-20240113/test/dup_field.c0000644000000000000000000002660514523545326015535 0ustar rootroot/**************************************************************************** * Copyright 2020-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: dup_field.c,v 1.8 2023/11/11 00:29:10 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" }, { KEY_F(1), MY_HELP, "show this screen", }, { KEY_BACKSPACE, REQ_DEL_PREV, "delete previous character" }, { KEY_BTAB, REQ_PREV_FIELD, "go to previous field" }, { KEY_DOWN, REQ_DOWN_CHAR, "move down 1 character" }, { KEY_END, REQ_LAST_FIELD, "go to last field" }, { KEY_HOME, REQ_FIRST_FIELD, "go to first field" }, { KEY_LEFT, REQ_LEFT_CHAR, "move left 1 character" }, { KEY_NEXT, REQ_NEXT_FIELD, "go to next field" }, { KEY_PREVIOUS, REQ_PREV_FIELD, "go to previous field" }, { KEY_RIGHT, REQ_RIGHT_CHAR, "move right 1 character" }, { KEY_UP, REQ_UP_CHAR, "move up 1 character" }, { DO_DEMO, MY_DEMO, "duplicate current field" } }; /* *INDENT-ON* */ static void my_help_edit_field(void) { int used = 0; unsigned n; char **msgs = typeCalloc(char *, 3 + SIZEOF(commands)); msgs[used++] = strdup("Defined form edit/traversal keys:"); for (n = 0; n < SIZEOF(commands); ++n) { char *msg; const char *name; const char *code = keyname(commands[n].code); size_t need = 5; #ifdef NCURSES_VERSION if ((name = form_request_name(commands[n].result)) == 0) #endif name = commands[n].help; need = 5 + strlen(code) + strlen(name); msg = typeMalloc(char, need); _nc_SPRINTF(msg, _nc_SLIMIT(need) "%s -- %s", code, name); msgs[used++] = msg; } msgs[used++] = strdup("Arrow keys move within a field as you would expect."); msgs[used] = 0; popup_msg2(stdscr, msgs); for (n = 0; msgs[n] != 0; ++n) { free(msgs[n]); } free(msgs); } static FIELD * make_label(const char *label, int frow, int fcol) { FIELD *f = new_field(1, (int) strlen(label), frow, fcol, 0, 0); if (f) { set_field_buffer(f, 0, label); set_field_opts(f, (int) ((unsigned) field_opts(f) & (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(FIELD *f) { return (FieldAttrs *) field_userptr(f); } static int buffer_length(FIELD *f) { return my_field_attrs(f)->row_lengths[0]; } static void set_buffer_length(FIELD *f, int length) { my_field_attrs(f)->row_lengths[0] = length; } static int offset_in_field(FORM *form) { FIELD *field = current_field(form); int currow, curcol; form_getyx(form, currow, curcol); return curcol + currow * (int) field->dcols; } static void inactive_field(FIELD *f) { set_field_back(f, my_field_attrs(f)->background); } static int my_edit_field(FORM *form, int *result) { int ch = wgetch(form_win(form)); int status; FIELD *before; unsigned n; int before_row; int before_col; int before_off = offset_in_field(form); form_getyx(form, before_row, before_col); before = current_field(form); set_field_back(before, A_NORMAL); if (ch <= KEY_MAX) { set_field_back(before, A_REVERSE); } else if (ch <= MAX_FORM_COMMAND) { inactive_field(before); } *result = ch; for (n = 0; n < SIZEOF(commands); ++n) { if (commands[n].code == ch) { *result = commands[n].result; break; } } status = form_driver(form, *result); if (status == E_OK) { bool modified = TRUE; int length = buffer_length(before); if (length < before_off) length = before_off; switch (*result) { case REQ_CLR_EOF: length = before_off; break; case REQ_CLR_EOL: if ((int) (before_row + 1) == (int) (before->rows)) length = before_off; break; case REQ_CLR_FIELD: length = 0; break; case REQ_DEL_CHAR: if (length > before_off) --length; break; case REQ_DEL_PREV: if (length > 0) { if (before_col > 0) { --length; } else if (before_row > 0) { length -= (int) before->cols + before_col; } } break; case REQ_NEW_LINE: length += (int) before->cols; break; default: modified = (ch < MIN_FORM_COMMAND && isprint(ch)); break; } /* * If we do not force a re-validation, then field_buffer 0 will * be lagging by one character. */ if (modified && form_driver(form, REQ_VALIDATION) == E_OK && *result < MIN_FORM_COMMAND) ++length; set_buffer_length(before, length); } if (current_field(form) != before) inactive_field(before); return status; } static FIELD ** copy_fields(FIELD **source, FIELD *extra, size_t length) { FIELD **target = typeCalloc(FIELD *, length + 1); memcpy(target, source, length * sizeof(FIELD *)); target[length] = extra; return target; } static void do_demo(FORM *form) { int count = field_count(form); FIELD *my_field = current_field(form); FIELD **old_fields = form_fields(form); if (count > 0 && old_fields != NULL && my_field != NULL) { FIELD **new_fields = copy_fields(old_fields, dup_field(my_field, form_field_row(my_field) + 1, form_field_col(my_field)), (size_t) count); if (new_fields != NULL) set_form_fields(form, new_fields); } } static int my_form_driver(FORM *form, int c) { switch (c) { case MY_QUIT: if (form_driver(form, REQ_VALIDATION) == E_OK) return (TRUE); break; case MY_HELP: my_help_edit_field(); break; case MY_DEMO: do_demo(form); break; default: beep(); break; } return (FALSE); } static void demo_forms(void) { FORM *form; int c; unsigned n = 0; const char *fname; /* describe the form */ all_fields[n++] = make_label("Sample Form", 0, 15); fname = "Last Name"; all_fields[n++] = make_label(fname, 2, 0); all_fields[n++] = make_field(3, 0, 1, 18); set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); fname = "First Name"; all_fields[n++] = make_label(fname, 2, 20); all_fields[n++] = make_field(3, 20, 1, 12); set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); fname = "Middle Name"; all_fields[n++] = make_label(fname, 2, 34); all_fields[n++] = make_field(3, 34, 1, 12); set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); fname = "Comments"; all_fields[n++] = make_label(fname, 5, 0); all_fields[n++] = make_field(6, 0, 4, 46); init_edit_field(all_fields[n - 1], empty); all_fields[n] = (FIELD *) 0; if ((form = new_form(all_fields)) != 0) { int finished = 0; post_form(form); while (!finished) { switch (my_edit_field(form, &c)) { case E_OK: break; case E_UNKNOWN_COMMAND: finished = my_form_driver(form, c); break; default: beep(); break; } } erase_form(form); free_form(form); } for (c = 0; all_fields[c] != 0; c++) { free_edit_field(all_fields[c]); free_field(all_fields[c]); } noraw(); nl(); } static void usage(int ok) { static const char *msg[] = { "Usage: dup_field [options]" ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) usage(FALSE); setlocale(LC_ALL, ""); initscr(); cbreak(); noecho(); raw(); nonl(); /* lets us read ^M's */ intrflush(stdscr, FALSE); keypad(stdscr, TRUE); if (has_colors()) { start_color(); init_pair(1, COLOR_WHITE, COLOR_BLUE); init_pair(2, COLOR_GREEN, COLOR_BLACK); init_pair(3, COLOR_CYAN, COLOR_BLACK); bkgd((chtype) COLOR_PAIR(1)); refresh(); } demo_forms(); endwin(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the curses form library\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/demo_new_pair.c0000644000000000000000000002365214342766153016413 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,2022 Thomas E. Dickey * * Copyright 2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: demo_new_pair.c,v 1.27 2022/12/04 00:40:11 tom Exp $ * * Demonstrate the alloc_pair() function. */ #include #include #include #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 int main(void) { printf("This program requires the ncurses alloc_pair function\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/dots.c0000644000000000000000000001473614356325054014553 0ustar rootroot/**************************************************************************** * Copyright 2019-2022,2023 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.45 2023/01/07 17:21:48 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(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 ncurses-6.4-20240113/test/modules0000644000000000000000000001534714523414204015020 0ustar rootroot# $Id: modules,v 1.79 2023/11/10 11:48:20 tom Exp $ ############################################################################## # 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 1997-on # # Test-Program modules @ base back_ground progs $(srcdir) $(HEADER_DEPS) background progs $(srcdir) $(HEADER_DEPS) blue progs $(srcdir) $(HEADER_DEPS) bs progs $(srcdir) $(HEADER_DEPS) cardfile progs $(srcdir) $(HEADER_DEPS) $(incdir)/panel.h $(incdir)/form.h chgat progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h clip_printw progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h color_content progs $(srcdir) $(HEADER_DEPS) color_set progs $(srcdir) $(HEADER_DEPS) combine progs $(srcdir) $(HEADER_DEPS) demo_altkeys progs $(srcdir) $(HEADER_DEPS) demo_defkey progs $(srcdir) $(HEADER_DEPS) demo_forms progs $(srcdir) $(HEADER_DEPS) $(srcdir)/edit_field.h demo_keyok progs $(srcdir) $(HEADER_DEPS) demo_menus progs $(srcdir) $(HEADER_DEPS) $(incdir)/menu.h demo_new_pair progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h demo_panels progs $(srcdir) $(HEADER_DEPS) $(incdir)/panel.h demo_tabs progs $(srcdir) $(HEADER_DEPS) demo_termcap progs $(srcdir) $(HEADER_DEPS) demo_terminfo progs $(srcdir) $(HEADER_DEPS) ditto progs $(srcdir) $(HEADER_DEPS) dots progs $(srcdir) $(HEADER_DEPS) dots_curses progs $(srcdir) $(HEADER_DEPS) dots_mvcur progs $(srcdir) $(HEADER_DEPS) dots_termcap progs $(srcdir) $(HEADER_DEPS) dots_xcurses progs $(srcdir) $(HEADER_DEPS) dump_window progs $(srcdir) $(HEADER_DEPS) $(srcdir)/dump_window.h dup_field progs $(srcdir) $(HEADER_DEPS) $(srcdir)/edit_field.h echochar progs $(srcdir) $(HEADER_DEPS) edit_field progs $(srcdir) $(HEADER_DEPS) $(srcdir)/edit_field.h $(srcdir)/popup_msg.h extended_color progs $(srcdir) $(HEADER_DEPS) filter progs $(srcdir) $(HEADER_DEPS) firework progs $(srcdir) $(HEADER_DEPS) firstlast progs $(srcdir) $(HEADER_DEPS) foldkeys progs $(srcdir) $(HEADER_DEPS) form_driver_w progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h gdc progs $(srcdir) $(HEADER_DEPS) hanoi progs $(srcdir) $(HEADER_DEPS) hashtest progs $(srcdir) $(HEADER_DEPS) inch_wide progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h inchs progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h ins_wide progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h insdelln progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h inserts progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h key_names progs $(srcdir) $(HEADER_DEPS) keynames progs $(srcdir) $(HEADER_DEPS) knight progs $(srcdir) $(HEADER_DEPS) list_keys progs $(srcdir) $(HEADER_DEPS) lrtest progs $(srcdir) $(HEADER_DEPS) move_field progs $(srcdir) $(HEADER_DEPS) $(srcdir)/edit_field.h movewindow progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h ncurses progs $(srcdir) $(HEADER_DEPS) $(incdir)/panel.h $(incdir)/menu.h $(incdir)/form.h newdemo progs $(srcdir) $(HEADER_DEPS) padview progs $(srcdir) $(HEADER_DEPS) $(srcdir)/widechars.h $(srcdir)/popup_msg.h pair_content progs $(srcdir) $(HEADER_DEPS) picsmap progs $(srcdir) $(HEADER_DEPS) popup_msg progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h railroad progs $(srcdir) $(HEADER_DEPS) rain progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h redraw progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h savescreen progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h $(srcdir)/parse_rgb.h sp_tinfo progs $(srcdir) $(HEADER_DEPS) tclock progs $(srcdir) $(HEADER_DEPS) test_add_wchstr progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h test_addchstr progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h test_addstr progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h test_addwstr progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h test_arrays progs $(srcdir) $(HEADER_DEPS) test_delwin progs $(srcdir) $(HEADER_DEPS) test_endwin progs $(srcdir) $(HEADER_DEPS) test_get_wstr progs $(srcdir) $(HEADER_DEPS) test_getstr progs $(srcdir) $(HEADER_DEPS) test_instr progs $(srcdir) $(HEADER_DEPS) test_inwstr progs $(srcdir) $(HEADER_DEPS) test_mouse progs $(srcdir) $(HEADER_DEPS) test_opaque progs $(srcdir) $(HEADER_DEPS) test_setupterm progs $(srcdir) $(HEADER_DEPS) test_sgr progs $(srcdir) $(HEADER_DEPS) test_termattrs progs $(srcdir) $(HEADER_DEPS) test_tparm progs $(srcdir) $(HEADER_DEPS) test_unget_wch progs $(srcdir) $(HEADER_DEPS) test_vid_puts progs $(srcdir) $(HEADER_DEPS) test_vidputs progs $(srcdir) $(HEADER_DEPS) testaddch progs $(srcdir) $(HEADER_DEPS) testcurs progs $(srcdir) $(HEADER_DEPS) testscanw progs $(srcdir) $(HEADER_DEPS) view progs $(srcdir) $(HEADER_DEPS) $(srcdir)/widechars.h $(srcdir)/popup_msg.h worm progs $(srcdir) $(HEADER_DEPS) xmas progs $(srcdir) $(HEADER_DEPS) # vile:makemode ncurses-6.4-20240113/test/mini.xterm_48x48.xpm0000644000000000000000000002012012034362362017107 0ustar rootroot/* 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.@ @ @ @ @ @ @ @ @ @ @ @ @ ^ ! $ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ $ . ", " . & & & & & & & & & & & & & . . , & & & & & & & & & & & & & & & , . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " ", " "}; ncurses-6.4-20240113/test/Makefile.in0000644000000000000000000001425414157464014015475 0ustar rootroot# $Id: Makefile.in,v 1.130 2021/12/18 23:00:28 tom Exp $ ############################################################################## # Copyright 2020,2021 Thomas E. Dickey # # Copyright 1998-2017,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1996-on # # Makefile for ncurses tests. # turn off _all_ suffix rules; we'll generate our own .SUFFIXES: SHELL = @SHELL@ VPATH = @srcdir@ @SET_MAKE@ destdir = x = @EXEEXT@ o = .@OBJEXT@ PACKAGE = @PACKAGE@ MODEL = ../@DFT_OBJ_SUBDIR@ top_srcdir = @top_srcdir@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ bindir = @bindir@ libexecdir = @libexecdir@ libdir = @libdir@ datarootdir = @datarootdir@ datadir = @datadir@ real_bindir = $(libexecdir)/$(PACKAGE) BINDIR = $(DESTDIR)$(bindir) LIBEXECDIR = $(DESTDIR)$(libexecdir) LIBDIR = $(DESTDIR)$(libdir) DATADIR = $(DESTDIR)$(datadir) REAL_BINDIR = $(LIBEXECDIR)/$(PACKAGE) LIBTOOL = @LIBTOOL@ LIBTOOL_OPTS = @LIBTOOL_OPTS@ LIBTOOL_CLEAN = @LIB_CLEAN@ LIBTOOL_COMPILE = @LIB_COMPILE@ LIBTOOL_LINK = @LIB_LINK@ INSTALL = @INSTALL@ @INSTALL_OPT_O@ INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_DATA = @INSTALL_DATA@ transform = @program_transform_name@ TRANSFORM = sed 's/$x$$//'|sed '$(transform)'|sed 's/$$/$x/' CTAGS = @CTAGS@ ETAGS = @ETAGS@ CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ CPPFLAGS = -I. -I$(srcdir) -I../test -DHAVE_CONFIG_H -DDATA_DIR=\"$(datadir)\" @CPPFLAGS@ CCFLAGS = $(CPPFLAGS) $(CFLAGS) CFLAGS_LIBTOOL = $(CCFLAGS) CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) REL_VERSION = @cf_cv_rel_version@ ABI_VERSION = @cf_cv_abi_version@ LOCAL_LIBDIR = @top_builddir@/lib LOCAL_LIBS = @TEST_DEPS@ MATH_LIB = @MATH_LIB@ TEST_LIBS = @TEST_LIBS@ LD = @LD@ LINK = @LINK_TESTS@ $(LIBTOOL_LINK) $(CFLAGS) LDFLAGS = @LD_MODEL@ @LOCAL_LDFLAGS@ @LDFLAGS@ LDFLAGS_LIBTOOL = $(LDFLAGS) $(CFLAGS_LIBTOOL) LDFLAGS_NORMAL = $(LDFLAGS) $(CFLAGS_NORMAL) LDFLAGS_DEBUG = $(LDFLAGS) $(CFLAGS_DEBUG) LDFLAGS_PROFILE = $(LDFLAGS) $(CFLAGS_PROFILE) LDFLAGS_SHARED = $(LDFLAGS) $(CFLAGS_SHARED) @LD_SHARED_OPTS@ TEST_ARGS = @LDFLAGS_STATIC@ @TEST_ARGS@ @LDFLAGS_SHARED@ # use these for linking with all of the libraries LIBS_DEFAULT = $(TEST_ARGS) @LIBS@ $(TEST_LIBS) LDFLAGS_DEFAULT = $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_DEFAULT) # use these for linking with the (n)curses library and possibly pthreads LIBS_THREADS = `echo "$(TEST_ARGS) @LIBS@" | sed -e 's/-l@FORM_NAME@.*-l@PANEL_NAME@[^ ]*//'` $(TEST_LIBS) @PTHREAD@ LDFLAGS_THREADS = $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_THREADS) # use these for linking with the (n)curses library LIBS_CURSES = `echo "$(TEST_ARGS) @LIBS@" | sed -e 's/-l@FORM_NAME@.*-l@PANEL_NAME@[^ ]*//'` $(TEST_LIBS) LDFLAGS_CURSES = $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_CURSES) # use these when we need the math library LDFLAGS_CURSES_M= $(LDFLAGS_CURSES) $(MATH_LIB) # use these for linking with the tinfo library if we have it, or curses library if not LIBS_TINFO = @LDFLAGS_STATIC@ @TINFO_LIBS@ @LDFLAGS_SHARED@ @LIBS@ $(TEST_LIBS) LDFLAGS_TINFO = @TINFO_LDFLAGS@ $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_TINFO) LINT = @LINT@ LINT_OPTS = @LINT_OPTS@ LINT_LIBS = -lform -lmenu -lpanel -lncurses @LIBS@ INCDIR = $(top_srcdir)/include incdir = ../include HEADER_DEPS = \ $(incdir)/curses.h \ $(incdir)/term.h \ $(incdir)/ncurses_cfg.h \ $(incdir)/ncurses_def.h \ $(incdir)/ncurses_dll.h \ $(incdir)/term.h \ $(incdir)/unctrl.h \ $(INCDIR)/nc_alloc.h ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : check all:: # Verify that each header-file can be compiled without including another. check:: @$(SHELL) -c "for header in *.h;\ do \ echo \"** testing \$${header}\" ; \ echo \"#include <\$${header}>\" >headers.c; \ echo \"int main(void) { return 0; }\" >>headers.c; \ $(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \ done" -@rm -f headers.* # The rest is generated from the "programs" and "modules" files... ncurses-6.4-20240113/test/insdelln.c0000644000000000000000000002335614345213323015401 0ustar rootroot/**************************************************************************** * Copyright 2019-2020,2022 Thomas E. Dickey * * Copyright 2008-2014,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: insdelln.c,v 1.15 2022/12/10 23:31:31 tom Exp $ * * test-driver for deleteln, wdeleteln, insdelln, winsdelln, insertln, winsertln */ #include #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, STATUS * sp, void func(WINDOW *)) { WINDOW *win1 = newwin(sp->y_max - 2, sp->x_max - 2, sp->y_beg + 1, sp->x_beg + 1); if (win1 != 0 && sp->y_max > 4 && sp->x_max > 4) { WINDOW *win2 = derwin(win1, sp->y_max - 4, sp->x_max - 4, 1, 1); if (win2 != 0) { box(win1, 0, 0); wrefresh(win1); func(win2); delwin(win2); } else { beep(); } delwin(win1); touchwin(win); } else { if (win1) delwin(win1); beep(); } } static void init_status(WINDOW *win, STATUS * sp) { memset(sp, 0, sizeof(*sp)); sp->c = 99; sp->v = 99; sp->ch = ' '; keypad(win, TRUE); fill_window(win); getbegyx(win, sp->y_beg, sp->x_beg); getmaxyx(win, sp->y_max, sp->x_max); } static void show_help(WINDOW *win) { static const char *table[] = { "Basic commands:" ,"Use h/j/k/l or arrow keys to move the cursor." ,"Set the count parameter for insert/delete by entering digits 0-9." ,"" ,"Other commands:" ,"space toggles through the set of video attributes and colors." ,"t touches (forces repaint) of the current line." ,"i calls insertln at the current position with the given count." ,"d calls deleteln at the window beginning with the given count." ,"I calls insdelln at the window beginning with the given count." ,"D calls insdelln at the window beginning with the given -count." ,"f refills the window with test-pattern using current attributes." ,"w recur to test windows other than stdscr" ,"q quit" ,"= resets count to zero." ,"? shows this help-window" ,0 }; popup_msg(win, table); } static void update_status(WINDOW *win, STATUS * sp) { switch (sp->ch) { case ' ': /* next test-iteration */ if (has_colors()) { if ((sp->c_msg = color_params(++(sp->c), &(sp->pair))) == 0) { sp->c_msg = color_params(sp->c = 0, &(sp->pair)); if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) { sp->v_msg = video_params(sp->v = 0, &(sp->attr)); } } } else { if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) { sp->v_msg = video_params(sp->v = 0, &(sp->attr)); } } sp->count = 0; show_status(win, sp); break; case KEY_LEFT: case 'h': if (sp->x_val > 0) wmove(win, sp->y_val, --(sp->x_val)); break; case KEY_DOWN: case 'j': if (sp->y_val < sp->y_max) wmove(win, ++(sp->y_val), sp->x_val); break; case KEY_UP: case 'k': if (sp->y_val > 0) wmove(win, --(sp->y_val), sp->x_val); break; case KEY_RIGHT: case 'l': if (sp->x_val < sp->x_max) wmove(win, sp->y_val, ++(sp->x_val)); break; case 't': touchline(win, sp->y_val, 1); break; case '=': sp->count = 0; show_status(win, sp); break; case HELP_KEY_1: show_help(win); break; default: if (isdigit(sp->ch)) { sp->count = (sp->count * 10) + (sp->ch - '0'); show_status(win, sp); } else { beep(); } break; } } static void test_winsdelln(WINDOW *win) { STATUS st; int n; init_status(win, &st); do { (void) wattrset(win, AttrArg(COLOR_PAIR(st.pair), st.attr)); switch (st.ch) { case 'i': for (n = 0; n < st.count; ++n) winsertln(win); break; case 'd': for (n = 0; n < st.count; ++n) wdeleteln(win); break; case 'I': winsdelln(win, st.count); break; case 'D': winsdelln(win, -st.count); break; case 'f': fill_window(win); reshow_status(win, &st); break; case 'w': do_subwindow(win, &st, test_winsdelln); break; case 'q': return; default: update_status(win, &st); break; } } while ((st.ch = wgetch(win)) != ERR); } static void test_insdelln(void) { STATUS st; int n; init_status(stdscr, &st); do { (void) attrset(AttrArg(COLOR_PAIR(st.pair), st.attr)); switch (st.ch) { case 'i': for (n = 0; n < st.count; ++n) insertln(); break; case 'd': for (n = 0; n < st.count; ++n) deleteln(); break; case 'I': insdelln(st.count); break; case 'D': insdelln(-st.count); break; case 'f': fill_window(stdscr); reshow_status(stdscr, &st); break; case 'w': do_subwindow(stdscr, &st, test_winsdelln); break; case 'q': return; default: update_status(stdscr, &st); break; } } while ((st.ch = getch()) != ERR); } static void usage(int ok) { static const char *msg[] = { "Usage: insdelln [options]" ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) usage(FALSE); initscr(); cbreak(); noecho(); test_insdelln(); endwin(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the curses winsdelln function\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/test_instr.c0000644000000000000000000001615014345216411015762 0ustar rootroot/**************************************************************************** * Copyright 2020,2022 Thomas E. Dickey * * Copyright 2007-2010,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: test_instr.c,v 1.12 2022/12/10 23:58:01 tom Exp $ * * Author: Thomas E Dickey * * Demonstrate the instr functions from the curses library. int instr(char *str); int innstr(char *str, int n); int winstr(WINDOW *win, char *str); int winnstr(WINDOW *win, char *str, int n); int mvinstr(int y, int x, char *str); int mvinnstr(int y, int x, char *str, int n); int mvwinstr(WINDOW *win, int y, int x, char *str); int mvwinnstr(WINDOW *win, int y, int x, char *str, int n); */ #include #define BASE_Y 6 #define MAX_COLS 1024 static bool Quit(int ch) { return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE); } static void show_1st(WINDOW *win, int line, char *buffer) { MvWAddStr(win, line, 5, buffer); } static void showmore(WINDOW *win, int line, char *buffer) { wmove(win, line, 0); wclrtoeol(win); show_1st(win, line, buffer); } static int recursive_test(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) { WINDOW *txtbox = 0; WINDOW *txtwin = 0; FILE *fp; int ch; int txt_x = 0, txt_y = 0; int base_y; int limit = getmaxx(strwin) - 5; char buffer[MAX_COLS]; if (argv[level] == 0) { beep(); return FALSE; } *buffer = '\0'; if (level > 1) { txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level); box(txtbox, 0, 0); wnoutrefresh(txtbox); txtwin = derwin(txtbox, getmaxy(txtbox) - 2, getmaxx(txtbox) - 2, 1, 1); base_y = 0; } else { txtwin = stdscr; base_y = BASE_Y; } keypad(txtwin, TRUE); /* enable keyboard mapping */ (void) cbreak(); /* take input chars one at a time, no wait for \n */ (void) noecho(); /* don't echo input */ txt_y = base_y; txt_x = 0; wmove(txtwin, txt_y, txt_x); if ((fp = fopen(argv[level], "r")) != 0) { while ((ch = fgetc(fp)) != EOF) { if (waddch(txtwin, UChar(ch)) != OK) { break; } } fclose(fp); } else { wprintw(txtwin, "Cannot open:\n%s", argv[1]); } while (!Quit(ch = mvwgetch(txtwin, txt_y, txt_x))) { switch (ch) { case KEY_DOWN: case 'j': if (txt_y < getmaxy(txtwin) - 1) txt_y++; else beep(); break; case KEY_UP: case 'k': if (txt_y > base_y) txt_y--; else beep(); break; case KEY_LEFT: case 'h': if (txt_x > 0) txt_x--; else beep(); break; case KEY_RIGHT: case 'l': if (txt_x < getmaxx(txtwin) - 1) txt_x++; else beep(); break; case 'w': recursive_test(level + 1, argv, chrwin, strwin); if (txtbox != 0) { touchwin(txtbox); wnoutrefresh(txtbox); } else { touchwin(txtwin); wnoutrefresh(txtwin); } break; case '-': if (limit > 0) { --limit; } else { beep(); } break; case '+': ++limit; break; default: beep(); break; } MvWPrintw(chrwin, 0, 0, "line:"); wclrtoeol(chrwin); if (txtwin != stdscr) { wmove(txtwin, txt_y, txt_x); if (winstr(txtwin, buffer) != ERR) { show_1st(chrwin, 0, buffer); } if (mvwinstr(txtwin, txt_y, txt_x, buffer) != ERR) { showmore(chrwin, 1, buffer); } } else { move(txt_y, txt_x); if (instr(buffer) != ERR) { show_1st(chrwin, 0, buffer); } if (mvinstr(txt_y, txt_x, buffer) != ERR) { showmore(chrwin, 1, buffer); } } wnoutrefresh(chrwin); MvWPrintw(strwin, 0, 0, "%4d:", limit); wclrtobot(strwin); if (txtwin != stdscr) { wmove(txtwin, txt_y, txt_x); if (winnstr(txtwin, buffer, limit) != ERR) { show_1st(strwin, 0, buffer); } if (mvwinnstr(txtwin, txt_y, txt_x, buffer, limit) != ERR) { showmore(strwin, 1, buffer); } } else { move(txt_y, txt_x); if (innstr(buffer, limit) != ERR) { show_1st(strwin, 0, buffer); } if (mvinnstr(txt_y, txt_x, buffer, limit) != ERR) { showmore(strwin, 1, buffer); } } wnoutrefresh(strwin); } if (level > 1) { delwin(txtwin); delwin(txtbox); } return TRUE; } static void usage(int ok) { static const char *msg[] = { "Usage: test_instr [options] [file1 [...]]" ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { WINDOW *chrbox; WINDOW *chrwin; WINDOW *strwin; int ch; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } setlocale(LC_ALL, ""); if (optind + 1 > argc) usage(FALSE); initscr(); chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0); box(chrbox, 0, 0); wnoutrefresh(chrbox); chrwin = derwin(chrbox, 2, COLS - 2, 1, 1); strwin = derwin(chrbox, 2, COLS - 2, 3, 1); recursive_test(optind, argv, chrwin, strwin); endwin(); ExitProgram(EXIT_SUCCESS); } ncurses-6.4-20240113/test/worm.c0000644000000000000000000003657014351662471014570 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/test/sp_tinfo.c0000644000000000000000000002223414445575140015415 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/test/cardfile.dat0000644000000000000000000000061206703777115015673 0ustar rootroottitle 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. ncurses-6.4-20240113/test/color_content.c0000644000000000000000000001722314376435702016450 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/test/dump_window.c0000644000000000000000000001231614523545472016132 0ustar rootroot/**************************************************************************** * 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); } } ncurses-6.4-20240113/test/test_opaque.c0000644000000000000000000002720514345217076016130 0ustar rootroot/**************************************************************************** * Copyright 2020-2021,2022 Thomas E. Dickey * * Copyright 2007-2008,2009 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: test_opaque.c,v 1.15 2022/12/11 00:03:10 tom Exp $ * * Author: Thomas E Dickey * * Demonstrate the opaque functions from the curses library. WINDOW * wgetparent (const WINDOW *); bool is_cleared(const WINDOW *win); bool is_idcok(const WINDOW *win); bool is_idlok(const WINDOW *win); bool is_immedok(const WINDOW *win); bool is_keypad(const WINDOW *win); bool is_leaveok(const WINDOW *win); bool is_nodelay(const WINDOW *win); bool is_notimeout(const WINDOW *win); bool is_scrollok(const WINDOW *win); bool is_syncok(const WINDOW *win); int wgetscrreg (const WINDOW *, int *, int *); bool is_pad(const WINDOW *win); bool is_subwin(const WINDOW *win); int wgetdelay(const WINDOW *win); */ #include #define BASE_Y 6 #define MAX_COLS 1024 #if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20090906) && NCURSES_EXT_FUNCS && NCURSES_OPAQUE static bool Quit(int ch) { return (ch == 'q' || ch == QUIT || ch == ESCAPE); } typedef bool(*BoolOpaque) (WINDOW *, int); static bool test_opaque_cleared(WINDOW *win, int mode) { if (mode >= 0) { if (mode) wclear(win); } return is_cleared(win); } static bool test_opaque_idcok(WINDOW *win, int mode) { if (mode >= 0) { idcok(win, mode); } return is_idcok(win); } static bool test_opaque_idlok(WINDOW *win, int mode) { if (mode >= 0) { idlok(win, mode); } return is_idlok(win); } static bool test_opaque_immedok(WINDOW *win, int mode) { if (mode >= 0) { immedok(win, mode); } return is_immedok(win); } static bool test_opaque_keypad(WINDOW *win, int mode) { if (mode >= 0) { keypad(win, mode); } return is_keypad(win); } static bool test_opaque_leaveok(WINDOW *win, int mode) { if (mode >= 0) { leaveok(win, mode); } return is_leaveok(win); } static bool test_opaque_nodelay(WINDOW *win, int mode) { if (mode >= 0) { nodelay(win, mode); } return is_nodelay(win); } static bool test_opaque_notimeout(WINDOW *win, int mode) { if (mode >= 0) { notimeout(win, mode); } return is_notimeout(win); } static bool test_opaque_scrollok(WINDOW *win, int mode) { if (mode >= 0) { scrollok(win, mode); } return is_scrollok(win); } static bool test_opaque_syncok(WINDOW *win, int mode) { if (mode >= 0) { syncok(win, mode); } return is_syncok(win); } static int status_y(WINDOW *stswin, int cell) { return (cell % getmaxy(stswin)); } static int status_x(WINDOW *stswin, int cell) { return (15 * (cell / getmaxy(stswin))); } static void to_keyword(WINDOW *stswin, int cell) { wmove(stswin, status_y(stswin, cell), status_x(stswin, cell)); } static void to_result(WINDOW *stswin, int cell, bool before) { int y = status_y(stswin, cell); int x = status_x(stswin, cell) + 11; if (!before) ++x; wmove(stswin, y, x); } static void show_keyword(WINDOW *stswin, int cell, int active, const char *name) { to_keyword(stswin, cell); if (active == cell) (void) wstandout(stswin); wprintw(stswin, "%s:", name); if (active == cell) (void) wstandend(stswin); } /* *INDENT-OFF* */ static struct { const char *name; BoolOpaque func; } bool_funcs[] = { { "cleared", test_opaque_cleared }, { "idcok", test_opaque_idcok }, { "idlok", test_opaque_idlok }, { "immedok", test_opaque_immedok }, { "keypad", test_opaque_keypad }, { "leaveok", test_opaque_leaveok }, { "nodelay", test_opaque_nodelay }, { "notimeout", test_opaque_notimeout }, { "scrollok", test_opaque_scrollok }, { "syncok", test_opaque_syncok } }; /* *INDENT-ON* */ #define bool2c(c) ((c) ? 'T' : 'F') /* * Display and/or allow update for the properties accessed in the opaque * window. Some may change state after refreshing the window, so we * distinguish between them using the 'before' parameter. */ static int show_opaque(WINDOW *stswin, WINDOW *txtwin, bool before, int active) { int n; int top, bottom; if (before) { werase(stswin); } for (n = 0; n < (int) SIZEOF(bool_funcs); ++n) { show_keyword(stswin, n, active, bool_funcs[n].name); to_result(stswin, n, before); wprintw(stswin, "%c", bool2c(bool_funcs[n].func(txtwin, -1))); } show_keyword(stswin, n, active, "is_pad"); to_result(stswin, n, TRUE); wprintw(stswin, "%c", bool2c(is_pad(txtwin))); ++n; show_keyword(stswin, n, active, "is_subwin"); to_result(stswin, n, TRUE); wprintw(stswin, "%c", bool2c(is_subwin(txtwin))); ++n; show_keyword(stswin, n, active, "wgetparent"); to_result(stswin, n, TRUE); wprintw(stswin, "%p", (void *) wgetparent(txtwin)); ++n; show_keyword(stswin, n, active, "wgetdelay"); to_result(stswin, n, TRUE); wprintw(stswin, "%d", wgetdelay(txtwin)); ++n; show_keyword(stswin, n, active, "wgetscrreg"); to_result(stswin, n, TRUE); if (wgetscrreg(txtwin, &top, &bottom) == OK) wprintw(stswin, "%d,%d", top, bottom); else wprintw(stswin, "none"); wnoutrefresh(stswin); return active; } static int test_opaque(int level, char **argv, WINDOW *stswin) { WINDOW *txtbox = 0; WINDOW *txtwin = 0; FILE *fp; int ch; int txt_x = 0, txt_y = 0; int base_y; bool in_status = FALSE; int active = 0; if (argv[level] == 0) { beep(); return FALSE; } if (level > 1) { txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level); box(txtbox, 0, 0); wnoutrefresh(txtbox); txtwin = derwin(txtbox, getmaxy(txtbox) - 2, getmaxx(txtbox) - 2, 1, 1); base_y = 0; } else { txtwin = stdscr; base_y = BASE_Y; } keypad(txtwin, TRUE); /* enable keyboard mapping */ (void) cbreak(); /* take input chars one at a time, no wait for \n */ (void) noecho(); /* don't echo input */ txt_y = base_y; txt_x = 0; wmove(txtwin, txt_y, txt_x); if ((fp = fopen(argv[level], "r")) != 0) { while ((ch = fgetc(fp)) != EOF) { if (waddch(txtwin, UChar(ch)) != OK) { break; } } fclose(fp); } else { wprintw(txtwin, "Cannot open:\n%s", argv[1]); } for (;;) { if (in_status) { to_keyword(stswin, active); ch = wgetch(stswin); show_opaque(stswin, txtwin, TRUE, active); if (Quit(ch)) break; switch (ch) { case '\t': in_status = FALSE; break; case KEY_DOWN: case 'j': if (active < (int) SIZEOF(bool_funcs) - 1) active++; else beep(); break; case KEY_UP: case 'k': if (active > 0) active--; else beep(); break; case ' ': bool_funcs[active].func(txtwin, !bool_funcs[active].func(txtwin, -1)); break; default: beep(); break; } show_opaque(stswin, txtwin, FALSE, in_status ? active : -1); } else { ch = mvwgetch(txtwin, txt_y, txt_x); show_opaque(stswin, txtwin, TRUE, -1); if (Quit(ch)) break; switch (ch) { case '\t': in_status = TRUE; break; case KEY_DOWN: case 'j': if (txt_y < getmaxy(txtwin) - 1) txt_y++; else beep(); break; case KEY_UP: case 'k': if (txt_y > base_y) txt_y--; else beep(); break; case KEY_LEFT: case 'h': if (txt_x > 0) txt_x--; else beep(); break; case KEY_RIGHT: case 'l': if (txt_x < getmaxx(txtwin) - 1) txt_x++; else beep(); break; case 'w': test_opaque(level + 1, argv, stswin); if (txtbox != 0) { touchwin(txtbox); wnoutrefresh(txtbox); } else { touchwin(txtwin); wnoutrefresh(txtwin); } break; default: beep(); napms(100); break; } show_opaque(stswin, txtwin, FALSE, -1); } } if (level > 1) { delwin(txtwin); delwin(txtbox); } return TRUE; } static void test_set_escdelay(void) { set_escdelay((100 + ESCDELAY) / 2); } static void test_set_tabsize(void) { int y0, x0; int y, x; int save_tabsize = TABSIZE; (void) cbreak(); /* take input chars one at a time, no wait for \n */ (void) noecho(); /* don't echo input */ for (y = 0; y < LINES; ++y) { set_tabsize(y + 1); if (move(y, 0) == ERR) break; for (x = 0; x < COLS;) { addch('\t'); if (addch('*') == ERR) { break; } getyx(stdscr, y0, x0); if (y0 != y || x0 == x) { break; } } } getch(); erase(); set_tabsize(save_tabsize); } static void usage(int ok) { static const char *msg[] = { "Usage: test_opaque [options] file1 [file2 [...]]" ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { WINDOW *stsbox; WINDOW *stswin; int ch; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } setlocale(LC_ALL, ""); if (optind + 1 > argc) usage(FALSE); initscr(); test_set_escdelay(); test_set_tabsize(); stsbox = derwin(stdscr, BASE_Y, COLS, 0, 0); box(stsbox, 0, 0); wnoutrefresh(stsbox); stswin = derwin(stsbox, BASE_Y - 2, COLS - 2, 1, 1); keypad(stswin, TRUE); test_opaque(optind, argv, stswin); endwin(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the ncurses library\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/test_vid_puts.c0000644000000000000000000001070114345204042016451 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/test/combine.c0000644000000000000000000001700714345204042015177 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/test/demo_tabs.c0000644000000000000000000000771114342766153015536 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/test/tclock.c0000644000000000000000000001353114376435156015060 0ustar rootroot/* $Id: tclock.c,v 1.48 2023/02/25 16:42:22 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; 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 ncurses-6.4-20240113/test/picsmap.h0000644000000000000000000000602214041124335015216 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/test/extended_color.c0000644000000000000000000001557114345204042016565 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/test/clip_printw.c0000644000000000000000000002611414506076670016131 0ustar rootroot/**************************************************************************** * 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. * ****************************************************************************/ /* * $Id: clip_printw.c,v 1.23 2023/09/30 19:57:44 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, 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 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 ncurses-6.4-20240113/test/firework.c0000644000000000000000000001471314342766153015431 0ustar rootroot/**************************************************************************** * 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(); } } ncurses-6.4-20240113/test/test_get_wstr.c0000644000000000000000000002464014345216521016466 0ustar rootroot/**************************************************************************** * Copyright 2020,2022 Thomas E. Dickey * * Copyright 2007-2011,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: test_get_wstr.c,v 1.14 2022/12/10 23:59:13 tom Exp $ * * Author: Thomas E Dickey * * Demonstrate the get_wstr functions from the curses library. int get_wstr(wint_t *wstr); int getn_wstr(wint_t *wstr, int n); int wget_wstr(WINDOW *win, wint_t *wstr); int wgetn_wstr(WINDOW *win, wint_t *wstr, int n); int mvget_wstr(int y, int x, wint_t *wstr); int mvgetn_wstr(int y, int x, wint_t *wstr, int n); int mvwget_wstr(WINDOW *win, int y, int x, wint_t *wstr); int mvwgetn_wstr(WINDOW *win, int y, int x, wint_t *wstr, int n); */ #include #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(WINDOW *txtwin) { int result = getmaxx(txtwin) - getcurx(txtwin); return (result > 0) ? result : 0; } /* * Show a highlighted line in the place where input will happen. */ static void ShowPrompt(WINDOW *txtwin, int limit) { wchgat(txtwin, limit, WA_REVERSE, 0, NULL); wnoutrefresh(txtwin); } static void MovePrompt(WINDOW *txtwin, int limit, int y, int x) { wchgat(txtwin, Remainder(txtwin), WA_NORMAL, 0, NULL); wmove(txtwin, y, x); ShowPrompt(txtwin, limit); } static int ShowFlavor(WINDOW *strwin, WINDOW *txtwin, int flavor, int limit) { const char *name = "?"; bool limited = FALSE; bool wins = (txtwin != stdscr); int result; switch (flavor) { case eGetStr: name = wins ? "wget_wstr" : "get_wstr"; break; case eGetNStr: limited = TRUE; name = wins ? "wgetn_wstr" : "getn_wstr"; break; case eMvGetStr: name = wins ? "mvwget_wstr" : "mvget_wstr"; break; case eMvGetNStr: limited = TRUE; name = wins ? "mvwgetn_wstr" : "mvgetn_wstr"; break; case eMaxFlavor: break; } wmove(strwin, 0, 0); werase(strwin); if (limited) { wprintw(strwin, "%s(%d):", name, limit); } else { wprintw(strwin, "%s:", name); } result = limited ? limit : Remainder(txtwin); ShowPrompt(txtwin, result); wnoutrefresh(strwin); return result; } static int recursive_test(int level, char **argv, WINDOW *strwin) { static const char *help[] = { "Commands:", " q,^Q,ESC - quit this program", " ^Q,ESC - quit help-screen", "", " p, - 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 ncurses-6.4-20240113/test/ditto.c0000644000000000000000000003035514503615633014717 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/test/xmas.c0000644000000000000000000010341514342766153014547 0ustar rootroot/******************************************************************************/ /* 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); } ncurses-6.4-20240113/test/padview.c0000644000000000000000000003065014342766153015236 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,2022 Thomas E. Dickey * * Copyright 2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * clone of view.c, using pads * * $Id: padview.c,v 1.22 2022/12/04 00:40:11 tom Exp $ */ #include #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)) { char *s = my_blob + 3; char *d = my_blob; Trace(("trim BOM")); do { } while ((*d++ = *s++) != '\0'); } #endif height = num_lines; width = (int) strlen(my_vec[0]); for (k = 1; my_vec[k]; ++k) { int check = (int) (my_vec[k] - my_vec[k - 1]); if (width < check) width = check; } width = (width + 1) * 5; my_pad = newpad(height, width); if (my_pad == 0) failed("cannot allocate pad workspace"); if (try_color) { wattrset(my_pad, COLOR_PAIR(my_pair)); wbkgd(my_pad, (chtype) (' ' | COLOR_PAIR(my_pair))); } /* * Use the curses library for rendering, including tab-conversion. */ Trace(("slurp the file")); for (k = 0; my_vec[k]; ++k) { char *s; #if USE_WIDEC_SUPPORT char *last = my_vec[k] + (int) strlen(my_vec[k]); wchar_t wch[2]; size_t rc; #ifndef state_unused mbstate_t state; #endif #endif /* USE_WIDEC_SUPPORT */ wmove(my_pad, k, 0); #if USE_WIDEC_SUPPORT wch[1] = 0; reset_mbytes(state); #endif for (s = my_vec[k]; *s != '\0'; ++s) { #if USE_WIDEC_SUPPORT if (!n_option) { rc = (size_t) check_mbytes(wch[0], s, (size_t) (last - s), state); if ((long) rc == -1 || (long) rc == -2) { break; } s += rc - 1; waddwstr(my_pad, wch); } else #endif waddch(my_pad, *s & 0xff); } } free(my_vec); free(my_blob); return my_pad; } static void usage(int ok) { static const char *msg[] = { "Usage: view [options] file" ,"" ,USAGE_COMMON ,"Options:" ," -c use color if terminal supports it" ," -i ignore INT, QUIT, TERM signals" #if USE_WIDEC_SUPPORT ," -n use waddch (bytes) rather then wadd_wch (wide-chars)" #endif ," -s start in single-step mode, waiting for input" #ifdef TRACE ," -t trace screen updates" ," -T NUM specify trace mask" #endif }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { static const char *help[] = { "Commands:", " q,^Q,ESC - quit this program", "", " p, - 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(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 ncurses-6.4-20240113/test/savescreen.sh0000755000000000000000000000567014264564232016131 0ustar rootroot#!/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 ncurses-6.4-20240113/test/redraw.c0000644000000000000000000001451014345204042015043 0ustar rootroot/**************************************************************************** * Copyright 2020-2021,2022 Thomas E. Dickey * * Copyright 2006-2012,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: redraw.c,v 1.17 2022/12/10 22:28:50 tom Exp $ * * Demonstrate the redrawwin() and wredrawln() functions. * Thomas Dickey - 2006/11/4 */ #include #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 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); } ncurses-6.4-20240113/test/ncurses_tst.hin0000644000000000000000000000572513615656212016510 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/test/color_set.c0000644000000000000000000000767414345214033015566 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/test/form_driver_w.c0000644000000000000000000001366714345213323016441 0ustar rootroot/**************************************************************************** * Copyright 2020,2022 Thomas E. Dickey * * Copyright 2013-2014,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Gaute Hope, 2013 * ****************************************************************************/ /* * $Id: form_driver_w.c,v 1.17 2022/12/10 23:31:31 tom Exp $ * * Test form_driver_w (int, int, wchar_t), a wide char aware * replacement of form_driver. */ #include #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 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 */ ncurses-6.4-20240113/test/demo_defkey.c0000644000000000000000000002051014445606655016050 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 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.34 2023/06/24 15:37:17 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); if (vis_string != 0) { free(vis_string); vis_string = 0; } vis_string = visible(new_string); if ((rc = key_defined(new_string)) > 0) { wprintw(win, "%s was bound to %s\n", vis_string, keyname(rc)); log_last_line(win); } else if (new_string != 0 && rc < 0) { wprintw(win, "%s conflicts with longer strings\n", vis_string); log_last_line(win); } rc = define_key(new_string, code); if (rc == ERR) { wprintw(win, "%s unchanged\n", code_name); log_last_line(win); } else if (new_string != 0) { wprintw(win, "%s is now bound to %s\n", vis_string, code_name); log_last_line(win); } else if (old_string != 0) { wprintw(win, "%s deleted\n", code_name); log_last_line(win); } if (vis_string != 0) free(vis_string); if (old_string != 0) free(old_string); } static void duplicate(WINDOW *win, NCURSES_CONST char *name, int code) { char *value = tigetstr(name); if (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, 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 ncurses-6.4-20240113/test/widechars-utf8.txt0000644000000000000000000000060510346602127017014 0ustar rootrootAPPLE -- 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. ncurses-6.4-20240113/test/demo_termcap.c0000644000000000000000000004727014434462126016237 0ustar rootroot/**************************************************************************** * Copyright 2019-2022,2023 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.65 2023/05/27 20:13:10 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; char *str; int num; if ((str = tgetstr(cap, &ap)) != 0) { total_values++; total_s_values++; if (!q_opt) { /* * Note that the strings returned are mostly terminfo format, since * ncurses does not convert except for a handful of special cases. */ show_string(cap, str); } } else if ((num = tgetnum(cap)) >= 0) { total_values++; total_n_values++; if (!q_opt) { show_number(cap, num); } } else if (tgetflag(cap) > 0) { total_values++; total_b_values++; if (!q_opt) { printf(FNAME(flg), cap); printf("%s\n", "true"); } } if (!q_opt) fflush(stdout); } static void brute_force(const char *name) { char buffer[1024]; if (db_list) { putenv(next_dbitem()); } if (!q_opt) printf("Terminal type \"%s\"\n", name); if (tgetent(buffer, name) >= 0) { char cap[3]; int c1, c2; cap[2] = 0; for (EachCapName(c1)) { cap[0] = (char) c1; if (isCapName(c1)) { for (EachCapName(c2)) { cap[1] = (char) c2; if (isCapName(c2)) { dumpit(cap); } } } } } } #if NCURSES_XNAMES static void dump_xname(NCURSES_CONST char *cap) { if (strlen(cap) == 2) dumpit(cap); } #endif static void demo_termcap(NCURSES_CONST char *name) { char buffer[1024]; if (db_list) { putenv(next_dbitem()); } if (!q_opt) printf("Terminal type \"%s\"\n", name); if (tgetent(buffer, name) >= 0) { NCURSES_CONST char *cap; unsigned n; if (b_opt) { for (n = 0;; ++n) { cap = my_boolcodes[n]; if (cap == 0) break; dumpit(cap); } } if (n_opt) { for (n = 0;; ++n) { cap = my_numcodes[n]; if (cap == 0) break; dumpit(cap); } } if (s_opt) { for (n = 0;; ++n) { cap = my_strcodes[n]; if (cap == 0) break; dumpit(cap); } } #ifdef NCURSES_VERSION if (x_opt && (my_blob == 0) && y_opt) { #if NCURSES_XNAMES TERMTYPE *term = (TERMTYPE *) cur_term; if (term != 0 && ((NUM_BOOLEANS(term) != BOOLCOUNT) || (NUM_NUMBERS(term) != NUMCOUNT) || (NUM_STRINGS(term) != STRCOUNT))) { for (n = BOOLCOUNT; n < NUM_BOOLEANS(term); ++n) { dump_xname(ExtBoolname(term, (int) n, boolnames)); } for (n = NUMCOUNT; n < NUM_NUMBERS(term); ++n) { dump_xname(ExtNumname(term, (int) n, numnames)); } for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) { dump_xname(ExtStrname(term, (int) n, strnames)); } } #endif } #endif } } typedef enum { pDefault = 0 ,pComment ,pDescription ,pEscaped ,pNewline ,pName ,pNumber ,pString } STATE; static void parse_description(const char *input_name) { static char empty[1] = {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; char *name; bool a_opt = FALSE; #if defined(NCURSES_VERSION) || defined(HAVE_CURSES_DATA_OSPEED) bool v_opt = FALSE; #endif char *input_name = 0; int repeat; int r_opt = 1; while ((ch = getopt(argc, argv, OPTS_COMMON "abd:e:i:nqr:svxy")) != -1) { switch (ch) { case 'a': a_opt = TRUE; break; case 'b': b_opt = TRUE; break; case 'd': d_opt = optarg; break; case 'e': e_opt = optarg; break; case 'i': input_name = optarg; break; case 'n': n_opt = TRUE; break; case 'q': q_opt = TRUE; break; case 'r': if ((r_opt = atoi(optarg)) <= 0) usage(FALSE); break; case 's': s_opt = TRUE; break; #if defined(NCURSES_VERSION) || defined(HAVE_CURSES_DATA_OSPEED) case 'v': v_opt = TRUE; break; #endif #ifdef NCURSES_VERSION #if NCURSES_XNAMES case 'x': x_opt = TRUE; break; case 'y': y_opt = TRUE; x_opt = TRUE; break; #endif #endif case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } #if HAVE_USE_EXTENDED_NAMES use_extended_names(x_opt); #endif if (!(b_opt || n_opt || s_opt)) { b_opt = TRUE; n_opt = TRUE; s_opt = TRUE; } make_dblist(); if (a_opt) { for (repeat = 0; repeat < r_opt; ++repeat) { if (optind < argc) { for (n = optind; n < argc; ++n) { brute_force(argv[n]); } } else if ((name = getenv("TERM")) != 0) { brute_force(name); } else { static char dumb[] = "dumb"; brute_force(dumb); } } } else { if (input_name != 0) { parse_description(input_name); } #if USE_CODE_LISTS else { my_boolcodes = copy_code_list(boolcodes); my_numcodes = copy_code_list(numcodes); my_strcodes = copy_code_list(strcodes); } #else else { failed("no capability-lists available (use -i option)"); } #endif /* USE_CODE_LISTS */ for (repeat = 0; repeat < r_opt; ++repeat) { if (optind < argc) { for (n = optind; n < argc; ++n) { demo_termcap(argv[n]); } } else if ((name = getenv("TERM")) != 0) { demo_termcap(name); } else { static char dumb[] = "dumb"; demo_termcap(dumb); } } } printf("%ld values (%ld booleans, %ld numbers, %ld strings)\n", total_values, total_b_values, total_n_values, total_s_values); #if defined(NCURSES_VERSION) || defined(HAVE_CURSES_DATA_OSPEED) if (v_opt) { show_number("PC", PC); show_string("UP", UP); show_string("BC", BC); show_number("ospeed", (int) ospeed); } #endif #if NO_LEAKS free_dblist(); #if USE_CODE_LISTS free_code_list(my_boolcodes); free_code_list(my_numcodes); free_code_list(my_strcodes); #endif #endif /* NO_LEAKS */ ExitProgram(EXIT_SUCCESS); } #else int main(void) { failed("This program requires termcap"); } #endif ncurses-6.4-20240113/test/test_vidputs.c0000644000000000000000000001050114345212357016320 0ustar rootroot/**************************************************************************** * Copyright 2020-2021,2022 Thomas E. Dickey * * Copyright 2013-2014,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: test_vidputs.c,v 1.15 2022/12/10 23:23:27 tom Exp $ * * Demonstrate the vidputs and vidattr functions. * Thomas Dickey - 2013/01/12 */ #define USE_TINFO #include #if HAVE_SETUPTERM && HAVE_VIDPUTS static FILE *my_fp; static bool p_opt = FALSE; static TPUTS_PROTO(outc, c) { int rc; rc = putc(c, my_fp); TPUTS_RETURN(rc); } static bool outs(const char *s) { if (VALID_STRING(s)) { tputs(s, 1, outc); return TRUE; } return FALSE; } static void cleanup(void) { if (cur_term != 0) { outs(exit_attribute_mode); if (!outs(orig_colors)) outs(orig_pair); outs(cursor_normal); } } static void change_attr(chtype attr) { if (p_opt) { vidputs(attr, outc); } else { vidattr(attr); } } static void test_vidputs(void) { fprintf(my_fp, "Name: "); change_attr(A_BOLD); fputs("Bold", my_fp); change_attr(A_REVERSE); fputs(" Reverse", my_fp); change_attr(A_NORMAL); fputs("\n", my_fp); } static void usage(int ok) { static const char *tbl[] = { "Usage: test_vidputs [options]" ,"" ,USAGE_COMMON ,"Options:" ," -e use stderr (default stdout)" ," -n do not initialize terminal" ," -p use vidputs (default vidattr)" }; unsigned n; for (n = 0; n < SIZEOF(tbl); ++n) fprintf(stderr, "%s\n", tbl[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; bool no_init = FALSE; my_fp = stdout; while ((ch = getopt(argc, argv, OPTS_COMMON "enp")) != -1) { switch (ch) { case 'e': my_fp = stderr; break; case 'n': no_init = TRUE; break; case 'p': p_opt = TRUE; break; case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) usage(FALSE); if (no_init) { START_TRACE(); } else { setupterm((char *) 0, fileno(my_fp), (int *) 0); } test_vidputs(); cleanup(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { fprintf(stderr, "This program requires terminfo\n"); exit(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/inchs.c0000644000000000000000000002020414345216743014673 0ustar rootroot/**************************************************************************** * Copyright 2019-2020,2022 Thomas E. Dickey * * Copyright 2007-2012,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: inchs.c,v 1.19 2022/12/11 00:01:39 tom Exp $ * * Author: Thomas E Dickey */ /* chtype inch(void); chtype winch(WINDOW *win); chtype mvinch(int y, int x); chtype mvwinch(WINDOW *win, int y, int x); int inchstr(chtype *chstr); int inchnstr(chtype *chstr, int n); int winchstr(WINDOW *win, chtype *chstr); int winchnstr(WINDOW *win, chtype *chstr, int n); int mvinchstr(int y, int x, chtype *chstr); int mvinchnstr(int y, int x, chtype *chstr, int n); int mvwinchstr(WINDOW *win, int y, int x, chtype *chstr); int mvwinchnstr(WINDOW *win, int y, int x, chtype *chstr, int n); */ #include #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 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); } ncurses-6.4-20240113/test/test_termattrs.c0000644000000000000000000001235314345212357016656 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/test/test_getstr.c0000644000000000000000000002452114345216455016144 0ustar rootroot/**************************************************************************** * Copyright 2020,2022 Thomas E. Dickey * * Copyright 2007-2012,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: test_getstr.c,v 1.16 2022/12/10 23:58:37 tom Exp $ * * Author: Thomas E Dickey * * Demonstrate the getstr functions from the curses library. int getstr(char *str); int getnstr(char *str, int n); int wgetstr(WINDOW *win, char *str); int wgetnstr(WINDOW *win, char *str, int n); int mvgetstr(int y, int x, char *str); int mvwgetstr(WINDOW *win, int y, int x, char *str); int mvgetnstr(int y, int x, char *str, int n); int mvwgetnstr(WINDOW *, int y, int x, char *str, int n); */ #include #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(WINDOW *txtwin) { int result = getmaxx(txtwin) - getcurx(txtwin); return (result > 0) ? result : 0; } /* * Show a highlighted line in the place where input will happen. */ static void ShowPrompt(WINDOW *txtwin, int limit) { wchgat(txtwin, limit, WA_REVERSE, 0, NULL); wnoutrefresh(txtwin); } static void MovePrompt(WINDOW *txtwin, int limit, int y, int x) { wchgat(txtwin, Remainder(txtwin), WA_NORMAL, 0, NULL); wmove(txtwin, y, x); ShowPrompt(txtwin, limit); } static int ShowFlavor(WINDOW *strwin, WINDOW *txtwin, int flavor, int limit) { const char *name = "?"; bool limited = FALSE; bool wins = (txtwin != stdscr); int result; switch (flavor) { case eGetStr: name = wins ? "wgetstr" : "getstr"; break; case eGetNStr: limited = TRUE; name = wins ? "wgetnstr" : "getnstr"; break; case eMvGetStr: name = wins ? "mvwgetstr" : "mvgetstr"; break; case eMvGetNStr: limited = TRUE; name = wins ? "mvwgetnstr" : "mvgetnstr"; break; case eMaxFlavor: break; } wmove(strwin, 0, 0); werase(strwin); if (limited) { wprintw(strwin, "%s(%d):", name, limit); } else { wprintw(strwin, "%s:", name); } result = limited ? limit : Remainder(txtwin); ShowPrompt(txtwin, result); wnoutrefresh(strwin); return result; } static int recursive_test(int level, char **argv, WINDOW *strwin) { static const char *help[] = { "Commands:", " q,^Q,ESC - quit this program", " ^Q,ESC - quit help-screen", "", " p, - 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 ncurses-6.4-20240113/test/gdc.c0000644000000000000000000002570614342766153014342 0ustar rootroot/**************************************************************************** * Copyright 2019-2020,2022 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * Grand digital clock for curses compatible terminals * Usage: gdc [-s] [-t hh:mm:ss] [n] -- run for n seconds (default infinity) * Flags: -s: scroll * * modified 10-18-89 for curses (jrl) * 10-18-89 added signal handling * * $Id: gdc.c,v 1.57 2022/12/04 00:40:11 tom Exp $ */ #include #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 void sighndl(int signo) { signal(signo, sighndl); sigtermed = signo; if (redirected) { stop_curses(); ExitProgram(EXIT_FAILURE); } } static void check_term(void) { if (sigtermed) { (void) standend(); stop_curses(); fprintf(stderr, "gdc terminated by signal %d\n", sigtermed); ExitProgram(EXIT_FAILURE); } } static void drawbox(bool scrolling) { chtype bottom[XLENGTH + 1]; if (hascolor) (void) attrset(AttrArg(COLOR_PAIR(PAIR_FRAMES), 0)); MvAddCh(YBASE - 1, XBASE - 1, ACS_ULCORNER); hline(ACS_HLINE, XLENGTH); MvAddCh(YBASE - 1, XBASE + XLENGTH, ACS_URCORNER); MvAddCh(YBASE + YDEPTH, XBASE - 1, ACS_LLCORNER); if ((mvinchnstr(YBASE + YDEPTH, XBASE, bottom, XLENGTH)) != ERR) { int n; for (n = 0; n < XLENGTH; n++) { if (!scrolling) bottom[n] &= ~A_COLOR; bottom[n] = ACS_HLINE | (bottom[n] & (A_ATTRIBUTES | A_COLOR)); } (void) mvaddchnstr(YBASE + YDEPTH, XBASE, bottom, XLENGTH); } MvAddCh(YBASE + YDEPTH, XBASE + XLENGTH, ACS_LRCORNER); move(YBASE, XBASE - 1); vline(ACS_VLINE, YDEPTH); move(YBASE, XBASE + XLENGTH); vline(ACS_VLINE, YDEPTH); if (hascolor) (void) attrset(AttrArg(COLOR_PAIR(PAIR_OTHERS), 0)); } static void standt(int on) { if (on) { if (hascolor) { attron(COLOR_PAIR(PAIR_DIGITS)); } else { attron(A_STANDOUT); } } else { if (hascolor) { attron(COLOR_PAIR(PAIR_OTHERS)); } else { attroff(A_STANDOUT); } } } static void set(int t, int n) { int i, m; m = 7 << n; for (i = 0; i < 5; i++) { next[i] |= ((disp[t] >> ((4 - i) * 3)) & 07) << n; mask |= (next[i] ^ older[i]) & m; } if (mask & m) mask |= m; } static void usage(int ok) { static const char *msg[] = { "Usage: gdc [options] [count]" ,"" ,USAGE_COMMON ,"Options:" #if HAVE_USE_DEFAULT_COLORS ," -d invoke use_default_colors" #endif ," -n redirect input to /dev/null" ," -s scroll each number into place, rather than flipping" ," -t TIME specify starting time as hh:mm:ss (default is ``now'')" ,"" ,"If you specify a count, gdc runs for that number of seconds" }; unsigned j; for (j = 0; j < SIZEOF(msg); j++) fprintf(stderr, "%s\n", msg[j]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } static time_t parse_time(const char *value) { int hh, mm, ss; int check; time_t result; char c; struct tm *tm; if (sscanf(value, "%d:%d:%d%c", &hh, &mm, &ss, &c) != 3) { if (sscanf(value, "%02d%02d%02d%c", &hh, &mm, &ss, &c) != 3) { usage(FALSE); } } if ((hh < 0) || (hh >= 24) || (mm < 0) || (mm >= 60) || (ss < 0) || (ss >= 60)) { usage(FALSE); } /* adjust so that the localtime in the main loop will give usable time */ result = (hh * 3600) + ((mm * 60) + ss); for (check = 0; check < 24; ++check) { tm = localtime(&result); if (tm->tm_hour == hh) break; result += 3600; } if (tm->tm_hour != hh) { fprintf(stderr, "Cannot find local time for %s!\n", value); usage(FALSE); } return result; } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { time_t now; struct tm *tm; long t, a; int i, j, s, k, ch; int count = 0; FILE *ofp = stdout; FILE *ifp = stdin; bool smooth = FALSE; bool stages = FALSE; time_t starts = 0; #if HAVE_USE_DEFAULT_COLORS bool d_option = FALSE; #endif setlocale(LC_ALL, ""); while ((ch = getopt(argc, argv, OPTS_COMMON "dnst:")) != -1) { switch (ch) { #if HAVE_USE_DEFAULT_COLORS case 'd': d_option = TRUE; break; #endif case 'n': ifp = fopen("/dev/null", "r"); redirected = TRUE; break; case 's': smooth = TRUE; break; case 't': starts = parse_time(optarg); break; case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) { count = atoi(argv[optind++]); assert(count >= 0); if (optind < argc) usage(FALSE); } InitAndCatch({ if (redirected) { char *name = getenv("TERM"); if (name == 0 || newterm(name, ofp, ifp) == 0) { fprintf(stderr, "cannot open terminal\n"); ExitProgram(EXIT_FAILURE); } } else { initscr(); } } ,sighndl); cbreak(); noecho(); nodelay(stdscr, 1); curs_set(0); hascolor = has_colors(); if (hascolor) { short bg = COLOR_BLACK; start_color(); #if HAVE_USE_DEFAULT_COLORS if (d_option && (use_default_colors() == OK)) bg = -1; #endif init_pair(PAIR_DIGITS, COLOR_BLACK, COLOR_RED); init_pair(PAIR_OTHERS, COLOR_RED, bg); init_pair(PAIR_FRAMES, COLOR_WHITE, bg); (void) attrset(AttrArg(COLOR_PAIR(PAIR_OTHERS), 0)); } restart: for (j = 0; j < 5; j++) older[j] = newer[j] = next[j] = 0; clear(); drawbox(FALSE); do { char buf[40]; if (starts != 0) { now = ++starts; } else { time(&now); } tm = localtime(&now); mask = 0; set(tm->tm_sec % 10, 0); set(tm->tm_sec / 10, 4); set(tm->tm_min % 10, 10); set(tm->tm_min / 10, 14); set(tm->tm_hour % 10, 20); set(tm->tm_hour / 10, 24); set(10, 7); set(10, 17); for (k = 0; k < 6; k++) { if (smooth) { for (i = 0; i < 5; i++) newer[i] = (newer[i] & ~mask) | (newer[i + 1] & mask); newer[5] = (newer[5] & ~mask) | (next[k] & mask); } else { newer[k] = (newer[k] & ~mask) | (next[k] & mask); } next[k] = 0; for (s = 1; s >= 0; s--) { standt(s); for (i = 0; i < 6; i++) { if ((a = (newer[i] ^ older[i]) & (s ? newer : older)[i]) != 0) { for (j = 0, t = 1 << 26; t; t >>= 1, j++) { if (a & t) { if (!(a & (t << 1))) { move(YBASE + i, XBASE + 2 * j); } addstr(" "); } } } if (!s) { older[i] = newer[i]; } } if (!s) { if (smooth) drawbox(TRUE); refresh(); /* * If we're scrolling, space out the refreshes to fake * movement. That's 7 frames, or 6 intervals, which would * be 166 msec if we spread it out over a second. It looks * better (but will work on a slow terminal, e.g., less * than 9600bd) to squeeze that into a half-second, and use * half of 170 msec to ensure that the program doesn't eat * a lot of time when asking what time it is, at the top of * this loop -T.Dickey */ if (smooth) napms(85); if (stages) { stages = FALSE; switch (wgetch(stdscr)) { case 'q': count = 1; break; case 'S': stages = TRUE; /* FALLTHRU */ case 's': nodelay(stdscr, FALSE); break; case ' ': nodelay(stdscr, TRUE); break; #ifdef KEY_RESIZE case KEY_RESIZE: #endif case '?': goto restart; case ERR: check_term(); /* FALLTHRU */ default: continue; } } } } } /* this depends on the detailed format of ctime(3) */ _nc_STRNCPY(buf, ctime(&now), (size_t) 30); { char *d2 = buf + 10; char *s2 = buf + 19; while ((*d2++ = *s2++) != '\0') ; } MvAddStr(16, 30, buf); move(6, 0); drawbox(FALSE); refresh(); /* * If we're not smooth-scrolling, wait 1000 msec (1 sec). Use napms() * rather than sleep() because the latter does odd things on some * systems, e.g., suspending output as well. */ if (smooth) napms(500); else napms(1000); /* * This is a safe way to check if we're interrupted - making the signal * handler set a flag that we can check. Since we're running * nodelay(), the wgetch() call returns immediately, and in particular * will return an error if interrupted. This works only if we can * read from the input, of course. */ stages = FALSE; switch (wgetch(stdscr)) { case 'q': count = 1; break; case 'S': stages = TRUE; /* FALLTHRU */ case 's': nodelay(stdscr, FALSE); break; case ' ': nodelay(stdscr, TRUE); break; #ifdef KEY_RESIZE case KEY_RESIZE: #endif case '?': goto restart; case ERR: check_term(); /* FALLTHRU */ default: continue; } } while (--count); (void) standend(); stop_curses(); ExitProgram(EXIT_SUCCESS); } ncurses-6.4-20240113/test/xterm-16color.dat0000644000000000000000000000607114062736236016545 0ustar rootroot############################################################################## # 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 ncurses-6.4-20240113/test/lrtest.c0000644000000000000000000001356614345214722015114 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/test/demo_keyok.c0000644000000000000000000000773114345213323015716 0ustar rootroot/**************************************************************************** * Copyright 2020,2022 Thomas E. Dickey * * Copyright 2002-2006,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: demo_keyok.c,v 1.9 2022/12/10 23:31:31 tom Exp $ * * Demonstrate the keyok() function. * Thomas Dickey - 2002/11/23 */ #include #if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS static void usage(int ok) { static const char *msg[] = { "Usage: demo_keyok [options]" ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int lastch = ERR; int prior = ERR; int ch; WINDOW *win; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) usage(FALSE); setlocale(LC_ALL, ""); initscr(); (void) cbreak(); /* take input chars one at a time, no wait for \n */ (void) noecho(); /* don't echo input */ printw("Typing any function key will disable it, but typing it twice in\n"); printw("a row will turn it back on (just for a demo)."); refresh(); win = newwin(LINES - 2, COLS, 2, 0); scrollok(win, TRUE); keypad(win, TRUE); wmove(win, 0, 0); while ((ch = wgetch(win)) != ERR) { const char *name = keyname(ch); if (ch == ESCAPE && prior == ch) break; prior = ch; wprintw(win, "Keycode %d, name %s\n", ch, name != 0 ? name : ""); 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 ncurses-6.4-20240113/test/inch_wide.c0000644000000000000000000002030514345216166015521 0ustar rootroot/**************************************************************************** * Copyright 2019-2020,2022 Thomas E. Dickey * * Copyright 2007-2010,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: inch_wide.c,v 1.13 2022/12/10 23:55:34 tom Exp $ */ /* int in_wch(cchar_t *wcval); int mvin_wch(int y, int x, cchar_t *wcval); int mvwin_wch(WINDOW *win, int y, int x, cchar_t *wcval); int win_wch(WINDOW *win, cchar_t *wcval); int in_wchstr(cchar_t *wchstr); int in_wchnstr(cchar_t *wchstr, int n); int win_wchstr(WINDOW *win, cchar_t *wchstr); int win_wchnstr(WINDOW *win, cchar_t *wchstr, int n); int mvin_wchstr(int y, int x, cchar_t *wchstr); int mvin_wchnstr(int y, int x, cchar_t *wchstr, int n); int mvwin_wchstr(WINDOW *win, int y, int x, cchar_t *wchstr); int mvwin_wchnstr(WINDOW *win, int y, int x, cchar_t *wchstr, int n); */ #include #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 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 ncurses-6.4-20240113/test/testaddch.c0000644000000000000000000001021314345214722015524 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/test/tput-colorcube0000755000000000000000000000736713615656212016335 0ustar rootroot#!/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 ncurses-6.4-20240113/test/parse_rgb.h0000644000000000000000000000661213615656212015545 0ustar rootroot/**************************************************************************** * Copyright 2018,2020 Thomas E. Dickey * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: parse_rgb.h,v 1.5 2020/02/02 23:34:34 tom Exp $ * * Sample implementation of ncurses RGB extension from user_caps(5). */ #ifndef PARSE_RBG_H_incl #define PARSE_RBG_H_incl 1 #include #if HAVE_TIGETSTR && USE_WIDEC_SUPPORT static int parse_rgb(int *r_max, int *g_max, int *b_max) { int colors = tigetnum("colors"); int result = ERR; *r_max = *g_max = *b_max = 0; if (colors > 0) { int max_bits; int bits; int pwr2; int r = 0, g = 0, b = 0; char *data; char ch; for (max_bits = 0, pwr2 = 1; pwr2 < colors; ++max_bits, pwr2 <<= 1) { ; } if (tigetflag("RGB") > 0) { result = OK; r = g = b = (max_bits + 2) / 3; } else if ((bits = tigetnum("RGB")) > 0) { result = OK; r = g = b = bits; } else if ((data = tigetstr("RGB")) != ABSENT_STRING && data != CANCELLED_STRING && sscanf(data, "%d/%d/%d%c", &r, &g, &b, &ch) == 3) { result = OK; } if ((r + g + b) < max_bits) { result = ERR; } else if (result == 0) { if (r > max_bits) { r = max_bits; g = b = 0; } *r_max = r; if (g > (max_bits -= r)) { g = max_bits; b = 0; } *g_max = g; if (b > (max_bits -= g)) { b = max_bits; } *b_max = b; } } return result; } #else #define parse_rgb(r,g,b) (ERR) #endif #endif /* PARSE_RBG_H_incl */ ncurses-6.4-20240113/test/newdemo.c0000644000000000000000000002002514345213745015225 0ustar rootroot/* * 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); } ncurses-6.4-20240113/test/dump_window.h0000644000000000000000000000452613615656212016137 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/test/chgat.c0000644000000000000000000002271014345213323014650 0ustar rootroot/**************************************************************************** * Copyright 2019-2020,2022 Thomas E. Dickey * * Copyright 2006-2012,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: chgat.c,v 1.20 2022/12/10 23:31:31 tom Exp $ * * test-driver for chgat/wchgat/mvchgat/mvwchgat */ #include #include #if HAVE_CHGAT #define SHOW(n) ((n) == ERR ? "ERR" : "OK") #define COLOR_DEFAULT (-1) #if defined(NCURSES_VERSION_PATCH) && NCURSES_VERSION_PATCH < 20060715 #define touch_if_needed(win, row) touchline(win, row, 1) #else #define touch_if_needed(win, row) /* nothing */ #endif typedef struct { size_t c; size_t v; short pair; attr_t attr; int count; int ch; const char *c_msg; const char *v_msg; int y_val; int x_val; int y_beg, x_beg; int y_max, x_max; } STATUS; static const char * color_params(size_t state, short *pair) { /* *INDENT-OFF* */ static struct { short pair; short fg, bg; const char *msg; } table[] = { { 0, COLOR_DEFAULT, COLOR_DEFAULT, "default" }, { 1, COLOR_RED, COLOR_BLACK, "red/black" }, { 2, COLOR_WHITE, COLOR_BLUE, "white/blue" }, }; /* *INDENT-ON* */ const char *result = 0; if (has_colors()) { static bool first = TRUE; if (first) { size_t n; start_color(); for (n = 0; n < SIZEOF(table); ++n) { init_pair(table[n].pair, table[n].fg, table[n].bg); } } if (state < SIZEOF(table)) { *pair = table[state].pair; result = table[state].msg; } } return result; } static const char * video_params(size_t state, attr_t *attr) { /* *INDENT-OFF* */ static struct { attr_t attr; const char *msg; } table[] = { { WA_NORMAL, "normal" }, { WA_BOLD, "bold" }, { WA_REVERSE, "reverse" }, { WA_UNDERLINE, "underline" }, { WA_BLINK, "blink" }, }; /* *INDENT-ON* */ const char *result = 0; if (state < SIZEOF(table)) { *attr = table[state].attr; result = table[state].msg; } return result; } /* fill the window with a test-pattern */ static void fill_window(WINDOW *win) { int y, x; int y0 = -1, x0 = -1; getyx(win, y, x); wmove(win, 0, 0); while (waddstr(win, "0123456789 abcdefghijklmnopqrstuvwxyz ") != ERR) { int y1, x1; getyx(win, y1, x1); if (y1 == y0 && x1 == x0) break; x0 = x1; y0 = y1; } wmove(win, y, x); } static void show_status(WINDOW *win, STATUS * sp) { int y, x; getyx(win, y, x); wmove(win, 0, 0); wprintw(win, "Count %d", sp->count); if (sp->v_msg != 0) wprintw(win, " Video %s", sp->v_msg); if (sp->c_msg != 0) wprintw(win, " Color %s", sp->c_msg); wclrtoeol(win); wmove(win, y, x); } static void do_subwindow(WINDOW *win, STATUS * sp, void func(WINDOW *)) { WINDOW *win1 = newwin(sp->y_max - 2, sp->x_max - 2, sp->y_beg + 1, sp->x_beg + 1); if (win1 != 0 && sp->y_max > 4 && sp->x_max > 4) { WINDOW *win2 = derwin(win1, sp->y_max - 4, sp->x_max - 4, 1, 1); if (win2 != 0) { box(win1, 0, 0); wrefresh(win1); func(win2); delwin(win2); } else { beep(); } delwin(win1); touchwin(win); } else { if (win1 != 0) delwin(win1); beep(); } } static void init_status(WINDOW *win, STATUS * sp) { memset(sp, 0, sizeof(*sp)); sp->c = 99; sp->v = 99; sp->ch = ' '; keypad(win, TRUE); fill_window(win); getbegyx(win, sp->y_beg, sp->x_beg); getmaxyx(win, sp->y_max, sp->x_max); } static void show_help(WINDOW *win) { static const char *msgs[] = { "Basic commands:" ,"Use h/j/k/l or arrow keys to move the cursor." ,"Set the count parameter for chgat by entering digits 0-9." ,"" ,"Other commands:" ,"space toggles through the set of video attributes and colors." ,"t touches (forces repaint) of the current line." ,". calls *chgat at the current position with the given count." ,", calls *chgat at the window beginning with the given count." ,"= resets count to zero." ,"- negates count." ,"? shows this help-window" ,0 }; popup_msg(win, msgs); } static void update_status(WINDOW *win, STATUS * sp) { switch (sp->ch) { case ' ': /* next test-iteration */ if (has_colors()) { if ((sp->c_msg = color_params(++(sp->c), &(sp->pair))) == 0) { sp->c_msg = color_params(sp->c = 0, &(sp->pair)); if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) { sp->v_msg = video_params(sp->v = 0, &(sp->attr)); } } } else { if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) { sp->v_msg = video_params(sp->v = 0, &(sp->attr)); } } sp->count = 0; show_status(win, sp); break; case KEY_LEFT: case 'h': if (sp->x_val > 0) wmove(win, sp->y_val, --(sp->x_val)); break; case KEY_DOWN: case 'j': if (sp->y_val < sp->y_max) wmove(win, ++(sp->y_val), sp->x_val); break; case KEY_UP: case 'k': if (sp->y_val > 0) wmove(win, --(sp->y_val), sp->x_val); break; case KEY_RIGHT: case 'l': if (sp->x_val < sp->x_max) wmove(win, sp->y_val, ++(sp->x_val)); break; case 't': touchline(win, sp->y_val, 1); break; case '=': sp->count = 0; show_status(win, sp); break; case '-': sp->count = -(sp->count); show_status(win, sp); break; case HELP_KEY_1: show_help(win); break; default: if (isdigit(sp->ch)) { sp->count = (sp->count * 10) + (sp->ch - '0'); show_status(win, sp); } else { beep(); } break; } } static void test_wchgat(WINDOW *win) { STATUS st; init_status(win, &st); do { switch (st.ch) { case '.': /* change from current position */ wchgat(win, st.count, st.attr, st.pair, (void *) 0); touch_if_needed(win, st.y_val); break; case ',': /* change from beginning of window */ mvwchgat(win, 0, 0, st.count, st.attr, st.pair, (void *) 0); touch_if_needed(win, 0); wmove(win, st.y_val, st.x_val); break; case 'w': do_subwindow(win, &st, test_wchgat); break; case 'q': return; default: update_status(win, &st); break; } } while ((st.ch = wgetch(win)) != ERR); } static void test_chgat(void) { STATUS st; init_status(stdscr, &st); do { switch (st.ch) { case '.': /* change from current position */ chgat(st.count, st.attr, st.pair, (void *) 0); touch_if_needed(stdscr, st.y_val); break; case ',': /* change from beginning of window */ mvchgat(0, 0, st.count, st.attr, st.pair, (void *) 0); touch_if_needed(stdscr, 0); move(st.y_val, st.x_val); break; case 'w': do_subwindow(stdscr, &st, test_wchgat); break; case 'q': return; default: update_status(stdscr, &st); break; } } while ((st.ch = getch()) != ERR); } static void usage(int ok) { static const char *msg[] = { "Usage: chgat [options]" ,"" ,USAGE_COMMON }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { int ch; while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { switch (ch) { case OPTS_VERSION: show_version(argv); ExitProgram(EXIT_SUCCESS); default: usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) usage(FALSE); initscr(); cbreak(); noecho(); test_chgat(); endwin(); ExitProgram(EXIT_SUCCESS); } #else int main(void) { printf("This program requires the curses chgat function\n"); ExitProgram(EXIT_FAILURE); } #endif ncurses-6.4-20240113/test/key_names.c0000644000000000000000000000744514342766153015560 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/test/ins_wide.c0000644000000000000000000003114414345204042015362 0ustar rootroot/**************************************************************************** * Copyright 2020,2022 Thomas E. Dickey * * Copyright 2002-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: ins_wide.c,v 1.30 2022/12/10 22:28:50 tom Exp $ * * Demonstrate the wins_wstr() and wins_wch functions. * Thomas Dickey - 2002/11/23 * * Note: to provide inputs for *ins_wch(), we use setcchar(). A quirk of the * X/Open definition for that function is that the string contains no * characters with negative width. Any control character (such as tab) falls * into that category. So it follows that *ins_wch() cannot render a tab * character because there is no legal way to construct a cchar_t containing * one. X/Open does not document this, and it would be logical to assume that * *ins_wstr() has the same limitation, but it uses a wchar_t string directly, * and does not document how tabs are handled. */ #include #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, 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 ncurses-6.4-20240113/test/firstlast.c0000644000000000000000000001124314345213323015574 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/test/bulgarian-utf8.txt0000644000000000000000000000052410346602370017007 0ustar rootrootПоказване на помощна информация -- 1 Създаване на дялове -- 2 Избор на дял и форматиране -- 3 Записване в избрания дял -- 4 Инсталиране на LILO -- 5 Изход от програмата -- 6 ncurses-6.4-20240113/test/hanoi.c0000644000000000000000000002221114342766153014667 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/test/rain.c0000644000000000000000000002374614342766153014540 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2022 Thomas E. Dickey * * Copyright 1998-2014,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* * $Id: rain.c,v 1.57 2022/12/04 00:40:11 tom Exp $ */ #include #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) (struct DATA *); typedef struct DATA { int y, x; #ifdef USE_PTHREADS DrawPart func; int state; #endif } DATA; #ifdef USE_PTHREADS pthread_cond_t cond_next_drop; pthread_mutex_t mutex_drop_data; pthread_mutex_t mutex_next_drop; static int used_threads; typedef struct { pthread_t myself; long counter; } STATS; static STATS drop_threads[MAX_THREADS]; #endif #if HAVE_USE_WINDOW static int safe_wgetch(WINDOW *w, void *data GCC_UNUSED) { return wgetch(w); } #endif static void onsig(int n GCC_UNUSED) { stop_curses(); ExitProgram(EXIT_FAILURE); } static double ranf(void) { long r = (rand() & 077777); return ((double) r / 32768.); } static int random_x(void) { return (int) (((double) (COLS - 4) * ranf()) + 2); } static int random_y(void) { return (int) (((double) (LINES - 4) * ranf()) + 2); } static int next_j(int j) { if (j == 0) j = MAX_DROP - 1; else --j; if (has_colors()) { int z = (int) (3 * ranf()); (void) attrset(AttrArg(COLOR_PAIR(z), (z ? A_BOLD : A_NORMAL))); } return j; } static void part1(DATA * drop) { MvAddCh(drop->y, drop->x, '.'); } static void part2(DATA * drop) { MvAddCh(drop->y, drop->x, 'o'); } static void part3(DATA * drop) { MvAddCh(drop->y, drop->x, 'O'); } static void part4(DATA * drop) { MvAddCh(drop->y - 1, drop->x, '-'); MvAddStr(drop->y, drop->x - 1, "|.|"); MvAddCh(drop->y + 1, drop->x, '-'); } static void part5(DATA * drop) { MvAddCh(drop->y - 2, drop->x, '-'); MvAddStr(drop->y - 1, drop->x - 1, "/ \\"); MvAddStr(drop->y, drop->x - 2, "| O |"); MvAddStr(drop->y + 1, drop->x - 1, "\\ /"); MvAddCh(drop->y + 2, drop->x, '-'); } static void part6(DATA * drop) { MvAddCh(drop->y - 2, drop->x, ' '); MvAddStr(drop->y - 1, drop->x - 1, " "); MvAddStr(drop->y, drop->x - 2, " "); MvAddStr(drop->y + 1, drop->x - 1, " "); MvAddCh(drop->y + 2, drop->x, ' '); } #ifdef USE_PTHREADS static void napsome(void) { napms(60); } /* * This runs inside the use_window() mutex. */ static int really_draw(WINDOW *win, void *arg) { DATA *data = (DATA *) arg; (void) win; next_j(data->state); data->func(data); refresh(); return OK; } static void draw_part(void (*func) (DATA *), int state, DATA * data) { data->func = func; data->state = state; use_window(stdscr, really_draw, (void *) data); napsome(); } /* * Tell the threads that one of them can start work on a new raindrop. * They may all be busy if we're sending requests too rapidly. */ static int put_next_drop(void) { pthread_cond_broadcast(&cond_next_drop); pthread_mutex_unlock(&mutex_next_drop); return 0; } /* * Wait until we're assigned the task of drawing a new raindrop. */ static int get_next_drop(void) { pthread_mutex_lock(&mutex_next_drop); pthread_cond_wait(&cond_next_drop, &mutex_next_drop); return TRUE; } static void * draw_drop(void *arg) { DATA mydata; int mystats; /* * Find myself in the list of threads so we can count the number of loops. */ for (mystats = 0; mystats < MAX_THREADS; ++mystats) { #if defined(_NC_WINDOWS) && !defined(__WINPTHREADS_VERSION) if (drop_threads[mystats].myself.p == pthread_self().p) #else if (drop_threads[mystats].myself == pthread_self()) #endif break; } do { if (mystats < MAX_THREADS) drop_threads[mystats].counter++; /* * Make a copy of caller's data. We're cheating for the cases after * the first loop since we still have a pointer into the main thread * to the data which it uses for setting up this thread (but it has * been modified to use different coordinates). */ pthread_mutex_lock(&mutex_drop_data); mydata = *(DATA *) arg; pthread_mutex_unlock(&mutex_drop_data); draw_part(part1, 0, &mydata); draw_part(part2, 1, &mydata); draw_part(part3, 2, &mydata); draw_part(part4, 3, &mydata); draw_part(part5, 4, &mydata); draw_part(part6, 0, &mydata); } while (get_next_drop()); return NULL; } /* * The description of pthread_create() is misleading, since it implies that * threads will exit cleanly after their function returns. * * Since they do not (and the number of threads is limited by system * resources), make a limited number of threads, and signal any that are * waiting when we want a thread past that limit. */ static int start_drop(DATA * data) { int rc; if (!used_threads) { /* mutex and condition for signalling thread */ pthread_mutex_init(&mutex_next_drop, NULL); pthread_cond_init(&cond_next_drop, NULL); } if (used_threads < MAX_THREADS) { rc = pthread_create(&(drop_threads[used_threads].myself), NULL, draw_drop, data); ++used_threads; } else { rc = put_next_drop(); } return rc; } #endif static int get_input(void) { return USING_WINDOW1(stdscr, wgetch, safe_wgetch); } static void usage(int ok) { static const char *msg[] = { "Usage: rain [options]" ,"" ,USAGE_COMMON ,"Options:" #if HAVE_USE_DEFAULT_COLORS ," -d invoke use_default_colors" #endif }; size_t n; for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } /* *INDENT-OFF* */ VERSION_COMMON() /* *INDENT-ON* */ int main(int argc, char *argv[]) { static const char *help[] = { "Commands:", " q/Q exit the program", " s do single-step", " 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); } ncurses-6.4-20240113/test/aclocal.m40000644000000000000000000045741414533107356015302 0ustar rootrootdnl*************************************************************************** dnl Copyright 2018-2022,2023 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.220 2023/12/03 14:21:34 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: 20 updated: 2020/12/31 20:19:42 dnl --------------- dnl Curses-functions are a little complicated, since a lot of them are macros. AC_DEFUN([CF_CURSES_FUNCS], [ AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl AC_REQUIRE([CF_XOPEN_CURSES]) AC_REQUIRE([CF_CURSES_TERM_H]) AC_REQUIRE([CF_CURSES_UNCTRL_H]) for cf_func in $1 do CF_UPPER(cf_tr_func,$cf_func) AC_MSG_CHECKING(for ${cf_func}) CF_MSG_LOG(${cf_func}) AC_CACHE_VAL(cf_cv_func_$cf_func,[ eval cf_result='$ac_cv_func_'$cf_func if test ".$cf_result" != ".no"; then AC_TRY_LINK(CF__CURSES_HEAD, [ #ifndef ${cf_func} long foo = (long)(&${cf_func}); fprintf(stderr, "testing linkage of $cf_func:%p\\n", (void *)foo); if (foo + 1234L > 5678L) ${cf_cv_main_return:-return}(foo != 0); #endif ], [cf_result=yes], [cf_result=no]) fi eval 'cf_cv_func_'$cf_func'="$cf_result"' ]) # use the computed/retrieved cache-value: eval 'cf_result=$cf_cv_func_'$cf_func AC_MSG_RESULT($cf_result) if test "$cf_result" != no; then AC_DEFINE_UNQUOTED(HAVE_${cf_tr_func}) fi done ])dnl dnl --------------------------------------------------------------------------- dnl CF_CURSES_HEADER version: 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: 15 updated: 2021/01/02 09:31:20 dnl ---------------- dnl SVr4 curses should have term.h as well (where it puts the definitions of dnl the low-level interface). This may not be true in old/broken implementations, dnl as well as in misconfigured systems (e.g., gcc configured for Solaris 2.4 dnl running with Solaris 2.5.1). AC_DEFUN([CF_CURSES_TERM_H], [ AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl AC_CACHE_CHECK(for term.h, cf_cv_term_header,[ # If we found , 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 make an error #endif], [WINDOW *x; (void)x], [cf_cv_term_header=$cf_header break], [cf_cv_term_header=no]) done ;; esac ]) case "$cf_cv_term_header" in (term.h) AC_DEFINE(HAVE_TERM_H,1,[Define to 1 if we have term.h]) ;; (ncurses/term.h) AC_DEFINE(HAVE_NCURSES_TERM_H,1,[Define to 1 if we have ncurses/term.h]) ;; (ncursesw/term.h) AC_DEFINE(HAVE_NCURSESW_TERM_H,1,[Define to 1 if we have ncursesw/term.h]) ;; esac ])dnl dnl --------------------------------------------------------------------------- dnl CF_CURSES_UNCTRL_H version: 8 updated: 2021/01/02 09:31:20 dnl ------------------ dnl Any X/Open curses implementation must have unctrl.h, but ncurses packages dnl may put it in a subdirectory (along with ncurses' other headers, of dnl course). Packages which put the headers in inconsistent locations are dnl broken). AC_DEFUN([CF_CURSES_UNCTRL_H], [ AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl AC_CACHE_CHECK(for unctrl.h, cf_cv_unctrl_header,[ # If we found , 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: 2 updated: 2023/02/25 08:45:56 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],[ AC_CACHE_CHECK(for clock_gettime,cf_cv_func_clock_gettime,[ AC_TRY_LINK([#include ], [struct timespec ts; int rc = clock_gettime(CLOCK_REALTIME, &ts); (void) rc; (void)ts], [cf_cv_func_clock_gettime=yes], [cf_cv_func_clock_gettime=no]) ]) 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_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_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: 2 updated: 2016/04/22 05:07:41 dnl ------------------- dnl Use this followup check to ensure that we link with pthreads if ncurses dnl uses it. AC_DEFUN([CF_NCURSES_PTHREADS],[ : ${cf_nculib_root:=ifelse($1,,ncurses,$1)} AC_CHECK_LIB($cf_nculib_root,_nc_init_pthreads, cf_cv_ncurses_pthreads=yes, cf_cv_ncurses_pthreads=no) if test "$cf_cv_ncurses_pthreads" = yes then CF_ADD_LIBS(-lpthread) fi ])dnl dnl --------------------------------------------------------------------------- dnl CF_NCURSES_VERSION version: 17 updated: 2023/01/05 18:54:02 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 make an error # endif #endif ${cf_cv_main_return:-return}(0); }],[ cf_cv_ncurses_version=`cat $cf_tempfile`],,[ # This will not work if the preprocessor splits the line after the # Autoconf token. The 'unproto' program does that. cat > "conftest.$ac_ext" < #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: 18 updated: 2020/12/31 18:40:20 dnl -------------- dnl Check the argument to see that it looks like a pathname. Rewrite it if it dnl begins with one of the prefix/exec_prefix variables, and then again if the dnl result begins with 'NONE'. This is necessary to work around autoconf's dnl delayed evaluation of those symbols. AC_DEFUN([CF_PATH_SYNTAX],[ if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".[$]$1" in (.\[$]\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[[a-zA-Z]]:[[\\/]]*) # OS/2 EMX ;; (.\[$]\{*prefix\}*|.\[$]\{*dir\}*) eval $1="[$]$1" case ".[$]$1" in (.NONE/*) $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` ;; (*) ifelse([$2],,[AC_MSG_ERROR([expected a pathname, not \"[$]$1\"])],$2) ;; esac ])dnl dnl --------------------------------------------------------------------------- dnl CF_PDCURSES_X11 version: 15 updated: 2021/01/02 09:31:20 dnl --------------- dnl Configure for PDCurses' X11 library AC_DEFUN([CF_PDCURSES_X11],[ AC_REQUIRE([CF_X_ATHENA]) CF_ACVERSION_CHECK(2.52, [AC_CHECK_TOOLS(XCURSES_CONFIG, xcurses-config, none)], [AC_PATH_PROGS(XCURSES_CONFIG, xcurses-config, none)]) if test "$XCURSES_CONFIG" != none ; then CF_ADD_CFLAGS(`$XCURSES_CONFIG --cflags`) CF_ADD_LIBS(`$XCURSES_CONFIG --libs`) cf_cv_lib_XCurses=yes else LDFLAGS="$LDFLAGS $X_LIBS" CF_CHECK_CFLAGS($X_CFLAGS) AC_CHECK_LIB(X11,XOpenDisplay, [CF_ADD_LIBS(-lX11)],, [$X_PRE_LIBS $LIBS $X_EXTRA_LIBS]) AC_CACHE_CHECK(for XCurses library,cf_cv_lib_XCurses,[ CF_ADD_LIBS(-lXCurses) AC_TRY_LINK([ #include 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: 10 updated: 2021/01/04 19:33:05 dnl --------------- dnl Force $INSTALL to be an absolute-path. Otherwise, edit_man.sh and the dnl misc/tabset install won't work properly. Usually this happens only when dnl using the fallback mkinstalldirs script AC_DEFUN([CF_PROG_INSTALL], [AC_PROG_INSTALL case $INSTALL in (/*) ;; (*) CF_DIRNAME(cf_dir,$INSTALL) test -z "$cf_dir" && cf_dir=. INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" ;; esac ])dnl dnl --------------------------------------------------------------------------- dnl CF_PROG_LINT version: 5 updated: 2022/08/20 15:44:13 dnl ------------ AC_DEFUN([CF_PROG_LINT], [ AC_CHECK_PROGS(LINT, lint cppcheck splint) case "x$LINT" in (xcppcheck|x*/cppcheck) test -z "$LINT_OPTS" && LINT_OPTS="--enable=all" ;; esac AC_SUBST(LINT_OPTS) AC_SUBST(LINT_LIBS) ])dnl dnl --------------------------------------------------------------------------- dnl CF_REMOVE_CFLAGS version: 3 updated: 2021/09/05 17:25:40 dnl ---------------- dnl Remove a given option from CFLAGS/CPPFLAGS dnl $1 = option to remove dnl $2 = variable to update dnl $3 = nonempty to allow verbose message define([CF_REMOVE_CFLAGS], [ cf_tmp_cflag=`echo "x$1" | sed -e 's/^.//' -e 's/=.*//'` while true do cf_old_cflag=`echo "x[$]$2" | sed -e 's/^.//' -e 's/[[ ]][[ ]]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[[^ ]][[^ ]]*\\)\?%%" -e 's/^[[ ]]*//' -e 's%[[ ]][[ ]]*-D% -D%g' -e 's%[[ ]][[ ]]*-I% -I%g'` test "[$]$2" != "$cf_old_cflag" || break ifelse([$3],,,[CF_VERBOSE(removing old option $1 from $2)]) $2="$cf_old_cflag" done ])dnl dnl --------------------------------------------------------------------------- dnl CF_REMOVE_DEFINE version: 3 updated: 2010/01/09 11:05:50 dnl ---------------- dnl Remove all -U and -D options that refer to the given symbol from a list dnl of C compiler options. This works around the problem that not all dnl compilers process -U and -D options from left-to-right, so a -U option dnl cannot be used to cancel the effect of a preceding -D option. dnl dnl $1 = target (which could be the same as the source variable) dnl $2 = source (including '$') dnl $3 = symbol to remove define([CF_REMOVE_DEFINE], [ $1=`echo "$2" | \ sed -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[[ ]]/ /g' \ -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[$]//g'` ])dnl dnl --------------------------------------------------------------------------- dnl CF_RESTORE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:47:45 dnl --------------------- dnl Restore flags saved in CF_SAVE_XTRA_FLAGS dnl $1 = name of current macro define([CF_RESTORE_XTRA_FLAGS], [ LIBS="$cf_save_LIBS_$1" CFLAGS="$cf_save_CFLAGS_$1" CPPFLAGS="$cf_save_CPPFLAGS_$1" ])dnl dnl --------------------------------------------------------------------------- dnl CF_RPATH_HACK version: 13 updated: 2021/01/03 18:30:50 dnl ------------- AC_DEFUN([CF_RPATH_HACK], [AC_REQUIRE([AC_PROG_FGREP])dnl AC_REQUIRE([CF_LD_RPATH_OPT])dnl AC_MSG_CHECKING(for updated LDFLAGS) if test -n "$LD_RPATH_OPT" ; then AC_MSG_RESULT(maybe) AC_CHECK_PROGS(cf_ldd_prog,ldd,no) cf_rpath_list="/usr/lib /lib" if test "$cf_ldd_prog" != no then cf_rpath_oops= AC_TRY_LINK([#include ], [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: 10 updated: 2023/01/11 04:05:23 dnl ----------- dnl Check for multibyte support, and if not found, utf8 compatibility library AC_DEFUN([CF_UTF8_LIB], [ AC_HAVE_HEADERS(wchar.h) AC_CACHE_CHECK(for multibyte character support,cf_cv_utf8_lib,[ cf_save_LIBS="$LIBS" AC_TRY_LINK([ $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_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: 18 updated: 2023/01/11 04:05:23 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) make an error #endif #endif #ifdef NCURSES_WIDECHAR make an error /* prefer to fall-through on the second checks */ #endif cchar_t check; int check2 = curs_set((int)sizeof(check)); long x = winnstr(stdscr, "", 0); int x1, y1; (void)check2; getbegyx(stdscr, y1, x1); (void)x; (void)y1; (void)x1; ], [cf_cv_need_xopen_extension=none], [ for cf_try_xopen_extension in _XOPEN_SOURCE_EXTENDED NCURSES_WIDECHAR do AC_TRY_LINK([ #define $cf_try_xopen_extension 1 $ac_includes_default #include <${cf_cv_ncurses_header:-curses.h}>],[ cchar_t check; int check2 = curs_set((int)sizeof(check)); long x = winnstr(stdscr, "", 0); int x1, y1; getbegyx(stdscr, y1, x1); (void)check2; (void)x; (void)y1; (void)x1; ], [cf_cv_need_xopen_extension=$cf_try_xopen_extension; break]) done ]) ]) case "$cf_cv_need_xopen_extension" in (*_*) CF_APPEND_TEXT(CPPFLAGS,-D$cf_cv_need_xopen_extension) ;; esac ])dnl dnl --------------------------------------------------------------------------- dnl CF_XOPEN_SOURCE version: 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 ]) ncurses-6.4-20240113/test/configure0000755000000000000000000241106014535171030015326 0ustar rootroot#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by Autoconf 2.52.20230903. # # 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 ;; -*) { 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:936: 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:947: 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:955: 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:971: 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:975: 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:981: 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:983: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:985: 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:1004: 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:1006: 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:1035: PATH=\".;.\"; conftest.sh") >&5 (PATH=".;."; conftest.sh) 2>&5 ac_status=$? echo "$as_me:1038: \$? = $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:1070: 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:1080: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:1084: 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:1093: 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:1097: 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:1102: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6 build=$ac_cv_build build_cpu=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then echo "$as_me:1110: 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:1119: 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:1124: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6 host=$ac_cv_host host_cpu=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` system_name="$host_os" else system_name="`(uname -s -r) 2>/dev/null`" if test -z "$system_name" ; then system_name="`(hostname) 2>/dev/null`" fi fi test -n "$system_name" && cat >>confdefs.h <&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:1150: 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:1154: 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:1156: error: \"Please remove config.cache and try again.\"" >&5 echo "$as_me: error: \"Please remove config.cache and try again.\"" >&2;} { (exit 1); exit 1; }; } fi test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed echo "$as_me:1174: 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:1194: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:1198: 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:1212: 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:1227: found $ac_dir/$ac_word" >&5 break done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:1235: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:1238: 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:1247: 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:1262: 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:1270: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:1273: 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:1286: 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:1301: found $ac_dir/$ac_word" >&5 break done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:1309: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:1312: 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:1321: 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:1336: 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:1344: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:1347: 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:1360: 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:1380: 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:1402: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:1405: 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:1416: 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:1431: found $ac_dir/$ac_word" >&5 break done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:1439: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:1442: 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:1455: 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:1470: 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:1478: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:1481: 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:1493: 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:1498:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo "$2"` { (eval echo "$as_me:1501: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:1504: \$? = $ac_status" >&5 (exit "$ac_status"); } { (eval echo "$as_me:1506: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:1509: \$? = $ac_status" >&5 (exit "$ac_status"); } { (eval echo "$as_me:1511: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:1514: \$? = $ac_status" >&5 (exit "$ac_status"); } cat >"conftest.$ac_ext" <<_ACEOF #line 1518 "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:1534: 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:1537: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:1540: \$? = $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:1563: 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:1569: 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:1574: 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:1580: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1583: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:1590: 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:1598: 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:1605: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:1607: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:1610: checking for executable suffix" >&5 echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6 if { (eval echo "$as_me:1612: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:1615: \$? = $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:1631: 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:1637: 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:1643: 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 1649 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:1661: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1664: \$? = $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:1676: 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:1683: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:1687: 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 1693 "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:1708: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1711: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1714: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1717: \$? = $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:1729: 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:1735: 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 1741 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:1753: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1756: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1759: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1762: \$? = $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:1772: 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:1799: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1802: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1805: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1808: \$? = $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 1820 "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:1833: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1836: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1839: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1842: \$? = $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 1852 "configure" #include "confdefs.h" $ac_declaration int main (void) { exit (42); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:1864: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1867: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1870: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1873: \$? = $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:1903: 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:1907: 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:1916: 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 1921 "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:1938: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1941: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1944: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1947: \$? = $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:1958: result: $INTEL_COMPILER" >&5 echo "${ECHO_T}$INTEL_COMPILER" >&6 ;; esac fi CLANG_COMPILER=no if test "$GCC" = yes ; then echo "$as_me:1967: 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 1971 "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:1988: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1991: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:1994: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1997: \$? = $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:2007: 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:2016: 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:2023: 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:2027: 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:2034: 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 2039 "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:2053: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:2056: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:2059: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2062: \$? = $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:2073: 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}:2079: testing adding option $cf_clang_opt ..." 1>&5 test -n "$CFLAGS" && CFLAGS="$CFLAGS " CFLAGS="${CFLAGS}$cf_clang_opt" fi done fi echo "$as_me:2088: 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 2096 "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:2143: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2146: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:2149: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2152: \$? = $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:2169: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:2172: 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:2180: checking \$CFLAGS variable" >&5 echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6 case "x$CFLAGS" in (*-[IUD]*) echo "$as_me:2184: result: broken" >&5 echo "${ECHO_T}broken" >&6 { echo "$as_me:2186: 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:2294: result: ok" >&5 echo "${ECHO_T}ok" >&6 ;; esac echo "$as_me:2299: checking \$CC variable" >&5 echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6 case "$CC" in (*[\ \ ]-*) echo "$as_me:2303: result: broken" >&5 echo "${ECHO_T}broken" >&6 { echo "$as_me:2305: 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}:2422: testing resulting CC: '$CC' ..." 1>&5 test -n "$verbose" && echo " resulting CFLAGS: '$CFLAGS'" 1>&6 echo "${as_me:-configure}:2426: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5 test -n "$verbose" && echo " resulting CPPFLAGS: '$CPPFLAGS'" 1>&6 echo "${as_me:-configure}:2430: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5 ;; (*) echo "$as_me:2434: result: ok" >&5 echo "${ECHO_T}ok" >&6 ;; esac echo "$as_me:2439: 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 2447 "configure" #include "confdefs.h" #ifndef __cplusplus static $ac_kw int static_foo () {return 0; } $ac_kw int foo () {return 0; } #endif _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:2456: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2459: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:2462: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2465: \$? = $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:2476: 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:2510: found $ac_dir/$ac_word" >&5 break done fi fi GREP=$ac_cv_prog_GREP if test -n "$GREP"; then echo "$as_me:2518: result: $GREP" >&5 echo "${ECHO_T}$GREP" >&6 else echo "$as_me:2521: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$GREP" && break done test -n "$GREP" || GREP=": " echo "$as_me:2529: 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:2541: 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:2558: found $ac_dir/$ac_word" >&5 break fi done ;; esac fi EGREP=$ac_cv_path_EGREP if test -n "$EGREP"; then echo "$as_me:2569: result: $EGREP" >&5 echo "${ECHO_T}$EGREP" >&6 else echo "$as_me:2572: 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:2580: error: cannot find workable egrep" >&5 echo "$as_me: error: cannot find workable egrep" >&2;} { (exit 1); exit 1; }; } fi fi echo "$as_me:2585: 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:2595: 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 2616 "configure" #include "confdefs.h" #include Syntax error _ACEOF if { (eval echo "$as_me:2621: \"$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:2627: \$? = $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 2650 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:2654: \"$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:2660: \$? = $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:2697: 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 2707 "configure" #include "confdefs.h" #include Syntax error _ACEOF if { (eval echo "$as_me:2712: \"$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:2718: \$? = $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 2741 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:2745: \"$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:2751: \$? = $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:2779: 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:2795: 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:2810: found $ac_dir/$ac_word" >&5 break done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:2818: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:2821: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:2840: 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:2889: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' case $INSTALL in (/*) ;; (*) cf_dir=`echo "$INSTALL" | sed -e 's%/[^/]*$%%'` test -z "$cf_dir" && cf_dir=. INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" ;; esac echo "$as_me:2910: 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:2927: 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:2938: 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:2969: result: $cf_cv_install_p" >&5 echo "${ECHO_T}$cf_cv_install_p" >&6 echo "$as_me:2972: 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:2983: 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:2994: 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:3004: result: $with_strip_program" >&5 echo "${ECHO_T}$with_strip_program" >&6 if test "$with_strip_program" != no then echo "$as_me:3008: 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:3029: result: $check_install_strip" >&5 echo "${ECHO_T}$check_install_strip" >&6 case "$check_install_strip" in (no) { echo "$as_me:3033: 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}:3048: 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:3062: 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:3077: found $ac_dir/$ac_word" >&5 break done fi fi LINT=$ac_cv_prog_LINT if test -n "$LINT"; then echo "$as_me:3085: result: $LINT" >&5 echo "${ECHO_T}$LINT" >&6 else echo "$as_me:3088: 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:3101: 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:3156: 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:3163: 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:3190: 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:3201: 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:3216: found $ac_dir/$ac_word" >&5 break done fi fi CTAGS=$ac_cv_prog_CTAGS if test -n "$CTAGS"; then echo "$as_me:3224: result: $CTAGS" >&5 echo "${ECHO_T}$CTAGS" >&6 else echo "$as_me:3227: 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:3238: 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:3253: found $ac_dir/$ac_word" >&5 break done fi fi ETAGS=$ac_cv_prog_ETAGS if test -n "$ETAGS"; then echo "$as_me:3261: result: $ETAGS" >&5 echo "${ECHO_T}$ETAGS" >&6 else echo "$as_me:3264: 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:3273: 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:3288: 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:3297: result: $MAKE_LOWER_TAGS" >&5 echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6 else echo "$as_me:3300: 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:3307: 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:3322: 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:3331: result: $MAKE_UPPER_TAGS" >&5 echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6 else echo "$as_me:3334: 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:3354: 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 3361 "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:3377: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3380: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:3383: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3386: \$? = $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:3396: 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:3404: 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 3411 "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:3427: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3430: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:3433: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3436: \$? = $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:3446: 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:3501: 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:3513: 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:3530: found $ac_dir/$ac_word" >&5 break fi done ;; esac fi FGREP=$ac_cv_path_FGREP if test -n "$FGREP"; then echo "$as_me:3541: result: $FGREP" >&5 echo "${ECHO_T}$FGREP" >&6 else echo "$as_me:3544: 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:3552: error: cannot find workable fgrep" >&5 echo "$as_me: error: cannot find workable fgrep" >&2;} { (exit 1); exit 1; }; } fi fi echo "$as_me:3557: result: $ac_cv_path_FGREP" >&5 echo "${ECHO_T}$ac_cv_path_FGREP" >&6 FGREP="$ac_cv_path_FGREP" echo "$as_me:3561: 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:3578: result: $enable_stdnoreturn" >&5 echo "${ECHO_T}$enable_stdnoreturn" >&6 if test $enable_stdnoreturn = yes; then echo "$as_me:3582: 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 3588 "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:3604: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:3607: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:3610: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3613: \$? = $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:3624: 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:3719: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:3721: 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:3780: 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:3790: 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:3799: 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:3801: 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 3807 "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:3838: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3841: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:3844: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3847: \$? = $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:3857: 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:3867: 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 3875 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char strlcat (); int main (void) { strlcat (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:3894: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3897: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:3900: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3903: \$? = $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:3914: 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:3937: 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 3943 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:3947: \"$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:3953: \$? = $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:3972: 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:3993: 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 3999 "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:4030: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:4033: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:4036: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4039: \$? = $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:4049: 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 4068 "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:4087: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4090: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4093: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4096: \$? = $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:4107: 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:4149: 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 4156 "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:4175: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4178: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4181: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4184: \$? = $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:4195: 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:4203: 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 4215 "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:4234: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4237: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4240: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4243: \$? = $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:4255: 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:4260: 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 4365 "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:4385: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4388: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4391: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4394: \$? = $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:4405: 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:4414: 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 4421 "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:4436: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4439: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4442: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4445: \$? = $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 4552 "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:4567: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4570: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4573: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4576: \$? = $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:4591: 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:4596: 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 4606 "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:4621: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4624: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4627: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4630: \$? = $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:4641: 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:4678: 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}:4684: testing if the symbol is already defined go no further ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 4687 "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:4702: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4705: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4708: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4711: \$? = $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 4732 "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:4747: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4750: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4753: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4756: \$? = $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}:4767: 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}:4775: testing if the second compile does not leave our definition intact error ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 4778 "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:4793: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4796: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4799: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4802: \$? = $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:4818: 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:4935: 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:4967: 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 4974 "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:4992: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4995: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:4998: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5001: \$? = $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 5013 "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:5031: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5034: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5037: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5040: \$? = $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:5055: 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:5215: 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}:5221: testing if the symbol is already defined go no further ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 5224 "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:5239: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5242: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5245: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5248: \$? = $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 5269 "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:5284: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5287: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5290: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5293: \$? = $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}:5304: 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}:5312: testing if the second compile does not leave our definition intact error ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 5315 "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:5330: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5333: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5336: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5339: \$? = $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:5355: 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}:5468: testing checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 5471 "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:5489: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5492: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5495: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5498: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then : else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 { echo "$as_me:5505: 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}:5528: 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}:5540: 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}:5628: 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}:5638: 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}:5648: 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:5660: 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 5663 "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:5678: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5681: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5684: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5687: \$? = $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:5696: 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 5701 "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: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_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:5736: WARNING: _XOPEN_SOURCE is lower than requested" >&5 echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;} fi else echo "$as_me:5741: 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 5748 "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:5766: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5769: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5772: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5775: \$? = $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 5787 "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:5805: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:5808: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:5811: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5814: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then cf_cv_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:5829: 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:5976: 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 5982 "configure" #include "confdefs.h" #include #include #include #include _ACEOF if { (eval echo "$as_me:5990: \"$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:5996: \$? = $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 6018 "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 6036 "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 6057 "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:6083: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6086: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:6088: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6091: \$? = $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:6104: 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:6120: 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 6126 "configure" #include "confdefs.h" $ac_includes_default #include <$ac_header> _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:6132: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6135: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6138: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6141: \$? = $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:6151: 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 6167 "configure" #include "confdefs.h" $ac_includes_default int main (void) { #ifndef exit char *p = (char *) exit; (void) p; #endif ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:6182: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6185: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6188: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6191: \$? = $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:6201: result: $ac_cv_have_decl_exit" >&5 echo "${ECHO_T}$ac_cv_have_decl_exit" >&6 echo "$as_me:6204: 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 6216 "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:6240: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6243: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6246: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6249: \$? = $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:6263: 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 6279 "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:6294: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6297: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6300: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6303: \$? = $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 6310 "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:6328: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6331: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6334: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6337: \$? = $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:6351: 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:6355: 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 6366 "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:6388: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6391: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6394: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6397: \$? = $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:6411: 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:6421: 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 6427 "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:6441: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6444: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6447: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6450: \$? = $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:6461: 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:6471: 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:6481: 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:6493: 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:6510: 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:6521: result: $PKG_CONFIG" >&5 echo "${ECHO_T}$PKG_CONFIG" >&6 else echo "$as_me:6524: 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:6533: 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:6550: 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:6562: result: $ac_pt_PKG_CONFIG" >&5 echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6 else echo "$as_me:6565: result: no" >&5 echo "${ECHO_T}no" >&6 fi PKG_CONFIG=$ac_pt_PKG_CONFIG else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi ;; (*) PKG_CONFIG=$withval ;; esac test -z "$PKG_CONFIG" && PKG_CONFIG=none if test "$PKG_CONFIG" != none ; then if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$PKG_CONFIG" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval PKG_CONFIG="$PKG_CONFIG" case ".$PKG_CONFIG" in (.NONE/*) PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:6608: 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:6615: WARNING: pkg-config is not installed" >&5 echo "$as_me: WARNING: pkg-config is not installed" >&2;} fi echo "$as_me:6619: 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:6653: result: $enableval" >&5 echo "${ECHO_T}$enableval" >&6 echo "$as_me:6656: 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:6666: result: $NCURSES_WRAP_PREFIX" >&5 echo "${ECHO_T}$NCURSES_WRAP_PREFIX" >&6 echo "$as_me:6669: 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:6686: result: $cf_enable_widec" >&5 echo "${ECHO_T}$cf_enable_widec" >&6 echo "$as_me:6689: 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:6699: result: $cf_cv_curses_dir" >&5 echo "${ECHO_T}$cf_cv_curses_dir" >&6 if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" then if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$withval" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval withval="$withval" case ".$withval" in (.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:6730: 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 6766 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:6778: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6781: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6784: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6787: \$? = $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}:6804: 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}:6840: 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:6853: 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:6897: result: $cf_cv_screen" >&5 echo "${ECHO_T}$cf_cv_screen" >&6 case $cf_cv_screen in (curses|curses_*) echo "$as_me:6903: 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:6929: 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:6939: 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 6951 "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:6963: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6966: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6969: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6972: \$? = $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:6983: 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:6987: 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:6997: 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 7003 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:7007: \"$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:7013: \$? = $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:7032: 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 7060 "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:7075: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:7078: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:7081: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7084: \$? = $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:7100: 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:7132: 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:7158: \"$cf_try\"") >&5 (eval $cf_try) 2>&5 ac_status=$? echo "$as_me:7161: \$? = $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 7171 "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 make an error # endif #endif ${cf_cv_main_return:-return}(0); } _ACEOF rm -f "conftest$ac_exeext" if { (eval echo "$as_me:7198: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7201: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:7203: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7206: \$? = $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:7220: 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:7227: 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 7230 "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:7242: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7245: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7248: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7251: \$? = $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:7260: result: $cf_result" >&5 echo "${ECHO_T}$cf_result" >&6 if test "$cf_result" = no ; then case "$host_os" in (freebsd*) echo "$as_me:7266: 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 7274 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char tgoto (); int main (void) { tgoto (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:7293: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7296: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7299: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7302: \$? = $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:7313: 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:7343: 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 7351 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char initscr (); int main (void) { initscr (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:7370: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7373: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7376: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7379: \$? = $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:7390: 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:7414: 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 7422 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char initscr (); int main (void) { initscr (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:7441: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7444: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7447: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7450: \$? = $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:7461: 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}:7519: 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}:7548: 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}:7579: 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}:7614: 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:7658: 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 7664 "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:7695: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7698: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7701: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7704: \$? = $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:7714: 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:7723: 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 7731 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char tgoto (); int main (void) { tgoto (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:7750: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7753: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7756: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7759: \$? = $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:7770: 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:7793: 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 7796 "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:7808: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7811: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7814: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7817: \$? = $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:7826: 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:7832: 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 7835 "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:7847: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7850: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7853: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7856: \$? = $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 7865 "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:7877: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7880: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7883: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7886: \$? = $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:7898: 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:7904: 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:7916: 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 7922 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:7926: \"$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:7932: \$? = $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:7951: 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 7969 "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:7986: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7989: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7992: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7995: \$? = $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}:8007: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5 cf_save_LIBS="$LIBS" cat >"conftest.$ac_ext" <<_ACEOF #line 8012 "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:8025: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8028: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:8031: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8034: \$? = $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 8048 "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:8061: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8064: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:8067: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8070: \$? = $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}:8087: testing find linkage for utf8 library ..." 1>&5 echo "${as_me:-configure}:8089: 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}:8180: 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 8188 "configure" #include "confdefs.h" #include int main (void) { putwc(0,0); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:8201: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8204: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:8207: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8210: \$? = $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}:8215: 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}:8233: 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}:8308: 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 8314 "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:8327: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8330: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:8333: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8336: \$? = $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}:8341: 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:8383: 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 8421 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:8433: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8436: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:8439: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8442: \$? = $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}:8459: 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}:8495: 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:8525: 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:8528: result: yes" >&5 echo "${ECHO_T}yes" >&6 echo "$as_me:8531: 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 8664 "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:8676: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8679: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:8682: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8685: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then if test "$cross_compiling" = yes; then cf_test_ncuconfig=maybe else cat >"conftest.$ac_ext" <<_ACEOF #line 8691 "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:8698: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8701: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:8703: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8706: \$? = $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 8880 "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:8892: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8895: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:8898: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8901: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then if test "$cross_compiling" = yes; then cf_have_ncuconfig=maybe else cat >"conftest.$ac_ext" <<_ACEOF #line 8907 "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:8914: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8917: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:8919: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8922: \$? = $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:8939: 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:8955: 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 8973 "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:8988: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8991: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:8994: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8997: \$? = $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:9013: 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:9048: 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:9064: 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:9079: 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:9087: result: $NCURSES_CONFIG" >&5 echo "${ECHO_T}$NCURSES_CONFIG" >&6 else echo "$as_me:9090: 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:9103: 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:9118: 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:9126: result: $ac_ct_NCURSES_CONFIG" >&5 echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6 else echo "$as_me:9129: 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:9286: 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 9298 "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:9310: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:9313: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:9316: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9319: \$? = $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:9330: 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:9334: 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:9344: 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 9350 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:9354: \"$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:9360: \$? = $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:9379: 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 9435 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:9447: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:9450: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:9453: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9456: \$? = $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}:9473: 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:9492: 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 9504 "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:9528: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:9531: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:9534: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9537: \$? = $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:9552: 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:9559: 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 9680 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:9692: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:9695: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:9698: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9701: \$? = $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}:9718: 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 9741 "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:9765: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:9768: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:9771: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9774: \$? = $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:9795: error: not found" >&5 echo "$as_me: error: not found" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:9800: 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 9836 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:9848: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:9851: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:9854: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9857: \$? = $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}:9874: 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:9922: 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 9940 "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:9955: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:9958: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:9961: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9964: \$? = $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:9980: 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:10018: 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:10044: \"$cf_try\"") >&5 (eval $cf_try) 2>&5 ac_status=$? echo "$as_me:10047: \$? = $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 10057 "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 make an error # endif #endif ${cf_cv_main_return:-return}(0); } _ACEOF rm -f "conftest$ac_exeext" if { (eval echo "$as_me:10084: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10087: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:10089: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10092: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then 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:10106: 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:10119: 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 10127 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char Gpm_Open (); int main (void) { Gpm_Open (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:10146: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10149: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:10152: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10155: \$? = $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:10166: 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:10169: 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 10177 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char initscr (); int main (void) { initscr (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:10196: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10199: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:10202: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10205: \$? = $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:10216: 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:10231: 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 10239 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char tgoto (); int main (void) { tgoto (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:10258: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10261: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:10264: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10267: \$? = $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:10278: 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:10327: 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 10333 "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:10364: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10367: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:10370: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10373: \$? = $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:10383: 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:10390: 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 10394 "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:10406: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10409: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:10412: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10415: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:10417: 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:10424: 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:10492: 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 10496 "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:10508: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10511: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:10514: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10517: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:10519: 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:10526: 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:10541: 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:10549: 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 10559 "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:10571: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10574: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:10577: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10580: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:10582: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 echo "$as_me:10587: 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:10615: result: yes" >&5 echo "${ECHO_T}yes" >&6 echo "$as_me:10618: 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 10751 "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:10763: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10766: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:10769: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10772: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then if test "$cross_compiling" = yes; then cf_test_ncuconfig=maybe else cat >"conftest.$ac_ext" <<_ACEOF #line 10778 "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:10785: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10788: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:10790: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10793: \$? = $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 10967 "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:10979: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10982: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:10985: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10988: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then if test "$cross_compiling" = yes; then cf_have_ncuconfig=maybe else cat >"conftest.$ac_ext" <<_ACEOF #line 10994 "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:11001: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:11004: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:11006: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11009: \$? = $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:11026: 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:11042: 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 11060 "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:11075: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11078: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11081: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11084: \$? = $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:11100: 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:11135: 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:11151: 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:11166: 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:11174: result: $NCURSES_CONFIG" >&5 echo "${ECHO_T}$NCURSES_CONFIG" >&6 else echo "$as_me:11177: 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:11190: 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:11205: 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:11213: result: $ac_ct_NCURSES_CONFIG" >&5 echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6 else echo "$as_me:11216: 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:11373: 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 11385 "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:11397: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11400: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11403: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11406: \$? = $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:11417: 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:11421: 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:11431: 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 11437 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:11441: \"$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:11447: \$? = $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:11466: 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 11522 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:11534: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11537: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11540: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11543: \$? = $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}:11560: 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:11579: 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 11591 "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:11615: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11618: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11621: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11624: \$? = $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:11639: 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:11646: 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 11767 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:11779: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11782: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11785: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11788: \$? = $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}:11805: 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 11828 "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:11852: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11855: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11858: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11861: \$? = $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:11882: error: not found" >&5 echo "$as_me: error: not found" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:11887: 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 11923 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:11935: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11938: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11941: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11944: \$? = $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}:11961: 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:12009: 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 12027 "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:12042: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12045: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12048: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12051: \$? = $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:12067: 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:12105: 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:12131: \"$cf_try\"") >&5 (eval $cf_try) 2>&5 ac_status=$? echo "$as_me:12134: \$? = $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 12144 "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 make an error # endif #endif ${cf_cv_main_return:-return}(0); } _ACEOF rm -f "conftest$ac_exeext" if { (eval echo "$as_me:12171: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12174: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:12176: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12179: \$? = $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:12193: 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:12206: 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 12214 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char Gpm_Open (); int main (void) { Gpm_Open (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:12233: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12236: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12239: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12242: \$? = $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:12253: 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:12256: 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 12264 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char initscr (); int main (void) { initscr (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:12283: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12286: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12289: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12292: \$? = $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:12303: 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:12318: 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 12326 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char tgoto (); int main (void) { tgoto (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:12345: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12348: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12351: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12354: \$? = $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:12365: 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:12414: 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 12420 "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:12451: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12454: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12457: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12460: \$? = $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:12470: 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:12477: 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 12481 "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:12493: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12496: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12499: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12502: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:12504: 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:12511: 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:12579: 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 12583 "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:12595: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12598: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12601: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12604: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:12606: 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:12613: 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:12628: 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:12636: 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 12646 "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:12658: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12661: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12664: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12667: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:12669: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 echo "$as_me:12674: 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 12798 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:12802: \"$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:12808: \$? = $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 12841 "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:12853: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12856: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12859: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12862: \$? = $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:12900: 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:12910: 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:12937: 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 12941 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:12953: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12956: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12959: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12962: \$? = $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:12972: 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 12978 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:12990: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12993: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12996: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12999: \$? = $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:13009: result: yes" >&5 echo "${ECHO_T}yes" >&6 X_LIBS="$X_LIBS -R $x_libraries" else echo "$as_me:13013: 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 13033 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XOpenDisplay (); int main (void) { XOpenDisplay (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:13052: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13055: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13058: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13061: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then : else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 echo "$as_me:13067: 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 13075 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dnet_ntoa (); int main (void) { dnet_ntoa (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:13094: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13097: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13100: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13103: \$? = $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:13114: 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:13121: 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 13129 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dnet_ntoa (); int main (void) { dnet_ntoa (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:13148: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13151: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13154: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13157: \$? = $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:13168: 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:13187: 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 13193 "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: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_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:13243: 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:13247: 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 13255 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname (); int main (void) { gethostbyname (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:13274: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13277: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13280: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13283: \$? = $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:13294: 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:13301: 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 13309 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname (); int main (void) { gethostbyname (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:13328: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13331: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13334: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13337: \$? = $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:13348: 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:13364: 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 13370 "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:13401: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13404: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13407: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13410: \$? = $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:13420: 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:13424: 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 13432 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char connect (); int main (void) { connect (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:13451: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13454: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13457: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13460: \$? = $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:13471: 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:13480: 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 13486 "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:13517: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13520: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13523: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13526: \$? = $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:13536: 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:13540: 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 13548 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char remove (); int main (void) { remove (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:13567: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13570: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13573: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13576: \$? = $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:13587: 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:13596: 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 13602 "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:13633: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13636: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13639: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13642: \$? = $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:13652: 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:13656: 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 13664 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shmat (); int main (void) { shmat (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:13683: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13686: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13689: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13692: \$? = $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:13703: 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:13721: 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 13729 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char IceConnectionNumber (); int main (void) { IceConnectionNumber (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:13748: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13751: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13754: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13757: \$? = $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:13768: 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:13780: 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:13791: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:13794: result: no" >&5 echo "${ECHO_T}no" >&6 fi echo "$as_me:13798: 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:13809: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:13812: result: no" >&5 echo "${ECHO_T}no" >&6 fi echo "$as_me:13816: 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:13827: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:13830: result: no" >&5 echo "${ECHO_T}no" >&6 fi echo "$as_me:13834: 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:13845: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:13848: 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}:13868: 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}:13874: 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}:13878: 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}:14009: testing ..trimmed $LIBS ..." 1>&5 ;; esac done echo "$as_me:14015: 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 14022 "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:14040: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:14043: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:14046: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14049: \$? = $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:14059: 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}:14071: 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}:14079: 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}:14085: 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}:14089: 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}:14209: 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}:14214: testing ...after $LIBS ..." 1>&5 else cf_pkgconfig_incs= cf_pkgconfig_libs= test -n "$verbose" && echo " ...before $LIBS" 1>&6 echo "${as_me:-configure}:14222: 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}:14227: 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}:14238: 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}:14263: 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}:14269: 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}:14273: 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:14394: 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 14402 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XextCreateExtension (); int main (void) { XextCreateExtension (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:14421: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:14424: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:14427: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14430: \$? = $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:14441: 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}:14477: 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}:14483: 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}:14487: 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:14607: 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}:14614: 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}:14620: 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}:14624: 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:14744: 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}:14751: 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}:14757: 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}:14761: 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:14881: 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}:14888: 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}:14894: 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}:14898: 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:15018: 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}:15031: 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}:15037: 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}:15041: 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:15162: 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 15169 "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:15189: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:15192: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:15195: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15198: \$? = $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:15208: 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}:15214: 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}:15221: 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}:15227: 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}:15231: 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}:15354: 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}:15359: testing ...after $LIBS ..." 1>&5 fi fi ;; esac echo "$as_me:15367: 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 15374 "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:15390: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:15393: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:15396: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15399: \$? = $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:15409: 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}:15423: 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}:15428: 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}:15434: 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}:15438: 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}:15557: 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}:15563: 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}:15567: 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}:15696: 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}:15701: 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}:15721: 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}:15806: 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}:15816: 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}:15826: 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 15835 "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:15847: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:15850: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:15853: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15856: \$? = $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}:15864: 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}:15869: 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:15877: 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 15883 "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:15914: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:15917: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:15920: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15923: \$? = $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:15933: 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:15939: 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 15947 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XOpenDisplay (); int main (void) { XOpenDisplay (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:15966: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:15969: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:15972: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15975: \$? = $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:15986: 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:16010: 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 16016 "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:16047: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16050: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16053: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16056: \$? = $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:16066: 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:16072: 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 16080 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XtAppInitialize (); int main (void) { XtAppInitialize (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:16099: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16102: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16105: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16108: \$? = $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:16119: 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:16136: 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:16177: 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:16180: checking for $cf_test" >&5 echo $ECHO_N "checking for $cf_test... $ECHO_C" >&6 fi cat >"conftest.$ac_ext" <<_ACEOF #line 16184 "configure" #include "confdefs.h" #include #include <$cf_test> int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:16198: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:16201: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:16204: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16207: \$? = $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:16216: 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:16232: 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:16297: 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 16300 "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:16317: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16320: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16323: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16326: \$? = $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:16335: 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:16352: 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:16401: 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:16409: result: $XCURSES_CONFIG" >&5 echo "${ECHO_T}$XCURSES_CONFIG" >&6 else echo "$as_me:16412: 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:16425: 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:16440: 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:16448: result: $ac_ct_XCURSES_CONFIG" >&5 echo "${ECHO_T}$ac_ct_XCURSES_CONFIG" >&6 else echo "$as_me:16451: 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}:16586: 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}:16671: 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}:16681: 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}:16691: 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 16700 "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:16712: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16715: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16718: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16721: \$? = $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}:16729: 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}:16734: 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:16742: 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 16750 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XOpenDisplay (); int main (void) { XOpenDisplay (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:16769: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16772: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16775: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16778: \$? = $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:16789: 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:16811: 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 16834 "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:16849: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16852: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16855: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16858: \$? = $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:16869: 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:16884: 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 16890 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:16894: \"$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:16900: \$? = $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:16919: 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:16930: error: Cannot link with XCurses" >&5 echo "$as_me: error: Cannot link with XCurses" >&2;} { (exit 1); exit 1; }; } fi ;; (*) { { echo "$as_me:16937: error: unexpected screen-value: $cf_cv_screen" >&5 echo "$as_me: error: unexpected screen-value: $cf_cv_screen" >&2;} { (exit 1); exit 1; }; } ;; esac : ${cf_nculib_root:=$cf_cv_screen} as_ac_Lib=`echo "ac_cv_lib_$cf_nculib_root''__nc_init_pthreads" | $as_tr_sh` echo "$as_me:16945: checking for _nc_init_pthreads in -l$cf_nculib_root" >&5 echo $ECHO_N "checking for _nc_init_pthreads in -l$cf_nculib_root... $ECHO_C" >&6 if eval "test \"\${$as_ac_Lib+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$cf_nculib_root $LIBS" cat >"conftest.$ac_ext" <<_ACEOF #line 16953 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char _nc_init_pthreads (); int main (void) { _nc_init_pthreads (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:16972: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16975: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16978: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16981: \$? = $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:16992: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5 echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6 if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then cf_cv_ncurses_pthreads=yes else cf_cv_ncurses_pthreads=no fi if test "$cf_cv_ncurses_pthreads" = yes then cf_add_libs="$LIBS" # reverse order cf_add_0lib= for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done # filter duplicates for cf_add_1lib in $cf_add_0lib; do for cf_add_2lib in $cf_add_libs; do if test "x$cf_add_1lib" = "x$cf_add_2lib"; then cf_add_1lib= break fi done test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" done LIBS="$cf_add_libs" fi case $cf_cv_screen in (ncurses*) cf_cv_libtype=`echo "$cf_cv_screen" | sed -e 's/^ncurses//'` ;; esac echo "$as_me:17027: checking for X11 rgb file" >&5 echo $ECHO_N "checking for X11 rgb file... $ECHO_C" >&6 # Check whether --with-x11-rgb or --without-x11-rgb was given. if test "${with_x11_rgb+set}" = set; then withval="$with_x11_rgb" RGB_PATH=$withval else RGB_PATH=auto fi; if test "x$RGB_PATH" = xauto then RGB_PATH='${exec_prefix}/lib/X11/rgb.txt' for cf_path in \ /opt/local/share/X11/rgb.txt \ /opt/X11/share/X11/rgb.txt \ /usr/share/X11/rgb.txt \ /usr/X11/share/X11/rgb.txt \ /usr/X11/lib/X11/rgb.txt \ /usr/lib/X11/rgb.txt \ /etc/X11/rgb.txt \ /usr/pkg/lib/X11/rgb.txt \ /usr/X11R7/lib/X11/rgb.txt \ /usr/X11R6/lib/X11/rgb.txt \ /usr/X11R5/lib/X11/rgb.txt \ /usr/X11R4/lib/X11/rgb.txt \ /usr/local/lib/X11/rgb.txt \ /usr/local/share/X11/rgb.txt \ /usr/lib64/X11/rgb.txt do if test -f "$cf_path" ; then RGB_PATH="$cf_path" break fi done else cf_path=$RGB_PATH if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$cf_path" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval cf_path="$cf_path" case ".$cf_path" in (.NONE/*) cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:17091: 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:17099: 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:17160: result: $FORM_NAME" >&5 echo "${ECHO_T}$FORM_NAME" >&6 echo "$as_me:17163: 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:17183: result: $MENU_NAME" >&5 echo "${ECHO_T}$MENU_NAME" >&6 echo "$as_me:17186: 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:17206: result: $PANEL_NAME" >&5 echo "${ECHO_T}$PANEL_NAME" >&6 echo "$as_me:17209: 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:17226: 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:17237: 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:17240: result: yes" >&5 echo "${ECHO_T}yes" >&6 echo "$as_me:17243: 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 17393 "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:17405: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17408: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:17411: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17414: \$? = $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 17420 "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:17427: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17430: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:17432: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17435: \$? = $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:17452: 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 17481 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char new_panel (); int main (void) { new_panel (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:17500: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17503: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:17506: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17509: \$? = $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:17520: 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:17570: 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:17579: 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 17586 "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:17604: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17607: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:17610: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17613: \$? = $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:17625: 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:17642: 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:17645: result: yes" >&5 echo "${ECHO_T}yes" >&6 echo "$as_me:17648: 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 17798 "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:17810: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17813: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:17816: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17819: \$? = $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 17825 "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:17832: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17835: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:17837: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17840: \$? = $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:17857: 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 17886 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char menu_driver (); int main (void) { menu_driver (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:17905: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17908: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:17911: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17914: \$? = $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:17925: 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:17975: 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:17984: 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 17991 "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:18010: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:18013: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:18016: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18019: \$? = $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:18031: 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:18048: 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:18051: result: yes" >&5 echo "${ECHO_T}yes" >&6 echo "$as_me:18054: 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 18204 "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:18216: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18219: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:18222: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18225: \$? = $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 18231 "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:18238: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18241: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:18243: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18246: \$? = $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:18263: 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 18292 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char form_driver (); int main (void) { form_driver (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:18311: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18314: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:18317: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18320: \$? = $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:18331: 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 18375 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:18379: \"$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:18385: \$? = $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:18404: 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 18420 "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:18436: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:18439: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:18442: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18445: \$? = $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:18455: result: $ac_cv_header_time" >&5 echo "${ECHO_T}$ac_cv_header_time" >&6 if test $ac_cv_header_time = yes; then cat >>confdefs.h <<\EOF #define TIME_WITH_SYS_TIME 1 EOF fi for ac_header in \ getopt.h \ locale.h \ math.h \ stdarg.h \ sys/ioctl.h \ sys/select.h \ sys/time.h \ termios.h \ unistd.h \ do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:18478: 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 18484 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:18488: \"$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:18494: \$? = $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:18513: 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 18532 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:18536: \"$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:18542: \$? = $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:18561: 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 18581 "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:18594: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:18597: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:18600: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18603: \$? = $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:18615: 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:18632: checking for clock_gettime" >&5 echo $ECHO_N "checking for clock_gettime... $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 18639 "configure" #include "confdefs.h" #include int main (void) { struct timespec ts; int rc = clock_gettime(CLOCK_REALTIME, &ts); (void) rc; (void)ts ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:18652: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18655: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:18658: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18661: \$? = $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:18672: result: $cf_cv_func_clock_gettime" >&5 echo "${ECHO_T}$cf_cv_func_clock_gettime" >&6 if test "$cf_cv_func_clock_gettime" = yes then cat >>confdefs.h <<\EOF #define HAVE_CLOCK_GETTIME 1 EOF else echo "$as_me:18683: 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 18689 "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:18720: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18723: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:18726: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18729: \$? = $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:18739: 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:18749: 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 18757 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gettimeofday (); int main (void) { gettimeofday (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:18776: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18779: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:18782: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18785: \$? = $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:18796: 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 \ cfmakeraw \ getopt \ snprintf \ strdup \ strstr \ tsearch \ do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:18835: 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 18841 "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:18872: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18875: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:18878: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18881: \$? = $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:18891: 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 18909 "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:18930: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:18933: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:18936: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18939: \$? = $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:18949: 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:18959: 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 18966 "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:18987: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:18990: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:18993: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18996: \$? = $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:19006: 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:19016: 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:19035: 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 19041 "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:19072: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19075: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19078: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19081: \$? = $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:19091: 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 19111 "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) make an error #endif #endif #ifdef NCURSES_WIDECHAR make an error /* prefer to fall-through on the second checks */ #endif cchar_t check; int check2 = curs_set((int)sizeof(check)); long x = winnstr(stdscr, "", 0); int x1, y1; (void)check2; getbegyx(stdscr, y1, x1); (void)x; (void)y1; (void)x1; ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:19143: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19146: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19149: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19152: \$? = $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 19162 "configure" #include "confdefs.h" #define $cf_try_xopen_extension 1 $ac_includes_default #include <${cf_cv_ncurses_header:-curses.h}> int main (void) { cchar_t check; int check2 = curs_set((int)sizeof(check)); long x = winnstr(stdscr, "", 0); int x1, y1; getbegyx(stdscr, y1, x1); (void)check2; (void)x; (void)y1; (void)x1; ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:19187: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19190: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19193: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19196: \$? = $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:19210: 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:19222: 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 19243 "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:19257: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:19260: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:19263: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19266: \$? = $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 19285 "configure" #include "confdefs.h" #include <${cf_cv_ncurses_header:-curses.h}> #ifdef NCURSES_VERSION #include <${cf_header}> #else make an error #endif int main (void) { WINDOW *x; (void)x ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:19303: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:19306: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:19309: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19312: \$? = $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:19327: 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:19354: 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 19375 "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:19389: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:19392: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:19395: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19398: \$? = $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:19411: result: $cf_cv_unctrl_header" >&5 echo "${ECHO_T}$cf_cv_unctrl_header" >&6 case "$cf_cv_unctrl_header" in (no) { echo "$as_me:19416: 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:19514: checking for ${cf_func}" >&5 echo $ECHO_N "checking for ${cf_func}... $ECHO_C" >&6 echo "${as_me:-configure}:19517: 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 19526 "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:19559: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19562: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19565: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19568: \$? = $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:19584: 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}:19602: 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 19611 "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:19644: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19647: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19650: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19653: \$? = $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:19669: result: $cf_result" >&5 echo "${ECHO_T}$cf_result" >&6 if test "$cf_result" != no; then cat >>confdefs.h <"conftest.$ac_ext" <<_ACEOF #line 19693 "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: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 test -n "$verbose" && echo " prototype $cf_ret func($cf_arg value)" 1>&6 echo "${as_me:-configure}:19727: 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:19747: 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 19754 "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:19769: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:19772: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:19775: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19778: \$? = $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 19786 "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:19811: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19814: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19817: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19820: \$? = $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:19834: 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:19848: 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 19852 "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:19865: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:19868: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:19871: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19874: \$? = $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 19883 "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:19896: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:19899: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:19902: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19905: \$? = $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:19916: 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:19925: 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 19932 "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:19949: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19952: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19955: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19958: \$? = $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:19969: 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:19990: 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 19997 "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:20015: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20018: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20021: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20024: \$? = $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:20035: 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:20042: 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 20049 "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:20069: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20072: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20075: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20078: \$? = $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:20090: 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:20099: 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 20107 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char openpty (); int main (void) { openpty (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:20126: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20129: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20132: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20135: \$? = $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:20146: 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:20154: 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 20181 "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:20199: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20202: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20205: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20208: \$? = $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:20226: 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:20260: 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 20270 "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:20286: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20289: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:20291: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20294: \$? = $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:20309: 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:20316: 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 20326 "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:20342: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20345: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20348: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20351: \$? = $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:20362: 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 20382 "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:20398: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20401: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20404: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20407: \$? = $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:20418: 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 20436 "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:20453: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20456: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20459: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20462: \$? = $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 20472 "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:20488: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20491: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20494: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20497: \$? = $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:20508: 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:20518: 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 20521 "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:20539: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20542: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20545: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20548: \$? = $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:20557: 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 20585 "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:20603: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20606: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20609: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20612: \$? = $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 20619 "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:20638: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20641: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20644: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20647: \$? = $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:20659: 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:20682: 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 20689 "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:20707: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20710: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20713: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20716: \$? = $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 20723 "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:20742: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20745: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20748: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20751: \$? = $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:20763: 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:20786: 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 20793 "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:20811: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20814: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20817: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20820: \$? = $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 20827 "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:20846: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20849: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20852: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20855: \$? = $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:20867: 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:20891: 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 20894 "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:20912: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20915: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20918: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20921: \$? = $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:20930: 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 20955 "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:20973: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20976: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20979: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20982: \$? = $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:20991: 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 21016 "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:21034: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:21037: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:21040: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21043: \$? = $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:21052: 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 21085 "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:21118: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:21121: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:21124: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21127: \$? = $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:21137: 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 21156 "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:21195: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21198: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21201: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21204: \$? = $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 21216 "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:21248: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21251: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:21253: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21256: \$? = $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:21268: 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 21389 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:21393: \"$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:21399: \$? = $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 21432 "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:21444: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21447: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21450: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21453: \$? = $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:21491: 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:21501: 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:21528: 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 21532 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:21544: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21547: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21550: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21553: \$? = $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:21563: 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 21569 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:21581: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21584: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21587: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21590: \$? = $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:21600: result: yes" >&5 echo "${ECHO_T}yes" >&6 X_LIBS="$X_LIBS -R $x_libraries" else echo "$as_me:21604: 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 21624 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XOpenDisplay (); int main (void) { XOpenDisplay (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:21643: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21646: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21649: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21652: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then : else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 echo "$as_me:21658: 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 21666 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dnet_ntoa (); int main (void) { dnet_ntoa (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:21685: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21688: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21691: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21694: \$? = $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:21705: 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:21712: 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 21720 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dnet_ntoa (); int main (void) { dnet_ntoa (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:21739: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21742: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21745: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21748: \$? = $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:21759: 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:21778: 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 21784 "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:21815: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21818: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21821: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21824: \$? = $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:21834: 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:21838: 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 21846 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname (); int main (void) { gethostbyname (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:21865: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21868: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21871: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21874: \$? = $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:21885: 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:21892: 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 21900 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname (); int main (void) { gethostbyname (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:21919: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21922: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21925: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21928: \$? = $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:21939: 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:21955: 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 21961 "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:21992: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21995: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21998: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22001: \$? = $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:22011: 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:22015: 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 22023 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char connect (); int main (void) { connect (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:22042: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22045: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22048: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22051: \$? = $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:22062: 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:22071: 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 22077 "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:22108: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22111: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22114: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22117: \$? = $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:22127: 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:22131: 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 22139 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char remove (); int main (void) { remove (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:22158: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22161: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22164: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22167: \$? = $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:22178: 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:22187: 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 22193 "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:22224: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22227: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22230: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22233: \$? = $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:22243: 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:22247: 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 22255 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shmat (); int main (void) { shmat (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:22274: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22277: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22280: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22283: \$? = $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:22294: 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:22312: 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 22320 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char IceConnectionNumber (); int main (void) { IceConnectionNumber (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:22339: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22342: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22345: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22348: \$? = $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:22359: 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}:22406: testing repairing CFLAGS: $CFLAGS ..." 1>&5 CFLAGS="$cf_temp_flags" test -n "$verbose" && echo " ... fixed $CFLAGS" 1>&6 echo "${as_me:-configure}:22411: testing ... fixed $CFLAGS ..." 1>&5 test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 echo "${as_me:-configure}:22415: 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}:22454: testing repairing CPPFLAGS: $CPPFLAGS ..." 1>&5 CPPFLAGS="$cf_temp_flags" test -n "$verbose" && echo " ... fixed $CPPFLAGS" 1>&6 echo "${as_me:-configure}:22459: testing ... fixed $CPPFLAGS ..." 1>&5 test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 echo "${as_me:-configure}:22463: 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}:22502: testing repairing LDFLAGS: $LDFLAGS ..." 1>&5 LDFLAGS="$cf_temp_flags" test -n "$verbose" && echo " ... fixed $LDFLAGS" 1>&6 echo "${as_me:-configure}:22507: testing ... fixed $LDFLAGS ..." 1>&5 test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 echo "${as_me:-configure}:22511: testing ... extra $EXTRA_CFLAGS ..." 1>&5 fi ;; esac fi echo "$as_me:22518: 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:22535: 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:22614: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:22616: 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 22694 "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:22709: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:22712: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:22715: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22718: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:22721: 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 22728 "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:22746: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:22749: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:22752: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22755: \$? = $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:22770: 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:22831: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:22834: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:22836: 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:22844: 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:22867: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:22870: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:22872: 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}:22880: 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}:22890: 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:22907: 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:23043: 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 23049 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:23053: \"$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:23059: \$? = $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:23078: 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:23082: 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 23090 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dmalloc_debug (); int main (void) { dmalloc_debug (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:23109: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23112: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23115: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23118: \$? = $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:23129: 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:23280: 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 23286 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:23290: \"$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:23296: \$? = $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:23315: 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:23319: 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 23327 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char debug_malloc (); int main (void) { debug_malloc (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:23346: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23349: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23352: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23355: \$? = $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:23366: 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:23516: 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:23527: 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:23545: 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:23576: result: $LD_RPATH_OPT" >&5 echo "${ECHO_T}$LD_RPATH_OPT" >&6 case "x$LD_RPATH_OPT" in (x-R*) echo "$as_me:23581: 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 23602 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:23614: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23617: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23620: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23623: \$? = $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:23633: 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:23640: 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:23658: result: $cf_disable_rpath_hack" >&5 echo "${ECHO_T}$cf_disable_rpath_hack" >&6 if test "$enable_rpath_hack" = yes ; then echo "$as_me:23663: 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:23666: 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:23673: 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:23688: 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:23696: result: $cf_ldd_prog" >&5 echo "${ECHO_T}$cf_ldd_prog" >&6 else echo "$as_me:23699: 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 23713 "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:23725: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23728: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23731: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23734: \$? = $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}:23762: 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}:23774: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5 test -n "$verbose" && echo " ...checking LDFLAGS $LDFLAGS" 1>&6 echo "${as_me:-configure}:23778: 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}:23815: 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}:23828: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5 test -n "$verbose" && echo " ...checking LIBS $LIBS" 1>&6 echo "${as_me:-configure}:23832: 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}:23869: 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}:23882: testing ...checked LIBS $LIBS ..." 1>&5 test -n "$verbose" && echo " ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6 echo "${as_me:-configure}:23886: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5 else echo "$as_me:23889: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi TEST_ARGS="$LIBS" LIBS= ac_config_files="$ac_config_files Makefile" ac_config_commands="$ac_config_commands default" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overriden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if cmp -s $cache_file confcache; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi DEFS=-DHAVE_CONFIG_H : "${CONFIG_STATUS=./config.status}" ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:23979: 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:24160: 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:24179: 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.20230903, 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:24229: 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,@SET_MAKE@,$SET_MAKE,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t s,@CPP@,$CPP,;t t s,@GREP@,$GREP,;t t s,@EGREP@,$EGREP,;t t s,@AWK@,$AWK,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@INSTALL_OPT_S@,$INSTALL_OPT_S,;t t s,@INSTALL_OPT_O@,$INSTALL_OPT_O,;t t s,@LINT@,$LINT,;t t s,@LINT_OPTS@,$LINT_OPTS,;t t s,@LINT_LIBS@,$LINT_LIBS,;t t s,@MAKE_NO_PHONY@,$MAKE_NO_PHONY,;t t s,@MAKE_PHONY@,$MAKE_PHONY,;t t s,@CTAGS@,$CTAGS,;t t s,@ETAGS@,$ETAGS,;t t s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t s,@MATH_LIB@,$MATH_LIB,;t t s,@top_builddir@,$top_builddir,;t t s,@CC_G_OPT@,$CC_G_OPT,;t t s,@CC_SHARED_OPTS@,$CC_SHARED_OPTS,;t t s,@DFT_DEP_SUFFIX@,$DFT_DEP_SUFFIX,;t t s,@DFT_OBJ_SUBDIR@,$DFT_OBJ_SUBDIR,;t t s,@DFT_UPR_MODEL@,$DFT_UPR_MODEL,;t t s,@LD@,$LD,;t t s,@LDFLAGS_SHARED@,$LDFLAGS_SHARED,;t t s,@LDFLAGS_STATIC@,$LDFLAGS_STATIC,;t t s,@LD_MODEL@,$LD_MODEL,;t t s,@LD_SHARED_OPTS@,$LD_SHARED_OPTS,;t t s,@LIBTOOL@,$LIBTOOL,;t t s,@LIBTOOL_OPTS@,$LIBTOOL_OPTS,;t t s,@LIB_CLEAN@,$LIB_CLEAN,;t t s,@LIB_COMPILE@,$LIB_COMPILE,;t t s,@LIB_LINK@,$LIB_LINK,;t t s,@LINK_TESTS@,$LINK_TESTS,;t t s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t s,@PACKAGE@,$PACKAGE,;t t s,@PTHREAD@,$PTHREAD,;t t s,@TEST_ARGS@,$TEST_ARGS,;t t s,@TEST_DEPS@,$TEST_DEPS,;t t s,@TEST_LIBS@,$TEST_LIBS,;t t s,@TINFO_LDFLAGS@,$TINFO_LDFLAGS,;t t s,@TINFO_LIBS@,$TINFO_LIBS,;t t s,@cf_cv_abi_version@,$cf_cv_abi_version,;t t s,@cf_cv_rel_version@,$cf_cv_rel_version,;t t s,@includesubdir@,$includesubdir,;t t s,@FGREP@,$FGREP,;t t s,@HAVE_STDNORETURN_H@,$HAVE_STDNORETURN_H,;t t s,@STDC_NORETURN@,$STDC_NORETURN,;t t s,@PKG_CONFIG@,$PKG_CONFIG,;t t s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t s,@ECHO_LT@,$ECHO_LT,;t t s,@ECHO_LD@,$ECHO_LD,;t t s,@RULE_CC@,$RULE_CC,;t t s,@SHOW_CC@,$SHOW_CC,;t t s,@ECHO_CC@,$ECHO_CC,;t t s,@NCURSES_WRAP_PREFIX@,$NCURSES_WRAP_PREFIX,;t t s,@NCURSES_CONFIG@,$NCURSES_CONFIG,;t t s,@ac_ct_NCURSES_CONFIG@,$ac_ct_NCURSES_CONFIG,;t t s,@X_CFLAGS@,$X_CFLAGS,;t t s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t s,@X_LIBS@,$X_LIBS,;t t s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t s,@XCURSES_CONFIG@,$XCURSES_CONFIG,;t t s,@ac_ct_XCURSES_CONFIG@,$ac_ct_XCURSES_CONFIG,;t t s,@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' && cat "$tmp"/subs.frag) >"$tmp"/subs-$ac_sed_frag.sed # It is possible to make a multiline substitution using escaped newlines. # Ensure that we do not split the substitution between script fragments. ac_BEG=$ac_end ac_END=`expr "$ac_end" + "$ac_max_sed_lines"` sed "1,${ac_BEG}d; ${ac_END}p; q" "$tmp"/subs.sed >"$tmp"/subs.next if test -s "$tmp"/subs.next; then grep '^s,@[^@,][^@,]*@,.*\\$' "$tmp"/subs.next >"$tmp"/subs.edit if test ! -s "$tmp"/subs.edit; then grep "^s,@[^@,][^@,]*@,.*,;t t$" "$tmp"/subs.next >"$tmp"/subs.edit if test ! -s "$tmp"/subs.edit; then if test "$ac_beg" -gt 1; then ac_end=`expr "$ac_end" - 1` continue fi fi fi fi if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f \"$tmp\"/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f \"$tmp\"/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr "$ac_sed_frag" + 1` ac_beg=$ac_end ac_end=`expr "$ac_end" + "$ac_max_sed_lines"` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds="cat" fi fi # test -n "$CONFIG_FILES" EOF cat >>"$CONFIG_STATUS" <<\EOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in - | *:- | *:-:* ) # input from stdin cat >"$tmp"/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then { case "$ac_dir" in [\\/]* | ?:[\\/]* ) as_incr_dir=;; *) as_incr_dir=.;; esac as_dummy="$ac_dir" for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do case $as_mkdir_dir in # Skip DOS drivespec ?:) as_incr_dir=$as_mkdir_dir ;; *) as_incr_dir=$as_incr_dir/$as_mkdir_dir test -d "$as_incr_dir" || mkdir "$as_incr_dir" ;; esac done; } ac_dir_suffix="/`echo "$ac_dir"|sed 's,^\./,,'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'` else ac_dir_suffix= ac_dots= fi case "$srcdir" in .) ac_srcdir=. if test -z "$ac_dots"; then ac_top_srcdir=. else ac_top_srcdir=`echo "$ac_dots" | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) ac_srcdir="$srcdir$ac_dir_suffix"; ac_top_srcdir="$srcdir" ;; *) # Relative path. ac_srcdir="$ac_dots$srcdir$ac_dir_suffix" ac_top_srcdir="$ac_dots$srcdir" ;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_dots$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:24537: 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:24555: 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:24568: 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:24584: 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:24593: 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:24638: 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:24649: 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:24698: 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:24709: 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:24722: 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:24780: $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 ncurses-6.4-20240113/test/demo_menus.c0000644000000000000000000005510614434462126015730 0ustar rootroot/**************************************************************************** * Copyright 2019-2022,2023 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.80 2023/05/27 20:13:10 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(MENU * m) { return wGetchar(menu_win(m)); } static int menu_offset(MenuNo number) { int result = 0; if (okMenuNo(number)) { int spc_rows; #ifdef NCURSES_VERSION int spc_desc, spc_cols; menu_spacing(mpBanner, &spc_desc, &spc_rows, &spc_cols); #else spc_rows = 0; #endif /* FIXME: MENU.itemlen seems the only way to get actual width of items */ result = (number - (eBanner + 1)) * (menu_itemwidth(mpBanner) + spc_rows); } return result; } static void my_menu_init(MENU * menu) { Trace(("called MenuHook my_menu_init")); mvwprintw(status, 2, 0, "menu_init %p", (void *) menu); wclrtoeol(status); wrefresh(status); } static void my_menu_term(MENU * menu) { Trace(("called MenuHook my_menu_term")); mvwprintw(status, 2, 0, "menu_term %p", (void *) menu); wclrtoeol(status); wrefresh(status); } static void my_item_init(MENU * menu) { ITEM *item = current_item(menu); const char *name = item_name(item); Trace(("called MenuHook my_item_init (%s)", name)); mvwprintw(status, 2, 0, "item_init %s", name); wclrtoeol(status); wrefresh(status); } static void my_item_term(MENU * menu) { ITEM *item = current_item(menu); const char *name = item_name(item); Trace(("called MenuHook my_item_term (%s)", name)); mvwprintw(status, 2, 0, "item_term %s", name); wclrtoeol(status); wrefresh(status); } static MENU * menu_create(ITEM ** items, int count, int ncols, MenuNo number) { MENU *result; WINDOW *menuwin; int mrows, mcols; int y = okMenuNo(number) ? MENU_Y : 0; int x = menu_offset(number); int margin = (y == MENU_Y) ? 1 : 0; int maxcol = (ncols + x) < COLS ? ncols : (COLS - x - 1); int maxrow = (count + 1) / ncols; if ((maxrow + y) >= (LINES - 4)) maxrow = LINES - 4 - y; result = new_menu(items); if (has_colors()) { set_menu_fore(result, (chtype) COLOR_PAIR(1)); set_menu_back(result, (chtype) COLOR_PAIR(2)); } set_menu_format(result, maxrow, maxcol); scale_menu(result, &mrows, &mcols); if (mcols + (2 * margin + x) >= COLS) mcols = COLS - (2 * margin + x); menuwin = newwin(mrows + (2 * margin), mcols + (2 * margin), y, x); set_menu_win(result, menuwin); keypad(menuwin, TRUE); if (margin) box(menuwin, 0, 0); set_menu_sub(result, derwin(menuwin, mrows, mcols, margin, margin)); #ifdef TRACE if (number == eTrace) menu_opts_off(result, O_ONEVALUE); else menu_opts_on(result, O_ONEVALUE); #endif #if defined(NCURSES_MOUSE_VERSION) && defined(O_MOUSE_MENU) menu_opts_on(result, O_MOUSE_MENU); #endif post_menu(result); set_menu_init(result, my_menu_init); set_menu_term(result, my_menu_term); set_item_init(result, my_item_init); set_item_term(result, my_item_term); return result; } static void menu_destroy(MENU * m, int itemsToo) { Trace(("menu_destroy %p", (void *) m)); if (m != 0) { ITEM **items = menu_items(m); const char *blob = 0; int count; count = item_count(m); Trace(("menu_destroy %p count %d", (void *) m, count)); if ((count > 0) && (m == mpSelect)) { blob = item_name(*items); } unpost_menu(m); free_menu(m); /* free the extra data allocated in build_select_menu() */ if ((count > 0) && (m == mpSelect)) { if (blob && loaded_file) { Trace(("freeing blob %p", blob)); free((void *) blob); } } if (count > 0 && itemsToo) { if (itemsToo & 1) { ITEM **ip = items; if (ip != 0) { while (*ip) free_item(*ip++); } } if (itemsToo & 2) free(items); } } } /* force the given menu to appear */ static void menu_display(MENU * m) { touchwin(menu_win(m)); wrefresh(menu_win(m)); } /*****************************************************************************/ static void build_file_menu(MenuNo number) { static MENU_DATA table[] = { {"Exit", call_files, 0}, {(char *) 0, 0, 0} }; static ITEM *items[SIZEOF(table)]; ITEM **ip = items; int n; for (n = 0; table[n].name != 0; ++n) { *ip = new_item(table[n].name, empty); set_item_userptr(*ip, (void *) &table[n]); ++ip; } *ip = (ITEM *) 0; mpFile = menu_create(items, SIZEOF(table) - 1, 1, number); } static int perform_file_menu(int cmd) { return menu_driver(mpFile, cmd); } /*****************************************************************************/ static void call_select(int code) { (void) code; Trace(("Selected item %d", code)); } static void build_select_menu(MenuNo number, char *filename) { #define MY_DATA(name) { name, call_select, 0 } static MENU_DATA table[] = { MY_DATA("Lions"), MY_DATA("Tigers"), MY_DATA("Bears"), MY_DATA("(Oh my!)"), MY_DATA("Newts"), MY_DATA("Platypi"), MY_DATA("Lemurs"), MY_DATA("(Oh really?!)"), MY_DATA("Leopards"), MY_DATA("Panthers"), MY_DATA("Pumas"), MY_DATA("Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs"), MY_DATA("Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs, Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs"), {(char *) 0, 0, 0} }; static ITEM **items; ITEM **ip; MENU_DATA *ap = 0; MENU_DATA *myList = 0; int i; size_t count = 0; if (filename != 0) { struct stat sb; if (stat(filename, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFREG && sb.st_size != 0) { size_t size = (size_t) sb.st_size; char *blob = typeMalloc(char, size + 1); MENU_DATA *list = typeCalloc(MENU_DATA, size + 1); items = typeCalloc(ITEM *, size + 1); Trace(("build_select_menu blob=%p, items=%p", (void *) blob, (void *) items)); if (blob != 0 && list != 0) { FILE *fp = fopen(filename, "r"); if (fp != 0) { if (fread(blob, sizeof(char), size, fp) == size) { bool mark = TRUE; unsigned j, k; for (j = k = 0; j < size; ++j) { if (mark) { list[k++].name = blob + j; mark = FALSE; } if (blob[j] == '\n') { blob[j] = '\0'; if (k > 0 && *list[k - 1].name == '\0') --k; mark = TRUE; } else if (blob[j] == '\t') { blob[j] = ' '; /* menu items are printable */ } } list[k].name = 0; count = k; ap = myList = list; } fclose(fp); } loaded_file = TRUE; } if (ap == 0) free(items); } } if (ap == 0) { count = SIZEOF(table) - 1; items = typeCalloc(ITEM *, count + 1); ap = table; } ip = items; for (i = 0; ap[i].name != 0; ++i) { ap[i].func = call_select; ap[i].mask = (unsigned) i; *ip = new_item(ap[i].name, empty); set_item_userptr(*ip, (void *) &table[i]); ++ip; } *ip = 0; mpSelect = menu_create(items, (int) count, 1, number); if (myList != 0) free(myList); } static int perform_select_menu(int cmd) { return menu_driver(mpSelect, cmd); } /*****************************************************************************/ #ifdef TRACE static void call_trace(int code) { (void) code; Trace(("Updating trace mask %d", code)); } #define T_TBL(name) { #name, call_trace, name } static MENU_DATA t_tbl[] = { T_TBL(TRACE_DISABLE), T_TBL(TRACE_TIMES), T_TBL(TRACE_TPUTS), T_TBL(TRACE_UPDATE), T_TBL(TRACE_MOVE), T_TBL(TRACE_CHARPUT), T_TBL(TRACE_ORDINARY), T_TBL(TRACE_CALLS), T_TBL(TRACE_VIRTPUT), T_TBL(TRACE_IEVENT), T_TBL(TRACE_BITS), T_TBL(TRACE_ICALLS), T_TBL(TRACE_CCALLS), T_TBL(TRACE_DATABASE), T_TBL(TRACE_ATTRS), T_TBL(TRACE_MAXIMUM), { (char *) 0, 0, 0 } }; static void build_trace_menu(MenuNo number) { static ITEM *items[SIZEOF(t_tbl)]; ITEM **ip = items; int n; for (n = 0; t_tbl[n].name != 0; n++) { *ip = new_item(t_tbl[n].name, empty); set_item_userptr(*ip, (void *) &t_tbl[n]); ++ip; } *ip = (ITEM *) 0; mpTrace = menu_create(items, SIZEOF(t_tbl) - 1, 2, number); } static char * tracetrace(unsigned tlevel) { static char *buf; static size_t need = 12; int n; if (buf == 0) { for (n = 0; t_tbl[n].name != 0; n++) need += strlen(t_tbl[n].name) + 2; buf = typeMalloc(char, need); if (!buf) failed("tracetrace"); } _nc_SPRINTF(buf, _nc_SLIMIT(need) "0x%02x = {", tlevel); if (tlevel == 0) { _nc_STRCAT(buf, t_tbl[0].name ? t_tbl[0].name : "", need); _nc_STRCAT(buf, ", ", need); } else { for (n = 1; t_tbl[n].name != 0; n++) if ((tlevel & t_tbl[n].mask) == t_tbl[n].mask) { _nc_STRCAT(buf, t_tbl[n].name, need); _nc_STRCAT(buf, ", ", need); } } if (buf[strlen(buf) - 2] == ',') buf[strlen(buf) - 2] = '\0'; _nc_STRCAT(buf, "}", need); return buf; } /* fake a dynamically reconfigurable menu using the 0th entry to deselect * the others */ static bool update_trace_menu(MENU * m) { ITEM **items; ITEM *i; bool changed = FALSE; items = menu_items(m); i = current_item(m); if (i == items[0]) { if (item_value(i)) { ITEM **p; for (p = items + 1; *p != 0; p++) if (item_value(*p)) { set_item_value(*p, FALSE); changed = TRUE; } } } return changed; } static int perform_trace_menu(int cmd) /* interactively set the trace level */ { ITEM **ip; int result; for (ip = menu_items(mpTrace); *ip; ip++) { MENU_DATA *td = (MENU_DATA *) item_userptr(*ip); unsigned mask = td->mask; if (mask == 0) set_item_value(*ip, _nc_tracing == 0); else if ((mask & _nc_tracing) == mask) set_item_value(*ip, TRUE); } result = menu_driver(mpTrace, cmd); if (result == E_OK) { if (update_trace_menu(mpTrace) || cmd == REQ_TOGGLE_ITEM) { unsigned newtrace = 0; for (ip = menu_items(mpTrace); *ip; ip++) { if (item_value(*ip)) { MENU_DATA *td = (MENU_DATA *) item_userptr(*ip); newtrace |= td->mask; } } curses_trace(newtrace); Trace(("trace level interactively set to %s", tracetrace(_nc_tracing))); MvWPrintw(status, 1, 0, "Trace level is %s\n", tracetrace(_nc_tracing)); wrefresh(status); } } return result; } #endif /* TRACE */ /*****************************************************************************/ static int menu_number(void) { return item_index(current_item(mpBanner)) - (eBanner + 1); } static MENU * current_menu(void) { MENU *result; switch (menu_number()) { case eFile: result = mpFile; break; case eSelect: result = mpSelect; break; #ifdef TRACE case eTrace: result = mpTrace; break; #endif default: result = 0; break; } return result; } static void call_menus(int code) { (void) code; Trace(("Activated menu %d\n", code)); } static void build_menus(char *filename) { static MENU_DATA table[] = { {"File", call_menus, 0}, {"Select", call_menus, 1}, #ifdef TRACE {"Trace", call_menus, 2}, #endif {(char *) 0, 0, 0} }; static ITEM *items[SIZEOF(table)]; ITEM **ip = items; int n; for (n = 0; table[n].name != 0; ++n) { *ip = new_item(table[n].name, empty); set_item_userptr(*ip, (void *) &table[n]); ++ip; } *ip = (ITEM *) 0; mpBanner = menu_create(items, SIZEOF(table) - 1, SIZEOF(table) - 1, eBanner); set_menu_mark(mpBanner, ">"); build_file_menu(eFile); build_select_menu(eSelect, filename); #ifdef TRACE build_trace_menu(eTrace); #endif } static int move_menu(MENU * menu, MENU * current, int by_y, int by_x) { WINDOW *top_win = menu_win(menu); WINDOW *sub_win = menu_sub(menu); int y0, x0; int y1, x1; int result; getbegyx(top_win, y0, x0); y0 += by_y; x0 += by_x; getbegyx(sub_win, y1, x1); y1 += by_y; x1 += by_x; if ((result = mvwin(top_win, y0, x0)) != ERR) { #if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH < 20060218) sub_win->_begy = y1; sub_win->_begx = x1; #else mvwin(sub_win, y1, x1); #endif if (menu == current) { touchwin(top_win); wnoutrefresh(top_win); } } return result; } /* * Move the menus around on the screen, to test mvwin(). */ static void move_menus(MENU * current, int by_y, int by_x) { if (move_menu(mpBanner, current, by_y, by_x) != ERR) { erase(); wnoutrefresh(stdscr); move_menu(mpFile, current, by_y, by_x); move_menu(mpSelect, current, by_y, by_x); #ifdef TRACE move_menu(mpTrace, current, by_y, by_x); #endif doupdate(); } } #if defined(KEY_RESIZE) && NCURSES_EXT_FUNCS static void resize_menu(MENU ** menu) { #if 0 WINDOW *win = menu_win(*menu); WINDOW *sub = menu_sub(*menu); #endif (void) menu; } static void resize_menus(MENU * current) { (void) current; werase(status); wnoutrefresh(status); wresize(status, 1, COLS); mvwin(status, LINES - 1, 0); resize_menu(&mpBanner); resize_menu(&mpFile); resize_menu(&mpSelect); #ifdef TRACE resize_menu(&mpTrace); #endif } #endif /* defined(KEY_RESIZE) && NCURSES_EXT_FUNCS */ static void show_status(int ch, MENU * menu) { wmove(status, 0, 0); wprintw(status, "key %s, menu %d, mark %s, match %s", keyname(ch), menu_number(), menu_mark(menu), menu_pattern(menu)); wclrtoeol(status); wrefresh(status); } static void perform_menus(void) { MENU *this_menu; MENU *last_menu = mpFile; int code = E_UNKNOWN_COMMAND; int cmd; int ch = ERR; #ifdef NCURSES_MOUSE_VERSION mousemask(BUTTON1_CLICKED, (mmask_t *) 0); #endif menu_display(last_menu); for (;;) { if (ch != ERR) show_status(ch, last_menu); ch = menu_getc(mpBanner); /* * Provide for moving the menu around in the screen using shifted * cursor keys. */ switch (ch) { case KEY_SF: move_menus(last_menu, 1, 0); continue; case KEY_SR: move_menus(last_menu, -1, 0); continue; case KEY_SLEFT: move_menus(last_menu, 0, -1); continue; case KEY_SRIGHT: move_menus(last_menu, 0, 1); continue; #if defined(KEY_RESIZE) && NCURSES_EXT_FUNCS case KEY_RESIZE: resize_menus(last_menu); continue; #endif } cmd = menu_virtualize(ch); switch (cmd) { /* * The banner menu acts solely to select one of the other menus. * Move between its items, wrapping at the left/right limits. */ case REQ_LEFT_ITEM: case REQ_RIGHT_ITEM: code = menu_driver(mpBanner, cmd); if (code == E_REQUEST_DENIED) { if (menu_number() > 0) code = menu_driver(mpBanner, REQ_FIRST_ITEM); else code = menu_driver(mpBanner, REQ_LAST_ITEM); } break; default: switch (menu_number()) { case eFile: code = perform_file_menu(cmd); break; case eSelect: code = perform_select_menu(cmd); break; #ifdef TRACE case eTrace: code = perform_trace_menu(cmd); break; #endif } #if defined(NCURSES_MOUSE_VERSION) && defined(O_MOUSE_MENU) if ((code == E_REQUEST_DENIED) && (cmd == KEY_MOUSE)) { (void) menu_getc(mpBanner); code = menu_driver(mpBanner, cmd); if (code == E_REQUEST_DENIED) { MEVENT event; if (menu_getc(mpBanner) == KEY_MOUSE) getmouse(&event); /* give up */ } } #endif break; } if (code == E_OK) { this_menu = current_menu(); if (this_menu != last_menu) { move(1, 0); clrtobot(); box(menu_win(this_menu), 0, 0); refresh(); /* force the current menu to appear */ menu_display(this_menu); last_menu = this_menu; } } wrefresh(menu_win(last_menu)); if (code == E_UNKNOWN_COMMAND || code == E_NOT_POSTED) { ITEM *item = current_item(last_menu); MENU_DATA *td = (MENU_DATA *) item_userptr(item); td->func((int) td->mask); } if (code == E_REQUEST_DENIED) beep(); } } 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 ncurses-6.4-20240113/test/bs.60000644000000000000000000001000414062736236014113 0ustar rootroot.\"*************************************************************************** .\" Copyright 2020,2021 Thomas E. Dickey * .\" Copyright 1998,2006 Free Software Foundation, Inc. * .\" * .\" Permission is hereby granted, free of charge, to any person obtaining a * .\" copy of this software and associated documentation files (the * .\" "Software"), to deal in the Software without restriction, including * .\" without limitation the rights to use, copy, modify, merge, publish, * .\" distribute, distribute with modifications, sublicense, and/or sell * .\" copies of the Software, and to permit persons to whom the Software is * .\" furnished to do so, subject to the following conditions: * .\" * .\" The above copyright notice and this permission notice shall be included * .\" in all copies or substantial portions of the Software. * .\" * .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * .\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * .\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * .\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * .\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * .\" * .\" Except as contained in this notice, the name(s) of the above copyright * .\" holders shall not be used in advertising or otherwise to promote the * .\" sale, use or other dealings in this Software without prior written * .\" authorization. * .\"*************************************************************************** .\" .\" $Id: bs.6,v 1.5 2021/06/17 21:20:30 tom Exp $ .TH BATTLESHIPS 6 2021-06-17 ncurses-examples Games .SH NAME bs \- battleships game .SH SYNOPSIS battle [ -b | -s ] [ -c ] .SH DESCRIPTION This program allows you to play the familiar Battleships game against the computer on a 10x10 board. The interface is visual and largely self-explanatory; you place your ships and pick your shots by moving the cursor around the `sea' with the rogue/hack motion keys hjklyubn. .PP Note that when selecting a ship to place, you must type the capital letter (these are, after all, capital ships). During ship placement, the `r' command may be used to ignore the current position and randomly place your currently selected ship. The `R' command will place all remaining ships randomly. The ^L command (form feed, ASCII 12) will force a screen redraw). .PP The command-line arguments control game modes. .nf -b selects a `blitz' variant -s selects a `salvo' variant -c permits ships to be placed adjacently .fi The `blitz' variant allows a side to shoot for as long as it continues to score hits. .PP The `salvo' game allows a player one shot per turn for each of his/her ships still afloat. This puts a premium scoring hits early and knocking out some ships and also makes much harder the situation where you face a superior force with only your PT-boat. .PP Normally, ships must be separated by at least one square of open water. The -c option disables this check and allows them to close-pack. .PP The algorithm the computer uses once it has found a ship to sink is provably optimal. The dispersion criterion for the random-fire algorithm may not be. .SH AUTHORS Originally written by one Bruce Holloway in 1986. Salvo mode added by Chuck A. DeGaul (cbosgd!cad). Visual user interface, `closepack' option, code rewrite and manual page by Eric S. Raymond August 1989. ncurses-6.4-20240113/misc/0000755000000000000000000000000014550564136013401 5ustar rootrootncurses-6.4-20240113/misc/gen_edit.sh0000755000000000000000000001045614114713361015514 0ustar rootroot#!/bin/sh ############################################################################## # Copyright 2020,2021 Thomas E. Dickey # # Copyright 2004-2011,2012 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey # # $Id: gen_edit.sh,v 1.7 2021/09/04 15:55:29 tom Exp $ # Generate a sed-script for converting the terminfo.src to the form which will # be installed. # # Assumes: # The leaf directory names (lib, tabset, terminfo) # linux_dft=linux2.2 : "${datadir=/usr/share}" : "${WHICH_LINUX=$linux_dft}" : "${WHICH_XTERM=xterm-new}" : "${XTERM_KBS=BS}" # If we're not installing into /usr/share/, we'll have to adjust the location # of the tabset files in terminfo.src (which are in a parallel directory). TABSET=${datadir}/tabset if test "x$TABSET" != "x/usr/share/tabset" ; then cat <&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 < 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 ncurses-6.4-20240113/misc/terminfo.src0000644000000000000000000432022614550564136015746 0ustar rootroot######## 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.1109 $ # $Date: 2024/01/13 19:45:34 $ # # 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), bold=\E[1m, 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=ansi+sgr, 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, colors#8, ncv#3, pairs#64, op=\E[39;49m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, ecma+italics|ECMA-48 italics, ritm=\E[23m, sitm=\E[3m, # Attribute control for ECMA-48-compatible terminals ecma+sgr|attribute capabilities for true ECMA-48 terminals, rmso=\E[27m, rmul=\E[24m, use=klone+sgr8, ecma+strikeout|ECMA-48 strikeout/crossed-out, rmxx=\E[29m, smxx=\E[9m, # ECMA-48 does not include the VT100 indexing and scroll-margins. It has its # own variation. ecma+index|ECMA-48 scroll up/down, indn=\E[%p1%dS, rin=\E[%p1%dT, # For comparison, here are all the capabilities implied by the Intel # Binary Compatibility Standard (level 2) that fit within terminfo. # For more detail on this rather pathetic standard, see the comments # near the end of this file. ibcs2|Intel Binary Compatibility Standard prescriptions, cbt=\E[Z, clear=\Ec, 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, cols#80, it#8, lines#24, bel=^G, civis=\Ef, clear=\EE, cnorm=\Ee, cr=\r, cub1=\ED, cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM, ed=\EJ, el=\EK, el1=\Eo, home=\EH, ht=^I, il1=\EL, ind=\n, is2=\Ev\Eq\Ee, kLFT=\Ed, kRIT=\Ec, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=^?, kf1=\EP, kf10=\EY, kf11=\Ep, kf12=\Eq, kf13=\Er, kf14=\Es, kf15=\Et, kf16=\Eu, kf17=\Ev, kf18=\Ew, kf19=\Ex, kf2=\EQ, kf20=\Ey, kf3=\ER, kf4=\ES, kf5=\ET, kf6=\EU, kf7=\EV, kf8=\EW, kf9=\EX, khlp=\EH, khome=\EE, kich1=\EI, knp=\Eb, kpp=\Ea, kund=\EK, nel=\r\n, rc=\Ek, rev=\Ep, ri=\EI, rmso=\Eq, rs2=\Ev\Eq\Ee, sc=\Ej, sgr0=\Eq, smso=\Ep, tw100|Toswin VT100 window manager, eo, mir, msgr, xon, colors#8, cols#80, it#8, lines#24, pairs#64, vt#3, acsc=++\,\,--..00II``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxy yzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, civis=\Ef, clear=\E[2J\E[H, cnorm=\Ee, cr=\r, 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, cols#80, it#8, lines#30, bel=^G, blink=\Er, bold=\EyA, civis=\Ef, clear=\EE, cnorm=\E. \Ee, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\E.", dim=\Em, dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, il1=\EL, ind=\n$<2*/>, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=^?, kf1=\EP, kf10=\EY, kf11=\Ep, kf12=\Eq, kf13=\Er, kf14=\Es, kf15=\Et, kf16=\Eu, kf17=\Ev, kf18=\Ew, kf19=\Ex, kf2=\EQ, kf20=\Ey, kf3=\ER, kf4=\ES, kf5=\ET, kf6=\EU, kf7=\EV, kf8=\EW, kf9=\EX, khlp=\EH, khome=\EE, kich1=\EI, knp=\Eb, kpp=\Ea, kund=\EK, nel=\r\n$<2*/>, op=\Eb@\EcO, rev=\Ep, ri=\EI$<2*/>, rmcup=\Ev\E. \Ee\Ez_, rmso=\Eq, rmul=\EzH, rs1=\Ez_\Eb@\EcA, sgr0=\Ez_, smcup=\Ev\Ee\Ez_, smso=\Ep, smul=\EyH, stv52pc|MiNT virtual console with PC charset, am, msgr, cols#80, it#8, lines#30, acsc=+\257\,\256-\^.v0\333I\374`\177a\260f\370g\361h\261j \331k\277l\332m\300n\305o\377p-q\304r-s_t+u+v+w+x\263y \363z\362{\343|\366}\234~\371, bel=^G, blink=\Er, bold=\EyA, civis=\Ef, clear=\EE, cnorm=\E. \Ee, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\E.", dim=\Em, dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, il1=\EL, ind=\n$<2*/>, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=^?, kf1=\EP, kf10=\EY, kf11=\Ep, kf12=\Eq, kf13=\Er, kf14=\Es, kf15=\Et, kf16=\Eu, kf17=\Ev, kf18=\Ew, kf19=\Ex, kf2=\EQ, kf20=\Ey, kf3=\ER, kf4=\ES, kf5=\ET, kf6=\EU, kf7=\EV, kf8=\EW, kf9=\EX, khlp=\EH, khome=\EE, kich1=\EI, knp=\Eb, kpp=\Ea, kund=\EK, nel=\r\n$<2*/>, rev=\Ep, ri=\EI$<2*/>, rmcup=\Ev\E. \Ee\Ez_, rmso=\Eq, rmul=\EzH, rs1=\Ez_\Eb@\EcA, sgr0=\Ez_, smcup=\Ev\Ee\Ez_, smso=\Ep, smul=\EyH, # From: Simson L. Garfinkel atari-old|Atari st, OTbs, am, cols#80, it#8, lines#25, clear=\EH\EJ, cub1=\ED, cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM, ed=\EJ, el=\EK, ht=^I, il1=\EL, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, ri=\EI, rmso=\Eq, sgr0=\Eq, smso=\Ep, # UniTerm terminal program for the Atari ST: 49-line VT220 emulation mode # From: Paul M. Aoki 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, colors#8, cols#80, it#8, lines#25, ncv#5, pairs#64, 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, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, 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=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, colors#8, it#8, ncv#18, pairs#64, acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v \301w\302x\263y\363z\362{\343|\330}\234~\376, bel=^G, bold=\E[1m, 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=^?, kdch1=\E[3~, kend=\E[4~, kf1=\E[[A, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, kf20=\E[34~, kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, kspd=^Z, nel=\r\n, op=\E[37;40m, ri=\EM, rmacs=\E[10m, rmpch=\E[10m, rmso=\E[27m, rmul=\E[24m, rs1=\Ec, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5 %t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m, sgr0=\E[0;10m, smacs=\E[11m, smpch=\E[11m, smso=\E[7m, smul=\E[4m, tbc=\E[3g, tsl=\E[?T, u8=\E[?6c, vpa=\E[%i%p1%dd, use=ansi+arrows, use=ansi+csr, use=ansi+enq, use=ansi+erase, use=ansi+idc, use=ansi+idl, use=ansi+local, use=ansi+sgr, # 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, colors#8, it#8, ncv#18, pairs#64, acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy yzz{{||}}~~, bel=^G, bold=\E[1m, 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~, kich1=\E[2~, kmous=\E[M, kspd=^Z, nel=\r\n, op=\E[39;49m, ri=\E[T, rmacs=\E[10m, rmir=\E[4l, rmso=\E[27m, rmul=\E[24m, rs1=\EM\E[?1000l, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t; 2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m, sgr0=\E[0m, smacs=\E[11m, smir=\E[4h, smso=\E[7m, smul=\E[4m, 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+sgr, use=vt220+pcedit, use=ecma+index, use=ecma+italics, use=vt220+cvis, #### QNX # # QNX 4.0 Console # Michael's original version of this entry had , , # ; 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, blink=\E[5m, bold=\E[1m, 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, rev=\E[7m, ri=\E[T, rmacs=^O, rmam=\E[?7l, rmso=\E[27m, rmul=\E[24m, rs1=\017\E[?7h\E[0;39;49m$<2>\E>\E[?1l, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} %=%t3%e%p1%d%;m, setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} %=%t3%e%p1%d%;m, sgr=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1 %|%t;7%;%?%p7%t;9%;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smso=\E[7m, smul=\E[4m, tsl=\E7\E1;24r\E[?6l\E[25;%i%p1%dH, use=ansi+arrows, use=ansi+local, use=ansi+rep, use=ansi+inittabs, 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=^?, kdch1=\E[3~, kend=\E[8~, kent=\r, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, kf20=\E[34~, kf21=\E[35~, kf22=\E[36~, kf23=\E[37~, kf24=\E[38~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[7~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, krfr=^R, use=ansi+arrows, pccon+sgr+acs0|sgr and simple ASCII pseudographics for OpenBSD PC console, acsc=+>\,<-\^.v0#`+a:f\\h#i#j+k+l+m+n+o~p-q-r-s_t+u+v+w+x|y# z#{*|!}#~o, bold=\E[1m, rev=\E[7m, rmso=\E[27m, sgr=\E[0%?%p1%p3%|%t;7%;%?%p6%t;1%;%?%p2%t;4%;m, sgr0=\E[m, smso=\E[7m, pccon+sgr+acs|sgr and default ASCII pseudographics for OpenBSD PC console, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bold=\E[1m, enacs=\E)0, rev=\E[7m, rmacs=\E(B, rmso=\E[27m, sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e \E(B%;, sgr0=\E[m\E(B, smacs=\E(0, smso=\E[7m, # underline renders as color pccon+colors|ANSI colors for OpenBSD PC console, bce, colors#8, ncv#2, pairs#64, op=\E[49;39m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, # OpenBSD uses wscons, # + which does not implement DECSCNM or anything comparable, so it does not # support flash. # + it renders underline using color. pccon+base|base capabilities for OpenBSD PC console, am, km, mc5i, msgr, npc, nxon, xenl, xon, cols#80, it#8, lines#24, bel=^G, 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), am, bce, msgr, xenl, xon, cols#80, it#8, lines#30, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, clear=\E[H\E[J$<50>, cr=\r, 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, invis=\E[8m$<2>, ka1=\E[q, ka3=\E[s, kb2=\E[r, kbs=^H, kc1=\E[p, kc3=\E[n, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kent=\E[M, kf0=\E[y, kf1=\E[P, kf10=\E[x, kf2=\E[Q, kf3=\E[R, kf4=\E[S, kf5=\E[t, kf6=\E[u, kf7=\E[v, kf8=\E[l, kf9=\E[w, 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 %;%?%p7%t;8%;m%?%p9%t\016%e\017%;$<2>, sgr0=\E[m\017$<2>, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m$<2>, smul=\E[4m$<2>, tbc=\E[3g, use=ansi+csr, use=ansi+local, use=ecma+sgr, use=klone+color, arm100-w|arm100-wam|Arm(RiscPC) ncurses compatible (for 1024x768), cols#132, lines#50, use=arm100, # NetBSD/x68k console VT200 emulator. This port runs on a 68K machine # manufactured by Sharp for the Japanese market. # From Minoura Makoto , 12 May 1996 x68k|x68k-ite|NetBSD/x68k ITE, cols#96, lines#32, 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, correcting the ncv value. # The emulator renders underlined text in red. Colors are otherwise usable. # # Testing the emulator and reading the source code (NetBSD 2.0), it appears # that "vt220" is inaccurate. There are a few VT220-features, but most of the # VT220 screens in vttest do not work with this emulator. For instance, it # identifies itself (primary DA response) as a VT220 with selective erase. But # the selective erase feature does not work. The secondary response is copied # from Kermit's emulation of VT220, does not correspond to actual VT220. At # the level of detail in a termcap, it is a passable emulator, since ECH does # work. Don't use it on a VMS system -TD wsvt25|NetBSD wscons in 25 line DEC VT220 mode, bce, colors#8, lines#25, ncv#2, 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, colors#8, cols#80, it#8, lines#25, ncv#21, pairs#64, 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, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr=\E[0%?%p1%t;2;7%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;30;1%;%? %p6%t;1%;m, sgr0=\E[m, smso=\E[7m, vpa=\E[%i%p1%dd, use=ansi+arrows, use=ansi+erase, use=ansi+idl, use=ansi+local, use=ecma+index, cons25|ansis|ansi80x25|FreeBSD console (25-line ANSI mode), acsc=-\030.^Y0\333`\004a\260f\370g\361h\261i\025j\331k\277l \332m\300n\305q\304t\303u\264v\301w\302x\263y\363z\362~ \371, use=cons25w, cons25-debian|FreeBSD console with debian backspace (25-line ANSI mode), kbs=^?, kdch1=\E[3~, use=cons25, cons25-m|ansis-mono|ansi80x25-mono|FreeBSD console (25-line mono ANSI mode), colors@, pairs@, bold@, dim@, op@, rmul=\E[m, setab@, setaf@, sgr=\E[0%?%p1%t;2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m, smul=\E[4m, use=cons25, cons30|ansi80x30|FreeBSD console (30-line ANSI mode), lines#30, use=cons25, cons30-m|ansi80x30-mono|FreeBSD console (30-line mono ANSI mode), lines#30, use=cons25-m, cons43|ansi80x43|FreeBSD console (43-line ANSI mode), lines#43, use=cons25, cons43-m|ansi80x43-mono|FreeBSD console (43-line mono ANSI mode), lines#43, use=cons25-m, cons50|ansil|ansi80x50|FreeBSD console (50-line ANSI mode), lines#50, use=cons25, cons50-m|ansil-mono|ansi80x50-mono|FreeBSD console (50-line mono ANSI mode), lines#50, use=cons25-m, cons60|ansi80x60|FreeBSD console (60-line ANSI mode), lines#60, use=cons25, cons60-m|ansi80x60-mono|FreeBSD console (60-line mono ANSI mode), lines#60, use=cons25-m, cons25r|pc3r|ibmpc3r|cons25-koi8-r|FreeBSD console w/koi8-r cyrillic, acsc=-\030.^Y0\215`\004a\220f\234h\221i\025j\205k\203l\202m \204n\212q\0t\206u\207v\211w\210x\201y\230z\231~ \225, use=cons25w, cons25r-m|pc3r-m|ibmpc3r-mono|cons25-koi8r-m|FreeBSD console w/koi8-r cyrillic (mono), colors@, pairs@, op@, rmul=\E[m, setab@, setaf@, sgr=\E[0%?%p1%t;2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5 %t;30;1%;%?%p6%t;1%;m, smul=\E[4m, use=cons25r, cons50r|cons50-koi8r|FreeBSD console w/koi8-r cyrillic (50 lines), lines#50, use=cons25r, cons50r-m|cons50-koi8r-m|FreeBSD console w/koi8-r cyrillic (50-line mono), lines#50, use=cons25r-m, cons60r|cons60-koi8r|FreeBSD console w/koi8-r cyrillic (60 lines), lines#60, use=cons25r, cons60r-m|cons60-koi8r-m|FreeBSD console w/koi8-r cyrillic (60-line mono), lines#60, use=cons25r-m, # ISO 8859-1 FreeBSD console cons25l1|cons25-iso8859|FreeBSD console w/iso 8859-1 chars, acsc=+\253\,\273-\030.\031`\201a\202f\207g\210i\247j\213k \214l\215m\216n\217o\220p\221q\222r\223s\224t\225u \226v\227w\230x\231y\232z\233~\237, use=cons25w, cons25l1-m|cons25-iso-m|FreeBSD console w/iso 8859-1 chars (mono), colors@, pairs@, bold@, dim@, op@, rmul=\E[m, setab@, setaf@, sgr=\E[0%?%p1%t;2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m, smul=\E[4m, use=cons25l1, cons50l1|cons50-iso8859|FreeBSD console w/iso 8859-1 chars (50 lines), lines#50, use=cons25l1, cons50l1-m|cons50-iso-m|FreeBSD console w/iso 8859-1 chars (50-line mono), lines#50, use=cons25l1-m, cons60l1|cons60-iso|FreeBSD console w/iso 8859-1 chars (60 lines), lines#60, use=cons25l1, cons60l1-m|cons60-iso-m|FreeBSD console w/iso 8859-1 chars (60-line mono), lines#60, use=cons25l1-m, # vt - virtual terminal console driver # # Starting with FreeBSD 8, an alternative configuration for syscons is provided, # which is intended to be xterm-compatible. See for example # http://svnweb.freebsd.org/base/stable/8/sys/dev/syscons/ # in particular scterm-teken.c # # Some of the documentation refers to this as "vt"; its proper name is "teken". # # The sc(4) manual page states that it is possible to switch between the two # by editing /boot/loader.conf, adding # kern.vty=sc # Doing that does not change the default TERM variable. That is hard-coded in # /etc/ttys, rather than deriving it from the kernel state. # # For FreeBSD 12 and 13: # --------------------- # In newer releases, it is no longer possible to boot into a configuration that # works with syscons. According to efi(4), # "The vt(4) system console is automatically selected when booting via UEFI." # See FreeBSD #264226. # # FreeBSD 13 supports 64-bit machines which boot with UEFI: # https://www.freebsd.org/platforms/ # The i386 platform does not use UEFI (and modifying the loader configuration # does load sysconf); however because no updates (fixes) are available, most # developers will regard that as unsupported. # # With FreeBSD 13, even when syscons is loaded (e.g., with the i386 platform), # its function-keys are not configured. Using # vidcontrol -T cons25 # repairs this. # # When teken is loaded, vidcontrol can switch at runtime between the # teken/cons25 function keys: # vidcontrol -T cons25 # vidcontrol -T xterm # However due to a limitation in the implementation, only the first 12 function # keys are available. The real syscons supports 48 function keys (using the # shift and control modifiers), while xterm supports more than twice as many. # # vidcontrol does not change the emulation. As a result, the quarter (17/73) of # non-function key capabilities which differ between syscons and teken are # unsupported in the UEFI-based configurations. # # tack: # VT100 line-drawing does not work (UTF-8 equivalents do). # Shift/control modifiers have no effect on special keys. # Meta does not work. # vttest: # supports REP (repeat). # still does not support left/right margins # SU/SD work, but not SL/SR # alternate screen does not work # ENQ/DA1 is unimplemented (the terminal does not identify itself) # CPR, XCPR are unimplemented (i.e., vttest and resize are broken) # implements X11 (original) xterm-mouse. # ncurses: # UTF-8 line-drawing works, including some double/thick lines # # For FreeBSD 9 and 10: # -------------------- # The /etc/ttys entries for console and other ttys are all configured to set # TERM=xterm. # # Testing with tack: # There is no VT100 line-drawing (uses +'s and -'s) # Shifted f1-f12 give cons25 codes, rather than xterm function-keys # # Testing with vttest: # Menu 2 diamonds don't work, blink ditto, light background ditto # The terminal identifies itself as VT100 with AVO # There is no VT52 support # There is no doublesize character support # The terminal supports ECH (like rxvt) # The terminal does not support send/receive mode # The terminal supports all of the ISO-6429 cursor-movement # The terminal supports some of the ISO-6429 miscellaneous tests # (SL/SR also leave unexpected char on screen too) # # Considering cons25 as a base, the line-drawing mostly works, but is missing # the cells which happen to have ASCII control-character values: # - ^X arrow pointing up # . ^Y arrow pointing down # i ^Y lantern # ` ^D diamond # # Those are removed from this entry's acsc string to avoid confusion. # The resulting description provides correct line-drawing and function-keys -TD teken-2018|teken as of 2018, bw@, mir, xenl, NQ, acsc=0\333a\260f\370g\361h\261j\331k\277l\332m\300n\305q \304t\303u\264v\301w\302x\263y\363z\362~\371, cvvis@, hpa=\E[%i%p1%dG, hts=\EH, 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, colors#8, cols#80, it#8, lines#25, ncv#21, pairs#64, U8#1, bold=\E[1m, cr=\r, cub1=^H, dim=\E[30;1m, ech=\E[%p1%dX, ind=\E[S, kbs=^H, kent=\r, nel=\E[E, op=\E[x, rev=\E[7m, ri=\E[T, rmso=\E[27m, rs2=\E[x\E[m\Ec, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr=\E[0%?%p1%t;2;7%;%?%p3%t;7%;%?%p5%t;30;1%;%?%p6%t;1%;m, sgr0=\E[m, use=vt220+cvis, use=ecma+index, use=ansi+arrows, use=ansi+csr, use=ansi+cup, use=ansi+erase, use=ansi+idc, use=ansi+idl, use=ansi+local, use=ansi+rca2, use=ansi+sgrso, use=ansi+tabs, teken-vt+fkeys|teken's xterm special keys, kdch1=\E[3~, kend=\E[F, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[H, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, teken-sc+fkeys|teken's syscons special keys, kdch1=^?, kend=\E[F, kf1=\E[M, kf10=\E[V, kf11=\E[W, kf12=\E[X, kf2=\E[N, kf3=\E[O, kf4=\E[P, kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U, khome=\E[H, kich1=\E[L, knp=\E[G, kpp=\E[I, teken-sc|teken imitating syscons, use=teken-sc+fkeys, use=teken-2022, teken|teken-vt|teken imitating xterm, xenl, use=teken-vt+fkeys, use=xterm+x11mouse, use=teken-2022, teken-16color|teken using 16 colors, use=ibm+16color, use=teken, #### 386BSD and BSD/OS Consoles # # This was the original 386BSD console entry (I think). # Some places it's named oldpc3|oldibmpc3. # From: Alex R.N. Wetmore 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, OTbs, it#8, lines#24, acsc=+h.k0affggolpnqprrss, home=\EH, kbs=^H, nel=\r\n, ri=\EI, rmacs=\EG, rmkx=\E>, smacs=\EF, smkx=\E=, u8=\E/[KL], use=vt50h, # This is more likely the "vt52" that you would see in emulation, i.e., no # keypad, no graphics. vt52-basic|VT52 for emulators, cols#80, it#8, lines#24, bel=^G, clear=\EH\EJ, cr=\r, cub1=\ED, cud1=\EB, cuf1=\EC, cup=\EY%p1%' '%+%c%p2%' '%+%c, cuu1=\EA, ed=\EJ, el=\EK, home=\EH, ht=^I, ind=\n, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, nel=\r\n, ri=\EI, #### DEC VT100 and compatibles # # DEC terminals from the VT100 forward are collected here. Older DEC terminals # and micro consoles can be found in the `obsolete' section. More details on # the relationship between the VT100 and ANSI X3.64/ISO 6429/ECMA-48 may be # found near the end of this file. # # Except where noted, these entries are DEC's official terminfos. # Contact Bill Hedberg 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, kent=\EOM, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, ka2=\EOx, kb1=\EOt, kb3=\EOv, kc2=\EOr, # vt100+enq|ncurses extension for VT100-style ENQ, u8=\E[?1;2c, use=ansi+enq, vt102+enq|ncurses extension for VT102-style ENQ, u8=\E[?6c, use=ansi+enq, # # And here, for those of you with orphaned VT100s lacking documentation, is # a description of the soft switches invoked when you do `Set Up'. # # Scroll 0-Jump Shifted 3 0-# # | 1-Smooth | 1-British pound sign # | Autorepeat 0-Off | Wrap Around 0-Off # | | 1-On | | 1-On # | | Screen 0-Dark Bkg | | New Line 0-Off # | | | 1-Light Bkg | | | 1-On # | | | Cursor 0-Underline | | | Interlace 0-Off # | | | | 1-Block | | | | 1-On # | | | | | | | | # 1 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 <--Standard Settings # | | | | | | | | # | | | Auto XON/XOFF 0-Off | | | Power 0-60 Hz # | | | 1-On | | | 1-50 Hz # | | ANSI/VT52 0-VT52 | | Bits Per Char. 0-7 Bits # | | 1-ANSI | | 1-8 Bits # | Keyclick 0-Off | Parity 0-Off # | 1-On | 1-On # Margin Bell 0-Off Parity Sense 0-Odd # 1-On 1-Even # # The following SET-UP modes are assumed for normal operation: # ANSI_MODE AUTO_XON/XOFF_ON NEWLINE_OFF 80_COLUMNS # WRAP_AROUND_ON JUMP_SCROLL_OFF # Other SET-UP modes may be set for operator convenience or communication # requirements; I recommend # AUTOREPEAT_ON BLOCK_CURSOR MARGIN_BELL_OFF SHIFTED_3_# # Unless you have a graphics add-on such as Digital Engineering's VT640 # (and even then, whenever it can be arranged!) you should set # INTERLACE_OFF # # (vt100: I added / 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, bold=\E[1m, 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>, rmso=\E[m, rmul=\E[m, 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=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=ansi+csr, use=ansi+cup, use=ansi+erase, use=ansi+idl, use=ansi+local, use=ansi+sgr, use=vt100+enq, use=vt100+pfkeys, nsterm+acs|AppKit Terminal.app v41+ basic capabilities w/VT100 alternate-charset, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, enacs=\E(B\E)0, rmacs=^O, sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, use=nsterm+7, nsterm+mac|AppKit Terminal.app v41+ basic capabilities w/MacRoman alternate-charset, acsc=+\335\,\334-\366.\3770#`\327a:f\241g\261h#i \360jjkkllmmnno\370p\370q\321rrssttuuvvwwxxy\262z\263{ \271|\255}\243~\245, enacs=\E(B\E)0, rmacs=^O, sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, use=nsterm+7, # compare with xterm+sl-twm nsterm+s|AppKit Terminal.app v41+ status-line (window titlebar) support, wsl#50, use=xterm+sl-twm, nsterm+c|AppKit Terminal.app v51+ full color support (including 16 colors), op=\E[0m, use=ibm+16color, nsterm+c41|AppKit Terminal.app v41 color support, colors#8, ncv#37, pairs#64, op=\E[0m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, # These are different combinations of the building blocks # ASCII charset (-7) nsterm-m-7|nsterm-7-m|AppKit Terminal.app v41+ w/ASCII charset (monochrome), use=nsterm+7, nsterm-m-s-7|nsterm-7-m-s|AppKit Terminal.app v41+ w/ASCII charset (monochrome w/statusline), use=nsterm+s, use=nsterm+7, nsterm-7|AppKit Terminal.app v41+ w/ASCII charset (color), use=nsterm+c41, use=nsterm+7, nsterm-7-c|nsterm-c-7|AppKit Terminal.app v51+ w/ASCII charset (full color), use=nsterm+c, use=nsterm+7, nsterm-s-7|nsterm-7-s|AppKit Terminal.app v41+ w/ASCII charset (color w/statusline), use=nsterm+s, use=nsterm+c41, use=nsterm+7, nsterm-c-s-7|nsterm-7-c-s|AppKit Terminal.app v51+ w/ASCII charset (full color w/statusline), use=nsterm+s, use=nsterm+c, use=nsterm+7, # VT100 alternate-charset (-acs) nsterm-m-acs|nsterm-acs-m|AppKit Terminal.app v41+ w/VT100 alternate-charset (monochrome), use=nsterm+acs, nsterm-m-s-acs|nsterm-acs-m-s|AppKit Terminal.app v41+ w/VT100 alternate-charset (monochrome w/statusline), use=nsterm+s, use=nsterm+acs, nsterm-acs|AppKit Terminal.app v41+ w/VT100 alternate-charset (color), use=nsterm+c41, use=nsterm+acs, nsterm-c-acs|nsterm-acs-c|AppKit Terminal.app v51+ w/VT100 alternate-charset (full color), use=nsterm+c, use=nsterm+acs, nsterm-s-acs|nsterm-acs-s|AppKit Terminal.app v41+ w/VT100 alternate-charset (color w/statusline), use=nsterm+s, use=nsterm+c41, use=nsterm+acs, nsterm-c-s-acs|nsterm-acs-c-s|AppKit Terminal.app v51+ w/VT100 alternate-charset (full color w/statusline), use=nsterm+s, use=nsterm+c, use=nsterm+acs, # MacRoman charset nsterm-m|AppKit Terminal.app v41+ w/MacRoman charset (monochrome), use=nsterm+mac, nsterm-m-s|AppKit Terminal.app v41+ w/MacRoman charset (monochrome w/statusline), use=nsterm+s, use=nsterm+mac, nsterm-old|AppKit Terminal.app v41+ w/MacRoman charset (color), use=nsterm+c41, use=nsterm+mac, nsterm-c|AppKit Terminal.app v51+ w/MacRoman charset (full color), use=nsterm+c, use=nsterm+mac, nsterm-s|AppKit Terminal.app v41+ w/MacRoman charset (color w/statusline), use=nsterm+s, use=nsterm+c41, use=nsterm+mac, nsterm-c-s|AppKit Terminal.app v51+ w/MacRoman charset (full color w/statusline), use=nsterm+s, use=nsterm+c, use=nsterm+mac, # In Mac OS X version 10.5 the format of the preferences has changed # and a new, more complex technique is needed, e.g., # # python -c 'import sys,objc;NSUserDefaults=objc.lookUpClass( # "NSUserDefaults");ud=NSUserDefaults.alloc(); # ud.init();prefs=ud.persistentDomainForName_( # "com.apple.Terminal");prefs["Window Settings"][ # prefs["Default Window Settings"]]["TerminalType" # ]=sys.argv[1];ud.setPersistentDomain_forName_(prefs, # "com.apple.Terminal")' nsterm-16color # # and it is still not settable from the preferences dialog. This is # tracked under rdar://problem/7365108 and rdar://problem/7365134 # in Apple's bug reporter. # # In OS X 10.5 (Leopard) the TERM which can be set in the preferences dialog # defaults to xterm-color. Alternative selections are ansi, dtterm, rxvt, # vt52, vt100, vt102 and xterm. nsterm-16color|AppKit Terminal.app v240.2+ with Mac OS X version 10.5, bw@, mir, npc, 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, am, bce, mir, msgr, npc, xenl, xon, cols#80, it#8, lines#24, wsl#50, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, el1=\E[1K, enacs=\E(B\E)0, flash=\E[?5h$<200/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ind=\n, kLFT=\E[1;2D, kRIT=\E[1;2C, kbs=^?, kcbt=\E[Z, kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, knp=\E[6~, kpp=\E[5~, op=\E[0m, rev=\E[7m, ri=\EM, rmacs=^O, rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%? %p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, vpa=\E[%i%p1%dd, kEND5=\E[1;5F, kHOM5=\E[1;5H, use=ansi+apparrows, use=ansi+csr, use=ansi+enq, use=ansi+erase, use=ansi+idc, use=ansi+idl, use=ansi+local, use=vt100+keypad, use=xterm+alt47, use=xterm+sl-twm, use=xterm+x11mouse, use=xterm+256setaf, use=vt220+cvis, # iTerm2 3.0.15 # # https://iterm2.com/ # https://github.com/gnachman/iTerm2 # ~/Library/Preferences/com.googlecode.iterm2.plist # "iTerm" stalled in 2009. A different set of developers began "iTerm2". # # NOTES: # with vttest: # reports primary DA as VT100 with AVO: \E[?1;2c # reports secondary DA as "\E[>0;95;0c" # numeric keypad application mode does not work # by default, dtterm window-modifications are ignored # by default, dtterm window-reports return, but icon as "L", window as "l" # supports SD/SU, no REP, SL, SR # supports CBT, CHA, VPA, CNL, CPL, VPR (no HPA, CHT, HPR) # no improvement to XFree86 1047/1048 modes # with tack: # in meta-mode, imitates xterm, sending UTF-8 # special-key modifiers based on xterm use incompatible default for alt/meta # with ncurses test-program: # no italics # no improvement to ncurses 'k' # with xterm scripts: # acolors.sh works # # Italic text did not work initially, apparently because upgrading did not # add/change that preference (set in Preferences, Profiles, Text). A new # install of iTerm 3.0.15 provides italics by default (blinking text is an # option in the preferences dialog). # # 2018/01/21: found xterm+sm+1006 did not work with version 3.1.5 # 2018/05/19: xterm+sm+1006 seems to work with 3.1.6beta -TD iTerm2.app|iterm2|terminal emulator for Mac OS X, 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%;, kDN3=\E\E[B, kDN4=\E[1;10B, kDN5=\E[1;5B, kDN6=\E[1;6B, kEND3=\E[1;9F, kEND4=\E[1;10F, kEND6=\E[1;6F, kEND7=\E[1;13F, kEND8=\E[1;14F, kHOM3=\E[1;9H, kHOM4=\E[1;10H, kHOM6=\E[1;6H, kHOM7=\E[1;13H, kHOM8=\E[1;14H, kLFT3=\E\E[D, kLFT4=\E[1;10D, kLFT5=\E[1;5D, kLFT6=\E[1;6D, kNXT3=\E\E[6~, kPRV3=\E\E[5~, kRIT3=\E\E[C, kRIT4=\E[1;10C, kRIT5=\E[1;5C, kRIT6=\E[1;6C, kUP3=\E\E[A, kUP4=\E[1;10A, kUP5=\E[1;5A, kUP6=\E[1;6A, use=ecma+index, use=xterm+alt+title, use=ecma+italics, use=iterm, use=bracketed+paste, # xnuppc - Darwin PowerPC Console (a.k.a. "darwin") # # On PowerPC platforms, Apple's Darwin operating system uses a # full-screen system console derived from a NetBSD framebuffer # console. It is an ANSI-style terminal, and is not really VT-100 # compatible. # # Under Mac OS X, this is the system console driver used while in # single-user mode [reachable by holding down Command-S during the # boot process] and when logged in using console mode [reachable by # typing ">console" at the graphical login prompt.] # # If you're looking for a description of the Terminal.app terminal # emulator which runs under the Mac OS X Quartz windowing system (and # other AppKit-supported windowing systems,) see the "nsterm" # entry instead. # # NOTE: Under Mac OS X version 10.1, the default login window does not # prompt for user name, instead requiring an icon to be selected from # a list of known users. Since the special ">console" login is not in # this list, you must make one of two changes in the Login Window # panel of the Login section of System Prefs to make the special # ">console" login accessible. The first option is to enable 'Show # "Other User" in list for network users', which will add a special # "Other..." icon to the graphical login panel. Selecting "Other..." # will present the regular graphical login prompt. The second option # is to change the 'Display Login Window as:' setting to 'Name and # password entry fields', which replaces the login panel with a # graphical login prompt. # # There are no function keys, at least not in Darwin 1.3. # # It has no mouse support. # # It has full ANSI color support, and color combines correctly with # all three supported attributes: bold, inverse-video and underline. # However, bold colored text is almost unreadable (bolding is # accomplished using shifting and or-ing, and looks smeared) so bold # has been excluded from the list of color-compatible attributes # [using (ncv)]. The monochrome entry (-m) is useful if you use a # monochrome monitor. # # There is one serious bug with this terminal emulation's color # support: repositioning the cursor onto a cell with non-matching # colors obliterates that cell's contents, replacing it with a blank # and displaying a colored cursor in the "current" colors. There is # no complete workaround at present [other than using the monochrome # (-m) entries,] but removing the (msgr) capability seemed to help. # # The "standout" chosen was simple reverse-video, although a colorful # standout might be more aesthetically pleasing. Similarly, the bold # chosen is the terminal's own smeared bold, although a simple # color-change might be more readable. The color-bold (-b) entries # uses magenta colored text for bolding instead. The fancy color (-f # and -f2) entries use color for bold, standout and underlined text # (underlined text is still underlined, though.) # # Apparently the terminal emulator does support a VT-100-style # alternate character set, but all the alternate character set # positions have been left blank in the font. For this reason, no # alternate character set capabilities have been included in this # description. The console driver appears to be ASCII-only, so (enacs) # has been excluded [although the VT-100 sequence does work.] # # The default Mac OS X and Darwin installation reports "vt100" as the # terminal type, and exports no helpful environment variables. To fix # this, change the "console" entry in /etc/ttys from "vt100" to # "xnuppc-WxH", where W and H are the character dimensions of your # console (see below.) # # The font used by the terminal emulator is apparently one originally # drawn by Ka-Ping Yee, and uses 8x16-pixel characters. This # file includes descriptions for the following geometries: # # Pixels Characters Entry Name (append -m for monochrome) # ------------------------------------------------------------------- # 640x400 80x25 xnuppc-80x25 # 640x480 80x30 xnuppc-80x30 # 720x480 90x30 xnuppc-90x30 # 800x600 100x37 xnuppc-100x37 # 896x600 112x37 xnuppc-112x37 # 1024x640 128x40 xnuppc-128x40 # 1024x768 128x48 xnuppc-128x48 # 1152x768 144x48 xnuppc-144x48 # 1280x1024 160x64 xnuppc-160x64 # 1600x1024 200x64 xnuppc-200x64 # 1600x1200 200x75 xnuppc-200x75 # 2048x1536 256x96 xnuppc-256x96 # # The basic "xnuppc" entry includes no size information, and the # emulator includes no reporting capability, so you'll be at the mercy # of the TTY device (which reports incorrectly on my hardware.) The # color-bold entries do not include size information. # The '+' entries are building blocks xnuppc+basic|Darwin PowerPC console basic capabilities, am, bce, mir, xenl, NQ, it#8, bold=\E[1m, 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>, rmso=\E[m, rmul=\E[m, 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=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=ansi+csr, use=ansi+erase, use=ansi+local, use=vt100+keypad, xnuppc+c|Darwin PowerPC console ANSI color support, colors#8, ncv#32, pairs#64, op=\E[37;40m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, xnuppc+b|Darwin PowerPC console color-bold support, ncv#32, bold=\E[35m, sgr=\E[0%?%p6%t;35%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m, use=xnuppc+basic, xnuppc+f|Darwin PowerPC console fancy color support, ncv#35, sgr=\E[0%?%p6%t;35%;%?%p2%t;36;4%;%?%p1%t;33;44%;%?%p3%t;7%; m, smso=\E[33;44m, smul=\E[36;4m, use=xnuppc+b, xnuppc+f2|Darwin PowerPC console alternate fancy color support, ncv#35, bold=\E[33m, sgr=\E[0%?%p6%t;33%;%?%p2%t;34%;%?%p1%t;31;47%;%?%p3%t;7%;m, smso=\E[31;47m, smul=\E[34m, use=xnuppc+basic, # Building blocks for specific screen sizes xnuppc+80x25|Darwin PowerPC console 80x25 support (640x400 pixels), cols#80, lines#25, xnuppc+80x30|Darwin PowerPC console 80x30 support (640x480 pixels), cols#80, lines#30, xnuppc+90x30|Darwin PowerPC console 90x30 support (720x480 pixels), cols#90, lines#30, xnuppc+100x37|Darwin PowerPC console 100x37 support (800x600 pixels), cols#100, lines#37, xnuppc+112x37|Darwin PowerPC console 112x37 support (896x600 pixels), cols#112, lines#37, xnuppc+128x40|Darwin PowerPC console 128x40 support (1024x640 pixels), cols#128, lines#40, xnuppc+128x48|Darwin PowerPC console 128x48 support (1024x768 pixels), cols#128, lines#48, xnuppc+144x48|Darwin PowerPC console 144x48 support (1152x768 pixels), cols#144, lines#48, xnuppc+160x64|Darwin PowerPC console 160x64 support (1280x1024 pixels), cols#160, lines#64, xnuppc+200x64|Darwin PowerPC console 200x64 support (1600x1024 pixels), cols#200, lines#64, xnuppc+200x75|Darwin PowerPC console 200x75 support (1600x1200 pixels), cols#200, lines#75, xnuppc+256x96|Darwin PowerPC console 256x96 support (2048x1536 pixels), cols#0x100, lines#96, # These are different combinations of the building blocks xnuppc-m|darwin-m|Darwin PowerPC console (monochrome), use=xnuppc+basic, xnuppc|darwin|Darwin PowerPC console (color), use=xnuppc+c, use=xnuppc+basic, xnuppc-m-b|darwin-m-b|Darwin PowerPC console (monochrome w/color-bold), use=xnuppc+b, xnuppc-b|darwin-b|Darwin PowerPC console (color w/color-bold), use=xnuppc+b, use=xnuppc+c, xnuppc-m-f|darwin-m-f|Darwin PowerPC console (fancy monochrome), use=xnuppc+f, xnuppc-f|darwin-f|Darwin PowerPC console (fancy color), use=xnuppc+f, use=xnuppc+c, xnuppc-m-f2|darwin-m-f2|Darwin PowerPC console (alternate fancy monochrome), use=xnuppc+f2, xnuppc-f2|darwin-f2|Darwin PowerPC console (alternate fancy color), use=xnuppc+f2, use=xnuppc+c, # Combinations for specific screen sizes xnuppc-80x25-m|darwin-80x25-m|Darwin PowerPC console (monochrome) 80x25, use=xnuppc+80x25, use=xnuppc+basic, xnuppc-80x25|darwin-80x25|Darwin PowerPC console (color) 80x25, use=xnuppc+c, use=xnuppc+80x25, use=xnuppc+basic, xnuppc-80x30-m|darwin-80x30-m|Darwin PowerPC console (monochrome) 80x30, use=xnuppc+80x30, use=xnuppc+basic, xnuppc-80x30|darwin-80x30|Darwin PowerPC console (color) 80x30, use=xnuppc+c, use=xnuppc+80x30, use=xnuppc+basic, xnuppc-90x30-m|darwin-90x30-m|Darwin PowerPC console (monochrome) 90x30, use=xnuppc+90x30, use=xnuppc+basic, xnuppc-90x30|darwin-90x30|Darwin PowerPC console (color) 90x30, use=xnuppc+c, use=xnuppc+90x30, use=xnuppc+basic, xnuppc-100x37-m|darwin-100x37-m|Darwin PowerPC console (monochrome) 100x37, use=xnuppc+100x37, use=xnuppc+basic, xnuppc-100x37|darwin-100x37|Darwin PowerPC console (color) 100x37, use=xnuppc+c, use=xnuppc+100x37, use=xnuppc+basic, xnuppc-112x37-m|darwin-112x37-m|Darwin PowerPC console (monochrome) 112x37, use=xnuppc+112x37, use=xnuppc+basic, xnuppc-112x37|darwin-112x37|Darwin PowerPC console (color) 112x37, use=xnuppc+c, use=xnuppc+112x37, use=xnuppc+basic, xnuppc-128x40-m|darwin-128x40-m|Darwin PowerPC console (monochrome) 128x40, use=xnuppc+128x40, use=xnuppc+basic, xnuppc-128x40|darwin-128x40|Darwin PowerPC console (color) 128x40, use=xnuppc+c, use=xnuppc+128x40, use=xnuppc+basic, xnuppc-128x48-m|darwin-128x48-m|Darwin PowerPC console (monochrome) 128x48, use=xnuppc+128x48, use=xnuppc+basic, xnuppc-128x48|darwin-128x48|Darwin PowerPC console (color) 128x48, use=xnuppc+c, use=xnuppc+128x48, use=xnuppc+basic, xnuppc-144x48-m|darwin-144x48-m|Darwin PowerPC console (monochrome) 144x48, use=xnuppc+144x48, use=xnuppc+basic, xnuppc-144x48|darwin-144x48|Darwin PowerPC console (color) 144x48, use=xnuppc+c, use=xnuppc+144x48, use=xnuppc+basic, xnuppc-160x64-m|darwin-160x64-m|Darwin PowerPC console (monochrome) 160x64, use=xnuppc+160x64, use=xnuppc+basic, xnuppc-160x64|darwin-160x64|Darwin PowerPC console (color) 160x64, use=xnuppc+c, use=xnuppc+160x64, use=xnuppc+basic, xnuppc-200x64-m|darwin-200x64-m|Darwin PowerPC console (monochrome) 200x64, use=xnuppc+200x64, use=xnuppc+basic, xnuppc-200x64|darwin-200x64|Darwin PowerPC console (color) 200x64, use=xnuppc+c, use=xnuppc+200x64, use=xnuppc+basic, xnuppc-200x75-m|darwin-200x75-m|Darwin PowerPC console (monochrome) 200x75, use=xnuppc+200x75, use=xnuppc+basic, xnuppc-200x75|darwin-200x75|Darwin PowerPC console (color) 200x75, use=xnuppc+c, use=xnuppc+200x75, use=xnuppc+basic, xnuppc-256x96-m|darwin-256x96-m|Darwin PowerPC console (monochrome) 256x96, use=xnuppc+256x96, use=xnuppc+basic, xnuppc-256x96|darwin-256x96|Darwin PowerPC console (color) 256x96, use=xnuppc+c, use=xnuppc+256x96, use=xnuppc+basic, ######## DOS/WINDOWS # CRT is shareware. It implements some xterm features, including mouse. crt|crt-vt220|CRT 2.3 emulating VT220, bce, 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, colors#8, it#8, ncv#22, pairs#64, U8#1, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, 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, rev=\E[7m, ri=\EM, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmpch=\E[10m, rmso=\E[27m, rmul=\E[24m, rs2=\E<\E["p\E[50;6"p\Ec\E[?3l\E]R\E[?1000l, s0ds=\E[10m, s1ds=\E[11m, s2ds=\E[12m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 %;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, smkx=\E[?1h\E=, smpch=\E[11m, smso=\E[7m, smul=\E[4m, vpa=\E[%i%p1%dd, E3=\E[3J, use=ansi+apparrows, use=ansi+csr, use=ansi+erase, use=ansi+idl, use=ansi+local, use=ansi+tabs, use=ansi+rep, use=ecma+index, use=vt220+pcedit, use=xterm+alt1049, use=xterm+sm+1006, use=putty+fnkeys, use=vt102+enq, use=xterm+sl, use=vt100+fnkeys, use=putty+keypad, use=vt220+cvis, use=bracketed+paste, use=putty+cursor, use=ecma+strikeout, # 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, AX, 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, kdch1=\E[3~, 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[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~, kf3=\E[13~, 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~, kf4=\E[14~, 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~, kf5=\E[15~, 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~, kf6=\E[17~, kf60=\E[25;7~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, 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, # Windows Terminal (Preview) # https://github.com/microsoft/terminal # # Windows 10 22H2 (also Windows 11) # Version 1.16.10261.0 # # - 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 # # This has longstanding issues with CR/LF mapping, e.g., # - first reported by Juergen Pfeifer August 13, 2020, with workaround # - Windows Terminal #8303 "Updates to ms-terminal terminal type in terminfo to # 1.4 from 0.2" # - Windows Terminal #6733 "Midnight Commander (mc) output is screwed when # using the 'ms-terminal' as $TERM" # # still seen in testing during May-July 2021. As a workaround, this terminal # description sets cud1 to an escape sequence rather than just \r. # # Using TERM=xterm-256color shows a number of problems. # A few are seen only in the WSL2 environment. # # tack: # - flash does not work. # - video attribute blink does not work. # - video attribute invis does not work in WSL2. # - italics sitm/ritm do not work in WSL2. # - crossed-out smxx/rmxx do not work in WSL2. # - reloading colors via initp interchanges red/blue. # - does not implement OSC 104, which is used for resetting colors in xterm. # - does not support numeric keypad application mode. # - control-modifier (without alt/shift) does not work for special keys. # - meta-key sends escape character rather than acting as a meta key. # # vttest: # - identifies itself as a VT100. # - cursor movement (menu 1) does not work properly, e.g., for wrapping. # - does not support 8-bit controls. # - does not support VT420 rectangles. # - does not support VT420 left/right margins. # - ECMA-48 cursor-movement works. # - does not support X10 mouse, or mouse highlight tracking. # - SGR mouse mode 1006 works. # - any-event mouse mode shows no focus-in/focus-out events. # - alternate screen 47/48 modes do not work, nor do 1047/1048. # - alternate screen 1049 mode works. # - none of the window report/modify operations work. # - none of the DECRPM/DECRQM reporting operations work. # # xterm: # - 256colors2.pl -r, -i and -q options work. # - dynamic colors do not work. # - paste64.pl does not work, i.e., bracketed-paste. # - tcapquery.pl does not work. # # Windows 10 1903 # Version 0.2.1831.0 # # The task manager shows this as "OpenConsole.exe", which differs # from the "Windows Command Processor" used for the command-prompt. # # The settings dialog does not work (unless the end user expects to open # profiles.json in Visual Studio). There is no documentation, of course. # # Testing via an ssh connection, using openssh: # - the program sets TERM to cygwin if the tab is set to PowerShell, # and to xterm-256color if "Legacy". However, in the latter, more tests # fail in vttest, which does not pay attention to TERM. # vttest: # - menu 1 (tests for cursor movement) misbehaves like command-prompt # - primary DA says this is a vanilla VT100 # - does not flush response to primary DA, leaving a ^M on the end when # the PowerShell tab is used. Both the "Legacy" tab and the command-prompt # work properly in this test. # - in the generic VT100 tests, there are problems with character sets # (diamond shows as a double-width character, DEL as two replacement-chars). # - outside of the generic VT100 tests, the program does poorly because most # of the features are missing. # - ECH does not work properly # - a few generic xterm features are supported (set window title), but # others are missing (such as the mouse). # - the cursor visible/invisible works in the PowerShell tab, not in "Legacy" # tack: # - blink, dim, bold, invis, protect do not work # - bce works (but per vttest, with ED, EL, not ECH) # - does not support keypad application mode # - implements most of the xterm modified keys; sometimes modifiers are ignored # or simply incorrect # - sends escape+key rather than implementing meta mode # other: # - color palette can be altered, but OSC 104 for resetting does not work # - crashed with a script used for testing NRCS. # - does not recognize either xterm+direct or xterm+indirect escapes. ms-terminal|Windows10 terminal, npc, cud1=\E[B, kcbt=\E[Z, rmkx=\E[?1l, rmm@, smkx=\E[?1h, smm@, Cr@, Ms@, use=linux+kbs, use=xterm+256color, use=xterm+pcfkeys, use=ansi+rep, use=xterm+sm+1006, use=ecma+index, use=ecma+italics, use=ecma+strikeout, use=xterm-basic, use=xterm+tmux, #### Visual Studio # Visual Studio Code 1.45.0 uses xterm.js 12.8.1 (see https://xtermjs.org/). # # vttest: # - fixes menu 1 problem with wrapping # - supports DECALN # - fixes menu 8 problem with delete-character # - REP, SL/SL work # - keypad application mode still does not work; PF1-PF4 are not assigned. # - DECRQM/DECRPM do not work # - xterm mouse features: # - SGR coordinates work; the other modes do not (see vscode #96058) # - focus-events are not sent # - mouse highlight tracking does not send button event # tack/other: # - little or no change since previous review # # Visual Studio Code 1.35.1 uses xterm.js (see https://xtermjs.org/). # https://code.visualstudio.com/docs/editor/integrated-terminal # # This sets TERM to xterm-256color, which is a little more successful than # Windows Terminal. # # vttest: # - menu 1 (cursor movement) has problems with wrapping # - claims to be a VT100 with AVO, but copies xterm #276's secondary response # - menu 8 (insert/delete char/line) has problem with delete-character # - like Windows Terminal, fails the ECH test: neither supports DECALN # However, the bce test with ECH works. # - does not support keypad application mode # - supports most xterm mode controls (except DEC Locator Events) # - REP, SL/SL do not work, but SD/SU work. # - the alternate-screen tests fail because it does not support DECALN # - window modify/report is not supported # - supports some VT320 presentation reports # tack: # - does not support blinking text # - implements most of the xterm modified keys, with some exceptions: # - pageup/pagedown do not send escapes # - alt cursor left/right send escape-b and escape-f # - sends UTF-8 like xterm for meta mode # other: # - mouse mode is not reset by reset-sequence # - supports italics and dim, but not cross-out or double-underline # - color-palette cannot be changed vscode|xterm.js|Visual Studio Code terminal using xterm.js, npc, kcbt=\E[Z, rmkx=\E[?1l, smkx=\E[?1h, use=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>, rmso=\E[m, rmul=\E[m, 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=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=xterm+alt47, use=ansi+csr, use=ansi+idl, use=ansi+local, 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~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~, 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, # 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~, xterm+noapp|fragment with cursor keys in normal mode, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kend=\E[F, khome=\E[H, xterm+app|fragment with cursor keys in application mode, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kend=\EOF, khome=\EOH, # # The "PC-style" modifier scheme was introduced in xterm patch #94 (1999/3/27) # and revised in xterm patch #167 (2002/8/24). Some other terminal emulators # copied the earlier scheme, as noted in the "use=" clauses in this file. # # The original assignments from patch #94 for cursor-keys had some technical # issues: # # A parameter for a function-key to represent a modifier is just more # bits. But for a cursor-key it may change the behavior of the # application. For instance, emacs decodes the first parameter of a # cursor-key as a repeat count. # # A parameterized string should (really) not begin with SS3 (\EO). # Rather, CSI (\E[) should be used. # # For these reasons, the original assignments were deprecated. For # compatibility reasons, they are still available as a setting of xterm's # modifyCursorKeys resource. These fragments list the modified cursor-keys # that might apply to xterm+pcfkeys with different values of that resource. # # These entries will have warnings when checking with tic because the kri/kind # capabilities duplicate the kUP/kDN extensions. This is intentional, though # not part of the original plan. The changes for xterm patch #206 (2005/11/3) # show that kri/kind were seen much later as part of a set including kLFT/kRIT: # # * modify xterm-new terminfo entry to use capabilities for shifted # scroll forward/reverse as shifted cursor up/down. # # In the 1980s when terminfo was defined, the developers made more of # a distinction between shifted up/down versus shifted left/right since most # terminals can index (scroll up/down), while few can scroll left/right. xterm+pcc3|fragment with modifyCursorKeys:3, kLFT=\E[>1;2D, kRIT=\E[>1;2C, kind=\E[>1;2B, kri=\E[>1;2A, kDN=\E[>1;2B, kDN3=\E[>1;3B, kDN4=\E[>1;4B, kDN5=\E[>1;5B, kDN6=\E[>1;6B, kDN7=\E[>1;7B, kLFT3=\E[>1;3D, kLFT4=\E[>1;4D, kLFT5=\E[>1;5D, kLFT6=\E[>1;6D, kLFT7=\E[>1;7D, kRIT3=\E[>1;3C, kRIT4=\E[>1;4C, kRIT5=\E[>1;5C, kRIT6=\E[>1;6C, kRIT7=\E[>1;7C, kUP=\E[>1;2A, kUP3=\E[>1;3A, kUP4=\E[>1;4A, kUP5=\E[>1;5A, kUP6=\E[>1;6A, kUP7=\E[>1;7A, xterm+pcc2|fragment with modifyCursorKeys:2, kLFT=\E[1;2D, kRIT=\E[1;2C, kind=\E[1;2B, kri=\E[1;2A, kDN=\E[1;2B, kDN3=\E[1;3B, kDN4=\E[1;4B, kDN5=\E[1;5B, kDN6=\E[1;6B, kDN7=\E[1;7B, kLFT3=\E[1;3D, kLFT4=\E[1;4D, kLFT5=\E[1;5D, kLFT6=\E[1;6D, kLFT7=\E[1;7D, kRIT3=\E[1;3C, kRIT4=\E[1;4C, kRIT5=\E[1;5C, kRIT6=\E[1;6C, kRIT7=\E[1;7C, kUP=\E[1;2A, kUP3=\E[1;3A, kUP4=\E[1;4A, kUP5=\E[1;5A, kUP6=\E[1;6A, kUP7=\E[1;7A, xterm+pcc1|fragment with modifyCursorKeys:1, kLFT=\E[2D, kRIT=\E[2C, kind=\E[2B, kri=\E[2A, kDN=\E[2B, kDN3=\E[3B, kDN4=\E[4B, kDN5=\E[5B, kDN6=\E[6B, kDN7=\E[7B, kLFT3=\E[3D, kLFT4=\E[4D, kLFT5=\E[5D, kLFT6=\E[6D, kLFT7=\E[7D, kRIT3=\E[3C, kRIT4=\E[4C, kRIT5=\E[5C, kRIT6=\E[6C, kRIT7=\E[7C, kUP=\E[2A, kUP3=\E[3A, kUP4=\E[4A, kUP5=\E[5A, kUP6=\E[6A, kUP7=\E[7A, xterm+pcc0|fragment with modifyCursorKeys:0, kLFT=\EO2D, kRIT=\EO2C, kind=\EO2B, kri=\EO2A, kDN=\EO2B, kDN3=\EO3B, kDN4=\EO4B, kDN5=\EO5B, kDN6=\EO6B, kDN7=\EO7B, kLFT3=\EO3D, kLFT4=\EO4D, kLFT5=\EO5D, kLFT6=\EO6D, kLFT7=\EO7D, kRIT3=\EO3C, kRIT4=\EO4C, kRIT5=\EO5C, kRIT6=\EO6C, kRIT7=\EO7C, kUP=\EO2A, kUP3=\EO3A, kUP4=\EO4A, kUP5=\EO5A, kUP6=\EO6A, kUP7=\EO7A, # # Here are corresponding fragments from xterm patch #216: # xterm+pcf0|fragment with modifyFunctionKeys:0, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\EO2P, kf14=\EO2Q, kf15=\EO2R, kf16=\EO2S, kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\EO5P, kf26=\EO5Q, kf27=\EO5R, kf28=\EO5S, kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~, kf37=\EO6P, kf38=\EO6Q, kf39=\EO6R, kf4=\EOS, kf40=\EO6S, kf41=\E[15;6~, kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\EO3P, kf5=\E[15~, kf50=\EO3Q, kf51=\EO3R, kf52=\EO3S, kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\EO4P, kf62=\EO4Q, kf63=\EO4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, # xterm+pcf2|fragment with modifyFunctionKeys:2, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R, kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R, kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, # # Chunks from xterm #230: xterm+pce2|fragment with modifyCursorKeys:2 editing-keys, kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, kNXT=\E[6;2~, kPRV=\E[5;2~, kDC3=\E[3;3~, kDC4=\E[3;4~, kDC5=\E[3;5~, kDC6=\E[3;6~, kDC7=\E[3;7~, kEND3=\E[1;3F, kEND4=\E[1;4F, kEND5=\E[1;5F, kEND6=\E[1;6F, kEND7=\E[1;7F, kHOM3=\E[1;3H, kHOM4=\E[1;4H, kHOM5=\E[1;5H, kHOM6=\E[1;6H, kHOM7=\E[1;7H, kIC3=\E[2;3~, kIC4=\E[2;4~, kIC5=\E[2;5~, kIC6=\E[2;6~, kIC7=\E[2;7~, kNXT3=\E[6;3~, kNXT4=\E[6;4~, kNXT5=\E[6;5~, kNXT6=\E[6;6~, kNXT7=\E[6;7~, kPRV3=\E[5;3~, kPRV4=\E[5;4~, kPRV5=\E[5;5~, kPRV6=\E[5;6~, kPRV7=\E[5;7~, use=xterm+edit, xterm+edit|fragment for 6-key editing-keypad, kdch1=\E[3~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, use=xterm+pc+edit, xterm+pc+edit|fragment for pc-style editing keypad, kend=\E[4~, khome=\E[1~, xterm+vt+edit|fragment for VT220-style editing keypad, kfnd=\E[1~, kslt=\E[4~, # These variations for alternate-screen and title-stacking were introduced by # xterm patch #331: xterm+noalt|xterm without altscreen, rmcup@, smcup@, xterm+alt47|X11R4 alternate-screen, rmcup=\E[2J\E[?47l\E8, smcup=\E7\E[?47h, xterm+alt1049|xterm 90 feature, rmcup=\E[?1049l, smcup=\E[?1049h, xterm+titlestack|xterm 251 feature, rmcup=\E[23;0;0t, smcup=\E[22;0;0t, xterm+alt+title|xterm 90 and 251 features combined, rmcup=\E[?1049l\E[23;0;0t, smcup=\E[?1049h\E[22;0;0t, # https://invisible-island.net/xterm/xterm.faq.html#xterm_keypad # # Xterm's emulation of the VT100 numeric keypad on a PC-keyboard runs into the # problem that the keypad layout is different, and that the natural choice for # PF1 is NumLock (which happens to be reserved for other use). To work around # that, PF1-PF4 are emulated via F1-F4, which leaves the "/", "*" and "+" not # directly related to VT100. # # With the VT220 keypad block that uses the 1-9 keys as suggested in # terminfo(5), the other keys can be handled with user-defined capabilities: # # _______________________________________ # | NumLock | / | * | - | # | | $Oo | $Oj | $OS | # |_________|__kpDIV__|__kpMUL__|__kpSUB__| # | 7 8 9 | + | # | $Ow | $Ox | $Oy | $Ok | # |_ka1__K1_|_________|_ka3__K3_| kpADD | # | 4 | 5 | 6 | | # | $Ot | $Ou | $Ov | | # |_________|_kb2__K2_|_________|_________| # | 1 | 2 | 3 | | # | $Oq | $Or | $Os | | # |_kc1__K4_|_________|_kc3__K5_| enter | # | 0 | . | $OM | # | $Op | $On | | # |_______kpZRO_______|__kpDOT__|_kent_@8_| # # ka2, kb1, kb3 and kc2 are extensions, as are the mixed-case names. # There are no termcap equivalents for these extensions. # # kpCMA (comma) is used here for the VT100 keypad, which xterm emulates with # shifted-keypad-plus, though normally that invokes a font-size change. # # Old versions of xterm, e.g., xterm-xfree86, documented \EOE as kb2, which # does not fit into this layout. The extension kp5 fits, but is not visible # to termcap applications. As an alternative, kbeg (which does have a termcap # equivalent) is provided. # xterm+keypad|xterm emulating VT100/VT220 numeric keypad, kbeg=\EOE, kp5=\EOE, kpADD=\EOk, kpCMA=\EOl, kpDIV=\EOo, kpDOT=\EOn, kpMUL=\EOj, kpSUB=\EOm, kpZRO=\EOp, use=vt220+keypad, # # Those chunks use the new-style (the xterm oldFunctionKeys resource is false). # Alternatively, the same scheme with old-style function keys as in xterm-r6 # is shown here (because that is used in mrxvt and mlterm): xterm+r6f2|xterm with oldFunctionKeys and modifyFunctionKeys:2, kf1=\E[11~, kf13=\E[11;2~, kf14=\E[12;2~, kf15=\E[13;2~, kf16=\E[14;2~, kf2=\E[12~, kf25=\E[11;5~, kf26=\E[12;5~, kf27=\E[13;5~, kf28=\E[14;5~, kf3=\E[13~, kf37=\E[11;6~, kf38=\E[12;6~, kf39=\E[13;6~, kf4=\E[14~, kf40=\E[14;6~, kf49=\E[11;3~, kf50=\E[12;3~, kf51=\E[13;3~, kf52=\E[14;3~, kf61=\E[11;4~, kf62=\E[12;4~, kf63=\E[13;4~, use=xterm+pcf2, # xterm+acs|ISO-2022 alternate character-switching for xterm, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, enacs@, rmacs=\E(B, smacs=\E(0, # This chunk is used for building the VT220/Sun/PC keyboard variants. xterm-basic|modern xterm terminal emulator - common, OTbs, am, bce, mir, msgr, xenl, AX, XT, colors#8, cols#80, lines#24, pairs#64, 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, 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, rmacs=\E(B, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m, rs1=\Ec, rs2=\E[!p\E[?3;4l\E[4l\E>, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} %=%t3%e%p1%d%;m, setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} %=%t3%e%p1%d%;m, sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%; %?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, sgr0=\E(B\E[m, smacs=\E(0, smam=\E[?7h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, 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+sgr, use=xterm+kbs, use=xterm+alt+title, use=att610+cvis, 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, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\2335m, bold=\2331m, cbt=\233Z, civis=\233?25l, clear=\233H\2332J, cnorm=\233?25l\233?25h, cr=\r, csr=\233%i%p1%d;%p2%dr, cub=\233%p1%dD, cub1=^H, cud=\233%p1%dB, cud1=\n, cuf=\233%p1%dC, cuf1=\233C, cup=\233%i%p1%d;%p2%dH, cuu=\233%p1%dA, cuu1=\233A, cvvis=\233?12;25h, dch=\233%p1%dP, dch1=\233P, dl=\233%p1%dM, dl1=\233M, ech=\233%p1%dX, ed=\233J, el=\233K, el1=\2331K, flash=\233?5h$<100/>\233?5l, home=\233H, hpa=\233%i%p1%dG, ht=^I, hts=\210, ich=\233%p1%d@, il=\233%p1%dL, il1=\233L, ind=\n, invis=\2338m, is2=\E[62"p\E\sG\233m\233?7h\E>\E7\233?1;3;4;6l\2334l\233r \E8, ka1=\217w, ka3=\217u, kb2=\217y, kbeg=\217E, kc1=\217q, kc3=\217s, kcbt=\233Z, kcub1=\217D, kcud1=\217B, kcuf1=\217C, kcuu1=\217A, kdch1=\2333~, kend=\2334~, kent=\217M, kf1=\23311~, kf10=\23321~, kf11=\23323~, kf12=\23324~, kf13=\23325~, kf14=\23326~, kf15=\23328~, kf16=\23329~, kf17=\23331~, kf18=\23332~, kf19=\23333~, kf2=\23312~, kf20=\23334~, kf3=\23313~, kf4=\23314~, kf5=\23315~, kf6=\23317~, kf7=\23318~, kf8=\23319~, kf9=\23320~, khome=\2331~, kich1=\2332~, kmous=\233M, knp=\2336~, kpp=\2335~, mc0=\233i, mc4=\2334i, mc5=\2335i, meml=\El, memu=\Em, op=\23339;49m, rc=\E8, rev=\2337m, ri=\215, rmacs=\E(B, rmam=\233?7l, rmcup=\233?1049l, rmir=\2334l, rmkx=\233?1l\E>, rmso=\23327m, rmul=\23324m, rs1=\Ec, rs2=\E[62"p\E\sG\233m\233?7h\E>\E7\233?1;3;4;6l\2334l\233r \E8, sc=\E7, setab=\2334%p1%dm, setaf=\2333%p1%dm, setb=\2334%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1 %{6}%=%t3%e%p1%d%;m, setf=\2333%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1 %{6}%=%t3%e%p1%d%;m, sgr=\2330%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? %p7%t;8%;m%?%p9%t\E(0%e\E(B%;, sgr0=\2330m\E(B, smacs=\E(0, smam=\233?7h, smcup=\233?1049h, smir=\2334h, smkx=\233?1h\E=, smso=\2337m, smul=\2334m, tbc=\2333g, u6=\233[%i%d;%dR, u8=\233[?%[;0123456789]c, vpa=\233%i%p1%dd, use=ansi+enq, use=xterm+kbs, # Note: normally xterm supports modified function-keys as described in # XTerm - "Other" modified keys # https://invisible-island.net/xterm/modified-keys.html # # However, xterm-hp, xterm-sco and xterm-sun assume no modifiers. Here is # a simple script which demonstrates these descriptions: # #!/bin/sh # export TERM=xterm-$1 # xterm \ # -kt $1 \ # -fs 16 -fa mono \ # -title $TERM \ # -tn $TERM \ # -xrm '*modifyCursorKeys:-1' \ # -xrm '*modifyFunctionKeys:-1' \ # -e tack # e.g., "foo sun" if the script is named "foo" -TD xterm-hp|xterm with hpterm function keys, kclr=\EJ, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EP, kend=\EF, khome=\Eh, kich1=\EQ, knp=\ES, kpp=\ET, use=hp+pfk-cr, use=xterm+nofkeys, use=xterm+nopcfkeys, xterm-sco|xterm with SCO function keys, kbeg=\E[E, 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, cols#80, it#8, lines#24, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, clear=\EH\EJ, cr=\r, cub1=\ED, cud1=\EB, cuf1=\EC, cup=\EY%p1%' '%+%c%p2%' '%+%c, cuu1=\EA, ed=\EJ, el=\EK, home=\EH, ht=^I, ind=\n, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, nel=\r\n, ri=\EI, rmacs=\EG, smacs=\EF, use=xterm+kbs, use=vt52+keypad, xterm-noapp|xterm with cursor keys in normal mode, rmcup@, rmkx=\E>, smcup@, smkx=\E=, use=xterm+noapp, use=xterm, xterm-24|vs100|xterms|xterm terminal emulator 24-line (X Window System), lines#24, use=xterm-old, # This is xterm for ncurses. xterm|xterm terminal emulator (X Window System), use=xterm-new, # This entry assumes that xterm's handling of VT100 SI/SO is disabled by # setting the vt100Graphics resource to false. xterm-utf8|xterm with no VT100 line-drawing in UTF-8 mode, U8#1, use=xterm, # These building-blocks allow access to the X titlebar and icon name as a # status line. There are a few problems in using them in entries: # # a) tsl should have a parameter to denote the column on which to transfer to # the status line. # b) the "0" code for xterm updates both icon-title and window title. Some # window managers such as twm (and possibly window managers descended from # it such as tvtwm, ctwm, and vtwm) track windows by icon-name. Thus, you # don't want to mess with icon-name when using those window managers. # c) fsl ends the escape sequence begun by tsl. Printable characters between # those (probably) will appear in the window title. Nonprintable characters # may cause the escape sequence to end with an error. # d) the BEL (^G or \007) used in the original title-as-statusline came from # David J. MacKenzie's "pseudo-color" entry in 20 Apr 1995. At that time # xterm used BEL as the string-terminator rather than ST (\E\\). Either # BEL or ST has worked since xterm patch #28 in 1996, but most uses of # this feature have been embedded in shell scripts. # # But that issue regarding the parameter for tsl means that applications may # not rely on it. The SVr4 documentation says tsl will "move to status line, # column #1". At the point in time when ESR added DJM's "pseudo-color" entry # with the split-up escape sequence for tsl/fsl, there were 65 entries using # tsl: # 32 used a parameter, matching the documentation (including x10term). # 21 used a parameterless control, exiting from the status line on ^M. # 6 used parameterless controls for tsl and fsl # 6 used a split-up escape sequence, e.g., the same approach. # # The extension "TS" is preferable, because it does not accept a parameter. # However, if you are using a non-extended terminfo, "TS" is not visible. xterm+sl|access X title line and icon name, hs, dsl=\E]0;\007, fsl=^G, tsl=\E]0;, TS=\E]0;, xterm+sl-twm|access X title line (pacify twm-descended window managers), hs, dsl=\E]2;\007, fsl=^G, tsl=\E]2;, TS=\E]2;, xterm+sl-alt|alternate access X title line, hs, dsl=\E]2;\E\\, fsl=\E\\, tsl=\E]2;, TS=\E]2;, # In contrast, this block can be used for a DEC VT320 and up. There are two # controls used. # # DECSASD (select active status display) # \E[0$} Main display # \E[1$} Status line # # DECSSDT (select status line type) # \E[0$~ No status line # \E[1$~ Indicator status line # \E[2$~ Host-writable status line # # The building block assumes that the terminal always shows something at the # status line (either the indicator, or status line). That is because if no # status line is used, then the terminal makes that line part of the user # window, changing its size without notice. # # Because there is no "esl" (enable status line) capability, the "tsl" # capability ensures that the status line is host-writable. A DEC terminal # will clear the status line when changing from indicator to host-writable # mode. # # Once on the status line, the row part of cursor addressing is ignored. Since # tsl expects a parameter (to specify the column), the shortest addressing that # can be used for this purpose is HPA, e.g., \E[5d to go to column 5. # dec+sl|DEC VTxx status line, eslok, hs, dsl=\E[0$~, fsl=\E[0$}, tsl=\E[2$~\E[1$}\E[%i%p1%d`, # # The following xterm variants don't depend on your base version # # xterm with bold instead of underline xterm-bold|xterm terminal emulator (X11R6 Window System) standout w/bold, sgr=%?%p9%t\016%e\017%;B\E[0%?%p6%t;1%;%?%p2%t;1%;%?%p1%p3%| %t;7%;m, smso=\E[7m, smul=\E[1m, use=xterm-old, # See the note on ICH/ICH1 VERSUS RMIR/SMIR near the end of file xterm-nic|xterm with ich/ich1 suppressed for non-curses programs, ich@, ich1@, use=xterm, # From: Mark Sheppard , 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, rmso=\E[m, rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 %;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smcup=\E@0\E[?4s\E[?4h\E@1, smso=\E[7m, tbc=\E[3g, use=ansi+apparrows, use=ansi+csr, use=ansi+cup, use=ansi+erase, use=ansi+idl, use=ansi+local, use=decid+cpr, use=vt100+fnkeys, xtermc|xterm terminal emulator (color), colors#8, ncv#7, pairs#64, op=\E[100m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} %=%t3%e%p1%d%;m, setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} %=%t3%e%p1%d%;m, use=xtermm, # From: David J. MacKenzie 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, 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, 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@, blink=\E[5m, dim=\E[2m, ech=\E[%p1%dX, flash=\E[?5h$<100/>\E[?5l, hpa=\E[%i%p1%dG, invis=\E[8m, kend=\E[4~, kf1@, kf10@, kf11@, kf12@, kf13@, kf14@, kf15@, kf16@, kf17@, kf18@, kf19@, kf2@, kf20@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, kf9@, kfnd@, khome=\E[1~, kslt@, rmam=\E[?7l, rmso=\E[27m, rmul=\E[24m, rs1=\Ec, rs2=\E7\E[r\E8\E[m\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h, sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, sgr0=\E[0m\017, smam=\E[?7h, vpa=\E[%i%p1%dd, use=ecma+index, use=xterm+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, am, bce, eo, mir, msgr, xenl, xon, XT, cols#80, it#8, lines#24, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0, flash=\E[?5h$<100/>\E[?5l, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ind=\n, is1=\E[?47l\E=\E[?1l, is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, kbs=^H, kcbt=\E[Z, kmous=\E[M, rev=\E[7m, ri=\EM, rmacs=^O, rmir=\E[4l, rmkx=\E>, rmso=\E[27m, rmul=\E[24m, rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[? 25h, s0ds=\E(B, s1ds=\E(0, sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%? %p9%t\016%e\017%;, sgr0=\E[0m\017, smacs=^N, smir=\E[4h, smkx=\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=ansi+csr, use=ansi+idl, use=ansi+local, use=xterm+alt47, use=vt100+enq, use=rxvt+pcfkeys, use=vt220+cvis, use=vt220+keypad, # Key Codes from rxvt reference: # # Note: Shift + F1-F10 generates F11-F20 # # For the keypad, use Shift to temporarily override Application-Keypad # setting use Num_Lock to toggle Application-Keypad setting if Num_Lock # is off, escape sequences toggle Application-Keypad setting. # Also note that values of Home, End, Delete may have been compiled # differently on your system. # # Normal Shift Control Ctrl+Shift # Tab ^I ESC [ Z ^I ESC [ Z # BackSpace ^H ^? ^? ^? # Find ESC [ 1 ~ ESC [ 1 $ ESC [ 1 ^ ESC [ 1 @ # Insert ESC [ 2 ~ paste ESC [ 2 ^ ESC [ 2 @ # Execute ESC [ 3 ~ ESC [ 3 $ ESC [ 3 ^ ESC [ 3 @ # Select ESC [ 4 ~ ESC [ 4 $ ESC [ 4 ^ ESC [ 4 @ # Prior ESC [ 5 ~ scroll-up ESC [ 5 ^ ESC [ 5 @ # Next ESC [ 6 ~ scroll-down ESC [ 6 ^ ESC [ 6 @ # Home ESC [ 7 ~ ESC [ 7 $ ESC [ 7 ^ ESC [ 7 @ # End ESC [ 8 ~ ESC [ 8 $ ESC [ 8 ^ ESC [ 8 @ # Delete ESC [ 3 ~ ESC [ 3 $ ESC [ 3 ^ ESC [ 3 @ # F1 ESC [ 11 ~ ESC [ 23 ~ ESC [ 11 ^ ESC [ 23 ^ # F2 ESC [ 12 ~ ESC [ 24 ~ ESC [ 12 ^ ESC [ 24 ^ # F3 ESC [ 13 ~ ESC [ 25 ~ ESC [ 13 ^ ESC [ 25 ^ # F4 ESC [ 14 ~ ESC [ 26 ~ ESC [ 14 ^ ESC [ 26 ^ # F5 ESC [ 15 ~ ESC [ 28 ~ ESC [ 15 ^ ESC [ 28 ^ # F6 ESC [ 17 ~ ESC [ 29 ~ ESC [ 17 ^ ESC [ 29 ^ # F7 ESC [ 18 ~ ESC [ 31 ~ ESC [ 18 ^ ESC [ 31 ^ # F8 ESC [ 19 ~ ESC [ 32 ~ ESC [ 19 ^ ESC [ 32 ^ # F9 ESC [ 20 ~ ESC [ 33 ~ ESC [ 20 ^ ESC [ 33 ^ # F10 ESC [ 21 ~ ESC [ 34 ~ ESC [ 21 ^ ESC [ 34 ^ # F11 ESC [ 23 ~ ESC [ 23 $ ESC [ 23 ^ ESC [ 23 @ # F12 ESC [ 24 ~ ESC [ 24 $ ESC [ 24 ^ ESC [ 24 @ # F13 ESC [ 25 ~ ESC [ 25 $ ESC [ 25 ^ ESC [ 25 @ # F14 ESC [ 26 ~ ESC [ 26 $ ESC [ 26 ^ ESC [ 26 @ # F15 (Help) ESC [ 28 ~ ESC [ 28 $ ESC [ 28 ^ ESC [ 28 @ # F16 (Menu) ESC [ 29 ~ ESC [ 29 $ ESC [ 29 ^ ESC [ 29 @ # F17 ESC [ 31 ~ ESC [ 31 $ ESC [ 31 ^ ESC [ 31 @ # F18 ESC [ 32 ~ ESC [ 32 $ ESC [ 32 ^ ESC [ 32 @ # F19 ESC [ 33 ~ ESC [ 33 $ ESC [ 33 ^ ESC [ 33 @ # F20 ESC [ 34 ~ ESC [ 34 $ ESC [ 34 ^ ESC [ 34 @ # # Application # Up ESC [ A ESC [ a ESC O a ESC O A # Down ESC [ B ESC [ b ESC O b ESC O B # Right ESC [ C ESC [ c ESC O c ESC O C # Left ESC [ D ESC [ d ESC O d ESC O D # KP_Enter ^M ESC O M # KP_F1 ESC O P ESC O P # KP_F2 ESC O Q ESC O Q # KP_F3 ESC O R ESC O R # KP_F4 ESC O S ESC O S # XK_KP_Multiply * ESC O j # XK_KP_Add + ESC O k # XK_KP_Separator , ESC O l # XK_KP_Subtract - ESC O m # XK_KP_Decimal . ESC O n # XK_KP_Divide / ESC O o # XK_KP_0 0 ESC O p # XK_KP_1 1 ESC O q # XK_KP_2 2 ESC O r # XK_KP_3 3 ESC O s # XK_KP_4 4 ESC O t # XK_KP_5 5 ESC O u # XK_KP_6 6 ESC O v # XK_KP_7 7 ESC O w # XK_KP_8 8 ESC O x # XK_KP_9 9 ESC O y # # The source-code for rxvt actually defines mappings for F21-F35, using # "ESC [ 35 ~" to "ESC [ 49 ~". Keyboards with more than 12 function keys # are rare, so this entry uses the shift- and control-modifiers as in # xterm+pcfkeys to define keys past F12. # # kIC is normally not used, since rxvt performs a paste for that (shifted # insert), unless private mode 35 is set. # # kDN, kDN5, kDN6, etc are extensions based on the names from xterm+pcfkeys -TD # Removed kDN6, etc (control+shift) since rxvt does not implement this -TD rxvt+pcfkeys|rxvt fragment for PC-style fkeys, kDC=\E[3$, kEND=\E[8$, kHOM=\E[7$, kIC=\E[2$, kLFT=\E[d, kNXT=\E[6$, kPRV=\E[5$, kRIT=\E[c, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kel=\E[8\^, kend=\E[8~, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, kf20=\E[34~, kf21=\E[23$, kf22=\E[24$, kf23=\E[11\^, kf24=\E[12\^, kf25=\E[13\^, kf26=\E[14\^, kf27=\E[15\^, kf28=\E[17\^, kf29=\E[18\^, kf3=\E[13~, kf30=\E[19\^, kf31=\E[20\^, kf32=\E[21\^, kf33=\E[23\^, kf34=\E[24\^, kf35=\E[25\^, kf36=\E[26\^, kf37=\E[28\^, kf38=\E[29\^, kf39=\E[31\^, kf4=\E[14~, kf40=\E[32\^, kf41=\E[33\^, kf42=\E[34\^, kf43=\E[23@, kf44=\E[24@, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[7~, kind=\E[a, kri=\E[b, kDC5=\E[3\^, kDC6=\E[3@, kDN=\E[b, kDN5=\EOb, kEND5=\E[8\^, kEND6=\E[8@, kHOM5=\E[7\^, kHOM6=\E[7@, kIC5=\E[2\^, kIC6=\E[2@, kLFT5=\EOd, kNXT5=\E[6\^, kNXT6=\E[6@, kPRV5=\E[5\^, kPRV6=\E[5@, kRIT5=\EOc, kUP=\E[a, kUP5=\EOa, use=vt220+vtedit, # rxvt was originally "xvt", first announced in April 1993: # http://www.krsaborio.net/linux-desktops/research/1993/0416.html #------------------------------------------------------------------------------ # Article: 567 of comp.os.linux.announce # Path: pavo.csi.cam.ac.uk!warwick!uknet!pipex!uunet!zaphod.mps.ohio-state.edu! # caen!batcomputer!theory.TC.Cornell.EDU!mdw # From: nation@rocket.sanders.com (Robert Nation) # Newsgroups: comp.os.linux.announce # Subject: xvt upload # Date: 16 Apr 1993 18:13:07 GMT # Organization: Cornell Theory Center # Lines: 13 # Approved: linux-announce@tc.cornell.edu (Matt Welsh) # Message-ID: <1qmsvj$pvj@fitz.TC.Cornell.EDU> # NNTP-Posting-Host: theory.tc.cornell.edu # Keywords: xvt, xterm, Xwindows # Originator: mdw@theory.TC.Cornell.EDU # # Rxvt has been uploaded to /pub/Linux/Incoming/rxvt.tar.z and # rxvt.README on sunsite.unc.edu. # # Xvt is an xterm replacement which uses a little less memory, and is # suitable for use on machines with small memories. Tek4010 support # is removed. # # Modifications were made by Rob Nation (nation@rocket.sanders.lockheed.com) # to make it a little more compact, and to add and remove certain features. # # # -- # Send submissions for comp.os.linux.announce to: linux-announce@tc.cornell.edu #------------------------------------------------------------------------------ # # Though its change-log does not mention this, John Davis has stated that he # was the author of the changes to use the bce ("new color model") which was # incorporated into rxvt 2.11 (June 15, 1995). The change-log does not give # dates, nor give developer's names. Initial color support was added for rxvt # "2.0", which was sometime in 1994. # # rxvt had usable color support with 2.16 (April 2, 1996), with some help by my # work on vttest, as well as bug reports to Mark Olesen. For instance, the fix # mentioned here # https://web.archive.org/web/20141016124430/http://web.archiveorange.com/archive/v/6ETvLb5wHtbbzCaS4S9J # was from one of my bug-reports -TD # # While the color model both for xterm and rxvt was based on Linux console, # Olesen (or possibly Davis) diverged in one respect from Linux's bce color # behavior: inserting/deleting characters does not fill the newly empty cell # with the default background color. rxvt|rxvt-color|rxvt terminal emulator (X Window System), ncv@, hpa=\E[%i%p1%dG, kf0=\E[21~, sgr0=\E[m\017, vpa=\E[%i%p1%dd, use=rxvt-basic, use=ecma+color, rxvt-256color|rxvt 2.7.9 with xterm 256-colors, use=xterm+256color, use=rxvt, rxvt-88color|rxvt 2.7.9 with xterm 88-colors, use=xterm+88color, use=rxvt, rxvt-xpm|rxvt terminal emulator (X Window System with xpm), use=rxvt, rxvt-cygwin|rxvt terminal emulator (X Window System) on cygwin, acsc=+\257\,\256-\^0\333`\004a\261f\370g\361h\260j\331k \277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w \302x\263y\363z\362{\343|\330}\234~\376, use=rxvt, rxvt-cygwin-native|rxvt terminal emulator (native MS Window System port) on cygwin, acsc=+\257\,\256-\^0\333`\004a\261f\370g\361h\260j\331k \277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w \302x\263y\363z\362{\343|\330~\376, use=rxvt-cygwin, # This variant is supposed to work with rxvt 2.7.7 when compiled with # NO_BRIGHTCOLOR defined. rxvt needs more work... rxvt-16color|rxvt with 16 colors like aixterm, ncv#32, use=ibm+16color, use=rxvt, #### MRXVT # mrxvt 0.5.4 # # mrxvt is based on rxvt 2.7.11, but has by default XTERM_FKEYS defined, which # makes its function-keys different from other flavors of rxvt -TD # # Testing with tack: # + made custom description (below) to work, though it sets TERM=xterm. # # Testing with vttest: # + While "based on" rxvt, some of the basic functionality is broken. The # window collapses to a single line when running several of the screens # in vttest, e.g., the tests for cursor movement, screen features, # double-sized characters. # + The VT52 test works properly, but this is an exception. Due to the # other bug(s) most of vttest is untestable. # + the color test using ECH shows a gap in the bce model, like rxvt. # # Testing with xterm "vttest" scripts: # + resize.pl does not work because mrxvt does implement CSI 18 t # (not in rxvt, but not documented by mrxvt) but not CSI 19 t. # + none of the "dynamic colors" (OSC colors) scripts work. mrxvt|multitabbed rxvt, 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), am, bce, bw, eo, mc5i, mir, msgr, xenl, xon, XT, btns#5, cols#80, it#8, lines#24, lm#0, ncv@, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r, 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, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, ind=\n, is1=\E[?47l\E>\E[?1l, is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, kNXT@, kPRV@, ka1=\E[7~, ka3=\E[5~, kb2=\EOu, kbeg=\EOu, kbs=^H, kc1=\E[8~, kc3=\E[6~, kent=\EOM, khlp=\E[28~, kmous=\E[M, mc4=\E[4i, mc5=\E[5i, rev=\E[7m, ri=\EM, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmkx=, rmso=\E[27m, rmul=\E[24m, rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[? 25h, sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 %;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, smkx=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, vpa=\E[%i%p1%dd, use=ansi+csr, use=ansi+idl, use=ansi+local, use=xterm+alt47, use=vt100+enq, use=rxvt+pcfkeys, use=ecma+color, use=vt220+cvis, Eterm-256color|Eterm with xterm 256-colors, use=xterm+256color, use=Eterm, Eterm-88color|Eterm with 88 colors, use=xterm+88color, use=Eterm, #### ATERM # Based on rxvt 2.4.8, it has a few differences in key bindings aterm|AfterStep terminal, XT, kbs=^?, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, use=rxvt, #### XITERM # xiterm 0.5-5.2 # This is not based on xterm's source... # vttest shows several problems with keyboard, cursor-movements. # see also https://invisible-island.net/xterm/xterm.faq.html#bug_xiterm xiterm|internationalized terminal emulator for X, km@, 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, am, km, mir, msgr, xenl, xon, colors#8, cols#80, it#8, lines#24, pairs#64, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r, 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$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, ind=\n, kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, op=\E[100m, rev=\E[7m, ri=\EM, rmacs=^O, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, rs2=\E>\E[1;3;4;5;6l\E[?7h\E[100m\E[m\E[r\E[2J\E[H, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 %;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=ansi+csr, use=ansi+idl, use=ansi+local, use=xterm+alt47, use=vt100+fnkeys, 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, bold=\E[1m, 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, smso=\E[7m, smul=\E[4m, vpa=\E[%i%p1%dd, use=ansi+erase, use=ansi+idc1, use=ansi+idl, use=ansi+local, use=ansi+sgr, 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, bold=\E[1m, 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=, smso=\E[7m, smul=\E[4m, 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+sgr, 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, ccc, initc=\E]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%* %{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, kcbt@, kent@, oc=\E]104\007, Ms=\E]52;%p1%s;%p2%s\007, kDN3=\E[1;3B, kDN5=\E[1;5B, kLFT3=\E[1;3D, kLFT5=\E[1;5D, kNXT3=\E[6;3~, kNXT5=\E[6;5~, kPRV3=\E[5;3~, kPRV5=\E[5;5~, kRIT3=\E[1;3C, kRIT5=\E[1;5C, kUP3=\E[1;3A, kUP5=\E[1;5A, use=ecma+strikeout, use=st-0.6, # st-0.4.1 # # This version uses a table which supports a single modifier (a subset of # xterm's keys, using the same scheme). Because it supports only a single # modifier in this table, function keys f36-f48 are normally unavailable # because they are assigned to modifier-4. # # The program assigns TERM to match the program name (the upstream source says # "st", but Debian renames it to "stterm"). # # The source includes two entries which are not useful here: # st-meta| simpleterm with meta key, # st-meta-256color| simpleterm with meta key and 256 colors, # because st's notion of "meta" does not correspond to the terminfo definition. # Rather, it acts like xterm - when the meta feature is disabled. # # Removed invis -TD # Added eo, removed ul -TD # # Reviewed st 0.5: # implements control-modifier, but not control-shift for special keys # implements alt-modifier, but not alt-shift for special keys # # Reviewed st 0.6: # http://git.suckless.org/st/log/st.info # Tmux unofficial extensions, see TERMINFO EXTENSIONS in tmux(1) # still has no function keys past kf36 (no combinations of modifiers) # no application keypad mode, e.g, kent. st-0.6|simpleterm 0.6, am, bce, mir, msgr, npc, xenl, XT, colors#8, cols#80, lines#24, pairs#64, acsc=+C\,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyy zz{{||}}~~, 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, enacs=\E)0, flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, ich=\E[%p1%d@, ind=\n, 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, kent=\EOM, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R, kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R, kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kil1=\E[2;5~, kind=\E[1;2B, kmous=\E[M, kri=\E[1;2A, krmir=\E[2;2~, mc0=\E[i, mc4=\E[4i, mc5=\E[5i, op=\E[39;49m, 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, sgr0=\E[0m, smacs=\E(0, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, 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+sgr, use=vt220+pcedit, use=ecma+index, use=xterm+alt1049, use=vt220+cvis, use=xterm+sl, use=ecma+italics, use=ecma+strikeout, use=bracketed+paste, # # st-0.1.1 # # Note: the original terminfo description uses leading blank to persuade # ncurses to use "st" as its name. Proper fix for that is to use "st" as an # alias. # # Reading the code shows it should work for aixterm 16-colors # - added st-16color # # Using tack: # - set eo (erase-overstrike) # - set xenl # - tbc doesn't work # - hts works # - cbt doesn't work # - shifted cursor-keys send sequences like rxvt # - sgr referred to unimplemented "invis" mode. # Fixes: add eo and xenl per tack, remove nonworking cbt, hts and tbc, invis simpleterm|old-st|simpleterm 0.1.1, am, eo, mir, msgr, ul, xenl, colors#8, cols#80, it#8, lines#24, ncv#3, pairs#64, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r, 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~, op=\E[37;40m, rev=\E[7m, rmacs=\E(B, rmso=\E[m, rmul=\E[m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%| %t;7%;m, sgr0=\E[0m, smacs=\E(0, smso=\E[7m, smul=\E[4m, use=ansi+arrows, use=ansi+csr, use=ansi+idl, use=vt220+cvis, use=ecma+index, st-16color|stterm-16color|simpleterm with 16-colors, use=ibm+16color, use=st, # Tested with st 0.8.2 # The issue with the titlebar is fixed, though st is very slow. # In st 0.7, 256 colors "works", but when running xterm's test-scripts, some # garbage is shown in the titlebar. # # terminal wants to use TERM=stterm-256color, but that is longer than 14 # characters, making the choice nonportable. st-256color|stterm-256color|simpleterm with 256 colors, use=xterm+256color, use=st, #### TERMINATOR # https://github.com/software-jessies-org/jessies/wiki/Terminator # # Tested using the Debian package org.jessies.terminator 6.104.3256 on 64-bit # Debian/current -TD (2011/8/20) # # There were some packaging problems: # a) using Java, the program starts off using 50Mb, and climbs from there, # up to 114Mb after testing (no scrollback). # b) it insists on reinstalling its terminal description in $HOME/.terminfo # (two copies, just in case the host happens to be Mac OS X). # I deleted this after testing with tack. # # Issues/features found with tack: # a) tbc does not work (implying that hts also is broken). # Comparing with the tabs utility shows a problem with the last tabstop on # a line. # b) has xterm-style shifted function-key strings # meta also is used, but control is ignored. # c) has xterm-style modifiers for cursor keys (shift, control, shift+control, # meta) # d) some combinations of shift/control send xterm-style sequences for # insert/delete/home/end. # e) numeric keypad sends only numbers (compare with vttest). # f) meta mode (km) is not implemented. # # Issues found with ncurses test-program: # a) bce is inconsistently implemented # b) widths of Unicode values above 256 do not always agree with wcwidth. # # Checked with vttest, found low degree of compatibility there. # # Checked with xterm's scripts, found that the 256-color palette is fixed. # # Fixes: # a) add sgr string # b) corrected sgr0 to reset alternate character set # c) modified smacs/rmacs to use SCS rather than SI/SO # d) removed bce # e) removed km # # Revisiting in May 2019, the Debian package was no longer available, and a # developer-provided ".deb" does not work. However, a usable Windows ".msi" # (which relies upon Cygwin) can be tested. The developers provide a terminfo, # but some of the features it lists do not work reliably (bce, italics, invis). # # tack: # tbc fails # invis attribute fails # key-definitions could be expanded, with some work: # + supports xterm-style cursor key-modifiers for shift # + supports xterm-style function key-modifiers for shift,control,alt # + supports xterm-style editing key-modifiers for shift,control,alt # (kbs=^?) # ncurses test-program: # "C" menu shows that bce implementation is incomplete # italics did not work # dim worked once in tack, but not in ncurses test-program # "F" thick-line characters do not display # vttest: # terminal does not respond to 80/132-column switching # wrapping at the right margin is erratic # there are several problems in the cursor-movements and screen-features # no VT52, no double-sized characters # Device attributes response says it is a vanilla VT100 # does not respond to xterm mouse controls # alternate screen tests do not fill the screen, return wrong position # window modify/report operations do not work # miscellaneous ISO-6429 tests, e.g., REP, do not work # CBT, CHT, HPR, CNL,CPL, VPR do not work # # removed the cancel for "hs", removed cbt, invis, corrected sgr -TD # use xterm+256setaf, etc -TD terminator|Terminator no line wrap, bce, eo, mir, msgr, xenl, xon, cols#80, it#8, lines#24, lm#0, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bold=\E[1m, clear=\E[H\E[2J, cr=\r, 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.8.2 # # This identifies as a VT220 with 4=sixel and 22=color, however: # tack: # bell does not work # status-line does not work because foot does not set the window title # sends escape when meta key is used, whether or not smm/rmm enabled # vttest: # wrap-test fails # no application-mode for numeric keypad (unless private mode 1035 is set) # no NRCS # no VT52 # no SRM # protected areas do not work # SU/SD work, SL/SR do not # DECRPM responds, but not the corresponding ANSI reports. # otherwise few reports, except cursor-position and mouse and some dtterm # VT520 cursor-movement works, except for left/right margins # supports xterm/DECSCUSR, though default case in vttest does not blink # Send: <27> [ 0 <32> q # Text: The cursor should be a blinking rectangle # partial support for xterm mouse any-event mode and button-event mode: # + does not report focus-in/focus-out # + does not report buttons 6/7 # alternate-screen works foot|foot terminal emulator, oc=\E]104\E\\, use=xterm+256color2, use=foot+base, foot-direct|foot with direct color indexing, use=xterm+direct, use=foot+base, foot+base|foot base fragment, am, bce, bw, mir, msgr, npc, xenl, AX, XT, cols#80, it#8, lines#24, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, dim=\E[2m, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, flash=\E]555\E\\, ind=\n, is2=\E[!p\E[4l\E>, kbs=^?, kcbt=\E[Z, oc=\E]104\E\\, op=\E[39;49m, ri=\EM, rmacs=\E(B, rmam=\E[?7l, rmkx=\E[?1l\E>, 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, smacs=\E(0, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, E3=\E[3J, use=att610+cvis, use=ansi+csr, use=ansi+cup, use=ansi+enq, use=ansi+local, use=ansi+idc, use=ansi+idl, use=ansi+rca2, use=ansi+rep, use=ansi+tabs, use=ansi+sgr, use=ecma+index, use=ecma+italics, use=ecma+strikeout, use=xterm+alt+title, use=xterm+pcfkeys, use=xterm+sm+1006, use=xterm+tmux2, use=xterm+sl-alt, use=bracketed+paste, 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 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." # # 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 # + 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, km@, xenl@, cvvis@, rmkx=\E[?1l, rmm@, smkx=\E[?1h, smm@, use=xterm-256color, #### 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, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, 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, rmacs=\E(B, 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, smacs=\E(0, 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+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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\EE, rmso=\Eb^D, rmul=\Eb^A, smso=\Ea^D, smul=\Ea^A, # (vremote: removed obsolete ":nl@:" -- esr) vremote|virtual remote terminal, am@, cols#79, use=cbunix, pty|4bsd pseudo teletype, cup=\EG%p1%{32}%+%c%p2%{32}%+%c, rmso=\Eb$, rmul=\Eb!, smso=\Ea$, smul=\Ea!, use=cbunix, #### Emacs # https://www.emacswiki.org/emacs/AnsiTerm # https://github.com/emacs-mirror/emacs/blob/master/lisp/term.el # # The codes supported by the term.el terminal emulation in GNU Emacs 19.30 eterm|GNU Emacs term.el terminal emulation, am, mir, xenl, cols#80, lines#24, bel=^G, bold=\E[1m, 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, colors#8, it#8, ncv#13, pairs#64, bold=\E[1m, cud1=\n, ht=^I, ind=\n, op=\E[39;49m, rmul=\E[24m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[m, smul=\E[4m, use=ecma+italics, #### Screen # Entries for use by the `screen' program by Juergen Weigert, # Michael Schroeder, Oliver Laumann. The screen and # screen-w entries came with version 3.7.1. The screen2 and screen3 entries # come from University of Wisconsin and may be older. # (screen: added on ANSI model -- esr) # # 'screen' defines extensions to termcap. Some are used in its terminal # description: # G0 (bool) Terminal can deal with ISO 2022 font selection sequences. # AX (bool) Does understand ANSI set default fg/bg color # (\E[39m / \E[49m). # S0 (str) Switch charset 'G0' to the specified charset. # E0 (str) Switch charset 'G0' back to standard charset. # # Initially tested with screen 3.09.08 # # According to its manual page # # Screen is a full-screen window manager that multiplexes a physical # terminal between several processes (typically interactive shells). Each # virtual terminal provides the functions of a DEC VT100 terminal and, in # addition, several control functions from the ISO 6429 (ECMA 48, ANSI # X3.64) and ISO 2022 standards (e.g. insert/delete line and support for # multiple character sets). # # However, there is a design error in its support for video highlights. The # program uses a table (rendlist) which equates the SGR codes to terminal # capabilities. That, and color-decoding are hardcoded in screen; its behavior # is modified only by the presence or absence of the corresponding capabilities. # Not by their values. # # If screen sets the TERMCAP variable, it uses hardcoded strings which # correspond to the rendlist table. # # The table gives this information: # # SGR capability # --- --------- # 1 bold # 2 dim # 3 standout # 4 underline # 5 blink # - (unused 6) # 7 reverse # - (unused 8-21) # 22 reset bold, standout and dim # 23 reset standout # 24 reset underline # 25 reset blink # - (unused 26) # 27 reset reverse # # ECMA-48 differs from this: 3 and 23 set and reset italics, respectively. # ECMA-48 does not define "standout" - that is a termcap/terminfo abstraction. # Without some redesign of screen, it is not possible to extend the set of # capabilities. Substitution would be possible, e.g., sending italics in # place of underline. # # Because screen uses hard-coded parsing, it does not check if two capabilities # use the same value. For example, changing standout to be the same as any of # the other capabilities will confuse screen. Curses applications which use # sgr are not impacted (because that usually resets all capabilities before # setting any), but termcap applications do not use sgr -TD # # The "screen" entry should use ecma+index rather than just indn, but tmux # defaults to using "screen". For background, screen supported ecma+index # since 1994 (i.e., screen 3.0.5), stating that it was an obscure code used by # the (Siemens Nixdorf) 97801 terminal. It was not shown in the termcap or # terminfo entries (which list about 60% of the control sequences). screen-base|VT 100/ANSI X3.64 virtual terminal (base), OTbs, OTpt, am, km, mir, msgr, xenl, G0, cols#80, lines#24, ncv@, U8#1, acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy yzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l, cnorm=\E[34h\E[?25h, cr=\r, 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, enacs=\E(B\E)0, flash=\Eg, home=\E[H, hpa=\E[%i%p1%dG, ich=\E[%p1%d@, ind=\n, 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, rmacs=^O, 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, smacs=^N, 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, 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf0=\E~, kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, kf9=\E0I, khome=\EH, nel=\r\n, rc=\E8, ri=\EM, 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, # (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, am, eo, mir, msgr, xenl, AX, colors#8, cols#80, it#8, lines#24, ncv@, pairs#64, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, ind=\n, is1=\E[?47l\E=\E[?1l, is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, kDC=\E[3$, kEND=\E[8$, kHOM=\E[7$, kIC=\E[2$, kLFT=\E[d, kNXT=\E[6$, kPRV=\E[5$, kRIT=\E[c, ka1=\EOw, ka3=\EOy, kb2=\EOu, kbs=^?, kc1=\EOq, kc3=\EOs, kcbt=\E[Z, kel=\E[8\^, kend=\E[8~, kent=\EOM, kf0=\E[21~, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, kf20=\E[34~, kf21=\E[23$, kf22=\E[24$, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[7~, kind=\E[a, kmous=\E[M, kri=\E[b, op=\E[39;49m, rev=\E[7m, ri=\EM, rmacs=^O, rmir=\E[4l, rmso=\E[27m, rmul=\E[24m, rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[? 25h, s0ds=\E(B, s1ds=\E(0, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%? %p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smir=\E[4h, smso=\E[7m, smul=\E[4m, tbc=\E[3g, vpa=\E[%i%p1%dd, use=ansi+arrows, use=ansi+csr, use=ansi+idl, use=ansi+local, use=xterm+alt47, use=vt220+vtedit, use=vt220+cvis, use=ecma+italics, dvtm-256color|dynamic virtual terminal manager with 256 colors, colors#0x100, pairs#0x10000, setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48; 5;%p1%d%;m, setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5 ;%p1%d%;m, use=dvtm, #### NCSA Telnet # Francesco Potorti : # NCSA telnet is one of the most used telnet clients for the Macintosh. It has # been maintained until recently by the National Center for Supercomputer # Applications, and it is feature rich, stable and free. It can be downloaded # from www.ncsa.edu. This terminfo description file is based on xterm-vt220, # xterm+sl, and the docs at NCSA. It works well. # # NCSA Telnet 2.6 for Macintosh in VT220 8-bit emulation mode # The terminal options should be set as follows: # Xterm sequences ON # use VT wrap mode ON # use Emacs arrow keys OFF # CTRL-COMND is Emacs meta ON # 8 bit mode ON # answerback string: "ncsa-vt220-8" # setup keys: all disabled # # Application mode is not used. # # Other special mappings: # Apple VT220 # HELP Find # HOME Insert here # PAGEUP Remove # DEL Select # END Prev Screen # PAGEDOWN Next Screen # # Though it supports ANSI color, NCSA Telnet uses color to represent blinking # text. # # The status-line manipulation is a mapping of the xterm-compatible control # sequences for setting the window-title. So you must use tsl and fsl in # pairs, since the latter ends the string that is loaded to the window-title. ncsa-m|ncsa-vt220-8|NCSA Telnet 2.6 for Macintosh in VT220-8 mode, am, km, mir, msgr, xenl, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r, 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, rmacs=\E(B, rmam=\E[?7l, rmcup=\E[2J\E8, rmir=\E[4l, rmso=\E[27m, rmul=\E[24m, rs2=\E7\E[r\E8\E[m\E[?7h\E[?1;4;6l\E[4l\E>, sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%? %p9%t\E(0%e\E(B%;, sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smcup=\E7, smir=\E[4h, smso=\E[7m, smul=\E[4m, tbc=\E[3g, u8=\E[?62;1;6c, use=ansi+arrows, use=ansi+csr, use=ansi+idl, use=ansi+local, use=vt220+cvis, use=xterm+sl, use=ansi+enq, ncsa|NCSA Telnet 2.7 for Macintosh in VT220-8 mode (color), use=ncsa-m, use=klone+color, ncsa-ns|NCSA Telnet 2.7 for Macintosh in VT220-8 mode (color w/o status line), hs@, dsl@, fsl@, tsl@, use=ncsa, ncsa-m-ns|NCSA Telnet 2.6 for Macintosh in VT220-8 mode (no status line), hs@, dsl@, fsl@, tsl@, use=ncsa-m, # alternate -TD: # The documented function-key mapping refers to the Apple Extended Keyboard # (e.g., NCSA Telnet's F1 corresponds to a VT220 F6). We use the VT220-style # codes, however, since the numeric keypad (VT100) PF1-PF4 are available on # some keyboards and many applications require these as F1-F4. # ncsa-vt220|NCSA Telnet using VT220-compatible function keys, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\EOQ, kf20=\E[34~, kf3=\EOR, kf4=\EOS, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, use=ncsa, #### Pilot Pro Palm-Top # # Termcap for Top Gun Telnet and SSH on the Palm Pilot. # https://web.archive.org/web/20051103015726/http://www.ai/~iang/TGssh/ pilot|tgtelnet|Top Gun Telnet on the Palm Pilot Professional, OTbs, am, xenl, cols#39, lines#16, bel=^G, clear=\Ec, cr=\r, cub1=^H, cud1=\n, cup=\Em%p1%{32}%+%c%p2%{32}%+%c, home=\Em\s\s, ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n, knp=^L, kpp=^K, nel=\Em~\s, rmso=\EB, smso=\Eb, # From: Federico Bianchi # 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, rmso=\E[m, smso=\E[7m, use=ansi+local1, 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), colors#8, ncv#3, pairs#64, bold=\E[1m, cub1=^H, cud1=\n, home=\E[H, op=\E[0m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} %=%t3%e%p1%d%;m, setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} %=%t3%e%p1%d%;m, sgr=\E[0%?%p6%t;1%;%?%p1%p3%|%t;7%;m, sgr0=\E[m, use=ansi+local, use=sun, #### Iris consoles # # (wsiris: this had extension capabilities # :HS=\E7F2:HE=\E7F7:\ # :CT#2:CZ=*Bblack,red,green,yellow,blue,magenta,cyan,*Fwhite: # See the note on Iris extensions near the end of this file. # Finally, removed suboptimal =\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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf0=\E0, kf1=\E1, kf2=\E2, kf3=\E3, kf4=\E4, kf5=\E5, kf6=\E6, kf7=\E7, kf8=\E8, kf9=\E9, ri=\EI, rmso=\E0@, rmul=\E7R3\E0@, sgr0=\E7F7, smso=\E9P, smul=\E7R2\E9P, #### NeWS consoles # # Console terminal windows under the NeWS (Sun's Display Postscript windowing # environment). Note: these have nothing to do with Sony's News workstation # line. # # Entry for NeWS's psterm from Eric Messick & Hugh Daniel # (psterm: unknown ":sl=\EOl:el=\ENl:" removed -- esr) psterm|psterm-basic|NeWS psterm-80x34, OTbs, am, hs, km, ul, cols#80, it#8, lines#34, blink=\EOb, bold=\EOd, clear=^L, csr=\EE%p1%d;%p2%d;, cub1=\ET, cud1=\EP, cuf1=\EV, cup=\E%p1%d;%p2%d;, cuu1=\EY, dch1=\EF, dl1=\EK, ed=\EB, el=\EC, flash=\EZ, fsl=\ENl, home=\ER, ht=^I, il1=\EA, ind=\EW, is1=\EN*, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, ll=\EU, rc=^\, rev=\EOr, ri=\EX, rmcup=\ENt, rmir=\ENi, rmso=\ENo, rmul=\ENu, sc=^], sgr0=\EN*, smcup=\EOt, smir=\EOi, smso=\EOo, smul=\EOu, tsl=\EOl, psterm-96x48|NeWS psterm 96x48, cols#96, lines#48, use=psterm, psterm-90x28|NeWS psterm 90x28, cols#90, lines#28, use=psterm, psterm-80x24|NeWS psterm 80x24, cols#80, lines#24, use=psterm, # This is a faster termcap for psterm. Warning: if you use this termcap, # some control characters you type will do strange things to the screen. # (psterm-fast: unknown ":sl=^Ol:el=^Nl:" -- esr) psterm-fast|NeWS psterm fast version (flaky ctrl chars), OTbs, am, hs, km, ul, cols#80, it#8, lines#34, blink=^Ob, bold=^Od, clear=^L, csr=\005%p1%d;%p2%d;, cub1=^T, cud1=^P, cuf1=^V, cup=\004%p1%d;%p2%d;, cuu1=^Y, dch1=^F, dl1=^K, ed=^B, el=^C, flash=^Z, fsl=^Nl, home=^R, ht=^I, il1=^A, ind=^W, is1=^N*, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, ll=^U, rc=^\, rev=^Or, ri=^X, rmcup=^Nt, rmir=^Ni, rmso=^No, rmul=^Nu, sc=^], sgr0=^N*, smcup=^Ot, smir=^Oi, smso=^Oo, smul=^Ou, tsl=^Ol, #### NeXT consoles # # Use `glasstty' for the Workspace application # # From: Dave Wetzel 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, eslok, hs, cols#80, lines#30, OTi2=\E[2$~\n, dsl=\E[1$~, fsl=\E[0$}, is2=\E7\E[r\E8\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, tsl=\E[1$}\E[;%df, use=vt220-base, # (news517-w: this had :TY=sjis:. --esr) nwp517-w|nwp-517-w|nwp-517 VT200 132 cols 50 rows, eslok, hs, cols#132, lines#50, OTi2=\E[2$~\n, dsl=\E[1$~, fsl=\E[0$}, is2=\E7\E[r\E8\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h, rs2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h, tsl=\E[1$}\E[;%df, use=vt220-base, #### Common Desktop Environment # # This ships with Sun's CDE in Solaris 2.5 # Corrected Sun Aug 9 1998 by Alexander V. Lukyanov 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, 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, 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, rmacs=\E[10m, rmpch=\E[10m, rmso=\E[27m, rmul=\E[24m, rs1=\Ec\E]R, sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7 %t;8%;%?%p9%t;11%;m, sgr0=\E[0;10m, smacs=\E[11m, 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=xterm+alt47, use=vt220+pcedit, use=vt102+enq, # I've supplied this so that you can help test new values and add other # features. Cheers, earnie_boyd@yahoo.com. # # Some features are from pcansi. The op value is from linux. Function-keys # are from linux. These have been tested not to cause problems. xenl was in # this list, but DOES cause problems so it has been removed cygwinDBG|Debug Version for Cygwin, am, eo, mir, msgr, xon, colors#8, cols#80, lines#24, ncv#3, pairs#64, acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v \301w\302x\263y\363z\362{\343|\330}\234~\376, bel=^G, bold=\E[1m, 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, rmacs=\E[10m, rmso=\E[m, rmul=\E[m, rs1=\Ec\E]R, sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5 %t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;12%;m, sgr0=\E[0;10m, smacs=\E[11m, smso=\E[7m, smul=\E[4m, 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+sgr, use=vt220+pcedit, use=vt220+cvis, use=vt102+enq, #### DJGPP # Key definitions: # The encodings for unshifted arrow keys, F1-F12, Home, Insert, etc. match the # encodings used by other x86 environments. All others are invented for DJGPP. # Oddly enough, while several combinations of modifiers are tabulated, there is # none for shifted cursor keys. # # F1 \E[[A # F2 \E[[B # F3 \E[[C # F4 \E[[D # F5 \E[[E # F6 \E[17~ # F7 \E[18~ # F8 \E[19~ # F9 \E[20~ # F10 \E[21~ # F11 \E[23~ # F12 \E[24~ # # Delete \E[3~ # Down Arrow \E[B # End \E[4~ # Home \E[1~ # Insert \E[2~ # Left Arrow \E[D # Page Down \E[6~ # Page Up \E[5~ # Right Arrow \E[C # Up Arrow \E[A # # Shift-F1 \E[25~ # Shift-F2 \E[26~ # Shift-F3 \E[27~ # Shift-F4 \E[28~ # Shift-F5 \E[29~ # Shift-F6 \E[30~ # Shift-F7 \E[31~ # Shift-F8 \E[32~ # Shift-F9 \E[33~ # Shift-F10 \E[34~ # Shift-F11 \E[35~ # Shift-F12 \E[36~ # # Ctrl-F1 \E[47~ # Ctrl-F2 \E[48~ # Ctrl-F3 \E[49~ # Ctrl-F4 \E[50~ # Ctrl-F5 \E[51~ # Ctrl-F6 \E[52~ # Ctrl-F7 \E[53~ # Ctrl-F8 \E[54~ # Ctrl-F9 \E[55~ # Ctrl-F10 \E[56~ # Ctrl-F11 \E[57~ # Ctrl-F12 \E[58~ # # Ctrl-Delete \E[43~ # Ctrl-Down Arrow \E[38~ # Ctrl-End \E[44~ # Ctrl-Home \E[41~ # Ctrl-Insert \E[42~ # Ctrl-Left Arrow \E[39~ # Ctrl-Page Down \E[46~ # Ctrl-Page Up \E[45~ # Ctrl-Right Arrow \E[40~ # Ctrl-Up Arrow \E[37~ # # Alt-F1 \E[59~ # Alt-F2 \E[60~ # Alt-F3 \E[61~ # Alt-F4 \E[62~ # Alt-F5 \E[63~ # Alt-F6 \E[64~ # Alt-F7 \E[65~ # Alt-F8 \E[66~ # Alt-F9 \E[67~ # Alt-F10 \E[68~ # Alt-F11 \E[79~ # Alt-F12 \E[80~ # # Alt-Delete \E[65~ # Alt-Down Arrow \E[60~ # Alt-End \E[66~ # Alt-Home \E[41~ # Alt-Insert \E[64~ # Alt-Left Arrow \E[61~ # Alt-Page Down \E[68~ # Alt-Page Up \E[67~ # Alt-Right Arrow \E[62~ # Alt-Up Arrow \E[59~ # # Also: # Alt-A \E[82~ # Alt-B \E[82~ # Alt-C \E[83~ # Alt-D \E[84~ # Alt-E \E[85~ # Alt-F \E[86~ # Alt-G \E[87~ # Alt-H \E[88~ # Alt-I \E[89~ # Alt-J \E[90~ # Alt-K \E[91~ # Alt-L \E[92~ # Alt-M \E[93~ # Alt-N \E[94~ # Alt-O \E[95~ # Alt-P \E[96~ # Alt-Q \E[97~ # Alt-R \E[98~ # Alt-S \E[99~ # Alt-T \E[100~ # Alt-U \E[101~ # Alt-V \E[102~ # Alt-W \E[103~ # Alt-X \E[104~ # Alt-Y \E[105~ # Alt-Z \E[106~ djgpp|ANSI emulation for DJGPP alpha, am, bce, msgr, xhp, xon, xt, colors#8, it#8, pairs#64, acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v \301w\302x\263y\363z\362{\343|\330}\234~\376, bel=^G, 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~, 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~, 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, 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, colors#8, it#8, ncv#58, pairs#64, acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u \264v\301w\302x\263y\363z\362{\343|\330}\234~\376, bel=^G, blink=\E[5m, bold=\E[1m, 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, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, 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=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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\Eh, kind=\ES, kll=\EF, kri=\ET, # Generic stuff from the HP 262x series # hp262x|HP 262x terminals, xhp, blink=\E&dA, dch1=\EP$<2>, ed=\EJ, ht=\011$<2>, ind=\ES, invis=\E&dS, ip=$<2>, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EP, kdl1=\EM, ked=\EJ, kel=\EK, khome=\Eh, kich1=\EQ, kil1=\EL, kind=\ES, knp=\EU, kpp=\EV, kri=\ET, krmir=\ER, rev=\E&dB, rmkx=\E&s0A, rmso=\E&d@, rmul=\E&d@, sgr=\E&d%{64}%?%p1%t%{66}%|%;%?%p2%t%{68}%|%;%?%p3%t%{66}%| %;%?%p4%t%{65}%|%;%c, sgr0=\E&d@, smkx=\E&s1A, smso=\E&dB, smul=\E&dD, # Note: no 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\Eh, rmkx=\E&s0A, smkx=\E&s1A, use=hp2621, # 2621 using all 48 lines of memory, only 24 visible at any time. hp2621-48|HP 48 line 2621, lines#48, cup=\E&a%p2%dc%p1%dR, home=\EH, vpa=\E&a%p1%dR, use=hp2621, # 2621 with no labels ever. Also prevents vi delays on escape. hp2621-nl|HP 2621 with no labels, kcub1@, kcud1@, kcuf1@, kcuu1@, khome@, rmkx@, smkx@, use=hp2621-fl, # Needed for UCB ARPAVAX console, since lsi-11 expands tabs # (wrong). # hp2621-nt|HP 2621 w/no tabs, ht@, use=hp2621, # Hp 2624 B with 4 or 10 pages of memory. # # Some assumptions are made with this entry. These settings are # NOT set up by the initialization strings. # # Port Configuration # RecvPace=Xon/Xoff # XmitPace=Xon/Xoff # StripNulDel=Yes # # Terminal Configuration # InhHndShk=Yes # InhDC2=Yes # XmitFnctn(A)=No # InhEolWrp=No # # Note: the 2624 DOES have a true , 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EP, kdl1=\EM, ked=\EJ, kel=\EK, khome=\Eh, khts=\E1, kich1=\EQ, kil1=\EL, kind=\ES, knp=\EU, kpp=\EV, kri=\ET, krmir=\ER, rev=\E&dB, rmkx=\E&s0A, sgr=\E&d%{64}%?%p1%t%{66}%|%;%?%p2%t%{68}%|%;%?%p3%t%{66}%| %;%?%p4%t%{65}%|%;%?%p5%t%{72}%|%;%?%p6%t%{66}%|%;%c, sgr0=\E&d@, smkx=\E&s1A, use=hpgeneric, # You should use this terminal at 4800 baud or less. hp2648|hp2648a|HP 2648a graphics terminal, clear=\EH\EJ$<50>, cup=\E&a%p2%dc%p1%dY$<20>, dch1=\EP$<7>, ip=$<5>, use=hp2645, # The HP 150 terminal is a fairly vanilla HP terminal, with the # clreol standout problem. It also has graphics capabilities and # a touch screen, which we don't describe here. hp150|Hewlett Packard Model 150, OTbs, use=hp2622, # HP 2382a terminals, "the little ones." They don't have any # alternate character set support and sending out ^N/^O will # leave the screen blank. hp2382a|hp2382|Hewlett Packard 2382a, da, db, lh#1, lm#48, acsc@, pln=\E&f0a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d0L%?%ga%!%t\s%;%p2 %s, rmacs@, sgr=\E&d%{0}%Pa%?%p4%t%{1}%ga%+%Pa%;%?%p1%p3%|%p6%|%t%{2}%ga %+%Pa%;%?%p2%p6%|%t%{4}%ga%+%Pa%;%?%p1%p5%|%t%{8}%ga%+ %Pa%;%?%p7%t%?%ga%ts%ga%{64}%+%e%{83}%;%e%?%ga%t%ga%{64} %+%e%{64}%;%;%c, sgr0=\E&d@, smacs@, use=hp+labels, use=scrhp, hp2621-a|hp2621a-a|hp2621 with fn as arrows, use=hp+pfk+arrows, use=hp2621-fl, # newer hewlett packard terminals newhpkeyboard|generic entry for HP extended keyboard, kbs=^H, kcbt=\Ei, kclr=\EJ, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EP, kdl1=\EM, ked=\EJ, kel=\EK, khome=\Eh, kich1=\EQ, kil1=\EL, kind=\ET, kll=\EF, knp=\EU, kpp=\EV, kri=\ES, krmir=\ER, rmkx=\E&s0A, smkx=\E&s1A, use=hp+pfk-cr, newhp|generic entry for new Hewlett Packard terminals, am, bw, mir, xhp, xon, cols#80, lines#24, pb#4800, acsc=2[3@4>5I9(:'JSKWLQMAO#P$Q;R!S"T1U2V4W3X:Y+Z*dHjGkTlRmFn /q\,t5u6v8w7x., bel=^G, blink=\E&dA, bold=\E&dF, cbt=\Ei, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, cuu1=\EA, dch1=\EP$<2>, dim=\E&dH, dl1=\EM, ed=\EJ, el=\EK, ht=\011$<2>, hts=\E1, il1=\EL, ind=\n, invis=\E&dS, ip=$<2>, is1=\E&jB$<8>, nel=\r\n, pfkey=\E&f0a%p1%dk0d%p2%l%dL%p2%s, pfloc=\E&f1a%p1%dk0d%p2%l%dL%p2%s, pfx=\E&f2a%p1%dk0d%p2%l%dL%p2%s, rev=\E&dB, ri=\ET, rmacs=^O, rmir=\ER, rmso=\E&d@, rmul=\E&d@, rs1=\Eg, sgr=\E&d%{0}%Pa%?%p4%t%{1}%ga%+%Pa%;%?%p1%p3%|%p6%|%t%{2}%ga %+%Pa%;%?%p2%p6%|%t%{4}%ga%+%Pa%;%?%p1%p5%|%t%{8}%ga%+ %Pa%;%?%p7%t%?%ga%ts%ga%{64}%+%e%{83}%;%e%?%ga%t%ga%{64} %+%e%{64}%;%;%c%?%p9%t\016%e\017%;, sgr0=\E&d@\017, smacs=^N, smir=\EQ, smso=\E&dJ, smul=\E&dD, tbc=\E3, use=newhpkeyboard, memhp|memory relative addressing for new HP ttys, vt#6, clear=\EH\EJ$<40>, cub=\E&a-%p1%dC, cud=\E&a+%p1%dR, cuf=\E&a+%p1%dC, cup=\E&a%p1%dr%p2%dC, cuu=\E&a-%p1%dR, home=\EH, hpa=\E&a%p1%dC, ll=\E&a23R\r, mrcup=\E&a%p1%dr%p2%dC, vpa=\E&a%p1%dR, use=newhp, scrhp|screen relative addressing for new HP ttys, clear=\E&a0c0Y\EJ$<40>, cub=\E&a-%p1%dC, cud=\E&a+%p1%dR, cuf=\E&a+%p1%dC, cup=\E&a%p1%dy%p2%dC$<10>, cuu=\E&a-%p1%dR, home=\E&a0y0C, hpa=\E&a%p1%dC, ll=\E&a0y0C\EA, mrcup=\E&a%p1%dr%p2%dC, vpa=\E&a%p1%dY, use=newhp, # (hp+labels: added label values from a BRL termcap -- esr) hp+labels|"standard" label info for new HP ttys, lh#2, lw#8, nlab#8, lf0=f1, lf1=f2, lf2=f3, lf3=f4, lf4=f5, lf5=f6, lf6=f7, lf7=f8, pln=\E&f2a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d0L%?%ga%!%t\s%;%p2 %s, rmln=\E&j@, smln=\E&jB, hp+printer|"standard" printer info for HP ttys, ff=\E&p4u0C, mc0=\EH\E&p4dF, mc4=\E&p13C, mc5=\E&p11C, # The new hp2621b is kind of a cross between the old 2621 and the # new 262x series of machines. It has dip-switched options. # The firmware has a bug in it such that if you give it a null # length label, the following character is eaten! hp2621b|HP 2621b with old style keyboard, lh#1, lm#48, lw#8, nlab#8, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\Eh, kind=\ET, kll=\EF, kri=\ES, pln=\E&f0a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d3L%?%ga%!%t%{32}%c %;%p2%s\E%{111}%p1%+%c\r, smln=\E&jB, use=hp2621, hp2621b-p|HP 2621b with printer, use=hp+printer, use=hp2621b, # hp2621b - new 2621b with new extended keyboard # these are closer to the new 26xx series than the other 2621b hp2621b-kx|HP 2621b with extended keyboard, use=newhpkeyboard, use=hp2621b, hp2621b-kx-p|HP 2621b with new keyboard & printer, use=hp+printer, use=hp2621b-kx, # Some assumptions are made in the following entries. # These settings are NOT set up by the initialization strings. # # Port Configuration # RecvPace=Xon/Xoff XmitPace=Xon/Xoff StripNulDel=Yes # # Terminal Configuration # InhHndShk(G)=Yes InhDC2(H)=Yes # XmitFnctn(A)=No InhEolWrp=No # # # Hp 2622a & hp2623a display and graphics terminals # hp2622|hp2622a|HP 2622, da, db, lm#0, pb#19200, is2=\E&dj@\r, use=hp+pfk-cr, use=hp+labels, use=scrhp, # The 2623 is a 2622 with extra graphics hardware. hp2623|hp2623a|HP 2623, use=hp2622, hp2624b-p|hp2624b-4p-p|Hewlett Packard 2624 B with printer, use=hp+printer, use=hp2624, # The hewlett packard B can have an optional extra 6 pages of memory. hp2624-10p|hp2624a-10p|hp2624b-10p|Hewlett Packard 2624 B w/ 10 pages of memory, lm#240, use=hp2624, hp2624b-10p-p|Hewlett Packard 2624 B w/ extra memory & printer, lm#240, use=hp2624b-p, # Color manipulations for HP terminals hp+color|HP with colors, ccc, colors#16, ncv#17, pairs#7, initp=\E&v%?%p2%{1000}%=%t1%e.%p2%d%;a%?%p3%{1000}%=%t1%e. %p3%d%;b%?%p4%{1000}%=%t1%e.%p4%d%;c%?%p5%{1000}%=%t1 %e.%p5%d%;x%?%p6%{1000}%=%t1%e.%p6%d%;y%?%p7%{1000}%= %t1%e.%p7%d%;z%p1%dI, oc=\E&v0m1a1b1c0I\E&v1a1I\E&v1b2I\E&v1a1b3I\E&v1c4I\E&v1a1c5 I\E&v1b1c6I\E&v1x1y7I, op=\E&v0S, scp=\E&v%p1%dS, # 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, kf1=\Ep\r, kf2=\Eq\r, kf3=\Er\r, kf4=\Es\r, kf5=\Et\r, kf6=\Eu\r, kf7=\Ev\r, kf8=\Ew\r, khome=\Eh, kind=\EU, knp=\Eu, kpp=\Ev, kri=\EV, rmir=\ER, rmul=\E&d@, smir=\EQ, smul=\E&dD, vpa=\E&a%p1%dY, use=hpsub, hpsub|HP terminals -- capability subset, am, da, db, mir, xhp, xon, lines#24, bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, cuu1=\EA, dch1=\EP, dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I, if=/usr/share/tabset/stdcrt, il1=\EL, ind=\n, is2=\E&s1A\E<\E&k0\\, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\Eh, rmkx=\E&s0A, rmso=\E&d@, sgr0=\E&d@, smkx=\E&s1A, smso=\E&dB, # hpex: # May be used for most 24 x 80 hp terminals, # but has no padding added, so may allow runover in some terminals at high # baud rates. Will not work for hp2640a or hp2640b terminals, hp98x6 and # hp98x5 terminal emulators or hp98x6 consoles. # Adds xy-cursor addressing, vertical cursor addressing, home, # last line, and underline capabilities. # # (hpex: removed memory-lock capabilities ":ml=\El:mu=\Em:", # moved 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\Eh, rmir=\ER, rmkx=\E&s0A, rmso=\E&d@, rmul=\E&d@, sgr0=\E&d@, smir=\EQ, smkx=\E&s1A, smso=\E&dB, smul=\E&dD, tbc=\E3, vpa=\E&a%p1%dY, # From: Greg Couch hp9837|hp98720|hp98721|HP 9000/300 workstations, OTbs, am, da, db, mir, xhp, cols#128, it#8, lines#46, lm#0, bel=^G, cbt=\Ei, clear=\E&a0y0C\EJ, cub1=^H, cud1=\EB, cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA, dch1=\EP, dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I, hts=\E1, il1=\EL, ind=\n, is2=\E&v0m1b0i&j@, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EP, kdl1=\EM, ked=\EJ, kel=\EK, khome=\Eh, kich1=\EQ, kil1=\EL, knp=\EU, kpp=\EV, rmir=\ER, rmkx=\E&s0A, rmso=\E&v0S, rmul=\E&d@, sgr0=\E&d@, smir=\EQ, smkx=\E&s1A, smso=\E&v5S, smul=\E&dD, tbc=\E3, vpa=\E&a%p1%dY, # HP 9845 desktop computer from BRL # (hp9845: removed unknown capability :gu: -- esr) hp9845|HP 9845, OTbs, am, da, db, eo, mir, xhp, cols#80, lines#21, OTbc=\ED, clear=\EH\EJ, cub1=\ED, cud1=\EB, cuf1=\EC, cup=\E&a%p2%2dc%p1%2dY, cuu1=\EA, dch1=\EP, dl1=\EM, ed=\EJ, el=\EK, if=/usr/share/tabset/std, il1=\EL, rmir=\ER, rmso=\E&d@, smir=\EQ, smso=\E&dB, # From: Charles A. Finnell of MITRE , 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\Eh, nel=\r\n, rmir=\ER, rmkx=\E&s0A, rmso=\E&d@, rmul=\E&d@, sgr0=\E&d@, smir=\EQ, smkx=\E&s1A, smso=\E&dB, smul=\E&dD, vpa=\E&a%p1%dY$<6/>, gator-t|HP 9000 model 237 emulating extra-tall AAA, lines#94, use=gator, gator|HP 9000 model 237 emulating AAA, bw, km, mir, ul, cols#128, it#8, lines#47, bel=^G, cbt=\E[Z, 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, cols#80, it#8, lines#24, OTnl=\n, bel=^G, cbt=\Ez$<4/>, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM$<3*/>, ed=\EJ, el=\EK$<16/>, home=\EH, ht=^I, il1=\EL, ind=\n, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf1=\EP, kf2=\EQ, kf3=\ER, kf4=\EV, kf5=\EE, kf6=\E], kf7=\EL, kf8=\Ev, kf9=\EM, khome=\EH, nel=\r\n, ri=\EI, rmso=\ET, rmul=\EW, smso=\EU, smul=\ES, # this one was BSD & SCO's vi50 vi50adm|Visual 50 in adm3a mode, am, msgr, cols#80, it#8, lines#24, bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dl1=\EM, ed=\Ek, el=\EK, home=\EH, ht=^I, il1=\EL, ind=\n, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\EH, rmso=\ET, smso=\EU, # From: Jeff Siegal vi55|Visual 55, OTbs, am, mir, msgr, cols#80, it#8, lines#24, clear=\Ev, csr=\E_%p1%{65}%+%c%p2%{65}%+%c, cub1=^H, cud1=\n, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\Ew, dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, il1=\EL, is2=\Ev\E_AX\Eb\EW\E9P\ET, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, ri=\EI, rmir=\Eb, rmso=\ET, smir=\Ea, smso=\EU, # Visual 200 from BRL # The following switch settings are assumed for normal operation: # FULL_DUPLEX SCROLL CR # AUTO_NEW_LINE_ON VISUAL_200_EMULATION_MODE # Other switches may be set for operator convenience or communication # requirements. # Character insertion is kludged in order to get around the "beep" misfeature. # (This cap is commented out because / 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EO, kdl1=\EM, ked=\EJ, kel=\Et, kf0=\E?p, kf1=\E?q, kf2=\E?r, kf3=\E?s, kf4=\E?t, kf5=\E?u, kf6=\E?v, kf7=\E?w, kf8=\E?x, kf9=\E?y, khome=\EH, khts=\E1, kich1=\Ei, kil1=\EL, krmir=\Ej, mc0=\EH\E], mc4=\EX, mc5=\EW, ri=\EI, rmacs=\EG, rmkx=\E>, rmso=\E3, rs1=\E3\Eb\Ej\E\El\EG\Ec\Ek\EX, sgr0=\E3\Eb, smacs=\EF, smkx=\E=, smso=\E4, tbc=\Eg, # The older Visuals didn't come with function keys. This entry uses # 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\EH, nel=\r\n, rmacs=^O, rmir=\Ej, rmso=\E^G, rmul=\E^C, smacs=^N, smir=\Ei, smso=\E^H, smul=\E^D, # The visual 550 is a visual 300 with Tektronix graphics, # and with 33 lines. clear screen is modified here to # also clear the graphics. vi550|Visual 550 ANSI x3.64, lines#33, clear=\030\E[H\E[2J, use=vi300, vi603|visual603|Visual 603, hs, mir, 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, bold=\E[1m, 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, smso=\E[7m, smul=\E[4m, vpa=\E[%i%p1%dd, use=ansi+csr, use=ansi+idl, use=ansi+pp, use=ansi+sgr, # 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, cbt=\E[Z, 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, ht=^I, hts=\EH, ich=\E[%p1%d@$<1*>, il=\E[%p1%dL$<2*>, il1=\E[L$<2>, ind=\n$<2>, ip=$<1>, is1=\E[2;4;20;30l\E[?1;10l\E[12h\E[?7;8;25h, is2=\E>\E(B\E)0\017, is3=\E[m, 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, tbc=\E[3g, tsl=\E[>\,\001, use=ansi+arrows, use=ansi+local, use=ansi+pp, 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, am, hs, mir, msgr, xenl, xon, cols#80, lines#24, wsl#80, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, bold=\E[1m, clear=\E[H\E[J$<110>, cr=\r, cub1=^H, cud=\E[%p1%dB, 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, home=\E[H, 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>, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmkx=\E>, rmso=\E[m, rmul=\E[m, rs1=\E[13l\E[3l\E!p, rs2=\E[35h\E[?3l$<70>, rs3=\E[?5l, sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%? %p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, smkx=\E[?1l\E=, smso=\E[7m, smul=\E[4m, 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+sgr, use=decid+cpr, use=vt220+vtedit, use=vt220+cvis, use=vt220+keypad, # # Wyse 85 with visual bell. wy85-vb|wyse85-vb|Wyse 85 with visible bell, bel@, flash=\E[30h\E\,$<300/>\E[30l, use=wy85, # # Wyse 85 in 132-column mode. wy85-w|wyse85-w|Wyse 85 in 132-column mode, cols#132, wsl#132, rs2=\E[35h$<70/>\E[?3h, use=wy85, # # Wyse 85 in 132-column mode with visual bell. wy85-wvb|wyse85-wvb|Wyse 85 with visible bell 132-columns, bel@, use=wy85-w, # From: Kevin Turner , 12 Jul 1998 # This copes with an apparent firmware bug in the wy85. He writes: # "What I did was change leave the terminal cursor keys set to Normal # (instead of application), and change \E[ to \233 for all the keys in # terminfo. At one point, I found some reference indicating that this # terminal bug (not sending \E[) was acknowledged by Wyse (so it's not just # me), but I can't find that and the server under my bookmark to "Wyse # Technical" isn't responding. So there's the question of whether the wy85 # terminfo should reflect the manufacturer's intended behaviour of the terminal # or the actual." wy85-8bit|wyse85-8bit|Wyse 85 in 8-bit mode, am, hs, mir, msgr, xenl, xon, cols#80, lines#24, wsl#80, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, bold=\E[1m, clear=\E[H\E[J$<110>, cr=\r, 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, home=\E[H, 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, kbs=^H, kc1=\EOq, kc3=\EOs, kcub1=\233D, kcud1=\233B, kcuf1=\233C, kcuu1=\233A, kdch1=\2333~, kent=\EOM, kf1=\EOP, kf10=\23321~, kf11=\23323~, kf12=\23324~, kf13=\23325~, kf14=\23326~, kf15=\23328~, kf16=\23329~, kf17=\23331~, kf18=\23332~, kf19=\23333~, kf2=\EOQ, kf20=\23334~, kf3=\EOR, kf4=\EOS, kf6=\23317~, kf7=\23318~, kf8=\23319~, kf9=\23320~, kfnd=\2331~, khlp=\23328~, khome=\23326~, kich1=\2332~, knp=\2336~, kpp=\2335~, kslt=\2334~, lf1=PF1, lf2=PF2, lf3=PF3, lf4=PF4, mc0=\E[0i, ri=\EM$<3>, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmkx=\E>, rmso=\E[m, rmul=\E[m, rs1=\E[13l\E[3l\E!p, rs2=\E[35h\E[?3l$<70>, rs3=\E[?5l, sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%? %p6%t;1%;%?%p7%t;8%;+m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, smkx=\E[?1l\E=, smso=\E[7m, smul=\E[4m, tsl=\E[40h\E7\E[25;%i%p1%dH, use=ansi+csr, use=ansi+inittabs, use=ansi+local, use=ansi+pp, use=ansi+sgr, use=decid+cpr, use=vt220+cvis, # # Wyse 185 emulating a VT320 7 bit mode. # # This terminal always displays 25 lines. These lines may be used # as 24 data lines and a terminal status line (top or bottom) or # 25 data lines. The 48 and 50 line modes change the page size # and not the number of lines on the screen. # # The Compose Character key can be used as a meta key if changed # by set-up. # wy185|wyse185|Wyse 185, am, hs, km, mir, msgr, xenl, xon, cols#80, lines#24, wsl#80, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, bold=\E[1m, 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$<3>, dim=\E[2m, dl=\E[%p1%dM$<2*>, dl1=\E[M$<2>, dsl=\E7\E[99;0H\E[K\E8, ech=\E[%p1%dX, ed=\E[J$<40>, el=\E[K, el1=\E[1K, enacs=\E)0, flash=\E[30h\E\,$<100/>\E[30l, fsl=\E[1;24r\E8, home=\E[H, hpa=\E[%i%p1%d`, 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>, rmacs=^O, rmam=\E[?7l, rmcup=\E[ R, rmir=\E[4l, rmkx=\E>, rmso=\E[27m, rmul=\E[24m, rs1=\E[13l\E[3l\E\\\E[63;1"p\E[!p, rs2=\E[35h\E[?3l, rs3=\E[?5l\E[47h\E[40l\E[r, sc=\E7, sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%? %p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smcup=\E[ Q, smir=\E[4h, smkx=\E[?1l\E=, smso=\E[7m, smul=\E[4m, 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+sgr, use=decid+cpr, use=vt220+vtedit, use=vt220+keypad, # # Wyse 185 with 24 data lines and top status (terminal status) wy185-24|wyse185-24|Wyse 185 with 24 data lines, hs@, dsl@, fsl@, rs3=\E[?5l\E[47h\E[40l\E[1;24r, tsl@, use=wy185, # # Wyse 185 with visual bell. wy185-vb|wyse185-vb|Wyse 185+flash, bel@, use=wy185, # # Wyse 185 in 132-column mode. wy185-w|wyse185-w|Wyse 185 in 132-column mode, cols#132, wsl#132, dch=\E[%p1%dP$<7>, dch1=\E[P$<7>, ich=\E[%p1%d@$<7>, ip=$<7>, rs2=\E[35h\E[?3h, use=wy185, # # Wyse 185 in 132-column mode with visual bell. wy185-wvb|wyse185-wvb|Wyse 185+flash+132 cols, bel@, use=wy185-w, # wy325 terminfo entries # Done by Joe H. Davis 3-9-92 # lines 25 columns 80 # wy325|wyse325|Wyse epc, am, bw, mc5i, mir, cols#80, lh#1, lines#24, lw#8, nlab#8, pb#9601, acsc=+/\,.0[a2fxgqh1ihjYk?lZm@nEqDtCu4vAwBx3yszr{c~~, bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<50>, cnorm=\E`1, cr=\r, cub1=^H, cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<7>, dim=\EGp, dl1=\ER$<3>, ed=\EY$<50>, el=\ET$<4>, flash=\E`8$<100/>\E`9, home=^^, ht=^I, hts=\E1, il1=\EE$<3>, ind=\n$<3>, ip=$<2>, is1=\EcB0\EcC1, is2=\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016\024 \El, is3=\Ew0$<16>, kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY, kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\Eq, kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, ll=^^^K, mc0=\EP, mc4=^T, mc5=\Ed#, pfloc=\EZ2%p1%{63}%+%c%p2%s\177, pfx=\EZ1%p1%{63}%+%c%p2%s\177, pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E), ri=\Ej$<2>, rmacs=\EcD, rmam=\Ed., rmcup=\Ew0, rmir=\Er, rmln=\EA11, rs1=\E~!\E~4$<30>, rs2=\EeF\E`:$<70>, rs3=\EwG\Ee($<100>, sgr=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%{48}%?%p2%t%{8} %|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t %{64}%|%;%?%p7%t%{1}%|%;%c, sgr0=\E(\EH\003\EG0\EcD, smacs=\EcE, smam=\Ed/, smcup=\Ew1, smir=\Eq, smln=\EA10, smso=\EGt, tbc=\E0, use=adm+sgr, use=wyse+sl, # # lines 24 columns 80 vb # wy325-vb|wyse325-vb|Wyse-325 with visual bell, bel@, use=wy325, # # lines 24 columns 132 # wy325-w|wyse325-w|wy325w-24|Wyse-325 in wide mode, cols#132, lw#7, nlab#16, wsl#97, cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<12>, ip=$<4>, rs2=\E`;$<70>, use=wy325, # # lines 25 columns 80 # wy325-25|wyse325-25|wy325-80|wyse-325|Wyse-325 25 lines, lh@, lines#25, lw@, nlab@, pln@, rs3=\EwG\Ee)$<100>, use=wy325, # # lines 25 columns 132 # wy325-25w|wyse325-25w|Wyse-325 132 columns, lh@, lines#25, lw@, nlab@, pln@, rs3=\EwG\Ee)$<100>, use=wy325-w, # # lines 25 columns 132 vb # wy325-w-vb|wy325-wvb|wyse325-wvb|Wyse-325 wide mode reverse video, bel@, use=wy325-w, # # lines 42 columns 80 # wy325-42|wyse325-42|Wyse-325 42 lines, lh@, lines#42, lw@, nlab@, pln@, rs3=\EwG\Ee)$<100>, use=wy325, # # lines 42 columns 132 # wy325-42w|wyse325-42w|Wyse-325 42 lines wide mode, lh@, lines#42, lw@, nlab@, pln@, rs3=\EwG\Ee)$<100>, use=wy325-w, # # lines 42 columns 132 vb # wy325-42w-vb|wy325-42wvb|Wyse-325 42 lines wide mode visual bell, bel@, use=wy325-w, # # lines 43 columns 80 # wy325-43|wyse325-43|Wyse-325 43 lines, lh@, lines#43, lw@, nlab@, pln@, use=wy325, # # lines 43 columns 132 # wy325-43w|wyse325-43w|Wyse-325 43 lines wide mode, lh@, lines#43, lw@, nlab@, pln@, rs3=\EwG\Ee)$<100>, use=wy325-w, # # lines 43 columns 132 vb # wy325-43w-vb|wy325-43wvb|Wyse-325 43 lines wide mode visual bell, bel@, use=wy325-w, # Wyse 370 -- 24 line screen with status line. # # The terminal may have to be set for 8 data bits and 2 stop # bits for the arrow keys to work. # # If you change keyboards the terminal will send different # escape sequences. # The following definition is for the basic terminal without # function keys. # # -> 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, bold=\E[1m, 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=, smso=\E[7m, smul=\E[4m, 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+sgr, 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, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, clear=\E[H\E[J$<40>, cnorm=\E[34h\E[?25h, cr=\r, csr=\E[%i%p1%d;%p2%dr$<20>, 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`, ht=^I, hts=\EH, 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, rmso=\E[m, rmul=\E[24m, rs1=\E[13l\E[3l\E\\\E[63;1"p\E[!p, rs2=\E[35h\E[?3l, rs3=\E[?5l\E[47h\E[40l\E[r, sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%? %p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smcup=\E[ Q\E[?67;8h, smir=\E[4h, smso=\E[7m, smul=\E[4m, tbc=\E[3g, tsl=\E[2$~\E[1$}\E[%i%p1%d`, vpa=\E[%i%p1%dd, use=ansi+arrows, use=ansi+csr, use=ansi+local, use=ansi+pp, use=ansi+sgr, 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, eslok, hs, km, mir, msgr, xenl, cols#80, it#8, lines#49, pb#9600, vt#3, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cmdch=\E, cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, dsl=\E[0$~, ech=\E[%p1%dX, flash=\E[?5h$<100/>\E[?5l\E[?5h$<100/>\E[?5l\E[?5h$<100/>\E[ ?5l, fsl=\E[0$}, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, 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=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, rmso=\E[m, rmul=\E[m, 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, smso=\E[7m, smul=\E[4m, tsl=\E7\E[25;%p1%{1}%+%dH, use=ansi+arrows, use=ansi+csr, use=ansi+erase, use=ansi+local1, use=ansi+sgr, 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, dim=\E[2m, 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|, rmso=\E[m, rmul=\E[m, 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~, smso=\E[7m, smul=\E[4m, 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+sgr, 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, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EP, kdl1=\EM, kf0=\EU, kf3=\E@, khome=\EH, kich1=\E\^, kil1=\EL, kind=\ES, kri=\ET, lf0=segment advance, lf3=cursor tab, rmdc@, rmso=\E~, rmul=\EZ, smdc@, smso=\E}, smul=\E\\, # The following is a terminfo entry for the Teletype 4424 # asynchronous keyboard-display terminal. It supports # the vi editor. The terminal must be set up as follows, # # HIGHLIGHT DEFINITION 3-TONE # DISPLAY FUNCTION GROUP III # # The second entry below provides limited (a la adm3a) # operation under GROUP II. # # This must be used with DISPLAY FUNCTION GROUP I or III # and HIGHLIGHT DEFINITION 3-TONE # The terminal has either bold or blink, depending on options # # (att4424: commented out =\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, am, da, db, hs, mir, msgr, xenl, xon, cols#80, lh#2, lines#24, lm#78, lw#8, nlab#8, wsl#55, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, bold=\E[2;7m, cnorm=\E[12;0j, cr=\r, 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, enacs=\E(B\E)0, flash=\E[?5h$<200>\E[?5l, fsl=\E8, home=\E[H, hpa=\E[%p1%{1}%+%dG, ich=\E[%p1%d@, ind=\n, 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, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[21;0j\E[25;1j\212, rmln=\E|, rmso=\E[m, rmul=\E[m, rs2=\Ec\E[?3l\E[2;0y, sgr=\E[0%?%p5%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6 %|%t;7%;%?%p7%t;8%;m%?%p8%t\EV%;%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, smkx=\E[21;1j\E[25;4j\Eent\E~, smln=\E~, smso=\E[7m, smul=\E[4m, 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+sgr, use=decid+cpr, att5425-nl|tty5425-nl|att4425-nl|AT&T 4425/5425 80 columns no labels, smkx=\E[21;1j\E[25;4j\Eent, use=att4425, att5425-w|att4425-w|tty5425-w|Teletype 4425/5425 in 132 column mode, cols#132, lm#54, wsl#97, is1=\E[?3h$<100>, use=tty5425, # (att4426: his had bogus capabilities: :ri=\EM:, :ri=\E[1U:. # I also added / -- 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW, khome=\E[H, kll=\E[24;1H, ll=\E[24H, nel=\r\n, rc=\E8, rev=\E[7m, ri=\ET, rmacs=\E(B, rmam=\E[?7l, rmso=\E[m, rmul=\E[m, rs2=\Ec\E[?3l\E[2;0y, sc=\E7, sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smso=\E[5m, smul=\E[4m, tbc=\E[3g, vpa=\E[%p1%dd, use=ansi+idl, use=ansi+local, use=ecma+index, # Terminfo entry for the AT&T 510 A Personal Terminal # Function keys 9 - 16 are available only after the # screen labeled (soft keys/action blocks) are labeled. Function key # 9 corresponds to the leftmost touch target on the screen, # function key 16 corresponds to the rightmost. # # This entry is based on one done by Ernie Rice at Summit, NJ and # changed by Anne Gallup, Skokie, IL, ttrdc!anne att510a|bct510a|AT&T 510A Personal Terminal, am, mir, msgr, xenl, xon, cols#80, lh#2, lines#24, lw#7, nlab#8, acsc=+g\,h-f.e`bhrisjjkkllmmnnqqttuuvvwwxx{{||}}~~, bel=^G, blink=\E[5m, bold=\E[2;7m, cbt=\E[Z, civis=\E[11;0|, clear=\E[H\E[J, cnorm=\E[11;3|, cr=\r, 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, ht=^I, hts=\EH, ind=\n, is1=\E(B\E)1\E[2l, is3=\E[21;1|\212, kLFT=\E[u, kRIT=\E[v, kbs=^H, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOm, kf10=\EOd, kf11=\EOe, kf12=\EOf, kf13=\EOg, kf14=\EOh, kf15=\EOi, kf16=\EOj, kf2=\EOV, kf3=\EOu, kf4=\ENj, kf5=\ENe, kf6=\ENf, kf7=\ENh, kf8=\E[H, kf9=\EOc, kind=\E[S, kri=\E[T, mc0=\E[0i, mc4=\E[?8i, mc5=\E[?4i, nel=\EE, pln=\E[%p1%dp%p2%:-16s, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O, rmkx=\E[19;0|, rmso=\E[m, rmul=\E[m, sc=\E7, sgr=\E[0%?%p5%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6 %|%t;7%;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smkx=\E[19;1|, smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=ansi+cpr, use=ansi+idl, use=ansi+local, # 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, cbt=\E[Z, 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, ht=^I, hts=\EH, 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<, rmso=\E[m, rmul=\E[m, rmxon=\E[29;1|, rs2=\E[5;0|, sc=\E7, sgr=\E[0%?%p5%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6 %|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smgl=\E4, smgr=\E5, smir=\E[4h, smkx=\E[19;1|, smln=\E?, smso=\E[7m, smul=\E[4m, smxon=\E[29;0|, tbc=\E[3g, vpa=\E[%p1%{1}%+%dd, use=ansi+cpr, use=ansi+idl, use=ansi+local, use=ansi+rep, use=ansi+sgr, 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, cbt=\E[Z, 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, ht=^I, hts=\EH, 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<, rmso=\E[m, rmul=\E[m, rs1=\E?\E[3;3|\E[10;0|\E[21;1|\212\E[6;1|\E[1{\E[?99l\E[2;0| \E[6;1|\E[8;0|\E[19;0|\E[1{\E[?99l, rs2=\E[5;0|, sc=\E7, sgr=\E[0%?%p1%p5%|%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1 %|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, sgr0=\E[m\017, smacs=^N, smir=\E[4h, smkx=\E[19;1|\E[21;4|\Eent, smln=\E?, smso=\E[7m, smul=\E[4m, tbc=\E[3g, vpa=\E[%p1%{1}%+%dd, use=ansi+arrows, use=ansi+erase, use=ansi+idl, use=ansi+local, use=ansi+rep, use=ansi+sgr, 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, bold=\E[1m, 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, rmso=\E[m, rmul=\E[m, 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, smso=\E[7m, smul=\E[4m, 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+sgr, 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, bold=\E[1m, 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, rmso=\E[m, rmul=\E[m, 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, smso=\E[7m, smul=\E[4m, 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+sgr, 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, bold=\E[1m, 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, mc0=\E[i, mc4=\E[?4i, mc5=\E[?5i, nel=\EE, pfx=\E[%p1%d;%p2%l%02dq%?%p1%{9}%<%t\s\s\sF%p1%1d\s\s\s\s\s \s\s\s\s\s\s%;%p2%s, pln=\E[%p1%d;0;0;0q%p2%:-16.16s, 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, smso=\E[7m, smul=\E[4m, 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+sgr, use=decid+cpr, 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, bold=\E[1m, cbt=\E[Z, cr=\r, cub1=^H, 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, 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, mc4=\E[?4i, mc5=\E[?5i, nel=\EE, pfx=\E[%?%p1%{25}%<%t%p1%e%p1%{24}%-%;%d;%p2%l%02d%?%p1%{25} %<%tq\s\s\sSYS\s\s\s\s\sF%p1%:-2d\s\s%e;0;3q%;%p2%s, pfxl=\E[%p1%d;%p2%l%02d;0;0q%p3%:-16.16s%p2%s, pln=\E[%p1%d;0;0;0q%p2%:-16.16s, 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, smso=\E[7m, smul=\E[4m, 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+sgr, use=decid+cpr, 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, bold=\E[1m, 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, rmso=\E[m, rmul=\E[m, sc=\E7, sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1; %;%?%p7%t8;%;m, sgr0=\E[m, smkx=\EP`>z~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\E \\, smm=\E[>52h, smso=\E[7m, smul=\E[4m, vpa=\E[%p1%{1}%+%dd, use=ansi+arrows, use=ansi+idl, use=ansi+inittabs, use=ansi+local, use=ansi+rep, use=ansi+sgr, 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, bold=\E[1m, 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, smso=\E[7m, smul=\E[4m, 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+sgr, 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, bce, colors#16, ncv#53, pairs#0x100, op=\036Ad\036Bd, setab=\036B%p1%?%p1%{8}%<%t%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1 %{4}%&%t%{1}%|%;%;%{48}%+%c, setaf=\036A%p1%?%p1%{8}%<%t%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1 %{4}%&%t%{1}%|%;%;%{48}%+%c, setb=\036B%p1%{48}%+%c, setf=\036A%p1%{48}%+%c, dg+fixed|Fixed color info for DG D430C terminals in DG mode, use=dgunix+fixed, # Video attributes are coordinated using static variables set by "sgr", then # checked by "op", "seta[bf]", and "set[bf]" to refresh the attribute settings. # (D=dim, U=underline, B=blink, R=reverse.) dg+color8|Color info for Data General D220 and D230C terminals in ANSI mode, bce, colors#8, ncv#16, pairs#64, op=\E[%?%gD%t2;%;%?%gU%t4;%;%?%gB%t5;%;%?%gR%t7;%;m, setab=\E[4%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m, setaf=\E[3%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m, setb=\E[4%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%|%; %d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m, setf=\E[3%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%|%; %d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m, dg+color|Color info for Data General D470C terminals in ANSI mode, colors#16, ncv#53, pairs#0x100, setab=\E[%?%p1%{8}%<%t4%p1%e=%p1%{2}%&%?%p1%{1}%&%t%{4}%|%; %?%p1%{4}%&%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t ;5%;%?%gR%t;7%;m, setaf=\E[%?%p1%{8}%<%t3%p1%e<%p1%{2}%&%?%p1%{1}%&%t%{4}%|%; %?%p1%{4}%&%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t ;5%;%?%gR%t;7%;m, setb=\E[%?%p1%{8}%<%t4%e=%;%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%? %p1%{4}%&%t%{1}%|%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%; %?%gR%t;7%;m, setf=\E[%?%p1%{8}%<%t3%e<%;%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%? %p1%{4}%&%t%{1}%|%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%; %?%gR%t;7%;m, use=dg+color8, dgmode+color8|Color info for Data General D220/D230C terminals in DG mode, bce, colors#8, ncv#16, pairs#64, op=\036Ad\036Bd, setab=\036B%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%| %;%{48}%+%c, setaf=\036A%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%| %;%{48}%+%c, setb=\036B%p1%{48}%+%c, setf=\036A%p1%{48}%+%c, dgmode+color|Color info for Data General D470C terminals in DG mode, colors#16, pairs#0x100, setab=\036B%p1%?%p1%{8}%<%t%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1 %{4}%&%t%{1}%|%;%;%{48}%+%c, setaf=\036A%p1%?%p1%{8}%<%t%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1 %{4}%&%t%{1}%|%;%;%{48}%+%c, use=dgmode+color8, dgunix+ccc|Configurable color info for DG D430C terminals in DG-UNIX mode, bce, ccc, colors#52, ncv#53, pairs#26, initp=\036RG0%p1%02X%p2%{255}%*%{1000}%/%02X%p3%{255}%* %{1000}%/%02X%p4%{255}%*%{1000}%/%02X%p5%{255}%* %{1000}%/%02X%p6%{255}%*%{1000}%/%02X%p7%{255}%* %{1000}%/%02X, oc=\036RG01A00FF00000000\036RG01B00000000FF00 \036RG01C007F00000000\036RG01D000000007F00, op=\036RF4831A\036RF2E31B\036RF1D31C\036RF3F31D, scp=\036RG2%p1%02X, # Colors are in the order: normal, reverse, dim, dim + reverse. dg+ccc|Configurable color info for DG D430C terminals in DG mode, bce, ccc, colors#52, ncv#53, pairs#26, initp=\036RG0%p1%{16}%/%{48}%+%c%p1%{16}%m%{48}%+%c%p2%{255} %*%{1000}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c %p3%{255}%*%{1000}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m %{48}%+%c%p4%{255}%*%{1000}%/%Pa%ga%{16}%/%{48}%+%c%ga %{16}%m%{48}%+%c%p5%{255}%*%{1000}%/%Pa%ga%{16}%/%{48} %+%c%ga%{16}%m%{48}%+%c%p6%{255}%*%{1000}%/%Pa%ga%{16} %/%{48}%+%c%ga%{16}%m%{48}%+%c%p7%{255}%*%{1000}%/%Pa %ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c, oc=\036RG01:00??00000000\036RG01;00000000??00\036RG01<007?00 000000\036RG01=000000007?00, op=\036RF4831:\036RF2>31;\036RF1=31<\036RF3?31=, scp=\036RG2%p1%{16}%/%{48}%+%c%p1%{16}%m%{48}%+%c, # The generic DG terminal type (an 8-bit-clean subset of the 6053) # Initialization string 1 sets: # ^R - vertical scrolling enabled # ^C - blinking enabled dg-generic|generic Data General terminal in DG mode, am, bw, msgr, xon, cols#80, lines#24, bel=^G, blink=^N, clear=^L, cr=\r, cub1=^Y, cud1=^Z, cuf1=^X, cup=\020%p2%c%p1%c, cuu1=^W, dim=^\, el=^K, ind=\n, is1=^R^C, mc0=^Q, nel=\n, rmso=^], rmul=^U, sgr0=^O^U^], smso=^\, smul=^T, use=dgkeys+11, # According to the 4.4BSD termcap file, the dg200 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, kf1=\Ep\r, kf2=\Eq\r, kf3=\Er\r, kf4=\Es\r, kf5=\Et\r, kf6=\Eu\r, kf7=\Ev\r, kf8=\Ew\r, kf9=\Ex\r, khome=\EH, pad=^?, rmdc@, rmir=\EP, rmso@, smdc@, smso@, use=dm3025, # Datamedia DT80 soft switches: # 1 0=Jump 1=Smooth # Autorepeat 0=off 1=on # Screen 0=Dark 1=light # Cursor 0=u/l 1=block # # 2 Margin Bell 0=off 1=on # Keyclick 0=off 1=on # ANSI/VT52 0=VT52 1=ANSI # Xon/Xoff 0=Off 1=On # # 3 Shift3 0=Hash 1=UK Pound # Wrap 0=Off 1=On # Newline 0=Off 1=On # Interlace 0=Off 1=On # # 4 Parity 0=Odd 1=Even # Parity 0=Off 1=On # Bits/Char 0=7 1=8 # Power 0=60Hz 1=50Hz # # 5 Line Interface 0=EIA 1=Loop # Aux Interface 0=EIA 1=Loop # Local Copy 0=Off 1=On # Spare # # 6 Aux Parity 0=Odd 1=Even # Aux Parity 0=Off 1=On # Aux Bits/Char 0=7 1=8 # CRT Saver 0=Off 1=On # dm80/1 is a VT100 lookalike, but it doesn't seem to need any padding. dm80|dmdt80|dt80|Datamedia dt80/1, clear=\E[2J\E[H, 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, am, mir, msgr, xenl, xon, cols#80, it#8, lines#24, vt#3, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, clear=\E[H\E[J$<50>, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C$<2>, cup=\E[%i%p1%d;%p2%dH$<5>, cuu1=\E[A$<2>, dch1=\E~W, dl1=\E~R, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ich1=\E~Q, il1=\E~E, ind=\n, is1=\E~)\E~ea, kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, 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=ansi+local, use=decid+cpr, use=vt100+fnkeys, ts100-ctxt|Falco ts-100 saving context, rmcup=\E~_b, smcup=\E~_d\E[2J, use=ts100, #### Florida Computer Graphics # # Florida Computer Graphics Beacon System, using terminal emulator program # "host.com", as provided by FCG. This description is for an early release # of the "host" program. Known bug: 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=^_, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdl1=\EM, ked=\EJ, kel=\EK, kf0=\E2, kf9=\E1, khome=\EH, kich1=\EQ\EO, krmir=\ER, lf0=TAB CLEAR, lf9=TAB SET, rmcup=, rmir=\ER, rmso=\E_3, rmul=\E_3, sgr0=\E_3, smcup=\EO, smir=\EQ\EO, smso=\E_1, smul=\E_0, tbc=\E3, use=hp+pfk-cr, sbi|superbee|Beehive SuperBee at Indiana U., xsb, cr=\r$<1>, il1=\EN$<1>\EL$<9>\EQ \EP$<9> \EO\ER\EA, use=sb1, # Alternate (older) description of Superbee - f1=escape, f2=^C. # Note: there are at least 3 kinds of superbees in the world. The sb1 # holds onto escapes and botches ^C's. The sb2 is the best of the 3. # The sb3 puts garbage on the bottom of the screen when you scroll with # the switch in the back set to CRLF instead of AEP. This description # is tested on the sb2 but should work on all with either switch setting. # The f1/f2 business is for the sb1 and the 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\EH, rmso=\E_3, sgr0=\E_3, smso=\E_1, tbc=\E3, use=hp+pfk-cr, # This loses on lines > 80 chars long, use at your own risk superbeeic|SuperBee with insert char, ich1=, rmir=\ER, smir=\EQ, use=superbee-xsb, sb2|sb3|fixed SuperBee, xsb@, use=superbee, #### Beehive Medical Electronics # # Steve Seymour 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EP, kdl1=\EM, kel=\EK, khome=\EH, kich1=\EQ, kil1=\EL, krmir=\E@, rmir=\E@, rmso=\Ed@, rmul=\Ed@, sgr0=\Ed@, smir=\EQ, smso=\EdP, smul=\Ed`, # set tab is ^F, clear (one) tab is ^V, no way to clear all tabs. # good grief - does this entry make :sg:/:ug: when it doesn't have to? # look at those spaces in /. 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf9=\Ex, khome=\EH, rmso=\Ed@, rmul=\Ed@, sgr0=\Ed@, smso=\s\EdP, smul=\Ed`, use=hp+pfk-cr, # 8675, 8686, and bee from Cyrus Rahman # (8675: changed k10, k11...k16 to k;, F1...F6 -- esr) ha8675|Harris 8675, is2=\ES\E#\E*\Eh\Em\E?\E1\E9\E@\EX\EU, kf1=^F, kf10=\Ed, kf11=^W, kf12=\ER, kf13=\EE, kf14=\EI, kf15=\Ei, kf16=\Eg, kf2=^P, kf3=^N, kf4=^V, kf5=\n, kf6=^T, kf7=^H, kf8=^?, kf9=\Ee, use=bee, # (8686: changed k10, k11...k16 to k;, F1...F6; fixed broken continuation # in :is: -- esr) ha8686|Harris 8686, is2=\ES\E#\E*\Eh\Em\E?\E1\E9\E@\EX\EU\E"*Z01\E"8F35021B7C83# \E"8F45021B7D83#\E"8F55021B7E83#\E"8F65021B7F83#\E"8F750 21B7383#\E"8F851BD7#\E"8F95021B7083#\E"8FA5021B7183#\E"8 FB5021B7283#, kf1=^B\Ep^C, kf10=\Ej, kf11=\EW, kf12=^B\E{^C, kf13=^B\E|^C, kf14=^B\E}^C, kf15=^B\E~^C, kf16=^B\E^?^C, kf2=^B\Eq^C, kf3=^B\Er^C, kf4=^B\Es^C, kf5=\E3, kf6=\EI, kf7=\ER, kf8=\EJ, kf9=\E(, use=bee, #### Hazeltine # # Hazeltine appears to be out of the terminal business as of 1995. These # guys were co-owners of the Terminal Brain Damage Hall Of Fame along with # Harris. They have a hazeltine.com domain (but no web page there ) and can # be reached at: # # Hazeltine # 450 East Pulaski Road # Greenlawn, New York 11740 # # As late as 1993, manuals for the terminal product line could still be # purchased from: # # TRW Customer Service Division # 15 Law Drive # P.O. Box 2076 # Fairfield, NJ 07007-2078 # # They're now (1998) a subsidiary of General Electric, operating under the # marque "GEC-Marconi Hazeltine" and doing military avionics. Web page # at . # # 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, nel=\r\n, tbc=\EH, 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EQ, kdl1=\EO, ked=\EJ, kel=\EI, kf1=\Ea\r, kf10=\Ej\r, kf11=\Ek\r, kf12=\El\r, kf13=\E!a\r, kf14=\E!b\r, kf15=\E!c\r, kf16=\E!d\r, kf17=\E!e\r, kf18=\E!f\r, kf19=\E!g\r, kf2=\Eb\r, kf20=\E!h\r, kf21=\E!i\r, kf22=\E!j\r, kf23=\E!k\r, kf24=\E!l\r, kf3=\Ec\r, kf4=\Ed\r, kf5=\Ee\r, kf6=\Ef\r, kf7=\Eg\r, kf8=\Eh\r, kf9=\Ei\r, khome=\EH, khts=\E0, kich1=\EP \010, kil1=\EN, ktbc=\E 1, mc4=^P^T, mc5=^P^R, rev=\E4A, rmcup=\E>A, rmso=\E4@, rmul=\E4@, sgr=\E4%{64}%?%p1%t%{65}%|%;%?%p2%t%{66}%|%;%?%p3%t%{65}%|%; %?%p4%t%{68}%|%;%?%p5%t%{64}%|%;%?%p6%t%{72}%|%;%?%p7%t %{80}%|%;%c%?%p9%t\E>A%e\E<@%;, sgr0=\E4@\E<@, smcup=\E>A, smso=\E4A, smul=\E4B, ibm3161-C|IBM 3161-C NLS terminal using cartridge, rmcup=\E>B, s0ds=\E>B, s1ds=\E>A, smcup=\E>B, use=ibm3161, # # From: Stephen Powell 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, bold=\E[1m, 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, rmso=\E[m, rmul=\E[m, rs2=\Ec, sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1 %;%?%p7%t;8%;m, sgr0=\E[0m, smir=\E[4h, smso=\E[7m, smul=\E[4m, use=ansi+arrows, use=ansi+erase, use=ansi+idl, use=ansi+local, use=ansi+sgr, use=ecma+index, ibmaed|IBM Experimental display, OTbs, am, eo, msgr, cols#80, it#8, lines#52, clear=\EH\EK, cub1=^H, cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EQ, dl1=\EO, ed=\EJ, el=\EI, flash=\EG, home=\EH, ht=^I, ich1=\EP, il1=\EN, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, rmso=\E0, sgr0=\E0, smso=\E0, ibm-apl|apl|IBM apl terminal simulator, lines#25, use=dm1520, # (ibmmono: this had an unknown `sb' boolean, I changed it to `bs'. # Also it had ":I0=f10:" which pretty obviously should be "l0=f10" -- esr) ibmmono|IBM workstation monochrome, eslok, hs, bold=\EZ, dl1=\EM, dsl=\Ej\EY8 \EI\Ek, fsl=\Ek, il1=\EL, invis=\EF\Ef0;\Eb0;, kbs=^H, kf0=\E<, kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, kf9=\EY, khome=\EH, kich1=\0, kind=\EE, knp=\EE, kpp=\Eg, kri=\EG, lf0=f10, rev=\Ep, ri=\EA, rmso=\Ez, rmul=\Ew, sgr0=\Ew\Eq\Ez\EB, smso=\EZ, smul=\EW, tsl=\Ej\EY8%+ \Eo, use=ibm3101, ibmega|IBM Enhanced Color Display, 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, bold=\E[1m, 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%;, sgr0=\E[0m, smacs=\E(0, smir=\E[4h, smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=ansi+arrows, use=ansi+idl, use=ansi+local, use=ansi+sgr, 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, ri=\EA, rmir=^Z, rmso=\E9, rmul=\E5, smir=^O, smso=\E8, smul=\E4, # (mime3a: removed obsolete ":ma=^X ^K^J^Z^P:" -- esr) mime3a|mime1 emulating 3a, am@, 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, bold=\E[1m, 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, smul=\E[4m, tbc=\E[3g, vpa=\E[%p1%dd$<40>, use=ansi+csr, use=ansi+sgr, 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, bold=\E[1m, clear=\E[2J\E[1;1H$<20>, cr=\r$<1>, csr=\E[%i%p1%d;%p2%dr$<5>, cub=\E[%p1%dD$<5>, cub1=\E[D$<5>, cud=\E[%p1%dB$<5>, cud1=\E[B$<5>, cuf=\E[%p1%dC$<5>, cuf1=\E[C$<5>, cup=\E[%i%p1%d;%p2%dH$<10>, cuu=\E[%p1%dA$<5>, cuu1=\E[A$<5>, dch=\E[%p1%dP$<5>, dch1=\E[1P$<5>, dl=\E[%p1%dM$<5>, dl1=\E[M$<5>, ech=\E[%p1%dX$<5>, ed=\E[0J, el=\E[0K$<5>, el1=\E[1K$<5>, home=\E[H, hpa=\E[%p1%dG$<40>, ht=^I, hts=\EH, ich=\E[%p1%d@$<5>, il=\E[%p1%dL$<5>, il1=\E[L$<5>, ind=\ED$<5>, indn=\E[%p1%dE$<5>, 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=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, vpa=\E[%p1%dd$<40>, use=ansi+sgr, 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, bold=\E[1m, clear=\E[2J\E[1;1H$<20>, cr=\r$<1>, csr=\E[%i%p1%d;%p2%dr$<5>, cub=\E[%p1%dD$<5>, cub1=\E[D$<5>, cud=\E[%p1%dB$<5>, cud1=\E[B$<5>, cuf=\E[%p1%dC$<5>, cuf1=\E[C$<5>, cup=\E[%i%p1%d;%p2%dH$<10>, cuu=\E[%p1%dA$<5>, cuu1=\E[A$<5>, dch=\E[%p1%dP$<5>, dch1=\E[1P$<5>, dl=\E[%p1%dM$<5>, dl1=\E[M$<5>, ech=\E[%p1%dX$<5>, ed=\E[0J, el=\E[0K$<5>, el1=\E[1K$<5>, home=\E[H, hpa=\E[%p1%dG$<40>, ht=^I, hts=\EH, ich=\E[%p1%d@$<5>, il=\E[%p1%dL$<5>, il1=\E[L$<5>, ind=\ED$<5>, indn=\E[%p1%dE$<5>, 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=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, vpa=\E[%p1%dd$<40>, use=ansi+sgr, 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, am, bw, km, mc5i, mir, msgr, xon, colors#16, cols#80, lines#24, ncv#33, nlab#32, pairs#16, xmc#1, acsc=07a?h;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=\r, cub1=\010$<5>, cud1=\n$<5>, cuf1=\014$<5>, cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<40>, cuu1=\013$<5>, cvvis=\E`5, dch1=\EW$<50>, dim=\EGp, dl1=\ER$<5>, ed=\Ey$<5>, el=\Et$<5>, home=\036$<10>, ht=^I, hts=\E1, il1=\EE$<5>, ind=\n$<5>, invis=\EG1, is2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"\Ee4\Ex@\E`9 \Ee7$<100>, kDC=\ER, kEND=\EY, kHOM=\E{, kPRT=\E7, kRIT=^L, ka1=^^, kbs=^H, kc1=\ET, kc3=\EK, kcbt=\EI, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kend=\ET, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, kf17=^A`\r, kf18=^Aa\r, kf19=^Ab\r, kf2=^AA\r, kf20=^Ac\r, kf21=^Ad\r, kf22=^Ae\r, kf23=^Af\r, kf24=^Ag\r, kf25=^Ah\r, kf26=^Ai\r, kf27=^Aj\r, kf28=^Ak\r, kf29=^Al\r, kf3=^AB\r, kf30=^Am\r, kf31=^An\r, kf32=^Ao\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\Eq, knp=\EK, kpp=\EJ, kprt=\EP, mc0=\EP$<10>, mc4=^T, mc5=^R, mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<20>, nel=\037$<5>, rev=\EG4, ri=\Ej$<5>, rmacs=\EH\003\EcB0, rmam=\Ed., rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20, rs2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"\Ee4\Ex@\E`9 \Ee7$<100>, setb=\s, setf=%?%p1%{0}%=%t%{49}%e%p1%{1}%=%t%{50}%e%p1%{2}%=%t%{51} %e%p1%{3}%=%t%{52}%e%p1%{4}%=%t%{53}%e%p1%{5}%=%t%{54} %e%p1%{6}%=%t%{55}%e%p1%{7}%=%t%{102}%e%p1%{8}%=%t%{97} %e%p1%{9}%=%t%{98}%e%p1%{10}%=%t%{99}%e%p1%{11}%=%t %{101}%e%p1%{12}%=%t%{106}%e%p1%{13}%=%t%{110}%e%p1 %{14}%=%t%{111}%e%p1%{15}%=%t%{56}%;\Em0%c$<100>, sgr0=\EG0\EH\003\EcD, smacs=\EH\002\EcB1, smam=\Ed/, smir=\Eq, smso=\EGt, smul=\EG8, smxon=\Ec21, tbc=\E0, use=ncr260vp+sl, ncr260wy350wpp|NCR 2900/260 Wyse 350 wide mode, cols#132, cup=\Ea%i%p1%dR%p2%dC$<30>, is2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"\Ee4\Ex@\E`9 \Ee7$<200>, rs2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"\Ee4\Ex@\E`9 \Ee7$<200>, use=ncr260wy350pp, # This definition for Wyse 50+ supports several attributes. This means # that it has magic cookies (extra spaces where the attributes begin). # Some applications do not function well with magic cookies. The System # Administrator's Shell in NCR Unix SVR4 1.03 is one such application. # If supporting various attributes is not vital, 'xmc#1' and the extra # attributes can be removed. # Mapping to ASCII character set ('acsc' capability) can also be # restored if needed. # (ncr260wy50+pp: originally contained commented-out # , as well as the commented-out one there -- esr) ncr260wy50+pp|NCR 2900/260 Wyse 50+, am, bw, km, mc5i, mir, msgr, xon, cols#80, lines#24, nlab#32, xmc#1, acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, blink=\EG2, cbt=\EI$<5>, civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=\r, cub1=\010$<5>, cud1=\n$<5>, cuf1=\014$<5>, cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<30>, cuu1=\013$<5>, cvvis=\E`5, dch1=\EW$<50>, dim=\EGp, dl1=\ER$<5>, ed=\EY$<5>, el=\ET$<5>, home=\036$<10>, ht=\011$<5>, hts=\E1$<5>, il1=\EE$<5>, ind=\n$<5>, invis=\EG1, is2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E" \Ee4\Ex@\E`9\Ee7$<100>, kDC=\ER, kEND=\EY, kHOM=\E{, kPRT=\E7, kRIT=^L, ka1=^^, kbs=^H, kc1=\ET, kc3=\EK, kcbt=\EI, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kend=\ET, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, kf17=^A`\r, kf18=^Aa\r, kf19=^Ab\r, kf2=^AA\r, kf20=^Ac\r, kf21=^Ad\r, kf22=^Ae\r, kf23=^Af\r, kf24=^Ag\r, kf25=^Ah\r, kf26=^Ai\r, kf27=^Aj\r, kf28=^Ak\r, kf29=^Al\r, kf3=^AB\r, kf30=^Am\r, kf31=^An\r, kf32=^Ao\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\Eq, knp=\EK, kpp=\EJ, kprt=\EP, mc0=\EP$<10>, mc4=^T, mc5=^R, mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<10>, nel=\037$<5>, rev=\EG4, ri=\Ej$<5>, rmacs=\EH^C, rmam=\Ed., rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20, rs2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E" \Ee4\Ex@\E`9\Ee7$<100>, sgr0=\EG0\EH\003$<15>, smacs=\EH^B, smam=\Ed/, smir=\Eq, smso=\EGt, smul=\EG8, smxon=\Ec21, tbc=\E0$<5>, use=ncr260vp+sl, ncr260wy50+wpp|NCR 2900/260 Wyse 50+ wide mode, cols#132, cup=\Ea%i%p1%dR%p2%dC$<30>, is2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E" \Ee4\Ex@\E`9\Ee7$<200>, rs2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E" \Ee4\Ex@\E`9\Ee7$<200>, use=ncr260wy50+pp, ncr260wy60pp|NCR 2900/260 Wyse 60, am, bw, km, mc5i, mir, msgr, xon, cols#80, lines#24, nlab#32, acsc=07a?h;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, blink=\EG2, cbt=\EI$<15>, civis=\E`0, clear=\E*$<100>, cnorm=\E`1, cr=\r, cub1=\010$<5>, cud1=\n$<5>, cuf1=\014$<5>, cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<10>, cuu1=\013$<5>, cvvis=\E`5, dch1=\EW$<50>, dl1=\ER$<5>, ed=\Ey$<5>, el=\Et$<5>, home=\036$<25>, ht=\011$<15>, hts=\E1$<15>, il1=\EE$<5>, ind=\n$<5>, invis=\EG1, is2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E" \Ee4\Ex@\E`9\Ee7$<100>, kDC=\ER, kEND=\EY, kHOM=\E{, kNXT=\EK, kPRT=\E7, kPRV=\EJ, kRIT=^L, ka1=^^, kb2=\EJ, kbs=^H, kc1=\ET, kc3=\EK, kcbt=\EI$<15>, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kend=\ET, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, kf17=^A`\r, kf18=^Aa\r, kf19=^Ab\r, kf2=^AA\r, kf20=^Ac\r, kf21=^Ad\r, kf22=^Ae\r, kf23=^Af\r, kf24=^Ag\r, kf25=^Ah\r, kf26=^Ai\r, kf27=^Aj\r, kf28=^Ak\r, kf29=^Al\r, kf3=^AB\r, kf30=^Am\r, kf31=^An\r, kf32=^Ao\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\Eq, knp=\EK, kpp=\EJ, kprt=\EP, mc0=\EP, mc4=^T, mc5=^R, mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<30>, nel=\037$<5>, rev=\EG4, ri=\Ej$<5>, rmacs=\EH^C, rmam=\Ed., rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20, rs2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E" \Ee4\Ex@\E`9\Ee7$<100>, sgr0=\EG0\EcB0\EcD$<15>, smacs=\EH^B, smam=\Ed/, smir=\Eq, smso=\EGt, smul=\EG8, smxon=\Ec21, tbc=\E0$<15>, use=ncr260vp+sl, ncr260wy60wpp|NCR 2900/260 Wyse 60 wide mode, cols#132, cup=\Ea%i%p1%dR%p2%dC$<30>, is2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E" \Ee4\Ex@\E`9\Ee7$<100>, rs2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E" \Ee4\Ex@\E`9\Ee7$<100>, use=ncr260wy60pp, ncr160vppp|NCR 2900/160 viewpoint, use=ncr260vppp, ncr160vpwpp|NCR 2900/160 viewpoint wide mode, use=ncr260vpwpp, ncr160vt100an|NCR 2900/160 VT100 with ANSI keyboard, use=ncr260vt100an, ncr160vt100pp|NCR 2900/160 VT100 with PC+ keyboard, use=ncr260vt100pp, ncr160vt100wan|NCR 2900/160 VT100 wide mode ANSI keyboard, use=ncr260vt100wan, ncr160vt100wpp|NCR 2900/160 VT100 wide mode PC+ keyboard, use=ncr260vt100wpp, ncr160vt200an|NCR 2900/160 VT200 with ANSI keyboard, use=ncr260vt200an, ncr160vt200pp|NCR 2900/160 VT200 with PC+ keyboard, use=ncr260vt200pp, ncr160vt200wan|NCR 2900/160 VT200 wide mode ANSI keyboard, use=ncr260vt200wan, ncr160vt200wpp|NCR 2900/160 VT200 wide mode PC+ keyboard, use=ncr260vt200wpp, ncr160vt300an|NCR 2900/160 VT300 with ANSI keyboard, use=ncr260vt300an, ncr160vt300pp|NCR 2900/160 VT300 with PC+ keyboard, use=ncr260vt300pp, ncr160vt300wan|NCR 2900/160 VT300 wide mode ANSI keyboard, use=ncr260vt300wan, ncr160vt300wpp|NCR 2900/160 VT300 wide mode PC+ keyboard, use=ncr260vt300wpp, ncr160wy50+pp|NCR 2900/160 Wyse 50+, use=ncr260wy50+pp, ncr160wy50+wpp|NCR 2900/160 Wyse 50+ wide mode, use=ncr260wy50+wpp, ncr160wy60pp|NCR 2900/160 Wyse 60, use=ncr260wy60pp, ncr160wy60wpp|NCR 2900/160 Wyse 60 wide mode, use=ncr260wy60wpp, ncrvt100an|ncrvt100pp|NCR VT100 for the 2900 terminal, am, hs, mc5i, mir, msgr, xon, cols#80, it#8, lines#24, nlab#32, acsc=``aaffgghhiijjkkllmmnnqqttuuvvwwxxyyzz~~, bel=^G, blink=\E[5m$<30>, bold=\E[1m$<30>, clear=\E[2J\E[1;1H$<300>, cr=\r, csr=\E[%i%p1%d;%p2%dr$<100>, cub=\E[%p1%dD$<30>, cub1=\E[D$<2>, cud=\E[%p1%dB$<30>, cud1=\E[B$<2>, cuf=\E[%p1%dC$<30>, cuf1=\E[C$<2>, cup=\E[%i%p1%d;%p2%dH$<100>, cuu=\E[%p1%dA$<30>, cuu1=\E[A$<2>, dch=\E[%p1%dP$<40>, dch1=\E[1P$<10>, dl=\E[%p1%dM$<70>, dl1=\E[M$<40>, dsl=\E[31l$<25>, ed=\E[0J$<300>, el=\E[0K$<30>, el1=\E[1K$<30>, enacs=\E(B\E)0$<40>, fsl=1$<10>, home=\E[H$<2>$<80>, ht=^I, hts=\EH, il=\E[%p1%dL$<80>, il1=\E[B\E[L$<80>, ind=\ED, is2=\E[12h\E[?10l\E%/0n\E[P\031\E[?3l\E(B\E)0$<200>, kLFT=\E[D, kRIT=\E[C, ka1=\E[H, kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kent=\r, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, mc0=\E[i$<100>, nel=\EE, rc=\E8, rev=\E[7m$<30>, ri=\EM$<50>, rmacs=\017$<90>, rmir=\E[4l$<80>, rmso=\E[0m$<30>, rmul=\E[0m$<30>, rs2=\Ec\E[12;31h\E[?3;4;5;10l\E[?6;7;19;25h\E[33;34l\E[0m\E( B\E)0\E%/0n\E[P\031$<200>, sc=\E7, sgr=%?%p9%t\016%e\017%;\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1 %p3%|%t;7%;%?%p4%t;5%;m$<120>, sgr0=\017\E[0m$<120>, smacs=\016$<90>, smir=\E[4h$<80>, smso=\E[7m$<30>, smul=\E[4m$<30>, tbc=\E[3g$<40>, tsl=\E[>+1$<70>, use=decid+cpr, ncrvt100wan|NCRVT100WPP|ncrvt100wpp|NCR VT100 emulation of the 2900 terminal, cols#132, is2=\E[12h\E[?10l\E%/0n\E[P\031\E[?3h\E(B\E)0$<200>, rs2=\Ec\E[12;31h\E[?4;5;10l\E?3;6;7;19;25h\E[33;34l\E[0m\E(B \E)0\E%/0n\E[P\031$<200>, use=ncrvt100an, # # Vendor-supplied NCR termcaps end here # NCR7900 DIP switches: # # Switch A: # 1-4 - Baud Rate # 5 - Parity (Odd/Even) # 6 - Don't Send or Do Send Spaces # 7 - Parity Enable # 8 - Stop Bits (One/Two) # # Switch B: # 1 - Upper/Lower Shift # 2 - Typewriter Shift # 3 - Half Duplex / Full Duplex # 4 - Light/Dark Background # 5-6 - Carriage Return Without / With Line Feed # 7 - Extended Mode # 8 - Suppress Keyboard Display # # Switch C: # 1 - End of line entry disabled/enabled # 2 - Conversational mode / (Local?) Mode # 3 - Control characters displayed / not displayed # 4 - (2-wire?) / 4-wire communications # 5 - RTS on and off for each character # 6 - (50Hz?) / 60 Hz # 7 - Exit after level zero diagnostics # 8 - RS-232 interface # # Switch D: # 1 - Reverse Channel (yes / no) # 2 - Manual answer (no / yes) # 3-4 - Cursor appearance # 5 - Communication Rate # 6 - Enable / Disable EXT turnoff # 7 - Enable / Disable CR turnoff # 8 - Enable / Disable backspace # # Since each attribute parameter is 0 or 1, we shift each attribute (standout, # reverse, blink, dim, and underline) the appropriate number of bits (by # multiplying the 0 or 1 by a correct factor to shift) so the bias character, # '@' is (effectively) "or"ed with each attribute to generate the proper third # character in the 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, khome=\EH, lf6=blue, lf7=red, lf8=white, nel=\r\n, tsl=\Ej\Ex5\Ex1\EY8%p1%{32}%+%c\Eo, # Warning: This terminal will lock out the keyboard when it receives a CTRL-D. # The user can enter a CTRL-B to get out of this locked state. # In , 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, rmso=\E[m, rmul=\E[m, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\EW, sgr0=\E[m, smacs=\EF, smam=\E[?7m, smso=\E[7m, smul=\E[4m, tsl=\E], uc=\EPB, use=ansi+apparrows, use=ansi+local, #### 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@, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf0=\E1, kf1=\E2, kf2=\E3, kf3=\E4, kf4=\E5, kf5=\E6, kf6=\E7, kf7=\E8, kf8=\E9, kf9=\E0, khome=\EH, lf0=f1, lf1=f2, lf2=f3, lf3=f4, lf4=f5, lf5=f6, lf6=f7, lf7=f8, lf8=f9, lf9=f10, ll=\EE, rmul@, smul@, use=adm+sgr, dt100|dt-100|Tandy DT-100 terminal, xon, cols#80, lines#24, xmc#1, acsc=jjkkllmmnnqqttuuvvwwxx, bel=^G, clear=\E[H\E[2J, cr=\r, csr=\E[%p1%2d;%p2%2dr, cub1=^H, 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, am, mir, msgr, xenl, xon, cols#80, it#8, lines#30, vt#3, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, clear=\E[H\E[J$<50>, cr=\r, 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=\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=ansi+local, 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, rev=\E%!1\E[7m$<2>\E%!0, ri=\EI, rmso=\E%!1\E[m$<2>\E%!0, rmul=\E%!1\E[m$<2>\E%!0, sgr=\E%%!1\E[%?%p1%t;7;5%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%; %?%p5%t<0%;%?%p6%t;1%;m$<2>\E%%!0, sgr0=\E%!1\E[m$<2>\E%!0, smso=\E%!1\E[7;5m$<2>\E%!0, smul=\E%!1\E[4m$<2>\E%!0, # Tektronix 4207 with sysline. In the ancestral termcap file this was 4107-s; # see the note attached to tek4207. tek4207-s|Tektronix 4207 with sysline but no memory, eslok, hs, dsl=\E7\E[?6l\E[2K\E[?6h\E8, fsl=\E[?6h\E8, is1=\E%!1\E[2;32r\E[132D\E[2g\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8 C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[J, is2=\E7\E[?6l\E[2K\E[?6h\E8, tsl=\E7\E[?6l\E[2K\E[;%i%df, use=tek4107, # The 4110 series may be a wonderful graphics series, but they make the 4025 # look good for screen editing. In the dialog area, you can't move the cursor # off the bottom line. Out of the dialog area, ^K moves it up, but there # is no way to scroll. # # Note that there is a floppy for free from Tek that makes the # 4112 emulate the VT52 (use the VT52 termcap). There is also # an expected enhancement that will use ANSI standard sequences. # # 4112 in non-dialog area pretending to scroll. It really wraps # but vi is said to work (more or less) in this mode. # # 'vi' works reasonably well with this entry. # otek4112|o4112-nd|otek4113|otek4114|Tektronix 4110 series (old), am, cols#80, lines#34, bel=^G, clear=\E^L, cr=\r, cub1=^H, cud1=\n, cuu1=^K, ind=\n, rmcup=\EKA1\ELV1, smcup=\EKA0\ELV0\EMG0, # The 4112 with the ANSI compatibility enhancement tek4112|tek4114|Tektronix 4110 series, OTbs, am, db, cols#80, lines#34, cbt=\E[Z, clear=\E[2J\E[0;0H, cub1=^H, cud1=\E[B, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\EM, dch1=\E[P, dl1=\E[M, ed=\E[0J, el=\E[0K, ich1=\E[@, il1=\E[L, ind=\E7\E[0;0H\E[M\E8, is2=\E3!1, ri=\E7\E[0;0H\E[L\E8, rmso=\E[m, rmul=\E[m, sgr0=\E[m, smso=\E[7m, smul=\E[4m, tek4112-nd|Tektronix 4112 not in dialog area, OTns, cuu1=^K, use=tek4112, tek4112-5|Tektronix 4112 in 5 line dialog area, lines#5, use=tek4112, # (tek4113: this used to have "", 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, bold=\E[1m, cbt=\E[Z, cr=\r, cub1=^H, cud1=\n, dch1=\E[P, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, ind=\n, kcuu1=\E[A, rmam=\E[?7l, rmso=\E[m, rmul=\E[m, sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1; %;%?%p7%t8;%;m, sgr0=\E[m, smam=\E[?7h, smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=ansi+arrows, use=ansi+cup, use=ansi+erase, use=ansi+idl, use=ansi+local, use=ansi+rep, use=ansi+rca, use=ansi+sgr, # 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, #### 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, blink=\E[5m, bold=\E[1m, 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, rmso=\E[m, rmul=\E[m, sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1 %;%?%p7%t30;40%;m, sgr0=\E[m, smso=\E[7m, smul=\E[4m, use=ansi+arrows, use=ansi+local, #### 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf0=\EP, kf1=\EQ, kf2=\ER, kf3=\E\s, kf4=\E!, kf5=\E", kf6=\E#, kf7=\E$, kf8=\E%%, kf9=\E&, khome=\EH, #From: decvax!cbosgd!cbdkc1!mww Mike Warren via BRL aepro|Apple II+ running ASCII Express Pro--vt52, OTbs, cols#80, lines#24, clear=\014$<300/>, cub1=\ED, cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ, el=\EK, home=\EH, # UCSD addition: Yet another termcap from Brian Kantor's Micro Munger Factory apple-vm80|ap-vm80|Apple with viewmax-80, OTbs, cols#80, lines#24, clear=\014$<300/>, cuf1=^\:, cup=\036%p1%{32}%+%c%p2%{32}%+%c$<100/>, cuu1=^_, ed=\013$<300/>, el=^], home=\031$<200/>, #### Apple Lisa & Macintosh # # (lisa: changed 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf0=^A, kf1=^B, kf2=^D, kf3=^L, kf4=^U, kf5=^P, kf6=^N, kf7=^S, khome=^W, lf0=f1, lf1=f2, lf2=f3, lf3=f4, lf4=f5, lf5=f6, lf6=f7, lf7=f8, mc4=\E]+, mc5=\E]=, rmacs=\ERg, rmso=\ER@, sgr0=\ER@, smacs=\ERG, smso=\ERD, #### Commodore Business Machines # # Formerly located in West Chester, PA; went spectacularly bust in 1994 # after years of shaky engineering and egregious mismanagement. Made one # really nice machine (the Amiga) and boatloads of nasty ones (PET, C-64, # C-128, VIC-20). The C-64 is said to have been the most popular machine # ever (most units sold); they can still be found gathering dust in closets # everywhere. # # From: Kent Polk , 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\EH, ri=\EI, rmir=\EO, rmso=\Eq, sgr0=\Eq, smir=\E@, smso=\Ep, # According to the Venix 1.1 manual, the PC console is similar # to a DEC VT52. Differences seem to be (1) arrow keys send # different strings, (2) enhanced standout, (3) added insert/delete line. # Note in particular that it doesn't have automatic margins. # There are other keys (f1-f10, kpp, knp, kcbt, kich1, kdch1) but they # not described here because this derives from an old termcap entry. pc-venix|venix|IBM PC console running Venix, cols#80, it#8, lines#25, bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM, ed=\EJ, el=\EK, ht=^I, il1=\EL, ind=\n, kbs=^H, kcub1=\EK, kcud1=\EP, kcuf1=\EM, kcuu1=\EH, khome=\EG, ri=\EI, #### Miscellaneous microcomputer consoles # # If you know anything more about any of these, please tell me. # # The MAI Basic Four computer was obsolete at the end of the 1980s. # It may be used as a terminal by putting it in "line" mode as seen on # one of the status lines. # Initialization is similar to CIT80. 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], setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[m, smacs=^N, smam=\E[?7h, smir=\E[4h, smpch=\E[11m, smso=\E[7m, tbc=\E[3g, vpa=\E[%i%p1%dd, .VN=\E[?5l, .VR=\E[?5h, .am@, .ich=\E[%p1%d@, .ich1=\E[@, .ll=\E[99H, .rmcup=, .rmul=\E[24m, .smcup=\E]R\E]P3FFFF80\E[?8c, .smul=\E[4m, E3=\E[99H\E[2J\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n, use=ansi+arrows, use=ansi+csr, use=ansi+cup, use=ansi+erase, use=ansi+idl, use=ansi+local1, 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf1=\Ex, kf2=\Ey, kf3=\Ez, # (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>, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf1=\EP, kf2=\EQ, kf3=\ER, kf4=\ES, lf1=PF1, lf2=PF2, lf3=PF3, lf4=PF4, ll=\E[64;1H, rmam=\E[?7l, rmkx=\E>, rmso=\E[m, sgr0=\E[m, smam=\E[?7h, smkx=\E=, smso=\E[7m, use=ansi+local1, #### 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, tws2102-sna|dku7102-sna|Bull Questar tws2102 for SNA, dsl=\E[0;98v\E[2J\E[v, fsl=\E[v, is3=\Eb, tsl=\E[0;98v, use=tws-generic, tws2103|xdku|Bull Questar tws2103, ht=^I, use=tws-generic, tws2103-sna|dku7103-sna|Bull Questar tws2103 for SNA, ht=^I, use=tws2102-sna, dku7102-old|Bull Questar 200 DKU7102 (microcode version < 6), clear=\E[2J\E[H, cup@, dl@, dl1@, dsl=\EPY99:98\E\\\E[0;98v\E[2J\E[H\E[v, el=\E[K\E[m, il@, il1@, tsl=\EPY99:98\E\\\E[0;98v\E[H\E[2;7m, use=tws-generic, dku7202|Bull Questar 200 DKU7202 (colour/character attributes), blink=\E[0;2;4m, dim=\E[0;5m, ht=^I, is3=\E[?3h\Eb, sgr=\E[0%?%p1%t;2;4;5;7%;%?%p3%t;7%;%?%p2%t;2%;%?%p4%t;2;4%; %?%p5%t;5%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, smso=\E[0;4;5;7m, smul=\E[0;2m, use=tws-generic, #=========================================================# # BULL QUESTAR 303 & 310 `DEC VT 320' terminals emulation # #=========================================================# # # Description written by J. Staerck (BULL SA) # Copyright (c) 1989 BULL SA #--------------------------------------------------------------------------- # This entry is used for terminals with VT320 emulation mode # and following set-up : # 8 bit ISO Latin Character Set (ISO 8859-1), # 7 bit Control Characters, # 80 columns screen. # Hereafter are some DEC vt terminals' commands. (valid on VT200 and 300) # They are used in string capabilities with VT220-320 emulation mode. # In the following DEC definitions, two kinds of terminfo databases are # provided : # 1. the first with Command Sequence Introducer starting with escape # sequence in 7 bits characters ex. ESC [ : 2 chars. in 7-bit mode. # 2. the second with Command Sequence Introducer starting with escape # sequence in 8 bits characters ex. ESC [ : 1 char. 'CSI' =x9B. # Soft Terminal Reset esc [ ! p # RIS (erases screen): esc c # DECKPNM numeric keypad mode: esc > # DECKPAM applic. keypad mode: esc = # DECSTBM Scrolling region: esc [ r # SCS select G0 = US: esc ( B # SCS select G1 = line-graphic: esc ) 0 # Select 7-bit C1 controls: esc sp F # Select 8-bit C1 controls: esc sp G # Select cursor home: esc [ H # Select erase screen: esc [ J # SM KAM lock keyboard: esc [ 2 h # RM KAM unlock keyboard: esc [ 2 l # SM SRM local echo off: esc [ 1 2 h # RM SRM local echo on: esc [ 1 2 l # SM LNM New line : esc [ 2 0 h # RM LNM return = CR only: esc [ 2 0 l # SM DECCKM cursor keys mode: esc [ ? 1 h # RM DECCKM appli. keys mode: esc [ ? 1 l # SM DECANM ANSI mode on: esc [ ? 2 h # RM DECANM ANSI mode off: esc [ ? 2 l # SM DECCOLM 132-column screen: esc [ ? 3 h # RM DECCOLM 80-column screen: esc [ ? 3 l # SM DECSCLM Smooth scroll: esc [ ? 4 h # RM DECSCLM Jump scroll: esc [ ? 4 l # SM DECSCNM screen light backgr. esc [ ? 5 h # RM DECSCNM screen dark backgr. esc [ ? 5 l # SM DECOM move within margins: esc [ ? 6 h # RM DECOM move outside margins: esc [ ? 6 l # SM DECAWM auto right margin: esc [ ? 7 h # RM DECAWM auto right margin: esc [ ? 7 l # SM DECARM auto repeat: esc [ ? 8 h # RM DECARM auto repeat: esc [ ? 8 l # DECSASD Select active main: esc [ 0 $ } # DECSASD Select active status: esc [ 1 $ } # DECSSDT Select status none: esc [ 0 $ ~ # DECSSDT Select status indic.: esc [ 1 $ ~ # DECSSDT Select status host-wr: esc [ 2 $ ~ # SM DECTCEM Visible cursor: esc [ ? 2 5 h # RM DECTCEM Invisible cursor: esc [ ? 2 5 l # SM DECNCRM 7 bits NCR set: esc [ ? 4 2 h # RM DECNCRM Multi or ISO latin: esc [ ? 4 2 l # SM DECNKM numeric keypad mode: esc [ ? 6 6 h # RM DECNKM numeric keypad appl.: esc [ ? 6 6 l # SM DECKBUM clavier informatique esc [ ? 6 8 h # RM DECKBUM clavier bureautique: esc [ ? 6 8 l # DECSCL VT300 mode 8-bit ctrl: esc [ 6 3 " p # or DECSCL VT300 mode 8-bit ctrl: esc [ 6 3 ; 0 " p # or DECSCL VT300 mode 8-bit ctrl: esc [ 6 3 ; 2 " p # DECSCL VT300 mode 7-bit ctrl: esc [ 6 3 ; 1 " p # Char. and Line attributes: esc [ Ps ... Ps m # with: 0 All off, 1 Bold, 4 Underline, 5 Blinking, 7 Reverse # and : 22 Bold off, 24 Underline off, 25 Blinking off, 27 Reverse off # # This entry covers BQ303, BQ306, BQ310, Q303, Q306, Q310 bq300|Bull VT320 ISO Latin 1 80 columns terminal, am, eo, eslok, hs, km, mir, msgr, xenl, xon, cols#80, it#8, lines#24, vt#3, wsl#80, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cr=\r, 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, enacs=\E(B\E)0, flash=\E[?5h$<50>\E[?5l, fsl=\E[0$}, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ind=\ED, is1=\E[63;1"p\E[2h, is2=\E[?2h\E[?3l\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4 l, is3=\E[0$}\E[?25h\E[2l\E[H\E[J, ka1=\EOw, ka3=\EOy, kb2=\EOu, kbs=^H, kc1=\EOq, kc3=\EOs, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\EOQ, kf20=\E[34~, kf3=\EOR, kf4=\EOS, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khlp=\E[28~, krdo=\E[29~, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, nel=\EE, 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, tbc=\E[3g, tsl=\E[1$}\E[2$~, use=ansi+enq, use=ansi+csr, use=ansi+erase, use=ansi+idl, use=ansi+local, use=ansi+pp, 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, am, eo, eslok, hs, km, mc5i, mir, msgr, xenl, xon, cols#80, it#8, lines#24, vt#3, wsl#80, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\2335m, bold=\2331m, clear=\233H\233J, cr=\r, csr=\233%i%p1%d;%p2%dr, cub=\233%p1%dD, cub1=\2331D, cud=\233%p1%dB, cud1=\2331B, cuf=\233%p1%dC, cuf1=\2331C, cup=\233%i%p1%d;%p2%dH, cuu=\233%p1%dA, cuu1=\2331A, dch=\233%p1%dP, dch1=\233P, dl=\233%p1%dM, dl1=\233M, dsl=\2331$}\2332$~\n\2330$}, ech=\233%p1%dX, ed=\233J, el=\233K, el1=\2331K, enacs=\E(B\E)0, flash=\233?5h$<50>\233?5l, fsl=\2330$}, home=\233H, ht=^I, hts=\EH, ich=\233%p1%d@, il=\233%p1%dL, il1=\233L, ind=\ED, is1=\E[63;2"p\E[2h, is2=\E[?2h\E[?3l\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4 l, is3=\2330$}\233?25h\2332l\233H\233J, ka1=\217w, ka3=\217y, kb2=\217u, kbs=^H, kc1=\217q, kc3=\217s, kcub1=\233D, kcud1=\233B, kcuf1=\233C, kcuu1=\233A, kdch1=\2333~, kf1=\217P, kf10=\23321~, kf11=\23323~, kf12=\23324~, kf13=\23325~, kf14=\23326~, kf15=\23328~, kf16=\23329~, kf17=\23331~, kf18=\23332~, kf19=\23333~, kf2=\217Q, kf20=\23334~, kf3=\217R, kf4=\217S, kf6=\23317~, kf7=\23318~, kf8=\23319~, kf9=\23320~, kfnd=\2331~, khlp=\23328~, kich1=\2332~, knp=\2336~, kpp=\2335~, krdo=\23329~, kslt=\2334~, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, mc0=\233i, mc4=\2334i, mc5=\2335i, nel=\EE, rc=\E8, rev=\2337m, ri=\EM, rmacs=\E(B, rmam=\233?7l, rmcup=\233?7h, rmir=\2334l, rmkx=\233?1l\E>, rmso=\23327m, rmul=\23324m, rs1=\E[!p, rs2=\E[?3l, s0ds=\E(B, s1ds=\E(0, sc=\E7, sgr=\233%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t; 1%;m%?%p9%t\E(0%e\E(B%;, sgr0=\2330m\E(B, smacs=\E(0, smam=\233?7h, smcup=\233?7l\233?1l\E(B, smir=\2334h, smso=\2337m, smul=\2334m, tbc=\2333g, tsl=\2331$}\2332$~, use=vt220+cvis8, bq300-8rv|Bull VT320 8-bit reverse mode 80 columns, flash=\233?5l$<50>\233?5h, is2=\E[?2h\E[?3l\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4 l, use=bq300-8, bq300-8w|Bull VT320 8-bit 132 columns, cols#132, wsl#132, is2=\E[?2h\E[?3h\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4 l, rs2=\233?3h, use=bq300-8, bq300-w-8rv|Bull VT320 8-bit reverse mode 132 columns, cols#132, wsl#132, flash=\233?5l$<50>\233?5h, is2=\E[?2h\E[?3h\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4 l, rs2=\233?3h, use=bq300-8, # This entry is used for terminals with VT320 emulation mode # a 102 keys keyboard (PC scancode !) and following set-up : # 8 bit ISO Latin Character Set (ISO 8859-1), # 7 bit Control Characters, # 80 columns screen. bq300-pc|Questar 303 with PC keyboard ISO Latin 1 80 columns, kbs=^H, kf1=\E[17~, kf10=\E[28~, kf11=\E[29~, kf12=\E[31~, kf13@, kf14@, kf15@, kf16@, kf17@, kf18@, kf19@, kf2=\E[18~, kf20@, kf3=\E[19~, kf4=\E[20~, kf5=\E[21~, kf6=\E[23~, kf7=\E[24~, kf8=\E[25~, kf9=\E[26~, kfnd@, khlp@, krdo@, kslt@, lf1@, lf2@, lf3@, lf4@, use=vt220+pcedit, use=bq300, bq300-pc-rv|Questar 303 with PC keyboard reverse mode 80 columns, flash=\E[?5l$<50>\E[?5h, is2=\E[?2h\E[?3l\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4 l, use=bq300-pc, bq300-pc-w|Questar 303 with PC keyboard 132 columns terminal, cols#132, wsl#132, is2=\E[?2h\E[?3h\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4 l, rs2=\E[?3h, use=bq300-pc, bq300-pc-w-rv|Questar 303 with PC keyboard reverse mode 132 columns, cols#132, wsl#132, flash=\E[?5l$<50>\E[?5h, is2=\E[?2h\E[?3h\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4 l, rs2=\E[?3h, use=bq300-pc, # 8 bit ISO Latin Character Set (ISO 8859-1), # 8 bit Control Characters, # 80 columns screen. bq300-8-pc|Q306-8-pc|Questar 303 with PC keyboard in full 8 bits 80 columns, 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, cols#80, lines#24, vt#3, wsl#80, acsc=0pjdkblamcnkqitgufvhwexj, bel=^G, blink=\EsB, clear=\E`, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, cup=\E[%i%p1%03d%p2%03df, cuu1=\EA, dch1=\E[P, dim=\EsL, dl1=\E[M, dsl=\Ev, ed=\EJ, el=\EK, flash=\007$<80>\007$<80>\007, fsl=\EO, home=\EH, hts=\Ep, ich1=\E[I, ind=\n, invis=\EsH, is2=\E[00u\E[<>001001024080024080u\E[01u, is3=\Er\E[W\E`, kHOM=\EH, kLFT=\Eo, kRIT=\Eu, kbs=^H, kcbt=\E[Z, kclr=\E`, kctab=\E[g, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\E[P, kdl1=\E[M, ked=\EJ, kel=\EK, kf1=\E0, kf10=\ET, kf11=\E\\, kf12=\E\^, kf13@, kf14@, kf15@, kf16@, kf17@, kf18@, kf19@, kf2=\E2, kf20@, kf21=\E1, kf22=\E5, kf23=\E7, kf24=\E9, kf25=\E;, kf26=\E=, kf27=\E?, kf28=\EQ, kf29=\ES, kf3=\E6, kf30=\EV, kf31=\E], kf32=\E_, kf4=\E8, kf5=\E:, kf6=\E<, kf7=\E>, kf8=\EP, kf9=\ER, khome=\EH, khts=\Ep, kich1=\E[I, kil1=\E[L, kind=\E[0s, kll=\EH\EA, kri=\E[1s, krmir=\E[J, ktbc=\E[N, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, ll=\EH\EA, mc0=\E[0p, mc4=\E[, 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, # 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, u8=\E/[HJ], use=vt52+keypad, use=vt50, # (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>, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, ri=\E$<20>I, # 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf0=\EE, kf1=\EF, kf2=\EG, kf3=\EH, kf4=\EI, kf5=\EJ, kf6=\Ei, kf7=\Ej, khome=\EH, ri=\EI, rmacs=\EG, rmso=\E^N, rmul=\E^C, smacs=\EF, smso=\E^H, smul=\E^D, dw1|DECwriter I, OTbs, hc, os, cols#72, bel=^G, cr=\r, cub1=^H, cud1=\n, ind=\n, dw2|decwriter|dw|DECwriter II, OTbs, hc, os, cols#132, bel=^G, cr=\r, cub1=^H, cud1=\n, ind=\n, kbs=^H, # \E(B Use U.S. character set (otherwise # => british pound !) # \E[20l Disable "linefeed newline" mode (else puts \r after \n,\f,\v) # \E[w 10 char/in pitch # \E[1;132 full width horizontal margins # \E[2g clear all tab stops # \E[z 6 lines/in # \E[66t 66 lines/page (for \f) # \E[1;66r full vertical page can be printed # \E[4g clear vertical tab stops # \E> disable alternate keypad mode (so it transmits numbers!) # \E[%i%p1%du set tab stop at column %d (origin == 1) # (Full syntax is \E[n;n;n;n;n;...;nu where each 'n' is # a tab stop) # # The dw3 does standout with wide characters. # dw3|la120|DECwriter III, OTbs, hc, os, cols#132, bel=^G, cr=\r, cub1=^H, cud1=\n, ht=^I, ind=\n, is1=\E(B\E[20l\E[w\E[0;132s\E[2g\E[z\E[66t\E[1;66r\E[4g\E>, is2=\E[9;17;25;33;41;49;57;65;73;81;89;97;105;113;121;129u \r, kbs=^H, rmso=\E[w, sgr0=\E[w, smso=\E[6w, dw4|DECwriter IV, OTbs, am, hc, os, cols#132, bel=^G, cr=\r, cub1=^H, cud1=\n, ht=^I, ind=\n, is2=\Ec, kbs=^H, kf0=\EOP, kf1=\EOQ, kf2=\EOR, kf3=\EOS, # These aren't official ln03|DEC ln03 laser printer, hc, cols#80, lines#66, bel=^G, cr=\r, cud1=\n, hd=\EK, ht=^I, hu=\EL, ind=\n, nel=\r\n, rmso=\E[22m, rmul=\E[24m, sgr0=\E[m, smso=\E[1m, smul=\E[4m, ln03-w|DEC ln03 laser printer 132 cols, cols#132, 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, khome=\EH, lf6=blue, lf7=red, lf8=white, ri=\EI, rmacs=\EG, rmir=\EO, rmso=\Eq, smacs=\EF, smir=\E@, smso=\Ep, tsl=\Ej\Ex5\EY8%p1%{32}%+%c\Eo\Eo, h19-u|Heathkit with underscore cursor, cnorm@, cvvis@, use=h19-b, h19-g|h19g|Heathkit w/block cursor, cnorm=\Ex4, cvvis@, use=h19-b, alto-h19|altoh19|altoheath|alto-heath|alto emulating Heathkit h19, lines#60, dl1=\EM, il1=\EL, use=h19, # The major problem with the Z29 is that it requires more padding than the Z19. # # The problem with declaring an H19 to be synonymous with a Z29 is that # it needs more padding. It especially loses if a program attempts # to put the Z29 into insert mode and insert text at 9600 baud. It # even loses worse if the program attempts to insert tabs at 9600 # baud. Adding padding to text that is inserted loses because in # order to make the Z29 not die, one must add so much padding that # whenever the program tries to use insert mode, the effective # rate is about 110 baud. # # What program would want to put the terminal into insert mode # and shove stuff at it at 9600 baud you ask? # # Emacs. Emacs seems to want to do the mathematically optimal # thing in doing a redisplay rather than the practical thing. # When it is about to output a line on top of a line that is # already on the screen, instead of just killing to the end of # the line and outputting the new line, it compares the old line # and the new line and if there are any similarities, it # constructs the new line by deleting the text on the old line # on the terminal that is already there and then inserting new # text into the line to transform it into the new line that is # to be displayed. The Z29 does not react kindly to this. # # But don't cry for too long.... There is a solution. You can make # a termcap entry for the Z29 that says the Z29 has no insert mode. # Then Emacs cannot use it. "Oh, no, but now inserting into a # line will be really slow", you say. Well there is a sort of a # solution to that too. There is an insert character option on # the Z29 that will insert one character. Unfortunately, it # involves putting the terminal into ANSI mode, inserting the # character, and changing it back to H19 mode. All this takes 12 # characters. Pretty expensive to insert one character, but it # works. Either Emacs doesn't try to use its inserting hack when # it's only given an insert character ability or the Z29 doesn't # require padding with this (the former is probably more likely, # but I haven't checked it out). # (z29: added empty to suppress a tic warning, merged in # status line capabilities from BRL entry --esr) z29|zenith29|z29b|Zenith z29b, OTbs, OTpt, am, eslok, hs, mir, msgr, OTkn#10, cols#80, lines#24, OTbc=\ED, acsc=, bel=^G, cbt=\E-, clear=\EE$<14>, cnorm=\Ey4, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\E$<1>A, cvvis=\Ex4, dch1=\EN$<0.1*>, dl1=\EM$<1/>, dsl=\Ey1, ed=\EJ$<14>, el=\EK$<1>, fsl=\Ek\Ey5, home=\EH, ht=^I, ich1=\E<\E[1@\E[?2h$<1>, il1=\EL$<1/>, ind=\n$<2>, is2=\E<\E[?2h\Ev, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf0=\E~, kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, kf9=\E0I, khome=\EH, lf0=home, ri=\EI$<2/>, rmacs=\EF, rmir=\EO, rmso=\Eq, rmul=\Es0, smacs=\EG, smir=\E@, smso=\Ep, smul=\Es8, tsl=\Ej\Ex5\Ex1\EY8%+ \Eo, # z29 in ANSI mode. Assumes that the cursor is in the correct state, and that # the world is stable. 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, ht=^I, hts=\EH, il=\E[%p1%dL, il1=\E[1L, ind=\n, is2=\E<\E[>1;3;5;6;7l\E[0m\E[2J, ka1=\EOw, ka3=\EOu, kb2=\EOy, 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, tbc=\E[3g, tsl=\E[s\E[>1h\E[25;%i%p1%dH, use=ansi+arrows, use=ansi+local, use=ansi+pp, # 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf0=\EJ, kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, kf9=\EOI, khome=\EH, ri=\EI, rmacs=\EG, rmir=\EO, rmso=\Eq, smacs=\EF, smir=\E@, smso=\Ep, p19|h19-b with il1/dl1, dl1=\EM$<2*/>, il1=\EL$<2*/>, use=h19-b, # From: # (ztx: removed duplicate :sr: -- esr) ztx|ztx11|zt-1|htx11|ztx-1-a|Heath/Zenith ztx-10 or 11, OTbs, am, eslok, hs, cols#80, it#8, lines#24, clear=\EE, cub1=^H, cud1=\n, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM, dsl=\Ey1, ed=\EJ, el=\EK, fsl=\Ek\Ey5, home=\EH, ht=^I, il1=\EL, is2=\Ej\EH\Eq\Ek\Ev\Ey1\Ey5\EG\Ey8\Ey9\Ey>, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf0=\ES, kf1=\EB, kf2=\EU, kf3=\EV, kf4=\EW, kf5=\EP, kf6=\EQ, kf7=\ER, ri=\EI, rmso=\Eq, rmul=\Eq, smso=\Es5, smul=\Es2, tsl=\Ej\Ex5\Ex1\EY8%+ \Eo, #### IMS International (ims) # # There was a company called IMS International located in Carson City, # Nevada, that flourished from the mid-70s to mid-80s. They made S-100 # bus/Z80 hardware and a line of terminals called Ultimas. # # From: Erik Fair 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, rmso=\E[m, sc=\E7, sgr0=\E[m, smdc=\E[4h, smir=\E[4h, smso=\E[7m, use=ansi+arrows, use=ansi+idl, use=ansi+local, 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>, rmso=\E[m, rmul=\E[m, rs1=\030\E2\E<\E[4i\E[?4i\E[12h\E[2;4;20l\E[?0;7h\E[?1;3;6;1 9l\E[r\E[m\E(B\017\E)0\E>, sc=\E7, sgr0=\E[m, smacs=^N, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=ansi+erase, use=ansi+idl, use=ansi+local, 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), kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EQ, kdl1=\EO, kf1=\Ei1, kf2=\Ei2, kf3=\Ei3, kf4=\Ei4, kf5=\Ei5, kf6=\Ei6, kf7=\Ei7, kf8=\Ei8, kf9=\Ei9, kich1=\EP, kil1=\EN, rev=\E4B, ri=\Eb, rmso=\E4@, rmul=\E4@, sgr0=\E4@, smso=\E4A, smul=\E4D, ti926|Texas Instruments 926 VDT 8859/1 7 bit CTRL, csr@, ind=\E[1S, ri=\E[1T, use=ti924, # (ti926-8: I corrected this from the broken SCO entry -- esr) ti926-8|Texas Instruments 926 VDT 8859/1 8 bit CTRL, csr@, ind=\2331S, ri=\2331T, use=ti924-8, ti_ansi|basic entry for ti928, am, bce, eo, xenl, xon, colors#8, cols#80, it#8, lines#25, pairs#64, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[2J\E[H, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, 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, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\EH, mc4=^T, mc5=^R, rev=\EM$, ri=\EI, rmso=\EM\s, rmul=\EM\s, sgr0=\EM\s, smso=\EM$, smul=\EM0, ######## OBSOLETE UNIX CONSOLES # #### Apollo consoles # # Apollo got bought by Hewlett-Packard. The Apollo workstations are # labeled HP700s now. # # From: Gary Darland 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, blink=\E[5m, bold=\E[1m, 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, rev=\E[7m, ri=\E[T, rmacs=\E[10m, rmso=\E[m, rmul=\E[m, sc=\E7, sgr=\E[10m\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t; 2%;%?%p6%t;1%;%?%p9%t;12%e;10%;%?%p7%t;9%;m, sgr0=\E[0;10m, smacs=\E[12m, smso=\E[7m, smul=\E[4m, vpa=\E[%i%p1%dd, use=ansi+arrows, use=ansi+inittabs, use=ansi+local, 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, kf1=\Ep\r, kf2=\Eq\r, kf3=\Er\r, kf4=\Es\r, kf5=\Et\r, kf6=\Eu\r, kf7=\Ev\r, kf8=\Ew\r, khome=\Ep\r, op=\E&bn\E&bB\E&bG\E&bR%{0}%PX%{0}%PY%{0}%PZ%{1}%PW%{1}%PV %{1}%PU, rev=%?%gB%{0}%=%t\E&dB%{1}%PB%;, rmir=\ER, rmkx=\E&jA, setb=\E&bn%?%gA%t\E&dA%;%?%gB%t\E&dB%;%?%gH%t\E&dH%;%?%gU%t \E&bR%;%?%gV%t\E&bG%;%?%gW%t\E&bB%;%?%p1%{1}%&%t\E&bb %{1}%e%{0}%;%PZ%?%p1%{2}%&%t\E&bg%{1}%e%{0}%;%PY%?%p1 %{4}%&%t\E&br%{1}%e%{0}%;%PX, setf=\E&bn%?%gA%t\E&dA%;%?%gB%t\E&dB%;%?%gH%t\E&dH%;%?%gX%t \E&br%;%?%gY%t\E&bg%;%?%gZ%t\E&bb%;%?%p1%{1}%&%t\E&bB %{1}%e%{0}%;%PW%?%p1%{2}%&%t\E&bG%{1}%e%{0}%;%PV%?%p1 %{4}%&%t\E&bR%{1}%e%{0}%;%PU, sgr=\E&d@%{0}%PA%{0}%PB%{0}%PD%{0}%PH%?%p1%p3%p5%|%|%t\E&dB %{1}%PB%;%?%p4%t\E&dA%{1}%PA%;%?%p6%t\E&dH%{1}%PH%;%?%p2 %t\E&dD%;, sgr0=\E&d@%{0}%PA%{0}%PB%{0}%PH, smir=\EQ, smkx=\E&jB, smso=\E&dD, smul=\E&dD, tbc=\E3, vpa=\E&a%p1%dY, # gs6300 - can't use blue foreground, it clashes with underline; # it's simulated with cyan # Bug: The 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, cols#80, it#8, lines#24, acsc=+\^\,Q-S.M0\177`+a:f'g#h#i#jXkClJmFnNo~qUs_tEuPv\\wKxW~ _, bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EP, ed=\EJ, el=\EK, home=\EH, ht=^I, ich1=\EQ, ind=\n, kbs=^?, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\Ee, kf1=\Ef1, kf10=\Ef0, kf2=\Ef2, kf3=\Ef3, kf4=\Ef4, kf5=\Ef5, kf6=\Ef6, kf7=\Ef7, kf8=\Ef8, kf9=\Ef9, kich1=\Ed, knp=\Eh, kpp=\Eg, nel=\r\n, rev=\ET, ri=\ES, rmacs=\EG, rmso=\EX, sgr0=\EX, smacs=\EF, smso=\ET, env230|envision230|envision 230 graphics terminal, xenl@, enacs@, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rmacs@, sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t; 1%;m$<2>, sgr0=\E[0m$<2>, smacs@, smso=\E[7m, use=vt100+4bsd, # These execuports were impact-printer ttys with a 30- or maybe 15-cps acoustic # coupler attached, the whole rig fitting in a suitcase and more or less # portable. Hot stuff for c.1977 :-) -- esr ep48|ep4080|execuport 4080, OTbs, am, os, cols#80, bel=^G, cr=\r, cub1=^H, cud1=\n, hd=^\, hu=^^, ind=\n, ep40|ep4000|execuport 4000, cols#136, use=ep4080, # Adam Thompson 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 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 # ######## SHANTIH! SHANTIH! SHANTIH! ncurses-6.4-20240113/misc/menu.ref0000644000000000000000000000350306625702042015036 0ustar rootrootLIBRARY 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 ncurses-6.4-20240113/misc/cleantic.cmd0000644000000000000000000000516213615656212015652 0ustar rootroot/**************************************************************************** * 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)' ncurses-6.4-20240113/misc/panel.ref0000644000000000000000000000062606625700164015177 0ustar rootrootLIBRARY 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 ncurses-6.4-20240113/misc/shlib0000755000000000000000000001200414114713361014415 0ustar rootroot#!/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 "$*" ncurses-6.4-20240113/misc/makedef.cmd0000644000000000000000000001457214114650007015460 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/misc/form.ref0000644000000000000000000000502206625701710015034 0ustar rootrootLIBRARY 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 ncurses-6.4-20240113/misc/menu.def0000644000000000000000000000445407130475212015024 0ustar rootrootLIBRARY 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 ncurses-6.4-20240113/misc/Makefile.in0000644000000000000000000002016414141610554015441 0ustar rootroot# $Id: Makefile.in,v 1.79 2021/11/06 23:36:12 tom Exp $ ############################################################################## # Copyright 2018-2020,2021 Thomas E. Dickey # # Copyright 1998-2016,2017 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1996-on # # Makefile for ncurses miscellany directory # # This makes/installs the terminfo database # # The variable 'srcdir' refers to the source-distribution, and can be set with # the configure script by "--srcdir=DIR". # # The rules are organized to produce the libraries for the configured models, # and the programs with the configured default model. # turn off _all_ suffix rules; we'll generate our own .SUFFIXES : SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile CF_MFLAGS = @cf_cv_makeflags@ @SET_MAKE@ DESTDIR = @DESTDIR@ top_srcdir = @top_srcdir@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ datarootdir = @datarootdir@ datadir = @datadir@ includesubdir = @includesubdir@ INCLUDEDIR = $(DESTDIR)$(includedir)$(includesubdir) tabsetdir = $(datadir)/tabset ticdir = @TERMINFO@ ticfile = $(ticdir).db source = @TERMINFO_SRC@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_DATA = @INSTALL_DATA@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : check @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : depend @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.data @MAKE_PHONY@.PHONY : install.libs @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.data @MAKE_PHONY@.PHONY : uninstall.libs all \ depend \ sources :: @MAKE_DATABASE@all \ @MAKE_DATABASE@sources :: terminfo.tmp @MAKE_DATABASE@install :: @MISC_INSTALL_DATA@ @MAKE_DATABASE@install.data :: terminfo.tmp \ @MAKE_DATABASE@ $(DESTDIR)$(libdir) \ @MAKE_DATABASE@ $(DESTDIR)$(datadir) \ @MAKE_DATABASE@ $(DESTDIR)$(tabsetdir) @MAKE_DATABASE@ DESTDIR=${DESTDIR} \ @MAKE_DATABASE@ prefix=${prefix} \ @MAKE_DATABASE@ exec_prefix=${exec_prefix} \ @MAKE_DATABASE@ bindir=${bindir} \ @MAKE_DATABASE@ top_srcdir=${top_srcdir} \ @MAKE_DATABASE@ srcdir=${srcdir} \ @MAKE_DATABASE@ datadir=${datadir} \ @MAKE_DATABASE@ ticdir=${ticdir} \ @MAKE_DATABASE@ source=terminfo.tmp \ @MAKE_DATABASE@ cross_compiling=@cross_compiling@ \ @MAKE_DATABASE@ $(SHELL) ./run_tic.sh @MAKE_DATABASE@ @( cd $(srcdir)/tabset && \ @MAKE_DATABASE@ $(SHELL) -c 'for i in * ; do \ @MAKE_DATABASE@ if test -f $$i ; then \ @MAKE_DATABASE@ echo installing $$i; \ @MAKE_DATABASE@ $(INSTALL_DATA) $$i $(DESTDIR)$(tabsetdir)/$$i; \ @MAKE_DATABASE@ fi; done' ) install.data :: @echo "finished $@" NCURSES_CONFIG = ncurses@DFT_ARG_SUFFIX@@cf_cv_abi_version@@cf_config_suffix@-config install \ install.libs :: $(DESTDIR)$(bindir) ncurses-config $(INSTALL_SCRIPT) ncurses-config $(DESTDIR)$(bindir)/$(NCURSES_CONFIG) # Make a list of the files that gen-pkgconfig might create: @MAKE_PC_FILES@PC_FILES = \ @MAKE_PC_FILES@ @LIB_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ @MAKE_PC_FILES@ @TINFO_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ @MAKE_PC_FILES@ @TICS_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ @MAKE_PC_FILES@ @PANEL_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ @MAKE_PC_FILES@ @MENU_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ @MAKE_PC_FILES@ @FORM_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ @MAKE_PC_FILES@ @CXX_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc # some packagers prefer to be able to construct pc-files on servers where # pkg-config is not installed. Work around that by creating the library # directory during this rule: @MAKE_PC_FILES@install \ @MAKE_PC_FILES@install.libs :: pc-files @MAKE_PC_FILES@ @$(SHELL) -c 'case "x$(PKG_CONFIG_LIBDIR)" in \ @MAKE_PC_FILES@ x/*) \ @MAKE_PC_FILES@ mkdir -p $(DESTDIR)$(PKG_CONFIG_LIBDIR); \ @MAKE_PC_FILES@ for name in $(PC_FILES); do \ @MAKE_PC_FILES@ test -f $$name || continue; \ @MAKE_PC_FILES@ echo installing $$name; \ @MAKE_PC_FILES@ $(INSTALL_DATA) $$name $(DESTDIR)$(PKG_CONFIG_LIBDIR)/$$name; \ @MAKE_PC_FILES@ done \ @MAKE_PC_FILES@ ;; \ @MAKE_PC_FILES@ *) \ @MAKE_PC_FILES@ echo "...skip actual install: no destination was given" ; \ @MAKE_PC_FILES@ ;; \ @MAKE_PC_FILES@ esac' @MAKE_PC_FILES@all \ @MAKE_PC_FILES@sources :: pc-files @MAKE_PC_FILES@pc-files : @MAKE_PC_FILES@ $(SHELL) ./gen-pkgconfig @MAKE_PC_FILES@ -touch $@ terminfo.tmp : run_tic.sed $(source) echo '** adjusting tabset paths' sed -f run_tic.sed $(source) >terminfo.tmp run_tic.sed : WHICH_XTERM=@WHICH_XTERM@ \ XTERM_KBS=@XTERM_KBS@ \ datadir=${datadir} \ $(SHELL) $(srcdir)/gen_edit.sh >$@ $(DESTDIR)$(bindir) \ $(DESTDIR)$(libdir) \ $(DESTDIR)$(datadir) \ $(DESTDIR)$(tabsetdir) : mkdir -p $@ uninstall : @MISC_UNINSTALL_DATA@ uninstall.libs uninstall.data : -test -d $(DESTDIR)$(tabsetdir) && rm -rf $(DESTDIR)$(tabsetdir) -test -d $(DESTDIR)$(ticdir) && rm -rf $(DESTDIR)$(ticdir) -test -f $(DESTDIR)$(ticfile) && rm -f $(DESTDIR)$(ticfile) uninstall.libs : -rm -f $(DESTDIR)$(bindir)/$(NCURSES_CONFIG) @MAKE_PC_FILES@ @$(SHELL) -c 'case x$(DESTDIR)$(PKG_CONFIG_LIBDIR) in \ @MAKE_PC_FILES@ x/*) \ @MAKE_PC_FILES@ for name in $(PC_FILES); do \ @MAKE_PC_FILES@ test -f $$name || continue; \ @MAKE_PC_FILES@ echo uninstalling $$name; \ @MAKE_PC_FILES@ rm -f $(DESTDIR)$(PKG_CONFIG_LIBDIR)/$$name; \ @MAKE_PC_FILES@ done \ @MAKE_PC_FILES@ ;; \ @MAKE_PC_FILES@ esac' tags : @MAKE_UPPER_TAGS@TAGS : mostlyclean : @MAKE_DATABASE@ -rm -f terminfo.tmp @MAKE_DATABASE@ -rm -f run_tic.sed @MAKE_PC_FILES@ -rm -f pc-files $(PC_FILES) -rm -f core tags TAGS *~ *.bak *.ln *.atac trace clean :: mostlyclean distclean : clean @MAKE_PC_FILES@ -rm -f gen-pkgconfig -rm -f Makefile run_tic.sh ncurses-config realclean : distclean ############################################################################### # The remainder of this file is automatically generated during configuration ############################################################################### ncurses-6.4-20240113/misc/ncurses.supp0000644000000000000000000001150213615656212015771 0ustar rootroot# $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 } ncurses-6.4-20240113/misc/magic0000644000000000000000000001132014503673266014404 0ustar rootroot# $Id: magic,v 1.5 2023/09/23 23:37:26 tom Exp $ ############################################################################## # Copyright 2020,2023 Thomas E. Dickey # # Copyright 2015,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # for reference, from file 5.30: #------------------------------------------------------------------------------ # @File: terminfo,v 1.7 2016/03/17 21:02:29 christos Exp @ # terminfo: file(1) magic for terminfo # # URL: https://invisible-island.net/ncurses/man/term.5.html # URL: https://invisible-island.net/ncurses/man/scr_dump.5.html # # Workaround for Targa image type by Joerg Jenderek # GRR: line below too general as it catches also # Targa image type 1 with 26 long identification field # and HELP.DSK 0 string \032\001 # 5th character of terminal name list, but not Targa image pixel size (15 16 24 32) >16 ubyte >32 # namelist, if more than 1 separated by "|" like "st|stterm| simpleterm 0.4.1" >>12 regex \^[a-zA-Z0-9][a-zA-Z0-9.][^|]* Compiled terminfo entry "%-s" !:mime application/x-terminfo # no extension #!:ext # #------------------------------------------------------------------------------ # The following was added for ncurses6 development: #------------------------------------------------------------------------------ # 0 string \036\002 # imitate the legacy compiled-format, to get the entry-name printed >16 ubyte >32 # namelist, if more than 1 separated by "|" like "st|stterm| simpleterm 0.4.1" >>12 regex \^[a-zA-Z0-9][a-zA-Z0-9.][^|]* Compiled 32-bit terminfo entry "%-s" !:mime application/x-terminfo2 # # While the compiled terminfo uses little-endian format irregardless of # platform, 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 ncurses-6.4-20240113/misc/emx.src0000644000000000000000000004550013615656212014705 0ustar rootroot############################################################################## # 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, ncurses-6.4-20240113/misc/ncurses-config.in0000644000000000000000000002102214270057134016645 0ustar rootroot#!@SHELL@ # $Id: ncurses-config.in,v 1.52 2022/07/26 21:36:28 tom Exp $ ############################################################################## # Copyright 2018-2021,2022 Thomas E. Dickey # # Copyright 2006-2015,2017 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey, 2006-on LANG=C; export LANG LANGUAGE=C; export LANGUAGE LC_ALL=C; export LC_ALL LC_CTYPE=C; export LC_CTYPE prefix="@prefix@" exec_prefix="@exec_prefix@" bindir="@bindir@" includedir="@includedir@" libdir="@libdir@" datarootdir="@datarootdir@" datadir="@datadir@" mandir="@mandir@" THIS="@LIB_NAME@@USE_LIB_SUFFIX@" TINFO_LIB="@TINFO_ARG_SUFFIX@" RPATH_LIST="@RPATH_LIST@" includesubdir="@includedir@/${THIS}" # Ensure that RPATH_LIST contains only absolute pathnames, if it is nonempty. # We cannot filter it out within the build-process since the variable is used # in some special cases of installation using a relative path. if [ -n "$RPATH_LIST" ] then save_IFS="$IFS" IFS='@PATH_SEPARATOR@' filtered= for item in $RPATH_LIST do case "$item" in ./*|../*|*/..|*/../*) ;; *) [ -n "$filtered" ] && filtered="${filtered}@PATH_SEPARATOR@" filtered="${filtered}${item}" ;; esac done IFS="$save_IFS" # if the result is empty, there is little we can do to fix it RPATH_LIST="$filtered" fi # with --disable-overwrite, we installed into a subdirectory, but transformed # the headers to include like this: # if [ x@WITH_OVERWRITE@ = xno ]; then case $includedir in $prefix/include/ncurses@LIB_SUFFIX@@EXTRA_SUFFIX@) includedir=`echo "$includedir" | sed -e 's,/[^/]*$,,'` ;; esac fi LIBS="@LIBS@" if [ "@TINFO_NAME@" = "@LIB_NAME@" ]; then LIBS="-l${THIS} $LIBS" else LIBS="-l${THIS} -l${TINFO_LIB} $LIBS" fi # Ignore -L options which do not correspond to an actual directory, or which # are standard library directories (i.e., the linker is supposed to search # those directories). # # There is no portable way to find the list of standard library directories. # Require a POSIX shell anyway, to keep this simple. lib_flags= for opt in -L$libdir @EXTRA_PKG_LDFLAGS@ $LIBS do case $opt in -specs*) # ignore linker specs-files which were used to build library continue ;; -Wl,-z,*) # ignore flags used to manipulate shared image continue ;; -Wl,--dynamic-linker*) # ignore ELF interpreter continue ;; -Wl,--as-needed|-Wl,--build-id=*|-Wl,-dT,*|-Wl,-T,*) continue ;; -L*) lib_check=`echo "x$opt" | sed -e 's/^.-L//'` [ -d "$lib_check" ] || continue case "$lib_check" in @LD_SEARCHPATH@) # skip standard libdir if [ "$lib_check" = "$libdir" ] then lib_first=yes IFS_save="$IFS" IFS='|' LIBDIRS="@LD_SEARCHPATH@" for lib_check in $LIBDIRS do if [ -d "$lib_check" ] then if [ "$lib_check" != "$libdir" ] then lib_first=no fi break fi done IFS="$IFS_save" [ $lib_first = yes ] && continue found=no for check in $lib_flags do if [ "x$check" = "x$opt" ] then found=yes break fi done [ $found = yes ] && continue : else continue fi ;; *) found=no for check in $lib_flags do if [ "x$check" = "x$opt" ] then found=yes break fi done [ $found = yes ] && continue ;; esac ;; esac lib_flags="$lib_flags $opt" done [ $# = 0 ] && exec @SHELL@ "$0" --error while [ $# -gt 0 ]; do case "$1" in # basic configuration --prefix) echo "$prefix" ;; --exec-prefix) echo "$exec_prefix" ;; # compile/link --cflags) INCS="@PKG_CFLAGS@" if [ "x@WITH_OVERWRITE@" = xno ]; then INCS="$INCS -I${includesubdir}" fi if [ "${includedir}" != /usr/include ]; then INCS="$INCS -I${includedir}" fi sed -e 's,^[ ]*,,' -e 's, [ ]*, ,g' -e 's,[ ]*$,,' <<-ENDECHO $INCS ENDECHO ;; --libs) OPTS= for opt in $lib_flags do [ -n "$OPTS" ] && OPTS="$OPTS " OPTS="${OPTS}${opt}" done printf '%s\n' "$OPTS" ;; --libs-only-L) OPTS= for opt in $lib_flags do case "x$opt" in x-L*) [ -n "$OPTS" ] && OPTS="$OPTS " OPTS="${OPTS}${opt}" ;; esac done printf '%s\n' "$OPTS" ;; --libs-only-l) OPTS= for opt in $lib_flags do case "x$opt" in x-l*) [ -n "$OPTS" ] && OPTS="$OPTS " OPTS="${OPTS}${opt}" ;; esac done printf '%s\n' "$OPTS" ;; --libs-only-other) OPTS= for opt in $lib_flags do case "x$opt" in x-[lL]*) ;; *) [ -n "$OPTS" ] && OPTS="$OPTS " OPTS="${OPTS}${opt}" ;; esac done printf '%s\n' "$OPTS" ;; # identification --version) echo "@NCURSES_MAJOR@.@NCURSES_MINOR@.@NCURSES_PATCH@" ;; --abi-version) echo "@cf_cv_abi_version@" ;; --mouse-version) echo "@NCURSES_MOUSE_VERSION@" ;; # locations --bindir) echo "${bindir}" ;; --datadir) echo "${datadir}" ;; --includedir) INCS= if [ "x@WITH_OVERWRITE@" = xno ]; then INCS="${includesubdir}" elif [ "${includedir}" != /usr/include ]; then INCS="${includedir}" fi echo "$INCS" ;; --libdir) echo "${libdir}" ;; --mandir) echo "${mandir}" ;; --terminfo) echo "@TERMINFO@" ;; --terminfo-dirs) echo "@TERMINFO_DIRS@" ;; --termpath) echo "@TERMPATH@" ;; # general info --help) cat <&2 exit 1 ;; esac shift done # vi:ts=4 sw=4 # vile:shmode ncurses-6.4-20240113/misc/form.def0000644000000000000000000000565407130475212015026 0ustar rootrootLIBRARY 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 ncurses-6.4-20240113/misc/cmpdef.cmd0000644000000000000000000001167413615656212015333 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/misc/run_tic.in0000644000000000000000000001627114264611537015403 0ustar rootroot#!@SHELL@ # $Id: run_tic.in,v 1.40 2022/07/16 19:37:03 tom Exp $ ############################################################################## # Copyright 2019-2020,2022 Thomas E. Dickey # # Copyright 2000-2012,2017 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1996-on # # This script is used to install terminfo.src using tic. We use a script # because the path checking is too awkward to do in a makefile. # # Assumes: # The leaf directory names (lib, tabset, terminfo) # echo "** Building terminfo database, please wait..." # # The script is designed to be run from the misc/Makefile as # make install.data : "${suffix:=@EXEEXT@}" : "${DESTDIR:=@DESTDIR@}" : "${prefix:=@prefix@}" : "${exec_prefix:=@exec_prefix@}" : "${bindir:=@bindir@}" : "${top_srcdir:=@top_srcdir@}" : "${srcdir:=@srcdir@}" : "${datarootdir:=@datarootdir@}" : "${datadir:=@datadir@}" : "${TIC_PATH:=@TIC@}" : "${ticdir:=@TERMINFO@}" : "${source:=@TERMINFO_SRC@}" : "${cross_compiling:=no}" : "${ext_funcs:=@NCURSES_EXT_FUNCS@}" test -z "${DESTDIR}" && DESTDIR= # Allow tic to run either from the install-path, or from the build-directory. # Do not do this if we appear to be cross-compiling. In that case, we rely # on the host's copy of tic to compile the terminfo database. if test "x$cross_compiling" = "xno" then if test -f ../progs/tic$suffix then case "$PATH" in \@PATH_SEPARATOR@*) PATH="../progs@PATH_SEPARATOR@../lib@PATH_SEPARATOR@${DESTDIR}$bindir$PATH" ;; *) PATH="../progs@PATH_SEPARATOR@../lib@PATH_SEPARATOR@${DESTDIR}$bindir@PATH_SEPARATOR@$PATH" ;; esac export PATH if test @DFT_LWR_MODEL@ = shared then SHLIB="sh $srcdir/shlib" TIC_PATH="$SHLIB tic" else TIC_PATH="tic" fi elif test "$TIC_PATH" = unknown then echo "? no tic program found" exit 1 fi else # Cross-compiling, so don't set PATH or run shlib. SHLIB= # reset $suffix, since it applies to the target, not the build platform. suffix= fi # set another env var that doesn't get reset when `shlib' runs, so `shlib' uses # the PATH we just set. SHLIB_PATH=$PATH export SHLIB_PATH # set a variable to simplify environment update in shlib SHLIB_HOST=@host_os@ export SHLIB_HOST # don't use user's TERMINFO variable unset TERMINFO_DIRS TERMINFO="${DESTDIR}$ticdir" ; export TERMINFO umask 022 # Construct the name of the old (obsolete) pathname, e.g., /usr/lib/terminfo. TICDIR=`echo "$TERMINFO" | sed -e 's%/share/\([^/]*\)$%/lib/\1%'` # Parent directory may not exist, which would confuse the install for hashed # database. Fix. PARENT=`echo "$TERMINFO" | sed -e 's%/[^/]*$%%'` if test -n "$PARENT" then mkdir -p "$PARENT" fi # Remove the old terminfo stuff; we don't care if it existed before, and it # would generate a lot of confusing error messages if we tried to overwrite it. # We explicitly remove its contents rather than the directory itself, in case # the directory is actually a symbolic link. if test -d "$TERMINFO" then ( cd "$TERMINFO" && rm -fr ./? 2>/dev/null ) elif test -f "$TERMINFO.db" then ( rm -f "$TERMINFO.db" 2>/dev/null ) fi if test "$ext_funcs" = 1 ; then cat </dev/null ) if ( cd "$TICDIR" 2>/dev/null ) then cd "$TICDIR" || exit TICDIR=`pwd` if test "$TICDIR " != "$TERMINFO "; then # Well, we tried. Some systems lie to us, so the # installer will have to double-check. echo "Verify if $TICDIR and $TERMINFO are the same." echo "The new terminfo is in $TERMINFO; the other should be a link to it." echo "Otherwise, remove $TICDIR and link it to $TERMINFO." fi else cd ${DESTDIR}$prefix || exit # Construct a symbolic link that only assumes $ticdir has the # same $prefix as the other installed directories. RELATIVE=`echo $ticdir|sed -e 's%^'$prefix'/%%'` if test "$RELATIVE" != "$ticdir" ; then RELATIVE=../`echo $ticdir|sed -e 's%^'$prefix'/%%' -e 's%^/%%'` fi if ( @LN_S@ "$RELATIVE" "$TICDIR" ) then echo "** sym-linked $TICDIR for compatibility" else echo "** could not sym-link $TICDIR for compatibility" fi fi fi # vile:shmode ncurses-6.4-20240113/misc/csort0000755000000000000000000000462514114713361014460 0ustar rootroot#!/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 "$@" ncurses-6.4-20240113/misc/ncurses.ref0000644000000000000000000005055006625701317015564 0ustar rootrootLIBRARY 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 ncurses-6.4-20240113/misc/gen-pkgconfig.in0000644000000000000000000001706514320324440016443 0ustar rootroot#!@SHELL@ # $Id: gen-pkgconfig.in,v 1.56 2022/10/08 16:45:20 tom Exp $ ############################################################################## # Copyright 2018-2021,2022 Thomas E. Dickey # # Copyright 2009-2015,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey # # The complete configure script for ncurses is the ncurses5-config (or similar # name, depending on the flavor, e.g., ncursesw5-config, ncurses6-config, etc). # That provides more information than pkg-config, and is the portable and # recommended solution. # # For each library, generate a ".pc" file which depends on the base ncurses # library, except that the tinfo library does not depend on ncurses. LIB_NAME=@LIB_NAME@ TINFO_NAME=@TINFO_NAME@ PANEL_NAME=@PANEL_NAME@ MENU_NAME=@MENU_NAME@ FORM_NAME=@FORM_NAME@ CXX_NAME=@CXX_NAME@ DFT_DEP_SUFFIX=@DFT_DEP_SUFFIX@ TINFO_ARG_SUFFIX=@TINFO_ARG_SUFFIX@ CXX_LIB_SUFFIX=@CXX_LIB_SUFFIX@ suffix=@PC_MODULE_SUFFIX@ prefix="@prefix@" exec_prefix="@exec_prefix@" includedir="@includedir@@includesubdir@" libdir="@libdir@" RPATH_LIST=@RPATH_LIST@ PRIVATE_LIBS="@PRIVATE_LIBS@" show_prefix='@prefix@' show_exec_prefix='@exec_prefix@' show_includedir='@includedir@@includesubdir@' show_libdir='@libdir@' MAIN_LIBRARY="${LIB_NAME}@USE_ARG_SUFFIX@" SUB_LIBRARY="${TINFO_ARG_SUFFIX}" CXX_LIBRARY="${CXX_NAME}@USE_ARG_SUFFIX@" FORM_LIBRARY="${FORM_NAME}@USE_ARG_SUFFIX@" MENU_LIBRARY="${MENU_NAME}@USE_ARG_SUFFIX@" PANEL_LIBRARY="${PANEL_NAME}@USE_ARG_SUFFIX@" CFLAGS="@PKG_CFLAGS@" if [ "$includedir" != "/usr/include" ]; then includetop=`echo "$includedir" | sed -e 's,/include/[^/]*$,/include,'` [ "$includetop" = "/usr/include" ] && includetop="$includedir" CFLAGS="$CFLAGS -I\${includedir}" if [ "x$includetop" != "x$includedir" ] then CFLAGS="$CFLAGS -I${includetop}" fi fi lib_flags= for opt in -L$libdir @EXTRA_PKG_LDFLAGS@ @LIBS@ do case $opt in -l*) # LIBS is handled specially below continue ;; -specs*) # ignore linker specs-files which were used to build library continue ;; -Wl,-z,*) # ignore flags used to manipulate shared image continue ;; -Wl,--dynamic-linker*) # ignore ELF interpreter continue ;; -Wl,--as-needed|-Wl,--build-id=*|-Wl,-dT,*|-Wl,-T,*) continue ;; -L*) lib_check=`echo "x$opt" | sed -e 's/^.-L//'` # on a new/nonstandard install, $libdir may not yet exist at this point if [ "$libdir" != "$lib_check" ] then [ -d "$lib_check" ] || continue fi case "$lib_check" in @LD_SEARCHPATH@) # skip standard libdir if [ "$lib_check" = "$libdir" ] then lib_first=yes IFS_save="$IFS" IFS='|' LIBDIRS="@LD_SEARCHPATH@" for lib_check in $LIBDIRS do if [ -d "$lib_check" ] then if [ "$lib_check" != "$libdir" ] then lib_first=no fi break fi done IFS="$IFS_save" [ $lib_first = yes ] && continue found=no for check in $lib_flags do if [ "x$check" = "x$opt" ] then found=yes break fi done [ $found = yes ] && continue : else continue fi ;; *) found=no for check in $lib_flags do if [ "x$check" = "x$opt" ] then found=yes break fi done [ $found = yes ] && continue ;; esac ;; esac lib_flags="$lib_flags $opt" done # Check if we should specify the tinfo library explicitly so that terminfo # functions or curses variables (which also reside in tinfo) can be linked # using the -lncurses option. NEED_TINFO=no if [ "x@TINFO_LIBS@" != "x" ] && \ [ "x$TINFO_ARG_SUFFIX" != "x$MAIN_LIBRARY" ] then NEED_TINFO=yes fi # The "URL" feature came in pkg-config 0.17 USEURL="" CFGVER=`${PKG_CONFIG:-pkg-config} --version 2>/dev/null |head -n 1 | awk -F. '/0.[0-9][0-9]/{print $2;}'` # A missing version should simply fail, but some packagers insist on building # packages on machines which do not actually have the tools they depend on at # runtime. [ -z "$CFGVER" ] && CFGVER=30 [ $CFGVER -ge 17 ] || USEURL="#" for name in @PC_MODULES_TO_MAKE@ do name="${name}" case $name in form*) name="$FORM_LIBRARY" ;; menu*) name="$MENU_LIBRARY" ;; panel*) name="$PANEL_LIBRARY" ;; ncurses++*) name="$CXX_LIBRARY" ;; esac LIBS="-l$name" desc="ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" reqs= if [ $name = $MAIN_LIBRARY ]; then desc="$desc library" [ $NEED_TINFO = yes ] && LIBS="$LIBS -l$TINFO_ARG_SUFFIX" [ -n "@LIBS@" ] && LIBS="$LIBS @LIBS@" elif [ $name = $SUB_LIBRARY ]; then desc="$desc terminal interface library" elif expr $name : ".*${CXX_NAME}.*" >/dev/null ; then reqs="$PANEL_LIBRARY${suffix}, $MENU_LIBRARY${suffix}, $FORM_LIBRARY${suffix}, $MAIN_LIBRARY${suffix}" desc="$desc add-on library" else reqs="$MAIN_LIBRARY${suffix}" desc="$desc add-on library" fi if [ $name != $SUB_LIBRARY ] && \ [ $SUB_LIBRARY != $MAIN_LIBRARY ] && \ [ $name != $TINFO_NAME ] && \ [ $NEED_TINFO != yes ] ; then [ -n "$reqs" ] && reqs="$reqs, " reqs="${reqs}${SUB_LIBRARY}${suffix}" fi if [ $name = $MAIN_LIBRARY ] then main_libs="$PRIVATE_LIBS" else main_libs= fi echo "** creating ${name}${suffix}.pc" cat >${name}${suffix}.pc <. * 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 ncurses-6.4-20240113/misc/ncu2openbsd0000755000000000000000000011522114477113125015547 0ustar rootroot#!/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 < 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 ncurses-6.4-20240113/ncurses/0000755000000000000000000000000014527223753014131 5ustar rootrootncurses-6.4-20240113/ncurses/report_hashing.c0000644000000000000000000000623413615656212017313 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/ncurses/curses.priv.h0000644000000000000000000025137514523444017016574 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 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.677 2023/11/10 15:11:11 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 #if HAVE_LIMITS_H # include #elif HAVE_SYS_PARAM_H # include #endif #include #include #include #if defined __hpux # ifndef EILSEQ # define EILSEQ 47 # endif #endif #ifndef PATH_MAX # if defined(_POSIX_PATH_MAX) # define PATH_MAX _POSIX_PATH_MAX # elif defined(MAXPATHLEN) # define PATH_MAX MAXPATHLEN # else # define PATH_MAX 255 /* the Posix minimum path-size */ # endif #endif #if DECL_ERRNO extern int errno; #endif /* Some Windows related defines */ #undef _NC_WINDOWS #if (defined(_WIN32) || defined(_WIN64)) #define _NC_WINDOWS #else #undef EXP_WIN32_DRIVER #endif #undef _NC_MINGW #if (defined(__MINGW32__) || defined(__MINGW64__)) #define _NC_MINGW #endif #undef _NC_MSC #ifdef _MSC_VER #define _NC_MSC #endif /* Some systems have a broken 'select()', but workable 'poll()'. Use that */ #if HAVE_WORKING_POLL #define USE_FUNC_POLL 1 #if HAVE_POLL_H #include #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" # 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) # 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 /* * 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 /* * When converting from terminfo to termcap, check for cases where we can trim * octal escapes down to 2-character form. It is useful for terminfo format * also, but not as important. */ #define MAX_TC_FIXUPS 10 #define MIN_TC_FIXUPS 4 #define isoctal(c) ((c) >= '0' && (c) <= '7') /* * The filesystem database normally uses a single-letter for the lower level * of directories. Use a hexadecimal code for filesystems which do not * preserve mixed-case names. */ #if MIXEDCASE_FILENAMES #define LEAF_FMT "%c" #define LEAF_LEN 1 #else #define LEAF_FMT "%02x" #define LEAF_LEN 2 #endif /* * TRACEMSE_FMT is no longer than 80 columns, there are 5 numbers that * could at most have 10 digits, and the mask contains no more than 32 bits * with each bit representing less than 15 characters. Usually the whole * string is less than 80 columns, but this buffer size is an absolute * limit. */ #define TRACEMSE_MAX (80 + (5 * 10) + (32 * 15)) #define TRACEMSE_FMT "id %2d at (%2d, %2d, %2d) state %4lx = {" /* } */ #ifdef USE_TERM_DRIVER struct DriverTCB; /* Terminal Control Block forward declaration */ #define INIT_TERM_DRIVER() _nc_globals.term_driver = _nc_get_driver #else #define INIT_TERM_DRIVER() /* nothing */ #endif extern NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals; /* The limit reserves one byte for a terminating NUL */ #define my_getstr_limit (_nc_globals.getstr_limit - 1) #define _nc_getstr_limit(n) \ (((n) < 0) \ ? my_getstr_limit \ : (((n) > my_getstr_limit) \ ? my_getstr_limit \ : (n))) /* * Use screen-specific ripoff data (for softkeys) rather than global. */ #ifdef USE_SP_RIPOFF #define safe_ripoff_sp (sp)->rsp #define safe_ripoff_stack (sp)->rippedoff #else #define safe_ripoff_sp _nc_prescreen.rsp #define safe_ripoff_stack _nc_prescreen.rippedoff #endif extern NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen; typedef enum { 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[40]; char tracemse_buf[TRACEMSE_MAX]; #if USE_REENTRANT long _outchars; const char *_tputs_trace; #endif #endif #undef SCREEN } SCREEN; extern NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain; extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; WINDOWLIST { WINDOWLIST *next; SCREEN *screen; /* screen containing the window */ WINDOW win; /* WINDOW_EXT() needs to account for offset */ #if NCURSES_WIDECHAR char addch_work[(MB_LEN_MAX * 9) + 1]; unsigned addch_used; /* number of bytes in addch_work[] */ int addch_x; /* x-position for addch_work[] */ int addch_y; /* y-position for addch_work[] */ #endif }; #define WINDOW_EXT(w,m) (((WINDOWLIST *)((void *)((char *)(w) - offsetof(WINDOWLIST, win))))->m) #ifdef USE_SP_WINDOWLIST #define SP_INIT_WINDOWLIST(sp) WindowList(sp) = 0 #else #define SP_INIT_WINDOWLIST(sp) /* nothing */ #endif #define SP_PRE_INIT(sp) \ sp->_cursrow = -1; \ sp->_curscol = -1; \ 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))) #ifndef MB_LEN_MAX #define MB_LEN_MAX 16 /* should be >= MB_CUR_MAX, but that may be a function */ #endif #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 #define NulChar 0,0,0,0 /* FIXME: see CCHARW_MAX */ #define CharOf(c) ((c).chars[0]) #define AttrOf(c) ((c).attr) #define AddAttr(c,a) AttrOf(c) |= ((a) & A_ATTRIBUTES) #define RemAttr(c,a) AttrOf(c) &= ~((a) & A_ATTRIBUTES) #define SetAttr(c,a) AttrOf(c) = ((a) & A_ATTRIBUTES) | WidecExt(c) #define NewChar2(c,a) { a, { c, NulChar } NulColor } #define NewChar(ch) NewChar2(ChCharOf(ch), ChAttrOf(ch)) #if CCHARW_MAX == 5 #define CharEq(a,b) (((a).attr == (b).attr) \ && (a).chars[0] == (b).chars[0] \ && (a).chars[1] == (b).chars[1] \ && (a).chars[2] == (b).chars[2] \ && (a).chars[3] == (b).chars[3] \ && (a).chars[4] == (b).chars[4] \ if_EXT_COLORS(&& (a).ext_color == (b).ext_color)) #elif CCHARW_MAX > 0 #error Inconsistent values for CCHARW_MAX #else #define CharEq(a,b) (!memcmp(&(a), &(b), sizeof(a))) #endif #define SetChar(ch,c,a) do { \ NCURSES_CH_T *_cp = &(ch); \ memset(_cp, 0, sizeof(ch)); \ _cp->chars[0] = (wchar_t) (c); \ _cp->attr = (a); \ if_EXT_COLORS(SetPair(ch, PairNumber(a))); \ } while (0) #define CHREF(wch) (&(wch)) #define CHDEREF(wch) (*(wch)) #define ARG_CH_T NCURSES_CH_T * #define CARG_CH_T const NCURSES_CH_T * #define PUTC_DATA char PUTC_buf[MB_LEN_MAX]; int PUTC_i, PUTC_n; \ mbstate_t PUT_st; wchar_t PUTC_ch #define PUTC_INIT init_mb (PUT_st) #define PUTC(ch) do { if(!isWidecExt(ch)) { \ if (Charable(ch)) { \ TR_PUTC(CharOf(ch)); \ NCURSES_OUTC_FUNC (NCURSES_SP_ARGx CharOf(ch)); \ COUNT_OUTCHARS(1); \ } else { \ for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) { \ PUTC_ch = (ch).chars[PUTC_i]; \ if (PUTC_ch == L'\0') \ break; \ PUTC_INIT; \ PUTC_n = (int) wcrtomb(PUTC_buf, \ (ch).chars[PUTC_i], &PUT_st); \ if (PUTC_n <= 0) { \ if (PUTC_ch && is8bits(PUTC_ch) && PUTC_i == 0) { \ TR_PUTC(CharOf(ch)); \ NCURSES_OUTC_FUNC (NCURSES_SP_ARGx CharOf(ch)); \ } \ break; \ } else { \ int PUTC_j; \ for (PUTC_j = 0; PUTC_j < PUTC_n; ++PUTC_j) { \ TR_PUTC(PUTC_buf[PUTC_j]); \ NCURSES_OUTC_FUNC (NCURSES_SP_ARGx PUTC_buf[PUTC_j]); \ } \ } \ } \ COUNT_OUTCHARS(PUTC_i); \ } } } while (0) #define BLANK NewChar2(' ', WA_NORMAL) #define ZEROS NewChar2('\0', WA_NORMAL) #define ISBLANK(ch) ((ch).chars[0] == L' ' && (ch).chars[1] == L'\0') /* * Wide characters cannot be represented in the A_CHARTEXT mask of * attr_t's but an application might have set a narrow character there. * But even in that case, it would only be a printable character, or * zero. Otherwise we can use those bits to tell if a cell is the * first or extension part of a wide character. */ #define WidecExt(ch) (int) (AttrOf(ch) & A_CHARTEXT) #define isWidecBase(ch) (WidecExt(ch) == 1) #define isWidecExt(ch) (WidecExt(ch) > 1 && WidecExt(ch) < 32) #define SetWidecExt(dst, ext) AttrOf(dst) &= ~A_CHARTEXT, \ AttrOf(dst) |= (attr_t) (ext + 1) #define if_WIDEC(code) code #define Charable(ch) (((SP_PARM->_legacy_coding) \ || (AttrOf(ch) & A_ALTCHARSET) \ || (!isWidecExt(ch))) && \ (ch).chars[1] == L'\0' && \ _nc_is_charable(CharOf(ch))) #define L(ch) L ## ch #else /* }{ */ #define CharOf(c) ChCharOf(c) #define AttrOf(c) ChAttrOf(c) #define AddAttr(c,a) c |= (a) #define RemAttr(c,a) c &= ~((a) & A_ATTRIBUTES) #define SetAttr(c,a) c = ((c) & ~A_ATTRIBUTES) | (a) #define NewChar(ch) (ch) #define NewChar2(c,a) ((c) | (a)) #define CharEq(a,b) ((a) == (b)) #define SetChar(ch,c,a) ch = (c) | (a) #define CHREF(wch) wch #define CHDEREF(wch) wch #define ARG_CH_T NCURSES_CH_T #define CARG_CH_T NCURSES_CH_T #define PUTC_DATA /* nothing */ #define PUTC(ch) { \ TR_PUTC(ch); \ NCURSES_OUTC_FUNC (NCURSES_SP_ARGx (int) ch); \ } #define BLANK (' '|A_NORMAL) #define ZEROS ('\0'|A_NORMAL) #define ISBLANK(ch) (CharOf(ch) == ' ') #define isWidecExt(ch) (0) #define if_WIDEC(code) /* nothing */ #define Charable(ch) (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 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 (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 (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 *, 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) && !defined(_NC_MSC) && !defined(EXP_WIN32_DRIVER) /* * MinGW has wide-character functions, but they do not work correctly. */ extern int __MINGW_NOTHROW _nc_wctomb(char *, wchar_t); #define wctomb(s,wc) _nc_wctomb(s,wc) #define wcrtomb(s,wc,n) _nc_wctomb(s,wc) extern int __MINGW_NOTHROW _nc_mbtowc(wchar_t *, const char *, size_t); #define mbtowc(pwc,s,n) _nc_mbtowc(pwc,s,n) extern int __MINGW_NOTHROW _nc_mblen(const char *, size_t); #define mblen(s,n) _nc_mblen(s, n) #endif /* _NC_WINDOWS && !_NC_MSC */ #if defined(_NC_WINDOWS) || defined(_NC_MINGW) /* see wcwidth.c */ extern NCURSES_EXPORT(int) mk_wcwidth(wchar_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 #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 */ ncurses-6.4-20240113/ncurses/report_offsets.c0000644000000000000000000002002414503613275017333 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,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. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey * ****************************************************************************/ #include MODULE_ID("$Id: report_offsets.c,v 1.23 2023/09/23 16:47:57 tom Exp $") #define show_size(type) \ flag = 0; \ last = 0; \ printf("%5lu " #type "\n", (unsigned long)sizeof(type)) #define show_offset(type,member) \ next = (unsigned long)offsetof(type,member); \ if (last > next) \ printf("?? incorrect order for " #type "." #member "\n"); \ printf("%5lu %c " #type "." #member "\n", next, flag ? *flag : ' '); \ last = next; \ flag = 0 #if NCURSES_WIDECHAR && NCURSES_EXT_COLORS #define show_COLORS(type,member) { flag = "c"; show_offset(type,member); } #else #define show_COLORS(type,member) /* nothing */ #endif #ifdef USE_TERM_DRIVER #define show_DRIVER(type,member) { flag = "d"; show_offset(type,member); } #else #define show_DRIVER(type,member) /* nothing */ #endif #if NO_LEAKS #define show_MLEAKS(type,member) { flag = "L"; show_offset(type,member); } #else #define show_MLEAKS(type,member) /* nothing */ #endif #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(mmask_t); show_size(MEVENT); show_size(NCURSES_BOOL); printf("\n"); show_size(SCREEN); show_offset(SCREEN, _ifd); show_offset(SCREEN, _fifo); show_offset(SCREEN, _fifohead); show_offset(SCREEN, _direct_color); show_offset(SCREEN, _panelHook); show_offset(SCREEN, jump); show_offset(SCREEN, rsp); #if NCURSES_NO_PADDING show_OPTION(SCREEN, _no_padding); #endif #if USE_HARD_TABS show_OPTION(SCREEN, _ht_cost); #endif #if USE_ITALIC show_OPTION(SCREEN, _use_ritm); #endif #if USE_KLIBC_KBD show_OPTION(SCREEN, _extended_key); #endif #if NCURSES_EXT_FUNCS show_OPTION(SCREEN, _assumed_color); #endif #if USE_GPM_SUPPORT show_OPTION(SCREEN, _mouse_gpm_loaded); #ifdef HAVE_LIBDL show_OPTION(SCREEN, _dlopen_gpm); #endif #endif #if USE_EMX_MOUSE show_OPTION(SCREEN, _emxmouse_wfd); #endif #if USE_SYSMOUSE show_OPTION(SCREEN, _sysmouse_fifo); #endif show_DRIVER(SCREEN, _drv_mouse_fifo); #if USE_SIZECHANGE show_OPTION(SCREEN, _resize); #endif #ifdef USE_SP_WINDOWLIST show_NORMAL(SCREEN, _windowlist); #endif show_REENTR(SCREEN, _ttytype); show_SPFUNC(SCREEN, use_tioctl); show_WIDECH(SCREEN, _screen_acs_fix); show_COLORS(SCREEN, _ordered_pairs); show_TRACES(SCREEN, tracechr_buf); printf("\n"); show_size(TERMINAL); show_offset(TERMINAL, type); show_offset(TERMINAL, Filedes); show_offset(TERMINAL, Ottyb); show_offset(TERMINAL, Nttyb); show_offset(TERMINAL, _baudrate); show_offset(TERMINAL, _termname); show_offset(TERMINAL, tparm_state); #if HAVE_INIT_EXTENDED_COLOR show_COLORS(TERMINAL, type2); #endif printf("\n"); show_size(TERMTYPE); #if NCURSES_XNAMES show_OPTION(TERMTYPE, ext_str_table); show_OPTION(TERMTYPE, ext_Strings); #endif printf("\n"); show_size(TPARM_STATE); show_offset(TPARM_STATE, stack); show_offset(TPARM_STATE, stack_ptr); show_offset(TPARM_STATE, out_buff); show_offset(TPARM_STATE, fmt_buff); show_offset(TPARM_STATE, static_vars); show_TRACES(TPARM_STATE, tname); printf("\n"); show_size(WINDOW); show_WIDECH(WINDOW, _bkgrnd); show_COLORS(WINDOW, _color); printf("\n"); show_size(NCURSES_GLOBALS); show_offset(NCURSES_GLOBALS, init_signals); show_offset(NCURSES_GLOBALS, tgetent_cache); show_offset(NCURSES_GLOBALS, dbd_vars); #if HAVE_TSEARCH show_offset(NCURSES_GLOBALS, cached_tparm); #endif show_DRIVER(NCURSES_GLOBALS, term_driver); #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_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; } ncurses-6.4-20240113/ncurses/widechar/0000755000000000000000000000000014527223330015706 5ustar rootrootncurses-6.4-20240113/ncurses/widechar/lib_vid_attr.c0000644000000000000000000002661614423031666020533 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/widechar/lib_ins_wch.c0000644000000000000000000001153314527223330020335 0ustar rootroot/**************************************************************************** * Copyright 2019-2020,2023 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.29 2023/11/21 21:53:28 tom Exp $") /* * Insert the given character, updating the current location to simplify * inserting a string. */ NCURSES_EXPORT(int) _nc_insert_wch(WINDOW *win, const cchar_t *wch) { int cells = _nc_wacs_width(CharOf(CHDEREF(wch))); int code = OK; if (cells < 0) { code = winsch(win, (chtype) CharOf(CHDEREF(wch))); } else { if (cells == 0) cells = 1; if (win->_curx <= win->_maxx) { int cell; struct ldat *line = &(win->_line[win->_cury]); NCURSES_CH_T *end = &(line->text[win->_curx]); NCURSES_CH_T *temp1 = &(line->text[win->_maxx]); NCURSES_CH_T *temp2 = temp1 - cells; CHANGED_TO_EOL(line, win->_curx, win->_maxx); while (temp1 > end) *temp1-- = *temp2--; *temp1 = _nc_render(win, *wch); for (cell = 1; cell < cells; ++cell) { SetWidecExt(temp1[cell], cell); } win->_curx = (NCURSES_SIZE_T) (win->_curx + cells); } } return code; } NCURSES_EXPORT(int) wins_wch(WINDOW *win, const cchar_t *wch) { int code = ERR; T((T_CALLED("wins_wch(%p, %s)"), (void *) win, _tracecchar_t(wch))); if (win != 0) { NCURSES_SIZE_T oy = win->_cury; NCURSES_SIZE_T ox = win->_curx; code = _nc_insert_wch(win, wch); win->_curx = ox; win->_cury = oy; _nc_synchook(win); } returnCode(code); } NCURSES_EXPORT(int) wins_nwstr(WINDOW *win, const wchar_t *wstr, int n) { int code = ERR; T((T_CALLED("wins_nwstr(%p,%s,%d)"), (void *) win, _nc_viswbufn(wstr, n), n)); if (win != 0 && wstr != 0 && 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); } ncurses-6.4-20240113/ncurses/widechar/charable.c0000644000000000000000000000621713615656212017627 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/ncurses/widechar/lib_slk_wset.c0000644000000000000000000000645713615656212020555 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/widechar/lib_vline_set.c0000644000000000000000000000617213615656212020704 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/widechar/lib_inwstr.c0000644000000000000000000001005513615656212020235 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 2002-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas Dickey * ****************************************************************************/ /* ** lib_inwstr.c ** ** The routines winnwstr() and winwstr(). ** */ #include MODULE_ID("$Id: lib_inwstr.c,v 1.9 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) winnwstr(WINDOW *win, wchar_t *wstr, int n) { int count = 0; cchar_t *text; T((T_CALLED("winnwstr(%p,%p,%d)"), (void *) win, (void *) wstr, n)); if (wstr != 0) { if (win) { int row, col; int last = 0; bool done = FALSE; getyx(win, row, col); text = win->_line[row].text; while (count < n && !done && count != ERR) { if (!isWidecExt(text[col])) { int inx; wchar_t wch; for (inx = 0; (inx < CCHARW_MAX) && ((wch = text[col].chars[inx]) != 0); ++inx) { if (count + 1 > n) { done = TRUE; if (last == 0) { count = ERR; /* error if we store nothing */ } else { count = last; /* only store complete chars */ } break; } wstr[count++] = wch; } } last = count; if (++col > win->_maxx) { break; } } } if (count > 0) { wstr[count] = '\0'; T(("winnwstr returns %s", _nc_viswbuf(wstr))); } } returnCode(count); } /* * X/Open says winwstr() returns OK if not ERR. If that is not a blunder, it * must have a null termination on the string (see above). Unlike winnstr(), * it does not define what happens for a negative count with winnwstr(). */ NCURSES_EXPORT(int) winwstr(WINDOW *win, wchar_t *wstr) { int result = OK; T((T_CALLED("winwstr(%p,%p)"), (void *) win, (void *) wstr)); if (win == 0) { result = ERR; } else if (winnwstr(win, wstr, CCHARW_MAX * (win->_maxx - win->_curx + 1)) == ERR) { result = ERR; } returnCode(result); } ncurses-6.4-20240113/ncurses/widechar/lib_box_set.c0000644000000000000000000001104413615656212020351 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/widechar/lib_unget_wch.c0000644000000000000000000001004514436633454020676 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/widechar/widechars.c0000644000000000000000000001055213722500253020024 0ustar rootroot/**************************************************************************** * Copyright 2018,2020 Thomas E. Dickey * * Copyright 2012,2013 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ #include #if USE_WIDEC_SUPPORT MODULE_ID("$Id: widechars.c,v 1.9 2020/08/29 16:22:03 juergen Exp $") #if (defined(_NC_WINDOWS)) && !defined(_NC_MSC) /* * MinGW has wide-character functions, but they do not work correctly. */ int _nc_mbtowc(wchar_t *pwc, const char *s, size_t n) { int result; int count; int try; if (s != 0 && n != 0) { /* * MultiByteToWideChar() can decide to return more than one * wide-character. We want only one. Ignore any trailing null, both * in the initial count and in the conversion. */ count = 0; for (try = 1; try <= (int) n; ++try) { count = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, s, try, pwc, 0); TR(TRACE_BITS, ("...try %d:%d", try, count)); if (count > 0) { break; } } if (count < 1 || count > 2) { result = -1; } else { wchar_t actual[2]; memset(&actual, 0, sizeof(actual)); count = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, s, try, actual, 2); TR(TRACE_BITS, ("\twin32 ->%#x, %#x", actual[0], actual[1])); *pwc = actual[0]; if (actual[1] != 0) result = -1; else result = try; } } else { result = 0; } return result; } int _nc_mblen(const char *s, size_t n) { int result = -1; int count; wchar_t temp; if (s != 0 && n != 0) { count = _nc_mbtowc(&temp, s, n); if (count == 1) { int check = WideCharToMultiByte(CP_UTF8, 0, &temp, 1, NULL, 0, /* compute length only */ NULL, NULL); TR(TRACE_BITS, ("\tcheck ->%d\n", check)); if (check > 0 && (size_t) check <= n) { result = check; } } } else { result = 0; } return result; } int __MINGW_NOTHROW _nc_wctomb(char *s, wchar_t wc) { int result; int check; check = WideCharToMultiByte(CP_UTF8, 0, &wc, 1, NULL, 0, /* compute length only */ NULL, NULL); if (check > 0) { result = WideCharToMultiByte(CP_UTF8, 0, &wc, 1, s, check + 1, NULL, NULL); } else { result = -1; } return result; } #endif /* _NC_WINDOWS */ #endif /* USE_WIDEC_SUPPORT */ ncurses-6.4-20240113/ncurses/widechar/lib_key_name.c0000644000000000000000000000576314436627346020521 0ustar rootroot/**************************************************************************** * Copyright 2020,2023 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.6 2023/06/03 12:15:34 tom Exp $") #define MyData _nc_globals.key_name NCURSES_EXPORT(NCURSES_CONST char *) key_name(wchar_t c) { cchar_t my_cchar; wchar_t *my_wchars; size_t len; 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; } ncurses-6.4-20240113/ncurses/widechar/lib_get_wch.c0000644000000000000000000001056114036604406020325 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/widechar/lib_hline_set.c0000644000000000000000000000616513615656212020670 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/widechar/lib_wunctrl.c0000644000000000000000000000564513615656212020416 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 2001-2011,2012 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* ** lib_wunctrl.c ** ** The routine wunctrl(). ** */ #include MODULE_ID("$Id: lib_wunctrl.c,v 1.17 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(wchar_t *) NCURSES_SP_NAME(wunctrl) (NCURSES_SP_DCLx cchar_t *wc) { static wchar_t str[CCHARW_MAX + 1], *wsp; wchar_t *result; if (wc == 0) { result = 0; } else if (SP_PARM != 0 && Charable(*wc)) { const char *p = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (unsigned) _nc_to_char((wint_t)CharOf(*wc))); for (wsp = str; *p; ++p) { *wsp++ = (wchar_t) _nc_to_widechar(*p); } *wsp = 0; result = str; } else { result = wc->chars; } return result; } #if NCURSES_SP_FUNCS NCURSES_EXPORT(wchar_t *) wunctrl(cchar_t *wc) { return NCURSES_SP_NAME(wunctrl) (CURRENT_SCREEN, wc); } #endif ncurses-6.4-20240113/ncurses/widechar/lib_in_wch.c0000644000000000000000000000566613615656212020172 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/widechar/lib_erasewchar.c0000644000000000000000000000717714052314362021037 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/widechar/lib_cchar.c0000644000000000000000000001222714270170504017763 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,2022 Thomas E. Dickey * * Copyright 2001-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* ** lib_cchar.c ** ** The routines setcchar() and getcchar(). ** */ #include #include MODULE_ID("$Id: lib_cchar.c,v 1.38 2022/07/27 08:03:16 tom Exp $") /* * The SuSv2 description leaves some room for interpretation. We'll assume wch * points to a string which is L'\0' terminated, contains at least one * character with strictly positive width, which must be the first, and * contains no characters of negative width. */ NCURSES_EXPORT(int) setcchar(cchar_t *wcval, const wchar_t *wch, const attr_t attrs, NCURSES_PAIRS_T pair_arg, const void *opts) { int code = OK; int color_pair = pair_arg; unsigned len; TR(TRACE_CCALLS, (T_CALLED("setcchar(%p,%s,attrs=%lu,pair=%d,%p)"), (void *) wcval, _nc_viswbuf(wch), (unsigned long) attrs, color_pair, opts)); set_extended_pair(opts, color_pair); if (wch == NULL || ((len = (unsigned) wcslen(wch)) > 1 && _nc_wacs_width(wch[0]) < 0) || color_pair < 0) { code = ERR; } else { unsigned i; if (len > CCHARW_MAX) len = CCHARW_MAX; /* * If we have a following spacing-character, stop at that point. We * are only interested in adding non-spacing characters. */ for (i = 1; i < len; ++i) { if (_nc_wacs_width(wch[i]) != 0) { len = i; break; } } memset(wcval, 0, sizeof(*wcval)); if (len != 0) { SetAttr(*wcval, attrs); SetPair(CHDEREF(wcval), color_pair); memcpy(&wcval->chars, wch, len * sizeof(wchar_t)); TR(TRACE_CCALLS, ("copy %d wchars, first is %s", len, _tracecchar_t(wcval))); } } TR(TRACE_CCALLS, (T_RETURN("%d"), code)); return (code); } NCURSES_EXPORT(int) getcchar(const cchar_t *wcval, wchar_t *wch, attr_t *attrs, NCURSES_PAIRS_T *pair_arg, void *opts) { int code = ERR; TR(TRACE_CCALLS, (T_CALLED("getcchar(%p,%p,%p,%p,%p)"), (const void *) wcval, (void *) wch, (void *) attrs, (void *) pair_arg, opts)); #if !NCURSES_EXT_COLORS if (opts != NULL) { ; /* empty */ } else #endif if (wcval != NULL) { wchar_t *wp; int len; #if HAVE_WMEMCHR len = ((wp = wmemchr(wcval->chars, L'\0', (size_t) CCHARW_MAX)) ? (int) (wp - wcval->chars) : CCHARW_MAX); #else len = wcsnlen(wcval->chars, CCHARW_MAX); #endif if (wch == NULL) { /* * If the value is a null, set the length to 1. * If the value is not a null, return the length plus 1 for null. */ code = (len < CCHARW_MAX) ? (len + 1) : CCHARW_MAX; } else if (attrs == 0 || pair_arg == 0) { code = ERR; } else if (len >= 0) { int color_pair; TR(TRACE_CCALLS, ("copy %d wchars, first is %s", len, _tracecchar_t(wcval))); *attrs = AttrOf(*wcval) & A_ATTRIBUTES; color_pair = GetPair(*wcval); get_extended_pair(opts, color_pair); *pair_arg = limit_PAIRS(color_pair); wmemcpy(wch, wcval->chars, (size_t) len); wch[len] = L'\0'; if (*pair_arg >= 0) code = OK; } } TR(TRACE_CCALLS, (T_RETURN("%d"), code)); return (code); } ncurses-6.4-20240113/ncurses/widechar/lib_wacs.c0000644000000000000000000001510113615656212017641 0ustar rootroot/**************************************************************************** * 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]))); } } } ncurses-6.4-20240113/ncurses/widechar/lib_pecho_wchar.c0000644000000000000000000000564014135040554021167 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/widechar/lib_in_wchnstr.c0000644000000000000000000000631613615656212021072 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 2002-2007,2009 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas Dickey * ****************************************************************************/ /* ** lib_in_wchnstr.c ** ** The routine win_wchnstr(). ** */ #include MODULE_ID("$Id: lib_in_wchnstr.c,v 1.9 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) win_wchnstr(WINDOW *win, cchar_t *wchstr, int n) { int code = OK; T((T_CALLED("win_wchnstr(%p,%p,%d)"), (void *) win, (void *) wchstr, n)); if (win != 0 && wchstr != 0) { NCURSES_CH_T *src; int row, col; int j, k, limit; getyx(win, row, col); limit = getmaxx(win) - col; src = &(win->_line[row].text[col]); if (n < 0) { n = limit; } else if (n > limit) { n = limit; } for (j = k = 0; j < n; ++j) { if (j == 0 || !WidecExt(src[j]) || isWidecBase(src[j])) { wchstr[k++] = src[j]; } } memset(&(wchstr[k]), 0, sizeof(*wchstr)); T(("result = %s", _nc_viscbuf(wchstr, n))); } else { code = ERR; } returnCode(code); } ncurses-6.4-20240113/ncurses/widechar/lib_add_wch.c0000644000000000000000000003021614454554224020303 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,2023 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.18 2023/07/15 17:34:12 tom Exp $") /* clone/adapt lib_addch.c */ static const cchar_t blankchar = NewChar(BLANK_TEXT); /* * Ugly microtweaking alert. Everything from here to end of module is * likely to be speed-critical -- profiling data sure says it is! * Most of the important screen-painting functions are shells around * wadd_wch(). So we make every effort to reduce function-call overhead * by inlining stuff, even at the cost of making wrapped copies for * export. Also we supply some internal versions that don't call the * window sync hook, for use by string-put functions. */ /* Return bit mask for clearing color pair number if given ch has color */ #define COLOR_MASK(ch) (~(attr_t)(((ch) & A_COLOR) ? A_COLOR : 0)) static NCURSES_INLINE cchar_t render_char(WINDOW *win, cchar_t ch) /* compute a rendition of the given char correct for the current context */ { attr_t a = WINDOW_ATTRS(win); int pair = GetPair(ch); if (ISBLANK(ch) && AttrOf(ch) == A_NORMAL && pair == 0) { /* color/pair in attrs has precedence over bkgrnd */ ch = win->_nc_bkgd; SetAttr(ch, a | AttrOf(win->_nc_bkgd)); if ((pair = GET_WINDOW_PAIR(win)) == 0) pair = GetPair(win->_nc_bkgd); SetPair(ch, pair); } else { /* color in attrs has precedence over bkgrnd */ a |= AttrOf(win->_nc_bkgd) & COLOR_MASK(a); /* color in ch has precedence */ if (pair == 0) { if ((pair = GET_WINDOW_PAIR(win)) == 0) pair = GetPair(win->_nc_bkgd); } AddAttr(ch, (a & COLOR_MASK(AttrOf(ch)))); SetPair(ch, pair); } TR(TRACE_VIRTPUT, ("render_char bkg %s (%d), attrs %s (%d) -> ch %s (%d)", _tracech_t2(1, CHREF(win->_nc_bkgd)), GetPair(win->_nc_bkgd), _traceattr(WINDOW_ATTRS(win)), GET_WINDOW_PAIR(win), _tracech_t2(3, CHREF(ch)), GetPair(ch))); return (ch); } /* check if position is legal; if not, return error */ #ifndef NDEBUG /* treat this like an assertion */ #define CHECK_POSITION(win, x, y) \ if (y > win->_maxy \ || x > win->_maxx \ || y < 0 \ || x < 0) { \ TR(TRACE_VIRTPUT, ("Alert! Win=%p _curx = %d, _cury = %d " \ "(_maxx = %d, _maxy = %d)", win, x, y, \ win->_maxx, win->_maxy)); \ return(ERR); \ } #else #define CHECK_POSITION(win, x, y) /* nothing */ #endif static bool newline_forces_scroll(WINDOW *win, NCURSES_SIZE_T *ypos) { bool result = FALSE; if (*ypos >= win->_regtop && *ypos == win->_regbottom) { *ypos = win->_regbottom; result = TRUE; } else { *ypos = (NCURSES_SIZE_T) (*ypos + 1); } return result; } /* * The _WRAPPED flag is useful only for telling an application that we've just * wrapped the cursor. We don't do anything with this flag except set it when * wrapping, and clear it whenever we move the cursor. If we try to wrap at * the lower-right corner of a window, we cannot move the cursor (since that * wouldn't be legal). So we return an error (which is what SVr4 does). * Unlike SVr4, we can successfully add a character to the lower-right corner * (Solaris 2.6 does this also, however). */ static int wrap_to_next_line(WINDOW *win) { win->_flags |= _WRAPPED; if (newline_forces_scroll(win, &(win->_cury))) { win->_curx = win->_maxx; if (!win->_scroll) return (ERR); scroll(win); } win->_curx = 0; return (OK); } static int wadd_wch_literal(WINDOW *, cchar_t); /* * Fill the given number of cells with blanks using the current background * rendition. This saves/restores the current x-position. */ static void fill_cells(WINDOW *win, int count) { cchar_t blank = blankchar; int save_x = win->_curx; int save_y = win->_cury; while (count-- > 0) { if (wadd_wch_literal(win, blank) == ERR) break; } win->_curx = (NCURSES_SIZE_T) save_x; win->_cury = (NCURSES_SIZE_T) save_y; } static int wadd_wch_literal(WINDOW *win, cchar_t ch) { int x; int y; struct ldat *line; x = win->_curx; y = win->_cury; CHECK_POSITION(win, x, y); ch = render_char(win, ch); line = win->_line + y; CHANGED_CELL(line, x); /* * Non-spacing characters are added to the current cell. * * Spacing characters that are wider than one column require some display * adjustments. */ { int len = _nc_wacs_width(CharOf(ch)); int i; int j; wchar_t *chars; if (len == 0) { /* non-spacing */ if ((x > 0 && y >= 0) || (win->_maxx >= 0 && win->_cury >= 1)) { if (x > 0 && y >= 0) { 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; 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); } ncurses-6.4-20240113/ncurses/widechar/lib_get_wstr.c0000644000000000000000000001530714423264653020554 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,2023 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.21 2023/04/29 19:02:03 tom Exp $") static int wadd_wint(WINDOW *win, wint_t *src) { cchar_t tmp; wchar_t wch[2]; wch[0] = (wchar_t) (*src); wch[1] = 0; setcchar(&tmp, wch, A_NORMAL, (short) 0, NULL); return wadd_wch(win, &tmp); } /* * This wipes out the last character, no matter whether it was a tab, control * or other character, and handles reverse wraparound. */ static wint_t * WipeOut(WINDOW *win, int y, int x, wint_t *first, wint_t *last, int echoed) { if (last > first) { *--last = '\0'; if (echoed) { int y1 = win->_cury; int x1 = win->_curx; int n; wmove(win, y, x); for (n = 0; first[n] != 0; ++n) { wadd_wint(win, first + n); } getyx(win, y, x); while (win->_cury < y1 || (win->_cury == y1 && win->_curx < x1)) waddch(win, (chtype) ' '); wmove(win, y, x); } } return last; } NCURSES_EXPORT(int) wgetn_wstr(WINDOW *win, wint_t *str, int maxlen) { SCREEN *sp = _nc_screen_of(win); TTY buf; 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); } ncurses-6.4-20240113/ncurses/llib-lncursesw0000644000000000000000000025271314465752541017036 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/term.priv.h0000644000000000000000000002001714501343326016217 0ustar rootroot/**************************************************************************** * 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: term.priv.h,v 1.8 2023/09/16 15:16:38 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 #include /* PATH_MAX */ #include /* sig_atomic_t */ #include /* time_t */ #include /* time_t */ #ifdef USE_PTHREADS #if USE_REENTRANT #include #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; char trace_fname[PATH_MAX]; int trace_level; FILE * trace_fp; int trace_fd; char * tracearg_buf; size_t tracearg_used; TRACEBUF * tracebuf_ptr; size_t tracebuf_used; char tracechr_buf[40]; char * tracedmp_buf; size_t tracedmp_used; unsigned char * tracetry_buf; size_t tracetry_used; char traceatr_color_buf[2][80]; int traceatr_color_sel; int traceatr_color_last; #if !defined(USE_PTHREADS) && USE_REENTRANT int nested_tracef; #endif #endif /* TRACE */ #if NO_LEAKS bool leak_checking; #endif } NCURSES_GLOBALS; extern NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals; #define N_RIPS 5 #ifdef USE_PTHREADS typedef struct _prescreen_list { struct _prescreen_list *next; pthread_t id; struct screen * sp; } PRESCREEN_LIST; #endif /* * Global data which can be swept up into a SCREEN when one is created. * It may be modified before the next SCREEN is created. */ typedef struct { #ifdef USE_PTHREADS PRESCREEN_LIST *allocated; #else struct screen * allocated; #endif bool use_env; bool filter_mode; attr_t previous_attr; TPARM_STATE tparm_state; TTY * saved_tty; /* savetty/resetty information */ bool use_tioctl; NCURSES_SP_OUTC _outch; /* output handler if not putc */ #ifndef USE_SP_RIPOFF ripoff_t rippedoff[N_RIPS]; ripoff_t * rsp; #endif #if NCURSES_NO_PADDING bool _no_padding; /* flag to set if padding disabled */ #endif #if BROKEN_LINKER || USE_REENTRANT chtype * real_acs_map; int _LINES; int _COLS; int _TABSIZE; int _ESCDELAY; TERMINAL * _cur_term; #endif #ifdef TRACE #if BROKEN_LINKER || USE_REENTRANT long _outchars; const char * _tputs_trace; #endif #endif } NCURSES_PRESCREEN; extern NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen; extern NCURSES_EXPORT(void) _nc_free_tparm(TERMINAL*); #ifdef __cplusplus } #endif /* *INDENT-ON* */ #endif /* _TERM_PRIV_H */ ncurses-6.4-20240113/ncurses/llib-lncursestw0000644000000000000000000025745114465752603017225 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/fifo_defs.h0000644000000000000000000000671013615656212016227 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/tinfo/0000755000000000000000000000000014521530543015240 5ustar rootrootncurses-6.4-20240113/ncurses/tinfo/obsolete.c0000644000000000000000000002170414514770207017231 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/tinfo/parse_entry.c0000644000000000000000000010307714421601601017740 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* * 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.108 2023/04/24 22:32:33 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, char *src, size_t off) { if (src != 0 && off < strlen(src)) { char temp[3]; temp[0] = (char) code; temp[1] = src[off]; temp[2] = 0; _nc_safe_strcat(dst, temp); } } static void append_acs(string_desc * dst, int code, char *src) { if (VALID_STRING(src) && strlen(src) == 1) { append_acs0(dst, code, src, 0); } } /* * The ko capability, if present, consists of a comma-separated capability * list. For each capability, we may assume there is a keycap that sends the * string which is the value of that capability. */ #define DATA(from, to) { { from }, { to } } typedef struct { const char from[3]; const char to[6]; } assoc; static assoc const ko_xlate[] = { DATA("al", "kil1"), /* insert line key -> KEY_IL */ DATA("bt", "kcbt"), /* back tab -> KEY_BTAB */ DATA("cd", "ked"), /* clear-to-eos key -> KEY_EOL */ DATA("ce", "kel"), /* clear-to-eol key -> KEY_EOS */ DATA("cl", "kclr"), /* clear key -> KEY_CLEAR */ DATA("ct", "tbc"), /* clear all tabs -> KEY_CATAB */ DATA("dc", "kdch1"), /* delete char -> KEY_DC */ DATA("dl", "kdl1"), /* delete line -> KEY_DL */ DATA("do", "kcud1"), /* down key -> KEY_DOWN */ DATA("ei", "krmir"), /* exit insert key -> KEY_EIC */ DATA("ho", "khome"), /* home key -> KEY_HOME */ DATA("ic", "kich1"), /* insert char key -> KEY_IC */ DATA("im", "kIC"), /* insert-mode key -> KEY_SIC */ DATA("le", "kcub1"), /* le key -> KEY_LEFT */ DATA("nd", "kcuf1"), /* nd key -> KEY_RIGHT */ DATA("nl", "kent"), /* new line key -> KEY_ENTER */ DATA("st", "khts"), /* set-tab key -> KEY_STAB */ DATA("ta", ""), DATA("up", "kcuu1"), /* up-arrow key -> KEY_UP */ }; /* * This routine fills in string caps that either had defaults under * termcap or can be manufactured from obsolete termcap capabilities. * It was lifted from Ross Ridge's mytinfo package. */ static const char C_CR[] = "\r"; static const char C_LF[] = "\n"; static const char C_BS[] = "\b"; static const char C_HT[] = "\t"; /* * This bit of legerdemain turns all the terminfo variable names into * references to locations in the arrays Booleans, Numbers, and Strings --- * precisely what's needed. */ #undef CUR #define CUR tp-> static void postprocess_termcap(TERMTYPE2 *tp, bool has_base) { char buf[MAX_LINE * 2 + 2]; string_desc result; TR(TRACE_DATABASE, (T_CALLED("postprocess_termcap(tp=%p, has_base=%d)"), (void *) tp, has_base)); /* * TERMCAP DEFAULTS AND OBSOLETE-CAPABILITY TRANSLATIONS * * This first part of the code is the functional inverse of the * fragment in capdefaults.c. * ---------------------------------------------------------------------- */ /* if there was a tc entry, assume we picked up defaults via that */ if (!has_base) { if (WANTED(init_3string) && PRESENT(termcap_init2)) init_3string = _nc_save_str(termcap_init2); if (WANTED(reset_2string) && PRESENT(termcap_reset)) reset_2string = _nc_save_str(termcap_reset); if (WANTED(carriage_return)) { if (carriage_return_delay > 0) { _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "%s$<%d>", C_CR, carriage_return_delay); carriage_return = _nc_save_str(buf); } else carriage_return = _nc_save_str(C_CR); } if (WANTED(cursor_left)) { if (backspace_delay > 0) { _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "%s$<%d>", C_BS, backspace_delay); cursor_left = _nc_save_str(buf); } else if (backspaces_with_bs == 1) cursor_left = _nc_save_str(C_BS); else if (PRESENT(backspace_if_not_bs)) cursor_left = backspace_if_not_bs; } /* vi doesn't use "do", but it does seem to use nl (or '\n') instead */ if (WANTED(cursor_down)) { if (PRESENT(linefeed_if_not_lf)) cursor_down = linefeed_if_not_lf; else if (linefeed_is_newline != 1) { if (new_line_delay > 0) { _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "%s$<%d>", C_LF, new_line_delay); cursor_down = _nc_save_str(buf); } else cursor_down = _nc_save_str(C_LF); } } if (WANTED(scroll_forward) && crt_no_scrolling != 1) { if (PRESENT(linefeed_if_not_lf)) cursor_down = linefeed_if_not_lf; else if (linefeed_is_newline != 1) { if (new_line_delay > 0) { _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "%s$<%d>", C_LF, new_line_delay); scroll_forward = _nc_save_str(buf); } else scroll_forward = _nc_save_str(C_LF); } } if (WANTED(newline)) { if (linefeed_is_newline == 1) { if (new_line_delay > 0) { _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "%s$<%d>", C_LF, new_line_delay); newline = _nc_save_str(buf); } else newline = _nc_save_str(C_LF); } else if (PRESENT(carriage_return) && PRESENT(scroll_forward)) { _nc_str_init(&result, buf, sizeof(buf)); if (_nc_safe_strcat(&result, carriage_return) && _nc_safe_strcat(&result, scroll_forward)) newline = _nc_save_str(buf); } else if (PRESENT(carriage_return) && PRESENT(cursor_down)) { _nc_str_init(&result, buf, sizeof(buf)); if (_nc_safe_strcat(&result, carriage_return) && _nc_safe_strcat(&result, cursor_down)) newline = _nc_save_str(buf); } } } /* * Inverse of capdefaults.c code ends here. * ---------------------------------------------------------------------- * * TERMCAP-TO TERMINFO MAPPINGS FOR SOURCE TRANSLATION * * These translations will *not* be inverted by tgetent(). */ if (!has_base) { /* * We wait until now to decide if we've got a working cr because even * one that doesn't work can be used for newline. Unfortunately the * space allocated for it is wasted. */ if (return_does_clr_eol == 1 || no_correctly_working_cr == 1) carriage_return = ABSENT_STRING; /* * Supposedly most termcap entries have ta now and '\t' is no longer a * default, but it doesn't seem to be true... */ if (WANTED(tab)) { if (horizontal_tab_delay > 0) { _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "%s$<%d>", C_HT, horizontal_tab_delay); tab = _nc_save_str(buf); } else tab = _nc_save_str(C_HT); } if (init_tabs == ABSENT_NUMERIC && has_hardware_tabs == TRUE) init_tabs = 8; /* * Assume we can beep with ^G unless we're given bl@. */ if (WANTED(bell)) bell = _nc_save_str("\007"); } /* * Translate the old termcap :pt: capability to it#8 + ht=\t */ if (has_hardware_tabs == TRUE) { if (init_tabs != 8 && init_tabs != ABSENT_NUMERIC) _nc_warning("hardware tabs with a width other than 8: %d", init_tabs); else { if (PRESENT(tab) && _nc_capcmp(tab, C_HT)) _nc_warning("hardware tabs with a non-^I tab string %s", _nc_visbuf(tab)); else { if (WANTED(tab)) tab = _nc_save_str(C_HT); init_tabs = 8; } } } /* * Now translate the ko capability, if there is one. This * isn't from mytinfo... */ if (PRESENT(other_non_function_keys)) { char *base; char *bp, *cp, *dp; struct name_table_entry const *from_ptr; struct name_table_entry const *to_ptr; char buf2[MAX_TERMINFO_LENGTH]; bool foundim; /* we're going to use this for a special case later */ dp = strchr(other_non_function_keys, 'i'); foundim = (dp != 0) && (dp[1] == 'm'); /* look at each comma-separated capability in the ko string... */ for (base = other_non_function_keys; (cp = strchr(base, ',')) != 0; base = cp + 1) { size_t len = (unsigned) (cp - base); size_t n; assoc const *ap = 0; for (n = 0; n < SIZEOF(ko_xlate); ++n) { if (len == strlen(ko_xlate[n].from) && strncmp(ko_xlate[n].from, base, len) == 0) { ap = ko_xlate + n; break; } } if (ap == 0) { _nc_warning("unknown capability `%.*s' in ko string", (int) len, base); continue; } else if (ap->to[0] == '\0') /* ignore it */ continue; /* now we know we found a match in ko_table, so... */ from_ptr = _nc_find_entry(ap->from, _nc_get_hash_table(TRUE)); to_ptr = _nc_find_entry(ap->to, _nc_get_hash_table(FALSE)); if (!from_ptr || !to_ptr) /* should never happen! */ _nc_err_abort("ko translation table is invalid, I give up"); if (WANTED(tp->Strings[from_ptr->nte_index])) { _nc_warning("no value for ko capability %s", ap->from); continue; } if (tp->Strings[to_ptr->nte_index]) { const char *s = tp->Strings[from_ptr->nte_index]; const char *t = tp->Strings[to_ptr->nte_index]; /* There's no point in warning about it if it is the same * string; that's just an inefficiency. */ if (VALID_STRING(s) && VALID_STRING(t) && strcmp(s, t) != 0) _nc_warning("%s (%s) already has an explicit value %s, ignoring ko", ap->to, ap->from, t); continue; } /* * The magic moment -- copy the mapped key string over, * stripping out padding. */ bp = tp->Strings[from_ptr->nte_index]; if (VALID_STRING(bp)) { for (dp = buf2; *bp; bp++) { if (bp[0] == '$' && bp[1] == '<') { while (*bp && *bp != '>') { ++bp; } } else *dp++ = *bp; } *dp = '\0'; tp->Strings[to_ptr->nte_index] = _nc_save_str(buf2); } else { tp->Strings[to_ptr->nte_index] = bp; } } /* * Note: ko=im and ko=ic both want to grab the `Insert' * keycap. There's a kich1 but no ksmir, so the ic capability * got mapped to kich1 and im to kIC to avoid a collision. * If the description has im but not ic, hack kIC back to kich1. */ if (foundim && WANTED(key_ic) && PRESENT(key_sic)) { key_ic = key_sic; key_sic = ABSENT_STRING; } } if (!has_base) { if (!hard_copy) { if (WANTED(key_backspace)) key_backspace = _nc_save_str(C_BS); if (WANTED(key_left)) key_left = _nc_save_str(C_BS); if (WANTED(key_down)) key_down = _nc_save_str(C_LF); } } /* * Translate XENIX forms characters. */ if (PRESENT(acs_ulcorner) || PRESENT(acs_llcorner) || PRESENT(acs_urcorner) || PRESENT(acs_lrcorner) || PRESENT(acs_ltee) || PRESENT(acs_rtee) || PRESENT(acs_btee) || PRESENT(acs_ttee) || PRESENT(acs_hline) || PRESENT(acs_vline) || PRESENT(acs_plus)) { char buf2[MAX_TERMCAP_LENGTH]; _nc_str_init(&result, buf2, sizeof(buf2)); _nc_safe_strcat(&result, acs_chars); append_acs(&result, 'j', acs_lrcorner); append_acs(&result, 'k', acs_urcorner); append_acs(&result, 'l', acs_ulcorner); append_acs(&result, 'm', acs_llcorner); append_acs(&result, 'n', acs_plus); append_acs(&result, 'q', acs_hline); append_acs(&result, 't', acs_ltee); append_acs(&result, 'u', acs_rtee); append_acs(&result, 'v', acs_btee); append_acs(&result, 'w', acs_ttee); append_acs(&result, 'x', acs_vline); if (buf2[0]) { acs_chars = _nc_save_str(buf2); _nc_warning("acsc string synthesized from XENIX capabilities"); } } else if (acs_chars == ABSENT_STRING && PRESENT(enter_alt_charset_mode) && PRESENT(exit_alt_charset_mode)) { acs_chars = _nc_save_str(VT_ACSC); } returnVoidDB; } static void postprocess_terminfo(TERMTYPE2 *tp) { TR(TRACE_DATABASE, (T_CALLED("postprocess_terminfo(tp=%p)"), (void *) tp)); /* * TERMINFO-TO-TERMINFO MAPPINGS FOR SOURCE TRANSLATION * ---------------------------------------------------------------------- */ /* * Translate AIX forms characters. */ if (PRESENT(box_chars_1)) { char buf2[MAX_TERMCAP_LENGTH]; string_desc result; _nc_str_init(&result, buf2, sizeof(buf2)); _nc_safe_strcat(&result, acs_chars); append_acs0(&result, 'l', box_chars_1, 0); /* ACS_ULCORNER */ append_acs0(&result, 'q', box_chars_1, 1); /* ACS_HLINE */ append_acs0(&result, 'k', box_chars_1, 2); /* ACS_URCORNER */ append_acs0(&result, 'x', box_chars_1, 3); /* ACS_VLINE */ append_acs0(&result, 'j', box_chars_1, 4); /* ACS_LRCORNER */ append_acs0(&result, 'm', box_chars_1, 5); /* ACS_LLCORNER */ append_acs0(&result, 'w', box_chars_1, 6); /* ACS_TTEE */ append_acs0(&result, 'u', box_chars_1, 7); /* ACS_RTEE */ append_acs0(&result, 'v', box_chars_1, 8); /* ACS_BTEE */ append_acs0(&result, 't', box_chars_1, 9); /* ACS_LTEE */ append_acs0(&result, 'n', box_chars_1, 10); /* ACS_PLUS */ if (buf2[0]) { acs_chars = _nc_save_str(buf2); _nc_warning("acsc string synthesized from AIX capabilities"); box_chars_1 = ABSENT_STRING; } } /* * ---------------------------------------------------------------------- */ returnVoidDB; } /* * Do a linear search through the terminfo tables to find a given full-name. * We don't expect to do this often, so there's no hashing function. * * In effect, this scans through the 3 lists of full-names, and looks them * up in _nc_info_table, which is organized so that the nte_index fields are * sorted, but the nte_type fields are not necessarily grouped together. */ static struct name_table_entry const * lookup_fullname(const char *find) { int state = -1; for (;;) { int count = 0; NCURSES_CONST char *const *names; switch (++state) { case BOOLEAN: names = boolfnames; break; case STRING: names = strfnames; break; case NUMBER: names = numfnames; break; default: return NOTFOUND; } for (count = 0; names[count] != 0; count++) { if (!strcmp(names[count], find)) { struct name_table_entry const *entry_ptr = _nc_get_table(FALSE); while (entry_ptr->nte_type != state || entry_ptr->nte_index != count) entry_ptr++; return entry_ptr; } } } } /* parse_entry.c ends here */ ncurses-6.4-20240113/ncurses/tinfo/read_entry.c0000644000000000000000000006247214501354052017550 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* * read_entry.c -- Routine for reading in a compiled terminfo file */ #include #include #include MODULE_ID("$Id: read_entry.c,v 1.171 2023/09/16 16:30:34 tom Exp $") #define MyNumber(n) (short) LOW_MSB(n) #define SIZEOF_32BITS 4 #if NCURSES_USE_DATABASE #if NCURSES_EXT_NUMBERS static size_t convert_16bits(char *buf, NCURSES_INT2 *Numbers, int count) { int i; size_t j; size_t size = SIZEOF_SHORT; for (i = 0; i < count; i++) { unsigned mask = 0xff; unsigned char ch = 0; Numbers[i] = 0; for (j = 0; j < size; ++j) { ch = UChar(*buf++); Numbers[i] |= (ch << (8 * j)); mask <<= 8; } if (ch & 0x80) { while (mask != 0) { Numbers[i] |= (int) mask; mask <<= 8; } } TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i])); } return size; } static size_t convert_32bits(char *buf, NCURSES_INT2 *Numbers, int count) { int i; size_t j; size_t size = SIZEOF_INT2; unsigned char ch; assert(sizeof(NCURSES_INT2) == size); for (i = 0; i < count; i++) { Numbers[i] = 0; for (j = 0; j < size; ++j) { ch = UChar(*buf++); Numbers[i] |= (ch << (8 * j)); } /* "unsigned" and NCURSES_INT2 are the same size - no sign-extension */ TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i])); } return size; } #else static size_t convert_32bits(char *buf, NCURSES_INT2 *Numbers, int count) { int i, j; unsigned char ch; for (i = 0; i < count; i++) { int value = 0; for (j = 0; j < SIZEOF_32BITS; ++j) { ch = UChar(*buf++); value |= (ch << (8 * j)); } if (value == -1) Numbers[i] = ABSENT_NUMERIC; else if (value == -2) Numbers[i] = CANCELLED_NUMERIC; else if (value > MAX_OF_TYPE(NCURSES_INT2)) Numbers[i] = MAX_OF_TYPE(NCURSES_INT2); else Numbers[i] = (short) value; TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i])); } return SIZEOF_SHORT; } static size_t convert_16bits(char *buf, NCURSES_INT2 *Numbers, int count) { int i; for (i = 0; i < count; i++) { if (IS_NEG1(buf + 2 * i)) Numbers[i] = ABSENT_NUMERIC; else if (IS_NEG2(buf + 2 * i)) Numbers[i] = CANCELLED_NUMERIC; else Numbers[i] = MyNumber(buf + 2 * i); TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i])); } return SIZEOF_SHORT; } #endif static 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(char *src, int *offset, int limit, char *dst, unsigned want) { int have = (limit - *offset); if (have > 0) { if ((int) want > have) want = (unsigned) have; memcpy(dst, src + *offset, (size_t) want); *offset += (int) want; } else { want = 0; } return (int) want; } #define Read(buf, count) fake_read(buffer, &offset, limit, (char *) buf, (unsigned) count) #define read_shorts(buf, count) \ (Read(buf, (count)*SIZEOF_SHORT) == (int) (count)*SIZEOF_SHORT) #define read_numbers(buf, count) \ (Read(buf, (count)*(unsigned)size_of_numbers) == (int) (count)*size_of_numbers) #define even_boundary(value) \ if ((value) % 2 != 0) Read(buf, 1) #endif NCURSES_EXPORT(void) _nc_init_termtype(TERMTYPE2 *const tp) { unsigned i; DEBUG(2, (T_CALLED("_nc_init_termtype(tp=%p)"), (void *) tp)); #if NCURSES_XNAMES tp->num_Booleans = BOOLCOUNT; tp->num_Numbers = NUMCOUNT; tp->num_Strings = STRCOUNT; tp->ext_Booleans = 0; tp->ext_Numbers = 0; tp->ext_Strings = 0; #endif if (tp->Booleans == 0) TYPE_MALLOC(NCURSES_SBOOL, BOOLCOUNT, tp->Booleans); if (tp->Numbers == 0) TYPE_MALLOC(NCURSES_INT2, NUMCOUNT, tp->Numbers); if (tp->Strings == 0) TYPE_MALLOC(char *, STRCOUNT, tp->Strings); for_each_boolean(i, tp) tp->Booleans[i] = FALSE; for_each_number(i, tp) tp->Numbers[i] = ABSENT_NUMERIC; for_each_string(i, tp) tp->Strings[i] = ABSENT_STRING; DEBUG(2, (T_RETURN(""))); } #if NCURSES_USE_DATABASE #if NCURSES_XNAMES static bool valid_shorts(char *buffer, int limit) { bool result = FALSE; int n; for (n = 0; n < limit; ++n) { if (MyNumber(buffer + (n * 2)) > 0) { result = TRUE; break; } } return result; } #endif /* * Return TGETENT_YES if read, TGETENT_NO if not found or garbled. */ NCURSES_EXPORT(int) _nc_read_termtype(TERMTYPE2 *ptr, char *buffer, int limit) { int offset = 0; int name_size, bool_count, num_count, str_count, str_size; int i; char buf[MAX_ENTRY_SIZE + 2]; char *string_table; unsigned want, have; size_t (*convert_numbers) (char *, NCURSES_INT2 *, int); int size_of_numbers; int max_entry_size = MAX_ENTRY_SIZE; TR(TRACE_DATABASE, (T_CALLED("_nc_read_termtype(ptr=%p, buffer=%p, limit=%d)"), (void *) ptr, buffer, limit)); TR(TRACE_DATABASE, ("READ termtype header @%d", offset)); memset(ptr, 0, sizeof(*ptr)); /* grab the header */ if (!read_shorts(buf, 6) || !IS_TIC_MAGIC(buf)) { returnDB(TGETENT_NO); } #if NCURSES_EXT_NUMBERS if (LOW_MSB(buf) == MAGIC2) { convert_numbers = convert_32bits; size_of_numbers = SIZEOF_INT2; } else { max_entry_size = MAX_ENTRY_SIZE1; convert_numbers = convert_16bits; size_of_numbers = SIZEOF_SHORT; } #else if (LOW_MSB(buf) == MAGIC2) { convert_numbers = convert_32bits; size_of_numbers = SIZEOF_32BITS; } else { convert_numbers = convert_16bits; size_of_numbers = SIZEOF_INT2; } #endif /* *INDENT-EQLS* */ name_size = MyNumber(buf + 2); bool_count = MyNumber(buf + 4); num_count = MyNumber(buf + 6); str_count = MyNumber(buf + 8); str_size = MyNumber(buf + 10); TR(TRACE_DATABASE, ("TERMTYPE name_size=%d, bool=%d/%d, num=%d/%d str=%d/%d(%d)", name_size, bool_count, BOOLCOUNT, num_count, NUMCOUNT, str_count, STRCOUNT, str_size)); if (name_size < 0 || bool_count < 0 || num_count < 0 || str_count < 0 || 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) { 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 ncurses-6.4-20240113/ncurses/tinfo/lib_has_cap.c0000644000000000000000000000727013615656212017643 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/tinfo/lib_tparm.c0000644000000000000000000010155014521515551017361 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* * 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.153 2023/11/04 19:28:41 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(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 { 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 { 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))); } ncurses-6.4-20240113/ncurses/tinfo/make_keys.c0000644000000000000000000001151314107271675017365 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/ncurses/tinfo/hashed_db.c0000644000000000000000000002013013615656212017306 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/tinfo/comp_expand.c0000644000000000000000000001622514423031632017703 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/tinfo/write_entry.c0000644000000000000000000006070414501353664017773 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* * write_entry.c -- write a terminfo structure onto the file system */ #include #include #include MODULE_ID("$Id: write_entry.c,v 1.131 2023/09/16 16:28:36 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)]; char dir[sizeof(LEAF_FMT)]; char *s = 0; if (code == 0 || (s = (strchr) (dirnames, code)) == 0) { _nc_err_abort("Illegal terminfo subdirectory \"" LEAF_FMT "\"", code); } else if (!verified[s - dirnames]) { _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 { if ((strlen(top) + strlen(src) + 6) <= limit) { _nc_SPRINTF(dst, _nc_SLIMIT(limit) "%s/%s", top, src); rc = 0; } } #if USE_HASHED_DB if (rc == 0) { static const char suffix[] = DBM_SUFFIX; size_t have = strlen(dst); size_t need = strlen(suffix); if (have > need && strcmp(dst + (int) (have - need), suffix)) { if (have + need <= limit) { _nc_STRCAT(dst, suffix, limit); } else { rc = -1; } } else if (_nc_is_dir_path(dst)) { rc = -1; } } #endif return rc; } /* * Make a database-root if it doesn't exist. */ static int make_db_root(const char *path) { int rc; char fullpath[PATH_MAX]; if ((rc = make_db_path(fullpath, path, sizeof(fullpath))) == 0) { #if USE_HASHED_DB DB *capdbp; if ((capdbp = _nc_db_open(fullpath, TRUE)) == NULL) { rc = -1; } else if (_nc_db_close(capdbp) < 0) { rc = -1; } #else struct stat statbuf; if ((rc = stat(path, &statbuf)) == -1) { rc = mkdir(path #ifndef _NC_WINDOWS ,0777 #endif ); } else if (_nc_access(path, R_OK | W_OK | X_OK) < 0) { rc = -1; /* permission denied */ } else if (!(S_ISDIR(statbuf.st_mode))) { rc = -1; /* not a directory */ } #endif } return rc; } /* * Set the write directory for compiled entries. */ NCURSES_EXPORT(void) _nc_set_writedir(const char *dir) { const char *destination; char actual[PATH_MAX]; 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 += data.size; total_parts++; _nc_db_put(capdb, &key, &data); while (*other_names != '\0') { ptr = other_names++; assert(ptr < buffer + sizeof(buffer) - 1); while (*other_names != '|' && *other_names != '\0') other_names++; if (*other_names != '\0') *(other_names++) = '\0'; key.data = ptr; key.size = strlen(ptr); total_size += data.size; total_parts++; _nc_db_put(capdb, &key, &data); } } } #else /* !USE_HASHED_DB */ if (call_count++ == 0) { start_time = 0; } if (strlen(first_name) >= limit2) { _nc_warning("terminal name too long."); saved = first_name[limit2]; first_name[limit2] = '\0'; } _nc_SPRINTF(filename, _nc_SLIMIT(sizeof(filename)) LEAF_FMT "/%.*s", UChar(first_name[0]), (int) (sizeof(filename) - (LEAF_LEN + 2)), first_name); if (saved) first_name[limit2] = saved; /* * Has this primary name been written since the first call to * write_entry()? If so, the newer write will step on the older, * so warn the user. */ if (start_time > 0 && stat(filename, &statbuf) >= 0 && statbuf.st_mtime >= start_time) { #if HAVE_LINK && !USE_SYMLINKS /* * If the file has more than one link, the reason for the previous * write could be that the current primary name used to be an alias for * the previous entry. In that case, unlink the file so that we will * not modify the previous entry as we write this one. */ if (statbuf.st_nlink > 1) { _nc_warning("name redefined."); unlink(filename); } else { _nc_warning("name multiply defined."); } #else _nc_warning("name multiply defined."); #endif } check_writeable(first_name[0]); write_file(filename, tp); if (start_time == 0) { if (stat(filename, &statbuf) == -1 || (start_time = statbuf.st_mtime) == 0) { _nc_syserr_abort("error obtaining time from %s/%s", _nc_tic_dir(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, char *src, size_t want, size_t size) { size_t have = (limit - *offset); want *= size; if (have > 0) { if (want > have) want = have; memcpy(dst + *offset, src, want); *offset += (unsigned) want; } else { want = 0; } return (want / size); } #define Write(buf, size, count) fake_write(buffer, offset, (size_t) limit, (char *) buf, (size_t) count, (size_t) size) #undef LITTLE_ENDIAN /* BSD/OS defines this as a feature macro */ #define HI(x) ((x) / 256) #define LO(x) ((x) % 256) #define LITTLE_ENDIAN(p, x) (p)[0] = (unsigned char)LO(x), \ (p)[1] = (unsigned char)HI(x) #define WRITE_STRING(str) (Write(str, sizeof(char), strlen(str) + 1) == strlen(str) + 1) static int compute_offsets(char **Strings, size_t strmax, short *offsets) { int nextfree = 0; size_t i; for (i = 0; i < strmax; i++) { if (Strings[i] == ABSENT_STRING) { offsets[i] = -1; } else if (Strings[i] == CANCELLED_STRING) { offsets[i] = -2; } else { offsets[i] = (short) nextfree; nextfree += (int) strlen(Strings[i]) + 1; TRACE_OUT(("put Strings[%d]=%s(%d)", (int) i, _nc_visbuf(Strings[i]), (int) nextfree)); } } return nextfree; } static size_t convert_shorts(unsigned char *buf, short *Numbers, size_t count) { size_t i; for (i = 0; i < count; i++) { if (Numbers[i] == ABSENT_NUMERIC) { /* HI/LO won't work */ buf[2 * i] = buf[2 * i + 1] = 0377; } else if (Numbers[i] == CANCELLED_NUMERIC) { /* HI/LO won't work */ buf[2 * i] = 0376; buf[2 * i + 1] = 0377; } else { LITTLE_ENDIAN(buf + 2 * i, Numbers[i]); TRACE_OUT(("put Numbers[%u]=%d", (unsigned) i, Numbers[i])); } } return SIZEOF_SHORT; } #if NCURSES_EXT_NUMBERS static size_t convert_16bit(unsigned char *buf, NCURSES_INT2 *Numbers, size_t count) { size_t i, j; size_t size = SIZEOF_SHORT; for (i = 0; i < count; i++) { unsigned value = (unsigned) Numbers[i]; TRACE_NUM(i); for (j = 0; j < size; ++j) { *buf++ = value & 0xff; value >>= 8; } } return size; } static size_t convert_32bit(unsigned char *buf, NCURSES_INT2 *Numbers, size_t count) { size_t i, j; size_t size = SIZEOF_INT2; for (i = 0; i < count; i++) { unsigned value = (unsigned) Numbers[i]; TRACE_NUM(i); for (j = 0; j < size; ++j) { *buf++ = value & 0xff; value >>= 8; } } return size; } #endif #define even_boundary(value) \ ((value) % 2 != 0 && Write(&zero, sizeof(char), 1) != 1) #if NCURSES_XNAMES static unsigned extended_Booleans(TERMTYPE2 *tp) { unsigned result = 0; unsigned i; for (i = 0; i < tp->ext_Booleans; ++i) { if (tp->Booleans[BOOLCOUNT + i] == TRUE) result = (i + 1); } return result; } static unsigned extended_Numbers(TERMTYPE2 *tp) { unsigned result = 0; unsigned i; for (i = 0; i < tp->ext_Numbers; ++i) { if (tp->Numbers[NUMCOUNT + i] != ABSENT_NUMERIC) result = (i + 1); } return result; } static unsigned extended_Strings(TERMTYPE2 *tp) { unsigned short result = 0; unsigned short i; for (i = 0; i < tp->ext_Strings; ++i) { if (tp->Strings[STRCOUNT + i] != ABSENT_STRING) result = (unsigned short) (i + 1); } return result; } /* * _nc_align_termtype() will extend entries that are referenced in a use= * clause - discard the unneeded data. */ static bool extended_object(TERMTYPE2 *tp) { bool result = FALSE; if (_nc_user_definable) { result = ((extended_Booleans(tp) + extended_Numbers(tp) + extended_Strings(tp)) != 0); } return result; } #endif NCURSES_EXPORT(int) _nc_write_object(TERMTYPE2 *tp, char *buffer, unsigned *offset, unsigned limit) { char *namelist; size_t namelen, boolmax, nummax, strmax, numlen; char zero = '\0'; size_t i; int nextfree; short offsets[MAX_ENTRY_SIZE / 2]; unsigned char buf[MAX_ENTRY_SIZE]; unsigned last_bool = BOOLWRITE; unsigned last_num = NUMWRITE; unsigned last_str = STRWRITE; #if NCURSES_EXT_NUMBERS bool need_ints = FALSE; size_t (*convert_numbers) (unsigned char *, NCURSES_INT2 *, size_t); #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; } ncurses-6.4-20240113/ncurses/tinfo/getenv_num.c0000644000000000000000000000633613615656212017570 0ustar rootroot/**************************************************************************** * Copyright 2018,2020 Thomas E. Dickey * * Copyright 1998-2012,2013 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey 1998 * ****************************************************************************/ /* * getenv_num.c -- obtain a number from the environment */ #include MODULE_ID("$Id: getenv_num.c,v 1.8 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) _nc_getenv_num(const char *name) { char *dst = 0; char *src = getenv(name); long value; if ((src == 0) || (value = strtol(src, &dst, 0)) < 0 || (dst == src) || (*dst != '\0') || (int) value < value) value = -1; return (int) value; } NCURSES_EXPORT(void) _nc_setenv_num(const char *name, int value) { if (name != 0 && value >= 0) { char buffer[128]; #if HAVE_SETENV _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%d", value); setenv(name, buffer, 1); #elif HAVE_PUTENV char *s; _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%s=%d", name, value); if ((s = strdup(buffer)) != 0) putenv(s); #else #error expected setenv/putenv functions #endif } } ncurses-6.4-20240113/ncurses/tinfo/MKfallback.sh0000755000000000000000000001060314420774571017577 0ustar rootroot#!/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 ncurses-6.4-20240113/ncurses/tinfo/lib_acs.c0000644000000000000000000003162513615656212017014 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/tinfo/name_match.c0000644000000000000000000001032513615656212017506 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/ncurses/tinfo/lib_ti.c0000644000000000000000000001312213615656212016652 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/tinfo/MKcaptab.awk0000644000000000000000000000740113615656212017435 0ustar rootroot############################################################################## # 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: ncurses-6.4-20240113/ncurses/tinfo/lib_termcap.c0000644000000000000000000003064614434462126017702 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,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 * * * * 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.89 2023/05/27 20:13:10 tom Exp $") NCURSES_EXPORT_VAR(char *) UP = 0; NCURSES_EXPORT_VAR(char *) BC = 0; #define MyCache _nc_globals.tgetent_cache #define CacheInx _nc_globals.tgetent_index #define CacheSeq _nc_globals.tgetent_sequence #define FIX_SGR0 MyCache[CacheInx].fix_sgr0 #define LAST_TRM MyCache[CacheInx].last_term #define LAST_BUF MyCache[CacheInx].last_bufp #define LAST_USE MyCache[CacheInx].last_used #define LAST_SEQ MyCache[CacheInx].sequence /* * Termcap names are matched only using the first two bytes. * Ignore any extended names longer than two bytes, to avoid problems * with legacy code which passes in parameters whose use is long forgotten. */ #define ValidCap(cap) (((cap)[0] != '\0') && ((cap)[1] != '\0')) #define SameCap(a,b) (((a)[0] == (b)[0]) && ((a)[1] == (b)[1])) #define ValidExt(ext) (ValidCap(ext) && (ext)[2] == '\0') /*************************************************************************** * * tgetent(bufp, term) * * In termcap, this function reads in the entry for terminal `term' into the * buffer pointed to by bufp. It must be called before any of the functions * below are called. * In this terminfo emulation, tgetent() simply calls setupterm() (which * does a bit more than tgetent() in termcap does), and returns its return * value (1 if successful, 0 if no terminal with the given name could be * found, or -1 if no terminal descriptions have been installed on the * system). The bufp argument is ignored. * ***************************************************************************/ NCURSES_EXPORT(int) NCURSES_SP_NAME(tgetent) (NCURSES_SP_DCLx char *bufp, const char *name) { int rc = ERR; int n; bool found_cache = FALSE; #ifdef USE_TERM_DRIVER TERMINAL *termp = 0; #endif START_TRACE(); T((T_CALLED("tgetent()"))); TINFO_SETUP_TERM(&termp, name, STDOUT_FILENO, &rc, TRUE); #ifdef USE_TERM_DRIVER if (termp == 0 || !((TERMINAL_CONTROL_BLOCK *) termp)->drv->isTerminfo) returnCode(rc); #endif /* * In general we cannot tell if the fixed sgr0 is still used by the * caller, but if tgetent() is called with the same buffer, that is * good enough, since the previous data would be invalidated by the * current call. * * bufp may be a null pointer, e.g., GNU termcap. That allocates data, * which is good until the next tgetent() call. The conventional termcap * is inconvenient because of the fixed buffer size, but because it uses * caller-supplied buffers, can have multiple terminal descriptions in * use at a given time. */ for (n = 0; n < TGETENT_MAX; ++n) { bool same_result = (MyCache[n].last_used && MyCache[n].last_bufp == bufp); if (same_result) { CacheInx = n; if (FIX_SGR0 != 0) { FreeAndNull(FIX_SGR0); } /* * Also free the terminfo data that we loaded (much bigger leak). */ if (LAST_TRM != 0 && LAST_TRM != TerminalOf(SP_PARM)) { TERMINAL *trm = LAST_TRM; NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx LAST_TRM); for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) if (LAST_TRM == trm) LAST_TRM = 0; CacheInx = n; } found_cache = TRUE; break; } } if (!found_cache) { int best = 0; for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) { if (LAST_SEQ < MyCache[best].sequence) { best = CacheInx; } } CacheInx = best; } if (rc == 1) { LAST_TRM = TerminalOf(SP_PARM); LAST_SEQ = ++CacheSeq; } else { LAST_TRM = 0; } PC = 0; UP = 0; BC = 0; FIX_SGR0 = 0; /* don't free it - application may still use */ if (rc == 1) { if (cursor_left) if ((backspaces_with_bs = (char) !strcmp(cursor_left, "\b")) == 0) backspace_if_not_bs = cursor_left; /* we're required to export these */ if (pad_char != NULL) PC = pad_char[0]; if (cursor_up != NULL) UP = cursor_up; if (backspace_if_not_bs != NULL) BC = backspace_if_not_bs; if ((FIX_SGR0 = _nc_trim_sgr0(&TerminalType(TerminalOf(SP_PARM)))) != 0) { if (!strcmp(FIX_SGR0, exit_attribute_mode)) { if (FIX_SGR0 != exit_attribute_mode) { free(FIX_SGR0); } FIX_SGR0 = 0; } } LAST_BUF = bufp; LAST_USE = TRUE; SetNoPadding(SP_PARM); (void) NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG); /* sets ospeed as a side-effect */ /* LINT_PREPRO #if 0*/ #include /* 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 ncurses-6.4-20240113/ncurses/tinfo/home_terminfo.c0000644000000000000000000000611013615656212020242 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 1998-2012,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey * ****************************************************************************/ /* * home_terminfo.c -- return the $HOME/.terminfo string, expanded */ #include #include MODULE_ID("$Id: home_terminfo.c,v 1.17 2020/02/02 23:34:34 tom Exp $") /* ncurses extension...fall back on user's private directory */ #define MyBuffer _nc_globals.home_terminfo NCURSES_EXPORT(char *) _nc_home_terminfo(void) { char *result = 0; #if USE_HOME_TERMINFO if (use_terminfo_vars()) { if (MyBuffer == 0) { char *home; if ((home = getenv("HOME")) != 0) { size_t want = (strlen(home) + sizeof(PRIVATE_INFO)); TYPE_MALLOC(char, want, MyBuffer); _nc_SPRINTF(MyBuffer, _nc_SLIMIT(want) PRIVATE_INFO, home); } } result = MyBuffer; } #endif return result; } ncurses-6.4-20240113/ncurses/tinfo/MKcodes.awk0000644000000000000000000001422713615656212017304 0ustar rootroot############################################################################## # 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 */" } ncurses-6.4-20240113/ncurses/tinfo/lib_setup.c0000644000000000000000000007222314521530543017400 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* * 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.230 2023/11/04 21:02:27 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(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 ignore; 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(("response %s", _nc_visbuf(buf))); if (sscanf(skip_csi(buf), "%d;%d%c", &y, &x, &ignore) != 2 || (ignore != 'R' && ignore != ';')) { *row = y; *col = x; result = TRUE; } } T(("get_position %d,%d", *row, *col)); return result; } static bool set_position(TERMINAL *termp, int fd, int row, int col) { bool result = FALSE; char *actual = TIPARM_2(cursor_address, row, col); T(("set_position %d,%d", row, col)); if (actual != NULL) { size_t want = strlen(actual); int have = (int) write(fd, actual, want); /* FIXME - padding */ result = ((int) want == have); } return result; } /* * This is a little more complicated than one might expect, because we do this * before setting up the terminal modes, etc. */ static void _nc_check_screensize(TERMINAL *termp, int *linep, int *colp) { int fd = fileno(stderr); TTY saved; if (NC_ISATTY(fd) && VALID_STRING(cursor_address) && is_expected(user7, "6n") && is_expected(user6, "%i%d;%dR") && GET_TTY(fd, &saved) == OK) { int current_y, current_x; int updated_y, updated_x; TTY alter = saved; 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(termp, fd, 9999, 9999) && get_position(termp, fd, &updated_y, &updated_x)) { *linep = updated_y; *colp = updated_x; set_position(termp, fd, current_y, current_x); } /* restore tty modes */ SET_TTY(fd, &saved); } _nc_default_screensize(termp, linep, colp); } #else /* !USE_CHECK_SIZE */ #define _nc_check_screensize(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; #ifdef EXP_WIN32_DRIVER /* If we are here, then Windows console is used in terminfo mode. We need to figure out the size using the console API */ _nc_console_size(linep, colp); T(("screen size: winconsole lines = %d columns = %d", *linep, *colp)); #else /* figure out the size of the screen */ T(("screen size: terminfo lines = %d columns = %d", lines, columns)); *linep = (int) lines; *colp = (int) columns; #endif #if NCURSES_SP_FUNCS if (sp) { useEnv = sp->_use_env; useTioctl = sp->use_tioctl; } #endif if (useEnv || useTioctl) { #ifdef __EMX__ { int screendata[2]; _scrsize(screendata); *colp = screendata[0]; *linep = ((sp != 0 && sp->_filtered) ? 1 : screendata[1]); T(("EMX screen size: environment LINES = %d COLUMNS = %d", *linep, *colp)); } #endif #if HAVE_SIZECHANGE /* try asking the OS */ if (NC_ISATTY(cur_term->Filedes)) { STRUCT_WINSIZE size; errno = 0; do { if (ioctl(cur_term->Filedes, IOCTL_WINSIZE, &size) >= 0) { *linep = ((sp != 0 && sp->_filtered) ? 1 : WINSIZE_ROWS(size)); *colp = WINSIZE_COLS(size); T(("SYS screen size: environment LINES = %d COLUMNS = %d", *linep, *colp)); break; } } while (errno == EINTR); } #endif /* HAVE_SIZECHANGE */ if (useEnv) { int value; if (useTioctl) { /* * If environment variables are used, update them. */ if ((sp == 0 || !sp->_filtered) && _nc_getenv_num("LINES") > 0) { _nc_setenv_num("LINES", *linep); } if (_nc_getenv_num("COLUMNS") > 0) { _nc_setenv_num("COLUMNS", *colp); } } /* * Finally, look for environment variables. * * Solaris lets users override either dimension with an environment * variable. */ if ((value = _nc_getenv_num("LINES")) > 0) { *linep = value; T(("screen size: environment LINES = %d", *linep)); } if ((value = _nc_getenv_num("COLUMNS")) > 0) { *colp = value; T(("screen size: environment COLUMNS = %d", *colp)); } _nc_default_screensize(termp, linep, colp); } else { _nc_check_screensize(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(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)); #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) { int result = 0; #if defined(_NC_WINDOWS) && USE_WIDEC_SUPPORT result = 1; #elif HAVE_LANGINFO_CODESET char *env = nl_langinfo(CODESET); result = !strcmp(env, "UTF-8"); T(("_nc_unicode_locale(%s) ->%d", env, result)); #else char *env = _nc_get_locale(); if (env != 0) { if (strstr(env, ".UTF-8") != 0) { result = 1; T(("_nc_unicode_locale(%s) ->%d", env, result)); } } #endif return result; } #define CONTROL_N(s) ((s) != 0 && strstr(s, "\016") != 0) #define CONTROL_O(s) ((s) != 0 && strstr(s, "\017") != 0) /* * Check for known broken cases where a UTF-8 locale breaks the alternate * character set. */ NCURSES_EXPORT(int) _nc_locale_breaks_acs(TERMINAL *termp) { const char *env_name = "NCURSES_NO_UTF8_ACS"; const char *env; int value; int result = 0; T((T_CALLED("_nc_locale_breaks_acs:%d"), result)); if (getenv(env_name) != 0) { result = _nc_getenv_num(env_name); } else if ((value = tigetnum("U8")) >= 0) { result = value; /* use extension feature */ } else if ((env = getenv("TERM")) != 0) { if (strstr(env, "linux")) { result = 1; /* always broken */ } else if (strstr(env, "screen") != 0 && ((env = getenv("TERMCAP")) != 0 && strstr(env, "screen") != 0) && strstr(env, "hhII00") != 0) { if (CONTROL_N(enter_alt_charset_mode) || CONTROL_O(enter_alt_charset_mode) || CONTROL_N(set_attributes) || CONTROL_O(set_attributes)) { result = 1; } } } returnCode(result); } NCURSES_EXPORT(int) TINFO_SETUP_TERM(TERMINAL **tp, const char *tname, int Filedes, int *errret, int reuse) { #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *TCB = 0; #endif TERMINAL *termp; SCREEN *sp = 0; char *myname; int code = ERR; START_TRACE(); #ifdef USE_TERM_DRIVER T((T_CALLED("_nc_setupterm_ex(%p,%s,%d,%p)"), (void *) tp, _nc_visbuf(tname), Filedes, (void *) errret)); if (tp == 0) { ret_error0(TGETENT_ERR, "Invalid parameter, internal error.\n"); } else termp = *tp; #else termp = cur_term; T((T_CALLED("setupterm(%s,%d,%p)"), _nc_visbuf(tname), Filedes, (void *) errret)); #endif if (tname == 0) { tname = getenv("TERM"); #if defined(EXP_WIN32_DRIVER) if (!VALID_TERM_ENV(tname, NO_TERMINAL)) { T(("Failure with TERM=%s", NonNull(tname))); ret_error0(TGETENT_ERR, "TERM environment variable not set.\n"); } #elif defined(USE_TERM_DRIVER) if (!NonEmpty(tname)) tname = "unknown"; #else if (!NonEmpty(tname)) { T(("Failure with TERM=%s", NonNull(tname))); ret_error0(TGETENT_ERR, "TERM environment variable not set.\n"); } #endif } myname = strdup(tname); if (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); } ncurses-6.4-20240113/ncurses/tinfo/comp_error.c0000644000000000000000000001250114442672026017557 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/tinfo/db_iterator.c0000644000000000000000000002745214445662640017725 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* * Iterators for terminal databases. */ #include #include #include #if USE_HASHED_DB #include #endif MODULE_ID("$Id: db_iterator.c,v 1.50 2023/06/24 21:52:32 tom Exp $") #define HaveTicDirectory _nc_globals.have_tic_directory #define KeepTicDirectory _nc_globals.keep_tic_directory #define TicDirectory _nc_globals.tic_directory #define my_blob _nc_globals.dbd_blob #define my_list _nc_globals.dbd_list #define my_size _nc_globals.dbd_size #define my_time _nc_globals.dbd_time #define my_vars _nc_globals.dbd_vars static void add_to_blob(const char *text, size_t limit) { (void) limit; if (*text != '\0') { char *last = my_blob + strlen(my_blob); if (last != my_blob) *last++ = NCURSES_PATHSEP; _nc_STRCPY(last, text, limit); } } static bool check_existence(const char *name, struct stat *sb) { bool result = FALSE; if (quick_prefix(name)) { result = TRUE; } else if (stat(name, sb) == 0 && (S_ISDIR(sb->st_mode) || (S_ISREG(sb->st_mode) && sb->st_size))) { result = TRUE; } #if USE_HASHED_DB else if (strlen(name) < PATH_MAX - sizeof(DBM_SUFFIX)) { char temp[PATH_MAX]; _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%s%s", name, DBM_SUFFIX); if (stat(temp, sb) == 0 && S_ISREG(sb->st_mode) && sb->st_size) { result = TRUE; } } #endif return result; } /* * Trim newlines (and backslashes preceding those) and tab characters to * help simplify scripting of the quick-dump feature. Leave spaces and * other backslashes alone. */ static void trim_formatting(char *source) { char *target = source; char ch; while ((ch = *source++) != '\0') { if (ch == '\\' && *source == '\n') continue; if (ch == '\n' || ch == '\t') continue; *target++ = ch; } *target = '\0'; } /* * Store the latest value of an environment variable in my_vars[] so we can * detect if one changes, invalidating the cached search-list. */ static bool update_getenv(const char *name, DBDIRS which) { bool result = FALSE; if (which < dbdLAST) { char *value; char *cached_value = my_vars[which].value; bool same_value; if ((value = getenv(name)) != 0) { value = strdup(value); } same_value = ((value == 0 && cached_value == 0) || (value != 0 && cached_value != 0 && strcmp(value, cached_value) == 0)); /* Set variable name to enable checks in cache_expired(). */ my_vars[which].name = name; if (!same_value) { FreeIfNeeded(my_vars[which].value); my_vars[which].value = value; result = TRUE; } else { free(value); } } return result; } #if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP static char * cache_getenv(const char *name, DBDIRS which) { char *result = 0; (void) update_getenv(name, which); if (which < dbdLAST) { result = my_vars[which].value; } return result; } #endif /* * The cache expires if at least a second has passed since the initial lookup, * or if one of the environment variables changed. * * Only a few applications use multiple lookups of terminal entries, seems that * aside from bulk I/O such as tic and toe, that leaves interactive programs * which should not be modifying the terminal databases in a way that would * invalidate the search-list. * * The "1-second" is to allow for user-directed changes outside the program. */ static bool cache_expired(void) { bool result = FALSE; time_t now = time((time_t *) 0); if (now > my_time) { result = TRUE; } else { DBDIRS n; for (n = (DBDIRS) 0; n < dbdLAST; ++n) { if (my_vars[n].name != 0 && update_getenv(my_vars[n].name, n)) { result = TRUE; break; } } } return result; } static void free_cache(void) { FreeAndNull(my_blob); FreeAndNull(my_list); } static void update_tic_dir(const char *update) { free((char *) TicDirectory); TicDirectory = update; } /* * Record the "official" location of the terminfo directory, according to * the place where we're writing to, or the normal default, if not. */ NCURSES_EXPORT(const char *) _nc_tic_dir(const char *path) { T(("_nc_tic_dir %s", NonNull(path))); if (!KeepTicDirectory) { if (path != NULL) { if (path != TicDirectory) update_tic_dir(strdup(path)); HaveTicDirectory = TRUE; } else if (HaveTicDirectory == 0) { if (use_terminfo_vars()) { const char *envp; if ((envp = getenv("TERMINFO")) != 0) return _nc_tic_dir(envp); } } } return TicDirectory ? TicDirectory : TERMINFO; } /* * Special fix to prevent the terminfo directory from being moved after tic * has chdir'd to it. If we let it be changed, then if $TERMINFO has a * relative path, we'll lose track of the actual directory. */ NCURSES_EXPORT(void) _nc_keep_tic_dir(const char *path) { _nc_tic_dir(path); KeepTicDirectory = TRUE; } /* * Cleanup. */ NCURSES_EXPORT(void) _nc_last_db(void) { if (my_blob != 0 && cache_expired()) { free_cache(); } } /* * This is a simple iterator which allows the caller to step through the * possible locations for a terminfo directory. ncurses uses this to find * terminfo files to read. */ NCURSES_EXPORT(const char *) _nc_next_db(DBDIRS * state, int *offset) { const char *result; (void) offset; if ((int) *state < my_size && my_list != 0 && my_list[*state] != 0) { result = my_list[*state]; (*state)++; } else { result = 0; } if (result != 0) { T(("_nc_next_db %d %s", *state, result)); } return result; } NCURSES_EXPORT(void) _nc_first_db(DBDIRS * state, int *offset) { bool cache_has_expired = FALSE; *state = dbdTIC; *offset = 0; T((T_CALLED("_nc_first_db"))); /* build a blob containing all of the strings we will use for a lookup * table. */ if (my_blob == 0 || (cache_has_expired = cache_expired())) { size_t blobsize = 0; const char *values[dbdLAST]; struct stat *my_stat; int j; if (cache_has_expired) free_cache(); for (j = 0; j < dbdLAST; ++j) values[j] = 0; /* * This is the first item in the list, and is used only when tic is * writing to the database, as a performance improvement. */ values[dbdTIC] = TicDirectory; #if NCURSES_USE_DATABASE #ifdef TERMINFO_DIRS values[dbdCfgList] = TERMINFO_DIRS; #endif #ifdef TERMINFO values[dbdCfgOnce] = TERMINFO; #endif #endif #if NCURSES_USE_TERMCAP values[dbdCfgList2] = TERMPATH; #endif if (use_terminfo_vars()) { #if NCURSES_USE_DATABASE values[dbdEnvOnce] = cache_getenv("TERMINFO", dbdEnvOnce); values[dbdHome] = _nc_home_terminfo(); (void) cache_getenv("HOME", dbdHome); values[dbdEnvList] = cache_getenv("TERMINFO_DIRS", dbdEnvList); #endif #if NCURSES_USE_TERMCAP values[dbdEnvOnce2] = cache_getenv("TERMCAP", dbdEnvOnce2); /* only use $TERMCAP if it is an absolute path */ if (values[dbdEnvOnce2] != 0 && *values[dbdEnvOnce2] != '/') { values[dbdEnvOnce2] = 0; } values[dbdEnvList2] = cache_getenv("TERMPATH", dbdEnvList2); #endif /* NCURSES_USE_TERMCAP */ } for (j = 0; j < dbdLAST; ++j) { if (values[j] == 0) values[j] = ""; blobsize += 2 + strlen(values[j]); } my_blob = malloc(blobsize); if (my_blob != 0) { *my_blob = '\0'; for (j = 0; j < dbdLAST; ++j) { add_to_blob(values[j], blobsize); } /* Now, build an array which will be pointers to the distinct * strings in the blob. */ blobsize = 2; for (j = 0; my_blob[j] != '\0'; ++j) { if (my_blob[j] == NCURSES_PATHSEP) ++blobsize; } my_list = typeCalloc(char *, blobsize); my_stat = typeCalloc(struct stat, blobsize); if (my_list != 0 && my_stat != 0) { int k = 0; my_list[k++] = my_blob; for (j = 0; my_blob[j] != '\0'; ++j) { if (my_blob[j] == NCURSES_PATHSEP && ((&my_blob[j] - my_list[k - 1]) != 3 || !quick_prefix(my_list[k - 1]))) { my_blob[j] = '\0'; my_list[k++] = &my_blob[j + 1]; } } /* * Eliminate duplicates from the list. */ for (j = 0; my_list[j] != 0; ++j) { #ifdef TERMINFO if (*my_list[j] == '\0') { 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 ncurses-6.4-20240113/ncurses/tinfo/MKuserdefs.sh0000755000000000000000000001100713615656212017653 0ustar rootroot#!/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 < 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 ncurses-6.4-20240113/ncurses/tinfo/read_termcap.c0000644000000000000000000010263514445662714020054 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/tinfo/init_keytry.c0000644000000000000000000000772714501322645017773 0ustar rootroot/**************************************************************************** * Copyright 2020,2023 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.20 2023/09/16 12:55:01 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); 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 } } ncurses-6.4-20240113/ncurses/tinfo/free_ttype.c0000644000000000000000000000744714420774571017577 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/tinfo/lib_tputs.c0000644000000000000000000002756414501351073017424 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* * 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.111 2023/09/16 16:05:15 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")); fflush(stdout); } } else { TR(TRACE_CHARPUT, ("flushing stdout")); fflush(stdout); } if (SP_PARM != 0) SP_PARM->out_inuse = 0; returnVoid; } #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) _nc_flush(void) { NCURSES_SP_NAME(_nc_flush) (CURRENT_SCREEN); } #endif NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_outch) (NCURSES_SP_DCLx int ch) { int rc = OK; COUNT_OUTCHARS(1); if (HasTInfoTerminal(SP_PARM) && SP_PARM != 0) { if (SP_PARM->out_buffer != 0) { if (SP_PARM->out_inuse + 1 >= SP_PARM->out_limit) NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); SP_PARM->out_buffer[SP_PARM->out_inuse++] = (char) ch; } else { char tmp = (char) ch; /* * POSIX says write() is safe in a signal handler, but the * buffered I/O is not. */ if (write(fileno(NC_OUTPUT(SP_PARM)), &tmp, (size_t) 1) == -1) rc = ERR; } } else { char tmp = (char) ch; if (write(fileno(stdout), &tmp, (size_t) 1) == -1) rc = ERR; } return rc; } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) _nc_outch(int ch) { return NCURSES_SP_NAME(_nc_outch) (CURRENT_SCREEN, ch); } #endif /* * This is used for the putp special case. */ NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_putchar) (NCURSES_SP_DCLx int ch) { (void) SP_PARM; return putchar(ch); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) _nc_putchar(int ch) { return putchar(ch); } #endif /* * putp is special - per documentation it calls tputs with putchar as the * parameter for outputting characters. This means that it uses stdio, which * is not signal-safe. Applications call this entrypoint; we do not call it * from within the library. */ NCURSES_EXPORT(int) NCURSES_SP_NAME(putp) (NCURSES_SP_DCLx const char *string) { return NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx string, 1, NCURSES_SP_NAME(_nc_putchar)); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) putp(const char *string) { return NCURSES_SP_NAME(putp) (CURRENT_SCREEN, string); } #endif /* * Use these entrypoints rather than "putp" within the library. */ NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_DCLx const char *name GCC_UNUSED, const char *string) { int rc = ERR; if (string != 0) { TPUTS_TRACE(name); rc = NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx string, 1, NCURSES_SP_NAME(_nc_outch)); } return rc; } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) _nc_putp(const char *name, const char *string) { return NCURSES_SP_NAME(_nc_putp) (CURRENT_SCREEN, name, string); } #endif NCURSES_EXPORT(int) NCURSES_SP_NAME(tputs) (NCURSES_SP_DCLx const char *string, int affcnt, NCURSES_SP_OUTC outc) { NCURSES_SP_OUTC my_outch = GetOutCh(); bool always_delay = FALSE; bool normal_delay = FALSE; int number; #if BSD_TPUTS int trailpad; #endif /* BSD_TPUTS */ #ifdef TRACE if (USE_TRACEF(TRACE_TPUTS)) { char addrbuf[32]; TR_FUNC_BFR(1); if (outc == NCURSES_SP_NAME(_nc_outch)) { _nc_STRCPY(addrbuf, "_nc_outch", sizeof(addrbuf)); } else { _nc_SPRINTF(addrbuf, _nc_SLIMIT(sizeof(addrbuf)) "%s", TR_FUNC_ARG(0, outc)); } if (_nc_tputs_trace) { _tracef("tputs(%s = %s, %d, %s) called", _nc_tputs_trace, _nc_visbuf(string), affcnt, addrbuf); } else { _tracef("tputs(%s, %d, %s) called", _nc_visbuf(string), affcnt, addrbuf); } TPUTS_TRACE(NULL); _nc_unlock_global(tracef); } #endif /* TRACE */ if (!VALID_STRING(string)) return ERR; if (SP_PARM != 0 && HasTInfoTerminal(SP_PARM)) { if ( #if NCURSES_SP_FUNCS (SP_PARM != 0 && SP_PARM->_term == 0) #else cur_term == 0 #endif ) { always_delay = FALSE; normal_delay = TRUE; } else { always_delay = (string == bell) || (string == flash_screen); normal_delay = !xon_xoff && padding_baud_rate #if NCURSES_NO_PADDING && !GetNoPadding(SP_PARM) #endif && (_nc_baudrate(ospeed) >= padding_baud_rate); } } #if BSD_TPUTS /* * This ugly kluge deals with the fact that some ancient BSD programs * (like nethack) actually do the likes of tputs("50") to get delays. */ trailpad = 0; if (isdigit(UChar(*string))) { while (isdigit(UChar(*string))) { trailpad = trailpad * 10 + (*string - '0'); string++; } trailpad *= 10; if (*string == '.') { string++; if (isdigit(UChar(*string))) { trailpad += (*string - '0'); string++; } while (isdigit(UChar(*string))) string++; } if (*string == '*') { trailpad *= affcnt; string++; } } #endif /* BSD_TPUTS */ SetOutCh(outc); /* redirect delay_output() */ while (*string) { if (*string != '$') (*outc) (NCURSES_SP_ARGx *string); else { string++; if (*string != '<') { (*outc) (NCURSES_SP_ARGx '$'); if (*string) (*outc) (NCURSES_SP_ARGx *string); } else { bool mandatory; string++; if ((!isdigit(UChar(*string)) && *string != '.') || !strchr(string, '>')) { (*outc) (NCURSES_SP_ARGx '$'); (*outc) (NCURSES_SP_ARGx '<'); continue; } number = 0; while (isdigit(UChar(*string))) { number = number * 10 + (*string - '0'); string++; } number *= 10; if (*string == '.') { string++; if (isdigit(UChar(*string))) { number += (*string - '0'); string++; } while (isdigit(UChar(*string))) string++; } mandatory = FALSE; while (*string == '*' || *string == '/') { if (*string == '*') { number *= affcnt; string++; } else { /* if (*string == '/') */ mandatory = TRUE; string++; } } if (number > 0 && (always_delay || normal_delay || mandatory)) NCURSES_SP_NAME(delay_output) (NCURSES_SP_ARGx number / 10); } /* endelse (*string == '<') */ } /* endelse (*string == '$') */ if (*string == '\0') break; string++; } #if BSD_TPUTS /* * Emit any BSD-style prefix padding that we've accumulated now. */ if (trailpad > 0 && (always_delay || normal_delay)) NCURSES_SP_NAME(delay_output) (NCURSES_SP_ARGx trailpad / 10); #endif /* BSD_TPUTS */ SetOutCh(my_outch); return OK; } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) _nc_outc_wrapper(SCREEN *sp, int c) { if (0 == sp) { return fputc(c, stdout); } else { return sp->jump(c); } } NCURSES_EXPORT(int) tputs(const char *string, int affcnt, int (*outc) (int)) { SetSafeOutcWrapper(outc); return NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx string, affcnt, _nc_outc_wrapper); } #endif ncurses-6.4-20240113/ncurses/tinfo/lib_baudrate.c0000644000000000000000000001736313724777764020061 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/tinfo/doalloc.c0000644000000000000000000000576514041126453017034 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/ncurses/tinfo/lib_ttyflags.c0000644000000000000000000001772013725013467020104 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/tinfo/README0000644000000000000000000000525113615656212016130 0ustar rootroot------------------------------------------------------------------------------- -- Copyright 2020 Thomas E. Dickey -- -- Copyright 1998,2006 Free Software Foundation, Inc. -- -- -- -- Permission is hereby granted, free of charge, to any person obtaining a -- -- copy of this software and associated documentation files (the -- -- "Software"), to deal in the Software without restriction, including -- -- without limitation the rights to use, copy, modify, merge, publish, -- -- distribute, distribute with modifications, sublicense, and/or sell copies -- -- of the Software, and to permit persons to whom the Software is furnished -- -- to do so, subject to the following conditions: -- -- -- -- The above copyright notice and this permission notice shall be included -- -- in all copies or substantial portions of the Software. -- -- -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- -- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- -- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- -- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- -- USE OR OTHER DEALINGS IN THE SOFTWARE. -- -- -- -- Except as contained in this notice, the name(s) of the above copyright -- -- holders shall not be used in advertising or otherwise to promote the -- -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------- -- $Id: README,v 1.3 2020/02/02 23:34:34 tom Exp $ ------------------------------------------------------------------------------- The files in this directory (tinfo) are those that support the terminfo database and interfaces for ncurses. The terminfo library can be built separately, as a lower-level library for ncurses, but usually is bundled. In addition to the standard documented interfaces, ncurses uses internal functions which reside in tinfo to satisfy linkage requirements. ncurses-6.4-20240113/ncurses/tinfo/lib_napms.c0000644000000000000000000000746514501351475017367 0ustar rootroot/**************************************************************************** * 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_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.28 2023/09/16 16:09:33 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) 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 ncurses-6.4-20240113/ncurses/tinfo/alloc_ttype.c0000644000000000000000000004723614477176251017753 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 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.51 2023/09/09 23:15:53 tom Exp $") #if NCURSES_XNAMES /* * Merge the a/b lists into dst. Both a/b are sorted (see _nc_extend_names()), * so we do not have to worry about order dependencies. */ static int merge_names(char **dst, char **a, int na, char **b, int nb) { int n = 0; while (na > 0 && nb > 0) { int cmp = strcmp(*a, *b); if (cmp < 0) { dst[n++] = *a++; na--; } else if (cmp > 0) { dst[n++] = *b++; nb--; } else { dst[n++] = *a; a++, b++; na--, nb--; } } while (na-- > 0) { dst[n++] = *a++; } while (nb-- > 0) { dst[n++] = *b++; } DEBUG(4, ("merge_names -> %d", n)); return n; } static bool find_name(char **table, int item, int length, const char *name) { int n; int result = -1; for (n = item; n < length; ++n) { if (!strcmp(table[n], name)) { DEBUG(4, ("found name '%s' @%d", name, n)); result = n; break; } } if (result < 0) { DEBUG(4, ("did not find name '%s'", name)); } return (result >= 0); } #define EXTEND_NUM(num, ext) \ DEBUG(4, ("extending " #num " from %d to %d", \ to->num, (unsigned short) (to->num + (ext - to->ext)))); \ to->num = (unsigned short) (to->num + (ext - to->ext)) static void realign_data(TERMTYPE2 *to, char **ext_Names, int ext_Booleans, int ext_Numbers, int ext_Strings) { int n, m, base; int to_Booleans = to->ext_Booleans; int to_Numbers = to->ext_Numbers; int to_Strings = to->ext_Strings; int to1, to2, from; DEBUG(4, ("realign_data %d/%d/%d vs %d/%d/%d", ext_Booleans, ext_Numbers, ext_Strings, to->ext_Booleans, to->ext_Numbers, to->ext_Strings)); if (to->ext_Booleans != ext_Booleans) { to1 = 0; to2 = to_Booleans + to1; from = 0; EXTEND_NUM(num_Booleans, ext_Booleans); TYPE_REALLOC(NCURSES_SBOOL, to->num_Booleans, to->Booleans); for (n = to->ext_Booleans - 1, m = ext_Booleans - 1, base = to->num_Booleans - (m + 1); m >= 0; m--) { if (find_name(to->ext_Names, to1, to2, ext_Names[m + from])) { to->Booleans[base + m] = to->Booleans[base + n--]; } else { to->Booleans[base + m] = FALSE; } } to->ext_Booleans = UShort(ext_Booleans); } if (to->ext_Numbers != ext_Numbers) { to1 = to_Booleans; to2 = to_Numbers + to1; from = ext_Booleans; EXTEND_NUM(num_Numbers, ext_Numbers); TYPE_REALLOC(NCURSES_INT2, to->num_Numbers, to->Numbers); for (n = to->ext_Numbers - 1, m = ext_Numbers - 1, base = to->num_Numbers - (m + 1); m >= 0; m--) { if (find_name(to->ext_Names, to1, to2, ext_Names[m + from])) { to->Numbers[base + m] = to->Numbers[base + n--]; } else { to->Numbers[base + m] = ABSENT_NUMERIC; } } to->ext_Numbers = UShort(ext_Numbers); } if (to->ext_Strings != ext_Strings) { to1 = to_Booleans + to_Numbers; to2 = to_Strings + to1; from = ext_Booleans + ext_Numbers; EXTEND_NUM(num_Strings, ext_Strings); TYPE_REALLOC(char *, to->num_Strings, to->Strings); for (n = to->ext_Strings - 1, m = ext_Strings - 1, base = to->num_Strings - (m + 1); m >= 0; m--) { if (find_name(to->ext_Names, to1, to2, ext_Names[m + from])) { to->Strings[base + m] = to->Strings[base + n--]; } else { to->Strings[base + m] = ABSENT_STRING; } } to->ext_Strings = UShort(ext_Strings); } } /* * Returns the first index in ext_Names[] for the given token-type */ static unsigned _nc_first_ext_name(TERMTYPE2 *tp, int token_type) { unsigned first; switch (token_type) { case BOOLEAN: first = 0; break; case NUMBER: first = tp->ext_Booleans; break; case STRING: first = (unsigned) (tp->ext_Booleans + tp->ext_Numbers); break; default: first = 0; break; } return first; } /* * Returns the last index in ext_Names[] for the given token-type */ static unsigned _nc_last_ext_name(TERMTYPE2 *tp, int token_type) { unsigned last; switch (token_type) { case BOOLEAN: last = tp->ext_Booleans; break; case NUMBER: last = (unsigned) (tp->ext_Booleans + tp->ext_Numbers); break; default: case STRING: last = NUM_EXT_NAMES(tp); break; } return last; } /* * Lookup an entry from extended-names, returning -1 if not found */ static int _nc_find_ext_name(TERMTYPE2 *tp, char *name, int token_type) { unsigned j; unsigned first = _nc_first_ext_name(tp, token_type); unsigned last = _nc_last_ext_name(tp, token_type); for (j = first; j < last; j++) { if (!strcmp(name, tp->ext_Names[j])) { return (int) j; } } return -1; } /* * Translate an index into ext_Names[] into the corresponding index into data * (e.g., Booleans[]). */ static int _nc_ext_data_index(TERMTYPE2 *tp, int n, int token_type) { switch (token_type) { case BOOLEAN: n += (tp->num_Booleans - tp->ext_Booleans); break; case NUMBER: n += (tp->num_Numbers - tp->ext_Numbers) - (tp->ext_Booleans); break; default: case STRING: n += (tp->num_Strings - tp->ext_Strings) - (tp->ext_Booleans + tp->ext_Numbers); } return n; } /* * Adjust tables to remove (not free) an extended name and its corresponding * data. */ static bool _nc_del_ext_name(TERMTYPE2 *tp, char *name, int token_type) { int first; if ((first = _nc_find_ext_name(tp, name, token_type)) >= 0) { int j; int last = (int) NUM_EXT_NAMES(tp) - 1; for (j = first; j < last; j++) { tp->ext_Names[j] = tp->ext_Names[j + 1]; } first = _nc_ext_data_index(tp, first, token_type); switch (token_type) { case BOOLEAN: last = tp->num_Booleans - 1; for (j = first; j < last; j++) tp->Booleans[j] = tp->Booleans[j + 1]; tp->ext_Booleans--; tp->num_Booleans--; break; case NUMBER: last = tp->num_Numbers - 1; for (j = first; j < last; j++) tp->Numbers[j] = tp->Numbers[j + 1]; tp->ext_Numbers--; tp->num_Numbers--; break; case STRING: last = tp->num_Strings - 1; for (j = first; j < last; j++) tp->Strings[j] = tp->Strings[j + 1]; tp->ext_Strings--; tp->num_Strings--; break; } return TRUE; } return FALSE; } /* * Adjust tables to insert an extended name, making room for new data. The * index into the corresponding data array is returned. */ static int _nc_ins_ext_name(TERMTYPE2 *tp, char *name, int token_type) { unsigned first = _nc_first_ext_name(tp, token_type); unsigned last = _nc_last_ext_name(tp, token_type); unsigned total = NUM_EXT_NAMES(tp) + 1; unsigned j, k; for (j = first; j < last; j++) { int cmp = strcmp(name, tp->ext_Names[j]); if (cmp == 0) /* already present */ return _nc_ext_data_index(tp, (int) j, token_type); if (cmp < 0) { break; } } TYPE_REALLOC(char *, total, tp->ext_Names); for (k = total - 1; k > j; k--) tp->ext_Names[k] = tp->ext_Names[k - 1]; tp->ext_Names[j] = name; j = (unsigned) _nc_ext_data_index(tp, (int) j, token_type); switch (token_type) { case BOOLEAN: tp->ext_Booleans++; tp->num_Booleans++; TYPE_REALLOC(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans); for (k = (unsigned) (tp->num_Booleans - 1); k > j; k--) tp->Booleans[k] = tp->Booleans[k - 1]; break; case NUMBER: tp->ext_Numbers++; tp->num_Numbers++; TYPE_REALLOC(NCURSES_INT2, tp->num_Numbers, tp->Numbers); for (k = (unsigned) (tp->num_Numbers - 1); k > j; k--) tp->Numbers[k] = tp->Numbers[k - 1]; break; case STRING: tp->ext_Strings++; tp->num_Strings++; TYPE_REALLOC(char *, tp->num_Strings, tp->Strings); for (k = (unsigned) (tp->num_Strings - 1); k > j; k--) tp->Strings[k] = tp->Strings[k - 1]; break; } return (int) j; } /* * Look for strings that are marked cancelled, which happen to be the same name * as a boolean or number. We'll get this as a special case when we get a * cancellation of a name that is inherited from another entry. */ static void adjust_cancels(TERMTYPE2 *to, TERMTYPE2 *from) { int first = to->ext_Booleans + to->ext_Numbers; int last = first + to->ext_Strings; int j, k; DEBUG(3, (T_CALLED("adjust_cancels(%s), from(%s)"), 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 */ ncurses-6.4-20240113/ncurses/tinfo/lib_print.c0000644000000000000000000001072214441070071017364 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,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: 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.31 2023/06/10 12:44:41 tom Exp $") NCURSES_EXPORT(int) NCURSES_SP_NAME(mcprint) (NCURSES_SP_DCLx char *data, int len) /* ship binary character data to the printer via mc4/mc5/mc5p */ { int result; char *mybuf = NULL, *switchon; size_t onsize, offsize; size_t need; errno = 0; if (!HasTInfoTerminal(SP_PARM) || len <= 0 || (!prtr_non && (!prtr_on || !prtr_off))) { errno = ENODEV; return (ERR); } if (prtr_non) { switchon = TIPARM_1(prtr_non, len); onsize = strlen(switchon); offsize = 0; } else { switchon = prtr_on; onsize = strlen(prtr_on); offsize = strlen(prtr_off); } need = onsize + (size_t) len + offsize; if (switchon == 0 || (mybuf = typeMalloc(char, need + 1)) == 0) { free(mybuf); errno = ENOMEM; return (ERR); } _nc_STRCPY(mybuf, switchon, need); memcpy(mybuf + onsize, data, (size_t) len); if (offsize) _nc_STRCPY(mybuf + onsize + len, prtr_off, need); /* * We're relying on the atomicity of UNIX writes here. The * danger is that output from a refresh() might get interspersed * with the printer data after the write call returns but before the * data has actually been shipped to the terminal. If the write(2) * operation is truly atomic we're protected from this. */ result = (int) write(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 (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 ncurses-6.4-20240113/ncurses/tinfo/lib_longname.c0000644000000000000000000000735014032166745020045 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/tinfo/lib_cur_term.c0000644000000000000000000001353114244461147020062 0ustar rootroot/**************************************************************************** ,* 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 ncurses-6.4-20240113/ncurses/tinfo/MKcaptab.sh0000755000000000000000000001431314420774571017274 0ustar rootroot#!/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 ncurses-6.4-20240113/ncurses/tinfo/comp_parse.c0000644000000000000000000005100014434462126017534 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* * 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.133 2023/05/27 20:13:10 tom Exp $") static void sanity_check2(TERMTYPE2 *, bool); NCURSES_IMPEXP void (NCURSES_API *_nc_check_termtype2) (TERMTYPE2 *, bool) = sanity_check2; static void fixup_acsc(TERMTYPE2 *, int); static void enqueue(ENTRY * ep) /* add an entry to the in-core list */ { ENTRY *newp; DEBUG(2, (T_CALLED("enqueue(ep=%p)"), (void *) ep)); newp = _nc_copy_entry(ep); if (newp == 0) _nc_err_abort(MSG_NO_MEMORY); newp->last = _nc_tail; _nc_tail = newp; newp->next = 0; if (newp->last) newp->last->next = newp; DEBUG(2, (T_RETURN(""))); } #define NAMEBUFFER_SIZE (MAX_NAME_SIZE + 2) static char * force_bar(char *dst, char *src) { if (strchr(src, '|') == 0) { size_t len = strlen(src); if (len > MAX_NAME_SIZE) len = MAX_NAME_SIZE; _nc_STRNCPY(dst, src, MAX_NAME_SIZE); _nc_STRCPY(dst + len, "|", NAMEBUFFER_SIZE - len); src = dst; } return src; } #define ForceBar(dst, src) ((strchr(src, '|') == 0) ? force_bar(dst, src) : src) #if NCURSES_USE_TERMCAP && NCURSES_XNAMES static char * skip_index(char *name) { char *bar = strchr(name, '|'); if (bar != 0 && (bar - name) == 2) name = bar + 1; return name; } #endif static bool check_collisions(char *n1, char *n2, int counter) { char *pstart, *qstart, *pend, *qend; char nc1[NAMEBUFFER_SIZE]; char nc2[NAMEBUFFER_SIZE]; n1 = ForceBar(nc1, n1); n2 = ForceBar(nc2, n2); #if NCURSES_USE_TERMCAP && NCURSES_XNAMES if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) { n1 = skip_index(n1); n2 = skip_index(n2); } #endif for (pstart = n1; (pend = strchr(pstart, '|')); pstart = pend + 1) { for (qstart = n2; (qend = strchr(qstart, '|')); qstart = qend + 1) { if ((pend - pstart == qend - qstart) && memcmp(pstart, qstart, (size_t) (pend - pstart)) == 0) { if (counter > 0) (void) fprintf(stderr, "Name collision '%.*s' between\n", (int) (pend - pstart), pstart); return (TRUE); } } } return (FALSE); } static char * next_name(char *name) { if (*name != '\0') ++name; return name; } static char * name_ending(char *name) { if (*name == '\0') { name = 0; } else { while (*name != '\0' && *name != '|') ++name; } return name; } /* * Essentially, find the conflict reported in check_collisions() and remove * it from the second name, unless that happens to be the last alias. */ static bool remove_collision(char *n1, char *n2) { char *p2 = n2; char *pstart, *qstart, *pend, *qend; bool removed = FALSE; #if NCURSES_USE_TERMCAP && NCURSES_XNAMES if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) { n1 = skip_index(n1); p2 = n2 = skip_index(n2); } #endif for (pstart = n1; (pend = name_ending(pstart)); pstart = next_name(pend)) { for (qstart = n2; (qend = name_ending(qstart)); qstart = next_name(qend)) { if ((pend - pstart == qend - qstart) && memcmp(pstart, qstart, (size_t) (pend - pstart)) == 0) { if (qstart != p2 || *qend == '|') { if (*qend == '|') ++qend; while ((*qstart++ = *qend++) != '\0') ; fprintf(stderr, "...now\t%s\n", p2); removed = TRUE; } else { fprintf(stderr, "Cannot remove alias '%.*s'\n", (int) (qend - qstart), qstart); } break; } } } return removed; } /* do any of the aliases in a pair of terminal names match? */ NCURSES_EXPORT(bool) _nc_entry_match(char *n1, char *n2) { return check_collisions(n1, n2, 0); } /**************************************************************************** * * Entry compiler and resolution logic * ****************************************************************************/ NCURSES_EXPORT(void) _nc_read_entry_source(FILE *fp, char *buf, int literal, bool silent, bool(*hook) (ENTRY *)) /* slurp all entries in the given file into core */ { ENTRY thisentry; bool oldsuppress = _nc_suppress_warnings; int immediate = 0; DEBUG(2, (T_CALLED("_nc_read_entry_source(" "file=%p, buf=%p, literal=%d, silent=%d, hook=%#" PRIxPTR ")"), (void *) fp, buf, literal, silent, 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 unresolved, total_unresolved, multiples; DEBUG(2, (T_CALLED("_nc_resolve_uses2"))); /* * Check for multiple occurrences of the same name. */ multiples = 0; for_entry_list(qp) { int matchcount = 0; for_entry_list2(rp, qp->next) { if (qp > rp && check_collisions(qp->tterm.term_names, rp->tterm.term_names, matchcount + 1)) { if (!matchcount++) { (void) fprintf(stderr, "\t%s\n", rp->tterm.term_names); } (void) fprintf(stderr, "and\t%s\n", qp->tterm.term_names); if (!remove_collision(rp->tterm.term_names, qp->tterm.term_names)) { ++multiples; } } } } if (multiples > 0) { DEBUG(2, (T_RETURN("false"))); return (FALSE); } DEBUG(2, ("NO MULTIPLE NAME OCCURRENCES")); /* * First resolution stage: compute link pointers corresponding to names. */ total_unresolved = 0; _nc_curr_col = -1; for_entry_list(qp) { unresolved = 0; for (i = 0; i < qp->nuses; i++) { bool foundit; char *child = _nc_first_name(qp->tterm.term_names); char *lookfor = qp->uses[i].name; long lookline = qp->uses[i].line; if (lookfor == 0) continue; foundit = FALSE; _nc_set_type(child); /* first, try to resolve from in-core records */ for_entry_list(rp) { if (rp != qp && _nc_name_match(rp->tterm.term_names, lookfor, "|")) { DEBUG(2, ("%s: resolving use=%s %p (in core)", child, lookfor, lookfor)); qp->uses[i].link = rp; foundit = TRUE; /* verify that there are no earlier uses */ for (j = 0; j < i; ++j) { if (qp->uses[j].link != NULL && !strcmp(qp->uses[j].link->tterm.term_names, rp->tterm.term_names)) { _nc_warning("duplicate use=%s", lookfor); break; } } } } /* if that didn't work, try to merge in a compiled entry */ if (!foundit) { TERMTYPE2 thisterm; char filename[PATH_MAX]; memset(&thisterm, 0, sizeof(thisterm)); if (_nc_read_entry2(lookfor, filename, &thisterm) == 1) { DEBUG(2, ("%s: resolving use=%s (compiled)", child, lookfor)); TYPE_MALLOC(ENTRY, 1, rp); rp->tterm = thisterm; rp->nuses = 0; rp->next = lastread; lastread = rp; qp->uses[i].link = rp; foundit = TRUE; /* verify that there are no earlier uses */ for (j = 0; j < i; ++j) { if (qp->uses[j].link != NULL && !strcmp(qp->uses[j].link->tterm.term_names, rp->tterm.term_names)) { _nc_warning("duplicate use=%s", lookfor); break; } } } } /* no good, mark this one unresolvable and complain */ if (!foundit) { unresolved++; total_unresolved++; _nc_curr_line = (int) lookline; _nc_warning("resolution of use=%s failed", lookfor); qp->uses[i].link = 0; } } } if (total_unresolved) { /* free entries read in off disk */ _nc_free_entries(lastread); DEBUG(2, (T_RETURN("false"))); return (FALSE); } DEBUG(2, ("NAME RESOLUTION COMPLETED OK")); /* * OK, at this point all (char *) references in `name' members * have been successfully converted to (ENTRY *) pointers in * `link' members. Time to do the actual merges. */ if (fullresolve) { do { ENTRY merged; keepgoing = FALSE; for_entry_list(qp) { if (qp->nuses > 0) { DEBUG(2, ("%s: attempting merge of %d entries", _nc_first_name(qp->tterm.term_names), qp->nuses)); /* * If any of the use entries we're looking for is * incomplete, punt. We'll catch this entry on a * subsequent pass. */ for (i = 0; i < qp->nuses; i++) { if (qp->uses[i].link && qp->uses[i].link->nuses) { DEBUG(2, ("%s: use entry %d unresolved", _nc_first_name(qp->tterm.term_names), i)); goto incomplete; } } /* * First, make sure there is no garbage in the * merge block. As a side effect, copy into * the merged entry the name field and string * table pointer. */ _nc_copy_termtype2(&(merged.tterm), &(qp->tterm)); /* * Now merge in each use entry in the proper * (reverse) order. */ for (; qp->nuses; qp->nuses--) { int n = (int) (qp->nuses - 1); validate_merge(&merged, qp->uses[n].link); _nc_merge_entry(&merged, qp->uses[n].link); free(qp->uses[n].name); } /* * Now merge in the original entry. */ validate_merge(&merged, qp); _nc_merge_entry(&merged, qp); /* * Replace the original entry with the merged one. */ FreeIfNeeded(qp->tterm.Booleans); FreeIfNeeded(qp->tterm.Numbers); FreeIfNeeded(qp->tterm.Strings); FreeIfNeeded(qp->tterm.str_table); #if NCURSES_XNAMES FreeIfNeeded(qp->tterm.ext_Names); FreeIfNeeded(qp->tterm.ext_str_table); #endif qp->tterm = merged.tterm; _nc_wrap_entry(qp, TRUE); /* * We know every entry is resolvable because name resolution * didn't bomb. So go back for another pass. */ /* FALLTHRU */ incomplete: keepgoing = TRUE; } } } while (keepgoing); DEBUG(2, ("MERGES COMPLETED OK")); } DEBUG(2, ("RESOLUTION FINISHED")); if (fullresolve) { _nc_curr_col = -1; for_entry_list(qp) { _nc_curr_line = (int) qp->startline; _nc_set_type(_nc_first_name(qp->tterm.term_names)); /* * tic overrides this function pointer to provide more verbose * checking. */ if (_nc_check_termtype2 != sanity_check2) { SCREEN *save_SP = SP; SCREEN fake_sp; TERMINAL fake_tm; TERMINAL *save_tm = cur_term; /* * Setup so that tic can use ordinary terminfo interface to * obtain capability information. */ memset(&fake_sp, 0, sizeof(fake_sp)); memset(&fake_tm, 0, sizeof(fake_tm)); fake_sp._term = &fake_tm; TerminalType(&fake_tm) = qp->tterm; _nc_set_screen(&fake_sp); set_curterm(&fake_tm); _nc_check_termtype2(&qp->tterm, literal); /* * Checking calls tparm, which can allocate memory. Fix leaks. */ #define TPS(name) fake_tm.tparm_state.name FreeAndNull(TPS(out_buff)); FreeAndNull(TPS(fmt_buff)); #undef TPS _nc_set_screen(save_SP); set_curterm(save_tm); } else { fixup_acsc(&qp->tterm, literal); } } DEBUG(2, ("SANITY CHECK FINISHED")); } DEBUG(2, (T_RETURN("true"))); return (TRUE); } /* * This bit of legerdemain turns all the terminfo variable names into * references to locations in the arrays Booleans, Numbers, and Strings --- * precisely what's needed. */ #undef CUR #define CUR tp-> static void fixup_acsc(TERMTYPE2 *tp, int literal) { if (!literal) { if (acs_chars == ABSENT_STRING && PRESENT(enter_alt_charset_mode) && PRESENT(exit_alt_charset_mode)) acs_chars = strdup(VT_ACSC); } } static void sanity_check2(TERMTYPE2 *tp, bool literal) { if (!PRESENT(exit_attribute_mode)) { #ifdef __UNUSED__ /* this casts too wide a net */ bool terminal_entry = !strchr(tp->term_names, '+'); if (terminal_entry && (PRESENT(set_attributes) || PRESENT(enter_standout_mode) || PRESENT(enter_underline_mode) || PRESENT(enter_blink_mode) || PRESENT(enter_bold_mode) || PRESENT(enter_dim_mode) || PRESENT(enter_secure_mode) || PRESENT(enter_protected_mode) || PRESENT(enter_reverse_mode))) _nc_warning("no exit_attribute_mode"); #endif /* __UNUSED__ */ PAIRED(enter_standout_mode, exit_standout_mode); PAIRED(enter_underline_mode, exit_underline_mode); #if defined(enter_italics_mode) && defined(exit_italics_mode) PAIRED(enter_italics_mode, exit_italics_mode); #endif } /* we do this check/fix in postprocess_termcap(), but some packagers * prefer to bypass it... */ if (!literal) { fixup_acsc(tp, literal); ANDMISSING(enter_alt_charset_mode, acs_chars); ANDMISSING(exit_alt_charset_mode, acs_chars); } /* listed in structure-member order of first argument */ PAIRED(enter_alt_charset_mode, exit_alt_charset_mode); ANDMISSING(enter_blink_mode, exit_attribute_mode); ANDMISSING(enter_bold_mode, exit_attribute_mode); PAIRED(exit_ca_mode, enter_ca_mode); PAIRED(enter_delete_mode, exit_delete_mode); ANDMISSING(enter_dim_mode, exit_attribute_mode); PAIRED(enter_insert_mode, exit_insert_mode); ANDMISSING(enter_secure_mode, exit_attribute_mode); ANDMISSING(enter_protected_mode, exit_attribute_mode); ANDMISSING(enter_reverse_mode, exit_attribute_mode); PAIRED(from_status_line, to_status_line); PAIRED(meta_off, meta_on); PAIRED(prtr_on, prtr_off); PAIRED(save_cursor, restore_cursor); PAIRED(enter_xon_mode, exit_xon_mode); PAIRED(enter_am_mode, exit_am_mode); ANDMISSING(label_off, label_on); #if defined(display_clock) && defined(remove_clock) PAIRED(display_clock, remove_clock); #endif ANDMISSING(set_color_pair, initialize_pair); } #if NO_LEAKS NCURSES_EXPORT(void) _nc_leaks_tic(void) { T((T_CALLED("_nc_leaks_tic()"))); _nc_globals.leak_checking = TRUE; _nc_alloc_entry_leaks(); _nc_captoinfo_leaks(); _nc_comp_scan_leaks(); #if BROKEN_LINKER || USE_REENTRANT _nc_names_leaks(); _nc_codes_leaks(); #endif _nc_tic_expand(0, FALSE, 0); T((T_RETURN(""))); } NCURSES_EXPORT(void) _nc_free_tic(int code) { T((T_CALLED("_nc_free_tic(%d)"), code)); _nc_leaks_tic(); exit_terminfo(code); } #endif ncurses-6.4-20240113/ncurses/tinfo/tinfo_driver.c0000644000000000000000000011166014501303421020072 0ustar rootroot/**************************************************************************** * Copyright 2018-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: 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.74 2023/09/16 10:44:33 tom Exp $") /* * SCO defines TIOCGSIZE and the corresponding struct. Other systems (SunOS, * Solaris, IRIX) define TIOCGWINSZ and struct winsize. */ #ifdef TIOCGSIZE # define IOCTL_WINSIZE TIOCGSIZE # define STRUCT_WINSIZE struct ttysize # define WINSIZE_ROWS(n) (int)n.ts_lines # define WINSIZE_COLS(n) (int)n.ts_cols #else # ifdef TIOCGWINSZ # define IOCTL_WINSIZE TIOCGWINSZ # define STRUCT_WINSIZE struct winsize # define WINSIZE_ROWS(n) (int)n.ws_row # define WINSIZE_COLS(n) (int)n.ws_col # endif #endif /* * These should be screen structure members. They need to be globals for * historical reasons. So we assign them in start_color() and also in * set_term()'s screen-switching logic. */ #if USE_REENTRANT NCURSES_EXPORT(int) NCURSES_PUBLIC_VAR(COLOR_PAIRS) (void) { return CURRENT_SCREEN ? CURRENT_SCREEN->_pair_count : -1; } NCURSES_EXPORT(int) NCURSES_PUBLIC_VAR(COLORS) (void) { return CURRENT_SCREEN ? CURRENT_SCREEN->_color_count : -1; } #else NCURSES_EXPORT_VAR(int) COLOR_PAIRS = 0; NCURSES_EXPORT_VAR(int) COLORS = 0; #endif #define TCBMAGIC NCDRV_MAGIC(NCDRV_TINFO) #define AssertTCB() assert(TCB!=0 && TCB->magic==TCBMAGIC) #define SetSP() assert(TCB->csp!=0); sp = TCB->csp; (void) sp /* * This routine needs to do all the work to make curscr look * like newscr. */ static int drv_doupdate(TERMINAL_CONTROL_BLOCK * TCB) { AssertTCB(); return TINFO_DOUPDATE(TCB->csp); } static const char * drv_Name(TERMINAL_CONTROL_BLOCK * TCB) { (void) TCB; return "tinfo"; } static void get_baudrate(TERMINAL *termp) { int my_ospeed; int result; if (GET_TTY(termp->Filedes, &termp->Nttyb) == OK) { #ifdef TERMIOS termp->Nttyb.c_oflag &= (unsigned) (~OFLAGS_TABS); #elif defined(EXP_WIN32_DRIVER) /* noop */ #else termp->Nttyb.sg_flags &= (unsigned) (~XTABS); #endif } #ifdef USE_OLD_TTY result = (int) cfgetospeed(&(termp->Nttyb)); my_ospeed = (NCURSES_OSPEED) _nc_ospeed(result); #else /* !USE_OLD_TTY */ #ifdef TERMIOS my_ospeed = (NCURSES_OSPEED) cfgetospeed(&(termp->Nttyb)); #elif defined(EXP_WIN32_DRIVER) /* noop */ my_ospeed = 0; #else my_ospeed = (NCURSES_OSPEED) termp->Nttyb.sg_ospeed; #endif result = _nc_baudrate(my_ospeed); #endif termp->_baudrate = result; ospeed = (NCURSES_OSPEED) my_ospeed; } #undef SETUP_FAIL #define SETUP_FAIL FALSE #define NO_COPY {} static bool drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret) { bool result = FALSE; int status; TERMINAL *termp; SCREEN *sp; START_TRACE(); T((T_CALLED("tinfo::drv_CanHandle(%p)"), (void *) TCB)); assert(TCB != 0 && tname != 0); termp = (TERMINAL *) TCB; sp = TCB->csp; TCB->magic = TCBMAGIC; #if (NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP) status = _nc_setup_tinfo(tname, &TerminalType(termp)); T(("_nc_setup_tinfo returns %d", status)); #else T(("no database available")); status = TGETENT_NO; #endif /* try fallback list if entry on disk */ if (status != TGETENT_YES) { const TERMTYPE2 *fallback = _nc_fallback2(tname); if (fallback) { T(("found fallback entry")); TerminalType(termp) = *fallback; status = TGETENT_YES; } } if (status != TGETENT_YES) { NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx termp); if (status == TGETENT_ERR) { ret_error0(status, "terminals database is inaccessible\n"); } else if (status == TGETENT_NO) { ret_error1(status, "unknown terminal type.\n", tname, NO_COPY); } else { ret_error0(status, "unexpected return-code\n"); } } result = TRUE; #if NCURSES_EXT_NUMBERS _nc_export_termtype2(&termp->type, &TerminalType(termp)); #endif #if !USE_REENTRANT save_ttytype(termp); #endif if (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 = value; T(("screen size: environment LINES = %d", *linep)); } if ((value = _nc_getenv_num("COLUMNS")) > 0) { *colp = value; T(("screen size: environment COLUMNS = %d", *colp)); } } /* if we can't get dynamic info about the size, use static */ if (*linep <= 0) { *linep = (int) lines; } if (*colp <= 0) { *colp = (int) columns; } /* the ultimate fallback, assume fixed 24x80 size */ if (*linep <= 0) { *linep = 24; } if (*colp <= 0) { *colp = 80; } /* * Put the derived values back in the screen-size caps, so * tigetnum() and tgetnum() will do the right thing. */ lines = (short) (*linep); columns = (short) (*colp); } T(("screen size is %dx%d", *linep, *colp)); return OK; } static int drv_getsize(TERMINAL_CONTROL_BLOCK * TCB, int *l, int *c) { AssertTCB(); assert(l != 0 && c != 0); *l = lines; *c = columns; return OK; } static int drv_setsize(TERMINAL_CONTROL_BLOCK * TCB, int l, int c) { AssertTCB(); lines = (short) l; columns = (short) c; return OK; } static int drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, int setFlag, TTY * buf) { SCREEN *sp = TCB->csp; TERMINAL *_term = (TERMINAL *) TCB; int result = OK; AssertTCB(); if (setFlag) { for (;;) { if (SET_TTY(_term->Filedes, buf) != 0) { if (errno == EINTR) continue; if (errno == ENOTTY) { if (sp) sp->_notty = TRUE; } result = ERR; } break; } } else { for (;;) { if (GET_TTY(_term->Filedes, buf) != 0) { if (errno == EINTR) continue; result = ERR; } break; } } return result; } static int drv_mode(TERMINAL_CONTROL_BLOCK * TCB, int progFlag, int defFlag) { SCREEN *sp; TERMINAL *_term = (TERMINAL *) TCB; int code = ERR; AssertTCB(); sp = TCB->csp; if (progFlag) /* prog mode */ { if (defFlag) { /* def_prog_mode */ /* * Turn off the XTABS bit in the tty structure if it was on. */ if ((drv_sgmode(TCB, FALSE, &(_term->Nttyb)) == OK)) { #ifdef TERMIOS _term->Nttyb.c_oflag &= (unsigned) ~OFLAGS_TABS; #elif defined(EXP_WIN32_DRIVER) /* noop */ #else _term->Nttyb.sg_flags &= (unsigned) ~XTABS; #endif code = OK; } } else { /* reset_prog_mode */ if (drv_sgmode(TCB, TRUE, &(_term->Nttyb)) == OK) { if (sp) { if (sp->_keypad_on) _nc_keypad(sp, TRUE); } code = OK; } } } else { /* shell mode */ if (defFlag) { /* def_shell_mode */ /* * If XTABS was on, remove the tab and backtab capabilities. */ if (drv_sgmode(TCB, FALSE, &(_term->Ottyb)) == OK) { #ifdef TERMIOS if (_term->Ottyb.c_oflag & OFLAGS_TABS) tab = back_tab = NULL; #elif defined(EXP_WIN32_DRIVER) /* noop */ #else if (_term->Ottyb.sg_flags & XTABS) tab = back_tab = NULL; #endif code = OK; } } else { /* reset_shell_mode */ if (sp) { _nc_keypad(sp, FALSE); NCURSES_SP_NAME(_nc_flush) (sp); } code = drv_sgmode(TCB, TRUE, &(_term->Ottyb)); } } return (code); } static void drv_wrap(SCREEN *sp) { if (sp) { sp->_mouse_wrap(sp); NCURSES_SP_NAME(_nc_screen_wrap) (sp); NCURSES_SP_NAME(_nc_mvcur_wrap) (sp); /* wrap up cursor addressing */ } } static void drv_release(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED) { } # define SGR0_TEST(mode) (mode != 0) && (exit_attribute_mode == 0 || strcmp(mode, exit_attribute_mode)) static void drv_screen_init(SCREEN *sp) { TERMINAL_CONTROL_BLOCK *TCB = TCBOf(sp); AssertTCB(); /* * Check for mismatched graphic-rendition capabilities. Most SVr4 * terminfo trees contain entries that have rmul or rmso equated to * sgr0 (Solaris curses copes with those entries). We do this only * for curses, since many termcap applications assume that * smso/rmso and smul/rmul are paired, and will not function * properly if we remove rmso or rmul. Curses applications * shouldn't be looking at this detail. */ sp->_use_rmso = SGR0_TEST(exit_standout_mode); sp->_use_rmul = SGR0_TEST(exit_underline_mode); /* * Check whether we can optimize scrolling under dumb terminals in * case we do not have any of these capabilities, scrolling * optimization will be useless. */ sp->_scrolling = ((scroll_forward && scroll_reverse) || ((parm_rindex || parm_insert_line || insert_line) && (parm_index || parm_delete_line || delete_line))); NCURSES_SP_NAME(baudrate) (sp); NCURSES_SP_NAME(_nc_mvcur_init) (sp); /* initialize terminal to a sane state */ NCURSES_SP_NAME(_nc_screen_init) (sp); } static void drv_init(TERMINAL_CONTROL_BLOCK * TCB) { TERMINAL *trm; AssertTCB(); trm = (TERMINAL *) TCB; TCB->info.initcolor = VALID_STRING(initialize_color); TCB->info.canchange = can_change; TCB->info.hascolor = ((VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs) && (((set_foreground != NULL) && (set_background != NULL)) || ((set_a_foreground != NULL) && (set_a_background != NULL)) || set_color_pair)) ? TRUE : FALSE); TCB->info.caninit = !(exit_ca_mode && non_rev_rmcup); TCB->info.maxpairs = VALID_NUMERIC(max_pairs) ? max_pairs : 0; TCB->info.maxcolors = VALID_NUMERIC(max_colors) ? max_colors : 0; TCB->info.numlabels = VALID_NUMERIC(num_labels) ? num_labels : 0; TCB->info.labelwidth = VALID_NUMERIC(label_width) ? label_width : 0; TCB->info.labelheight = VALID_NUMERIC(label_height) ? label_height : 0; TCB->info.nocolorvideo = VALID_NUMERIC(no_color_video) ? no_color_video : 0; TCB->info.tabsize = VALID_NUMERIC(init_tabs) ? (int) init_tabs : 8; TCB->info.defaultPalette = hue_lightness_saturation ? _nc_hls_palette : _nc_cga_palette; /* * If an application calls setupterm() rather than initscr() or * newterm(), we will not have the def_prog_mode() call in * _nc_setupscreen(). Do it now anyway, so we can initialize the * baudrate. */ if (NC_ISATTY(trm->Filedes)) { TCB->drv->td_mode(TCB, TRUE, TRUE); } } #define MAX_PALETTE 8 #define InPalette(n) ((n) >= 0 && (n) < MAX_PALETTE) static void drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, int pair, int f, int b) { SCREEN *sp; AssertTCB(); SetSP(); if ((initialize_pair != NULL) && InPalette(f) && InPalette(b)) { const color_t *tp = InfoOf(sp).defaultPalette; TR(TRACE_ATTRS, ("initializing pair: pair = %d, fg=(%d,%d,%d), bg=(%d,%d,%d)", pair, tp[f].red, tp[f].green, tp[f].blue, tp[b].red, tp[b].green, tp[b].blue)); NCURSES_PUTP2("initialize_pair", TIPARM_7(initialize_pair, pair, tp[f].red, tp[f].green, tp[f].blue, tp[b].red, tp[b].green, tp[b].blue)); } } static int default_fg(SCREEN *sp) { #if NCURSES_EXT_FUNCS return (sp != 0) ? sp->_default_fg : COLOR_WHITE; #else return COLOR_WHITE; #endif } static int default_bg(SCREEN *sp) { #if NCURSES_EXT_FUNCS return sp != 0 ? sp->_default_bg : COLOR_BLACK; #else return COLOR_BLACK; #endif } static void drv_initcolor(TERMINAL_CONTROL_BLOCK * TCB, int color, int r, int g, int b) { SCREEN *sp = TCB->csp; AssertTCB(); if (initialize_color != NULL) { NCURSES_PUTP2("initialize_color", TIPARM_4(initialize_color, color, r, g, b)); } } static void drv_do_color(TERMINAL_CONTROL_BLOCK * TCB, int old_pair, int pair, int reverse, NCURSES_SP_OUTC outc) { SCREEN *sp = TCB->csp; int fg = COLOR_DEFAULT; int bg = COLOR_DEFAULT; int old_fg, old_bg; AssertTCB(); if (sp == 0) return; if (pair < 0 || pair >= COLOR_PAIRS) { return; } else if (pair != 0) { if (set_color_pair) { TPUTS_TRACE("set_color_pair"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_1(set_color_pair, pair), 1, outc); return; } else if (sp != 0) { _nc_pair_content(SP_PARM, pair, &fg, &bg); } } if (old_pair >= 0 && sp != 0 && _nc_pair_content(SP_PARM, old_pair, &old_fg, &old_bg) != ERR) { if ((isDefaultColor(fg) && !isDefaultColor(old_fg)) || (isDefaultColor(bg) && !isDefaultColor(old_bg))) { #if NCURSES_EXT_FUNCS /* * A minor optimization - but extension. If "AX" is specified in * the terminal description, treat it as screen's indicator of ECMA * SGR 39 and SGR 49, and assume the two sequences are independent. */ if (sp->_has_sgr_39_49 && isDefaultColor(old_bg) && !isDefaultColor(old_fg)) { NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[39m", 1, outc); } else if (sp->_has_sgr_39_49 && isDefaultColor(old_fg) && !isDefaultColor(old_bg)) { NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[49m", 1, outc); } else #endif drv_rescol(TCB); } } else { drv_rescol(TCB); if (old_pair < 0) return; } #if NCURSES_EXT_FUNCS if (isDefaultColor(fg)) fg = default_fg(sp); if (isDefaultColor(bg)) bg = default_bg(sp); #endif if (reverse) { int xx = fg; fg = bg; bg = xx; } TR(TRACE_ATTRS, ("setting colors: pair = %d, fg = %d, bg = %d", pair, fg, bg)); if (!isDefaultColor(fg)) { drv_setcolor(TCB, TRUE, fg, outc); } if (!isDefaultColor(bg)) { drv_setcolor(TCB, FALSE, bg, outc); } } #define xterm_kmous "\033[M" static void init_xterm_mouse(SCREEN *sp) { sp->_mouse_type = M_XTERM; sp->_mouse_xtermcap = NCURSES_SP_NAME(tigetstr) (NCURSES_SP_ARGx "XM"); if (!VALID_STRING(sp->_mouse_xtermcap)) sp->_mouse_xtermcap = "\033[?1000%?%p1%{1}%=%th%el%;"; } static void drv_initmouse(TERMINAL_CONTROL_BLOCK * TCB) { SCREEN *sp; AssertTCB(); SetSP(); /* we know how to recognize mouse events under "xterm" */ if (sp != 0) { if (NonEmpty(key_mouse)) { init_xterm_mouse(sp); } else if (strstr(SP_TERMTYPE term_names, "xterm") != 0) { if (_nc_add_to_try(&(sp->_keytry), xterm_kmous, KEY_MOUSE) == OK) init_xterm_mouse(sp); } } } static int drv_testmouse(TERMINAL_CONTROL_BLOCK * TCB, int delay EVENTLIST_2nd(_nc_eventlist * evl)) { int rc = 0; SCREEN *sp; AssertTCB(); SetSP(); #if USE_SYSMOUSE if ((sp->_mouse_type == M_SYSMOUSE) && (sp->_sysmouse_head < sp->_sysmouse_tail)) { rc = TW_MOUSE; } else #endif { #ifdef EXP_WIN32_DRIVER rc = _nc_console_testmouse(sp, _nc_console_handle(sp->_ifd), delay EVENTLIST_2nd(evl)); #else rc = TCBOf(sp)->drv->td_twait(TCBOf(sp), TWAIT_MASK, delay, (int *) 0 EVENTLIST_2nd(evl)); #endif #if USE_SYSMOUSE if ((sp->_mouse_type == M_SYSMOUSE) && (sp->_sysmouse_head < sp->_sysmouse_tail) && (rc == 0) && (errno == EINTR)) { rc |= TW_MOUSE; } #endif } return rc; } static int drv_mvcur(TERMINAL_CONTROL_BLOCK * TCB, int yold, int xold, int ynew, int xnew) { SCREEN *sp = TCB->csp; AssertTCB(); return NCURSES_SP_NAME(_nc_mvcur) (sp, yold, xold, ynew, xnew); } static void drv_hwlabel(TERMINAL_CONTROL_BLOCK * TCB, int labnum, char *text) { SCREEN *sp = TCB->csp; AssertTCB(); if (labnum > 0 && labnum <= num_labels) { NCURSES_PUTP2("plab_norm", TPARM_2(plab_norm, labnum, text)); } } static void drv_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB, int OnFlag) { SCREEN *sp = TCB->csp; AssertTCB(); if (OnFlag) { NCURSES_PUTP2("label_on", label_on); } else { NCURSES_PUTP2("label_off", label_off); } } static chtype drv_conattr(TERMINAL_CONTROL_BLOCK * TCB) { SCREEN *sp = TCB->csp; chtype attrs = A_NORMAL; AssertTCB(); if (enter_alt_charset_mode) attrs |= A_ALTCHARSET; if (enter_blink_mode) attrs |= A_BLINK; if (enter_bold_mode) attrs |= A_BOLD; if (enter_dim_mode) attrs |= A_DIM; if (enter_reverse_mode) attrs |= A_REVERSE; if (enter_standout_mode) attrs |= A_STANDOUT; if (enter_protected_mode) attrs |= A_PROTECT; if (enter_secure_mode) attrs |= A_INVIS; if (enter_underline_mode) attrs |= A_UNDERLINE; if (sp && sp->_coloron) attrs |= A_COLOR; #if USE_ITALIC if (enter_italics_mode) attrs |= A_ITALIC; #endif return (attrs); } static void drv_setfilter(TERMINAL_CONTROL_BLOCK * TCB) { AssertTCB(); /* *INDENT-EQLS* */ clear_screen = ABSENT_STRING; cursor_address = ABSENT_STRING; cursor_down = ABSENT_STRING; cursor_up = ABSENT_STRING; parm_down_cursor = ABSENT_STRING; parm_up_cursor = ABSENT_STRING; row_address = ABSENT_STRING; cursor_home = carriage_return; if (back_color_erase) clr_eos = ABSENT_STRING; } static void drv_initacs(TERMINAL_CONTROL_BLOCK * TCB, chtype *real_map, chtype *fake_map) { SCREEN *sp = TCB->csp; AssertTCB(); assert(sp != 0); if (ena_acs != NULL) { NCURSES_PUTP2("ena_acs", ena_acs); } #if NCURSES_EXT_FUNCS /* * Linux console "supports" the "PC ROM" character set by the coincidence * that smpch/rmpch and smacs/rmacs have the same values. ncurses has * no codepage support (see SCO Merge for an example). Outside of the * values defined in acsc, there are no definitions for the "PC ROM" * character set (assumed by some applications to be codepage 437), but we * allow those applications to use those codepoints. * * test/blue.c uses this feature. */ #define PCH_KLUDGE(a,b) (a != 0 && b != 0 && !strcmp(a,b)) if (PCH_KLUDGE(enter_pc_charset_mode, enter_alt_charset_mode) && PCH_KLUDGE(exit_pc_charset_mode, exit_alt_charset_mode)) { size_t i; for (i = 1; i < ACS_LEN; ++i) { if (real_map[i] == 0) { real_map[i] = (chtype) i; if (real_map != fake_map) { if (sp != 0) sp->_screen_acs_map[i] = TRUE; } } } } #endif if (acs_chars != NULL) { size_t i = 0; size_t length = strlen(acs_chars); while (i + 1 < length) { if (acs_chars[i] != 0 && UChar(acs_chars[i]) < ACS_LEN) { real_map[UChar(acs_chars[i])] = UChar(acs_chars[i + 1]) | A_ALTCHARSET; T(("#%d real_map[%s] = %s", (int) i, _tracechar(UChar(acs_chars[i])), _tracechtype(real_map[UChar(acs_chars[i])]))); if (sp != 0) { sp->_screen_acs_map[UChar(acs_chars[i])] = TRUE; } } i += 2; } } #ifdef TRACE /* Show the equivalent mapping, noting if it does not match the * given attribute, whether by re-ordering or duplication. */ if (USE_TRACEF(TRACE_CALLS)) { size_t n, m; char show[ACS_LEN * 2 + 1]; for (n = 1, m = 0; n < ACS_LEN; n++) { if (real_map[n] != 0) { show[m++] = (char) n; show[m++] = (char) ChCharOf(real_map[n]); } } show[m] = 0; if (acs_chars == NULL || strcmp(acs_chars, show)) _tracef("%s acs_chars %s", (acs_chars == NULL) ? "NULL" : "READ", _nc_visbuf(acs_chars)); _tracef("%s acs_chars %s", (acs_chars == NULL) ? "NULL" : (strcmp(acs_chars, show) ? "DIFF" : "SAME"), _nc_visbuf(show)); _nc_unlock_global(tracef); } #endif /* TRACE */ } #define ENSURE_TINFO(sp) (TCBOf(sp)->drv->isTerminfo) NCURSES_EXPORT(void) _nc_cookie_init(SCREEN *sp) { bool support_cookies = USE_XMC_SUPPORT; TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) (sp->_term); if (sp == 0 || !ENSURE_TINFO(sp)) return; #if USE_XMC_SUPPORT /* * If we have no magic-cookie support compiled-in, or if it is suppressed * in the environment, reset the support-flag. */ if (magic_cookie_glitch >= 0) { if (getenv("NCURSES_NO_MAGIC_COOKIE") != 0) { support_cookies = FALSE; } } #endif if (!support_cookies && magic_cookie_glitch >= 0) { T(("will disable attributes to work w/o magic cookies")); } if (magic_cookie_glitch > 0) { /* tvi, wyse */ sp->_xmc_triggers = sp->_ok_attributes & XMC_CONFLICT; #if 0 /* * We "should" treat colors as an attribute. The wyse350 (and its * clones) appear to be the only ones that have both colors and magic * cookies. */ if (has_colors()) { sp->_xmc_triggers |= A_COLOR; } #endif sp->_xmc_suppress = sp->_xmc_triggers & (chtype) ~(A_BOLD); T(("magic cookie attributes %s", _traceattr(sp->_xmc_suppress))); /* * Supporting line-drawing may be possible. But make the regular * video attributes work first. */ acs_chars = ABSENT_STRING; ena_acs = ABSENT_STRING; enter_alt_charset_mode = ABSENT_STRING; exit_alt_charset_mode = ABSENT_STRING; #if USE_XMC_SUPPORT /* * To keep the cookie support simple, suppress all of the optimization * hooks except for clear_screen and the cursor addressing. */ if (support_cookies) { clr_eol = ABSENT_STRING; clr_eos = ABSENT_STRING; set_attributes = ABSENT_STRING; } #endif } else if (magic_cookie_glitch == 0) { /* hpterm */ } /* * If magic cookies are not supported, cancel the strings that set * video attributes. */ if (!support_cookies && magic_cookie_glitch >= 0) { magic_cookie_glitch = ABSENT_NUMERIC; set_attributes = ABSENT_STRING; enter_blink_mode = ABSENT_STRING; enter_bold_mode = ABSENT_STRING; enter_dim_mode = ABSENT_STRING; enter_reverse_mode = ABSENT_STRING; enter_standout_mode = ABSENT_STRING; enter_underline_mode = ABSENT_STRING; } /* initialize normal acs before wide, since we use mapping in the latter */ #if !USE_WIDEC_SUPPORT if (_nc_unicode_locale() && _nc_locale_breaks_acs(sp->_term)) { acs_chars = NULL; ena_acs = NULL; enter_alt_charset_mode = NULL; exit_alt_charset_mode = NULL; set_attributes = NULL; } #endif } static int drv_twait(TERMINAL_CONTROL_BLOCK * TCB, int mode, int milliseconds, int *timeleft EVENTLIST_2nd(_nc_eventlist * evl)) { SCREEN *sp; AssertTCB(); SetSP(); #ifdef EXP_WIN32_DRIVER return _nc_console_twait(sp, _nc_console_handle(sp->_ifd), mode, milliseconds, timeleft EVENTLIST_2nd(evl)); #else return _nc_timed_wait(sp, mode, milliseconds, timeleft EVENTLIST_2nd(evl)); #endif } static int drv_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf) { SCREEN *sp; int n; #ifndef EXP_WIN32_DRIVER unsigned char c2 = 0; #endif AssertTCB(); assert(buf); SetSP(); _nc_set_read_thread(TRUE); #ifdef EXP_WIN32_DRIVER n = _nc_console_read(sp, _nc_console_handle(sp->_ifd), buf); #else n = (int) read(sp->_ifd, &c2, (size_t) 1); #endif _nc_set_read_thread(FALSE); #ifndef EXP_WIN32_DRIVER *buf = (int) c2; #endif return n; } static int drv_nap(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int ms) { #if HAVE_NANOSLEEP { struct timespec request, remaining; request.tv_sec = ms / 1000; request.tv_nsec = (ms % 1000) * 1000000; while (nanosleep(&request, &remaining) == -1 && errno == EINTR) { request = remaining; } } #elif defined(EXP_WIN32_DRIVER) Sleep((DWORD) ms); #else _nc_timed_wait(0, 0, ms, (int *) 0 EVENTLIST_2nd(0)); #endif return OK; } static int __nc_putp(SCREEN *sp, const char *name GCC_UNUSED, const char *value) { int rc = ERR; if (value) { rc = NCURSES_PUTP2(name, value); } return rc; } static int __nc_putp_flush(SCREEN *sp, const char *name, const char *value) { int rc = __nc_putp(sp, name, value); if (rc != ERR) { NCURSES_SP_NAME(_nc_flush) (sp); } return rc; } static int drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, int flag) { int ret = ERR; SCREEN *sp; AssertTCB(); sp = TCB->csp; if (sp) { if (flag) { (void) __nc_putp_flush(sp, "keypad_xmit", keypad_xmit); } else if (!flag && keypad_local) { (void) __nc_putp_flush(sp, "keypad_local", keypad_local); } if (flag && !sp->_tried) { _nc_init_keytry(sp); sp->_tried = TRUE; } ret = OK; } return ret; } static int drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, int flag) { SCREEN *sp; int code = ERR; int count = 0; char *s; AssertTCB(); SetSP(); if (c >= 0) { unsigned ch = (unsigned) c; if (flag) { while ((s = _nc_expand_try(sp->_key_ok, ch, &count, (size_t) 0)) != 0) { if (_nc_remove_key(&(sp->_key_ok), ch)) { code = _nc_add_to_try(&(sp->_keytry), s, ch); free(s); count = 0; if (code != OK) break; } else { free(s); } } } else { while ((s = _nc_expand_try(sp->_keytry, ch, &count, (size_t) 0)) != 0) { if (_nc_remove_key(&(sp->_keytry), ch)) { code = _nc_add_to_try(&(sp->_key_ok), s, ch); free(s); count = 0; if (code != OK) break; } else { free(s); } } } } return (code); } static int drv_cursorSet(TERMINAL_CONTROL_BLOCK * TCB, int vis) { SCREEN *sp; int code = ERR; AssertTCB(); SetSP(); T((T_CALLED("tinfo:drv_cursorSet(%p,%d)"), (void *) SP_PARM, vis)); if (SP_PARM != 0 && IsTermInfo(SP_PARM)) { switch (vis) { case 2: code = NCURSES_PUTP2_FLUSH("cursor_visible", cursor_visible); break; case 1: code = NCURSES_PUTP2_FLUSH("cursor_normal", cursor_normal); break; case 0: code = NCURSES_PUTP2_FLUSH("cursor_invisible", cursor_invisible); break; } } else { code = ERR; } returnCode(code); } static bool drv_kyExist(TERMINAL_CONTROL_BLOCK * TCB, int key) { bool res = FALSE; AssertTCB(); if (TCB->csp) res = TINFO_HAS_KEY(TCB->csp, key) == 0 ? FALSE : TRUE; return res; } NCURSES_EXPORT_VAR (TERM_DRIVER) _nc_TINFO_DRIVER = { TRUE, drv_Name, /* Name */ drv_CanHandle, /* CanHandle */ drv_init, /* init */ drv_release, /* release */ drv_size, /* size */ drv_sgmode, /* sgmode */ drv_conattr, /* conattr */ drv_mvcur, /* hwcur */ drv_mode, /* mode */ drv_rescol, /* rescol */ drv_rescolors, /* rescolors */ drv_setcolor, /* color */ drv_dobeepflash, /* doBeepOrFlash */ drv_initpair, /* initpair */ drv_initcolor, /* initcolor */ drv_do_color, /* docolor */ drv_initmouse, /* initmouse */ drv_testmouse, /* testmouse */ drv_setfilter, /* setfilter */ drv_hwlabel, /* hwlabel */ drv_hwlabelOnOff, /* hwlabelOnOff */ drv_doupdate, /* update */ drv_defaultcolors, /* defaultcolors */ drv_print, /* print */ drv_getsize, /* getsize */ drv_setsize, /* setsize */ drv_initacs, /* initacs */ drv_screen_init, /* scinit */ drv_wrap, /* scexit */ drv_twait, /* twait */ drv_read, /* read */ drv_nap, /* nap */ drv_kpad, /* kpad */ drv_keyok, /* kyOk */ drv_kyExist, /* kyExist */ drv_cursorSet /* cursorSet */ }; #ifdef EXP_WIN32_DRIVER /* * The terminfo driver is mandatory and must always be present. * So this is the natural place for the driver initialisation * logic. */ typedef struct DriverEntry { const char *name; TERM_DRIVER *driver; } DRIVER_ENTRY; static DRIVER_ENTRY DriverTable[] = { #ifdef _NC_WINDOWS {"win32console", &_nc_WIN_DRIVER}, #endif {"tinfo", &_nc_TINFO_DRIVER} /* must be last */ }; NCURSES_EXPORT(int) _nc_get_driver(TERMINAL_CONTROL_BLOCK * TCB, const char *name, int *errret) { int code = ERR; size_t i; TERM_DRIVER *res = (TERM_DRIVER *) 0; TERM_DRIVER *use = 0; T((T_CALLED("_nc_get_driver(%p, %s, %p)"), (void *) TCB, NonNull(name), (void *) errret)); assert(TCB != 0); for (i = 0; i < SIZEOF(DriverTable); i++) { res = DriverTable[i].driver; #ifdef _NC_WINDOWS if ((i + 1) == SIZEOF(DriverTable)) { /* For Windows >= 10.0.17763 Windows Console interface implements virtual Terminal functionality. If on Windows td_CanHandle returned FALSE although the terminal name is empty, we default to ms-terminal as tinfo TERM type. */ if (name == 0 || *name == 0 || (strcmp(name, "unknown") == 0)) { name = MS_TERMINAL; T(("Set TERM=%s", name)); } } #endif if (strcmp(DriverTable[i].name, res->td_name(TCB)) == 0) { if (res->td_CanHandle(TCB, name, errret)) { use = res; break; } } } if (use != 0) { TCB->drv = use; code = OK; } returnCode(code); } #endif /* EXP_WIN32_DRIVER */ ncurses-6.4-20240113/ncurses/tinfo/comp_hash.c0000644000000000000000000001267314445567707017377 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/tinfo/trim_sgr0.c0000644000000000000000000002251314503631334017315 0ustar rootroot/**************************************************************************** * Copyright 2020-2021,2023 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.22 2023/09/23 18:47:56 tom Exp $") #undef CUR #define CUR tp-> static char * set_attribute_9(TERMTYPE2 *tp, int flag) { const char *value; char *result; value = TIPARM_9(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, flag); if (PRESENT(value)) result = strdup(value); else result = 0; return result; } static int is_csi(const char *s) { int result = 0; if (s != 0) { if (UChar(s[0]) == CSI_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, 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)) { bool found = FALSE; char *on = set_attribute_9(tp, 1); char *off = set_attribute_9(tp, 0); char *end = strdup(exit_attribute_mode); char *tmp; size_t i, j, k; TR(TRACE_DATABASE, ("checking if we can trim sgr0 based on sgr")); TR(TRACE_DATABASE, ("sgr0 %s", _nc_visbuf(end))); TR(TRACE_DATABASE, ("sgr(9:off) %s", _nc_visbuf(off))); TR(TRACE_DATABASE, ("sgr(9:on) %s", _nc_visbuf(on))); if (!rewrite_sgr(on, enter_alt_charset_mode) || !rewrite_sgr(off, exit_alt_charset_mode) || !rewrite_sgr(end, exit_alt_charset_mode)) { FreeIfNeeded(off); } else if (similar_sgr(off, end) && !similar_sgr(off, on)) { TR(TRACE_DATABASE, ("adjusting sgr(9:off) : %s", _nc_visbuf(off))); result = off; /* * If rmacs is a substring of sgr(0), remove that chunk. */ if (PRESENT(exit_alt_charset_mode)) { TR(TRACE_DATABASE, ("scan for rmacs %s", _nc_visbuf(exit_alt_charset_mode))); j = strlen(off); k = strlen(exit_alt_charset_mode); if (j > k) { for (i = 0; i <= (j - k); ++i) { unsigned k2 = compare_part(exit_alt_charset_mode, off + i); if (k2 != 0) { found = TRUE; chop_out(off, (unsigned) i, (unsigned) (i + k2)); break; } } } } /* * SGR 10 would reset to normal font. */ if (!found) { if ((i = (size_t) is_csi(off)) != 0 && off[strlen(off) - 1] == 'm') { TR(TRACE_DATABASE, ("looking for SGR 10 in %s", _nc_visbuf(off))); tmp = skip_zero(off + i); if (tmp[0] == '1' && skip_zero(tmp + 1) != tmp + 1) { i = (size_t) (tmp - off); if (off[i - 1] == ';') i--; j = (size_t) (skip_zero(tmp + 1) - off); (void) chop_out(off, (unsigned) i, (unsigned) j); found = TRUE; } } } if (!found && (tmp = strstr(end, off)) != 0 && strcmp(end, off) != 0) { i = (size_t) (tmp - end); j = strlen(off); tmp = strdup(end); chop_out(tmp, (unsigned) i, (unsigned) j); free(off); result = tmp; } TR(TRACE_DATABASE, ("...adjusted sgr0 : %s", _nc_visbuf(result))); if (!strcmp(result, exit_attribute_mode)) { TR(TRACE_DATABASE, ("...same result, discard")); free(result); result = exit_attribute_mode; } } else { /* * Either the sgr does not reference alternate character set, * or it is incorrect. That's too hard to decide right now. */ free(off); } FreeIfNeeded(end); FreeIfNeeded(on); } else { /* * Possibly some applications are confused if sgr0 contains rmacs, * but that would be a different bug report -TD */ } returnPtr(result); } ncurses-6.4-20240113/ncurses/tinfo/MKkeys_list.sh0000755000000000000000000000554314177560264020056 0ustar rootroot#! /bin/sh # $Id: MKkeys_list.sh,v 1.8 2022/02/05 20:40:20 tom Exp $ ############################################################################## # Copyright 2019-2020,2022 Thomas E. Dickey # # Copyright 2001-2003,2017 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # MKkey_defs.sh -- generate list of function-keys for terminfo database # # Author: Thomas E. Dickey 2001 # # Extract function-key names from the Caps file # : ${AWK-awk} if test $# != 0 then DATA="$*" else DATA=../../include/Caps fi data=data$$ trap 'rm -f $data; exit 1' 1 2 3 15 trap 'rm -f $data' 0 cat $DATA | sed -e 's/[ ][ ]*/ /g' >$data cat < 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.122 2023/05/27 20:13:10 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))) { 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 ncurses-6.4-20240113/ncurses/tinfo/lib_tgoto.c0000644000000000000000000001447114417027054017377 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/tinfo/use_screen.c0000644000000000000000000000606213615656212017550 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/tinfo/access.c0000644000000000000000000001644314445663075016671 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,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 * ****************************************************************************/ #include #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.37 2023/06/24 21:55:09 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 /* * Limit privileges if possible; otherwise disallow access for updating files. */ NCURSES_EXPORT(FILE *) _nc_safe_fopen(const char *path, const char *mode) { FILE *result = NULL; #if HAVE_SETFSUID lower_privileges(); result = fopen(path, mode); resume_elevation(); #else if (!is_elevated() || *mode == 'r') { result = fopen(path, mode); } #endif return result; } NCURSES_EXPORT(int) _nc_safe_open3(const char *path, int flags, mode_t mode) { int result = -1; #if HAVE_SETFSUID lower_privileges(); result = open(path, flags, mode); resume_elevation(); #else if (!is_elevated() || (flags & O_RDONLY)) { result = open(path, flags, mode); } #endif return result; } #endif /* USE_ROOT_ACCESS */ ncurses-6.4-20240113/ncurses/tinfo/lib_kernel.c0000644000000000000000000001301214441075242017510 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/tinfo/make_hash.c0000644000000000000000000002765613615656212017351 0ustar rootroot/**************************************************************************** * Copyright 2018-2019,2020 Thomas E. Dickey * * Copyright 2009-2013,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 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.33 2020/02/02 23:34:34 tom Exp $") /* * _nc_make_hash_table() * * Takes the entries in table[] and hashes them into hash_table[] * by name. There are CAPTABSIZE entries in the predefined table[] * and HASHTABSIZE slots in hash_table[]. * */ #undef MODULE_ID #define MODULE_ID(id) /*nothing */ #include #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; } ncurses-6.4-20240113/ncurses/tinfo/lib_raw.c0000644000000000000000000002553414477176150017046 0ustar rootroot/**************************************************************************** * Copyright 2020,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 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.29 2023/09/09 23:14:48 tom 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_lflag |= ISIG; buf.c_cc[VMIN] = 1; buf.c_cc[VTIME] = 0; #elif defined(EXP_WIN32_DRIVER) buf.dwFlagIn |= CONMODE_NORAW; buf.dwFlagIn &= (unsigned long) ~CONMODE_NOCBREAK; #else buf.sg_flags |= CBREAK; #endif result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); if (result == OK) { if (SP_PARM) { 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 /* * Note: * this implementation may be wrong. See the comment under intrflush(). */ NCURSES_EXPORT(void) NCURSES_SP_NAME(qiflush) (NCURSES_SP_DCL0) { TERMINAL *termp; T((T_CALLED("qiflush(%p)"), (void *) SP_PARM)); if ((termp = TerminalOf(SP_PARM)) != 0) { TTY buf; int result; BEFORE("qiflush"); buf = termp->Nttyb; #ifdef TERMIOS buf.c_lflag &= (unsigned) ~(NOFLSH); result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); #else result = ERR; /* FIXME */ #endif if (result == OK) termp->Nttyb = buf; AFTER("qiflush"); } returnVoid; } #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) qiflush(void) { NCURSES_SP_NAME(qiflush) (CURRENT_SCREEN); } #endif NCURSES_EXPORT(int) NCURSES_SP_NAME(noraw) (NCURSES_SP_DCL0) { int result = ERR; TERMINAL *termp; T((T_CALLED("noraw(%p)"), (void *) SP_PARM)); if ((termp = TerminalOf(SP_PARM)) != 0) { TTY buf; BEFORE("noraw"); _nc_setmode(O_TEXT); buf = termp->Nttyb; #ifdef TERMIOS buf.c_lflag |= ISIG | ICANON | (termp->Ottyb.c_lflag & IEXTEN); buf.c_iflag |= COOKED_INPUT; #elif defined(EXP_WIN32_DRIVER) buf.dwFlagIn |= CONMODE_NORAW; #else buf.sg_flags &= ~(RAW | CBREAK); #endif result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); if (result == OK) { #if USE_KLIBC_KBD KBDINFO kbdinfo; kbdinfo.cb = sizeof(kbdinfo); KbdGetStatus(&kbdinfo, 0); kbdinfo.cb = sizeof(kbdinfo); kbdinfo.fsMask &= ~KEYBOARD_BINARY_MODE; kbdinfo.fsMask |= KEYBOARD_ASCII_MODE; KbdSetStatus(&kbdinfo, 0); #endif if (SP_PARM) { 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. We know * for certain that SVr3 intrflush() tweaks the NOFLSH bit; on the other hand, * the match (in the SVr4 man pages) between the language describing NOFLSH in * termio(7) and the language describing qiflush()/noqiflush() in * curs_inopts(3x) is too exact to be coincidence. */ NCURSES_EXPORT(int) NCURSES_SP_NAME(intrflush) (NCURSES_SP_DCLx WINDOW *win GCC_UNUSED, bool flag) { int result = ERR; TERMINAL *termp; T((T_CALLED("intrflush(%p,%d)"), (void *) SP_PARM, flag)); if (SP_PARM == 0) returnCode(ERR); if ((termp = TerminalOf(SP_PARM)) != 0) { TTY buf; BEFORE("intrflush"); buf = termp->Nttyb; #ifdef TERMIOS if (flag) buf.c_lflag &= (unsigned) ~(NOFLSH); else buf.c_lflag |= (NOFLSH); result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); #else /* FIXME */ #endif if (result == OK) { termp->Nttyb = buf; } AFTER("intrflush"); } returnCode(result); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) intrflush(WINDOW *win GCC_UNUSED, bool flag) { return NCURSES_SP_NAME(intrflush) (CURRENT_SCREEN, win, flag); } #endif #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 */ ncurses-6.4-20240113/ncurses/tinfo/lib_win32con.c0000644000000000000000000007704314463532266017720 0ustar rootroot/**************************************************************************** * Copyright 2020-2021,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: Juergen Pfeifer * * and: Thomas E. Dickey * ****************************************************************************/ /* * TODO - GetMousePos(POINT * result) from ntconio.c */ #include MODULE_ID("$Id: lib_win32con.c,v 1.14 2023/08/05 20:44:38 tom Exp $") #ifdef _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( 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 ncurses-6.4-20240113/ncurses/tinfo/lib_data.c0000644000000000000000000002607614262375451017165 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,2022 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 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.87 2022/07/09 22:03:21 tom Exp $") /* * OS/2's native linker complains if we don't initialize public data when * constructing a dll (reported by J.J.G.Ripoll). */ #if USE_REENTRANT NCURSES_EXPORT(WINDOW *) NCURSES_PUBLIC_VAR(stdscr) (void) { return CURRENT_SCREEN ? StdScreen(CURRENT_SCREEN) : 0; } NCURSES_EXPORT(WINDOW *) NCURSES_PUBLIC_VAR(curscr) (void) { return CURRENT_SCREEN ? CurScreen(CURRENT_SCREEN) : 0; } NCURSES_EXPORT(WINDOW *) NCURSES_PUBLIC_VAR(newscr) (void) { return CURRENT_SCREEN ? NewScreen(CURRENT_SCREEN) : 0; } #else NCURSES_EXPORT_VAR(WINDOW *) stdscr = 0; NCURSES_EXPORT_VAR(WINDOW *) curscr = 0; NCURSES_EXPORT_VAR(WINDOW *) newscr = 0; #endif NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain = 0; /* * The variable 'SP' will be defined as a function on systems that cannot link * data-only modules, since it is used in a lot of places within ncurses and we * cannot guarantee that any application will use any particular function. We * put the WINDOW variables in this module, because it appears that any * application that uses them will also use 'SP'. * * This module intentionally does not reference other ncurses modules, to avoid * module coupling that increases the size of the executable. */ #if BROKEN_LINKER static SCREEN *my_screen; NCURSES_EXPORT(SCREEN *) _nc_screen(void) { return my_screen; } NCURSES_EXPORT(int) _nc_alloc_screen(void) { my_screen = _nc_alloc_screen_sp(); T(("_nc_alloc_screen_sp %p", my_screen)); return (my_screen != 0); } NCURSES_EXPORT(void) _nc_set_screen(SCREEN *sp) { my_screen = sp; } #else NCURSES_EXPORT_VAR(SCREEN *) SP = NULL; /* Some linkers require initialized data... */ #endif /* *INDENT-OFF* */ #define CHARS_0s { '\0' } #define TGETENT_0 { 0L, FALSE, NULL, NULL, NULL } #define TGETENT_0s { TGETENT_0, TGETENT_0, TGETENT_0, TGETENT_0 } NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = { 0, /* have_sigtstp */ 0, /* have_sigwinch */ 0, /* cleanup_nested */ FALSE, /* init_signals */ FALSE, /* init_screen */ NULL, /* comp_sourcename */ NULL, /* comp_termtype */ FALSE, /* have_tic_directory */ FALSE, /* keep_tic_directory */ 0, /* tic_directory */ NULL, /* dbi_list */ 0, /* dbi_size */ NULL, /* first_name */ NULL, /* keyname_table */ 0, /* init_keyname */ 0, /* slk_format */ 2048, /* getstr_limit */ NULL, /* safeprint_buf */ 0, /* safeprint_used */ TGETENT_0s, /* tgetent_cache */ 0, /* tgetent_index */ 0, /* tgetent_sequence */ 0, /* terminal_count */ 0, /* dbd_blob */ 0, /* dbd_list */ 0, /* dbd_size */ 0, /* dbd_time */ { { 0, 0 } }, /* dbd_vars */ #if HAVE_TSEARCH NULL, /* cached_tparm */ 0, /* count_tparm */ #endif /* HAVE_TSEARCH */ #ifdef USE_TERM_DRIVER 0, /* term_driver */ #endif #ifndef USE_SP_WINDOWLIST 0, /* _nc_windowlist */ #endif #if USE_HOME_TERMINFO NULL, /* home_terminfo */ #endif #if !USE_SAFE_SPRINTF 0, /* safeprint_cols */ 0, /* safeprint_rows */ #endif #ifdef USE_PTHREADS PTHREAD_MUTEX_INITIALIZER, /* mutex_curses */ PTHREAD_MUTEX_INITIALIZER, /* mutex_prescreen */ PTHREAD_MUTEX_INITIALIZER, /* mutex_screen */ PTHREAD_MUTEX_INITIALIZER, /* mutex_update */ PTHREAD_MUTEX_INITIALIZER, /* mutex_tst_tracef */ PTHREAD_MUTEX_INITIALIZER, /* mutex_tracef */ 0, /* nested_tracef */ 0, /* use_pthreads */ #if USE_PTHREADS_EINTR 0, /* read_thread */ #endif #endif #if USE_WIDEC_SUPPORT CHARS_0s, /* key_name */ #endif #ifdef TRACE FALSE, /* trace_opened */ CHARS_0s, /* trace_fname */ 0, /* trace_level */ NULL, /* trace_fp */ -1, /* trace_fd */ NULL, /* tracearg_buf */ 0, /* tracearg_used */ NULL, /* tracebuf_ptr */ 0, /* tracebuf_used */ CHARS_0s, /* tracechr_buf */ NULL, /* tracedmp_buf */ 0, /* tracedmp_used */ NULL, /* tracetry_buf */ 0, /* tracetry_used */ { CHARS_0s, CHARS_0s }, /* traceatr_color_buf */ 0, /* traceatr_color_sel */ -1, /* traceatr_color_last */ #if !defined(USE_PTHREADS) && USE_REENTRANT 0, /* nested_tracef */ #endif #endif /* TRACE */ #if NO_LEAKS FALSE, /* leak_checking */ #endif }; #define STACK_FRAME_0 { { 0 }, 0 } #define STACK_FRAME_0s { STACK_FRAME_0 } #define NUM_VARS_0s { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } #define RIPOFF_0 { 0,0,0 } #define RIPOFF_0s { RIPOFF_0 } NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen = { NULL, /* allocated */ TRUE, /* use_env */ FALSE, /* filter_mode */ A_NORMAL, /* previous_attr */ { /* tparm_state */ NULL, /* tparam_base */ STACK_FRAME_0s, /* stack */ 0, /* stack_ptr */ NULL, /* out_buff */ 0, /* out_size */ 0, /* out_used */ NULL, /* fmt_buff */ 0, /* fmt_size */ NUM_VARS_0s, /* static_vars */ #ifdef TRACE NULL, /* tname */ #endif }, NULL, /* saved_tty */ FALSE, /* use_tioctl */ 0, /* _outch */ #ifndef USE_SP_RIPOFF RIPOFF_0s, /* ripoff */ NULL, /* rsp */ #endif #if NCURSES_NO_PADDING FALSE, /* flag to set if padding disabled */ #endif #if BROKEN_LINKER || USE_REENTRANT NULL, /* real_acs_map */ 0, /* LINES */ 0, /* COLS */ 8, /* TABSIZE */ 1000, /* ESCDELAY */ 0, /* cur_term */ #endif #ifdef TRACE #if BROKEN_LINKER || USE_REENTRANT 0L, /* _outchars */ NULL, /* _tputs_trace */ #endif #endif }; /* *INDENT-ON* */ /* * wgetch() and other functions with a WINDOW* parameter may use a SCREEN* * internally, and it is useful to allow those to be invoked without switching * SCREEN's, e.g., for multi-threaded applications. */ NCURSES_EXPORT(SCREEN *) _nc_screen_of(WINDOW *win) { SCREEN *sp = 0; if (win != 0) { sp = WINDOW_EXT(win, screen); } return (sp); } /******************************************************************************/ #ifdef USE_PTHREADS static void init_global_mutexes(void) { static bool initialized = FALSE; if (!initialized) { initialized = TRUE; _nc_mutex_init(&_nc_globals.mutex_curses); _nc_mutex_init(&_nc_globals.mutex_prescreen); _nc_mutex_init(&_nc_globals.mutex_screen); _nc_mutex_init(&_nc_globals.mutex_update); _nc_mutex_init(&_nc_globals.mutex_tst_tracef); _nc_mutex_init(&_nc_globals.mutex_tracef); } } NCURSES_EXPORT(void) _nc_init_pthreads(void) { if (_nc_use_pthreads) return; # if USE_WEAK_SYMBOLS if ((pthread_mutex_init) == 0) return; if ((pthread_mutex_lock) == 0) return; if ((pthread_mutex_unlock) == 0) return; if ((pthread_mutex_trylock) == 0) return; if ((pthread_mutexattr_settype) == 0) return; # endif _nc_use_pthreads = 1; init_global_mutexes(); } /* * Use recursive mutexes if we have them - they're part of Unix98. * For the cases where we do not, _nc_mutex_trylock() is used to avoid a * deadlock, at the expense of memory leaks and unexpected failures that * may not be handled by typical clients. * * FIXME - need configure check for PTHREAD_MUTEX_RECURSIVE, define it to * PTHREAD_MUTEX_NORMAL if not supported. */ NCURSES_EXPORT(void) _nc_mutex_init(pthread_mutex_t * obj) { pthread_mutexattr_t recattr; if (_nc_use_pthreads) { pthread_mutexattr_init(&recattr); pthread_mutexattr_settype(&recattr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(obj, &recattr); } } NCURSES_EXPORT(int) _nc_mutex_lock(pthread_mutex_t * obj) { int rc = 0; if (_nc_use_pthreads != 0) rc = pthread_mutex_lock(obj); return rc; } NCURSES_EXPORT(int) _nc_mutex_trylock(pthread_mutex_t * obj) { int rc = 0; if (_nc_use_pthreads != 0) rc = pthread_mutex_trylock(obj); return rc; } NCURSES_EXPORT(int) _nc_mutex_unlock(pthread_mutex_t * obj) { int rc = 0; if (_nc_use_pthreads != 0) rc = pthread_mutex_unlock(obj); return rc; } #endif /* USE_PTHREADS */ #if defined(USE_PTHREADS) || USE_PTHREADS_EINTR #if USE_WEAK_SYMBOLS /* * NB: sigprocmask(2) is global but pthread_sigmask(3p) * only for the calling thread. */ NCURSES_EXPORT(int) _nc_sigprocmask(int how, const sigset_t * newmask, sigset_t * oldmask) { if ((pthread_sigmask)) return pthread_sigmask(how, newmask, oldmask); else return (sigprocmask) (how, newmask, oldmask); } #endif #endif /* USE_PTHREADS */ ncurses-6.4-20240113/ncurses/tinfo/lib_options.c0000644000000000000000000002310714423264114017727 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/tinfo/alloc_entry.c0000644000000000000000000003023314501011314017704 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/tinfo/strings.c0000644000000000000000000001124314434462126017102 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/ncurses/tinfo/lib_win32util.c0000644000000000000000000001235314443365412020102 0ustar rootroot/**************************************************************************** * Copyright 2020-2021,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: Juergen Pfeifer * * and: Thomas E. Dickey * ****************************************************************************/ #include MODULE_ID("$Id: lib_win32util.c,v 1.4 2023/06/17 17:19:06 tom Exp $") #ifdef _NC_WINDOWS #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 ncurses-6.4-20240113/ncurses/tinfo/MKnames.awk0000644000000000000000000001651113615656212017310 0ustar rootroot############################################################################## # Copyright 2019,2020 Thomas E. Dickey # # Copyright 1998-2008,2009 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # $Id: MKnames.awk,v 1.24 2020/02/02 23:34:34 tom Exp $ function large_item(value) { result = sprintf("%d,", offset); offset = offset + length(value) + 1; offcol = offcol + length(result) + 2; if (offcol > 70) { result = result "\n"; offcol = 0; } else { result = result " "; } bigstr = bigstr sprintf("\"%s\\0\" ", value); bigcol = bigcol + length(value) + 5; if (bigcol > 70) { bigstr = bigstr "\\\n"; bigcol = 0; } return result; } function small_item(value) { return sprintf("\t\t\"%s\",\n", value); } function print_strings(name,value) { printf "DCL(%s) = {\n", name print value print "\t\t(NCURSES_CONST char *)0," print "};" print "" } function print_offsets(name,value) { printf "static const short _nc_offset_%s[] = {\n", name printf "%s", value print "};" print "" printf "static NCURSES_CONST char ** ptr_%s = 0;\n", name print "" } BEGIN { print "/* This file was generated by MKnames.awk */" print "" print "#include " 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 */" } ncurses-6.4-20240113/ncurses/tinfo/captoinfo.c0000644000000000000000000006330214114645173017376 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* * 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.102 2021/09/04 10:29:15 tom Exp $") #if 0 #define DEBUG_THIS(p) DEBUG(9, p) #else #define DEBUG_THIS(p) /* nothing */ #endif #define MAX_PUSHED 16 /* max # args we can push onto the stack */ static int stack[MAX_PUSHED]; /* the stack */ static int stackptr; /* the next empty place on the stack */ static int onstack; /* the top of stack */ static int seenm; /* seen a %m */ static int seenn; /* seen a %n */ static int seenr; /* seen a %r */ static int param; /* current parameter */ static char *dp; /* pointer to end of the converted string */ static char *my_string; static size_t my_length; static char * init_string(void) /* initialize 'my_string', 'my_length' */ { if (my_string == 0) TYPE_MALLOC(char, my_length = 256, my_string); *my_string = '\0'; return my_string; } static char * save_string(char *d, const char *const s) { size_t have = (size_t) (d - my_string); size_t need = have + strlen(s) + 2; if (need > my_length) { my_string = (char *) _nc_doalloc(my_string, my_length = (need + need)); if (my_string == 0) _nc_err_abort(MSG_NO_MEMORY); d = my_string + have; } _nc_STRCPY(d, s, my_length - have); return d + strlen(d); } static NCURSES_INLINE char * save_char(char *s, int c) { static char temp[2]; temp[0] = (char) c; return save_string(s, temp); } static void push(void) /* push onstack on to the stack */ { if (stackptr >= MAX_PUSHED) _nc_warning("string too complex to convert"); else stack[stackptr++] = onstack; } static void pop(void) /* pop the top of the stack into onstack */ { if (stackptr == 0) { if (onstack == 0) _nc_warning("I'm confused"); else onstack = 0; } else onstack = stack[--stackptr]; param++; } static int cvtchar(register const char *sp) /* convert a character to a terminfo push */ { unsigned char c = 0; int len; switch (*sp) { case '\\': switch (*++sp) { case '\'': case '$': case '\\': case '%': c = UChar(*sp); len = 2; break; case '\0': c = '\\'; len = 1; break; case '0': case '1': case '2': case '3': len = 1; while (isdigit(UChar(*sp))) { c = UChar(8 * c + (*sp++ - '0')); len++; } break; default: c = UChar(*sp); len = (c != '\0') ? 2 : 1; break; } break; case '^': len = 2; c = UChar(*++sp); if (c == '?') { c = 127; } else if (c == '\0') { len = 1; } else { c &= 0x1f; } break; default: c = UChar(*sp); len = (c != '\0') ? 1 : 0; } if (isgraph(c) && c != ',' && c != '\'' && c != '\\' && c != ':') { dp = save_string(dp, "%\'"); dp = save_char(dp, c); dp = save_char(dp, '\''); } else if (c != '\0') { dp = save_string(dp, "%{"); if (c > 99) dp = save_char(dp, c / 100 + '0'); if (c > 9) dp = save_char(dp, ((int) (c / 10)) % 10 + '0'); dp = save_char(dp, c % 10 + '0'); dp = save_char(dp, '}'); } return len; } static void getparm(int parm, int n) /* push n copies of param on the terminfo stack if not already there */ { int nn; if (seenr) { if (parm == 1) parm = 2; else if (parm == 2) parm = 1; } for (nn = 0; nn < n; ++nn) { dp = save_string(dp, "%p"); dp = save_char(dp, '0' + parm); } if (onstack == parm) { if (n > 1) { _nc_warning("string may not be optimal"); dp = save_string(dp, "%Pa"); while (n-- > 0) { dp = save_string(dp, "%ga"); } } return; } if (onstack != 0) push(); onstack = parm; if (seenn && parm < 3) { dp = save_string(dp, "%{96}%^"); } if (seenm && parm < 3) { dp = save_string(dp, "%{127}%^"); } } /* * Convert a termcap string to terminfo format. * 'cap' is the relevant terminfo capability index. * 's' is the string value of the capability. * 'parameterized' tells what type of translations to do: * % translations if 1 * pad translations if >=0 */ NCURSES_EXPORT(char *) _nc_captoinfo(const char *cap, const char *s, int const parameterized) { const char *capstart; stackptr = 0; onstack = 0; seenm = 0; seenn = 0; seenr = 0; param = 1; DEBUG_THIS(("_nc_captoinfo params %d, %s", parameterized, s)); dp = init_string(); /* skip the initial padding (if we haven't been told not to) */ capstart = 0; if (s == 0) s = ""; if (parameterized >= 0 && isdigit(UChar(*s))) for (capstart = s; *s != '\0'; s++) if (!(isdigit(UChar(*s)) || *s == '*' || *s == '.')) break; while (*s != '\0') { switch (*s) { case '%': s++; if (parameterized < 1) { dp = save_char(dp, '%'); break; } switch (*s++) { case '%': dp = save_string(dp, "%%"); break; case 'r': if (seenr++ == 1) { _nc_warning("saw %%r twice in %s", cap); } break; case 'm': if (seenm++ == 1) { _nc_warning("saw %%m twice in %s", cap); } break; case 'n': if (seenn++ == 1) { _nc_warning("saw %%n twice in %s", cap); } break; case 'i': dp = save_string(dp, "%i"); break; case '6': case 'B': getparm(param, 1); dp = save_string(dp, "%{10}%/%{16}%*"); getparm(param, 1); dp = save_string(dp, "%{10}%m%+"); break; case '8': case 'D': getparm(param, 2); dp = save_string(dp, "%{2}%*%-"); break; case '>': /* %?%{x}%>%t%{y}%+%; */ if (s[0] && s[1]) { getparm(param, 2); dp = save_string(dp, "%?"); s += cvtchar(s); dp = save_string(dp, "%>%t"); s += cvtchar(s); dp = save_string(dp, "%+%;"); } else { _nc_warning("expected two characters after %%>"); dp = save_string(dp, "%>"); } break; case 'a': if ((*s == '=' || *s == '+' || *s == '-' || *s == '*' || *s == '/') && (s[1] == 'p' || s[1] == 'c') && s[2] != '\0') { int l; l = 2; if (*s != '=') getparm(param, 1); if (s[1] == 'p') { getparm(param + s[2] - '@', 1); if (param != onstack) { pop(); param--; } l++; } else l += cvtchar(s + 2); switch (*s) { case '+': dp = save_string(dp, "%+"); break; case '-': dp = save_string(dp, "%-"); break; case '*': dp = save_string(dp, "%*"); break; case '/': dp = save_string(dp, "%/"); break; case '=': if (seenr) { if (param == 1) onstack = 2; else if (param == 2) onstack = 1; else onstack = param; } else onstack = param; break; } s += l; break; } getparm(param, 1); s += cvtchar(s); dp = save_string(dp, "%+"); break; case '+': getparm(param, 1); s += cvtchar(s); dp = save_string(dp, "%+%c"); pop(); break; case 's': #ifdef WATERLOO s += cvtchar(s); getparm(param, 1); dp = save_string(dp, "%-"); #else getparm(param, 1); dp = save_string(dp, "%s"); pop(); #endif /* WATERLOO */ break; case '-': s += cvtchar(s); getparm(param, 1); dp = save_string(dp, "%-%c"); pop(); break; case '.': getparm(param, 1); dp = save_string(dp, "%c"); pop(); break; case '0': /* not clear any of the historical termcaps did this */ if (*s == '3') { ++s; goto see03; } if (*s == '2') { ++s; goto see02; } goto invalid; case '2': see02: getparm(param, 1); dp = save_string(dp, "%2d"); pop(); break; case '3': see03: getparm(param, 1); dp = save_string(dp, "%3d"); pop(); break; case 'd': getparm(param, 1); dp = save_string(dp, "%d"); pop(); break; case 'f': param++; break; case 'b': param--; break; case '\\': dp = save_string(dp, "%\\"); break; default: invalid: dp = save_char(dp, '%'); s--; _nc_warning("unknown %% code %s (%#x) in %s", unctrl((chtype) *s), UChar(*s), cap); break; } break; default: if (*s != '\0') dp = save_char(dp, *s++); break; } } /* * Now, if we stripped off some leading padding, add it at the end * of the string as mandatory padding. */ if (capstart) { dp = save_string(dp, "$<"); for (s = capstart; *s != '\0'; s++) if (isdigit(UChar(*s)) || *s == '*' || *s == '.') dp = save_char(dp, *s); else break; dp = save_string(dp, "/>"); } (void) save_char(dp, '\0'); DEBUG_THIS(("... _nc_captoinfo %s", NonNull(my_string))); return (my_string); } /* * Check for an expression that corresponds to "%B" (BCD): * (parameter / 10) * 16 + (parameter % 10) */ static int bcd_expression(const char *str) { /* leave this non-const for HPUX */ static char fmt[] = "%%p%c%%{10}%%/%%{16}%%*%%p%c%%{10}%%m%%+"; int len = 0; char ch1, ch2; if (sscanf(str, fmt, &ch1, &ch2) == 2 && isdigit(UChar(ch1)) && isdigit(UChar(ch2)) && (ch1 == ch2)) { len = 28; #ifndef NDEBUG { char buffer[80]; int tst; _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) fmt, ch1, ch2); tst = strlen(buffer) - 1; assert(len == tst); } #endif } return len; } static char * save_tc_char(char *bufptr, int c1) { if (is7bits(c1) && isprint(c1)) { if (c1 == ':' || c1 == '\\') bufptr = save_char(bufptr, '\\'); bufptr = save_char(bufptr, c1); } else { char temp[80]; if (c1 == (c1 & 0x1f)) { /* iscntrl() returns T on 255 */ _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%.20s", unctrl((chtype) c1)); } else { _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "\\%03o", c1); } bufptr = save_string(bufptr, temp); } return bufptr; } static char * save_tc_inequality(char *bufptr, int c1, int c2) { bufptr = save_string(bufptr, "%>"); bufptr = save_tc_char(bufptr, c1); bufptr = save_tc_char(bufptr, c2); return bufptr; } /* * info-to-cap --- conversion between terminfo and termcap formats * * Here are the capabilities infotocap assumes it can translate to: * * %% output `%' * %d output value as in printf %d * %2 output value as in printf %2d * %3 output value as in printf %3d * %. output value as in printf %c * %+c add character c to value, then do %. * %>xy if value > x then add y, no output * %r reverse order of two parameters, no output * %i increment by one, no output * %n exclusive-or all parameters with 0140 (Datamedia 2500) * %B BCD (16*(value/10)) + (value%10), no output * %D Reverse coding (value - 2*(value%16)), no output (Delta Data). * %m exclusive-or all parameters with 0177 (not in 4.4BSD) */ #define octal_fixup(n, c) fixups[n].ch = ((fixups[n].ch << 3) | ((c) - '0')) /* * Convert a terminfo string to termcap format. Parameters are as in * _nc_captoinfo(). */ NCURSES_EXPORT(char *) _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameterized) { int seenone = 0, seentwo = 0, saw_m = 0, saw_n = 0; const char *padding; const char *trimmed = 0; int in0, in1, in2; char ch1 = 0, ch2 = 0; char *bufptr = init_string(); char octal[4]; int len; int digits; bool syntax_error = FALSE; int myfix = 0; struct { int ch; int offset; } fixups[MAX_TC_FIXUPS]; DEBUG_THIS(("_nc_infotocap %s params %d, %s", _nc_strict_bsd ? "strict" : "loose", parameterized, _nc_visbuf(str))); /* we may have to move some trailing mandatory padding up front */ padding = str + strlen(str) - 1; if (padding > str && *padding == '>') { if (padding > (str + 1) && *--padding == '/') --padding; while (isdigit(UChar(*padding)) || *padding == '.' || *padding == '*') padding--; if (padding > str && *padding == '<' && *--padding == '$') trimmed = padding; padding += 2; while (isdigit(UChar(*padding)) || *padding == '.' || *padding == '*') bufptr = save_char(bufptr, *padding++); } for (; !syntax_error && *str && ((trimmed == 0) || (str < trimmed)); str++) { int c1, c2; char *cp = 0; if (str[0] == '^') { if (str[1] == '\0' || (str + 1) == trimmed) { bufptr = save_string(bufptr, "\\136"); ++str; } else if (str[1] == '?') { /* * Although the 4.3BSD termcap file has an instance of "kb=^?", * that appears to be just cut/paste since neither 4.3BSD nor * 4.4BSD termcap interprets "^?" as DEL. */ bufptr = save_string(bufptr, "\\177"); ++str; } else { bufptr = save_char(bufptr, *str++); bufptr = save_char(bufptr, *str); } } else if (str[0] == ':') { bufptr = save_char(bufptr, '\\'); bufptr = save_char(bufptr, '0'); bufptr = save_char(bufptr, '7'); bufptr = save_char(bufptr, '2'); } else if (str[0] == '\\') { if (str[1] == '\0' || (str + 1) == trimmed) { bufptr = save_string(bufptr, "\\134"); ++str; } else if (str[1] == '^') { bufptr = save_string(bufptr, "\\136"); ++str; } else if (str[1] == ',') { bufptr = save_char(bufptr, *++str); } else { int xx1; bufptr = save_char(bufptr, *str++); xx1 = *str; if (_nc_strict_bsd) { if (isoctal(UChar(xx1))) { int pad = 0; int xx2; int fix = 0; if (!isoctal(UChar(str[1]))) pad = 2; else if (str[1] && !isoctal(UChar(str[2]))) pad = 1; /* * Test for "\0", "\00" or "\000" and transform those * into "\200". */ if (xx1 == '0' && ((pad == 2) || (str[1] == '0')) && ((pad >= 1) || (str[2] == '0'))) { xx2 = '2'; } else { xx2 = '0'; pad = 0; /* FIXME - optionally pad to 3 digits */ } if (myfix < MAX_TC_FIXUPS) { fix = 3 - pad; fixups[myfix].ch = 0; fixups[myfix].offset = (int) (bufptr - my_string - 1); } while (pad-- > 0) { bufptr = save_char(bufptr, xx2); if (myfix < MAX_TC_FIXUPS) { fixups[myfix].ch <<= 3; fixups[myfix].ch |= (xx2 - '0'); } xx2 = '0'; } if (myfix < MAX_TC_FIXUPS) { int n; for (n = 0; n < fix; ++n) { fixups[myfix].ch <<= 3; fixups[myfix].ch |= (str[n] - '0'); } if (fixups[myfix].ch < 32) { ++myfix; } } } else if (strchr("E\\nrtbf", xx1) == 0) { switch (xx1) { case 'e': xx1 = 'E'; break; case 'l': xx1 = 'n'; break; case 's': bufptr = save_char(bufptr, '0'); bufptr = save_char(bufptr, '4'); xx1 = '0'; break; case ':': /* * Note: termcap documentation claims that ":" * must be escaped as "\072", however the * documentation is incorrect - read the code. * The replacement does not work reliably, * so the advice is not helpful. */ bufptr = save_char(bufptr, '0'); bufptr = save_char(bufptr, '7'); xx1 = '2'; break; default: /* should not happen, but handle this anyway */ _nc_SPRINTF(octal, _nc_SLIMIT(sizeof(octal)) "%03o", UChar(xx1)); bufptr = save_char(bufptr, octal[0]); bufptr = save_char(bufptr, octal[1]); xx1 = octal[2]; break; } } } else { if (myfix < MAX_TC_FIXUPS && isoctal(UChar(xx1))) { bool will_fix = TRUE; int n; fixups[myfix].ch = 0; fixups[myfix].offset = (int) (bufptr - my_string - 1); for (n = 0; n < 3; ++n) { if (isoctal(str[n])) { octal_fixup(myfix, str[n]); } else { will_fix = FALSE; break; } } if (will_fix && (fixups[myfix].ch < 32)) ++myfix; } } bufptr = save_char(bufptr, xx1); } } else if (str[0] == '$' && str[1] == '<') { /* discard padding */ str += 2; while (isdigit(UChar(*str)) || *str == '.' || *str == '*' || *str == '/' || *str == '>') str++; --str; } else if (sscanf(str, "[%%?%%p1%%{8}%%<%%t%d%%p1%%d%%e%%p1%%{16}%%<%%t%d%%p1%%{8}%%-%%d%%e%d;5;%%p1%%d%%;m", &in0, &in1, &in2) == 3 && ((in0 == 4 && in1 == 10 && in2 == 48) || (in0 == 3 && in1 == 9 && in2 == 38))) { /* dumb-down an optimized case from xterm-256color for termcap */ if ((str = strstr(str, ";m")) == 0) break; /* cannot happen */ ++str; if (in2 == 48) { bufptr = save_string(bufptr, "[48;5;%dm"); } else { bufptr = save_string(bufptr, "[38;5;%dm"); } } else if (str[0] == '%' && str[1] == '%') { /* escaped '%' */ bufptr = save_string(bufptr, "%%"); ++str; } else if (*str != '%' || (parameterized < 1)) { bufptr = save_char(bufptr, *str); } else if (sscanf(str, "%%?%%{%d}%%>%%t%%{%d}%%+%%;", &c1, &c2) == 2) { str = strchr(str, ';'); bufptr = save_tc_inequality(bufptr, c1, c2); } else if (sscanf(str, "%%?%%{%d}%%>%%t%%'%c'%%+%%;", &c1, &ch2) == 2) { str = strchr(str, ';'); bufptr = save_tc_inequality(bufptr, c1, ch2); } else if (sscanf(str, "%%?%%'%c'%%>%%t%%{%d}%%+%%;", &ch1, &c2) == 2) { str = strchr(str, ';'); bufptr = save_tc_inequality(bufptr, ch1, c2); } else if (sscanf(str, "%%?%%'%c'%%>%%t%%'%c'%%+%%;", &ch1, &ch2) == 2) { str = strchr(str, ';'); bufptr = save_tc_inequality(bufptr, ch1, ch2); } else if ((len = bcd_expression(str)) != 0) { str += len; bufptr = save_string(bufptr, "%B"); } else if ((sscanf(str, "%%{%d}%%+%%%c", &c1, &ch2) == 2 || sscanf(str, "%%'%c'%%+%%%c", &ch1, &ch2) == 2) && ch2 == 'c' && (cp = strchr(str, '+'))) { str = cp + 2; bufptr = save_string(bufptr, "%+"); if (ch1) c1 = ch1; bufptr = save_tc_char(bufptr, c1); } /* FIXME: this "works" for 'delta' */ else if (strncmp(str, "%{2}%*%-", (size_t) 8) == 0) { str += 7; bufptr = save_string(bufptr, "%D"); } else if (strncmp(str, "%{96}%^", (size_t) 7) == 0) { str += 6; if (saw_m++ == 0) { bufptr = save_string(bufptr, "%n"); } } else if (strncmp(str, "%{127}%^", (size_t) 8) == 0) { str += 7; if (saw_n++ == 0) { bufptr = save_string(bufptr, "%m"); } } else { /* cm-style format element */ str++; switch (*str) { case '%': bufptr = save_char(bufptr, '%'); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': bufptr = save_char(bufptr, '%'); ch1 = 0; ch2 = 0; digits = 0; while (isdigit(UChar(*str))) { if (++digits > 2) { syntax_error = TRUE; break; } ch2 = ch1; ch1 = *str++; if (digits == 2 && ch2 != '0') { syntax_error = TRUE; break; } else if (_nc_strict_bsd) { if (ch1 > '3') { syntax_error = TRUE; break; } } else { bufptr = save_char(bufptr, ch1); } } if (syntax_error) break; /* * Convert %02 to %2 and %03 to %3 */ if (ch2 == '0' && !_nc_strict_bsd) { ch2 = 0; bufptr[-2] = bufptr[-1]; *--bufptr = 0; } if (_nc_strict_bsd) { if (ch2 != 0 && ch2 != '0') { syntax_error = TRUE; } else if (ch1 < '2') { ch1 = 'd'; } bufptr = save_char(bufptr, ch1); } if (strchr("oxX.", *str)) { syntax_error = TRUE; /* termcap doesn't have octal, hex */ } break; case 'd': bufptr = save_string(bufptr, "%d"); break; case 'c': bufptr = save_string(bufptr, "%."); break; /* * %s isn't in termcap, but it is convenient to pass it through * so we can represent things like terminfo pfkey strings in * termcap notation. */ case 's': if (_nc_strict_bsd) { syntax_error = TRUE; } else { bufptr = save_string(bufptr, "%s"); } break; case 'p': str++; if (*str == '1') seenone = 1; else if (*str == '2') { if (!seenone && !seentwo) { bufptr = save_string(bufptr, "%r"); seentwo++; } } else if (*str >= '3') { syntax_error = TRUE; } break; case 'i': bufptr = save_string(bufptr, "%i"); break; default: bufptr = save_char(bufptr, *str); syntax_error = TRUE; break; } /* endswitch (*str) */ } /* endelse (*str == '%') */ /* * 'str' always points to the end of what was scanned in this step, * but that may not be the end of the string. */ assert(str != 0); if (str == 0 || *str == '\0') break; } /* endwhile (*str) */ if (!syntax_error && myfix > 0 && ((int) strlen(my_string) - (4 * myfix)) < MIN_TC_FIXUPS) { while (--myfix >= 0) { char *p = fixups[myfix].offset + my_string; *p++ = '^'; *p++ = (char) (fixups[myfix].ch | '@'); while ((p[0] = p[2]) != '\0') { ++p; } } } DEBUG_THIS(("... _nc_infotocap %s", syntax_error ? "" : _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 ncurses-6.4-20240113/ncurses/tinfo/entries.c0000644000000000000000000001360014434462126017061 0ustar rootroot/**************************************************************************** * Copyright 2019-2022,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 * * and: Juergen Pfeifer * ****************************************************************************/ #include #include #include MODULE_ID("$Id: entries.c,v 1.35 2023/05/27 20:13:10 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, 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); } ncurses-6.4-20240113/ncurses/tinfo/add_tries.c0000644000000000000000000001022314445606555017354 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/SigAction.h0000644000000000000000000000765213615656212016171 0ustar rootroot/**************************************************************************** * 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) */ ncurses-6.4-20240113/ncurses/build.priv.h0000644000000000000000000000753613615656212016370 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/llib-ltinfo0000644000000000000000000006775514465752515016317 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/llib-ltinfow0000644000000000000000000007224214465752557016477 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/llib-ltict0000644000000000000000000001253014465753133016115 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/llib-lticw0000644000000000000000000001253314465753133016123 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/new_pair.h0000644000000000000000000001200014123410101016050 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2021 Thomas E. Dickey * * Copyright 2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey * ****************************************************************************/ /* * Common type definitions and macros for new_pair.c, lib_color.c * * $Id: new_pair.h,v 1.13 2021/09/24 17:52:01 tom Exp $ */ #ifndef NEW_PAIR_H #define NEW_PAIR_H 1 /* *INDENT-OFF* */ #include #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_COLORS extern NCURSES_EXPORT(void) _nc_copy_pairs(SCREEN*, colorpair_t*, colorpair_t*, int); extern NCURSES_EXPORT(void) _nc_free_ordered_pairs(SCREEN*); extern NCURSES_EXPORT(void) _nc_reset_color_pair(SCREEN*, int, colorpair_t*); extern NCURSES_EXPORT(void) _nc_set_color_pair(SCREEN*, int, int); #else #define _nc_free_ordered_pairs(sp) /* nothing */ #define _nc_reset_color_pair(sp, pair, data) /* nothing */ #define _nc_set_color_pair(sp, pair, mode) /* nothing */ #endif #else typedef struct _color_pairs colorpair_t; #endif /* NEW_PAIR_INTERNAL */ #if NO_LEAKS extern NCURSES_EXPORT(void) _nc_new_pair_leaks(SCREEN*); #endif /* *INDENT-ON* */ #endif /* NEW_PAIR_H */ ncurses-6.4-20240113/ncurses/README0000644000000000000000000000633513615656212015015 0ustar rootroot------------------------------------------------------------------------------- -- 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 ncurses-6.4-20240113/ncurses/modules0000644000000000000000000002634213727206064015530 0ustar rootroot# $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 ncurses-6.4-20240113/ncurses/Makefile.in0000644000000000000000000002771314316033353016177 0ustar rootroot# $Id: Makefile.in,v 1.183 2022/10/01 12:47:39 tom Exp $ ############################################################################## # Copyright 2018-2021,2022 Thomas E. Dickey # # Copyright 1998-2017,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1996-on # # Makefile for ncurses source code. # # This makes the following: # programs # includes # libraries (normal/debug/profile/shared) # # The variable 'srcdir' refers to the source-distribution, and can be set with # the configure script by "--srcdir=DIR". # # The rules are organized to produce the libraries for the configured models, # and the programs with the configured default model. # turn off _all_ suffix rules; we'll generate our own .SUFFIXES: SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile TOP_MFLAGS = @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" RPATH_LIST="$(RPATH_LIST)" @SET_MAKE@ x = @EXEEXT@ o = .@OBJEXT@ MODEL = @DFT_LWR_MODEL@ DESTDIR = @DESTDIR@ top_srcdir = @top_srcdir@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ datarootdir = @datarootdir@ datadir = @datadir@ includesubdir = @includesubdir@ INCLUDEDIR = $(DESTDIR)$(includedir)$(includesubdir) PACKAGE = @PACKAGE@ LIBTOOL = @LIBTOOL@ LIBTOOL_OPTS = @LIBTOOL_OPTS@ @EXPORT_SYMS@ LIBTOOL_CLEAN = @LIB_CLEAN@ LIBTOOL_COMPILE = @LIB_COMPILE@ LIBTOOL_LINK = @LIB_LINK@ LIBTOOL_INSTALL = @LIB_INSTALL@ LIBTOOL_UNINSTALL = @LIB_UNINSTALL@ LT_UNDEF = @LT_UNDEF@ INSTALL = @INSTALL@ INSTALL_LIB = @INSTALL@ @INSTALL_LIB@ INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ INSTALL_DATA = @INSTALL_DATA@ AR = @AR@ ARFLAGS = @ARFLAGS@ AWK = @AWK@ LD = @LD@ LN_S = @LN_S@ NM = @NM@ CTAGS = @CTAGS@ ETAGS = @ETAGS@ CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ LIBS = @LIBS@ INCDIR = $(srcdir)/../include CPPFLAGS = -DHAVE_CONFIG_H -DBUILDING_NCURSES -I../ncurses @CPPFLAGS@ CCFLAGS = $(CPPFLAGS) $(CFLAGS) BUILD_CPPFLAGS = -DHAVE_CONFIG_H -DUSE_BUILD_CC -I../ncurses -I$(srcdir) -I../include -I$(INCDIR) @BUILD_CPPFLAGS@ BUILD_CC = @BUILD_CC@ BUILD_CCFLAGS = @BUILD_CFLAGS@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ BUILD_LIBS = @BUILD_LIBS@ # The executables built in this directory are used for generating source that # is compiled into the build, or are test-programs that are not installed. BUILD_EXEEXT = @BUILD_EXEEXT@ x = @EXEEXT@ CFLAGS_LIBTOOL = $(CCFLAGS) CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) LINK = $(LIBTOOL) LDFLAGS = @LDFLAGS@ @LD_MODEL@ SHLIB_DIRS = -L../lib SHLIB_LIST = $(SHLIB_DIRS) @SHLIB_LIST@ @LIBS@ TINFO_LIST = $(SHLIB_DIRS) @TINFO_LIST@ @LIBS@ TICS_LIST = $(SHLIB_DIRS) @TICS_LIST@ @LIBS@ RPATH_LIST = @RPATH_LIST@ RESULTING_SYMS = @RESULTING_SYMS@ VERSIONED_SYMS = @VERSIONED_SYMS@ MK_SHARED_LIB = @MK_SHARED_LIB@ NCURSES_MAJOR = @NCURSES_MAJOR@ NCURSES_MINOR = @NCURSES_MINOR@ REL_VERSION = @cf_cv_rel_version@ ABI_VERSION = @cf_cv_abi_version@ RANLIB = @LIB_PREP@ LIBRARIES = @Libs_To_Make@ LINT = @LINT@ LINT_OPTS = @LINT_OPTS@ LINT_LIBS = -lncurses @LIBS@ FALLBACK_LIST = @FALLBACK_LIST@ USE_BIG_STRINGS = @USE_BIG_STRINGS@ TERMINFO_CAPS = $(top_srcdir)/include/@TERMINFO_CAPS@ CAPLIST = $(TERMINFO_CAPS) $(top_srcdir)/include/Caps-ncurses TERMINFO = @TERMINFO@ TERMINFO_SRC = @TERMINFO_SRC@ TIC_PATH = @TIC@ INFOCMP_PATH = @INFOCMP@ AUTO_SRC = \ ./codes.c \ ./comp_captab.c \ ./comp_userdefs.c \ ./expanded.c \ ./fallback.c \ ./lib_gen.c \ ./lib_keyname.c \ ./link_test.c \ ./names.c \ ./unctrl.c \ init_keytry.h \ keys.list HEADER_DEPS = @INTERNALS_HDR@ \ ../include/ncurses_cfg.h \ ../include/ncurses_def.h \ ../include/ncurses_dll.h \ ../include/curses.h \ ../include/term.h \ ../include/unctrl.h \ $(INCDIR)/nc_alloc.h \ $(INCDIR)/nc_panel.h \ $(INCDIR)/nc_string.h \ $(INCDIR)/nc_termios.h \ $(INCDIR)/nc_tparm.h \ $(INCDIR)/nc_win32.h \ $(INCDIR)/term_entry.h \ $(srcdir)/curses.priv.h \ $(srcdir)/new_pair.h \ $(srcdir)/term.priv.h TEST_DEPS = ../lib/@LIB_PREFIX@ncurses@DFT_DEP_SUFFIX@ TEST_ARGS = @LDFLAGS_STATIC@ @TEST_ARGS@ @LDFLAGS_SHARED@ TEST_LDFLAGS = @LD_MODEL@ $(TEST_ARGS) @LIBS@ @LOCAL_LDFLAGS@ @LDFLAGS@ TEST_PROGS = \ captoinfo$x \ hardscroll$x \ hashmap$x \ lib_mvcur$x \ link_test$x \ report_hashing$x LOCAL_LIBDIR = @top_builddir@/lib base = $(srcdir)/base serial = $(srcdir)/tty tinfo = $(srcdir)/tinfo trace = $(srcdir)/trace wide = $(srcdir)/widechar win32con = $(srcdir)/win32con ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : check @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : test_progs all libs :: $(AUTO_SRC) ../lib $(LIBRARIES) @CHECK_BUILD@all libs :: report_offsets$(BUILD_EXEEXT) sources: $(AUTO_SRC) $(DESTDIR)$(bindir) \ $(DESTDIR)$(libdir) : mkdir -p $@ ../lib : ; mkdir $@ ./fallback.c : $(tinfo)/MKfallback.sh $(SHELL) -e $(tinfo)/MKfallback.sh $(TERMINFO) $(TERMINFO_SRC) "$(TIC_PATH)" "$(INFOCMP_PATH)" $(FALLBACK_LIST) >$@ ./lib_gen.c : $(base)/MKlib_gen.sh ../include/curses.h FGREP="@FGREP@" $(SHELL) -e $(base)/MKlib_gen.sh "$(CPP) $(CPPFLAGS)" "$(AWK)" generated <../include/curses.h >$@ init_keytry.h : make_keys$(BUILD_EXEEXT) keys.list ./make_keys$(BUILD_EXEEXT) keys.list > $@ keys.list : $(tinfo)/MKkeys_list.sh AWK=$(AWK) $(SHELL) $(tinfo)/MKkeys_list.sh $(CAPLIST) | LC_ALL=C sort >$@ make_keys$(BUILD_EXEEXT) : \ build.priv.h \ $(tinfo)/make_keys.c \ ./names.c $(BUILD_CC) -o $@ $(BUILD_CPPFLAGS) $(BUILD_CCFLAGS) $(tinfo)/make_keys.c $(BUILD_LDFLAGS) $(BUILD_LIBS) make_hash$(BUILD_EXEEXT) : \ build.priv.h \ $(tinfo)/make_hash.c \ ../include/hashsize.h $(BUILD_CC) -o $@ $(BUILD_CPPFLAGS) $(BUILD_CCFLAGS) $(tinfo)/make_hash.c $(BUILD_LDFLAGS) $(BUILD_LIBS) report_offsets$(BUILD_EXEEXT) : \ $(srcdir)/curses.priv.h \ $(srcdir)/report_offsets.c $(BUILD_CC) -o $@ $(BUILD_CPPFLAGS) $(BUILD_CCFLAGS) $(srcdir)/report_offsets.c $(BUILD_LDFLAGS) $(BUILD_LIBS) ./report_offsets$(BUILD_EXEEXT) ./expanded.c : $(srcdir)/curses.priv.h $(serial)/MKexpanded.sh $(SHELL) -e $(serial)/MKexpanded.sh "$(CPP)" $(CPPFLAGS) > $@ ./comp_captab.c: \ make_hash$(BUILD_EXEEXT) \ ../include/hashsize.h \ $(tinfo)/MKcaptab.sh \ $(tinfo)/MKcaptab.awk $(SHELL) -e $(tinfo)/MKcaptab.sh $(AWK) $(USE_BIG_STRINGS) $(tinfo)/MKcaptab.awk $(CAPLIST) > $@ ./comp_userdefs.c: \ make_hash$(BUILD_EXEEXT) \ ../include/hashsize.h \ $(tinfo)/MKuserdefs.sh $(SHELL) -e $(tinfo)/MKuserdefs.sh $(AWK) $(USE_BIG_STRINGS) $(CAPLIST) > $@ ./lib_keyname.c: keys.list $(base)/MKkeyname.awk $(AWK) -f $(base)/MKkeyname.awk bigstrings=$(USE_BIG_STRINGS) keys.list > $@ ./codes.c: $(tinfo)/MKcodes.awk $(AWK) -f $(tinfo)/MKcodes.awk bigstrings=$(USE_BIG_STRINGS) $(CAPLIST) >$@ ./names.c: $(tinfo)/MKnames.awk $(AWK) -f $(tinfo)/MKnames.awk bigstrings=$(USE_BIG_STRINGS) $(CAPLIST) >$@ ./unctrl.c: $(base)/MKunctrl.awk echo | $(AWK) -f $(base)/MKunctrl.awk bigstrings=$(USE_BIG_STRINGS) >$@ tags: $(CTAGS) *.[ch] */*.[ch] @MAKE_UPPER_TAGS@TAGS: @MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] */*.[ch] mostlyclean :: -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac -test -d trace || rm -f trace -rm -f $(TEST_PROGS) clean :: mostlyclean -rm -f $(AUTO_SRC) -rm -f make_keys$(BUILD_EXEEXT) -rm -f make_hash$(BUILD_EXEEXT) -rm -f report_offsets$(BUILD_EXEEXT) -rm -rf .libs *.dSYM *.map distclean :: clean -rm -f Makefile realclean :: distclean # These rules are used to allow "make -n" to work on a clean directory-tree ../include/hashsize.h \ ../include/parametrized.h \ ../include/term.h : ( cd ../include && $(MAKE) $(TOP_MFLAGS) ) # These rules build test-programs for the modules that have test-drivers @MAKE_PHONY@.PHONY : test_progs test_progs : $(TEST_PROGS) ./link_test.c : $(base)/MKlib_gen.sh ../include/curses.h FGREP="@FGREP@" $(SHELL) -e $(base)/MKlib_gen.sh "$(CPP) $(CPPFLAGS)" "$(AWK)" implemented <../include/curses.h >$@ captoinfo$x : $(tinfo)/captoinfo.c $(TEST_DEPS) @ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DMAIN $(tinfo)/captoinfo.c $(TEST_LDFLAGS) hardscroll$x : $(serial)/hardscroll.c $(TEST_DEPS) @ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DSCROLLDEBUG $(serial)/hardscroll.c $(TEST_LDFLAGS) hashmap$x : $(serial)/hashmap.c $(serial)/hardscroll.c $(TEST_DEPS) @ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DHASHDEBUG $(serial)/hashmap.c $(serial)/hardscroll.c $(TEST_LDFLAGS) lib_mvcur$x : $(serial)/lib_mvcur.c $(TEST_DEPS) \ ../@DFT_OBJ_SUBDIR@/dump_entry$o @ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DNCURSES_TEST -I$(serial)/../../progs $(serial)/lib_mvcur.c ../@DFT_OBJ_SUBDIR@/dump_entry$o $(TEST_LDFLAGS) link_test$x : ./link_test.c $(TEST_DEPS) \ ../@DFT_OBJ_SUBDIR@/link_test$o @ECHO_LD@ $(CC) -o $@ $(CFLAGS_DEFAULT) ../@DFT_OBJ_SUBDIR@/link_test$o $(TEST_LDFLAGS) ../@DFT_OBJ_SUBDIR@/dump_entry$o: ( cd ../progs && $(MAKE) ../@DFT_OBJ_SUBDIR@/dump_entry$o ) report_hashing$x : \ $(srcdir)/curses.priv.h \ $(srcdir)/report_hashing.c $(TEST_DEPS) @ECHO_LD@ $(CC) -o $@ $(CFLAGS_DEFAULT) report_hashing.c $(TEST_LDFLAGS) # Verify that each header-file can be compiled without including another. @MAKE_PHONY@.PHONY : check_headers check_headers: @$(SHELL) -c "for header in *.h;\ do \ echo \"** testing \$${header}\" ; \ echo \"#include <\$${header}>\" >headers.c; \ echo \"int main(void) { return 0; }\" >>headers.c; \ $(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \ done" -@rm -f headers.* @MAKE_PHONY@.PHONY : check_objects check_objects: test_progs check :: check_headers check_objects ############################################################################### # The remainder of this file is automatically generated during configuration ############################################################################### ncurses-6.4-20240113/ncurses/trace/0000755000000000000000000000000014445610231015215 5ustar rootrootncurses-6.4-20240113/ncurses/trace/lib_tracechr.c0000644000000000000000000000743113615656212020016 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 1998-2009,2012 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 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.23 2020/02/02 23:34:34 tom Exp $") #ifdef TRACE #define MyBufSize sizeof(_nc_globals.tracechr_buf) NCURSES_EXPORT(char *) _nc_tracechar(SCREEN *sp, int ch) { NCURSES_CONST char *name; char *MyBuffer = ((sp != 0) ? sp->tracechr_buf : _nc_globals.tracechr_buf); if (ch > KEY_MIN || ch < 0) { name = safe_keyname(SP_PARM, ch); if (name == 0 || *name == '\0') name = "NULL"; _nc_SPRINTF(MyBuffer, _nc_SLIMIT(MyBufSize) "'%.30s' = %#03o", name, ch); } else if (!is8bits(ch) || !isprint(UChar(ch))) { /* * workaround for glibc bug: * sprintf changes the result from unctrl() to an empty string if it * does not correspond to a valid multibyte sequence. */ _nc_SPRINTF(MyBuffer, _nc_SLIMIT(MyBufSize) "%#03o", ch); } else { name = safe_unctrl(SP_PARM, (chtype) ch); if (name == 0 || *name == 0) name = "null"; /* shouldn't happen */ _nc_SPRINTF(MyBuffer, _nc_SLIMIT(MyBufSize) "'%.30s' = %#03o", name, ch); } return (MyBuffer); } NCURSES_EXPORT(char *) _tracechar(int ch) { return _nc_tracechar(CURRENT_SCREEN, ch); } #else EMPTY_MODULE(_nc_lib_tracechr) #endif ncurses-6.4-20240113/ncurses/trace/lib_tracemse.c0000644000000000000000000001307413615656212020026 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/trace/trace_tries.c0000644000000000000000000000676513615656212017712 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/trace/lib_tracebits.c0000644000000000000000000001746313754065143020212 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/trace/visbuf.c0000644000000000000000000002335014434462126016670 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/trace/trace_xnames.c0000644000000000000000000000700713615656212020045 0ustar rootroot/**************************************************************************** * 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 } ncurses-6.4-20240113/ncurses/trace/trace_buf.c0000644000000000000000000001027114445570625017330 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/trace/varargs.c0000644000000000000000000001332714445571232017043 0ustar rootroot/**************************************************************************** * Copyright 2020,2023 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.13 2023/06/24 13:41:46 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 == '%') { 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 ncurses-6.4-20240113/ncurses/trace/README0000644000000000000000000000476713615656212016122 0ustar rootroot------------------------------------------------------------------------------- -- 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. ncurses-6.4-20240113/ncurses/trace/lib_trace.c0000644000000000000000000003015514434663616017326 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* * 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.103 2023/05/28 14:39:10 tom Exp $") NCURSES_EXPORT_VAR(unsigned) _nc_tracing = 0; /* always define this */ #ifdef TRACE #if USE_REENTRANT NCURSES_EXPORT(const char *) NCURSES_PUBLIC_VAR(_nc_tputs_trace) (void) { return CURRENT_SCREEN ? CURRENT_SCREEN->_tputs_trace : _nc_prescreen._tputs_trace; } NCURSES_EXPORT(long) NCURSES_PUBLIC_VAR(_nc_outchars) (void) { return CURRENT_SCREEN ? CURRENT_SCREEN->_outchars : _nc_prescreen._outchars; } NCURSES_EXPORT(void) _nc_set_tputs_trace(const char *s) { if (CURRENT_SCREEN) CURRENT_SCREEN->_tputs_trace = s; else _nc_prescreen._tputs_trace = s; } NCURSES_EXPORT(void) _nc_count_outchars(long increment) { if (CURRENT_SCREEN) CURRENT_SCREEN->_outchars += increment; else _nc_prescreen._outchars += increment; } #else NCURSES_EXPORT_VAR(const char *) _nc_tputs_trace = ""; NCURSES_EXPORT_VAR(long) _nc_outchars = 0; #endif #define MyFP _nc_globals.trace_fp #define MyFD _nc_globals.trace_fd #define MyInit _nc_globals.trace_opened #define MyPath _nc_globals.trace_fname #define MyLevel _nc_globals.trace_level #define MyNested _nc_globals.nested_tracef #endif /* TRACE */ #if USE_REENTRANT #define Locked(statement) \ 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 { if (MyPath[0] == '\0') { size_t size = sizeof(MyPath) - 12; if (getcwd(MyPath, size) == 0) { perror("curses: Can't get working directory"); exit(EXIT_FAILURE); } MyPath[size] = '\0'; assert(strlen(MyPath) <= size); _nc_STRCAT(MyPath, "/trace", sizeof(MyPath)); if (_nc_is_dir_path(MyPath)) { _nc_STRCAT(MyPath, ".log", sizeof(MyPath)); } } #define SAFE_MODE (O_CREAT | O_EXCL | O_RDWR) if (_nc_access(MyPath, W_OK) < 0 || (MyFD = safe_open3(MyPath, SAFE_MODE, 0600)) < 0 || (MyFP = fdopen(MyFD, BIN_W)) == 0) { ; /* EMPTY */ } } Locked(_nc_tracing = tracelevel); /* Try to set line-buffered mode, or (failing that) unbuffered, * so that the trace-output gets flushed automatically at the * end of each line. This is useful in case the program dies. */ if (MyFP != 0) { #if HAVE_SETVBUF /* ANSI */ (void) setvbuf(MyFP, (char *) 0, _IOLBF, (size_t) 0); #elif HAVE_SETBUF /* POSIX */ (void) setbuffer(MyFP, (char *) 0); #endif } _tracef("TRACING NCURSES version %s.%d (tracelevel=%#x)", NCURSES_VERSION, NCURSES_VERSION_PATCH, tracelevel); #define SPECIAL_MASK(mask) \ if ((tracelevel & mask) == mask) \ _tracef("- %s (%u)", #mask, mask) for (bit = 0; bit < TRACE_SHIFT; ++bit) { unsigned mask = (1U << bit) & tracelevel; if ((mask & trace_names[bit].mask) != 0) { _tracef("- %s (%u)", trace_names[bit].name, mask); } } SPECIAL_MASK(TRACE_MAXIMUM); else SPECIAL_MASK(TRACE_ORDINARY); if (tracelevel > TRACE_MAXIMUM) { _tracef("- DEBUG_LEVEL(%u)", tracelevel >> TRACE_SHIFT); } } else if (tracelevel == 0) { if (MyFP != 0) { MyFD = dup(MyFD); /* allow reopen of same file */ fclose(MyFP); MyFP = 0; } Locked(_nc_tracing = tracelevel); } else if (_nc_tracing != tracelevel) { Locked(_nc_tracing = tracelevel); _tracef("tracelevel=%#x", tracelevel); } #else (void) tracelevel; result = 0; #endif return result; } #if defined(TRACE) NCURSES_EXPORT(void) trace(const unsigned int tracelevel) { curses_trace(tracelevel); } static void _nc_va_tracef(const char *fmt, va_list ap) { static const char Called[] = T_CALLED(""); static const char Return[] = T_RETURN(""); bool before = FALSE; bool after = FALSE; unsigned doit = _nc_tracing; int save_err = errno; FILE *fp = MyFP; #ifdef TRACE /* verbose-trace in the command-line utilities relies on this */ if (fp == 0 && !MyInit && _nc_tracing >= DEBUG_LEVEL(1)) fp = stderr; #endif if (strlen(fmt) >= sizeof(Called) - 1) { if (!strncmp(fmt, Called, sizeof(Called) - 1)) { before = TRUE; MyLevel++; } else if (!strncmp(fmt, Return, sizeof(Return) - 1)) { after = TRUE; } if (before || after) { if ((MyLevel <= 1) || (doit & TRACE_ICALLS) != 0) doit &= (TRACE_CALLS | TRACE_CCALLS); else doit = 0; } } if (doit != 0 && fp != 0) { #ifdef USE_PTHREADS /* * TRACE_ICALLS is "really" needed to show normal use with threaded * applications, since anything can be running during a napms(), * making it appear in the hierarchical trace as it other functions * are being called. * * Rather than add the complication of a per-thread stack, just * show the thread-id in each line of the trace. */ # if USE_WEAK_SYMBOLS if ((pthread_self)) # endif fprintf(fp, "%#" PRIxPTR ":", #ifdef _NC_WINDOWS 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 */ ncurses-6.4-20240113/ncurses/trace/lib_traceatr.c0000644000000000000000000002737714251214770020037 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2022 Thomas E. Dickey * * Copyright 1998-2017,2018 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas Dickey 1996-on * * and: Zeyd M. Ben-Halim 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.95 2022/06/11 22:40:56 tom Exp $") #define COLOR_OF(c) ((c < 0) ? "default" : (c > 7 ? color_of(c) : colors[c].name)) #define TRACE_BUF_SIZE(num) (_nc_globals.tracebuf_ptr[num].size) #define COLOR_BUF_SIZE(num) (sizeof(my_buffer[num])) #ifdef TRACE static const char l_brace[] = StringOf(L_BRACE); static const char r_brace[] = StringOf(R_BRACE); #ifndef USE_TERMLIB #define my_buffer _nc_globals.traceatr_color_buf #define my_select _nc_globals.traceatr_color_sel #define my_cached _nc_globals.traceatr_color_last static char * color_of(int c) { if (c != my_cached) { my_cached = c; my_select = !my_select; if (isDefaultColor(c)) _nc_STRCPY(my_buffer[my_select], "default", COLOR_BUF_SIZE(my_select)); else _nc_SPRINTF(my_buffer[my_select], _nc_SLIMIT(COLOR_BUF_SIZE(my_select)) "color%d", c); } return my_buffer[my_select]; } #undef my_buffer #undef my_select #endif /* !USE_TERMLIB */ NCURSES_EXPORT(char *) _traceattr2(int bufnum, chtype newmode) { #define DATA(name) { name, { #name } } static const struct { unsigned int val; const char name[14]; } names[] = { DATA(A_STANDOUT), DATA(A_UNDERLINE), DATA(A_REVERSE), DATA(A_BLINK), DATA(A_DIM), DATA(A_BOLD), DATA(A_ALTCHARSET), DATA(A_INVIS), DATA(A_PROTECT), DATA(A_CHARTEXT), DATA(A_NORMAL), DATA(A_COLOR), #if USE_ITALIC DATA(A_ITALIC), #endif } #ifndef USE_TERMLIB , colors[] = { DATA(COLOR_BLACK), DATA(COLOR_RED), DATA(COLOR_GREEN), DATA(COLOR_YELLOW), DATA(COLOR_BLUE), DATA(COLOR_MAGENTA), DATA(COLOR_CYAN), DATA(COLOR_WHITE), } #endif /* !USE_TERMLIB */ ; #undef DATA char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ); if (result != 0) { size_t n; unsigned save_nc_tracing = _nc_tracing; _nc_tracing = 0; _nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum)); for (n = 0; n < SIZEOF(names); n++) { if ((newmode & names[n].val) != 0) { if (result[1] != '\0') (void) _nc_trace_bufcat(bufnum, "|"); result = _nc_trace_bufcat(bufnum, names[n].name); if (names[n].val == A_COLOR) { char temp[80]; short pairnum = (short) PairNumber(newmode); #ifdef USE_TERMLIB /* pair_content lives in libncurses */ _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "{%d}", pairnum); #else NCURSES_COLOR_T fg, bg; if (pair_content(pairnum, &fg, &bg) == OK) { _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "{%d = {%s, %s}}", pairnum, COLOR_OF(fg), COLOR_OF(bg)); } else { _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "{%d}", pairnum); } #endif result = _nc_trace_bufcat(bufnum, temp); } } } if (ChAttrOf(newmode) == A_NORMAL) { if (result != 0 && result[1] != '\0') (void) _nc_trace_bufcat(bufnum, "|"); (void) _nc_trace_bufcat(bufnum, "A_NORMAL"); } _nc_tracing = save_nc_tracing; result = _nc_trace_bufcat(bufnum, r_brace); } return result; } NCURSES_EXPORT(char *) _traceattr(attr_t newmode) { return _traceattr2(0, newmode); } /* Trace 'int' return-values */ NCURSES_EXPORT(int) _nc_retrace_int_attr_t(attr_t code) { T((T_RETURN("%s"), _traceattr(code))); return (int) code; } /* Trace 'attr_t' return-values */ NCURSES_EXPORT(attr_t) _nc_retrace_attr_t(attr_t code) { T((T_RETURN("%s"), _traceattr(code))); return code; } const char * _nc_altcharset_name(attr_t attr, chtype ch) { #define DATA(code, name) { code, { #name } } typedef struct { unsigned int val; const char name[13]; } ALT_NAMES; #if NCURSES_SP_FUNCS SCREEN *sp = CURRENT_SCREEN; #endif static const ALT_NAMES names[] = { DATA('l', ACS_ULCORNER), /* upper left corner */ DATA('m', ACS_LLCORNER), /* lower left corner */ DATA('k', ACS_URCORNER), /* upper right corner */ DATA('j', ACS_LRCORNER), /* lower right corner */ DATA('t', ACS_LTEE), /* tee pointing right */ DATA('u', ACS_RTEE), /* tee pointing left */ DATA('v', ACS_BTEE), /* tee pointing up */ DATA('w', ACS_TTEE), /* tee pointing down */ DATA('q', ACS_HLINE), /* horizontal line */ DATA('x', ACS_VLINE), /* vertical line */ DATA('n', ACS_PLUS), /* large plus or crossover */ DATA('o', ACS_S1), /* scan line 1 */ DATA('s', ACS_S9), /* scan line 9 */ DATA('`', ACS_DIAMOND), /* diamond */ DATA('a', ACS_CKBOARD), /* checker board (stipple) */ DATA('f', ACS_DEGREE), /* degree symbol */ DATA('g', ACS_PLMINUS), /* plus/minus */ DATA('~', ACS_BULLET), /* bullet */ DATA(',', ACS_LARROW), /* arrow pointing left */ DATA('+', ACS_RARROW), /* arrow pointing right */ DATA('.', ACS_DARROW), /* arrow pointing down */ DATA('-', ACS_UARROW), /* arrow pointing up */ DATA('h', ACS_BOARD), /* board of squares */ DATA('i', ACS_LANTERN), /* lantern symbol */ DATA('0', ACS_BLOCK), /* solid square block */ DATA('p', ACS_S3), /* scan line 3 */ DATA('r', ACS_S7), /* scan line 7 */ DATA('y', ACS_LEQUAL), /* less/equal */ DATA('z', ACS_GEQUAL), /* greater/equal */ DATA('{', ACS_PI), /* Pi */ DATA('|', ACS_NEQUAL), /* not equal */ DATA('}', ACS_STERLING), /* UK pound sign */ }; #undef DATA const char *result = 0; #if NCURSES_SP_FUNCS (void) sp; #endif if (SP_PARM != 0 && (attr & A_ALTCHARSET) && (acs_chars != 0)) { char *cp; char *found = 0; for (cp = acs_chars; cp[0] && cp[1]; cp += 2) { if (ChCharOf(UChar(cp[1])) == ChCharOf(ch)) { found = cp; /* don't exit from loop - there may be redefinitions */ } } if (found != 0) { size_t n; ch = ChCharOf(UChar(*found)); for (n = 0; n < SIZEOF(names); ++n) { if (names[n].val == ch) { result = names[n].name; break; } } } } return result; } NCURSES_EXPORT(char *) _tracechtype2(int bufnum, chtype ch) { char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ); if (result != 0) { const char *found; attr_t attr = ChAttrOf(ch); _nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum)); if ((found = _nc_altcharset_name(attr, ch)) != 0) { (void) _nc_trace_bufcat(bufnum, found); attr &= ~A_ALTCHARSET; } else (void) _nc_trace_bufcat(bufnum, _nc_tracechar(CURRENT_SCREEN, (int) ChCharOf(ch))); if (attr != A_NORMAL) { (void) _nc_trace_bufcat(bufnum, " | "); (void) _nc_trace_bufcat(bufnum, _traceattr2(bufnum + 20, attr)); } result = _nc_trace_bufcat(bufnum, r_brace); } return result; } NCURSES_EXPORT(char *) _tracechtype(chtype ch) { return _tracechtype2(0, ch); } /* Trace 'chtype' return-values */ NCURSES_EXPORT(chtype) _nc_retrace_chtype(chtype code) { T((T_RETURN("%s"), _tracechtype(code))); return code; } #if USE_WIDEC_SUPPORT NCURSES_EXPORT(char *) _tracecchar_t2(int bufnum, const cchar_t *ch) { char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ); if (result != 0) { _nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum)); if (ch != 0) { const char *found; attr_t attr = AttrOfD(ch); if ((found = _nc_altcharset_name(attr, (chtype) CharOfD(ch))) != 0) { (void) _nc_trace_bufcat(bufnum, found); attr &= ~A_ALTCHARSET; } else if (isWidecExt(CHDEREF(ch))) { (void) _nc_trace_bufcat(bufnum, "{NAC}"); attr &= ~A_CHARTEXT; } else { PUTC_DATA; int n; (void) _nc_trace_bufcat(bufnum, "{ "); for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) { PUTC_ch = ch->chars[PUTC_i]; if (PUTC_ch == L'\0') { if (PUTC_i == 0) (void) _nc_trace_bufcat(bufnum, "\\000"); break; } PUTC_INIT; PUTC_n = (int) wcrtomb(PUTC_buf, ch->chars[PUTC_i], &PUT_st); if (PUTC_n <= 0) { if (PUTC_ch != L'\0') { /* it could not be a multibyte sequence */ (void) _nc_trace_bufcat(bufnum, _nc_tracechar(CURRENT_SCREEN, UChar(ch->chars[PUTC_i]))); } break; } else if (ch->chars[PUTC_i] > 255) { char temp[80]; _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "{%d:\\u%lx}", _nc_wacs_width(ch->chars[PUTC_i]), (unsigned long) ch->chars[PUTC_i]); (void) _nc_trace_bufcat(bufnum, temp); attr &= ~A_CHARTEXT; /* ignore WidecExt(ch) */ } else { for (n = 0; n < PUTC_n; n++) { if (n) (void) _nc_trace_bufcat(bufnum, ", "); (void) _nc_trace_bufcat(bufnum, _nc_tracechar(CURRENT_SCREEN, UChar(PUTC_buf[n]))); } } } (void) _nc_trace_bufcat(bufnum, " }"); } if (attr != A_NORMAL) { (void) _nc_trace_bufcat(bufnum, " | "); (void) _nc_trace_bufcat(bufnum, _traceattr2(bufnum + 20, attr)); } #if NCURSES_EXT_COLORS /* * Just in case the extended color is different from the chtype * value, trace both. */ if (ch->ext_color != PairNumber(attr)) { char temp[80]; _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) " X_COLOR{%d:%d}", ch->ext_color, PairNumber(attr)); (void) _nc_trace_bufcat(bufnum, temp); } #endif } result = _nc_trace_bufcat(bufnum, r_brace); } return result; } NCURSES_EXPORT(char *) _tracecchar_t(const cchar_t *ch) { return _tracecchar_t2(0, ch); } #endif #else EMPTY_MODULE(_nc_lib_traceatr) #endif /* TRACE */ ncurses-6.4-20240113/ncurses/trace/lib_tracedmp.c0000644000000000000000000001402014445610231020003 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/win32con/0000755000000000000000000000000014501353744015567 5ustar rootrootncurses-6.4-20240113/ncurses/win32con/win32_driver.c0000644000000000000000000007127214501353744020261 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/win32con/gettimeofday.c0000644000000000000000000000546314376465020020425 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/win32con/win_driver.c0000644000000000000000000014632714501353600020107 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,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 - 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.74 2023/09/16 16:27:44 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 __MING32__ #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) { TC_PROLOGUE(fd); (void) term; if (_nc_mingw_isconsole(fd)) { if (queue == TCIFLUSH) { BOOL b = FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); if (!b) return (int) GetLastError(); } } return code; } int _nc_mingw_testmouse( SCREEN *sp, HANDLE fd, int delay EVENTLIST_2nd(_nc_eventlist * evl)) { int rc = 0; assert(sp); if (sp->_drv_mouse_head < sp->_drv_mouse_tail) { rc = TW_MOUSE; } else { rc = console_twait(sp, fd, TWAIT_MASK, delay, (int *) 0 EVENTLIST_2nd(evl)); } return rc; } int _nc_mingw_console_read( SCREEN *sp, HANDLE fd, int *buf) { int rc = -1; INPUT_RECORD inp_rec; BOOL b; DWORD nRead; WORD vk; assert(sp); assert(buf); memset(&inp_rec, 0, sizeof(inp_rec)); T((T_CALLED("_nc_mingw_console_read(%p)"), sp)); while ((b = ReadConsoleInput(fd, &inp_rec, 1, &nRead))) { if (b && nRead > 0) { if (rc < 0) rc = 0; rc = rc + (int) nRead; if (inp_rec.EventType == KEY_EVENT) { if (!inp_rec.Event.KeyEvent.bKeyDown) continue; *buf = (int) inp_rec.Event.KeyEvent.uChar.AsciiChar; vk = inp_rec.Event.KeyEvent.wVirtualKeyCode; /* * There are 24 virtual function-keys (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 ncurses-6.4-20240113/ncurses/win32con/wcwidth.c0000644000000000000000000000540513702424322017401 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 2010 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ #include MODULE_ID("$Id: wcwidth.c,v 1.4 2020/07/11 21:02:10 tom Exp $") #if USE_WIDEC_SUPPORT #define mk_wcwidth(ucs) _nc_wcwidth(ucs) #define mk_wcswidth(pwcs, n) _nc_wcswidth(pwcs, n) #define mk_wcwidth_cjk(ucs) _nc_wcwidth_cjk(ucs) #define mk_wcswidth_cjk(pwcs, n) _nc_wcswidth_cjk(pwcs, n) NCURSES_EXPORT(int) mk_wcwidth(wchar_t); NCURSES_EXPORT(int) mk_wcswidth(const wchar_t *, size_t); NCURSES_EXPORT(int) mk_wcwidth_cjk(wchar_t); NCURSES_EXPORT(int) mk_wcswidth_cjk(const wchar_t *, size_t); #include #else void _nc_empty_wcwidth(void); void _nc_empty_wcwidth(void) { } #endif ncurses-6.4-20240113/ncurses/llib-ltinfotw0000644000000000000000000007646514465752622016667 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/llib-lncurses0000644000000000000000000021464514465752500016644 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/llib-ltictw0000644000000000000000000001253314465753133016307 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/README.IZ0000644000000000000000000001214214062736236015331 0ustar rootroot------------------------------------------------------------------------------- -- 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 ncurses-6.4-20240113/ncurses/llib-ltinfot0000644000000000000000000007420014465752661016464 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/0000755000000000000000000000000014527223753015043 5ustar rootrootncurses-6.4-20240113/ncurses/base/lib_slkclear.c0000644000000000000000000000702713615656212017640 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/wresize.c0000644000000000000000000002112014514731077016672 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,2023 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.43 2023/10/21 11:13:03 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 || --ToLines < 0 || --ToCols < 0) returnCode(ERR); size_x = win->_maxx; size_y = win->_maxy; if (ToLines == size_y && ToCols == size_x) returnCode(OK); if (IS_SUBWIN(win)) { /* * Check if the new limits will fit into the parent window's size. If * not, do not resize. We could adjust the location of the subwindow, * but the application may not like that. */ if (win->_pary + ToLines > win->_parent->_maxy || win->_parx + ToCols > win->_parent->_maxx) { returnCode(ERR); } pline = win->_parent->_line; } else { pline = 0; } /* * Allocate new memory as needed. Do the allocations without modifying * the original window, in case an allocation fails. Always allocate * (at least temporarily) the array pointing to the individual lines. */ new_lines = typeCalloc(struct ldat, (unsigned) (ToLines + 1)); if (new_lines == 0) returnCode(ERR); /* * For each line in the target, allocate or adjust pointers for the * corresponding text, depending on whether this is a window or a * subwindow. */ for (row = 0; row <= ToLines; ++row) { int begin = (row > size_y) ? 0 : (size_x + 1); int end = ToCols; NCURSES_CH_T *s; if (!IS_SUBWIN(win)) { if (row <= size_y) { if (ToCols != size_x) { s = typeMalloc(NCURSES_CH_T, (unsigned) ToCols + 1); if (s == 0) returnCode(cleanup_lines(new_lines, row)); for (col = 0; col <= ToCols; ++col) { bool valid = (col <= size_x); if_WIDEC({ if (col == ToCols && col < size_x && isWidecBase(win->_line[row].text[col])) { valid = FALSE; } }); s[col] = (valid ? win->_line[row].text[col] : win->_nc_bkgd); } } else { s = win->_line[row].text; } } else { s = typeMalloc(NCURSES_CH_T, (unsigned) ToCols + 1); if (s == 0) returnCode(cleanup_lines(new_lines, row)); for (col = 0; col <= ToCols; ++col) s[col] = win->_nc_bkgd; } } else if (pline != 0 && pline[win->_pary + row].text != 0) { s = &pline[win->_pary + row].text[win->_parx]; } else { s = 0; } if_USE_SCROLL_HINTS(new_lines[row].oldindex = row); if (row <= size_y) { new_lines[row].firstchar = win->_line[row].firstchar; new_lines[row].lastchar = win->_line[row].lastchar; } if ((ToCols != size_x) || (row > size_y)) { if (end >= begin) { /* growing */ if (new_lines[row].firstchar < begin) new_lines[row].firstchar = (NCURSES_SIZE_T) begin; } else { /* shrinking */ new_lines[row].firstchar = 0; } new_lines[row].lastchar = (NCURSES_SIZE_T) ToCols; } new_lines[row].text = s; } /* * Dispose of unwanted memory. */ if (!(win->_flags & _SUBWIN)) { if (ToCols == size_x) { for (row = ToLines + 1; row <= size_y; row++) { FreeAndNull(win->_line[row].text); } } else { for (row = 0; row <= size_y; row++) { FreeAndNull(win->_line[row].text); } } } FreeAndNull(win->_line); win->_line = new_lines; /* * Finally, adjust the parameters showing screen size and cursor * position: */ win->_maxx = (NCURSES_SIZE_T) ToCols; win->_maxy = (NCURSES_SIZE_T) ToLines; if (win->_regtop > win->_maxy) win->_regtop = win->_maxy; if (win->_regbottom > win->_maxy || win->_regbottom == size_y) win->_regbottom = win->_maxy; if (win->_curx > win->_maxx) win->_curx = win->_maxx; if (win->_cury > win->_maxy) win->_cury = win->_maxy; /* * Check for subwindows of this one, and readjust pointers to our text, * if needed. */ repair_subwindows(win); #ifdef TRACE TR(TRACE_UPDATE, ("...beg (%ld, %ld), max(%ld,%ld), reg(%ld,%ld)", (long) win->_begy, (long) win->_begx, (long) win->_maxy, (long) win->_maxx, (long) win->_regtop, (long) win->_regbottom)); if (USE_TRACEF(TRACE_UPDATE)) { _tracedump("...after:", win); _nc_unlock_global(tracef); } #endif returnCode(OK); } ncurses-6.4-20240113/ncurses/base/lib_clreol.c0000644000000000000000000000675214135056431017317 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_colorset.c0000644000000000000000000000617013615656212017670 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_isendwin.c0000644000000000000000000000601313615656212017652 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_slkattr.c0000644000000000000000000000613513615656212017523 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_getch.c0000644000000000000000000004762514423264210017131 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 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.146 2023/04/29 18:57:12 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) && !defined(EXP_WIN32_DRIVER) static HANDLE _nc_get_handle(int fd) { intptr_t value = _get_osfhandle(fd); return (HANDLE) value; } # endif #endif /* * Check for mouse activity, returning nonzero if we find any. */ static int check_mouse_activity(SCREEN *sp, int delay EVENTLIST_2nd(_nc_eventlist * evl)) { int rc; #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *TCB = TCBOf(sp); rc = TCBOf(sp)->drv->td_testmouse(TCBOf(sp), delay EVENTLIST_2nd(evl)); # if defined(EXP_WIN32_DRIVER) /* if we emulate terminfo on console, we have to use the console routine */ if (IsTermInfoOnConsole(sp)) { rc = _nc_console_testmouse(sp, _nc_console_handle(sp->_ifd), delay EVENTLIST_2nd(evl)); } else # elif defined(_NC_WINDOWS) /* if we emulate terminfo on console, we have to use the console routine */ if (IsTermInfoOnConsole(sp)) { HANDLE fd = _nc_get_handle(sp->_ifd); rc = _nc_mingw_testmouse(sp, fd, delay EVENTLIST_2nd(evl)); } else # endif rc = TCB->drv->td_testmouse(TCB, delay EVENTLIST_2nd(evl)); #else /* !USE_TERM_DRIVER */ # if USE_SYSMOUSE if ((sp->_mouse_type == M_SYSMOUSE) && (sp->_sysmouse_head < sp->_sysmouse_tail)) { rc = TW_MOUSE; } else # endif { # if defined(EXP_WIN32_DRIVER) rc = _nc_console_testmouse(sp, _nc_console_handle(sp->_ifd), delay EVENTLIST_2nd(evl)); # else rc = _nc_timed_wait(sp, TWAIT_MASK, delay, (int *) 0 EVENTLIST_2nd(evl)); # endif # if USE_SYSMOUSE if ((sp->_mouse_type == M_SYSMOUSE) && (sp->_sysmouse_head < sp->_sysmouse_tail) && (rc == 0) && (errno == EINTR)) { rc |= TW_MOUSE; } # endif } #endif /* USE_TERM_DRIVER */ return rc; } static NCURSES_INLINE int fifo_peek(SCREEN *sp) { int ch = (peek >= 0) ? sp->_fifo[peek] : ERR; TR(TRACE_IEVENT, ("peeking at %d", peek)); p_inc(); return ch; } static NCURSES_INLINE int fifo_pull(SCREEN *sp) { int ch = (head >= 0) ? sp->_fifo[head] : ERR; TR(TRACE_IEVENT, ("pulling %s from %d", _nc_tracechar(sp, ch), head)); if (peek == head) { h_inc(); peek = head; } else { h_inc(); } #ifdef TRACE if (USE_TRACEF(TRACE_IEVENT)) { _nc_fifo_dump(sp); _nc_unlock_global(tracef); } #endif return ch; } static NCURSES_INLINE int fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) { int n; int ch = 0; int mask = 0; (void) mask; if (tail < 0) return ERR; #ifdef NCURSES_WGETCH_EVENTS if (evl #if USE_GPM_SUPPORT || USE_EMX_MOUSE || USE_SYSMOUSE || (sp->_mouse_fd >= 0) #endif ) { mask = check_mouse_activity(sp, -1 EVENTLIST_2nd(evl)); } else mask = 0; if (mask & TW_EVENT) { T(("fifo_push: ungetch KEY_EVENT")); safe_ungetch(sp, KEY_EVENT); return KEY_EVENT; } #elif USE_GPM_SUPPORT || USE_EMX_MOUSE || USE_SYSMOUSE if (sp->_mouse_fd >= 0) { mask = check_mouse_activity(sp, -1 EVENTLIST_2nd(evl)); } #endif #if USE_GPM_SUPPORT || USE_EMX_MOUSE if ((sp->_mouse_fd >= 0) && (mask & TW_MOUSE)) { sp->_mouse_event(sp); ch = KEY_MOUSE; n = 1; } else #endif #if USE_SYSMOUSE if ((sp->_mouse_type == M_SYSMOUSE) && (sp->_sysmouse_head < sp->_sysmouse_tail)) { sp->_mouse_event(sp); ch = KEY_MOUSE; n = 1; } else if ((sp->_mouse_type == M_SYSMOUSE) && (mask <= 0) && errno == EINTR) { sp->_mouse_event(sp); ch = KEY_MOUSE; n = 1; } else #endif #ifdef USE_TERM_DRIVER if ((sp->_mouse_type == M_TERM_DRIVER) && (sp->_drv_mouse_head < sp->_drv_mouse_tail)) { sp->_mouse_event(sp); ch = KEY_MOUSE; n = 1; } else #endif #if USE_KLIBC_KBD if (NC_ISATTY(sp->_ifd) && 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) 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; } ncurses-6.4-20240113/ncurses/base/lib_slkcolor.c0000644000000000000000000000724313615656212017670 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_dft_fgbg.c0000644000000000000000000001050614032165706017573 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/safe_sprintf.c0000644000000000000000000002030014505775642017672 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,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 1997-on * ****************************************************************************/ #include #include MODULE_ID("$Id: safe_sprintf.c,v 1.37 2023/09/30 10:42:42 tom Exp $") #if USE_SAFE_SPRINTF typedef enum { Flags, Width, Prec, Type, Format } PRINTF; #define VA_INTGR(type) ival = (int) va_arg(ap, type) #define VA_FLOAT(type) fval = va_arg(ap, type) #define VA_POINT(type) pval = (void *)va_arg(ap, type) /* * Scan a variable-argument list for printf to determine the number of * characters that would be emitted. */ static int _nc_printf_length(const char *fmt, va_list ap) { size_t length = BUFSIZ; char *buffer; char *format; int len = 0; size_t fmt_len; char fmt_arg[BUFSIZ]; if (fmt == 0 || *fmt == '\0') return 0; fmt_len = strlen(fmt) + 1; if ((format = typeMalloc(char, fmt_len)) == 0) return -1; if ((buffer = typeMalloc(char, length)) == 0) { free(format); return -1; } while (*fmt != '\0') { if (*fmt == '%') { static char dummy[] = ""; PRINTF state = Flags; char *pval = dummy; /* avoid const-cast */ double fval = 0.0; int done = FALSE; int ival = 0; int prec = -1; int type = 0; int used = 0; int width = -1; size_t f = 0; format[f++] = *fmt; while (*++fmt != '\0' && len >= 0 && !done) { format[f++] = *fmt; if (isdigit(UChar(*fmt))) { int num = *fmt - '0'; if (state == Flags && num != 0) state = Width; if (state == Width) { if (width < 0) width = 0; width = (width * 10) + num; } else if (state == Prec) { if (prec < 0) prec = 0; prec = (prec * 10) + num; } } else if (*fmt == '*') { VA_INTGR(int); if (state == Flags) state = Width; if (state == Width) { width = ival; } else if (state == Prec) { prec = ival; } _nc_SPRINTF(fmt_arg, _nc_SLIMIT(sizeof(fmt_arg)) "%d", ival); fmt_len += strlen(fmt_arg); if ((format = _nc_doalloc(format, fmt_len)) == 0) { free(buffer); return -1; } --f; _nc_STRCPY(&format[f], fmt_arg, fmt_len - f); f = strlen(format); } else if (isalpha(UChar(*fmt))) { done = TRUE; switch (*fmt) { case 'Z': /* FALLTHRU */ case 'h': /* FALLTHRU */ case 'l': /* FALLTHRU */ done = FALSE; type = *fmt; break; case 'i': /* FALLTHRU */ case 'd': /* FALLTHRU */ case 'u': /* FALLTHRU */ case 'x': /* FALLTHRU */ case 'X': /* FALLTHRU */ if (type == 'l') VA_INTGR(long); else if (type == 'Z') VA_INTGR(size_t); else VA_INTGR(int); used = 'i'; break; case 'f': /* FALLTHRU */ case 'e': /* FALLTHRU */ case 'E': /* FALLTHRU */ case 'g': /* FALLTHRU */ case 'G': /* FALLTHRU */ VA_FLOAT(double); used = 'f'; break; case 'c': VA_INTGR(int); used = 'i'; break; case 's': VA_POINT(char *); if (prec < 0) prec = (int) strlen(pval); if (prec > (int) length) { length = length + (size_t) prec; buffer = typeRealloc(char, length, buffer); if (buffer == 0) { free(format); return -1; } } used = 'p'; break; case 'p': VA_POINT(void *); used = 'p'; break; case 'n': VA_POINT(int *); used = 0; break; default: break; } } else if (*fmt == '.') { state = Prec; } else if (*fmt == '%') { done = TRUE; used = 'p'; } } format[f] = '\0'; switch (used) { case 'i': _nc_SPRINTF(buffer, _nc_SLIMIT(length) format, ival); break; case 'f': _nc_SPRINTF(buffer, _nc_SLIMIT(length) format, fval); break; default: _nc_SPRINTF(buffer, _nc_SLIMIT(length) format, pval); break; } len += (int) strlen(buffer); } else { fmt++; len++; } } free(buffer); free(format); return len; } #endif #define my_buffer _nc_globals.safeprint_buf #define my_length _nc_globals.safeprint_used /* * Wrapper for vsprintf that allocates a buffer big enough to hold the result. */ NCURSES_EXPORT(char *) NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_DCLx const char *fmt, va_list ap) { char *result = NULL; if (SP_PARM != NULL && fmt != NULL) { #if USE_SAFE_SPRINTF va_list ap2; int len; begin_va_copy(ap2, ap); len = _nc_printf_length(fmt, ap2); end_va_copy(ap2); if ((int) my_length < len + 1) { my_length = (size_t) (2 * (len + 1)); my_buffer = typeRealloc(char, my_length, my_buffer); } if (my_buffer != NULL) { *my_buffer = '\0'; if (len >= 0) { vsprintf(my_buffer, fmt, ap); } result = my_buffer; } #else #define MyCols _nc_globals.safeprint_cols #define MyRows _nc_globals.safeprint_rows if (screen_lines(SP_PARM) > MyRows || screen_columns(SP_PARM) > MyCols) { if (screen_lines(SP_PARM) > MyRows) MyRows = screen_lines(SP_PARM); if (screen_columns(SP_PARM) > MyCols) MyCols = screen_columns(SP_PARM); my_length = (size_t) (MyRows * (MyCols + 1)) + 1; if (my_length < 80) my_length = 80; my_buffer = typeRealloc(char, my_length, my_buffer); } if (my_buffer != NULL) { # if HAVE_VSNPRINTF /* SUSv2, 1997 */ int used; do { 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 ncurses-6.4-20240113/ncurses/base/key_defined.c0000644000000000000000000000721414445606600017454 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_slkrefr.c0000644000000000000000000001324214114650153017475 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2013,2014 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 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.32 2021/09/04 10:54:35 tom Exp $") #ifdef USE_TERM_DRIVER #define NumLabels InfoOf(SP_PARM).numlabels #else #define NumLabels num_labels #endif /* * Paint the info line for the PC style SLK emulation. */ static void slk_paint_info(WINDOW *win) { SCREEN *sp = _nc_screen_of(win); if (win && sp && (sp->slk_format == 4)) { int i; (void) mvwhline(win, 0, 0, 0, getmaxx(win)); wmove(win, 0, 0); for (i = 0; i < sp->_slk->maxlab; i++) { mvwprintw(win, 0, sp->_slk->ent[i].ent_x, "F%d", i + 1); } } } /* * Write the soft labels to the soft-key window. */ static void slk_intern_refresh(SCREEN *sp) { int i; int fmt; SLK *slk; int numlab; if (sp == 0) return; slk = sp->_slk; fmt = sp->slk_format; numlab = NumLabels; if (slk->hidden) return; for (i = 0; i < slk->labcnt; i++) { if (slk->dirty || slk->ent[i].dirty) { if (slk->ent[i].visible) { if (numlab > 0 && SLK_STDFMT(fmt)) { #ifdef USE_TERM_DRIVER CallDriver_2(sp, td_hwlabel, i + 1, slk->ent[i].form_text); #else if (i < num_labels) { NCURSES_PUTP2("plab_norm", TPARM_2(plab_norm, i + 1, slk->ent[i].form_text)); } #endif } else { if (fmt == 4) slk_paint_info(slk->win); wmove(slk->win, SLK_LINES(fmt) - 1, slk->ent[i].ent_x); (void) wattrset(slk->win, (int) AttrOf(slk->attr)); waddstr(slk->win, slk->ent[i].form_text); /* if we simulate SLK's, it is looking much more natural to use the current ATTRIBUTE also for the label window */ (void) wattrset(slk->win, (int) WINDOW_ATTRS(StdScreen(sp))); } } slk->ent[i].dirty = FALSE; } } slk->dirty = FALSE; if (numlab > 0) { #ifdef USE_TERM_DRIVER CallDriver_1(sp, td_hwlabelOnOff, slk->hidden ? FALSE : TRUE); #else if (slk->hidden) { NCURSES_PUTP2("label_off", label_off); } else { NCURSES_PUTP2("label_on", label_on); } #endif } } /* * Refresh the soft labels. */ NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_noutrefresh) (NCURSES_SP_DCL0) { T((T_CALLED("slk_noutrefresh(%p)"), (void *) SP_PARM)); if (SP_PARM == 0 || SP_PARM->_slk == 0) returnCode(ERR); if (SP_PARM->_slk->hidden) returnCode(OK); slk_intern_refresh(SP_PARM); returnCode(wnoutrefresh(SP_PARM->_slk->win)); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) slk_noutrefresh(void) { return NCURSES_SP_NAME(slk_noutrefresh) (CURRENT_SCREEN); } #endif /* * Refresh the soft labels. */ NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_refresh) (NCURSES_SP_DCL0) { T((T_CALLED("slk_refresh(%p)"), (void *) SP_PARM)); if (SP_PARM == 0 || SP_PARM->_slk == 0) returnCode(ERR); if (SP_PARM->_slk->hidden) returnCode(OK); slk_intern_refresh(SP_PARM); returnCode(wrefresh(SP_PARM->_slk->win)); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) slk_refresh(void) { return NCURSES_SP_NAME(slk_refresh) (CURRENT_SCREEN); } #endif ncurses-6.4-20240113/ncurses/base/lib_restart.c0000644000000000000000000001055414423264605017522 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/use_window.c0000644000000000000000000000545313615656212017376 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_ungetch.c0000644000000000000000000000712713615656212017476 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_nl.c0000644000000000000000000000704514423263505016446 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_scroll.c0000644000000000000000000001346613615656212017342 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_leaveok.c0000644000000000000000000000543713615656212017471 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_slk.c0000644000000000000000000001761214300224002016606 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/sigaction.c0000644000000000000000000000717413615656212017175 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_box.c0000644000000000000000000001236613615656212016632 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/vsscanf.c0000644000000000000000000002100114503631431016632 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/base/keyok.c0000644000000000000000000001003614062736752016333 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_slkatron.c0000644000000000000000000000644713615656212017702 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_color.c0000644000000000000000000007112714501355063017153 0ustar rootroot/**************************************************************************** * 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_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.150 2023/09/16 16:39:15 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 colorpair_t *next; if ((next = typeCalloc(colorpair_t, have)) == 0) _nc_err_abort(MSG_NO_MEMORY); memcpy(next, sp->_color_pairs, (size_t) sp->_pair_alloc * sizeof(*next)); _nc_copy_pairs(sp, next, sp->_color_pairs, sp->_pair_alloc); free(sp->_color_pairs); sp->_color_pairs = next; #else TYPE_REALLOC(colorpair_t, have, sp->_color_pairs); if (sp->_color_pairs != 0) { memset(sp->_color_pairs + sp->_pair_alloc, 0, sizeof(colorpair_t) * (size_t) (have - sp->_pair_alloc)); } #endif } if (sp->_color_pairs != 0) { sp->_pair_alloc = have; } } /* * Extension (1997/1/18) - Allow negative f/b values to set default color * values. */ NCURSES_EXPORT(int) _nc_init_pair(SCREEN *sp, int pair, int f, int b) { static colorpair_t null_pair; colorpair_t result = null_pair; colorpair_t previous; int maxcolors; T((T_CALLED("init_pair(%p,%d,%d,%d)"), (void *) sp, pair, f, b)); if (!ValidPair(sp, pair)) returnCode(ERR); maxcolors = MaxColors; ReservePairs(sp, pair); previous = sp->_color_pairs[pair]; #if NCURSES_EXT_FUNCS if (sp->_default_color || sp->_assumed_color) { bool isDefault = FALSE; bool wasDefault = FALSE; int default_pairs = sp->_default_pairs; /* * Map caller's color number, e.g., -1, 0, 1, .., 7, etc., into * internal unsigned values which we will store in the _color_pairs[] * table. */ if (isDefaultColor(f)) { f = COLOR_DEFAULT; isDefault = TRUE; } else if (!OkColorHi(f)) { returnCode(ERR); } if (isDefaultColor(b)) { b = COLOR_DEFAULT; isDefault = TRUE; } else if (!OkColorHi(b)) { returnCode(ERR); } /* * Check if the table entry that we are going to init/update used * default colors. */ if (isDefaultColor(FORE_OF(previous)) || isDefaultColor(BACK_OF(previous))) wasDefault = TRUE; /* * Keep track of the number of entries in the color pair table which * used a default color. */ if (isDefault && !wasDefault) { ++default_pairs; } else if (wasDefault && !isDefault) { --default_pairs; } /* * As an extension, ncurses allows the pair number to exceed the * terminal's color_pairs value for pairs using a default color. * * Note that updating a pair which used a default color with one * that does not will decrement the count - and possibly interfere * with sequentially adding new pairs. */ if (pair > (sp->_pair_count + default_pairs)) { returnCode(ERR); } sp->_default_pairs = default_pairs; } else #endif { if ((f < 0) || !OkColorHi(f) || (b < 0) || !OkColorHi(b) || (pair < 1)) { returnCode(ERR); } } /* * When a pair's content is changed, replace its colors (if pair was * initialized before a screen update is performed replacing original * pair colors with the new ones). */ MakeColorPair(result, f, b); if ((FORE_OF(previous) != 0 || BACK_OF(previous) != 0) && !isSamePair(previous, result)) { _nc_change_pair(sp, pair); } _nc_reset_color_pair(sp, pair, &result); sp->_color_pairs[pair] = result; _nc_set_color_pair(sp, pair, cpINIT); if (GET_SCREEN_PAIR(sp) == pair) SET_SCREEN_PAIR(sp, (int) (~0)); /* force attribute update */ #ifdef USE_TERM_DRIVER CallDriver_3(sp, td_initpair, pair, f, b); #else if (initialize_pair && InPalette(f) && InPalette(b)) { const color_t *tp = DefaultPalette; TR(TRACE_ATTRS, ("initializing pair: pair = %d, fg=(%d,%d,%d), bg=(%d,%d,%d)", (int) pair, (int) tp[f].red, (int) tp[f].green, (int) tp[f].blue, (int) tp[b].red, (int) tp[b].green, (int) tp[b].blue)); NCURSES_PUTP2("initialize_pair", TIPARM_7(initialize_pair, pair, (int) tp[f].red, (int) tp[f].green, (int) tp[f].blue, (int) tp[b].red, (int) tp[b].green, (int) tp[b].blue)); } #endif returnCode(OK); } NCURSES_EXPORT(int) NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx NCURSES_PAIRS_T pair, NCURSES_COLOR_T f, NCURSES_COLOR_T b) { return _nc_init_pair(SP_PARM, pair, f, b); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) init_pair(NCURSES_COLOR_T pair, NCURSES_COLOR_T f, NCURSES_COLOR_T b) { return NCURSES_SP_NAME(init_pair) (CURRENT_SCREEN, pair, f, b); } #endif #define okRGB(n) ((n) >= 0 && (n) <= 1000) NCURSES_EXPORT(int) _nc_init_color(SCREEN *sp, int color, int r, int g, int b) { int result = ERR; int maxcolors; T((T_CALLED("init_color(%p,%d,%d,%d,%d)"), (void *) sp, color, r, g, b)); if (sp == 0 || sp->_direct_color.value) returnCode(result); maxcolors = MaxColors; if (InitColor && sp->_coloron && (color >= 0 && OkColorHi(color)) && (okRGB(r) && okRGB(g) && okRGB(b))) { sp->_color_table[color].init = 1; sp->_color_table[color].r = r; sp->_color_table[color].g = g; sp->_color_table[color].b = b; if (UseHlsPalette) { rgb2hls(r, g, b, &sp->_color_table[color].red, &sp->_color_table[color].green, &sp->_color_table[color].blue); } else { sp->_color_table[color].red = r; sp->_color_table[color].green = g; sp->_color_table[color].blue = b; } #ifdef USE_TERM_DRIVER CallDriver_4(sp, td_initcolor, color, r, g, b); #else NCURSES_PUTP2("initialize_color", TIPARM_4(initialize_color, color, r, g, b)); #endif sp->_color_defs = Max(color + 1, sp->_color_defs); result = OK; } returnCode(result); } NCURSES_EXPORT(int) NCURSES_SP_NAME(init_color) (NCURSES_SP_DCLx NCURSES_COLOR_T color, NCURSES_COLOR_T r, NCURSES_COLOR_T g, NCURSES_COLOR_T b) { return _nc_init_color(SP_PARM, color, r, g, b); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) init_color(NCURSES_COLOR_T color, NCURSES_COLOR_T r, NCURSES_COLOR_T g, NCURSES_COLOR_T b) { return NCURSES_SP_NAME(init_color) (CURRENT_SCREEN, color, r, g, b); } #endif NCURSES_EXPORT(bool) NCURSES_SP_NAME(can_change_color) (NCURSES_SP_DCL) { int result = FALSE; T((T_CALLED("can_change_color(%p)"), (void *) SP_PARM)); if (HasTerminal(SP_PARM) && (CanChange != 0)) { result = TRUE; } returnCode(result); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(bool) can_change_color(void) { return NCURSES_SP_NAME(can_change_color) (CURRENT_SCREEN); } #endif NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_colors) (NCURSES_SP_DCL0) { int code = FALSE; (void) SP_PARM; T((T_CALLED("has_colors(%p)"), (void *) SP_PARM)); if (HasTerminal(SP_PARM)) { #ifdef USE_TERM_DRIVER code = HasColor; #else code = ((VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs) && (((set_foreground != NULL) && (set_background != NULL)) || ((set_a_foreground != NULL) && (set_a_background != NULL)) || set_color_pair)) ? TRUE : FALSE); #endif } returnCode(code); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(bool) has_colors(void) { return NCURSES_SP_NAME(has_colors) (CURRENT_SCREEN); } #endif static int _nc_color_content(SCREEN *sp, int color, int *r, int *g, int *b) { int result = ERR; T((T_CALLED("color_content(%p,%d,%p,%p,%p)"), (void *) sp, color, (void *) r, (void *) g, (void *) b)); if (sp != 0) { int maxcolors = MaxColors; if (color >= 0 && OkColorHi(color) && sp->_coloron) { int c_r, c_g, c_b; if (sp->_direct_color.value) { rgb_bits_t *work = &(sp->_direct_color); #define max_direct_color(name) ((1 << work->bits.name) - 1) #define value_direct_color(max) (1000 * ((color >> bitoff) & max)) / max int max_r = max_direct_color(red); int max_g = max_direct_color(green); int max_b = max_direct_color(blue); int bitoff = 0; c_b = value_direct_color(max_b); bitoff += work->bits.blue; c_g = value_direct_color(max_g); bitoff += work->bits.green; c_r = value_direct_color(max_r); } else { c_r = sp->_color_table[color].red; c_g = sp->_color_table[color].green; c_b = sp->_color_table[color].blue; } if (r) *r = c_r; if (g) *g = c_g; if (b) *b = c_b; TR(TRACE_ATTRS, ("...color_content(%d,%d,%d,%d)", color, c_r, c_g, c_b)); result = OK; } } if (result != OK) { if (r) *r = 0; if (g) *g = 0; if (b) *b = 0; } returnCode(result); } NCURSES_EXPORT(int) NCURSES_SP_NAME(color_content) (NCURSES_SP_DCLx NCURSES_COLOR_T color, NCURSES_COLOR_T *r, NCURSES_COLOR_T *g, NCURSES_COLOR_T *b) { int my_r, my_g, my_b; int rc = _nc_color_content(SP_PARM, color, &my_r, &my_g, &my_b); if (rc == OK) { *r = limit_COLOR(my_r); *g = limit_COLOR(my_g); *b = limit_COLOR(my_b); } return rc; } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) color_content(NCURSES_COLOR_T color, NCURSES_COLOR_T *r, NCURSES_COLOR_T *g, NCURSES_COLOR_T *b) { return NCURSES_SP_NAME(color_content) (CURRENT_SCREEN, color, r, g, b); } #endif NCURSES_EXPORT(int) _nc_pair_content(SCREEN *sp, int pair, int *f, int *b) { int result; T((T_CALLED("pair_content(%p,%d,%p,%p)"), (void *) sp, (int) pair, (void *) f, (void *) b)); if (!ValidPair(sp, pair)) { result = ERR; } else { int fg; int bg; ReservePairs(sp, pair); fg = FORE_OF(sp->_color_pairs[pair]); bg = BACK_OF(sp->_color_pairs[pair]); #if NCURSES_EXT_FUNCS if (isDefaultColor(fg)) fg = -1; if (isDefaultColor(bg)) bg = -1; #endif if (f) *f = fg; if (b) *b = bg; TR(TRACE_ATTRS, ("...pair_content(%p,%d,%d,%d)", (void *) sp, (int) pair, (int) fg, (int) bg)); result = OK; } returnCode(result); } NCURSES_EXPORT(int) NCURSES_SP_NAME(pair_content) (NCURSES_SP_DCLx NCURSES_PAIRS_T pair, NCURSES_COLOR_T *f, NCURSES_COLOR_T *b) { int my_f, my_b; int rc = _nc_pair_content(SP_PARM, pair, &my_f, &my_b); if (rc == OK) { *f = limit_COLOR(my_f); *b = limit_COLOR(my_b); } return rc; } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) pair_content(NCURSES_COLOR_T pair, NCURSES_COLOR_T *f, NCURSES_COLOR_T *b) { return NCURSES_SP_NAME(pair_content) (CURRENT_SCREEN, pair, f, b); } #endif NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_DCLx int old_pair, int pair, int reverse, NCURSES_SP_OUTC outc) { #ifdef USE_TERM_DRIVER CallDriver_4(SP_PARM, td_docolor, old_pair, pair, reverse, outc); #else int fg = COLOR_DEFAULT; int bg = COLOR_DEFAULT; int old_fg = -1; int old_bg = -1; if (!ValidPair(SP_PARM, pair)) { return; } else if (pair != 0) { if (set_color_pair) { TPUTS_TRACE("set_color_pair"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_1(set_color_pair, pair), 1, outc); return; } else if (SP_PARM != 0) { if (_nc_pair_content(SP_PARM, pair, &fg, &bg) == ERR) return; } } if (old_pair >= 0 && SP_PARM != 0 && _nc_pair_content(SP_PARM, old_pair, &old_fg, &old_bg) != ERR) { if ((isDefaultColor(fg) && !isDefaultColor(old_fg)) || (isDefaultColor(bg) && !isDefaultColor(old_bg))) { #if NCURSES_EXT_FUNCS /* * A minor optimization - but extension. If "AX" is specified in * the terminal description, treat it as screen's indicator of ECMA * SGR 39 and SGR 49, and assume the two sequences are independent. */ if (SP_PARM->_has_sgr_39_49 && isDefaultColor(old_bg) && !isDefaultColor(old_fg)) { NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[39m", 1, outc); } else if (SP_PARM->_has_sgr_39_49 && isDefaultColor(old_fg) && !isDefaultColor(old_bg)) { NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[49m", 1, outc); } else #endif reset_color_pair(NCURSES_SP_ARG); } } else { reset_color_pair(NCURSES_SP_ARG); if (old_pair < 0 && pair <= 0) return; } #if NCURSES_EXT_FUNCS if (isDefaultColor(fg)) fg = default_fg(NCURSES_SP_ARG); if (isDefaultColor(bg)) bg = default_bg(NCURSES_SP_ARG); #endif if (reverse) { int xx = fg; fg = bg; bg = xx; } TR(TRACE_ATTRS, ("setting colors: pair = %d, fg = %d, bg = %d", pair, fg, bg)); if (!isDefaultColor(fg)) { set_foreground_color(NCURSES_SP_ARGx fg, outc); } if (!isDefaultColor(bg)) { set_background_color(NCURSES_SP_ARGx bg, outc); } #endif } #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) _nc_do_color(int old_pair, int pair, int reverse, NCURSES_OUTC outc) { SetSafeOutcWrapper(outc); NCURSES_SP_NAME(_nc_do_color) (CURRENT_SCREEN, old_pair, pair, reverse, _nc_outc_wrapper); } #endif #if NCURSES_EXT_COLORS NCURSES_EXPORT(int) NCURSES_SP_NAME(init_extended_pair) (NCURSES_SP_DCLx int pair, int f, int b) { return _nc_init_pair(SP_PARM, pair, f, b); } NCURSES_EXPORT(int) NCURSES_SP_NAME(init_extended_color) (NCURSES_SP_DCLx int color, int r, int g, int b) { return _nc_init_color(SP_PARM, color, r, g, b); } NCURSES_EXPORT(int) NCURSES_SP_NAME(extended_color_content) (NCURSES_SP_DCLx int color, int *r, int *g, int *b) { return _nc_color_content(SP_PARM, color, r, g, b); } NCURSES_EXPORT(int) NCURSES_SP_NAME(extended_pair_content) (NCURSES_SP_DCLx int pair, int *f, int *b) { return _nc_pair_content(SP_PARM, pair, f, b); } NCURSES_EXPORT(void) NCURSES_SP_NAME(reset_color_pairs) (NCURSES_SP_DCL0) { if (SP_PARM != 0) { if (SP_PARM->_color_pairs) { _nc_free_ordered_pairs(SP_PARM); free(SP_PARM->_color_pairs); SP_PARM->_color_pairs = 0; SP_PARM->_pair_alloc = 0; ReservePairs(SP_PARM, 16); clearok(CurScreen(SP_PARM), TRUE); touchwin(StdScreen(SP_PARM)); } } } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) init_extended_pair(int pair, int f, int b) { return NCURSES_SP_NAME(init_extended_pair) (CURRENT_SCREEN, pair, f, b); } NCURSES_EXPORT(int) init_extended_color(int color, int r, int g, int b) { return NCURSES_SP_NAME(init_extended_color) (CURRENT_SCREEN, color, r, g, b); } NCURSES_EXPORT(int) extended_color_content(int color, int *r, int *g, int *b) { return NCURSES_SP_NAME(extended_color_content) (CURRENT_SCREEN, color, r, g, b); } NCURSES_EXPORT(int) extended_pair_content(int pair, int *f, int *b) { return NCURSES_SP_NAME(extended_pair_content) (CURRENT_SCREEN, pair, f, b); } NCURSES_EXPORT(void) reset_color_pairs(void) { NCURSES_SP_NAME(reset_color_pairs) (CURRENT_SCREEN); } #endif /* NCURSES_SP_FUNCS */ #endif /* NCURSES_EXT_COLORS */ ncurses-6.4-20240113/ncurses/base/keybound.c0000644000000000000000000000625313615656212017032 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_touch.c0000644000000000000000000000742013615656212017157 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_clrbot.c0000644000000000000000000000644213615656212017325 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_wattroff.c0000644000000000000000000000613013615656212017666 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/MKunctrl.awk0000644000000000000000000001340613615656212017307 0ustar rootroot# $Id: MKunctrl.awk,v 1.29 2020/02/02 23:34:34 tom Exp $ ############################################################################## # Copyright 2020 Thomas E. Dickey # # Copyright 1998-2012,2017 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey (1997-on) # BEGIN { print "/* generated by MKunctrl.awk */" print "" print "#include " 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 "(void) sp;" print "\tif (check >= 0 && check < (int)SIZEOF(unctrl_table)) {" print "#if NCURSES_EXT_FUNCS" print "\t\tif ((sp != 0)" print "\t\t && (sp->_legacy_coding > 1)" print "\t\t && (check >= 128)" print "\t\t && (check < 160))" printf "\t\t\tresult = %s_c1[check - 128];\n", stringname; print "\t\telse" print "\t\tif ((check >= 160)" print "\t\t && (check < 256)" print "\t\t && ((sp != 0)" print "\t\t && ((sp->_legacy_coding > 0)" print "\t\t || (sp->_legacy_coding == 0" print "\t\t && isprint(check)))))" printf "\t\t\tresult = %s_c1[check - 128];\n", stringname; print "\t\telse" print "#endif /* NCURSES_EXT_FUNCS */" printf "\t\t\tresult = %s_table[check];\n", stringname; print "\t} else {" print "\t\tresult = 0;" print "\t}" print "\treturn (NCURSES_CONST char *)result;" print "}" print "" print "NCURSES_EXPORT(NCURSES_CONST char *) unctrl (chtype ch)" print "{" print "\treturn safe_unctrl(CURRENT_SCREEN, ch);" print "}" } ncurses-6.4-20240113/ncurses/base/lib_redrawln.c0000644000000000000000000000702313615656212017652 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_delwin.c0000644000000000000000000000742114514731054017315 0ustar rootroot/**************************************************************************** * Copyright 2020-2021,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 * * and: Juergen Pfeifer 2008 * ****************************************************************************/ /* ** lib_delwin.c ** ** The routine delwin(). ** */ #include MODULE_ID("$Id: lib_delwin.c,v 1.25 2023/10/21 11:12:44 tom Exp $") static bool cannot_delete(WINDOW *win) { bool result = TRUE; if (IS_PAD(win)) { result = FALSE; } else { WINDOWLIST *p; #if NCURSES_SP_FUNCS && defined(USE_SP_WINDOWLIST) SCREEN *sp = _nc_screen_of(win); #endif for (each_window(SP_PARM, p)) { if (&(p->win) == win) { result = FALSE; } else if (IS_SUBWIN(&(p->win)) && p->win._parent == win) { result = TRUE; break; } } } return result; } NCURSES_EXPORT(int) delwin(WINDOW *win) { int result = ERR; T((T_CALLED("delwin(%p)"), (void *) win)); if (_nc_try_global(curses) == 0) { if (win == 0 || cannot_delete(win)) { result = ERR; } else if (IS_PAD(win)) { win->_parent = NULL; result = _nc_freewin(win); } else { #if NCURSES_SP_FUNCS SCREEN *sp = _nc_screen_of(win); #endif if (IS_SUBWIN(win)) { touchwin(win->_parent); } else if (CurScreen(SP_PARM) != 0) { touchwin(CurScreen(SP_PARM)); } result = _nc_freewin(win); } _nc_unlock_global(curses); } returnCode(result); } ncurses-6.4-20240113/ncurses/base/lib_screen.c0000644000000000000000000006123014423031616017304 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,2023 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.105 2023/04/28 20:58:54 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) { size_t n; char *next = source; if (source[0] == GUTTER) { ++next; } else if (*next == 'C') { int value = 0; unsigned pair; next++; while (isdigit(UChar(*next))) { value = value * 10 + (*next++ - '0'); } *target &= ~A_COLOR; pair = (unsigned) ((value > 256) ? COLOR_PAIR(255) : COLOR_PAIR(value)); *target |= pair; *color = value; } else { while (isalnum(UChar(*next))) { ++next; } for (n = 0; n < SIZEOF(scr_attrs); ++n) { if ((size_t) (next - source) == strlen(scr_attrs[n].name)) { if (scr_attrs[n].attr) { *target |= scr_attrs[n].attr; } else { *target = A_NORMAL; } break; } } } source = next; } else { break; } } return source; } static char * decode_char(char *source, int *target) { int limit = 0; int base = 16; const char digits[] = "0123456789abcdef"; TR(TRACE_IEVENT, ("decode_char '%s'", source)); *target = ' '; switch (*source) { case MARKER: switch (*++source) { case APPEND: break; case MARKER: *target = MARKER; ++source; break; case 's': *target = ' '; ++source; break; case '0': case '1': case '2': case '3': base = 8; limit = 3; break; case 'u': limit = 4; ++source; break; case 'U': limit = 8; ++source; break; } if (limit) { *target = 0; while (limit-- > 0) { char *find = strchr(digits, *source++); int ch = (find != 0) ? (int) (find - digits) : -1; *target *= base; if (ch >= 0 && ch < base) { *target += ch; } } } break; default: *target = *source++; break; } return source; } static char * decode_chtype(char *source, chtype fillin, chtype *target) { attr_t attr = ChAttrOf(fillin); int color = PAIR_NUMBER((int) attr); int value; TR(TRACE_IEVENT, ("decode_chtype '%s'", source)); source = decode_attr(source, &attr, &color); source = decode_char(source, &value); *target = (ChCharOf(value) | attr | (chtype) COLOR_PAIR(color)); /* FIXME - ignore combining characters */ return source; } #if NCURSES_WIDECHAR static char * decode_cchar(char *source, cchar_t *fillin, cchar_t *target) { int color; attr_t attr = fillin->attr; wchar_t chars[CCHARW_MAX]; int append = 0; int value = 0; TR(TRACE_IEVENT, ("decode_cchar '%s'", source)); *target = blank; #if NCURSES_EXT_COLORS color = fillin->ext_color; #else color = (int) PAIR_NUMBER(attr); #endif source = decode_attr(source, &attr, &color); memset(chars, 0, sizeof(chars)); source = decode_char(source, &value); chars[0] = (wchar_t) value; /* handle combining characters */ while (source[0] == MARKER && source[1] == APPEND) { source += 2; source = decode_char(source, &value); if (++append < CCHARW_MAX) { chars[append] = (wchar_t) value; } } setcchar(target, chars, attr, (short) color, &color); return source; } #endif static int read_win(WINDOW *win, FILE *fp) { int code = ERR; size_t n; int color; #if NCURSES_WIDECHAR NCURSES_CH_T prior; #endif chtype prior2; memset(win, 0, sizeof(WINDOW)); for (;;) { char *name; char *value; char *txt = read_txt(fp); if (txt == 0) break; if (!strcmp(txt, "rows:")) { free(txt); code = OK; break; } if ((value = strchr(txt, '=')) == 0) { free(txt); continue; } *value++ = '\0'; name = !strcmp(txt, "flag") ? value : txt; for (n = 0; n < SIZEOF(scr_params); ++n) { if (!strcmp(name, scr_params[n].name)) { void *data = (void *) ((char *) win + scr_params[n].offset); switch (scr_params[n].type) { case pATTR: (void) decode_attr(value, data, &color); break; case pBOOL: *(bool *) data = TRUE; break; case pCHAR: prior2 = ' '; decode_chtype(value, prior2, data); break; case pINT: *(int *) data = atoi(value); break; case pSHORT: *(short *) data = (short) atoi(value); break; case pSIZE: *(NCURSES_SIZE_T *) data = (NCURSES_SIZE_T) atoi(value); break; #if NCURSES_WIDECHAR case pCCHAR: prior = blank; decode_cchar(value, &prior, data); break; #endif } break; } } free(txt); } return code; } static int read_row(char *source, NCURSES_CH_T *prior, NCURSES_CH_T *target, int length) { while (*source != '\0' && length > 0) { #if NCURSES_WIDECHAR int len; source = decode_cchar(source, prior, target); len = _nc_wacs_width(target->chars[0]); if (len > 1) { int n; SetWidecExt(CHDEREF(target), 0); for (n = 1; n < len; ++n) { target[n] = target[0]; SetWidecExt(CHDEREF(target), n); } target += (len - 1); length -= (len - 1); } #else source = decode_chtype(source, *prior, target); #endif *prior = *target; ++target; --length; } while (length-- > 0) { *target++ = blank; } /* FIXME - see what error conditions should apply if I need to return ERR */ return 0; } #endif /* NCURSES_EXT_PUTWIN */ /* * Originally, getwin/putwin used fread/fwrite, because they used binary data. * The new format uses printable ASCII, which does not have as predictable * sizes. Consequently, we use buffered I/O, e.g., fgetc/fprintf, which need * special handling if we want to read screen dumps from an older library. */ static int read_block(void *target, size_t length, FILE *fp) { int result = 0; char *buffer = target; clearerr(fp); while (length-- != 0) { int ch = fgetc(fp); if (ch == EOF) { result = -1; break; } *buffer++ = (char) ch; } return result; } NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(getwin) (NCURSES_SP_DCLx FILE *filep) { WINDOW tmp, *nwin; bool old_format = FALSE; T((T_CALLED("getwin(%p)"), (void *) filep)); if (filep == 0) { returnWin(0); } /* * Read the first 4 bytes to determine first if this is an old-format * screen-dump, or new-format. */ if (read_block(&tmp, (size_t) 4, filep) < 0) { returnWin(0); } /* * If this is a new-format file, and we do not support it, give up. */ if (!memcmp(&tmp, my_magic, (size_t) 4)) { #if NCURSES_EXT_PUTWIN if (read_win(&tmp, filep) < 0) #endif returnWin(0); } else if (read_block(((char *) &tmp) + 4, sizeof(WINDOW) - 4, filep) < 0) { returnWin(0); } else { old_format = TRUE; } /* * Check the window-size: */ if (tmp._maxy == 0 || tmp._maxy > MAX_SIZE || tmp._maxx == 0 || tmp._maxx > MAX_SIZE) { returnWin(0); } if (IS_PAD(&tmp)) { nwin = NCURSES_SP_NAME(newpad) (NCURSES_SP_ARGx tmp._maxy + 1, tmp._maxx + 1); } else { nwin = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx tmp._maxy + 1, tmp._maxx + 1, 0, 0); } /* * We deliberately do not restore the _parx, _pary, or _parent * fields, because the window hierarchy within which they * made sense is probably gone. */ if (nwin != 0) { int n; size_t linesize = sizeof(NCURSES_CH_T) * (size_t) (tmp._maxx + 1); nwin->_curx = tmp._curx; nwin->_cury = tmp._cury; nwin->_maxy = tmp._maxy; nwin->_maxx = tmp._maxx; nwin->_begy = tmp._begy; nwin->_begx = tmp._begx; nwin->_yoffset = tmp._yoffset; nwin->_flags = tmp._flags & ~(_SUBWIN); WINDOW_ATTRS(nwin) = WINDOW_ATTRS(&tmp); nwin->_nc_bkgd = tmp._nc_bkgd; nwin->_notimeout = tmp._notimeout; nwin->_clear = tmp._clear; nwin->_leaveok = tmp._leaveok; nwin->_idlok = tmp._idlok; nwin->_idcok = tmp._idcok; nwin->_immed = tmp._immed; nwin->_scroll = tmp._scroll; nwin->_sync = tmp._sync; nwin->_use_keypad = tmp._use_keypad; nwin->_delay = tmp._delay; nwin->_regtop = tmp._regtop; nwin->_regbottom = tmp._regbottom; if (IS_PAD(&tmp)) nwin->_pad = tmp._pad; if (old_format) { T(("reading old-format screen dump")); for (n = 0; n <= nwin->_maxy; n++) { if (read_block(nwin->_line[n].text, linesize, filep) < 0) { delwin(nwin); returnWin(0); } } } #if NCURSES_EXT_PUTWIN else { char *txt = 0; bool success = TRUE; NCURSES_CH_T prior = blank; T(("reading new-format screen dump")); for (n = 0; n <= nwin->_maxy; n++) { long row; char *next; if ((txt = read_txt(filep)) == 0) { T(("...failed to read string for row %d", n + 1)); success = FALSE; break; } row = strtol(txt, &next, 10); if (row != (n + 1) || *next != ':') { T(("...failed to read row-number %d", n + 1)); success = FALSE; break; } if (read_row(++next, &prior, nwin->_line[n].text, tmp._maxx + 1) < 0) { T(("...failed to read cells for row %d", n + 1)); success = FALSE; break; } free(txt); txt = 0; } if (!success) { free(txt); delwin(nwin); returnWin(0); } } #endif touchwin(nwin); } returnWin(nwin); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(WINDOW *) getwin(FILE *filep) { return NCURSES_SP_NAME(getwin) (CURRENT_SCREEN, filep); } #endif #if NCURSES_EXT_PUTWIN static void encode_attr(char *target, ARG_SLIMIT(limit) attr_t source, attr_t prior, int source_color, int prior_color) { #if USE_STRING_HACKS && HAVE_SNPRINTF char *base = target; #endif source &= ~A_CHARTEXT; prior &= ~A_CHARTEXT; *target = '\0'; if ((source != prior) || (source_color != prior_color)) { size_t n; bool first = TRUE; *target++ = MARKER; *target++ = L_CURL; for (n = 0; n < SIZEOF(scr_attrs); ++n) { if ((source & scr_attrs[n].attr) != 0 || ((source & ALL_BUT_COLOR) == 0 && (scr_attrs[n].attr == A_NORMAL))) { if (first) { first = FALSE; } else { *target++ = '|'; } _nc_STRCPY(target, scr_attrs[n].name, limit); target += strlen(target); } } if (source_color != prior_color) { if (!first) *target++ = '|'; _nc_SPRINTF(target, CUR_SLIMIT "C%d", source_color); target += strlen(target); } *target++ = R_CURL; *target = '\0'; } } static void encode_cell(char *target, ARG_SLIMIT(limit) CARG_CH_T source, CARG_CH_T previous) { #if USE_STRING_HACKS && HAVE_SNPRINTF char *base = target; #endif #if NCURSES_WIDECHAR size_t n; int source_pair = GetPair(*source); int previous_pair = GetPair(*previous); *target = '\0'; if ((previous->attr != source->attr) || (previous_pair != source_pair)) { encode_attr(target, CUR_SLIMIT source->attr, previous->attr, source_pair, previous_pair); } target += strlen(target); #if NCURSES_EXT_COLORS if (previous->ext_color != source->ext_color) { _nc_SPRINTF(target, CUR_SLIMIT "%c%cC%d%c", MARKER, L_CURL, source->ext_color, R_CURL); } #endif for (n = 0; n < SIZEOF(source->chars); ++n) { unsigned uch = (unsigned) source->chars[n]; if (uch == 0) continue; if (n) { *target++ = MARKER; *target++ = APPEND; } *target++ = MARKER; if (uch > 0xffff) { _nc_SPRINTF(target, CUR_SLIMIT "U%08x", uch); } else if (uch > 0xff) { _nc_SPRINTF(target, CUR_SLIMIT "u%04x", uch); } else if (uch < 32 || uch >= 127) { _nc_SPRINTF(target, CUR_SLIMIT "%03o", uch & 0xff); } else { switch (uch) { case ' ': _nc_STRCPY(target, "s", limit); break; case MARKER: *target++ = MARKER; *target = '\0'; break; default: --target; _nc_SPRINTF(target, CUR_SLIMIT "%c", uch); break; } } target += strlen(target); } #else chtype ch = CharOfD(source); *target = '\0'; if (AttrOfD(previous) != AttrOfD(source)) { encode_attr(target, CUR_SLIMIT AttrOfD(source), AttrOfD(previous), GetPair(source), GetPair(previous)); } target += strlen(target); *target++ = MARKER; if (ch < 32 || ch >= 127) { _nc_SPRINTF(target, CUR_SLIMIT "%03o", UChar(ch)); } else { switch (ch) { case ' ': _nc_STRCPY(target, "s", limit); break; case MARKER: *target++ = MARKER; *target = '\0'; break; default: --target; _nc_SPRINTF(target, CUR_SLIMIT "%c", UChar(ch)); break; } } #endif } #endif NCURSES_EXPORT(int) putwin(WINDOW *win, FILE *filep) { int code = ERR; T((T_CALLED("putwin(%p,%p)"), (void *) win, (void *) filep)); #if NCURSES_EXT_PUTWIN if (win != 0) { const char *version = curses_version(); char buffer[1024]; NCURSES_CH_T last_cell; int y; memset(&last_cell, 0, sizeof(last_cell)); clearerr(filep); /* * Our magic number is technically nonprinting, but aside from that, * all of the file is printable ASCII. */ #define PUTS(s) if (fputs(s, filep) == EOF || ferror(filep)) returnCode(code) PUTS(my_magic); PUTS(version); PUTS("\n"); for (y = 0; y < (int) SIZEOF(scr_params); ++y) { const char *name = scr_params[y].name; const char *data = (char *) win + scr_params[y].offset; const void *dp = (const void *) data; attr_t attr; *buffer = '\0'; if (!strncmp(name, "_pad.", (size_t) 5) && !IS_PAD(win)) { continue; } switch (scr_params[y].type) { case pATTR: attr = (*(const attr_t *) dp) & ~A_CHARTEXT; encode_attr(buffer, TOP_SLIMIT (*(const attr_t *) dp) & ~A_CHARTEXT, A_NORMAL, COLOR_PAIR((int) attr), 0); break; case pBOOL: if (!(*(const bool *) data)) { continue; } _nc_STRCPY(buffer, name, sizeof(buffer)); name = "flag"; break; case pCHAR: attr = (*(const attr_t *) dp); encode_attr(buffer, TOP_SLIMIT * (const attr_t *) dp, A_NORMAL, COLOR_PAIR((int) attr), 0); break; case pINT: if (!(*(const int *) dp)) continue; _nc_SPRINTF(buffer, TOP_SLIMIT "%d", *(const int *) dp); break; case pSHORT: if (!(*(const short *) dp)) continue; _nc_SPRINTF(buffer, TOP_SLIMIT "%d", *(const short *) dp); break; case pSIZE: if (!(*(const NCURSES_SIZE_T *) dp)) continue; _nc_SPRINTF(buffer, TOP_SLIMIT "%d", *(const NCURSES_SIZE_T *) dp); break; #if NCURSES_WIDECHAR case pCCHAR: encode_cell(buffer, TOP_SLIMIT (CARG_CH_T) dp, CHREF(last_cell)); break; #endif } /* * Only write non-default data. */ if (*buffer != '\0') { if (fprintf(filep, "%s=%s\n", name, buffer) <= 0 || ferror(filep)) returnCode(code); } } /* Write row-data */ fprintf(filep, "rows:\n"); for (y = 0; y <= win->_maxy; y++) { NCURSES_CH_T *data = win->_line[y].text; int x; if (fprintf(filep, "%d:", y + 1) <= 0 || ferror(filep)) returnCode(code); for (x = 0; x <= win->_maxx; x++) { #if NCURSES_WIDECHAR int len = _nc_wacs_width(data[x].chars[0]); encode_cell(buffer, TOP_SLIMIT CHREF(data[x]), CHREF(last_cell)); last_cell = data[x]; PUTS(buffer); if (len > 1) x += (len - 1); #else encode_cell(buffer, TOP_SLIMIT CHREF(data[x]), CHREF(last_cell)); last_cell = data[x]; PUTS(buffer); #endif } PUTS("\n"); } code = OK; } #else /* * This is the original putwin(): * A straight binary dump is simple, but its format can depend on whether * ncurses is compiled with wide-character support, and also may depend * on the version of ncurses, e.g., if the WINDOW structure is extended. */ if (win != 0) { size_t len = (size_t) (win->_maxx + 1); int y; clearerr(filep); if (fwrite(win, sizeof(WINDOW), (size_t) 1, filep) != 1 || ferror(filep)) returnCode(code); for (y = 0; y <= win->_maxy; y++) { if (fwrite(win->_line[y].text, sizeof(NCURSES_CH_T), len, filep) != len || ferror(filep)) { returnCode(code); } } code = OK; } #endif returnCode(code); } /* * Replace a window covering the whole screen, i.e., newscr or curscr. */ static WINDOW * replace_window(WINDOW *target, FILE *source) { WINDOW *result = getwin(source); #if NCURSES_EXT_FUNCS if (result != NULL) { if (getmaxx(result) != getmaxx(target) || getmaxy(result) != getmaxy(target)) { int code = wresize(result, 1 + getmaxy(target), 1 + getmaxx(target)); if (code != OK) { delwin(result); result = NULL; } } } #endif delwin(target); return result; } NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_restore) (NCURSES_SP_DCLx const char *file) { FILE *fp = 0; int code = ERR; T((T_CALLED("scr_restore(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file))); if (_nc_access(file, R_OK) >= 0 && (fp = safe_fopen(file, BIN_R)) != 0) { NewScreen(SP_PARM) = replace_window(NewScreen(SP_PARM), fp); #if !USE_REENTRANT newscr = NewScreen(SP_PARM); #endif (void) fclose(fp); if (NewScreen(SP_PARM) != 0) { code = OK; } } returnCode(code); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) scr_restore(const char *file) { return NCURSES_SP_NAME(scr_restore) (CURRENT_SCREEN, file); } #endif NCURSES_EXPORT(int) scr_dump(const char *file) { int result; FILE *fp = 0; T((T_CALLED("scr_dump(%s)"), _nc_visbuf(file))); if (_nc_access(file, W_OK) < 0 || (fp = safe_fopen(file, BIN_W)) == 0) { result = ERR; } else { (void) putwin(newscr, fp); (void) fclose(fp); result = OK; } returnCode(result); } NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_init) (NCURSES_SP_DCLx const char *file) { int code = ERR; T((T_CALLED("scr_init(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file))); if (SP_PARM != 0 && #ifdef USE_TERM_DRIVER InfoOf(SP_PARM).caninit #else !(exit_ca_mode && non_rev_rmcup) #endif ) { FILE *fp = 0; if (_nc_access(file, R_OK) >= 0 && (fp = safe_fopen(file, BIN_R)) != 0) { CurScreen(SP_PARM) = replace_window(CurScreen(SP_PARM), fp); #if !USE_REENTRANT curscr = CurScreen(SP_PARM); #endif (void) fclose(fp); if (CurScreen(SP_PARM) != 0) { code = OK; } } } returnCode(code); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) scr_init(const char *file) { return NCURSES_SP_NAME(scr_init) (CURRENT_SCREEN, file); } #endif NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_set) (NCURSES_SP_DCLx const char *file) { int code = ERR; T((T_CALLED("scr_set(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file))); if (NCURSES_SP_NAME(scr_init) (NCURSES_SP_ARGx file) == OK) { delwin(NewScreen(SP_PARM)); NewScreen(SP_PARM) = dupwin(curscr); #if !USE_REENTRANT newscr = NewScreen(SP_PARM); #endif if (NewScreen(SP_PARM) != 0) { code = OK; } } returnCode(code); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) scr_set(const char *file) { return NCURSES_SP_NAME(scr_set) (CURRENT_SCREEN, file); } #endif ncurses-6.4-20240113/ncurses/base/lib_chgat.c0000644000000000000000000000665413615656212017133 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_endwin.c0000644000000000000000000000703314523770704017323 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_slklab.c0000644000000000000000000000625513615656212017312 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_newterm.c0000644000000000000000000002621614262347762017530 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2022 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 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.104 2022/07/09 18:58:58 tom Exp $") #ifdef USE_TERM_DRIVER #define NumLabels InfoOf(SP_PARM).numlabels #else #define NumLabels num_labels #endif #ifndef ONLCR /* Allows compilation under the QNX 4.2 OS */ #define ONLCR 0 #endif /* * SVr4/XSI Curses specify that hardware echo is turned off in initscr, and not * restored during the curses session. The library simulates echo in software. * (The behavior is unspecified if the application enables hardware echo). * * The newterm function also initializes terminal settings, and since initscr * is supposed to behave as if it calls newterm, we do it here. */ static NCURSES_INLINE int _nc_initscr(NCURSES_SP_DCL0) { int result = ERR; TERMINAL *term = TerminalOf(SP_PARM); /* for extended XPG4 conformance requires cbreak() at this point */ /* (SVr4 curses does this anyway) */ T((T_CALLED("_nc_initscr(%p) ->term %p"), (void *) SP_PARM, (void *) term)); if (NCURSES_SP_NAME(cbreak) (NCURSES_SP_ARG) == OK) { TTY buf; buf = term->Nttyb; #ifdef TERMIOS buf.c_lflag &= (unsigned) ~(ECHO | ECHONL); buf.c_iflag &= (unsigned) ~(ICRNL | INLCR | IGNCR); buf.c_oflag &= (unsigned) ~(ONLCR); #elif HAVE_SGTTY_H buf.sg_flags &= ~(ECHO | CRMOD); #elif defined(EXP_WIN32_DRIVER) buf.dwFlagIn = CONMODE_IN_DEFAULT; buf.dwFlagOut = CONMODE_OUT_DEFAULT | VT_FLAG_OUT; if (WINCONSOLE.isTermInfoConsole) { buf.dwFlagIn |= VT_FLAG_IN; } #else memset(&buf, 0, sizeof(buf)); #endif result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); if (result == OK) term->Nttyb = buf; } returnCode(result); } /* * filter() has to be called before either initscr() or newterm(), so there is * apparently no way to make this flag apply to some terminals and not others, * aside from possibly delaying a filter() call until some terminals have been * initialized. */ NCURSES_EXPORT(void) NCURSES_SP_NAME(filter) (NCURSES_SP_DCL0) { START_TRACE(); T((T_CALLED("filter(%p)"), (void *) SP_PARM)); #if NCURSES_SP_FUNCS if (IsPreScreen(SP_PARM)) { SP_PARM->_filtered = TRUE; } #else _nc_prescreen.filter_mode = TRUE; #endif returnVoid; } #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) filter(void) { START_TRACE(); T((T_CALLED("filter()"))); _nc_prescreen.filter_mode = TRUE; returnVoid; } #endif #if NCURSES_EXT_FUNCS /* * An extension, allowing the application to open a new screen without * requiring it to also be filtered. */ NCURSES_EXPORT(void) NCURSES_SP_NAME(nofilter) (NCURSES_SP_DCL0) { START_TRACE(); T((T_CALLED("nofilter(%p)"), (void *) SP_PARM)); #if NCURSES_SP_FUNCS if (IsPreScreen(SP_PARM)) { SP_PARM->_filtered = FALSE; } #else _nc_prescreen.filter_mode = FALSE; #endif returnVoid; } #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) nofilter(void) { START_TRACE(); T((T_CALLED("nofilter()"))); _nc_prescreen.filter_mode = FALSE; returnVoid; } #endif #endif /* NCURSES_EXT_FUNCS */ NCURSES_EXPORT(SCREEN *) NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx const char *name, FILE *ofp, FILE *ifp) { int errret; SCREEN *result = 0; SCREEN *current; TERMINAL *its_term; FILE *_ofp = ofp ? ofp : stdout; FILE *_ifp = ifp ? ifp : stdin; TERMINAL *new_term = 0; START_TRACE(); T((T_CALLED("newterm(%p, \"%s\", %p,%p)"), (void *) SP_PARM, (name ? name : ""), (void *) ofp, (void *) ifp)); #if NCURSES_SP_FUNCS assert(SP_PARM != 0); if (SP_PARM == 0) returnSP(SP_PARM); #endif _nc_init_pthreads(); _nc_lock_global(curses); current = CURRENT_SCREEN; its_term = (current ? current->_term : 0); #if defined(EXP_WIN32_DRIVER) _setmode(fileno(_ifp), _O_BINARY); _setmode(fileno(_ofp), _O_BINARY); #endif INIT_TERM_DRIVER(); /* this loads the capability entry, then sets LINES and COLS */ if ( TINFO_SETUP_TERM(&new_term, name, fileno(_ofp), &errret, FALSE) != ERR) { int slk_format; int filter_mode; _nc_set_screen(0); #ifdef USE_TERM_DRIVER assert(new_term != 0); #endif #if NCURSES_SP_FUNCS slk_format = SP_PARM->slk_format; filter_mode = SP_PARM->_filtered; #else slk_format = _nc_globals.slk_format; filter_mode = _nc_prescreen.filter_mode; #endif /* * This actually allocates the screen structure, and saves the original * terminal settings. */ if (NCURSES_SP_NAME(_nc_setupscreen) ( #if NCURSES_SP_FUNCS &SP_PARM, #endif *(ptrLines(SP_PARM)), *(ptrCols(SP_PARM)), _ofp, filter_mode, slk_format) == ERR) { _nc_set_screen(current); result = 0; } else { int value; int cols; #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *TCB; #elif !NCURSES_SP_FUNCS _nc_set_screen(CURRENT_SCREEN); #endif assert(SP_PARM != 0); cols = *(ptrCols(SP_PARM)); #ifdef USE_TERM_DRIVER _nc_set_screen(SP_PARM); TCB = (TERMINAL_CONTROL_BLOCK *) new_term; TCB->csp = SP_PARM; #endif /* * In setupterm() we did a set_curterm(), but it was before we set * CURRENT_SCREEN. So the "current" screen's terminal pointer was * overwritten with a different terminal. Later, in * _nc_setupscreen(), we set CURRENT_SCREEN and the terminal * pointer in the new screen. * * Restore the terminal-pointer for the pre-existing screen, if * any. */ if (current) current->_term = its_term; #ifdef USE_TERM_DRIVER SP_PARM->_term = new_term; #else new_term = SP_PARM->_term; #endif /* allow user to set maximum escape delay from the environment */ if ((value = _nc_getenv_num("ESCDELAY")) >= 0) { #if NCURSES_EXT_FUNCS NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_ARGx value); #else ESCDELAY = value; #endif } /* if the terminal type has real soft labels, set those up */ if (slk_format && NumLabels > 0 && SLK_STDFMT(slk_format)) _nc_slk_initialize(StdScreen(SP_PARM), cols); SP_PARM->_ifd = fileno(_ifp); NCURSES_SP_NAME(typeahead) (NCURSES_SP_ARGx fileno(_ifp)); #ifdef TERMIOS SP_PARM->_use_meta = ((new_term->Ottyb.c_cflag & CSIZE) == CS8 && !(new_term->Ottyb.c_iflag & ISTRIP)) || USE_KLIBC_KBD; #else SP_PARM->_use_meta = FALSE; #endif SP_PARM->_endwin = ewInitial; #ifndef USE_TERM_DRIVER /* * Check whether we can optimize scrolling under dumb terminals in * case we do not have any of these capabilities, scrolling * optimization will be useless. */ SP_PARM->_scrolling = ((scroll_forward && scroll_reverse) || ((parm_rindex || parm_insert_line || insert_line) && (parm_index || parm_delete_line || delete_line))); #endif NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG); /* sets a field in the screen structure */ SP_PARM->_keytry = 0; /* compute movement costs so we can do better move optimization */ #ifdef USE_TERM_DRIVER TCBOf(SP_PARM)->drv->td_scinit(SP_PARM); #else /* ! USE_TERM_DRIVER */ /* * Check for mismatched graphic-rendition capabilities. Most SVr4 * terminfo trees contain entries that have rmul or rmso equated to * sgr0 (Solaris curses copes with those entries). We do this only * for curses, since many termcap applications assume that * smso/rmso and smul/rmul are paired, and will not function * properly if we remove rmso or rmul. Curses applications * shouldn't be looking at this detail. */ #define SGR0_TEST(mode) (mode != 0) && (exit_attribute_mode == 0 || strcmp(mode, exit_attribute_mode)) SP_PARM->_use_rmso = SGR0_TEST(exit_standout_mode); SP_PARM->_use_rmul = SGR0_TEST(exit_underline_mode); #if USE_ITALIC SP_PARM->_use_ritm = SGR0_TEST(exit_italics_mode); #endif /* compute movement costs so we can do better move optimization */ _nc_mvcur_init(); /* initialize terminal to a sane state */ _nc_screen_init(); #endif /* USE_TERM_DRIVER */ /* Initialize the terminal line settings. */ _nc_initscr(NCURSES_SP_ARG); _nc_signal_handler(TRUE); result = SP_PARM; } } _nc_unlock_global(curses); returnSP(result); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(SCREEN *) newterm(const char *name, FILE *ofp, FILE *ifp) { SCREEN *rc; _nc_init_pthreads(); _nc_lock_global(prescreen); START_TRACE(); rc = NCURSES_SP_NAME(newterm) (CURRENT_SCREEN_PRE, name, ofp, ifp); _nc_forget_prescr(); _nc_unlock_global(prescreen); return rc; } #endif ncurses-6.4-20240113/ncurses/base/lib_beep.c0000644000000000000000000000705313615656212016752 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_addch.c0000644000000000000000000004042214251401531017064 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,2022 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /* ** lib_addch.c ** ** The routine waddch(). ** */ #include #include MODULE_ID("$Id: lib_addch.c,v 1.141 2022/06/12 15:16:41 tom Exp $") static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT); /* * Ugly microtweaking alert. Everything from here to end of module is * likely to be speed-critical -- profiling data sure says it is! * Most of the important screen-painting functions are shells around * waddch(). So we make every effort to reduce function-call overhead * by inlining stuff, even at the cost of making wrapped copies for * export. Also we supply some internal versions that don't call the * window sync hook, for use by string-put functions. */ /* Return bit mask for clearing color pair number if given ch has color */ #define COLOR_MASK(ch) (~(attr_t)(((ch) & A_COLOR) ? A_COLOR : 0)) static NCURSES_INLINE NCURSES_CH_T render_char(WINDOW *win, NCURSES_CH_T ch) /* compute a rendition of the given char correct for the current context */ { attr_t a = WINDOW_ATTRS(win); int pair = GetPair(ch); if (ISBLANK(ch) && AttrOf(ch) == A_NORMAL && pair == 0) { /* color/pair in attrs has precedence over bkgrnd */ ch = win->_nc_bkgd; SetAttr(ch, a | AttrOf(win->_nc_bkgd)); if ((pair = GET_WINDOW_PAIR(win)) == 0) pair = GetPair(win->_nc_bkgd); SetPair(ch, pair); } else { /* color in attrs has precedence over bkgrnd */ a |= AttrOf(win->_nc_bkgd) & COLOR_MASK(a); /* color in ch has precedence */ if (pair == 0) { if ((pair = GET_WINDOW_PAIR(win)) == 0) pair = GetPair(win->_nc_bkgd); } AddAttr(ch, (a & COLOR_MASK(AttrOf(ch)))); SetPair(ch, pair); } TR(TRACE_VIRTPUT, ("render_char bkg %s (%d), attrs %s (%d) -> ch %s (%d)", _tracech_t2(1, CHREF(win->_nc_bkgd)), GetPair(win->_nc_bkgd), _traceattr(WINDOW_ATTRS(win)), GET_WINDOW_PAIR(win), _tracech_t2(3, CHREF(ch)), GetPair(ch))); return (ch); } NCURSES_EXPORT(NCURSES_CH_T) _nc_render(WINDOW *win, NCURSES_CH_T ch) /* make render_char() visible while still allowing us to inline it below */ { return render_char(win, ch); } /* check if position is legal; if not, return error */ #ifndef NDEBUG /* treat this like an assertion */ #define CHECK_POSITION(win, x, y) \ if (y > win->_maxy \ || x > win->_maxx \ || y < 0 \ || x < 0) { \ TR(TRACE_VIRTPUT, ("Alert! Win=%p _curx = %d, _cury = %d " \ "(_maxx = %d, _maxy = %d)", win, x, y, \ win->_maxx, win->_maxy)); \ return(ERR); \ } #else #define CHECK_POSITION(win, x, y) /* nothing */ #endif static bool newline_forces_scroll(WINDOW *win, NCURSES_SIZE_T *ypos) { bool result = FALSE; if (*ypos >= win->_regtop && *ypos <= win->_regbottom) { if (*ypos == win->_regbottom) { *ypos = win->_regbottom; result = TRUE; } else if (*ypos < win->_maxy) { *ypos = (NCURSES_SIZE_T) (*ypos + 1); } } else if (*ypos < win->_maxy) { *ypos = (NCURSES_SIZE_T) (*ypos + 1); } return result; } /* * The _WRAPPED flag is useful only for telling an application that we've just * wrapped the cursor. We don't do anything with this flag except set it when * wrapping, and clear it whenever we move the cursor. If we try to wrap at * the lower-right corner of a window, we cannot move the cursor (since that * wouldn't be legal). So we return an error (which is what SVr4 does). * Unlike SVr4, we can successfully add a character to the lower-right corner * (Solaris 2.6 does this also, however). */ static int wrap_to_next_line(WINDOW *win) { win->_flags |= _WRAPPED; if (newline_forces_scroll(win, &(win->_cury))) { win->_curx = win->_maxx; if (!win->_scroll) return (ERR); scroll(win); } win->_curx = 0; return (OK); } #if USE_WIDEC_SUPPORT static int waddch_literal(WINDOW *, NCURSES_CH_T); /* * Fill the given number of cells with blanks using the current background * rendition. This saves/restores the current x-position. */ static void fill_cells(WINDOW *win, int count) { NCURSES_CH_T blank = blankchar; int save_x = win->_curx; int save_y = win->_cury; while (count-- > 0) { if (waddch_literal(win, blank) == ERR) break; } win->_curx = (NCURSES_SIZE_T) save_x; win->_cury = (NCURSES_SIZE_T) save_y; } #endif /* * Build up the bytes for a multibyte character, returning the length when * complete (a positive number), -1 for error and -2 for incomplete. */ #if USE_WIDEC_SUPPORT NCURSES_EXPORT(int) _nc_build_wch(WINDOW *win, ARG_CH_T ch) { char *buffer = WINDOW_EXT(win, addch_work); int len; int x = win->_curx; int y = win->_cury; mbstate_t state; wchar_t result; if ((WINDOW_EXT(win, addch_used) != 0) && (WINDOW_EXT(win, addch_x) != x || WINDOW_EXT(win, addch_y) != y)) { /* discard the incomplete multibyte character */ WINDOW_EXT(win, addch_used) = 0; TR(TRACE_VIRTPUT, ("Alert discarded multibyte on move (%d,%d) -> (%d,%d)", WINDOW_EXT(win, addch_y), WINDOW_EXT(win, addch_x), y, x)); } WINDOW_EXT(win, addch_x) = x; WINDOW_EXT(win, addch_y) = y; /* * If the background character is a wide-character, that may interfere with * processing multibyte characters in this function. */ if (!is8bits(CharOf(CHDEREF(ch)))) { if (WINDOW_EXT(win, addch_used) != 0) { /* discard the incomplete multibyte character */ WINDOW_EXT(win, addch_used) = 0; TR(TRACE_VIRTPUT, ("Alert discarded incomplete multibyte")); } return 1; } init_mb(state); buffer[WINDOW_EXT(win, addch_used)] = (char) CharOf(CHDEREF(ch)); WINDOW_EXT(win, addch_used) += 1; buffer[WINDOW_EXT(win, addch_used)] = '\0'; if ((len = (int) mbrtowc(&result, buffer, (size_t) WINDOW_EXT(win, addch_used), &state)) > 0) { attr_t attrs = AttrOf(CHDEREF(ch)); if_EXT_COLORS(int pair = GetPair(CHDEREF(ch))); SetChar(CHDEREF(ch), result, attrs); if_EXT_COLORS(SetPair(CHDEREF(ch), pair)); WINDOW_EXT(win, addch_used) = 0; } else if (len == -1) { /* * An error occurred. We could either discard everything, * or assume that the error was in the previous input. * Try the latter. */ TR(TRACE_VIRTPUT, ("Alert! mbrtowc returns error")); /* handle this with unctrl() */ WINDOW_EXT(win, addch_used) = 0; } return len; } #endif /* USE_WIDEC_SUPPORT */ static #if !USE_WIDEC_SUPPORT /* cannot be inline if it is recursive */ NCURSES_INLINE #endif int waddch_literal(WINDOW *win, NCURSES_CH_T ch) { int x; int y; struct ldat *line; x = win->_curx; y = win->_cury; CHECK_POSITION(win, x, y); ch = render_char(win, ch); line = win->_line + y; CHANGED_CELL(line, x); /* * Build up multibyte characters until we have a wide-character. */ #if NCURSES_SP_FUNCS #define DeriveSP() SCREEN *sp = _nc_screen_of(win); #else #define DeriveSP() /*nothing */ #endif if_WIDEC({ DeriveSP(); if (WINDOW_EXT(win, addch_used) != 0 || !Charable(ch)) { int len = _nc_build_wch(win, CHREF(ch)); if (len >= -1) { attr_t attr = AttrOf(ch); /* handle EILSEQ (i.e., when len >= -1) */ if (len == -1 && is8bits(CharOf(ch))) { const char *s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (chtype) CharOf(ch)); if (s[1] != '\0') { int rc = OK; while (*s != '\0') { rc = waddch(win, UChar(*s) | attr); if (rc != OK) break; ++s; } return rc; } } if (len == -1) return waddch(win, ' ' | attr); } else { return OK; } } }); /* * Non-spacing characters are added to the current cell. * * Spacing characters that are wider than one column require some display * adjustments. */ if_WIDEC({ int len = _nc_wacs_width(CharOf(ch)); int i; int j; if (len == 0) { /* non-spacing */ if ((x > 0 && y >= 0) || (win->_maxx >= 0 && win->_cury >= 1)) { NCURSES_CH_T *dst; wchar_t *chars; if (x > 0 && y >= 0) { for (j = x - 1; j >= 0; --j) { if (!isWidecExt(win->_line[y].text[j])) { win->_curx = (NCURSES_SIZE_T) j; break; } } dst = &(win->_line[y].text[j]); } else { dst = &(win->_line[y - 1].text[win->_maxx]); } chars = dst->chars; for (i = 0; i < CCHARW_MAX; ++i) { if (chars[i] == 0) { TR(TRACE_VIRTPUT, ("adding non-spacing %s (level %d)", _tracech_t(CHREF(ch)), i)); chars[i] = CharOf(ch); break; } } } goto testwrapping; } else if (len > 1) { /* multi-column characters */ /* * Check if the character will fit on the current line. If it does * not fit, fill in the remainder of the line with blanks. and * move to the next line. */ if (len > win->_maxx + 1) { TR(TRACE_VIRTPUT, ("character will not fit")); return ERR; } else if (x + len > win->_maxx + 1) { int count = win->_maxx + 1 - x; TR(TRACE_VIRTPUT, ("fill %d remaining cells", count)); fill_cells(win, count); if (wrap_to_next_line(win) == ERR) return ERR; x = win->_curx; y = win->_cury; CHECK_POSITION(win, x, y); line = win->_line + y; } /* * Check for cells which are orphaned by adding this character, set * those to blanks. * * FIXME: this actually could fill j-i cells, more complicated to * setup though. */ for (i = 0; i < len; ++i) { if (isWidecBase(win->_line[y].text[x + i])) { break; } else if (isWidecExt(win->_line[y].text[x + i])) { for (j = i; x + j <= win->_maxx; ++j) { if (!isWidecExt(win->_line[y].text[x + j])) { TR(TRACE_VIRTPUT, ("fill %d orphan cells", j)); fill_cells(win, j); break; } } break; } } /* * Finally, add the cells for this character. */ for (i = 0; i < len; ++i) { NCURSES_CH_T value = ch; SetWidecExt(value, i); TR(TRACE_VIRTPUT, ("multicolumn %d:%d (%d,%d)", i + 1, len, win->_begy + y, win->_begx + x)); line->text[x] = value; CHANGED_CELL(line, x); ++x; } goto testwrapping; } }); /* * Single-column characters. */ line->text[x++] = ch; /* * This label is used only for wide-characters. */ if_WIDEC( testwrapping: ); TR(TRACE_VIRTPUT, ("cell (%d, %d..%d) = %s", win->_cury, win->_curx, x - 1, _tracech_t(CHREF(line->text[win->_curx])))); if (x > win->_maxx) { return wrap_to_next_line(win); } win->_curx = (NCURSES_SIZE_T) x; return OK; } static NCURSES_INLINE int waddch_nosync(WINDOW *win, const NCURSES_CH_T ch) /* the workhorse function -- add a character to the given window */ { NCURSES_SIZE_T x, y; chtype t = (chtype) CharOf(ch); #if USE_WIDEC_SUPPORT || NCURSES_SP_FUNCS || USE_REENTRANT SCREEN *sp = _nc_screen_of(win); #endif const char *s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx t); int tabsize = 8; /* * If we are using the alternate character set, forget about locale. * Otherwise, if unctrl() returns a single-character or the locale * claims the code is printable (and not also a control character), * treat it that way. */ if ((AttrOf(ch) & A_ALTCHARSET) || ( #if USE_WIDEC_SUPPORT (sp != 0 && sp->_legacy_coding) && #endif s[1] == 0 ) || ( (isprint((int) t) && !iscntrl((int) t)) #if USE_WIDEC_SUPPORT || ((sp == 0 || !sp->_legacy_coding) && (WINDOW_EXT(win, addch_used) || !_nc_is_charable(CharOf(ch)))) #endif )) { return waddch_literal(win, ch); } /* * Handle carriage control and other codes that are not printable, or are * known to expand to more than one character according to unctrl(). */ x = win->_curx; y = win->_cury; CHECK_POSITION(win, x, y); switch (t) { case '\t': #if USE_REENTRANT tabsize = *ptrTabsize(sp); #else tabsize = TABSIZE; #endif x = (NCURSES_SIZE_T) (x + (tabsize - (x % tabsize))); /* * Space-fill the tab on the bottom line so that we'll get the * "correct" cursor position. */ if ((!win->_scroll && (y == win->_regbottom)) || (x <= win->_maxx)) { NCURSES_CH_T blank = blankchar; AddAttr(blank, AttrOf(ch)); while (win->_curx < x) { if (waddch_literal(win, blank) == ERR) return (ERR); } break; } else { wclrtoeol(win); win->_flags |= _WRAPPED; if (newline_forces_scroll(win, &y)) { x = win->_maxx; if (win->_scroll) { scroll(win); x = 0; } } else { x = 0; } } break; case '\n': wclrtoeol(win); if (newline_forces_scroll(win, &y)) { if (win->_scroll) scroll(win); else return (ERR); } /* FALLTHRU */ case '\r': x = 0; win->_flags &= ~_WRAPPED; break; case '\b': if (x == 0) return (OK); x--; win->_flags &= ~_WRAPPED; break; default: while (*s) { NCURSES_CH_T sch; SetChar(sch, UChar(*s++), AttrOf(ch)); if_EXT_COLORS(SetPair(sch, GetPair(ch))); if (waddch_literal(win, sch) == ERR) return ERR; } return (OK); } win->_curx = x; win->_cury = y; return (OK); } NCURSES_EXPORT(int) _nc_waddch_nosync(WINDOW *win, const NCURSES_CH_T c) /* export copy of waddch_nosync() so the string-put functions can use it */ { return (waddch_nosync(win, c)); } /* * The versions below call _nc_synchook(). We wanted to avoid this in the * version exported for string puts; they'll call _nc_synchook once at end * of run. */ /* These are actual entry points */ NCURSES_EXPORT(int) waddch(WINDOW *win, const chtype ch) { int code = ERR; NCURSES_CH_T wch; SetChar2(wch, ch); TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("waddch(%p, %s)"), (void *) win, _tracechtype(ch))); if (win && (waddch_nosync(win, wch) != ERR)) { _nc_synchook(win); code = OK; } TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code)); return (code); } NCURSES_EXPORT(int) wechochar(WINDOW *win, const chtype ch) { int code = ERR; NCURSES_CH_T wch; SetChar2(wch, ch); TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("wechochar(%p, %s)"), (void *) win, _tracechtype(ch))); if (win && (waddch_nosync(win, wch) != ERR)) { bool save_immed = win->_immed; win->_immed = TRUE; _nc_synchook(win); win->_immed = save_immed; code = OK; } TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code)); return (code); } ncurses-6.4-20240113/ncurses/base/lib_printw.c0000644000000000000000000001165013615656212017360 0ustar rootroot/**************************************************************************** * Copyright 2018-2019,2020 Thomas E. Dickey * * Copyright 1998-2012,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey 1997-on * ****************************************************************************/ /* ** lib_printw.c ** ** The routines printw(), wprintw() and friends. ** */ #include MODULE_ID("$Id: lib_printw.c,v 1.28 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) printw(const char *fmt, ...) { va_list argp; int code; #ifdef TRACE va_list argq; va_start(argq, fmt); T((T_CALLED("printw(%s%s)"), _nc_visbuf(fmt), _nc_varargs(fmt, argq))); va_end(argq); #endif va_start(argp, fmt); code = vw_printw(stdscr, fmt, argp); va_end(argp); returnCode(code); } NCURSES_EXPORT(int) wprintw(WINDOW *win, const char *fmt, ...) { va_list argp; int code; #ifdef TRACE va_list argq; va_start(argq, fmt); T((T_CALLED("wprintw(%p,%s%s)"), (void *) win, _nc_visbuf(fmt), _nc_varargs(fmt, argq))); va_end(argq); #endif va_start(argp, fmt); code = vw_printw(win, fmt, argp); va_end(argp); returnCode(code); } NCURSES_EXPORT(int) mvprintw(int y, int x, const char *fmt, ...) { int code; #ifdef TRACE va_list argq; va_start(argq, fmt); T((T_CALLED("mvprintw(%d,%d,%s%s)"), y, x, _nc_visbuf(fmt), _nc_varargs(fmt, argq))); va_end(argq); #endif if ((code = move(y, x)) != ERR) { va_list argp; va_start(argp, fmt); code = vw_printw(stdscr, fmt, argp); va_end(argp); } returnCode(code); } NCURSES_EXPORT(int) mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...) { int code; #ifdef TRACE va_list argq; va_start(argq, fmt); T((T_CALLED("mvwprintw(%d,%d,%p,%s%s)"), y, x, (void *) win, _nc_visbuf(fmt), _nc_varargs(fmt, argq))); va_end(argq); #endif if ((code = wmove(win, y, x)) != ERR) { va_list argp; va_start(argp, fmt); code = vw_printw(win, fmt, argp); va_end(argp); } returnCode(code); } NCURSES_EXPORT(int) vwprintw(WINDOW *win, const char *fmt, va_list argp) { char *buf; int code = ERR; #if NCURSES_SP_FUNCS SCREEN *sp = _nc_screen_of(win); #endif T((T_CALLED("vwprintw(%p,%s,va_list)"), (void *) win, _nc_visbuf(fmt))); buf = NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_ARGx fmt, argp); if (buf != 0) { code = waddstr(win, buf); } returnCode(code); } NCURSES_EXPORT(int) vw_printw(WINDOW *win, const char *fmt, va_list argp) { char *buf; int code = ERR; #if NCURSES_SP_FUNCS SCREEN *sp = _nc_screen_of(win); #endif T((T_CALLED("vw_printw(%p,%s,va_list)"), (void *) win, _nc_visbuf(fmt))); buf = NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_ARGx fmt, argp); if (buf != 0) { code = waddstr(win, buf); } returnCode(code); } ncurses-6.4-20240113/ncurses/base/lib_insdel.c0000644000000000000000000000600213615656212017306 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_slkatr_set.c0000644000000000000000000000712713615656212020214 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_slkinit.c0000644000000000000000000000724414262347762017524 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_immedok.c0000644000000000000000000000537713615656212017473 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/ncurses/base/lib_instr.c0000644000000000000000000001034314436631760017175 0ustar rootroot/**************************************************************************** * 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: 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.26 2023/06/03 12:37:04 tom Exp $") NCURSES_EXPORT(int) winnstr(WINDOW *win, char *str, int n) { int i = 0; T((T_CALLED("winnstr(%p,%p,%d)"), (void *) win, str, n)); if (!win || !str) { i = ERR; } else { int row = win->_cury; int col = win->_curx; NCURSES_CH_T *text = win->_line[row].text; if (n < 0) n = win->_maxx - col + 1; for (; i < n;) { #if USE_WIDEC_SUPPORT cchar_t *cell = &(text[col]); attr_t attrs; NCURSES_PAIRS_T pair; char *tmp; if (!isWidecExt(*cell)) { wchar_t *wch; int n2; n2 = getcchar(cell, 0, 0, 0, 0); if (n2 > 0 && (wch = typeCalloc(wchar_t, (unsigned) n2 + 1)) != 0) { bool done = FALSE; if (getcchar(cell, wch, &attrs, &pair, 0) == OK) { mbstate_t state; size_t n3; init_mb(state); n3 = wcstombs(0, wch, (size_t) 0); if (!isEILSEQ(n3) && (n3 != 0) && (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); } ncurses-6.4-20240113/ncurses/base/nc_panel.c0000644000000000000000000000547613615656212016777 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_bkgd.c0000644000000000000000000002003314045523404016731 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_delch.c0000644000000000000000000000614213615656212017114 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* ** lib_delch.c ** ** The routine wdelch(). ** */ #include MODULE_ID("$Id: lib_delch.c,v 1.14 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) wdelch(WINDOW *win) { int code = ERR; T((T_CALLED("wdelch(%p)"), (void *) win)); if (win) { NCURSES_CH_T blank = win->_nc_bkgd; struct ldat *line = &(win->_line[win->_cury]); NCURSES_CH_T *end = &(line->text[win->_maxx]); NCURSES_CH_T *temp2 = &(line->text[win->_curx + 1]); NCURSES_CH_T *temp1 = temp2 - 1; CHANGED_TO_EOL(line, win->_curx, win->_maxx); while (temp1 < end) *temp1++ = *temp2++; *temp1 = blank; _nc_synchook(win); code = OK; } returnCode(code); } ncurses-6.4-20240113/ncurses/base/tries.c0000644000000000000000000001161414445606567016347 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_scrreg.c0000644000000000000000000000572413615656212017327 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/resizeterm.c0000644000000000000000000003442414135041201017364 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2015,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey * * and: Juergen Pfeifer * ****************************************************************************/ /* * This is an extension to the curses library. It provides callers with a hook * into the NCURSES data to resize windows, primarily for use by programs * running in an X Window terminal (e.g., xterm). I abstracted this module * from my application library for NCURSES because it must be compiled with * the private data structures -- T.Dickey 1995/7/4. */ #include #ifndef CUR #define CUR SP_TERMTYPE #endif MODULE_ID("$Id: resizeterm.c,v 1.52 2021/10/23 17:12:33 tom Exp $") /* * If we're trying to be reentrant, do not want any local statics. */ #if USE_REENTRANT #define EXTRA_ARGS , CurLines, CurCols #define EXTRA_DCLS , int CurLines, int CurCols #else static int current_lines; static int current_cols; #define CurLines current_lines #define CurCols current_cols #define EXTRA_ARGS /* nothing */ #define EXTRA_DCLS /* nothing */ #endif #if NCURSES_SP_FUNCS && !defined(USE_SP_WINDOWLIST) #define UNUSED_SP (void) sp #else #define UNUSED_SP /* nothing */ #endif #ifdef TRACE static void show_window_sizes(const char *name) { SCREEN *sp; WINDOWLIST *wp; _nc_lock_global(curses); for (each_screen(sp)) { _tracef("%s resizing: %p: %2d x %2d (%2d x %2d)", name, (void *) sp, *(ptrLines(sp)), *(ptrCols(sp)), screen_lines(sp), screen_columns(sp)); for (each_window(sp, wp)) { _tracef(" window %p is %2ld x %2ld at %2ld,%2ld", (void *) &(wp->win), (long) wp->win._maxy + 1, (long) wp->win._maxx + 1, (long) wp->win._begy, (long) wp->win._begx); } } _nc_unlock_global(curses); } #endif /* * Return true if the given dimensions do not match the internal terminal * structure's size. */ NCURSES_EXPORT(bool) NCURSES_SP_NAME(is_term_resized) (NCURSES_SP_DCLx int ToLines, int ToCols) { T((T_CALLED("is_term_resized(%p, %d, %d)"), (void *) SP_PARM, ToLines, ToCols)); returnCode(ToLines > 0 && ToCols > 0 && (ToLines != screen_lines(SP_PARM) || ToCols != screen_columns(SP_PARM))); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(bool) is_term_resized(int ToLines, int ToCols) { return NCURSES_SP_NAME(is_term_resized) (CURRENT_SCREEN, ToLines, ToCols); } #endif /* */ static ripoff_t * ripped_window(WINDOW *win) { ripoff_t *result = 0; ripoff_t *rop; if (win != 0) { #ifdef USE_SP_RIPOFF SCREEN *sp = _nc_screen_of(win); #endif for (each_ripoff(rop)) { if (rop->win == win && rop->line != 0) { result = rop; break; } } } return result; } /* * Returns the number of lines from the bottom for the beginning of a ripped * off window. */ static int ripped_bottom(WINDOW *win) { int result = 0; if (win != 0) { ripoff_t *rop; #ifdef USE_SP_RIPOFF SCREEN *sp = _nc_screen_of(win); #endif for (each_ripoff(rop)) { if (rop->line < 0) { result -= rop->line; if (rop->win == win) { break; } } } } return result; } /* * Return the number of levels of child-windows under the current window. */ static int child_depth(WINDOW *cmp) { int depth = 0; if (cmp != 0) { #ifdef USE_SP_WINDOWLIST SCREEN *sp = _nc_screen_of(cmp); #endif WINDOWLIST *wp; for (each_window(sp, wp)) { WINDOW *tst = &(wp->win); if (tst->_parent == cmp) { depth = 1 + child_depth(tst); break; } } } return depth; } /* * Return the number of levels of parent-windows above the current window. */ static int parent_depth(WINDOW *cmp) { int depth = 0; if (cmp != 0) { WINDOW *tst; while ((tst = cmp->_parent) != 0) { ++depth; cmp = tst; } } return depth; } /* * FIXME: must adjust position so it is within the parent! */ static int adjust_window(WINDOW *win, int ToLines, int ToCols, int stolen EXTRA_DCLS) { int result; int bottom = CurLines + _nc_screen_of(win)->_topstolen - stolen; int myLines = win->_maxy + 1; int myCols = win->_maxx + 1; ripoff_t *rop = ripped_window(win); T((T_CALLED("adjust_window(%p,%d,%d)%s depth %d/%d currently %ldx%ld at %ld,%ld"), (void *) win, ToLines, ToCols, (rop != 0) ? " (rip)" : "", parent_depth(win), child_depth(win), (long) getmaxy(win), (long) getmaxx(win), (long) getbegy(win) + win->_yoffset, (long) getbegx(win))); if (rop != 0 && rop->line < 0) { /* * If it is a ripped-off window at the bottom of the screen, simply * move it to the same relative position. */ win->_begy = (NCURSES_SIZE_T) (ToLines - ripped_bottom(win) - 0 - win->_yoffset); if (rop->hook == _nc_slk_initialize) _nc_format_slks( #if NCURSES_SP_FUNCS _nc_screen_of(win), #endif ToCols); } else if (win->_begy >= bottom) { /* * If it is below the bottom of the new screen, move up by the same * amount that the screen shrank. */ win->_begy = (NCURSES_SIZE_T) (win->_begy + (ToLines - CurLines)); } else { if (myLines == (CurLines - stolen) && ToLines != CurLines) { myLines = ToLines - stolen; } else if (myLines == CurLines && ToLines != CurLines) { myLines = ToLines; } } if (myLines > ToLines) { myLines = ToLines; } if (myCols > ToCols) myCols = ToCols; if (myCols == CurCols && ToCols != CurCols) myCols = ToCols; result = wresize(win, myLines, myCols); returnCode(result); } /* * If we're decreasing size, recursively search for windows that have no * children, decrease those to fit, then decrease the containing window, etc. */ static int decrease_size(NCURSES_SP_DCLx int ToLines, int ToCols, int stolen EXTRA_DCLS) { bool found; int depth = 0; WINDOWLIST *wp; T((T_CALLED("decrease_size(%p, %d, %d)"), (void *) SP_PARM, ToLines, ToCols)); UNUSED_SP; do { found = FALSE; TR(TRACE_UPDATE, ("decreasing size of windows to %dx%d, depth=%d", ToLines, ToCols, depth)); for (each_window(SP_PARM, wp)) { WINDOW *win = &(wp->win); if (!IS_PAD(win)) { if (child_depth(win) == depth) { found = TRUE; if (adjust_window(win, ToLines, ToCols, stolen EXTRA_ARGS) != OK) returnCode(ERR); } } } ++depth; } while (found); returnCode(OK); } /* * If we're increasing size, recursively search for windows that have no * parent, increase those to fit, then increase the contained window, etc. */ static int increase_size(NCURSES_SP_DCLx int ToLines, int ToCols, int stolen EXTRA_DCLS) { bool found; int depth = 0; WINDOWLIST *wp; T((T_CALLED("increase_size(%p, %d, %d)"), (void *) SP_PARM, ToLines, ToCols)); UNUSED_SP; do { found = FALSE; TR(TRACE_UPDATE, ("increasing size of windows to %dx%d, depth=%d", ToLines, ToCols, depth)); for (each_window(SP_PARM, wp)) { WINDOW *win = &(wp->win); if (!IS_PAD(win)) { if (parent_depth(win) == depth) { found = TRUE; if (adjust_window(win, ToLines, ToCols, stolen EXTRA_ARGS) != OK) returnCode(ERR); } } } ++depth; } while (found); returnCode(OK); } /* * This function reallocates NCURSES window structures, with no side-effects * such as ungetch(). */ NCURSES_EXPORT(int) NCURSES_SP_NAME(resize_term) (NCURSES_SP_DCLx int ToLines, int ToCols) { int result = OK EXTRA_ARGS; int was_stolen; T((T_CALLED("resize_term(%p,%d,%d) old(%d,%d)"), (void *) SP_PARM, ToLines, ToCols, (SP_PARM == 0) ? -1 : screen_lines(SP_PARM), (SP_PARM == 0) ? -1 : screen_columns(SP_PARM))); if (SP_PARM == 0 || ToLines <= 0 || ToCols <= 0) { returnCode(ERR); } _nc_nonsp_lock_global(curses); was_stolen = (screen_lines(SP_PARM) - SP_PARM->_lines_avail); if (NCURSES_SP_NAME(is_term_resized) (NCURSES_SP_ARGx ToLines, ToCols)) { int myLines = CurLines = screen_lines(SP_PARM); int myCols = CurCols = screen_columns(SP_PARM); #ifdef TRACE if (USE_TRACEF(TRACE_UPDATE)) { show_window_sizes("before"); _nc_unlock_global(tracef); } #endif if (ToLines > screen_lines(SP_PARM)) { result = increase_size(NCURSES_SP_ARGx myLines = ToLines, myCols, was_stolen EXTRA_ARGS); CurLines = myLines; CurCols = myCols; } if ((result == OK) && (ToCols > screen_columns(SP_PARM))) { result = increase_size(NCURSES_SP_ARGx myLines, myCols = ToCols, was_stolen EXTRA_ARGS); CurLines = myLines; CurCols = myCols; } if ((result == OK) && (ToLines < myLines || ToCols < myCols)) { result = decrease_size(NCURSES_SP_ARGx ToLines, ToCols, was_stolen EXTRA_ARGS); } if (result == OK) { screen_lines(SP_PARM) = (NCURSES_SIZE_T) ToLines; screen_columns(SP_PARM) = (NCURSES_SIZE_T) ToCols; #ifdef USE_TERM_DRIVER CallDriver_2(SP_PARM, td_setsize, ToLines, ToCols); #else lines = (NCURSES_SIZE_T) ToLines; columns = (NCURSES_SIZE_T) ToCols; #endif SP_PARM->_lines_avail = (NCURSES_SIZE_T) (ToLines - was_stolen); if (SP_PARM->oldhash) { FreeAndNull(SP_PARM->oldhash); } if (SP_PARM->newhash) { FreeAndNull(SP_PARM->newhash); } #ifdef TRACE if (USE_TRACEF(TRACE_UPDATE)) { SET_LINES(ToLines - was_stolen); SET_COLS(ToCols); show_window_sizes("after"); _nc_unlock_global(tracef); } #endif } } if (result == OK) { /* * Always update LINES, to allow for call from lib_doupdate.c which * needs to have the count adjusted by the stolen (ripped off) lines. */ SET_LINES(ToLines - was_stolen); SET_COLS(ToCols); } _nc_nonsp_unlock_global(curses); returnCode(result); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) resize_term(int ToLines, int ToCols) { int res; _nc_sp_lock_global(curses); res = NCURSES_SP_NAME(resize_term) (CURRENT_SCREEN, ToLines, ToCols); _nc_sp_unlock_global(curses); return (res); } #endif /* * This function reallocates NCURSES window structures. It is invoked in * response to a SIGWINCH interrupt. Other user-defined windows may also need * to be reallocated. * * Because this performs memory allocation, it should not (in general) be * invoked directly from the signal handler. */ NCURSES_EXPORT(int) NCURSES_SP_NAME(resizeterm) (NCURSES_SP_DCLx int ToLines, int ToCols) { int result = ERR; T((T_CALLED("resizeterm(%p, %d,%d) old(%d,%d)"), (void *) SP_PARM, ToLines, ToCols, (SP_PARM == 0) ? -1 : screen_lines(SP_PARM), (SP_PARM == 0) ? -1 : screen_columns(SP_PARM))); if (SP_PARM != 0 && ToLines > 0 && ToCols > 0) { result = OK; SP_PARM->_sig_winch = FALSE; if (NCURSES_SP_NAME(is_term_resized) (NCURSES_SP_ARGx ToLines, ToCols)) { #if USE_SIGWINCH ripoff_t *rop; bool slk_visible = (SP_PARM != 0 && SP_PARM->_slk != 0 && !(SP_PARM->_slk->hidden)); if (slk_visible) { slk_clear(); } #endif result = NCURSES_SP_NAME(resize_term) (NCURSES_SP_ARGx ToLines, ToCols); #if USE_SIGWINCH clearok(CurScreen(SP_PARM), TRUE); /* screen contents are unknown */ /* ripped-off lines are a special case: if we did not lengthen * them, we haven't moved them either. repaint them, too. * * for the rest - stdscr and other windows - the client has to * decide which to repaint, since without panels, ncurses does * not know which are really on top. */ for (each_ripoff(rop)) { if (rop->win != StdScreen(SP_PARM) && rop->win != 0 && rop->line < 0) { if (rop->hook != _nc_slk_initialize) { touchwin(rop->win); wnoutrefresh(rop->win); } } } /* soft-keys are a special case: we _know_ how to repaint them */ if (slk_visible) { NCURSES_SP_NAME(slk_restore) (NCURSES_SP_ARG); NCURSES_SP_NAME(slk_touch) (NCURSES_SP_ARG); NCURSES_SP_NAME(slk_refresh) (NCURSES_SP_ARG); } #endif } #if USE_SIGWINCH safe_ungetch(SP_PARM, KEY_RESIZE); /* so application can know this */ #endif } returnCode(result); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) resizeterm(int ToLines, int ToCols) { return NCURSES_SP_NAME(resizeterm) (CURRENT_SCREEN, ToLines, ToCols); } #endif ncurses-6.4-20240113/ncurses/base/lib_insnstr.c0000644000000000000000000000761014527223753017541 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_slkatrset.c0000644000000000000000000000606413615656212020054 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_slkset.c0000644000000000000000000001202713615656212017341 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/new_pair.c0000644000000000000000000002405214106561216017006 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2021 Thomas E. Dickey * * Copyright 2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey * ****************************************************************************/ /* new_pair.c * * New color-pair functions, alloc_pair and free_pair */ #define NEW_PAIR_INTERNAL 1 #include #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.23 2021/08/16 22:11:26 tom Exp $") #if NCURSES_EXT_COLORS #ifdef NEW_PAIR_DEBUG static int prev_len(SCREEN *sp, int pair) { int result = 1; int base = pair; colorpair_t *list = sp->_color_pairs; while (list[pair].prev != base) { result++; pair = list[pair].prev; } return result; } static int next_len(SCREEN *sp, int pair) { int result = 1; int base = pair; colorpair_t *list = sp->_color_pairs; while (list[pair].next != base) { result++; pair = list[pair].next; } return result; } /* * Trace the contents of LRU color-pairs. */ static void dumpit(SCREEN *sp, int pair, const char *tag) { colorpair_t *list = sp->_color_pairs; char bigbuf[256 * 20]; char *p = bigbuf; int n; size_t have = sizeof(bigbuf); _nc_STRCPY(p, tag, have); for (n = 0; n < sp->_pair_alloc; ++n) { if (list[n].mode != cpFREE) { p += strlen(p); if ((size_t) (p - bigbuf) + 50 > have) break; _nc_SPRINTF(p, _nc_SLIMIT(have - (p - bigbuf)) " %d%c(%d,%d)", n, n == pair ? '@' : ':', list[n].next, list[n].prev); } } T(("(%d/%d) %ld - %s", next_len(sp, 0), prev_len(sp, 0), strlen(bigbuf), bigbuf)); if (next_len(sp, 0) != prev_len(sp, 0)) { endwin(); ExitProgram(EXIT_FAILURE); } } #else #define dumpit(sp, pair, tag) /* nothing */ #endif static int compare_data(const void *a, const void *b) { const colorpair_t *p = (const colorpair_t *) a; const colorpair_t *q = (const colorpair_t *) b; return ((p->fg == q->fg) ? (p->bg - q->bg) : (p->fg - q->fg)); } static int _nc_find_color_pair(SCREEN *sp, int fg, int bg) { colorpair_t find; int result = -1; find.fg = fg; find.bg = bg; if (sp != 0) { void *pp; if ((pp = tfind(&find, &sp->_ordered_pairs, compare_data)) != 0) { colorpair_t *temp = *(colorpair_t **) pp; result = (int) (temp - sp->_color_pairs); } } return result; } static void delink_color_pair(SCREEN *sp, int pair) { colorpair_t *list = sp->_color_pairs; int prev = list[pair].prev; int next = list[pair].next; /* delink this from its current location */ if (list[prev].next == pair && list[next].prev == pair) { list[prev].next = next; list[next].prev = prev; dumpit(sp, pair, "delinked"); } } /* * Discard all nodes in the fast-index. */ NCURSES_EXPORT(void) _nc_free_ordered_pairs(SCREEN *sp) { if (sp && sp->_ordered_pairs && sp->_pair_alloc) { int n; for (n = 0; n < sp->_pair_alloc; ++n) { tdelete(&sp->_color_pairs[n], &sp->_ordered_pairs, compare_data); } } } /* * Use this call to update the fast-index when modifying an entry in the color * pair table. */ NCURSES_EXPORT(void) _nc_reset_color_pair(SCREEN *sp, int pair, colorpair_t * next) { colorpair_t *last; if (ValidPair(sp, pair)) { bool used; ReservePairs(sp, pair); last = &(sp->_color_pairs[pair]); delink_color_pair(sp, pair); if (last->mode > cpFREE && (last->fg != next->fg || last->bg != next->bg)) { /* remove the old entry from fast index */ tdelete(last, &sp->_ordered_pairs, compare_data); used = FALSE; } else { used = (last->mode != cpFREE); } if (!used) { /* create a new entry in fast index */ *last = *next; tsearch(last, &sp->_ordered_pairs, compare_data); } } } /* * Use this call to relink the newest pair to the front of the list, keeping * "0" first. */ NCURSES_EXPORT(void) _nc_set_color_pair(SCREEN *sp, int pair, int mode) { if (ValidPair(sp, pair)) { colorpair_t *list = sp->_color_pairs; dumpit(sp, pair, "SET_PAIR"); list[0].mode = cpKEEP; if (list[pair].mode <= cpFREE) sp->_pairs_used++; list[pair].mode = mode; if (list[0].next != pair) { /* link it at the front of the list */ list[pair].next = list[0].next; list[list[pair].next].prev = pair; list[pair].prev = 0; list[0].next = pair; } dumpit(sp, pair, "...after"); } } /* * If we reallocate the color-pair array, we have to adjust the fast-index. */ NCURSES_EXPORT(void) _nc_copy_pairs(SCREEN *sp, colorpair_t * target, colorpair_t * source, int length) { int n; for (n = 0; n < length; ++n) { void *find = tfind(source + n, &sp->_ordered_pairs, compare_data); if (find != 0) { tdelete(source + n, &sp->_ordered_pairs, compare_data); tsearch(target + n, &sp->_ordered_pairs, compare_data); } } } NCURSES_EXPORT(int) NCURSES_SP_NAME(alloc_pair) (NCURSES_SP_DCLx int fg, int bg) { int pair; T((T_CALLED("alloc_pair(%d,%d)"), fg, bg)); if (SP_PARM == 0) { pair = -1; } else if ((pair = _nc_find_color_pair(SP_PARM, fg, bg)) < 0) { /* * Check if all of the slots have been used. If not, find one and * use that. */ if (SP_PARM->_pairs_used + 1 < SP_PARM->_pair_limit) { bool found = FALSE; int hint = SP_PARM->_recent_pair; /* * The linear search is done to allow mixing calls to init_pair() * and alloc_pair(). The former can make gaps... */ for (pair = hint + 1; pair < SP_PARM->_pair_alloc; pair++) { if (SP_PARM->_color_pairs[pair].mode == cpFREE) { T(("found gap %d", pair)); found = TRUE; break; } } if (!found && (SP_PARM->_pair_alloc < SP_PARM->_pair_limit)) { pair = SP_PARM->_pair_alloc; ReservePairs(SP_PARM, pair); if (SP_PARM->_color_pairs == 0) { pair = -1; } else { found = TRUE; } } if (!found && SP_PARM->_color_pairs != NULL) { for (pair = 1; pair <= hint; pair++) { if (SP_PARM->_color_pairs[pair].mode == cpFREE) { T(("found gap %d", pair)); found = TRUE; break; } } } if (found) { SP_PARM->_recent_pair = pair; } else { pair = ERR; } } else { /* reuse the oldest one */ pair = SP_PARM->_color_pairs[0].prev; T(("reusing %d", pair)); } if (_nc_init_pair(SP_PARM, pair, fg, bg) == ERR) pair = ERR; } returnCode(pair); } NCURSES_EXPORT(int) NCURSES_SP_NAME(find_pair) (NCURSES_SP_DCLx int fg, int bg) { int pair; T((T_CALLED("find_pair(%d,%d)"), fg, bg)); pair = _nc_find_color_pair(SP_PARM, fg, bg); returnCode(pair); } NCURSES_EXPORT(int) NCURSES_SP_NAME(free_pair) (NCURSES_SP_DCLx int pair) { int result = ERR; T((T_CALLED("free_pair(%d)"), pair)); if (ValidPair(SP_PARM, pair) && pair < SP_PARM->_pair_alloc) { colorpair_t *cp = &(SP_PARM->_color_pairs[pair]); if (pair != 0) { _nc_change_pair(SP_PARM, pair); delink_color_pair(SP_PARM, pair); tdelete(cp, &SP_PARM->_ordered_pairs, compare_data); cp->mode = cpFREE; result = OK; SP_PARM->_pairs_used--; } } returnCode(result); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) alloc_pair(int f, int b) { return NCURSES_SP_NAME(alloc_pair) (CURRENT_SCREEN, f, b); } NCURSES_EXPORT(int) find_pair(int f, int b) { return NCURSES_SP_NAME(find_pair) (CURRENT_SCREEN, f, b); } NCURSES_EXPORT(int) free_pair(int pair) { return NCURSES_SP_NAME(free_pair) (CURRENT_SCREEN, pair); } #endif #if NO_LEAKS NCURSES_EXPORT(void) _nc_new_pair_leaks(SCREEN *sp) { if (sp->_color_pairs) { while (sp->_color_pairs[0].next) { free_pair(sp->_color_pairs[0].next); } } } #endif #else void _nc_new_pair(void); void _nc_new_pair(void) { } #endif /* NCURSES_EXT_COLORS */ ncurses-6.4-20240113/ncurses/base/lib_erase.c0000644000000000000000000000721714304744713017140 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_flash.c0000644000000000000000000000703213615656212017131 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/README0000644000000000000000000000503013615656212015716 0ustar rootroot------------------------------------------------------------------------------- -- 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. ncurses-6.4-20240113/ncurses/base/lib_insch.c0000644000000000000000000001231513615656212017140 0ustar rootroot/**************************************************************************** * Copyright 2020 Thomas E. Dickey * * Copyright 1998-2013,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 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.37 2020/02/02 23:34:34 tom Exp $") /* * Insert the given character, updating the current location to simplify * inserting a string. */ NCURSES_EXPORT(int) _nc_insert_ch(SCREEN *sp, WINDOW *win, chtype ch) { int code = OK; int ch8 = (int) ChCharOf(ch); NCURSES_CH_T wch; int count; int tabsize = ( #if USE_REENTRANT sp->_TABSIZE #else TABSIZE #endif ); switch (ch) { case '\t': for (count = (tabsize - (win->_curx % tabsize)); count > 0; count--) { if ((code = _nc_insert_ch(sp, win, ' ')) != OK) break; } break; case '\n': case '\r': case '\b': SetChar2(wch, ch); _nc_waddch_nosync(win, wch); break; default: if ( #if USE_WIDEC_SUPPORT WINDOW_EXT(win, addch_used) == 0 && #endif (isprint(ch8) || (ChAttrOf(ch) & A_ALTCHARSET) || (sp != 0 && sp->_legacy_coding && !iscntrl(ch8)))) { if (win->_curx <= win->_maxx) { struct ldat *line = &(win->_line[win->_cury]); NCURSES_CH_T *end = &(line->text[win->_curx]); NCURSES_CH_T *temp1 = &(line->text[win->_maxx]); NCURSES_CH_T *temp2 = temp1 - 1; SetChar2(wch, ch); CHANGED_TO_EOL(line, win->_curx, win->_maxx); while (temp1 > end) *temp1-- = *temp2--; *temp1 = _nc_render(win, wch); win->_curx++; } } else if (iscntrl(ch8)) { NCURSES_CONST char *s; s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (chtype) ch8); while (*s != '\0') { code = _nc_insert_ch(sp, win, ChAttrOf(ch) | UChar(*s)); if (code != OK) break; ++s; } } #if USE_WIDEC_SUPPORT else { /* * Handle multibyte characters here */ SetChar2(wch, ch); wch = _nc_render(win, wch); count = _nc_build_wch(win, &wch); if (count > 0) { code = _nc_insert_wch(win, &wch); } else if (count == -1) { NCURSES_CONST char *s; /* handle EILSEQ */ s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (chtype) ch8); if (strlen(s) > 1) { while (*s != '\0') { code = _nc_insert_ch(sp, win, ChAttrOf(ch) | UChar(*s)); if (code != OK) break; ++s; } } else { code = ERR; } } } #endif break; } return code; } NCURSES_EXPORT(int) winsch(WINDOW *win, chtype c) { int code = ERR; T((T_CALLED("winsch(%p, %s)"), (void *) win, _tracechtype(c))); if (win != 0) { NCURSES_SIZE_T oy = win->_cury; NCURSES_SIZE_T ox = win->_curx; code = _nc_insert_ch(_nc_screen_of(win), win, c); win->_curx = ox; win->_cury = oy; _nc_synchook(win); } returnCode(code); } ncurses-6.4-20240113/ncurses/base/lib_getstr.c0000644000000000000000000001514014423264501017335 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,2023 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.39 2023/04/29 19:00:17 tom Exp $") /* * This wipes out the last character, no matter whether it was a tab, control * or other character, and handles reverse wraparound. */ static char * WipeOut(WINDOW *win, int y, int x, char *first, char *last, int echoed) { if (last > first) { *--last = '\0'; if (echoed) { int y1 = win->_cury; int x1 = win->_curx; wmove(win, y, x); waddstr(win, first); getyx(win, y, x); while (win->_cury < y1 || (win->_cury == y1 && win->_curx < x1)) waddch(win, (chtype) ' '); wmove(win, y, x); } } return last; } NCURSES_EXPORT(int) wgetnstr_events(WINDOW *win, char *str, int maxlen, EVENTLIST_1st(_nc_eventlist * evl)) { SCREEN *sp = _nc_screen_of(win); TTY buf; TTY_FLAGS save_flags; char erasec; char killc; char *oldstr; int ch; int y, x; T((T_CALLED("wgetnstr(%p,%p,%d)"), (void *) win, (void *) str, maxlen)); if (!win || !str) returnCode(ERR); maxlen = _nc_getstr_limit(maxlen); NCURSES_SP_NAME(_nc_get_tty_mode) (NCURSES_SP_ARGx &buf); 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 ncurses-6.4-20240113/ncurses/base/lib_slktouch.c0000644000000000000000000000601013615656212017663 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_addstr.c0000644000000000000000000001656414527222553017327 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_move.c0000644000000000000000000000573513615656212017012 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_initscr.c0000644000000000000000000001025113725441450017502 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_clear.c0000644000000000000000000000543013615656212017122 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_winch.c0000644000000000000000000000543613615656212017152 0ustar rootroot/**************************************************************************** * 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); } } ncurses-6.4-20240113/ncurses/base/lib_refresh.c0000644000000000000000000002304314434462126017471 0ustar rootroot/**************************************************************************** * Copyright 2020-2021,2023 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.48 2023/05/27 20:13:10 tom Exp $") NCURSES_EXPORT(int) wrefresh(WINDOW *win) { int code; #if NCURSES_SP_FUNCS SCREEN *SP_PARM = _nc_screen_of(win); #endif T((T_CALLED("wrefresh(%p)"), (void *) win)); if (win == 0) { code = ERR; } else if (win == CurScreen(SP_PARM)) { CurScreen(SP_PARM)->_clear = TRUE; code = NCURSES_SP_NAME(doupdate) (NCURSES_SP_ARG); } else if ((code = wnoutrefresh(win)) == OK) { if (win->_clear) NewScreen(SP_PARM)->_clear = TRUE; code = NCURSES_SP_NAME(doupdate) (NCURSES_SP_ARG); /* * Reset the clearok() flag in case it was set for the special * case in hardscroll.c (if we don't reset it here, we'll get 2 * refreshes because the flag is copied from stdscr to newscr). * Resetting the flag shouldn't do any harm, anyway. */ win->_clear = FALSE; } returnCode(code); } NCURSES_EXPORT(int) wnoutrefresh(WINDOW *win) { int limit_x; int src_row, src_col; int begx; int begy; int dst_row, dst_col; #if USE_SCROLL_HINTS bool wide; #endif #if NCURSES_SP_FUNCS SCREEN *SP_PARM = _nc_screen_of(win); #endif T((T_CALLED("wnoutrefresh(%p)"), (void *) win)); if (win == NULL) returnCode(ERR); /* * Handle pads as a special case. */ if (IS_PAD(win)) { returnCode(pnoutrefresh(win, win->_pad._pad_y, win->_pad._pad_x, win->_pad._pad_top, win->_pad._pad_left, win->_pad._pad_bottom, win->_pad._pad_right)); } #ifdef TRACE if (USE_TRACEF(TRACE_UPDATE)) { _tracedump("...win", win); _nc_unlock_global(tracef); } #endif /* TRACE */ /* put them here so "win == 0" won't break our code */ begx = win->_begx; begy = win->_begy; NewScreen(SP_PARM)->_nc_bkgd = win->_nc_bkgd; WINDOW_ATTRS(NewScreen(SP_PARM)) = WINDOW_ATTRS(win); /* merge in change information from all subwindows of this window */ wsyncdown(win); #if USE_SCROLL_HINTS /* * For pure efficiency, we'd want to transfer scrolling information * from the window to newscr whenever the window is wide enough that * its update will dominate the cost of the update for the horizontal * band of newscr that it occupies. Unfortunately, this threshold * tends to be complex to estimate, and in any case scrolling the * whole band and rewriting the parts outside win's image would look * really ugly. So. What we do is consider the window "wide" if it * either (a) occupies the whole width of newscr, or (b) occupies * all but at most one column on either vertical edge of the screen * (this caters to fussy people who put boxes around full-screen * windows). Note that changing this formula will not break any code, * merely change the costs of various update cases. */ wide = (begx <= 1 && win->_maxx >= (NewScreen(SP_PARM)->_maxx - 1)); #endif win->_flags &= ~_HASMOVED; /* * Microtweaking alert! This double loop is one of the genuine * hot spots in the code. Even gcc doesn't seem to do enough * common-subexpression chunking to make it really tense, * so we'll force the issue. */ /* limit(dst_col) */ limit_x = win->_maxx; /* limit(src_col) */ if (limit_x > NewScreen(SP_PARM)->_maxx - begx) limit_x = NewScreen(SP_PARM)->_maxx - begx; for (src_row = 0, dst_row = begy + win->_yoffset; src_row <= win->_maxy && dst_row <= NewScreen(SP_PARM)->_maxy; src_row++, dst_row++) { struct ldat *nline = &(NewScreen(SP_PARM)->_line[dst_row]); struct ldat *oline = &win->_line[src_row]; if (oline->firstchar != _NOCHANGE) { int last_src = oline->lastchar; if (last_src > limit_x) last_src = limit_x; src_col = oline->firstchar; dst_col = src_col + begx; if_WIDEC({ int j; /* * Ensure that we will copy complete multi-column characters * on the left-boundary. */ if (isWidecExt(oline->text[src_col])) { j = 1 + dst_col - WidecExt(oline->text[src_col]); if (j < 0) j = 0; if (dst_col > j) { src_col -= (dst_col - j); dst_col = j; } } /* * Ensure that we will copy complete multi-column characters * on the right-boundary. */ j = last_src; if (WidecExt(oline->text[j])) { ++j; while (j <= limit_x) { if (isWidecBase(oline->text[j])) { break; } else { last_src = j; } ++j; } } }); if_WIDEC({ 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); } ncurses-6.4-20240113/ncurses/base/lib_hline.c0000644000000000000000000000707013615656212017135 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_scanw.c0000644000000000000000000001006713615656212017151 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/MKlib_gen.sh0000755000000000000000000003336014316036454017232 0ustar rootroot#!/bin/sh # # MKlib_gen.sh -- generate sources from curses.h macro definitions # # ($Id: MKlib_gen.sh,v 1.73 2022/10/01 13:14:20 tom Exp $) # ############################################################################## # Copyright 2018-2021,2022 Thomas E. Dickey # # Copyright 1998-2016,2017 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # The XSI Curses standard requires all curses entry points to exist as # functions, even though many definitions would normally be shadowed # by macros. Rather than hand-hack all that code, we actually # generate functions from the macros. # # This script accepts a file of prototypes on standard input. It discards # any that don't have a `generated' comment attached. It then parses each # prototype (relying on the fact that none of the macros take function # pointer or array arguments) and generates C source from it. # # Here is what the pipeline stages are doing: # # 1. sed: extract prototypes of generated functions # 2. sed: decorate prototypes with generated arguments a1. a2,...z # 3. awk: generate the calls with args matching the formals # 4. sed: prefix function names in prototypes so the preprocessor won't expand # them. # 5. cpp: macro-expand the file so the macro calls turn into C calls # 6. awk: strip the expansion junk off the front and add the new header # 7. sed: squeeze spaces, strip off gen_ prefix. # # keep the editing independent of locale: if test "${LANGUAGE+set}" = set; then LANGUAGE=C; export LANGUAGE; fi if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi if test "${LC_COLLATE+set}" = set; then LC_COLLATE=C; export LC_COLLATE; fi preprocessor="$1 -DNCURSES_WATTR_MACROS -DNCURSES_INTERNALS -I../include" AWK="$2" USE="$3" # A patch discussed here: # https://gcc.gnu.org/ml/gcc-patches/2014-06/msg02185.html # # introduces spurious #line markers into the preprocessor output. The result # appears in gcc 5.0 and (with modification) in 5.1, making it necessary to # determine if we are using gcc, and if so, what version because the proposed # solution uses a nonstandard option. # # As illustrated in # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60723 # # gcc developers chose to ignore the problems with this, and summarized those # as "intriguing problems" in # https://gcc.gnu.org/gcc-5/porting_to.html PRG=`echo "$1" | "$AWK" '{ sub(/^[ ]*/,""); sub(/[ ].*$/, ""); print; }' || exit 0` FSF=`("$PRG" --version 2>/dev/null || exit 0) | ${FGREP-grep -F} "Free Software Foundation" | head -n 1` ALL=`"$PRG" -dumpversion 2>/dev/null || exit 0` ONE=`echo "$ALL" | sed -e 's/[^0-9].*$//'` if test -n "$FSF" && test -n "$ALL" && test -n "$ONE" ; then if test "$ONE" -ge 5 ; then echo ".. adding -P option to work around $PRG $ALL" >&2 preprocessor="$preprocessor -P" fi fi PID=$$ ED1=sed1_${PID}.sed ED2=sed2_${PID}.sed ED3=sed3_${PID}.sed ED4=sed4_${PID}.sed AW1=awk1_${PID}.awk AW2=awk2_${PID}.awk TMP=gen__${PID}.c trap "rm -f $ED1 $ED2 $ED3 $ED4 $AW1 $AW2 $TMP; exit 1" 1 2 3 15 trap "rm -f $ED1 $ED2 $ED3 $ED4 $AW1 $AW2 $TMP" 0 ALL=$USE if test "$USE" = implemented ; then cat >$ED1 <$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 "int main(void)" print "{" for (n = 1; n < start; ++n) { value = calls[n]; if ( value !~ /P_POUNDC/ ) { gsub(/[ \t]+/," ",value); sub(/^[0-9a-zA-Z_]+ /,"",value); sub(/^[*][ \t]*/,"",value); gsub("struct[ \t]*[0-9a-zA-Z_]+[ \t]*[*]","",value); gsub(/[0-9a-zA-Z_]+[ \t]*[*][ \t]*/,"",value); gsub(/ (const) /," ",value); gsub(/ (int|short|attr_t|chtype|wchar_t|NCURSES_BOOL|NCURSES_OUTC|NCURSES_OUTC_sp|va_list) /," ",value); gsub(/ void /,"",value); sub(/^/,"call_",value); gsub(/ (a[0-9]|z) /, " 0 ", value); gsub(/ int[ \t]*[(][^)]+[)][(][^)]+[)]/, "0", value); printf "\t%s;\n", value; } else { print value; } } print " return 0;" print "}" } } EOF1 cat >$TMP < #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 ncurses-6.4-20240113/ncurses/base/lib_freeall.c0000644000000000000000000001303014141574461017441 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2021 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey 1996-on * ****************************************************************************/ #include #include #if HAVE_NC_FREEALL #if HAVE_LIBDBMALLOC extern int malloc_errfd; /* FIXME */ #endif MODULE_ID("$Id: lib_freeall.c,v 1.76 2021/11/06 21:52:49 tom Exp $") /* * Free all ncurses data. This is used for testing only (there's no practical * use for it as an extension). */ NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_freeall) (NCURSES_SP_DCL0) { static va_list empty_va; T((T_CALLED("_nc_freeall()"))); #if NO_LEAKS _nc_globals.leak_checking = TRUE; if (SP_PARM != 0) { if (SP_PARM->_oldnum_list != 0) { FreeAndNull(SP_PARM->_oldnum_list); } if (SP_PARM->_panelHook.destroy != 0) { SP_PARM->_panelHook.destroy(SP_PARM->_panelHook.stdscr_pseudo_panel); } #if NCURSES_EXT_COLORS _nc_new_pair_leaks(SP_PARM); #endif } #endif if (SP_PARM != 0) { _nc_lock_global(curses); while (WindowList(SP_PARM) != 0) { WINDOWLIST *p, *q; bool deleted = FALSE; /* Delete only windows that're not a parent */ for (each_window(SP_PARM, p)) { WINDOW *p_win = &(p->win); bool found = FALSE; if (IS_PAD(p_win)) continue; #ifndef USE_SP_WINDOWLIST if (p->screen != SP_PARM) continue; #endif for (each_window(SP_PARM, q)) { WINDOW *q_win = &(q->win); #ifndef USE_SP_WINDOWLIST if (q->screen != SP_PARM) continue; #endif if ((p != q) && IS_SUBWIN(q_win) && (p_win == q_win->_parent)) { found = TRUE; break; } } if (!found) { if (delwin(p_win) != ERR) deleted = TRUE; break; } } /* * Don't continue to loop if the list is trashed. */ if (!deleted) break; } delscreen(SP_PARM); _nc_unlock_global(curses); } (void) _nc_printf_string(0, empty_va); #ifdef TRACE (void) _nc_trace_buf(-1, (size_t) 0); #endif #if USE_WIDEC_SUPPORT FreeIfNeeded(_nc_wacs); #endif _nc_leaks_tinfo(); #if HAVE_LIBDBMALLOC malloc_dump(malloc_errfd); #elif HAVE_LIBDMALLOC #elif HAVE_LIBMPATROL __mp_summary(); #elif HAVE_PURIFY purify_all_inuse(); #endif returnVoid; } #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) _nc_freeall(void) { NCURSES_SP_NAME(_nc_freeall) (CURRENT_SCREEN); } #endif NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_free_and_exit) (NCURSES_SP_DCLx int code) { T((T_CALLED("_nc_free_and_exit(%d)"), code)); NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); NCURSES_SP_NAME(_nc_freeall) (NCURSES_SP_ARG); #ifdef TRACE curses_trace(0); /* close trace file, freeing its setbuf */ { static va_list fake; free(_nc_varargs("?", fake)); } #endif exit(code); } #else /* !HAVE_NC_FREEALL */ NCURSES_EXPORT(void) _nc_freeall(void) { } NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_free_and_exit) (NCURSES_SP_DCLx int code) { if (SP_PARM) { delscreen(SP_PARM); } exit(code); } #endif /* HAVE_NC_FREEALL */ #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) _nc_free_and_exit(int code) { NCURSES_SP_NAME(_nc_free_and_exit) (CURRENT_SCREEN, code); } #endif NCURSES_EXPORT(void) exit_curses(int code) { #if NO_LEAKS #if NCURSES_SP_FUNCS NCURSES_SP_NAME(_nc_free_and_exit) (CURRENT_SCREEN, code); #else _nc_free_and_exit(code); /* deprecated... */ #endif #endif exit(code); } ncurses-6.4-20240113/ncurses/base/lib_inchstr.c0000644000000000000000000000624313615656212017511 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_wattron.c0000644000000000000000000000622614226371376017542 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/MKkeyname.awk0000644000000000000000000001474713615656212017442 0ustar rootroot# $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 */" } ncurses-6.4-20240113/ncurses/base/legacy_coding.c0000644000000000000000000000601313615656212017773 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_overlay.c0000644000000000000000000001465314501355053017516 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_window.c0000644000000000000000000001752314135112560017340 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_scrollok.c0000644000000000000000000000544313615656212017670 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_newwin.c0000644000000000000000000002571214135055062017342 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 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.76 2021/10/23 18:53:38 tom Exp $") #define window_is(name) ((sp)->_##name == win) #if USE_REENTRANT #define remove_window(name) \ sp->_##name = 0 #else #define remove_window(name) \ sp->_##name = 0; \ if (win == name) \ name = 0 #endif static void remove_window_from_screen(WINDOW *win) { SCREEN *sp; #ifdef USE_SP_WINDOWLIST if ((sp = _nc_screen_of(win)) != 0) { if (window_is(curscr)) { remove_window(curscr); } else if (window_is(stdscr)) { remove_window(stdscr); } else if (window_is(newscr)) { remove_window(newscr); } } #else for (each_screen(sp)) { if (window_is(curscr)) { remove_window(curscr); break; } else if (window_is(stdscr)) { remove_window(stdscr); break; } else if (window_is(newscr)) { remove_window(newscr); break; } } #endif } NCURSES_EXPORT(int) _nc_freewin(WINDOW *win) { int result = ERR; #ifdef USE_SP_WINDOWLIST SCREEN *sp = _nc_screen_of(win); /* pretend this is parameter */ #endif T((T_CALLED("_nc_freewin(%p)"), (void *) win)); if (win != 0) { if (_nc_nonsp_try_global(curses) == 0) { WINDOWLIST *p, *q; q = 0; for (each_window(sp, p)) { if (&(p->win) == win) { remove_window_from_screen(win); if (q == 0) WindowList(sp) = p->next; else q->next = p->next; if (!IS_SUBWIN(win)) { int i; for (i = 0; i <= win->_maxy; i++) FreeIfNeeded(win->_line[i].text); } free(win->_line); free(p); result = OK; T(("...deleted win=%p", (void *) win)); break; } q = p; } _nc_nonsp_unlock_global(curses); } } returnCode(result); } NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(newwin) (NCURSES_SP_DCLx int num_lines, int num_columns, int begy, int begx) { WINDOW *win; NCURSES_CH_T *ptr; int i; T((T_CALLED("newwin(%p, %d,%d,%d,%d)"), (void *) SP_PARM, num_lines, num_columns, begy, begx)); if (begy < 0 || begx < 0 || num_lines < 0 || num_columns < 0 || SP_PARM == 0) returnWin(0); if (num_lines == 0) num_lines = SP_PARM->_lines_avail - begy; if (num_columns == 0) num_columns = screen_columns(SP_PARM) - begx; win = NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_ARGx num_lines, num_columns, begy, begx, 0); if (win == 0) returnWin(0); for (i = 0; i < num_lines; i++) { win->_line[i].text = typeCalloc(NCURSES_CH_T, (unsigned) num_columns); if (win->_line[i].text == 0) { (void) _nc_freewin(win); returnWin(0); } for (ptr = win->_line[i].text; ptr < win->_line[i].text + num_columns; ptr++) SetChar(*ptr, BLANK_TEXT, BLANK_ATTR); } returnWin(win); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(WINDOW *) newwin(int num_lines, int num_columns, int begy, int begx) { WINDOW *win; _nc_sp_lock_global(curses); win = NCURSES_SP_NAME(newwin) (CURRENT_SCREEN, num_lines, num_columns, begy, begx); _nc_sp_unlock_global(curses); return (win); } #endif NCURSES_EXPORT(WINDOW *) derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx) { WINDOW *win; int i; int flags = _SUBWIN; #if NCURSES_SP_FUNCS SCREEN *sp = _nc_screen_of(orig); #endif T((T_CALLED("derwin(%p,%d,%d,%d,%d)"), (void *) orig, num_lines, num_columns, begy, begx)); /* * make sure window fits inside the original one */ if (begy < 0 || begx < 0 || orig == 0 || num_lines < 0 || num_columns < 0) returnWin(0); if (begy + num_lines > orig->_maxy + 1 || begx + num_columns > orig->_maxx + 1) returnWin(0); if (num_lines == 0) num_lines = orig->_maxy + 1 - begy; if (num_columns == 0) num_columns = orig->_maxx + 1 - begx; if (IS_PAD(orig)) flags |= _ISPAD; win = NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_ARGx num_lines, num_columns, orig->_begy + begy, orig->_begx + begx, flags); if (win == 0) returnWin(0); win->_pary = begy; win->_parx = begx; WINDOW_ATTRS(win) = WINDOW_ATTRS(orig); win->_nc_bkgd = orig->_nc_bkgd; for (i = 0; i < num_lines; i++) win->_line[i].text = &orig->_line[begy++].text[begx]; win->_parent = orig; returnWin(win); } NCURSES_EXPORT(WINDOW *) subwin(WINDOW *w, int l, int c, int y, int x) { WINDOW *result = 0; T((T_CALLED("subwin(%p, %d, %d, %d, %d)"), (void *) w, l, c, y, x)); if (w != 0) { T(("parent has begy = %ld, begx = %ld", (long) w->_begy, (long) w->_begx)); result = derwin(w, l, c, y - w->_begy, x - w->_begx); } returnWin(result); } static bool dimension_limit(int value) { NCURSES_SIZE_T test = (NCURSES_SIZE_T) value; return (test == value && value > 0); } NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_DCLx int num_lines, int num_columns, int begy, int begx, int flags) { int i; WINDOWLIST *wp; WINDOW *win; bool is_padwin = (flags & _ISPAD); T((T_CALLED("_nc_makenew(%p,%d,%d,%d,%d)"), (void *) SP_PARM, num_lines, num_columns, begy, begx)); if (SP_PARM == 0) returnWin(0); if (!dimension_limit(num_lines) || !dimension_limit(num_columns)) returnWin(0); if ((wp = typeCalloc(WINDOWLIST, 1)) == 0) returnWin(0); win = &(wp->win); if ((win->_line = typeCalloc(struct ldat, ((unsigned) num_lines))) == 0) { free(wp); returnWin(0); } _nc_nonsp_lock_global(curses); win->_curx = 0; win->_cury = 0; win->_maxy = (NCURSES_SIZE_T) (num_lines - 1); win->_maxx = (NCURSES_SIZE_T) (num_columns - 1); win->_begy = (NCURSES_SIZE_T) begy; win->_begx = (NCURSES_SIZE_T) begx; win->_yoffset = SP_PARM->_topstolen; win->_flags = (short) flags; WINDOW_ATTRS(win) = A_NORMAL; SetChar(win->_nc_bkgd, BLANK_TEXT, BLANK_ATTR); win->_clear = (is_padwin ? FALSE : (num_lines == screen_lines(SP_PARM) && num_columns == screen_columns(SP_PARM))); win->_idlok = FALSE; win->_idcok = TRUE; win->_scroll = FALSE; win->_leaveok = FALSE; win->_use_keypad = FALSE; win->_delay = -1; win->_immed = FALSE; win->_sync = 0; win->_parx = -1; win->_pary = -1; win->_parent = 0; win->_regtop = 0; win->_regbottom = (NCURSES_SIZE_T) (num_lines - 1); win->_pad._pad_y = -1; win->_pad._pad_x = -1; win->_pad._pad_top = -1; win->_pad._pad_bottom = -1; win->_pad._pad_left = -1; win->_pad._pad_right = -1; for (i = 0; i < num_lines; i++) { /* * This used to do * * win->_line[i].firstchar = win->_line[i].lastchar = _NOCHANGE; * * which marks the whole window unchanged. That's how * SVr1 curses did it, but SVr4 curses marks the whole new * window changed. * * With the old SVr1-like code, say you have stdscr full of * characters, then create a new window with newwin(), * then do a printw(win, "foo ");, the trailing spaces are * completely ignored by the following refreshes. So, you * get "foojunkjunk" on the screen instead of "foo " as * you actually intended. * * SVr4 doesn't do this. Instead the spaces are actually written. * So that's how we want ncurses to behave. */ win->_line[i].firstchar = 0; win->_line[i].lastchar = (NCURSES_SIZE_T) (num_columns - 1); if_USE_SCROLL_HINTS(win->_line[i].oldindex = i); } if (!is_padwin && (begx + num_columns == screen_columns(SP_PARM))) { win->_flags |= _ENDLINE; if (begx == 0 && num_lines == screen_lines(SP_PARM) && begy == 0) win->_flags |= _FULLWIN; if (begy + num_lines == screen_lines(SP_PARM)) win->_flags |= _SCROLLWIN; } wp->next = WindowList(SP_PARM); wp->screen = SP_PARM; WindowList(SP_PARM) = wp; T((T_CREATE("window %p"), (void *) win)); _nc_nonsp_unlock_global(curses); returnWin(win); } /* * wgetch() and other functions with a WINDOW* parameter may use a SCREEN* * internally, and it is useful to allow those to be invoked without switching * SCREEN's, e.g., for multi-threaded applications. */ #if NCURSES_SP_FUNCS NCURSES_EXPORT(WINDOW *) _nc_curscr_of(SCREEN *sp) { return (sp == 0) ? NULL : CurScreen(sp); } NCURSES_EXPORT(WINDOW *) _nc_newscr_of(SCREEN *sp) { return (sp == 0) ? NULL : NewScreen(sp); } NCURSES_EXPORT(WINDOW *) _nc_stdscr_of(SCREEN *sp) { return (sp == 0) ? NULL : StdScreen(sp); } #endif ncurses-6.4-20240113/ncurses/base/lib_slkatrof.c0000644000000000000000000000643513615656212017667 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_pad.c0000644000000000000000000002531614135111527016576 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2010,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 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.50 2021/10/23 22:57:27 tom Exp $") NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(newpad) (NCURSES_SP_DCLx int l, int c) { WINDOW *win; NCURSES_CH_T *ptr; int i; T((T_CALLED("newpad(%p,%d, %d)"), (void *) SP_PARM, l, c)); if (l <= 0 || c <= 0) returnWin(0); win = NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_ARGx l, c, 0, 0, _ISPAD); if (win == NULL) returnWin(0); for (i = 0; i < l; i++) { if_USE_SCROLL_HINTS(win->_line[i].oldindex = _NEWINDEX); if ((win->_line[i].text = typeCalloc(NCURSES_CH_T, ((size_t) c))) == 0) { (void) _nc_freewin(win); returnWin(0); } for (ptr = win->_line[i].text; ptr < win->_line[i].text + c; ptr++) SetChar(*ptr, BLANK_TEXT, BLANK_ATTR); } returnWin(win); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(WINDOW *) newpad(int l, int c) { return NCURSES_SP_NAME(newpad) (CURRENT_SCREEN, l, c); } #endif NCURSES_EXPORT(WINDOW *) subpad(WINDOW *orig, int l, int c, int begy, int begx) { WINDOW *win = (WINDOW *) 0; T((T_CALLED("subpad(%d, %d)"), l, c)); if (orig) { if (!IS_PAD(orig) || ((win = derwin(orig, l, c, begy, begx)) == NULL)) returnWin(0); } returnWin(win); } NCURSES_EXPORT(int) prefresh(WINDOW *win, int pminrow, int pmincol, int sminrow, int smincol, int smaxrow, int smaxcol) { #if NCURSES_SP_FUNCS SCREEN *sp = _nc_screen_of(win); #endif T((T_CALLED("prefresh()"))); if (pnoutrefresh(win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol) != ERR && NCURSES_SP_NAME(doupdate) (NCURSES_SP_ARG) != ERR) { returnCode(OK); } returnCode(ERR); } NCURSES_EXPORT(int) pnoutrefresh(WINDOW *win, int pminrow, int pmincol, int sminrow, int smincol, int smaxrow, int smaxcol) { int i, j; int m, n; int pmaxrow; int pmaxcol; SCREEN *sp; #if USE_SCROLL_HINTS const int my_len = 2; /* parameterize the threshold for hardscroll */ NCURSES_SIZE_T displaced; bool wide; #endif T((T_CALLED("pnoutrefresh(%p, %d, %d, %d, %d, %d, %d)"), (void *) win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)); if (win == 0) returnCode(ERR); if (!IS_PAD(win)) returnCode(ERR); sp = _nc_screen_of(win); /* negative values are interpreted as zero */ if (pminrow < 0) pminrow = 0; if (pmincol < 0) pmincol = 0; if (sminrow < 0) sminrow = 0; if (smincol < 0) smincol = 0; pmaxrow = pminrow + smaxrow - sminrow; pmaxcol = pmincol + smaxcol - smincol; T((" pminrow + smaxrow - sminrow %ld, win->_maxy %ld", (long) pmaxrow, (long) win->_maxy)); T((" pmincol + smaxcol - smincol %ld, win->_maxx %ld", (long) pmaxcol, (long) win->_maxx)); /* * Trim the caller's screen size back to the actual limits. */ if (pmaxrow > win->_maxy) { smaxrow -= (pmaxrow - win->_maxy); pmaxrow = pminrow + smaxrow - sminrow; } if (pmaxcol > win->_maxx) { smaxcol -= (pmaxcol - win->_maxx); pmaxcol = pmincol + smaxcol - smincol; } if (smaxrow >= screen_lines(sp) || smaxcol >= screen_columns(sp) || sminrow > smaxrow || smincol > smaxcol) returnCode(ERR); T(("pad being refreshed")); #ifdef TRACE if (USE_TRACEF(TRACE_UPDATE)) { _tracedump("...pad", win); _nc_unlock_global(tracef); } #endif /* TRACE */ #if USE_SCROLL_HINTS if (win->_pad._pad_y >= 0) { displaced = pminrow - win->_pad._pad_y - (sminrow - win->_pad._pad_top); T(("pad being shifted by %d line(s)", displaced)); } else displaced = 0; #endif /* * For pure efficiency, we'd want to transfer scrolling information * from the pad to newscr whenever the window is wide enough that * its update will dominate the cost of the update for the horizontal * band of newscr that it occupies. Unfortunately, this threshold * tends to be complex to estimate, and in any case scrolling the * whole band and rewriting the parts outside win's image would look * really ugly. So. What we do is consider the pad "wide" if it * either (a) occupies the whole width of newscr, or (b) occupies * all but at most one column on either vertical edge of the screen * (this caters to fussy people who put boxes around full-screen * windows). Note that changing this formula will not break any code, * merely change the costs of various update cases. */ #if USE_SCROLL_HINTS wide = (smincol < my_len && smaxcol > (NewScreen(sp)->_maxx - my_len)); #endif for (i = pminrow, m = sminrow + win->_yoffset; i <= pmaxrow && m <= NewScreen(sp)->_maxy; i++, m++) { register struct ldat *nline = &NewScreen(sp)->_line[m]; register struct ldat *oline = &win->_line[i]; for (j = pmincol, n = smincol; j <= pmaxcol; j++, n++) { NCURSES_CH_T ch = oline->text[j]; #if USE_WIDEC_SUPPORT /* * Special case for leftmost character of the displayed area. * Only half of a double-width character may be visible. */ if (j == pmincol && j > 0 && isWidecExt(ch)) { SetChar(ch, L(' '), AttrOf(oline->text[j - 1])); } #endif if (!CharEq(ch, nline->text[n])) { nline->text[n] = ch; CHANGED_CELL(nline, n); } } #if USE_SCROLL_HINTS if (wide) { int nind = m + displaced; if (oline->oldindex < 0 || nind < sminrow || nind > smaxrow) { nind = _NEWINDEX; } else if (displaced) { register struct ldat *pline = &CurScreen(sp)->_line[nind]; for (j = 0; j <= my_len; j++) { int k = NewScreen(sp)->_maxx - j; if (pline->text[j] != nline->text[j] || pline->text[k] != nline->text[k]) { nind = _NEWINDEX; break; } } } nline->oldindex = nind; } #endif /* USE_SCROLL_HINTS */ oline->firstchar = oline->lastchar = _NOCHANGE; if_USE_SCROLL_HINTS(oline->oldindex = i); } /* * Clean up debris from scrolling or resizing the pad, so we do not * accidentally pick up the index value during the next call to this * procedure. The only rows that should have an index value are those * that are displayed during this cycle. */ #if USE_SCROLL_HINTS for (i = pminrow - 1; (i >= 0) && (win->_line[i].oldindex >= 0); i--) win->_line[i].oldindex = _NEWINDEX; for (i = pmaxrow + 1; (i <= win->_maxy) && (win->_line[i].oldindex >= 0); i++) win->_line[i].oldindex = _NEWINDEX; #endif win->_begx = (NCURSES_SIZE_T) smincol; win->_begy = (NCURSES_SIZE_T) sminrow; if (win->_clear) { win->_clear = FALSE; NewScreen(sp)->_clear = TRUE; } /* * Use the pad's current position, if it will be visible. * If not, don't do anything; it is not an error. */ if (win->_leaveok == FALSE && win->_cury >= pminrow && win->_curx >= pmincol && win->_cury <= pmaxrow && win->_curx <= pmaxcol) { NewScreen(sp)->_cury = (NCURSES_SIZE_T) (win->_cury - pminrow + win->_begy + win->_yoffset); NewScreen(sp)->_curx = (NCURSES_SIZE_T) (win->_curx - pmincol + win->_begx); } NewScreen(sp)->_leaveok = win->_leaveok; win->_flags &= ~_HASMOVED; /* * Update our cache of the line-numbers that we displayed from the pad. * We will use this on subsequent calls to this function to derive * values to stuff into 'oldindex[]' -- for scrolling optimization. */ win->_pad._pad_y = (NCURSES_SIZE_T) pminrow; win->_pad._pad_x = (NCURSES_SIZE_T) pmincol; win->_pad._pad_top = (NCURSES_SIZE_T) sminrow; win->_pad._pad_left = (NCURSES_SIZE_T) smincol; win->_pad._pad_bottom = (NCURSES_SIZE_T) smaxrow; win->_pad._pad_right = (NCURSES_SIZE_T) smaxcol; returnCode(OK); } NCURSES_EXPORT(int) pechochar(WINDOW *pad, const chtype ch) { T((T_CALLED("pechochar(%p, %s)"), (void *) pad, _tracechtype(ch))); if (pad == 0) returnCode(ERR); if (!IS_PAD(pad)) returnCode(wechochar(pad, ch)); waddch(pad, ch); prefresh(pad, pad->_pad._pad_y, pad->_pad._pad_x, pad->_pad._pad_top, pad->_pad._pad_left, pad->_pad._pad_bottom, pad->_pad._pad_right); returnCode(OK); } ncurses-6.4-20240113/ncurses/base/lib_vline.c0000644000000000000000000000710513615656212017152 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_clearok.c0000644000000000000000000000543513615656212017461 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_mouse.c0000644000000000000000000015426614434462126017177 0ustar rootroot/**************************************************************************** * 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 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.199 2023/05/27 20:13:10 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(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; result = ((win->_begy <= y && win->_begx <= x && (win->_begx + win->_maxx) >= x && (win->_begy + win->_maxy) >= y) ? TRUE : FALSE); } returnBool(result); } NCURSES_EXPORT(int) NCURSES_SP_NAME(mouseinterval) (NCURSES_SP_DCLx int maxclick) /* set the maximum mouse interval within which to recognize a click */ { int oldval; T((T_CALLED("mouseinterval(%p,%d)"), (void *) SP_PARM, maxclick)); if (SP_PARM != 0) { oldval = SP_PARM->_maxclick; if (maxclick >= 0) SP_PARM->_maxclick = maxclick; } else { oldval = DEFAULT_MAXCLICK; } returnCode(oldval); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) mouseinterval(int maxclick) { return NCURSES_SP_NAME(mouseinterval) (CURRENT_SCREEN, maxclick); } #endif /* This may be used by other routines to ask for the existence of mouse support */ NCURSES_EXPORT(bool) _nc_has_mouse(SCREEN *sp) { return (((0 == sp) || (sp->_mouse_type == M_NONE)) ? FALSE : TRUE); } NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_mouse) (NCURSES_SP_DCL0) { return _nc_has_mouse(SP_PARM); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(bool) has_mouse(void) { return _nc_has_mouse(CURRENT_SCREEN); } #endif NCURSES_EXPORT(bool) wmouse_trafo(const WINDOW *win, int *pY, int *pX, bool to_screen) { bool result = FALSE; T((T_CALLED("wmouse_trafo(%p,%p,%p,%d)"), (const void *) win, (void *) pY, (void *) pX, to_screen)); if (win && pY && pX) { int y = *pY; int x = *pX; if (to_screen) { y += win->_begy + win->_yoffset; x += win->_begx; if (wenclose(win, y, x)) result = TRUE; } else { if (wenclose(win, y, x)) { y -= (win->_begy + win->_yoffset); x -= win->_begx; result = TRUE; } } if (result) { *pX = x; *pY = y; } } returnBool(result); } ncurses-6.4-20240113/ncurses/base/version.c0000644000000000000000000000514113615656212016672 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_driver.c0000644000000000000000000001170213722531077017326 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/base/lib_mvwin.c0000644000000000000000000001154414135055445017176 0ustar rootroot/**************************************************************************** * 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 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.20 2021/10/23 18:57:41 tom Exp $") NCURSES_EXPORT(int) mvwin(WINDOW *win, int by, int bx) { #if NCURSES_SP_FUNCS SCREEN *sp = _nc_screen_of(win); #endif T((T_CALLED("mvwin(%p,%d,%d)"), (void *) win, by, bx)); if (!win || IS_PAD(win)) returnCode(ERR); /* * mvwin() should only modify the indices. See test/demo_menus.c and * test/movewindow.c for examples. */ #if 0 /* Copying subwindows is allowed, but it is expensive... */ if (IS_SUBWIN(win)) { int err = ERR; WINDOW *parent = win->_parent; if (parent) { /* Now comes the complicated and costly part, you should really * try to avoid to move subwindows. Because a subwindow shares * the text buffers with its parent, one can't do a simple * memmove of the text buffers. One has to create a copy, then * to relocate the subwindow and then to do a copy. */ if ((by - parent->_begy == win->_pary) && (bx - parent->_begx == win->_parx)) err = OK; /* we don't actually move */ else { WINDOW *clone = dupwin(win); if (clone) { /* now we have the clone, so relocate win */ werase(win); /* Erase the original place */ /* fill with parents background */ wbkgrnd(win, CHREF(parent->_nc_bkgd)); wsyncup(win); /* Tell the parent(s) */ err = mvderwin(win, by - parent->_begy, bx - parent->_begx); if (err != ERR) { err = copywin(clone, win, 0, 0, 0, 0, win->_maxy, win->_maxx, 0); if (ERR != err) wsyncup(win); } if (ERR == delwin(clone)) err = ERR; } } } returnCode(err); } #endif if (by + win->_maxy > screen_lines(SP_PARM) - 1 || bx + win->_maxx > screen_columns(SP_PARM) - 1 || by < 0 || bx < 0) returnCode(ERR); /* * Whether or not the window is moved, touch the window's contents so * that a following call to 'wrefresh()' will paint the window at the * new location. This ensures that if the caller has refreshed another * window at the same location, that this one will be displayed. */ win->_begy = (NCURSES_SIZE_T) by; win->_begx = (NCURSES_SIZE_T) bx; returnCode(touchwin(win)); } ncurses-6.4-20240113/ncurses/base/define_key.c0000644000000000000000000000735013615656212017313 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_echo.c0000644000000000000000000000657414423264210016753 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/base/lib_set_term.c0000644000000000000000000005471514345175524017673 0ustar rootroot/**************************************************************************** * Copyright 2018-2021,2022 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 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.184 2022/12/10 21:34:12 tom Exp $") #ifdef USE_TERM_DRIVER #define MaxColors InfoOf(sp).maxcolors #define NumLabels InfoOf(sp).numlabels #else #define MaxColors max_colors #define NumLabels num_labels #endif NCURSES_EXPORT(SCREEN *) set_term(SCREEN *screenp) { SCREEN *oldSP; SCREEN *newSP; T((T_CALLED("set_term(%p)"), (void *) screenp)); _nc_lock_global(curses); oldSP = CURRENT_SCREEN; _nc_set_screen(screenp); newSP = screenp; if (newSP != 0) { TINFO_SET_CURTERM(newSP, newSP->_term); #if !USE_REENTRANT curscr = CurScreen(newSP); newscr = NewScreen(newSP); stdscr = StdScreen(newSP); COLORS = newSP->_color_count; COLOR_PAIRS = newSP->_pair_count; #endif } else { TINFO_SET_CURTERM(oldSP, 0); #if !USE_REENTRANT curscr = 0; newscr = 0; stdscr = 0; COLORS = 0; COLOR_PAIRS = 0; #endif } _nc_unlock_global(curses); T((T_RETURN("%p"), (void *) oldSP)); return (oldSP); } static void _nc_free_keytry(TRIES * kt) { if (kt != 0) { _nc_free_keytry(kt->child); _nc_free_keytry(kt->sibling); free(kt); } } static bool delink_screen(SCREEN *sp) { SCREEN *last = 0; SCREEN *temp; bool result = FALSE; for (each_screen(temp)) { if (temp == sp) { if (last) last->_next_screen = sp->_next_screen; else _nc_screen_chain = sp->_next_screen; result = TRUE; break; } last = temp; } return result; } /* * Free the storage associated with the given SCREEN sp. */ NCURSES_EXPORT(void) delscreen(SCREEN *sp) { T((T_CALLED("delscreen(%p)"), (void *) sp)); _nc_lock_global(curses); if (delink_screen(sp)) { WINDOWLIST *wl; bool is_current = (sp == CURRENT_SCREEN); #ifdef USE_SP_RIPOFF if (safe_ripoff_sp && safe_ripoff_sp != safe_ripoff_stack) { ripoff_t *rop; for (rop = safe_ripoff_stack; rop != safe_ripoff_sp && (rop - safe_ripoff_stack) < N_RIPS; rop++) { if (rop->win) { (void) delwin(rop->win); rop->win = 0; } } } #endif /* delete all of the windows in this screen */ rescan: for (each_window(sp, wl)) { if (_nc_freewin(&(wl->win)) == OK) { goto rescan; } } if (sp->_slk != 0) { if (sp->_slk->ent != 0) { int i; for (i = 0; i < sp->_slk->labcnt; ++i) { FreeIfNeeded(sp->_slk->ent[i].ent_text); FreeIfNeeded(sp->_slk->ent[i].form_text); } free(sp->_slk->ent); } free(sp->_slk); sp->_slk = 0; } _nc_free_keytry(sp->_keytry); sp->_keytry = 0; _nc_free_keytry(sp->_key_ok); sp->_key_ok = 0; FreeIfNeeded(sp->_current_attr); _nc_free_ordered_pairs(sp); FreeIfNeeded(sp->_color_table); FreeIfNeeded(sp->_color_pairs); FreeIfNeeded(sp->_oldnum_list); FreeIfNeeded(sp->oldhash); FreeIfNeeded(sp->newhash); FreeIfNeeded(sp->hashtab); FreeIfNeeded(sp->_acs_map); FreeIfNeeded(sp->_screen_acs_map); NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx sp->_term); FreeIfNeeded(sp->out_buffer); if (_nc_find_prescr() == sp) { _nc_forget_prescr(); } #if USE_GPM_SUPPORT #ifdef HAVE_LIBDL if (sp->_dlopen_gpm != 0) { dlclose(sp->_dlopen_gpm); sp->_dlopen_gpm = 0; } #endif #endif /* USE_GPM_SUPPORT */ free(sp); /* * If this was the current screen, reset everything that the * application might try to use (except cur_term, which may have * multiple references in different screens). */ if (is_current) { #if !USE_REENTRANT curscr = 0; newscr = 0; stdscr = 0; COLORS = 0; COLOR_PAIRS = 0; #endif _nc_set_screen(0); #if USE_WIDEC_SUPPORT if (SP == 0) { FreeIfNeeded(_nc_wacs); _nc_wacs = 0; } #endif } else { set_term(CURRENT_SCREEN); } } _nc_unlock_global(curses); returnVoid; } static bool no_mouse_event(SCREEN *sp GCC_UNUSED) { return FALSE; } static bool no_mouse_inline(SCREEN *sp GCC_UNUSED) { return FALSE; } static bool no_mouse_parse(SCREEN *sp GCC_UNUSED, int code GCC_UNUSED) { return TRUE; } static void no_mouse_resume(SCREEN *sp GCC_UNUSED) { } static void no_mouse_wrap(SCREEN *sp GCC_UNUSED) { } #if NCURSES_EXT_FUNCS && USE_COLORFGBG static const char * extract_fgbg(const char *src, int *result) { const char *dst = 0; char *tmp = 0; long value = strtol(src, &tmp, 0); if ((dst = tmp) == 0) { dst = src; } else if (value >= 0) { *result = (int) value; } while (*dst != 0 && *dst != ';') dst++; if (*dst == ';') dst++; return dst; } #endif #define ReturnScreenError() do { _nc_set_screen(0); \ returnCode(ERR); } while (0) /* OS-independent screen initializations */ NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_setupscreen) ( #if NCURSES_SP_FUNCS SCREEN **spp, #endif int slines, int scolumns, FILE *output, int filtered, int slk_format) { #ifndef USE_TERM_DRIVER static const TTY null_TTY; /* all zeros iff uninitialized */ #endif char *env; int bottom_stolen = 0; SCREEN *sp; #ifndef USE_TERM_DRIVER bool support_cookies = USE_XMC_SUPPORT; #endif T((T_CALLED("_nc_setupscreen(%d, %d, %p, %d, %d)"), slines, scolumns, (void *) output, filtered, slk_format)); assert(CURRENT_SCREEN == 0); /* has been reset in newterm() ! */ #if NCURSES_SP_FUNCS assert(spp != 0); sp = *spp; if (!sp) { sp = _nc_alloc_screen_sp(); T(("_nc_alloc_screen_sp %p", (void *) sp)); *spp = sp; } if (sp == NULL) { ReturnScreenError(); } if ((sp->_acs_map = typeCalloc(chtype, ACS_LEN)) == NULL) { ReturnScreenError(); } if ((sp->_screen_acs_map = typeCalloc(bool, ACS_LEN)) == NULL) { free(sp->_acs_map); ReturnScreenError(); } T(("created SP %p", (void *) sp)); sp->_next_screen = _nc_screen_chain; _nc_screen_chain = sp; if ((sp->_current_attr = typeCalloc(NCURSES_CH_T, 1)) == 0) { ReturnScreenError(); } #else if (!_nc_alloc_screen() || ((SP->_acs_map = typeCalloc(chtype, ACS_LEN)) == 0) || ((SP->_screen_acs_map = typeCalloc(bool, ACS_LEN)) == 0)) { returnCode(ERR); } T(("created SP %p", (void *) SP)); sp = SP; /* fixup so SET_LINES and SET_COLS works */ sp->_next_screen = _nc_screen_chain; _nc_screen_chain = sp; if ((sp->_current_attr = typeCalloc(NCURSES_CH_T, 1)) == 0) { returnCode(ERR); } #endif /* * We should always check the screensize, just in case. */ _nc_set_screen(sp); sp->_term = cur_term; #ifdef USE_TERM_DRIVER TCBOf(sp)->csp = sp; _nc_get_screensize(sp, sp->_term, &slines, &scolumns); #else _nc_get_screensize(sp, &slines, &scolumns); #endif SET_LINES(slines); SET_COLS(scolumns); T((T_CREATE("screen %s %dx%d"), NCURSES_SP_NAME(termname) (NCURSES_SP_ARG), slines, scolumns)); sp->_filtered = filtered; /* implement filter mode */ if (filtered) { slines = 1; SET_LINES(slines); #ifdef USE_TERM_DRIVER CallDriver(sp, td_setfilter); #else /* *INDENT-EQLS* */ clear_screen = ABSENT_STRING; cursor_address = ABSENT_STRING; cursor_down = ABSENT_STRING; cursor_up = ABSENT_STRING; parm_down_cursor = ABSENT_STRING; parm_up_cursor = ABSENT_STRING; row_address = ABSENT_STRING; cursor_home = carriage_return; if (back_color_erase) clr_eos = ABSENT_STRING; #endif T(("filter screensize %dx%d", slines, scolumns)); } #ifdef __DJGPP__ T(("setting output mode to binary")); fflush(output); setmode(output, O_BINARY); #endif #if defined(EXP_WIN32_DRIVER) T(("setting output mode to binary")); fflush(output); _setmode(fileno(output), _O_BINARY); #endif sp->_lines = (NCURSES_SIZE_T) slines; sp->_lines_avail = (NCURSES_SIZE_T) slines; sp->_columns = (NCURSES_SIZE_T) scolumns; fflush(output); sp->_ofd = output ? fileno(output) : -1; sp->_ofp = output; #if defined(EXP_WIN32_DRIVER) if (output) _setmode(fileno(output), _O_BINARY); #endif sp->out_limit = (size_t) ((2 + slines) * (6 + scolumns)); if ((sp->out_buffer = malloc(sp->out_limit)) == 0) sp->out_limit = 0; sp->out_inuse = 0; SP_PRE_INIT(sp); SetNoPadding(sp); #if NCURSES_EXT_FUNCS sp->_default_color = FALSE; sp->_has_sgr_39_49 = FALSE; /* * Set our assumption of the terminal's default foreground and background * colors. The curs_color man-page states that we can assume that the * background is black. The origin of this assumption appears to be * terminals that displayed colored text, but no colored backgrounds, e.g., * the first colored terminals around 1980. More recent ones with better * technology can display not only colored backgrounds, but all * combinations. So a terminal might be something other than "white" on * black (green/black looks monochrome too), but black on white or even * on ivory. * * White-on-black is the simplest thing to use for monochrome. Almost * all applications that use color paint both text and background, so * the distinction is moot. But a few do not - which is why we leave this * configurable (a better solution is to use assume_default_colors() for * the rare applications that do require that sort of appearance, since * is appears that more users expect to be able to make a white-on-black * or black-on-white display under control of the application than not). */ #ifdef USE_ASSUMED_COLOR sp->_default_fg = COLOR_WHITE; sp->_default_bg = COLOR_BLACK; #else sp->_default_fg = COLOR_DEFAULT; sp->_default_bg = COLOR_DEFAULT; #endif /* * Allow those assumed/default color assumptions to be overridden at * runtime: */ if ((env = getenv("NCURSES_ASSUMED_COLORS")) != 0) { int fg, bg; char sep1, sep2; int count = sscanf(env, "%d%c%d%c", &fg, &sep1, &bg, &sep2); if (count >= 1) { sp->_default_fg = ((fg >= 0 && fg < MaxColors) ? fg : COLOR_DEFAULT); if (count >= 3) { sp->_default_bg = ((bg >= 0 && bg < MaxColors) ? bg : COLOR_DEFAULT); } TR(TRACE_CHARPUT | TRACE_MOVE, ("from environment assumed fg=%d, bg=%d", sp->_default_fg, sp->_default_bg)); } } #if USE_COLORFGBG /* * If rxvt's $COLORFGBG variable is set, use it to specify the assumed * default colors. Note that rxvt (mis)uses bold colors, equating a bold * color to that value plus 8. We'll only use the non-bold color for now - * decide later if it is worth having default attributes as well. */ if (getenv("COLORFGBG") != 0) { const char *p = getenv("COLORFGBG"); TR(TRACE_CHARPUT | TRACE_MOVE, ("decoding COLORFGBG %s", p)); p = extract_fgbg(p, &(sp->_default_fg)); p = extract_fgbg(p, &(sp->_default_bg)); if (*p) /* assume rxvt was compiled with xpm support */ extract_fgbg(p, &(sp->_default_bg)); TR(TRACE_CHARPUT | TRACE_MOVE, ("decoded fg=%d, bg=%d", sp->_default_fg, sp->_default_bg)); if (sp->_default_fg >= MaxColors) { if (set_a_foreground != ABSENT_STRING && !strcmp(set_a_foreground, "\033[3%p1%dm")) { set_a_foreground = strdup("\033[3%?%p1%{8}%>%t9%e%p1%d%;m"); } else { sp->_default_fg %= MaxColors; } } if (sp->_default_bg >= MaxColors) { if (set_a_background != ABSENT_STRING && !strcmp(set_a_background, "\033[4%p1%dm")) { set_a_background = strdup("\033[4%?%p1%{8}%>%t9%e%p1%d%;m"); } else { sp->_default_bg %= MaxColors; } } } #endif #endif /* NCURSES_EXT_FUNCS */ sp->_maxclick = DEFAULT_MAXCLICK; sp->_mouse_event = no_mouse_event; sp->_mouse_inline = no_mouse_inline; sp->_mouse_parse = no_mouse_parse; sp->_mouse_resume = no_mouse_resume; sp->_mouse_wrap = no_mouse_wrap; sp->_mouse_fd = -1; /* * If we've no magic cookie support, we suppress attributes that xmc would * affect, i.e., the attributes that affect the rendition of a space. */ sp->_ok_attributes = NCURSES_SP_NAME(termattrs) (NCURSES_SP_ARG); if (NCURSES_SP_NAME(has_colors) (NCURSES_SP_ARG)) { sp->_ok_attributes |= A_COLOR; } #ifdef USE_TERM_DRIVER _nc_cookie_init(sp); #else #if USE_XMC_SUPPORT /* * If we have no magic-cookie support compiled-in, or if it is suppressed * in the environment, reset the support-flag. */ if (magic_cookie_glitch >= 0) { if (getenv("NCURSES_NO_MAGIC_COOKIE") != 0) { support_cookies = FALSE; } } #endif if (!support_cookies && magic_cookie_glitch >= 0) { T(("will disable attributes to work w/o magic cookies")); } if (magic_cookie_glitch > 0) { /* tvi, wyse */ sp->_xmc_triggers = sp->_ok_attributes & XMC_CONFLICT; #if 0 /* * We "should" treat colors as an attribute. The wyse350 (and its * clones) appear to be the only ones that have both colors and magic * cookies. */ if (has_colors()) { sp->_xmc_triggers |= A_COLOR; } #endif sp->_xmc_suppress = sp->_xmc_triggers & (chtype) ~(A_BOLD); T(("magic cookie attributes %s", _traceattr(sp->_xmc_suppress))); /* * Supporting line-drawing may be possible. But make the regular * video attributes work first. */ acs_chars = ABSENT_STRING; ena_acs = ABSENT_STRING; enter_alt_charset_mode = ABSENT_STRING; exit_alt_charset_mode = ABSENT_STRING; #if USE_XMC_SUPPORT /* * To keep the cookie support simple, suppress all of the optimization * hooks except for clear_screen and the cursor addressing. */ if (support_cookies) { clr_eol = ABSENT_STRING; clr_eos = ABSENT_STRING; set_attributes = ABSENT_STRING; } #endif } else if (magic_cookie_glitch == 0) { /* hpterm */ } /* * If magic cookies are not supported, cancel the strings that set * video attributes. */ if (!support_cookies && magic_cookie_glitch >= 0) { magic_cookie_glitch = ABSENT_NUMERIC; set_attributes = ABSENT_STRING; enter_blink_mode = ABSENT_STRING; enter_bold_mode = ABSENT_STRING; enter_dim_mode = ABSENT_STRING; enter_reverse_mode = ABSENT_STRING; enter_standout_mode = ABSENT_STRING; enter_underline_mode = ABSENT_STRING; } /* initialize normal acs before wide, since we use mapping in the latter */ #if !USE_WIDEC_SUPPORT if (_nc_unicode_locale() && _nc_locale_breaks_acs(sp->_term)) { acs_chars = NULL; ena_acs = NULL; enter_alt_charset_mode = NULL; exit_alt_charset_mode = NULL; set_attributes = NULL; } #endif #endif NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_ARG); #if USE_WIDEC_SUPPORT sp->_screen_unicode = _nc_unicode_locale(); if (_nc_wacs == 0) { _nc_init_wacs(); } if (_nc_wacs == 0) { ReturnScreenError(); } sp->_screen_acs_fix = (sp->_screen_unicode && _nc_locale_breaks_acs(sp->_term)); #endif env = _nc_get_locale(); sp->_legacy_coding = ((env == 0) || !strcmp(env, "C") || !strcmp(env, "POSIX")); T(("legacy-coding %d", sp->_legacy_coding)); sp->_nc_sp_idcok = TRUE; sp->_nc_sp_idlok = FALSE; sp->oldhash = 0; sp->newhash = 0; T(("creating newscr")); NewScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns, 0, 0); if (NewScreen(sp) == 0) { ReturnScreenError(); } T(("creating curscr")); CurScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns, 0, 0); if (CurScreen(sp) == 0) { ReturnScreenError(); } #if !USE_REENTRANT newscr = NewScreen(sp); curscr = CurScreen(sp); #endif #if USE_SIZECHANGE sp->_resize = NCURSES_SP_NAME(resizeterm); sp->_ungetch = safe_ungetch; #endif NewScreen(sp)->_clear = TRUE; CurScreen(sp)->_clear = FALSE; /* * Get the current tty-modes. setupterm() may already have done this, * unless we use the term-driver. */ #ifndef USE_TERM_DRIVER if (cur_term != 0 && !memcmp(&cur_term->Ottyb, &null_TTY, sizeof(TTY))) #endif { NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG); NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG); } if (safe_ripoff_sp && safe_ripoff_sp != safe_ripoff_stack) { ripoff_t *rop; for (rop = safe_ripoff_stack; rop != safe_ripoff_sp && (rop - safe_ripoff_stack) < N_RIPS; rop++) { /* If we must simulate soft labels, grab off the line to be used. We assume that we must simulate, if it is none of the standard formats (4-4 or 3-2-3) for which there may be some hardware support. */ if (rop->hook == _nc_slk_initialize) { if (!TerminalOf(sp)) { continue; } if (!(NumLabels <= 0 || !SLK_STDFMT(slk_format))) { continue; } } if (rop->hook) { int count; WINDOW *w; count = (rop->line < 0) ? -rop->line : rop->line; T(("ripping off %i lines at %s", count, ((rop->line < 0) ? "bottom" : "top"))); w = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx count, scolumns, ((rop->line < 0) ? sp->_lines_avail - count : 0), 0); if (w) { rop->win = w; rop->hook(w, scolumns); } else { ReturnScreenError(); } if (rop->line < 0) { bottom_stolen += count; } else { sp->_topstolen = (NCURSES_SIZE_T) (sp->_topstolen + count); } sp->_lines_avail = (NCURSES_SIZE_T) (sp->_lines_avail - count); } } /* reset the stack */ safe_ripoff_sp = safe_ripoff_stack; } T(("creating stdscr")); (void) bottom_stolen; assert((sp->_lines_avail + sp->_topstolen + bottom_stolen) == slines); if ((StdScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx sp->_lines_avail, scolumns, 0, 0)) == 0) { ReturnScreenError(); } SET_LINES(sp->_lines_avail); #if !USE_REENTRANT stdscr = StdScreen(sp); #endif sp->_prescreen = FALSE; returnCode(OK); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) _nc_setupscreen(int slines GCC_UNUSED, int scolumns GCC_UNUSED, FILE *output, int filtered, int slk_format) { SCREEN *sp = 0; int rc = NCURSES_SP_NAME(_nc_setupscreen) (&sp, slines, scolumns, output, filtered, slk_format); if (rc != OK) _nc_set_screen(0); return rc; } #endif /* * The internal implementation interprets line as the number of lines to rip * off from the top or bottom. */ NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_DCLx int line, int (*init) (WINDOW *, int)) { int code = ERR; TR_FUNC_BFR(1); START_TRACE(); T((T_CALLED("ripoffline(%p,%d,%s)"), (void *) SP_PARM, line, TR_FUNC_ARG(0, init))); #if NCURSES_SP_FUNCS if (SP_PARM != 0 && SP_PARM->_prescreen) #endif { if (line == 0) { code = OK; } else { if (safe_ripoff_sp == 0) { safe_ripoff_sp = safe_ripoff_stack; } if (safe_ripoff_sp < safe_ripoff_stack + N_RIPS) { safe_ripoff_sp->line = line; safe_ripoff_sp->hook = init; (safe_ripoff_sp)++; T(("ripped-off %d:%d chunks", (int) (safe_ripoff_sp - safe_ripoff_stack), N_RIPS)); code = OK; } } } returnCode(code); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) _nc_ripoffline(int line, int (*init) (WINDOW *, int)) { int rc; _nc_init_pthreads(); _nc_lock_global(prescreen); START_TRACE(); rc = NCURSES_SP_NAME(_nc_ripoffline) (CURRENT_SCREEN_PRE, line, init); _nc_unlock_global(prescreen); return rc; } #endif NCURSES_EXPORT(int) NCURSES_SP_NAME(ripoffline) (NCURSES_SP_DCLx int line, int (*init) (WINDOW *, int)) { START_TRACE(); return NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_ARGx (line < 0) ? -1 : 1, init); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) ripoffline(int line, int (*init) (WINDOW *, int)) { int rc; _nc_init_pthreads(); _nc_lock_global(prescreen); START_TRACE(); rc = NCURSES_SP_NAME(ripoffline) (CURRENT_SCREEN_PRE, line, init); _nc_unlock_global(prescreen); return rc; } #endif ncurses-6.4-20240113/ncurses/wcwidth.h0000644000000000000000000003371014107261667015757 0ustar rootroot/* * This is an implementation of wcwidth() and wcswidth() (defined in * IEEE Std 1002.1-2001) for Unicode. * * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html * * In fixed-width output devices, Latin characters all occupy a single * "cell" position of equal width, whereas ideographic CJK characters * occupy two such cells. Interoperability between terminal-line * applications and (teletype-style) character terminals using the * UTF-8 encoding requires agreement on which character should advance * the cursor by how many cell positions. No established formal * standards exist at present on which Unicode character shall occupy * how many cell positions on character terminals. These routines are * a first attempt of defining such behavior based on simple rules * applied to data provided by the Unicode Consortium. * * For some graphical characters, the Unicode standard explicitly * defines a character-cell width via the definition of the East Asian * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes. * In all these cases, there is no ambiguity about which width a * terminal shall use. For characters in the East Asian Ambiguous (A) * class, the width choice depends purely on a preference of backward * compatibility with either historic CJK or Western practice. * Choosing single-width for these characters is easy to justify as * the appropriate long-term solution, as the CJK practice of * displaying these characters as double-width comes from historic * implementation simplicity (8-bit encoded characters were displayed * single-width and 16-bit ones double-width, even for Greek, * Cyrillic, etc.) and not any typographic considerations. * * Much less clear is the choice of width for the Not East Asian * (Neutral) class. Existing practice does not dictate a width for any * of these characters. It would nevertheless make sense * typographically to allocate two character cells to characters such * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be * represented adequately with a single-width glyph. The following * routines at present merely assign a single-cell width to all * neutral characters, in the interest of simplicity. This is not * entirely satisfactory and should be reconsidered before * establishing a formal standard in this area. At the moment, the * decision which Not East Asian (Neutral) characters should be * represented by double-width glyphs cannot yet be answered by * applying a simple rule from the Unicode database content. Setting * up a proper standard for the behavior of UTF-8 character terminals * will require a careful analysis not only of each Unicode character, * but also of each presentation form, something the author of these * routines has avoided to do so far. * * http://www.unicode.org/unicode/reports/tr11/ * * Markus Kuhn -- 2007-05-26 (Unicode 5.0) * * Permission to use, copy, modify, and distribute this software * for any purpose and without fee is hereby granted. The author * disclaims all warranties with regard to this software. * * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c */ #ifndef _WCWIDTH_H_incl #define _WCWIDTH_H_incl 1 #ifdef __cplusplus extern "C" { #endif #include #include #include struct interval { int first; int last; }; /* auxiliary function for binary search in interval table */ static int bisearch(wchar_t ucs, const struct interval *table, int max) { int min = 0; int mid; if (ucs < table[0].first || ucs > table[max].last) return 0; while (max >= min) { mid = (min + max) / 2; if (ucs > table[mid].last) min = mid + 1; else if (ucs < table[mid].first) max = mid - 1; else return 1; } return 0; } /* The following two functions define the column width of an ISO 10646 * character as follows: * * - The null character (U+0000) has a column width of 0. * * - Other C0/C1 control characters and DEL will lead to a return * value of -1. * * - Non-spacing and enclosing combining characters (general * category code Mn or Me in the Unicode database) have a * column width of 0. * * - SOFT HYPHEN (U+00AD) has a column width of 1. * * - Other format characters (general category code Cf in the Unicode * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. * * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) * have a column width of 0. * * - Spacing characters in the East Asian Wide (W) or East Asian * Full-width (F) category as defined in Unicode Technical * Report #11 have a column width of 2. * * - All remaining characters (including all printable * ISO 8859-1 and WGL4 characters, Unicode control characters, * etc.) have a column width of 1. * * This implementation assumes that wchar_t characters are encoded * in ISO 10646. */ NCURSES_EXPORT(int) mk_wcwidth(wchar_t ucs) { /* sorted list of non-overlapping intervals of non-spacing characters */ /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */ static const struct interval combining[] = { { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 }, { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 }, { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC }, { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F }, { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 }, { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 }, { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF }, { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 }, { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B }, { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F }, { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 }, { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD }, { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, { 0xE0100, 0xE01EF } }; /* test for 8-bit control characters */ if (ucs == 0) return 0; if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) return -1; /* binary search in table of non-spacing characters */ if (bisearch(ucs, combining, sizeof(combining) / sizeof(struct interval) - 1)) return 0; /* if we arrive here, ucs is not a combining or C0/C1 control character */ return 1 + (ucs >= 0x1100 && (ucs <= 0x115f || /* Hangul Jamo init. consonants */ ucs == 0x2329 || ucs == 0x232a || (ucs >= 0x2e80 && ucs <= 0xa4cf && ucs != 0x303f) /* CJK ... Yi */ || (ucs >= 0xac00 && ucs <= 0xd7a3) /* Hangul Syllables */ || (ucs >= 0xf900 && ucs <= 0xfaff) /* CJK Compatibility Ideographs */ || (ucs >= 0xfe10 && ucs <= 0xfe19) /* Vertical forms */ || (ucs >= 0xfe30 && ucs <= 0xfe6f) /* CJK Compatibility Forms */ || (ucs >= 0xff00 && ucs <= 0xff60) /* Fullwidth Forms */ || (ucs >= 0xffe0 && ucs <= 0xffe6) #if !defined(SIZEOF_WCHAR_T) || (SIZEOF_WCHAR_T >= 4) || (ucs >= 0x20000 && ucs <= 0x2fffd) || (ucs >= 0x30000 && ucs <= 0x3fffd) #endif )); } NCURSES_EXPORT(int) mk_wcswidth(const wchar_t *pwcs, size_t n) { int w, width = 0; for (;*pwcs && n-- > 0; pwcs++) if ((w = mk_wcwidth(*pwcs)) < 0) return -1; else width += w; return width; } /* * The following functions are the same as mk_wcwidth() and * mk_wcswidth(), except that spacing characters in the East Asian * Ambiguous (A) category as defined in Unicode Technical Report #11 * have a column width of 2. This variant might be useful for users of * CJK legacy encodings who want to migrate to UCS without changing * the traditional terminal character-width behaviour. It is not * otherwise recommended for general use. */ NCURSES_EXPORT(int) mk_wcwidth_cjk(wchar_t ucs) { /* sorted list of non-overlapping intervals of East Asian Ambiguous * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */ static const struct interval ambiguous[] = { { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, { 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 }, { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 }, { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 }, { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, { 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, { 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 }, { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, { 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 }, { 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, { 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, { 0x220B, 0x220B }, { 0x220F, 0x220F }, { 0x2211, 0x2211 }, { 0x2215, 0x2215 }, { 0x221A, 0x221A }, { 0x221D, 0x2220 }, { 0x2223, 0x2223 }, { 0x2225, 0x2225 }, { 0x2227, 0x222C }, { 0x222E, 0x222E }, { 0x2234, 0x2237 }, { 0x223C, 0x223D }, { 0x2248, 0x2248 }, { 0x224C, 0x224C }, { 0x2252, 0x2252 }, { 0x2260, 0x2261 }, { 0x2264, 0x2267 }, { 0x226A, 0x226B }, { 0x226E, 0x226F }, { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, { 0x2295, 0x2295 }, { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF }, { 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, { 0x24EB, 0x254B }, { 0x2550, 0x2573 }, { 0x2580, 0x258F }, { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, { 0x260E, 0x260F }, { 0x2614, 0x2615 }, { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 }, { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 }, { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F }, { 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0xE000, 0xF8FF }, { 0xFFFD, 0xFFFD }, { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD } }; /* binary search in table of non-spacing characters */ if (bisearch(ucs, ambiguous, sizeof(ambiguous) / sizeof(struct interval) - 1)) return 2; return mk_wcwidth(ucs); } NCURSES_EXPORT(int) mk_wcswidth_cjk(const wchar_t *pwcs, size_t n) { int w, width = 0; for (;*pwcs && n-- > 0; pwcs++) if ((w = mk_wcwidth_cjk(*pwcs)) < 0) return -1; else width += w; return width; } #ifdef __cplusplus } #endif #endif /* _WCWIDTH_H_incl 1 */ ncurses-6.4-20240113/ncurses/tty/0000755000000000000000000000000014501355021014733 5ustar rootrootncurses-6.4-20240113/ncurses/tty/lib_vidattr.c0000644000000000000000000003106614423031656017420 0ustar rootroot/**************************************************************************** * 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 ncurses-6.4-20240113/ncurses/tty/lib_tstp.c0000644000000000000000000003205714351675622016745 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/ncurses/tty/lib_twait.c0000644000000000000000000003320414501354060017061 0ustar rootroot/**************************************************************************** * Copyright 2018-2020,2023 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.81 2023/09/16 16:30:40 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(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); } ncurses-6.4-20240113/ncurses/tty/hashmap.c0000644000000000000000000004137714501353705016543 0ustar rootroot/**************************************************************************** * Copyright 2019-2020,2023 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.71 2023/09/16 16:28:53 tom Exp $") #ifdef HASHDEBUG # define _tracef printf # undef TR # ifdef TRACE # define TR(n, a) if (_nc_tracing & (n)) { _tracef a ; putchar('\n'); } # else # define TR(n, a) { _tracef a ; putchar('\n'); } # endif # undef screen_lines # define screen_lines(sp) MAXLINES # define TEXTWIDTH(sp) 1 static int oldnums[MAXLINES], reallines[MAXLINES]; static NCURSES_CH_T oldtext[MAXLINES][TEXTWIDTH(sp)]; static NCURSES_CH_T newtext[MAXLINES][TEXTWIDTH(sp)]; # define OLDNUM(sp,n) oldnums[n] # define OLDTEXT(sp,n) oldtext[n] # define NEWTEXT(sp,m) newtext[m] # define PENDING(sp,n) 1 #else /* !HASHDEBUG */ # define OLDNUM(sp,n) (sp)->_oldnum_list[n] # define OLDTEXT(sp,n) CurScreen(sp)->_line[n].text # define NEWTEXT(sp,m) NewScreen(sp)->_line[m].text # define TEXTWIDTH(sp) (CurScreen(sp)->_maxx + 1) # define PENDING(sp,n) (NewScreen(sp)->_line[n].firstchar != _NOCHANGE) #endif /* !HASHDEBUG */ #define oldhash(sp) ((sp)->oldhash) #define newhash(sp) ((sp)->newhash) #define hashtab(sp) ((sp)->hashtab) #define lines_alloc(sp) ((sp)->hashtab_len) #if USE_WIDEC_SUPPORT #define HASH_VAL(ch) (ch.chars[0]) #else #define HASH_VAL(ch) (ch) #endif static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT); static NCURSES_INLINE unsigned long hash(SCREEN *sp, NCURSES_CH_T *text) { int i; NCURSES_CH_T ch; unsigned long result = 0; (void) sp; for (i = TEXTWIDTH(sp); i > 0; i--) { ch = *text++; result += (result << 5) + (unsigned long) HASH_VAL(ch); } return result; } /* approximate update cost */ static int update_cost(SCREEN *sp, NCURSES_CH_T *from, NCURSES_CH_T *to) { int cost = 0; int i; (void) sp; for (i = TEXTWIDTH(sp); i > 0; i--, from++, to++) if (!(CharEq(*from, *to))) cost++; return cost; } static int update_cost_from_blank(SCREEN *sp, NCURSES_CH_T *to) { int cost = 0; int i; NCURSES_CH_T blank = blankchar; (void) sp; if (back_color_erase) SetPair(blank, GetPair(stdscr->_nc_bkgd)); for (i = TEXTWIDTH(sp); i > 0; i--, to++) if (!(CharEq(blank, *to))) cost++; return cost; } /* * Returns true when moving line 'from' to line 'to' seems to be cost * effective. 'blank' indicates whether the line 'to' would become blank. */ static NCURSES_INLINE bool cost_effective(SCREEN *sp, const int from, const int to, const int blank) { int new_from; if (from == to) return FALSE; new_from = OLDNUM(sp, from); if (new_from == _NEWINDEX) new_from = from; /* * On the left side of >= is the cost before moving; * on the right side -- cost after moving. */ return (((blank ? update_cost_from_blank(sp, NEWTEXT(sp, to)) : update_cost(sp, OLDTEXT(sp, to), NEWTEXT(sp, to))) + update_cost(sp, OLDTEXT(sp, new_from), NEWTEXT(sp, from))) >= ((new_from == from ? update_cost_from_blank(sp, NEWTEXT(sp, from)) : update_cost(sp, OLDTEXT(sp, new_from), NEWTEXT(sp, from))) + update_cost(sp, OLDTEXT(sp, from), NEWTEXT(sp, to)))) ? TRUE : FALSE; } static void grow_hunks(SCREEN *sp) { int back_limit; /* limits for cells to fill */ int back_ref_limit; /* limit for references */ int i; int next_hunk; /* * This is tricky part. We have unique pairs to use as anchors. * Use these to deduce the presence of spans of identical lines. */ back_limit = 0; back_ref_limit = 0; i = 0; while (i < screen_lines(sp) && OLDNUM(sp, i) == _NEWINDEX) i++; for (; i < screen_lines(sp); i = next_hunk) { int forward_limit; int forward_ref_limit; int end; int start = i; int shift = OLDNUM(sp, i) - i; /* get forward limit */ i = start + 1; while (i < screen_lines(sp) && OLDNUM(sp, i) != _NEWINDEX && OLDNUM(sp, i) - i == shift) i++; end = i; while (i < screen_lines(sp) && OLDNUM(sp, i) == _NEWINDEX) i++; next_hunk = i; forward_limit = i; if (i >= screen_lines(sp) || OLDNUM(sp, i) >= i) forward_ref_limit = i; else forward_ref_limit = OLDNUM(sp, i); i = start - 1; /* grow back */ if (shift < 0) back_limit = back_ref_limit + (-shift); while (i >= back_limit) { if (newhash(sp)[i] == oldhash(sp)[i + shift] || cost_effective(sp, i + shift, i, shift < 0)) { OLDNUM(sp, i) = i + shift; TR(TRACE_UPDATE | TRACE_MOVE, ("connected new line %d to old line %d (backward continuation)", i, i + shift)); } else { TR(TRACE_UPDATE | TRACE_MOVE, ("not connecting new line %d to old line %d (backward continuation)", i, i + shift)); break; } i--; } i = end; /* grow forward */ if (shift > 0) forward_limit = forward_ref_limit - shift; while (i < forward_limit) { if (newhash(sp)[i] == oldhash(sp)[i + shift] || cost_effective(sp, i + shift, i, shift > 0)) { OLDNUM(sp, i) = i + shift; TR(TRACE_UPDATE | TRACE_MOVE, ("connected new line %d to old line %d (forward continuation)", i, i + shift)); } else { TR(TRACE_UPDATE | TRACE_MOVE, ("not connecting new line %d to old line %d (forward continuation)", i, i + shift)); break; } i++; } back_ref_limit = back_limit = i; if (shift > 0) back_ref_limit += shift; } } NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_hash_map) (NCURSES_SP_DCL0) { HASHMAP *hsp; register int i; if (screen_lines(SP_PARM) > lines_alloc(SP_PARM)) { if (hashtab(SP_PARM)) free(hashtab(SP_PARM)); hashtab(SP_PARM) = typeMalloc(HASHMAP, ((size_t) screen_lines(SP_PARM) + 1) * 2); if (!hashtab(SP_PARM)) { if (oldhash(SP_PARM)) { FreeAndNull(oldhash(SP_PARM)); } lines_alloc(SP_PARM) = 0; return; } lines_alloc(SP_PARM) = screen_lines(SP_PARM); } if (oldhash(SP_PARM) && newhash(SP_PARM)) { /* re-hash only changed lines */ for (i = 0; i < screen_lines(SP_PARM); i++) { if (PENDING(SP_PARM, i)) newhash(SP_PARM)[i] = hash(SP_PARM, NEWTEXT(SP_PARM, i)); } } else { /* re-hash all */ if (oldhash(SP_PARM) == 0) oldhash(SP_PARM) = typeCalloc(unsigned long, (size_t) screen_lines(SP_PARM)); if (newhash(SP_PARM) == 0) newhash(SP_PARM) = typeCalloc(unsigned long, (size_t) screen_lines(SP_PARM)); if (!oldhash(SP_PARM) || !newhash(SP_PARM)) { 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 */ ncurses-6.4-20240113/ncurses/tty/lib_mvcur.c0000644000000000000000000012637614501353716017111 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/ncurses/tty/tty_update.c0000644000000000000000000017715714501355021017303 0ustar rootroot/**************************************************************************** * 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_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.315 2023/09/16 16:38:41 tom Exp $") /* * This define controls the line-breakout optimization. Every once in a * while during screen refresh, we want to check for input and abort the * update if there's some waiting. CHECK_INTERVAL controls the number of * changed lines to be emitted between input checks. * * Note: Input-check-and-abort is no longer done if the screen is being * updated from scratch. This is a feature, not a bug. */ #define CHECK_INTERVAL 5 #define FILL_BCE(sp) (sp->_coloron && !sp->_default_color && !back_color_erase) static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT); static NCURSES_CH_T normal = NewChar(BLANK_TEXT); /* * Enable checking to see if doupdate and friends are tracking the true * cursor position correctly. NOTE: this is a debugging hack which will * work ONLY on ANSI-compatible terminals! */ /* #define POSITION_DEBUG */ static NCURSES_INLINE NCURSES_CH_T ClrBlank(NCURSES_SP_DCLx WINDOW *win); #if NCURSES_SP_FUNCS static int ClrBottom(SCREEN *, int total); static void ClearScreen(SCREEN *, NCURSES_CH_T blank); static void ClrUpdate(SCREEN *); static void DelChar(SCREEN *, int count); static void InsStr(SCREEN *, NCURSES_CH_T *line, int count); static void TransformLine(SCREEN *, int const lineno); #else static int ClrBottom(int total); static void ClearScreen(NCURSES_CH_T blank); static void ClrUpdate(void); static void DelChar(int count); static void InsStr(NCURSES_CH_T *line, int count); static void TransformLine(int const lineno); #endif #ifdef POSITION_DEBUG /**************************************************************************** * * Debugging code. Only works on ANSI-standard terminals. * ****************************************************************************/ static void position_check(NCURSES_SP_DCLx int expected_y, int expected_x, const char *legend) /* check to see if the real cursor position matches the virtual */ { char buf[20]; char *s; int y, x; if (!_nc_tracing || (expected_y < 0 && expected_x < 0)) return; NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); memset(buf, '\0', sizeof(buf)); NCURSES_PUTP2_FLUSH("cpr", "\033[6n"); /* only works on ANSI-compatibles */ *(s = buf) = 0; do { int ask = sizeof(buf) - 1 - (s - buf); int got = read(0, s, ask); if (got == 0) break; s += got; } while (strchr(buf, 'R') == 0); _tracef("probe returned %s", _nc_visbuf(buf)); /* try to interpret as a position report */ if (sscanf(buf, "\033[%d;%dR", &y, &x) != 2) { _tracef("position probe failed in %s", legend); } else { if (expected_x < 0) expected_x = x - 1; if (expected_y < 0) expected_y = y - 1; if (y - 1 != expected_y || x - 1 != expected_x) { NCURSES_SP_NAME(beep) (NCURSES_SP_ARG); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_2("\033[%d;%dH", expected_y + 1, expected_x + 1), 1, NCURSES_SP_NAME(_nc_outch)); _tracef("position seen (%d, %d) doesn't match expected one (%d, %d) in %s", y - 1, x - 1, expected_y, expected_x, legend); } else { _tracef("position matches OK in %s", legend); } } } #else #define position_check(expected_y, expected_x, legend) /* nothing */ #endif /* POSITION_DEBUG */ /**************************************************************************** * * Optimized update code * ****************************************************************************/ static NCURSES_INLINE void GoTo(NCURSES_SP_DCLx int const row, int const col) { TR(TRACE_MOVE, ("GoTo(%p, %d, %d) from (%d, %d)", (void *) SP_PARM, row, col, SP_PARM->_cursrow, SP_PARM->_curscol)); position_check(NCURSES_SP_ARGx SP_PARM->_cursrow, SP_PARM->_curscol, "GoTo"); TINFO_MVCUR(NCURSES_SP_ARGx SP_PARM->_cursrow, SP_PARM->_curscol, row, col); position_check(NCURSES_SP_ARGx SP_PARM->_cursrow, SP_PARM->_curscol, "GoTo2"); } #if !NCURSES_WCWIDTH_GRAPHICS #define is_wacs_value(ch) (_nc_wacs_width(ch) == 1 && wcwidth(ch) > 1) #endif /* !NCURSES_WCWIDTH_GRAPHICS */ static NCURSES_INLINE void PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) { int chlen = 1; NCURSES_CH_T my_ch; #if USE_WIDEC_SUPPORT PUTC_DATA; #endif NCURSES_CH_T tilde; NCURSES_CH_T attr = CHDEREF(ch); TR(TRACE_CHARPUT, ("PutAttrChar(%s) at (%d, %d)", _tracech_t(ch), SP_PARM->_cursrow, SP_PARM->_curscol)); #if USE_WIDEC_SUPPORT /* * If this is not a valid character, there is nothing more to do. */ if (isWidecExt(CHDEREF(ch))) { TR(TRACE_CHARPUT, ("...skip")); return; } /* * Determine the number of character cells which the 'ch' value will use * on the screen. It should be at least one. */ if ((chlen = _nc_wacs_width(CharOf(CHDEREF(ch)))) <= 0) { static const NCURSES_CH_T blank = NewChar(BLANK_TEXT); /* * If the character falls into any of these special cases, do * not force the result to a blank: * * a) it is printable (this works around a bug in wcwidth()). * b) use_legacy_coding() has been called to modify the treatment * of codes 128-255. * c) the acs_map[] has been initialized to allow codes 0-31 * to be rendered. This supports Linux console's "PC" * characters. Codes 128-255 are allowed though this is * not checked. */ if (is8bits(CharOf(CHDEREF(ch))) && (isprint(CharOf(CHDEREF(ch))) || (SP_PARM->_legacy_coding > 0 && CharOf(CHDEREF(ch)) >= 160) || (SP_PARM->_legacy_coding > 1 && CharOf(CHDEREF(ch)) >= 128) || (AttrOf(attr) & A_ALTCHARSET && ((CharOfD(ch) < ACS_LEN && SP_PARM->_acs_map != 0 && SP_PARM->_acs_map[CharOfD(ch)] != 0) || (CharOfD(ch) >= 128))))) { ; } else { ch = CHREF(blank); TR(TRACE_CHARPUT, ("forced to blank")); } chlen = 1; } #endif if ((AttrOf(attr) & A_ALTCHARSET) && SP_PARM->_acs_map != 0 && ((CharOfD(ch) < ACS_LEN) #if !NCURSES_WCWIDTH_GRAPHICS || is_wacs_value(CharOfD(ch)) #endif )) { int c8; my_ch = CHDEREF(ch); /* work around const param */ c8 = CharOf(my_ch); #if USE_WIDEC_SUPPORT /* * This is crude & ugly, but works most of the time. It checks if the * acs_chars string specified that we have a mapping for this * character, and uses the wide-character mapping when we expect the * normal one to be broken (by mis-design ;-). */ if (SP_PARM->_screen_unicode && _nc_wacs[CharOf(my_ch)].chars[0]) { if (SP_PARM->_screen_acs_map[CharOf(my_ch)]) { if (SP_PARM->_screen_acs_fix) { RemAttr(attr, A_ALTCHARSET); my_ch = _nc_wacs[CharOf(my_ch)]; } } else { RemAttr(attr, A_ALTCHARSET); my_ch = _nc_wacs[CharOf(my_ch)]; } #if !NCURSES_WCWIDTH_GRAPHICS if (!(AttrOf(attr) & A_ALTCHARSET)) { chlen = 1; } #endif /* !NCURSES_WCWIDTH_GRAPHICS */ } else #endif if (!SP_PARM->_screen_acs_map[c8]) { /* * If we found no mapping for a given alternate-character set item * in the terminal description, attempt to use the ASCII fallback * code which is populated in the _acs_map[] array. If that did * not correspond to a line-drawing, etc., graphics character, the * array entry would be empty. */ chtype temp = UChar(SP_PARM->_acs_map[c8]); if (temp) { RemAttr(attr, A_ALTCHARSET); SetChar(my_ch, temp, AttrOf(attr)); } } /* * If we (still) have alternate character set, it is the normal 8bit * flavor. The _screen_acs_map[] array tells if the character was * really in acs_chars, needed because of the way wide/normal line * drawing flavors are integrated. */ if (AttrOf(attr) & A_ALTCHARSET) { int j = CharOfD(ch); chtype temp = UChar(SP_PARM->_acs_map[j]); if (temp != 0) { SetChar(my_ch, temp, AttrOf(attr)); } else { my_ch = CHDEREF(ch); RemAttr(attr, A_ALTCHARSET); } } ch = CHREF(my_ch); } #if USE_WIDEC_SUPPORT && !NCURSES_WCWIDTH_GRAPHICS else if (chlen > 1 && is_wacs_value(CharOfD(ch))) { chlen = 1; } #endif if (tilde_glitch && (CharOfD(ch) == L('~'))) { SetChar(tilde, L('`'), AttrOf(attr)); ch = CHREF(tilde); } UpdateAttrs(SP_PARM, attr); PUTC(CHDEREF(ch)); #if !USE_WIDEC_SUPPORT COUNT_OUTCHARS(1); #endif SP_PARM->_curscol += chlen; if (char_padding) { NCURSES_PUTP2("char_padding", char_padding); } } static bool check_pending(NCURSES_SP_DCL0) /* check for pending input */ { bool have_pending = FALSE; /* * Only carry out this check when the flag is zero, otherwise we'll * have the refreshing slow down drastically (or stop) if there's an * unread character available. */ if (SP_PARM->_fifohold != 0) return FALSE; if (SP_PARM->_checkfd >= 0) { #if USE_FUNC_POLL struct pollfd fds[1]; fds[0].fd = SP_PARM->_checkfd; fds[0].events = POLLIN; if (poll(fds, (size_t) 1, 0) > 0) { have_pending = TRUE; } #elif defined(__BEOS__) /* * BeOS's select() is declared in socket.h, so the configure script does * not see it. That's just as well, since that function works only for * sockets. This (using snooze and ioctl) was distilled from Be's patch * for ncurses which uses a separate thread to simulate select(). * * FIXME: the return values from the ioctl aren't very clear if we get * interrupted. */ int n = 0; int howmany = ioctl(0, 'ichr', &n); if (howmany >= 0 && n > 0) { have_pending = TRUE; } #elif HAVE_SELECT fd_set fdset; struct timeval ktimeout; ktimeout.tv_sec = ktimeout.tv_usec = 0; FD_ZERO(&fdset); FD_SET(SP_PARM->_checkfd, &fdset); if (select(SP_PARM->_checkfd + 1, &fdset, NULL, NULL, &ktimeout) != 0) { have_pending = TRUE; } #endif } if (have_pending) { SP_PARM->_fifohold = 5; NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); } return FALSE; } /* put char at lower right corner */ static void PutCharLR(NCURSES_SP_DCLx const ARG_CH_T ch) { if (!auto_right_margin) { /* we can put the char directly */ PutAttrChar(NCURSES_SP_ARGx ch); } else if (enter_am_mode && exit_am_mode) { int oldcol = SP_PARM->_curscol; /* we can suppress automargin */ NCURSES_PUTP2("exit_am_mode", exit_am_mode); PutAttrChar(NCURSES_SP_ARGx ch); SP_PARM->_curscol = oldcol; position_check(NCURSES_SP_ARGx SP_PARM->_cursrow, SP_PARM->_curscol, "exit_am_mode"); NCURSES_PUTP2("enter_am_mode", enter_am_mode); } else if ((enter_insert_mode && exit_insert_mode) || insert_character || parm_ich) { GoTo(NCURSES_SP_ARGx screen_lines(SP_PARM) - 1, screen_columns(SP_PARM) - 2); PutAttrChar(NCURSES_SP_ARGx ch); GoTo(NCURSES_SP_ARGx screen_lines(SP_PARM) - 1, screen_columns(SP_PARM) - 2); InsStr(NCURSES_SP_ARGx NewScreen(SP_PARM)->_line[screen_lines(SP_PARM) - 1].text + screen_columns(SP_PARM) - 2, 1); } } /* * Wrap the cursor position, i.e., advance to the beginning of the next line. */ static void wrap_cursor(NCURSES_SP_DCL0) { if (eat_newline_glitch) { /* * xenl can manifest two different ways. The vt100 way is that, when * you'd expect the cursor to wrap, it stays hung at the right margin * (on top of the character just emitted) and doesn't wrap until the * *next* graphic char is emitted. The c100 way is to ignore LF * received just after an am wrap. * * An aggressive way to handle this would be to emit CR/LF after the * char and then assume the wrap is done, you're on the first position * of the next line, and the terminal out of its weird state. Here * it is safe to just tell the code that the cursor is in hyperspace and * let the next mvcur() call straighten things out. */ SP_PARM->_curscol = -1; SP_PARM->_cursrow = -1; } else if (auto_right_margin) { SP_PARM->_curscol = 0; SP_PARM->_cursrow++; /* * We've actually moved - but may have to work around problems with * video attributes not working. */ if (!move_standout_mode && AttrOf(SCREEN_ATTRS(SP_PARM))) { TR(TRACE_CHARPUT, ("turning off (%#lx) %s before wrapping", (unsigned long) AttrOf(SCREEN_ATTRS(SP_PARM)), _traceattr(AttrOf(SCREEN_ATTRS(SP_PARM))))); VIDPUTS(SP_PARM, A_NORMAL, 0); } } else { SP_PARM->_curscol--; } position_check(NCURSES_SP_ARGx SP_PARM->_cursrow, SP_PARM->_curscol, "wrap_cursor"); } static NCURSES_INLINE void PutChar(NCURSES_SP_DCLx const ARG_CH_T ch) /* insert character, handling automargin stuff */ { if (SP_PARM->_cursrow == screen_lines(SP_PARM) - 1 && SP_PARM->_curscol == screen_columns(SP_PARM) - 1) { PutCharLR(NCURSES_SP_ARGx ch); } else { PutAttrChar(NCURSES_SP_ARGx ch); } if (SP_PARM->_curscol >= screen_columns(SP_PARM)) wrap_cursor(NCURSES_SP_ARG); position_check(NCURSES_SP_ARGx SP_PARM->_cursrow, SP_PARM->_curscol, "PutChar"); } /* * Check whether the given character can be output by clearing commands. This * includes test for being a space and not including any 'bad' attributes, such * as A_REVERSE. All attribute flags which don't affect appearance of a space * or can be output by clearing (A_COLOR in case of bce-terminal) are excluded. */ static NCURSES_INLINE bool can_clear_with(NCURSES_SP_DCLx ARG_CH_T ch) { if (!back_color_erase && SP_PARM->_coloron) { #if NCURSES_EXT_FUNCS int pair; if (!SP_PARM->_default_color) return FALSE; if (!(isDefaultColor(SP_PARM->_default_fg) && isDefaultColor(SP_PARM->_default_bg))) return FALSE; if ((pair = GetPair(CHDEREF(ch))) != 0) { NCURSES_COLOR_T fg, bg; if (NCURSES_SP_NAME(pair_content) (NCURSES_SP_ARGx (short) pair, &fg, &bg) == ERR || !(isDefaultColor(fg) && isDefaultColor(bg))) { return FALSE; } } #else if (AttrOfD(ch) & A_COLOR) return FALSE; #endif } return (ISBLANK(CHDEREF(ch)) && (AttrOfD(ch) & ~(NONBLANK_ATTR | A_COLOR)) == BLANK_ATTR); } /* * Issue a given span of characters from an array. * Must be functionally equivalent to: * for (i = 0; i < num; i++) * PutChar(ntext[i]); * but can leave the cursor positioned at the middle of the interval. * * Returns: 0 - cursor is at the end of interval * 1 - cursor is somewhere in the middle * * This code is optimized using ech and rep. */ static int EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T *ntext, int num) { int i; TR(TRACE_CHARPUT, ("EmitRange %d:%s", num, _nc_viscbuf(ntext, num))); if (erase_chars || repeat_char) { while (num > 0) { int runcount; NCURSES_CH_T ntext0; while (num > 1 && !CharEq(ntext[0], ntext[1])) { PutChar(NCURSES_SP_ARGx CHREF(ntext[0])); ntext++; num--; } ntext0 = ntext[0]; if (num == 1) { PutChar(NCURSES_SP_ARGx CHREF(ntext0)); return 0; } runcount = 2; while (runcount < num && CharEq(ntext[runcount], ntext0)) runcount++; /* * The cost expression in the middle isn't exactly right. * _cup_ch_cost is an upper bound on the cost for moving to the * end of the erased area, but not the cost itself (which we * can't compute without emitting the move). This may result * in erase_chars not getting used in some situations for * which it would be marginally advantageous. */ if (erase_chars && runcount > SP_PARM->_ech_cost + SP_PARM->_cup_ch_cost && can_clear_with(NCURSES_SP_ARGx CHREF(ntext0))) { UpdateAttrs(SP_PARM, ntext0); NCURSES_PUTP2("erase_chars", TIPARM_1(erase_chars, runcount)); /* * If this is the last part of the given interval, * don't bother moving cursor, since it can be the * last update on the line. */ if (runcount < num) { GoTo(NCURSES_SP_ARGx SP_PARM->_cursrow, SP_PARM->_curscol + runcount); } else { return 1; /* cursor stays in the middle */ } } else if (repeat_char != 0 && #if BSD_TPUTS !isdigit(UChar(CharOf(ntext0))) && #endif #if USE_WIDEC_SUPPORT (!SP_PARM->_screen_unicode && (CharOf(ntext0) < ((AttrOf(ntext0) & A_ALTCHARSET) ? ACS_LEN : 256))) && #endif runcount > SP_PARM->_rep_cost) { NCURSES_CH_T temp; bool wrap_possible = (SP_PARM->_curscol + runcount >= screen_columns(SP_PARM)); int rep_count = runcount; if (wrap_possible) rep_count--; UpdateAttrs(SP_PARM, ntext0); temp = ntext0; if ((AttrOf(temp) & A_ALTCHARSET) && SP_PARM->_acs_map != 0 && (SP_PARM->_acs_map[CharOf(temp)] & A_CHARTEXT) != 0) { SetChar(temp, (SP_PARM->_acs_map[CharOf(ntext0)] & A_CHARTEXT), AttrOf(ntext0) | A_ALTCHARSET); } NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_2(repeat_char, CharOf(temp), rep_count), 1, NCURSES_SP_NAME(_nc_outch)); SP_PARM->_curscol += rep_count; if (wrap_possible) PutChar(NCURSES_SP_ARGx CHREF(ntext0)); } else { for (i = 0; i < runcount; i++) PutChar(NCURSES_SP_ARGx CHREF(ntext[i])); } ntext += runcount; num -= runcount; } return 0; } for (i = 0; i < num; i++) PutChar(NCURSES_SP_ARGx CHREF(ntext[i])); return 0; } /* * Output the line in the given range [first .. last] * * If there's a run of identical characters that's long enough to justify * cursor movement, use that also. * * Returns: same as EmitRange */ static int PutRange(NCURSES_SP_DCLx const NCURSES_CH_T *otext, const NCURSES_CH_T *ntext, int row, int first, int last) { int rc; TR(TRACE_CHARPUT, ("PutRange(%p, %p, %p, %d, %d, %d)", (void *) SP_PARM, (const void *) otext, (const void *) ntext, row, first, last)); if (otext != ntext && (last - first + 1) > SP_PARM->_inline_cost) { int i, j, same; for (j = first, same = 0; j <= last; j++) { if (!same && isWidecExt(otext[j])) continue; if (CharEq(otext[j], ntext[j])) { same++; } else { if (same > SP_PARM->_inline_cost) { EmitRange(NCURSES_SP_ARGx ntext + first, j - same - first); GoTo(NCURSES_SP_ARGx row, first = j); } same = 0; } } i = EmitRange(NCURSES_SP_ARGx ntext + first, j - same - first); /* * Always return 1 for the next GoTo() after a PutRange() if we found * identical characters at end of interval */ rc = (same == 0 ? i : 1); } else { rc = EmitRange(NCURSES_SP_ARGx ntext + first, last - first + 1); } return rc; } /* leave unbracketed here so 'indent' works */ #define MARK_NOCHANGE(win,row) \ win->_line[row].firstchar = _NOCHANGE; \ win->_line[row].lastchar = _NOCHANGE; \ if_USE_SCROLL_HINTS(win->_line[row].oldindex = row) NCURSES_EXPORT(int) TINFO_DOUPDATE(NCURSES_SP_DCL0) { int i; int nonempty; #if USE_TRACE_TIMES struct tms before, after; #endif /* USE_TRACE_TIMES */ T((T_CALLED("_nc_tinfo:doupdate(%p)"), (void *) SP_PARM)); _nc_lock_global(update); if (SP_PARM == 0) { _nc_unlock_global(update); returnCode(ERR); } #if !USE_REENTRANT /* * It is "legal" but unlikely that an application could assign a new * value to one of the standard windows. Check for that possibility * and try to recover. * * We do not allow applications to assign new values in the reentrant * model. */ #if NCURSES_SP_FUNCS if (SP_PARM == CURRENT_SCREEN) { #endif #define SyncScreens(internal,exported) \ if (internal == 0) internal = exported; \ if (internal != exported) exported = internal SyncScreens(CurScreen(SP_PARM), curscr); SyncScreens(NewScreen(SP_PARM), newscr); SyncScreens(StdScreen(SP_PARM), stdscr); #if NCURSES_SP_FUNCS } #endif #endif /* !USE_REENTRANT */ if (CurScreen(SP_PARM) == 0 || NewScreen(SP_PARM) == 0 || StdScreen(SP_PARM) == 0) { _nc_unlock_global(update); returnCode(ERR); } #ifdef TRACE if (USE_TRACEF(TRACE_UPDATE)) { if (CurScreen(SP_PARM)->_clear) _tracef("curscr is clear"); else _tracedump("curscr", CurScreen(SP_PARM)); _tracedump("newscr", NewScreen(SP_PARM)); _nc_unlock_global(tracef); } #endif /* TRACE */ _nc_signal_handler(FALSE); if (SP_PARM->_fifohold) SP_PARM->_fifohold--; #if USE_SIZECHANGE if ((SP_PARM->_endwin == ewSuspend) || _nc_handle_sigwinch(SP_PARM)) { /* * This is a transparent extension: XSI does not address it, * and applications need not know that ncurses can do it. * * Check if the terminal size has changed while curses was off * (this can happen in an xterm, for example), and resize the * ncurses data structures accordingly. */ _nc_update_screensize(SP_PARM); } #endif if (SP_PARM->_endwin == ewSuspend) { T(("coming back from shell mode")); NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG); NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_ARG); NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG); SP_PARM->_mouse_resume(SP_PARM); SP_PARM->_endwin = ewRunning; } #if USE_TRACE_TIMES /* zero the metering machinery */ RESET_OUTCHARS(); (void) times(&before); #endif /* USE_TRACE_TIMES */ /* * This is the support for magic-cookie terminals. The theory: we scan * the virtual screen looking for attribute turnons. Where we find one, * check to make sure it is realizable by seeing if the required number of * un-attributed blanks are present before and after the attributed range; * try to shift the range boundaries over blanks (not changing the screen * display) so this becomes true. If it is, shift the beginning attribute * change appropriately (the end one, if we've gotten this far, is * guaranteed room for its cookie). If not, nuke the added attributes out * of the span. */ #if USE_XMC_SUPPORT if (magic_cookie_glitch > 0) { int j, k; attr_t rattr = A_NORMAL; for (i = 0; i < screen_lines(SP_PARM); i++) { for (j = 0; j < screen_columns(SP_PARM); j++) { bool failed = FALSE; NCURSES_CH_T *thisline = NewScreen(SP_PARM)->_line[i].text; attr_t thisattr = AttrOf(thisline[j]) & SP_PARM->_xmc_triggers; attr_t turnon = thisattr & ~rattr; /* is an attribute turned on here? */ if (turnon == 0) { rattr = thisattr; continue; } TR(TRACE_ATTRS, ("At (%d, %d): from %s...", i, j, _traceattr(rattr))); TR(TRACE_ATTRS, ("...to %s", _traceattr(turnon))); /* * If the attribute change location is a blank with a "safe" * attribute, undo the attribute turnon. This may ensure * there's enough room to set the attribute before the first * non-blank in the run. */ #define SAFE(scr,a) (!((a) & (scr)->_xmc_triggers)) if (ISBLANK(thisline[j]) && SAFE(SP_PARM, turnon)) { RemAttr(thisline[j], turnon); continue; } /* check that there's enough room at start of span */ for (k = 1; k <= magic_cookie_glitch; k++) { if (j - k < 0 || !ISBLANK(thisline[j - k]) || !SAFE(SP_PARM, AttrOf(thisline[j - k]))) { failed = TRUE; TR(TRACE_ATTRS, ("No room at start in %d,%d%s%s", i, j - k, (ISBLANK(thisline[j - k]) ? "" : ":nonblank"), (SAFE(SP_PARM, AttrOf(thisline[j - k])) ? "" : ":unsafe"))); break; } } if (!failed) { bool end_onscreen = FALSE; int m, n = j; /* find end of span, if it is onscreen */ for (m = i; m < screen_lines(SP_PARM); m++) { for (; n < screen_columns(SP_PARM); n++) { attr_t testattr = AttrOf(NewScreen(SP_PARM)->_line[m].text[n]); if ((testattr & SP_PARM->_xmc_triggers) == rattr) { end_onscreen = TRUE; TR(TRACE_ATTRS, ("Range attributed with %s ends at (%d, %d)", _traceattr(turnon), m, n)); goto foundit; } } n = 0; } TR(TRACE_ATTRS, ("Range attributed with %s ends offscreen", _traceattr(turnon))); foundit:; if (end_onscreen) { NCURSES_CH_T *lastline = NewScreen(SP_PARM)->_line[m].text; /* * If there are safely-attributed blanks at the end of * the range, shorten the range. This will help ensure * that there is enough room at end of span. */ while (n >= 0 && ISBLANK(lastline[n]) && SAFE(SP_PARM, AttrOf(lastline[n]))) { RemAttr(lastline[n--], turnon); } /* check that there's enough room at end of span */ for (k = 1; k <= magic_cookie_glitch; k++) { if (n + k >= screen_columns(SP_PARM) || !ISBLANK(lastline[n + k]) || !SAFE(SP_PARM, AttrOf(lastline[n + k]))) { failed = TRUE; TR(TRACE_ATTRS, ("No room at end in %d,%d%s%s", i, j - k, (ISBLANK(lastline[n + k]) ? "" : ":nonblank"), (SAFE(SP_PARM, AttrOf(lastline[n + k])) ? "" : ":unsafe"))); break; } } } } if (failed) { int p, q = j; TR(TRACE_ATTRS, ("Clearing %s beginning at (%d, %d)", _traceattr(turnon), i, j)); /* turn off new attributes over span */ for (p = i; p < screen_lines(SP_PARM); p++) { for (; q < screen_columns(SP_PARM); q++) { attr_t testattr = AttrOf(newscr->_line[p].text[q]); if ((testattr & SP_PARM->_xmc_triggers) == rattr) goto foundend; RemAttr(NewScreen(SP_PARM)->_line[p].text[q], turnon); } q = 0; } foundend:; } else { TR(TRACE_ATTRS, ("Cookie space for %s found before (%d, %d)", _traceattr(turnon), i, j)); /* * Back up the start of range so there's room for cookies * before the first nonblank character. */ for (k = 1; k <= magic_cookie_glitch; k++) AddAttr(thisline[j - k], turnon); } rattr = thisattr; } } #ifdef TRACE /* show altered highlights after magic-cookie check */ if (USE_TRACEF(TRACE_UPDATE)) { _tracef("After magic-cookie check..."); _tracedump("newscr", NewScreen(SP_PARM)); _nc_unlock_global(tracef); } #endif /* TRACE */ } #endif /* USE_XMC_SUPPORT */ nonempty = 0; if (CurScreen(SP_PARM)->_clear || NewScreen(SP_PARM)->_clear) { /* force refresh ? */ ClrUpdate(NCURSES_SP_ARG); CurScreen(SP_PARM)->_clear = FALSE; /* reset flag */ NewScreen(SP_PARM)->_clear = FALSE; /* reset flag */ } else { int changedlines = CHECK_INTERVAL; if (check_pending(NCURSES_SP_ARG)) goto cleanup; nonempty = Min(screen_lines(SP_PARM), NewScreen(SP_PARM)->_maxy + 1); if (SP_PARM->_scrolling) { NCURSES_SP_NAME(_nc_scroll_optimize) (NCURSES_SP_ARG); } nonempty = ClrBottom(NCURSES_SP_ARGx nonempty); TR(TRACE_UPDATE, ("Transforming lines, nonempty %d", nonempty)); for (i = 0; i < nonempty; i++) { /* * Here is our line-breakout optimization. */ if (changedlines == CHECK_INTERVAL) { if (check_pending(NCURSES_SP_ARG)) goto cleanup; changedlines = 0; } /* * newscr->line[i].firstchar is normally set * by wnoutrefresh. curscr->line[i].firstchar * is normally set by _nc_scroll_window in the * vertical-movement optimization code, */ if (NewScreen(SP_PARM)->_line[i].firstchar != _NOCHANGE || CurScreen(SP_PARM)->_line[i].firstchar != _NOCHANGE) { TransformLine(NCURSES_SP_ARGx i); changedlines++; } /* mark line changed successfully */ if (i <= NewScreen(SP_PARM)->_maxy) { MARK_NOCHANGE(NewScreen(SP_PARM), i); } if (i <= CurScreen(SP_PARM)->_maxy) { MARK_NOCHANGE(CurScreen(SP_PARM), i); } } } /* put everything back in sync */ for (i = nonempty; i <= NewScreen(SP_PARM)->_maxy; i++) { MARK_NOCHANGE(NewScreen(SP_PARM), i); } for (i = nonempty; i <= CurScreen(SP_PARM)->_maxy; i++) { MARK_NOCHANGE(CurScreen(SP_PARM), i); } if (!NewScreen(SP_PARM)->_leaveok) { CurScreen(SP_PARM)->_curx = NewScreen(SP_PARM)->_curx; CurScreen(SP_PARM)->_cury = NewScreen(SP_PARM)->_cury; GoTo(NCURSES_SP_ARGx CurScreen(SP_PARM)->_cury, CurScreen(SP_PARM)->_curx); } cleanup: /* * We would like to keep the physical screen in normal mode in case we get * other processes writing to the screen. This goal cannot be met for * magic cookies since it interferes with attributes that may propagate * past the current position. */ #if USE_XMC_SUPPORT if (magic_cookie_glitch != 0) #endif UpdateAttrs(SP_PARM, normal); NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); WINDOW_ATTRS(CurScreen(SP_PARM)) = WINDOW_ATTRS(NewScreen(SP_PARM)); #if USE_TRACE_TIMES (void) times(&after); TR(TRACE_TIMES, ("Update cost: %ld chars, %ld clocks system time, %ld clocks user time", _nc_outchars, (long) (after.tms_stime - before.tms_stime), (long) (after.tms_utime - before.tms_utime))); #endif /* USE_TRACE_TIMES */ _nc_signal_handler(TRUE); _nc_unlock_global(update); returnCode(OK); } #if NCURSES_SP_FUNCS && !defined(USE_TERM_DRIVER) NCURSES_EXPORT(int) doupdate(void) { return TINFO_DOUPDATE(CURRENT_SCREEN); } #endif /* * ClrBlank(win) * * Returns the attributed character that corresponds to the "cleared" * screen. If the terminal has the back-color-erase feature, this will be * colored according to the wbkgd() call. * * We treat 'curscr' specially because it isn't supposed to be set directly * in the wbkgd() call. Assume 'stdscr' for this case. */ #define BCE_ATTRS (A_NORMAL|A_COLOR) #define BCE_BKGD(sp,win) (((win) == CurScreen(sp) ? StdScreen(sp) : (win))->_nc_bkgd) static NCURSES_INLINE NCURSES_CH_T ClrBlank(NCURSES_SP_DCLx WINDOW *win) { NCURSES_CH_T blank = blankchar; if (back_color_erase) AddAttr(blank, (AttrOf(BCE_BKGD(SP_PARM, win)) & BCE_ATTRS)); return blank; } /* ** ClrUpdate() ** ** Update by clearing and redrawing the entire screen. ** */ static void ClrUpdate(NCURSES_SP_DCL0) { TR(TRACE_UPDATE, (T_CALLED("ClrUpdate"))); if (0 != SP_PARM) { int i; NCURSES_CH_T blank = ClrBlank(NCURSES_SP_ARGx StdScreen(SP_PARM)); int nonempty = Min(screen_lines(SP_PARM), NewScreen(SP_PARM)->_maxy + 1); ClearScreen(NCURSES_SP_ARGx blank); TR(TRACE_UPDATE, ("updating screen from scratch")); nonempty = ClrBottom(NCURSES_SP_ARGx nonempty); for (i = 0; i < nonempty; i++) TransformLine(NCURSES_SP_ARGx i); } TR(TRACE_UPDATE, (T_RETURN(""))); } /* ** ClrToEOL(blank) ** ** Clear to end of current line, starting at the cursor position */ static void ClrToEOL(NCURSES_SP_DCLx NCURSES_CH_T blank, int needclear) { if (CurScreen(SP_PARM) != 0 && SP_PARM->_cursrow >= 0) { int j; for (j = SP_PARM->_curscol; j < screen_columns(SP_PARM); j++) { if (j >= 0) { NCURSES_CH_T *cp = &(CurScreen(SP_PARM)->_line[SP_PARM->_cursrow].text[j]); if (!CharEq(*cp, blank)) { *cp = blank; needclear = TRUE; } } } } if (needclear) { UpdateAttrs(SP_PARM, blank); if (clr_eol && SP_PARM->_el_cost <= (screen_columns(SP_PARM) - SP_PARM->_curscol)) { NCURSES_PUTP2("clr_eol", clr_eol); } else { int count = (screen_columns(SP_PARM) - SP_PARM->_curscol); while (count-- > 0) PutChar(NCURSES_SP_ARGx CHREF(blank)); } } } /* ** ClrToEOS(blank) ** ** Clear to end of screen, starting at the cursor position */ static void ClrToEOS(NCURSES_SP_DCLx NCURSES_CH_T blank) { int row, col; row = SP_PARM->_cursrow; col = SP_PARM->_curscol; if (row < 0) row = 0; if (col < 0) col = 0; UpdateAttrs(SP_PARM, blank); TPUTS_TRACE("clr_eos"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx clr_eos, screen_lines(SP_PARM) - row, NCURSES_SP_NAME(_nc_outch)); while (col < screen_columns(SP_PARM)) CurScreen(SP_PARM)->_line[row].text[col++] = blank; for (row++; row < screen_lines(SP_PARM); row++) { for (col = 0; col < screen_columns(SP_PARM); col++) CurScreen(SP_PARM)->_line[row].text[col] = blank; } } /* * ClrBottom(total) * * Test if clearing the end of the screen would satisfy part of the * screen-update. Do this by scanning backwards through the lines in the * screen, checking if each is blank, and one or more are changed. */ static int ClrBottom(NCURSES_SP_DCLx int total) { int top = total; int last = Min(screen_columns(SP_PARM), NewScreen(SP_PARM)->_maxx + 1); NCURSES_CH_T blank = NewScreen(SP_PARM)->_line[total - 1].text[last - 1]; if (clr_eos && can_clear_with(NCURSES_SP_ARGx CHREF(blank))) { int row; for (row = total - 1; row >= 0; row--) { int col; bool ok; for (col = 0, ok = TRUE; ok && col < last; col++) { ok = (CharEq(NewScreen(SP_PARM)->_line[row].text[col], blank)); } if (!ok) break; for (col = 0; ok && col < last; col++) { ok = (CharEq(CurScreen(SP_PARM)->_line[row].text[col], blank)); } if (!ok) top = row; } /* don't use clr_eos for just one line if clr_eol available */ if (top < total) { GoTo(NCURSES_SP_ARGx top, 0); ClrToEOS(NCURSES_SP_ARGx blank); if (SP_PARM->oldhash && SP_PARM->newhash) { for (row = top; row < screen_lines(SP_PARM); row++) SP_PARM->oldhash[row] = SP_PARM->newhash[row]; } } } return top; } #if USE_XMC_SUPPORT #if USE_WIDEC_SUPPORT #define check_xmc_transition(sp, a, b) \ ((((a)->attr ^ (b)->attr) & ~((a)->attr) & (sp)->_xmc_triggers) != 0) #define xmc_turn_on(sp,a,b) check_xmc_transition(sp,&(a), &(b)) #else #define xmc_turn_on(sp,a,b) ((((a)^(b)) & ~(a) & (sp)->_xmc_triggers) != 0) #endif #define xmc_new(sp,r,c) NewScreen(sp)->_line[r].text[c] #define xmc_turn_off(sp,a,b) xmc_turn_on(sp,b,a) #endif /* USE_XMC_SUPPORT */ /* ** TransformLine(lineno) ** ** Transform the given line in curscr to the one in newscr, using ** Insert/Delete Character if idcok && has_ic(). ** ** firstChar = position of first different character in line ** oLastChar = position of last different character in old line ** nLastChar = position of last different character in new line ** ** move to firstChar ** overwrite chars up to Min(oLastChar, nLastChar) ** if oLastChar < nLastChar ** insert newLine[oLastChar+1..nLastChar] ** else ** delete oLastChar - nLastChar spaces */ static void TransformLine(NCURSES_SP_DCLx int const lineno) { int firstChar, oLastChar, nLastChar; NCURSES_CH_T *newLine = NewScreen(SP_PARM)->_line[lineno].text; NCURSES_CH_T *oldLine = CurScreen(SP_PARM)->_line[lineno].text; int n; bool attrchanged = FALSE; TR(TRACE_UPDATE, (T_CALLED("TransformLine(%p, %d)"), (void *) SP_PARM, lineno)); /* copy new hash value to old one */ if (SP_PARM->oldhash && SP_PARM->newhash) SP_PARM->oldhash[lineno] = SP_PARM->newhash[lineno]; /* * If we have colors, there is the possibility of having two color pairs * that display as the same colors. For instance, Lynx does this. Check * for this case, and update the old line with the new line's colors when * they are equivalent. */ if (SP_PARM->_coloron) { int oldPair; int newPair; for (n = 0; n < screen_columns(SP_PARM); n++) { if (!CharEq(newLine[n], oldLine[n])) { oldPair = GetPair(oldLine[n]); newPair = GetPair(newLine[n]); if (oldPair != newPair && unColor(oldLine[n]) == unColor(newLine[n])) { if (oldPair < SP_PARM->_pair_alloc && newPair < SP_PARM->_pair_alloc && (isSamePair(SP_PARM->_color_pairs[oldPair], SP_PARM->_color_pairs[newPair]))) { SetPair(oldLine[n], GetPair(newLine[n])); } } } } } if (ceol_standout_glitch && clr_eol) { firstChar = 0; while (firstChar < screen_columns(SP_PARM)) { if (!SameAttrOf(newLine[firstChar], oldLine[firstChar])) { attrchanged = TRUE; break; } firstChar++; } } firstChar = 0; if (attrchanged) { /* we may have to disregard the whole line */ GoTo(NCURSES_SP_ARGx lineno, firstChar); ClrToEOL(NCURSES_SP_ARGx ClrBlank(NCURSES_SP_ARGx CurScreen(SP_PARM)), FALSE); PutRange(NCURSES_SP_ARGx oldLine, newLine, lineno, 0, screen_columns(SP_PARM) - 1); #if USE_XMC_SUPPORT /* * This is a very simple loop to paint characters which may have the * magic cookie glitch embedded. It doesn't know much about video * attributes which are continued from one line to the next. It * assumes that we have filtered out requests for attribute changes * that do not get mapped to blank positions. * * FIXME: we are not keeping track of where we put the cookies, so this * will work properly only once, since we may overwrite a cookie in a * following operation. */ } else if (magic_cookie_glitch > 0) { GoTo(NCURSES_SP_ARGx lineno, firstChar); for (n = 0; n < screen_columns(SP_PARM); n++) { int m = n + magic_cookie_glitch; /* check for turn-on: * If we are writing an attributed blank, where the * previous cell is not attributed. */ if (ISBLANK(newLine[n]) && ((n > 0 && xmc_turn_on(SP_PARM, newLine[n - 1], newLine[n])) || (n == 0 && lineno > 0 && xmc_turn_on(SP_PARM, xmc_new(SP_PARM, lineno - 1, screen_columns(SP_PARM) - 1), newLine[n])))) { n = m; } PutChar(NCURSES_SP_ARGx CHREF(newLine[n])); /* check for turn-off: * If we are writing an attributed non-blank, where the * next cell is blank, and not attributed. */ if (!ISBLANK(newLine[n]) && ((n + 1 < screen_columns(SP_PARM) && xmc_turn_off(SP_PARM, newLine[n], newLine[n + 1])) || (n + 1 >= screen_columns(SP_PARM) && lineno + 1 < screen_lines(SP_PARM) && xmc_turn_off(SP_PARM, newLine[n], xmc_new(SP_PARM, lineno + 1, 0))))) { n = m; } } #endif } else { NCURSES_CH_T blank; /* it may be cheap to clear leading whitespace with clr_bol */ blank = newLine[0]; if (clr_bol && can_clear_with(NCURSES_SP_ARGx CHREF(blank))) { int oFirstChar, nFirstChar; for (oFirstChar = 0; oFirstChar < screen_columns(SP_PARM); oFirstChar++) if (!CharEq(oldLine[oFirstChar], blank)) break; for (nFirstChar = 0; nFirstChar < screen_columns(SP_PARM); nFirstChar++) if (!CharEq(newLine[nFirstChar], blank)) break; if (nFirstChar == oFirstChar) { firstChar = nFirstChar; /* find the first differing character */ while (firstChar < screen_columns(SP_PARM) && CharEq(newLine[firstChar], oldLine[firstChar])) firstChar++; } else if (oFirstChar > nFirstChar) { firstChar = nFirstChar; } else { /* oFirstChar < nFirstChar */ firstChar = oFirstChar; if (SP_PARM->_el1_cost < nFirstChar - oFirstChar) { if (nFirstChar >= screen_columns(SP_PARM) && SP_PARM->_el_cost <= SP_PARM->_el1_cost) { GoTo(NCURSES_SP_ARGx lineno, 0); UpdateAttrs(SP_PARM, blank); NCURSES_PUTP2("clr_eol", clr_eol); } else { GoTo(NCURSES_SP_ARGx lineno, nFirstChar - 1); UpdateAttrs(SP_PARM, blank); NCURSES_PUTP2("clr_bol", clr_bol); } while (firstChar < nFirstChar) oldLine[firstChar++] = blank; } } } else { /* find the first differing character */ while (firstChar < screen_columns(SP_PARM) && CharEq(newLine[firstChar], oldLine[firstChar])) firstChar++; } /* if there wasn't one, we're done */ if (firstChar >= screen_columns(SP_PARM)) { TR(TRACE_UPDATE, (T_RETURN(""))); return; } blank = newLine[screen_columns(SP_PARM) - 1]; if (!can_clear_with(NCURSES_SP_ARGx CHREF(blank))) { /* find the last differing character */ nLastChar = screen_columns(SP_PARM) - 1; while (nLastChar > firstChar && CharEq(newLine[nLastChar], oldLine[nLastChar])) nLastChar--; if (nLastChar >= firstChar) { GoTo(NCURSES_SP_ARGx lineno, firstChar); PutRange(NCURSES_SP_ARGx oldLine, newLine, lineno, firstChar, nLastChar); memcpy(oldLine + firstChar, newLine + firstChar, (unsigned) (nLastChar - firstChar + 1) * sizeof(NCURSES_CH_T)); } TR(TRACE_UPDATE, (T_RETURN(""))); return; } /* find last non-blank character on old line */ oLastChar = screen_columns(SP_PARM) - 1; while (oLastChar > firstChar && CharEq(oldLine[oLastChar], blank)) oLastChar--; /* find last non-blank character on new line */ nLastChar = screen_columns(SP_PARM) - 1; while (nLastChar > firstChar && CharEq(newLine[nLastChar], blank)) nLastChar--; if ((nLastChar == firstChar) && (SP_PARM->_el_cost < (oLastChar - nLastChar))) { GoTo(NCURSES_SP_ARGx lineno, firstChar); if (!CharEq(newLine[firstChar], blank)) PutChar(NCURSES_SP_ARGx CHREF(newLine[firstChar])); ClrToEOL(NCURSES_SP_ARGx blank, FALSE); } else if ((nLastChar != oLastChar) && (!CharEq(newLine[nLastChar], oldLine[oLastChar]) || !(SP_PARM->_nc_sp_idcok && NCURSES_SP_NAME(has_ic) (NCURSES_SP_ARG)))) { GoTo(NCURSES_SP_ARGx lineno, firstChar); if ((oLastChar - nLastChar) > SP_PARM->_el_cost) { if (PutRange(NCURSES_SP_ARGx oldLine, newLine, lineno, firstChar, nLastChar)) { GoTo(NCURSES_SP_ARGx lineno, nLastChar + 1); } ClrToEOL(NCURSES_SP_ARGx blank, FALSE); } else { n = Max(nLastChar, oLastChar); PutRange(NCURSES_SP_ARGx oldLine, newLine, lineno, firstChar, n); } } else { int nLastNonblank = nLastChar; int oLastNonblank = oLastChar; /* find the last characters that really differ */ /* can be -1 if no characters differ */ while (CharEq(newLine[nLastChar], oldLine[oLastChar])) { /* don't split a wide char */ if (isWidecExt(newLine[nLastChar]) && !CharEq(newLine[nLastChar - 1], oldLine[oLastChar - 1])) break; nLastChar--; oLastChar--; if (nLastChar == -1 || oLastChar == -1) break; } n = Min(oLastChar, nLastChar); if (n >= firstChar) { GoTo(NCURSES_SP_ARGx lineno, firstChar); PutRange(NCURSES_SP_ARGx oldLine, newLine, lineno, firstChar, n); } if (oLastChar < nLastChar) { int m = Max(nLastNonblank, oLastNonblank); #if USE_WIDEC_SUPPORT if (n) { while (isWidecExt(newLine[n + 1]) && n) { --n; --oLastChar; /* increase cost */ } } else if (n >= firstChar && isWidecBase(newLine[n])) { while (isWidecExt(newLine[n + 1])) { ++n; ++oLastChar; /* decrease cost */ } } #endif GoTo(NCURSES_SP_ARGx lineno, n + 1); if ((nLastChar < nLastNonblank) || InsCharCost(SP_PARM, nLastChar - oLastChar) > (m - n)) { PutRange(NCURSES_SP_ARGx oldLine, newLine, lineno, n + 1, m); } else { InsStr(NCURSES_SP_ARGx &newLine[n + 1], nLastChar - oLastChar); } } else if (oLastChar > nLastChar) { GoTo(NCURSES_SP_ARGx lineno, n + 1); if (DelCharCost(SP_PARM, oLastChar - nLastChar) > SP_PARM->_el_cost + nLastNonblank - (n + 1)) { if (PutRange(NCURSES_SP_ARGx oldLine, newLine, lineno, n + 1, nLastNonblank)) { GoTo(NCURSES_SP_ARGx lineno, nLastNonblank + 1); } ClrToEOL(NCURSES_SP_ARGx blank, FALSE); } else { /* * The delete-char sequence will * effectively shift in blanks from the * right margin of the screen. Ensure * that they are the right color by * setting the video attributes from * the last character on the row. */ UpdateAttrs(SP_PARM, blank); DelChar(NCURSES_SP_ARGx oLastChar - nLastChar); } } } } /* update the code's internal representation */ if (screen_columns(SP_PARM) > firstChar) memcpy(oldLine + firstChar, newLine + firstChar, (unsigned) (screen_columns(SP_PARM) - firstChar) * sizeof(NCURSES_CH_T)); TR(TRACE_UPDATE, (T_RETURN(""))); return; } /* ** ClearScreen(blank) ** ** Clear the physical screen and put cursor at home ** */ static void ClearScreen(NCURSES_SP_DCLx NCURSES_CH_T blank) { int i, j; bool fast_clear = (clear_screen || clr_eos || clr_eol); TR(TRACE_UPDATE, ("ClearScreen() called")); #if NCURSES_EXT_FUNCS if (SP_PARM->_coloron && !SP_PARM->_default_color) { NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx (short) GET_SCREEN_PAIR(SP_PARM), 0, FALSE, NCURSES_SP_NAME(_nc_outch)); if (!back_color_erase) { fast_clear = FALSE; } } #endif if (fast_clear) { if (clear_screen) { UpdateAttrs(SP_PARM, blank); NCURSES_PUTP2("clear_screen", clear_screen); SP_PARM->_cursrow = SP_PARM->_curscol = 0; position_check(NCURSES_SP_ARGx SP_PARM->_cursrow, SP_PARM->_curscol, "ClearScreen"); } else if (clr_eos) { SP_PARM->_cursrow = SP_PARM->_curscol = -1; GoTo(NCURSES_SP_ARGx 0, 0); UpdateAttrs(SP_PARM, blank); TPUTS_TRACE("clr_eos"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx clr_eos, screen_lines(SP_PARM), NCURSES_SP_NAME(_nc_outch)); } else if (clr_eol) { SP_PARM->_cursrow = SP_PARM->_curscol = -1; UpdateAttrs(SP_PARM, blank); for (i = 0; i < screen_lines(SP_PARM); i++) { GoTo(NCURSES_SP_ARGx i, 0); NCURSES_PUTP2("clr_eol", clr_eol); } GoTo(NCURSES_SP_ARGx 0, 0); } } else { UpdateAttrs(SP_PARM, blank); for (i = 0; i < screen_lines(SP_PARM); i++) { GoTo(NCURSES_SP_ARGx i, 0); for (j = 0; j < screen_columns(SP_PARM); j++) PutChar(NCURSES_SP_ARGx CHREF(blank)); } GoTo(NCURSES_SP_ARGx 0, 0); } for (i = 0; i < screen_lines(SP_PARM); i++) { for (j = 0; j < screen_columns(SP_PARM); j++) CurScreen(SP_PARM)->_line[i].text[j] = blank; } TR(TRACE_UPDATE, ("screen cleared")); } /* ** InsStr(line, count) ** ** Insert the count characters pointed to by line. ** */ static void InsStr(NCURSES_SP_DCLx NCURSES_CH_T *line, int count) { TR(TRACE_UPDATE, ("InsStr(%p, %p,%d) called", (void *) SP_PARM, (void *) line, count)); /* Prefer parm_ich as it has the smallest cost - no need to shift * the whole line on each character. */ /* The order must match that of InsCharCost. */ if (parm_ich) { TPUTS_TRACE("parm_ich"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_1(parm_ich, count), 1, NCURSES_SP_NAME(_nc_outch)); while (count > 0) { PutAttrChar(NCURSES_SP_ARGx CHREF(*line)); line++; count--; } } else if (enter_insert_mode && exit_insert_mode) { NCURSES_PUTP2("enter_insert_mode", enter_insert_mode); while (count > 0) { PutAttrChar(NCURSES_SP_ARGx CHREF(*line)); if (insert_padding) { NCURSES_PUTP2("insert_padding", insert_padding); } line++; count--; } NCURSES_PUTP2("exit_insert_mode", exit_insert_mode); } else { while (count > 0) { NCURSES_PUTP2("insert_character", insert_character); PutAttrChar(NCURSES_SP_ARGx CHREF(*line)); if (insert_padding) { NCURSES_PUTP2("insert_padding", insert_padding); } line++; count--; } } position_check(NCURSES_SP_ARGx SP_PARM->_cursrow, SP_PARM->_curscol, "InsStr"); } /* ** DelChar(count) ** ** Delete count characters at current position ** */ static void DelChar(NCURSES_SP_DCLx int count) { TR(TRACE_UPDATE, ("DelChar(%p, %d) called, position = (%ld,%ld)", (void *) SP_PARM, count, (long) NewScreen(SP_PARM)->_cury, (long) NewScreen(SP_PARM)->_curx)); if (parm_dch) { TPUTS_TRACE("parm_dch"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_1(parm_dch, count), 1, NCURSES_SP_NAME(_nc_outch)); } else { int n; for (n = 0; n < count; n++) { NCURSES_PUTP2("delete_character", delete_character); } } } /* * Physical-scrolling support * * This code was adapted from Keith Bostic's hardware scrolling * support for 4.4BSD curses. I (esr) translated it to use terminfo * capabilities, narrowed the call interface slightly, and cleaned * up some convoluted tests. I also added support for the memory_above * memory_below, and non_dest_scroll_region capabilities. * * For this code to work, we must have either * change_scroll_region and scroll forward/reverse commands, or * insert and delete line capabilities. * When the scrolling region has been set, the cursor has to * be at the last line of the region to make the scroll up * happen, or on the first line of region to scroll down. * * This code makes one aesthetic decision in the opposite way from * BSD curses. BSD curses preferred pairs of il/dl operations * over scrolls, allegedly because il/dl looked faster. We, on * the other hand, prefer scrolls because (a) they're just as fast * on many terminals and (b) using them avoids bouncing an * unchanged bottom section of the screen up and down, which is * visually nasty. * * (lav): added more cases, used dl/il when bot==maxy and in csr case. * * I used assumption that capabilities il/il1/dl/dl1 work inside * changed scroll region not shifting screen contents outside of it. * If there are any terminals behaving different way, it would be * necessary to add some conditions to scroll_csr_forward/backward. */ /* Try to scroll up assuming given csr (miny, maxy). Returns ERR on failure */ static int scroll_csr_forward(NCURSES_SP_DCLx int n, int top, int bot, int miny, int maxy, NCURSES_CH_T blank) { int i; if (n == 1 && scroll_forward && top == miny && bot == maxy) { GoTo(NCURSES_SP_ARGx bot, 0); UpdateAttrs(SP_PARM, blank); NCURSES_PUTP2("scroll_forward", scroll_forward); } else if (n == 1 && delete_line && bot == maxy) { GoTo(NCURSES_SP_ARGx top, 0); UpdateAttrs(SP_PARM, blank); NCURSES_PUTP2("delete_line", delete_line); } else if (parm_index && top == miny && bot == maxy) { GoTo(NCURSES_SP_ARGx bot, 0); UpdateAttrs(SP_PARM, blank); TPUTS_TRACE("parm_index"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_1(parm_index, n), n, NCURSES_SP_NAME(_nc_outch)); } else if (parm_delete_line && bot == maxy) { GoTo(NCURSES_SP_ARGx top, 0); UpdateAttrs(SP_PARM, blank); TPUTS_TRACE("parm_delete_line"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_1(parm_delete_line, n), n, NCURSES_SP_NAME(_nc_outch)); } else if (scroll_forward && top == miny && bot == maxy) { GoTo(NCURSES_SP_ARGx bot, 0); UpdateAttrs(SP_PARM, blank); for (i = 0; i < n; i++) { NCURSES_PUTP2("scroll_forward", scroll_forward); } } else if (delete_line && bot == maxy) { GoTo(NCURSES_SP_ARGx top, 0); UpdateAttrs(SP_PARM, blank); for (i = 0; i < n; i++) { NCURSES_PUTP2("delete_line", delete_line); } } else return ERR; #if NCURSES_EXT_FUNCS if (FILL_BCE(SP_PARM)) { int j; for (i = 0; i < n; i++) { GoTo(NCURSES_SP_ARGx bot - i, 0); for (j = 0; j < screen_columns(SP_PARM); j++) PutChar(NCURSES_SP_ARGx CHREF(blank)); } } #endif return OK; } /* Try to scroll down assuming given csr (miny, maxy). Returns ERR on failure */ /* n > 0 */ static int scroll_csr_backward(NCURSES_SP_DCLx int n, int top, int bot, int miny, int maxy, NCURSES_CH_T blank) { int i; if (n == 1 && scroll_reverse && top == miny && bot == maxy) { GoTo(NCURSES_SP_ARGx top, 0); UpdateAttrs(SP_PARM, blank); NCURSES_PUTP2("scroll_reverse", scroll_reverse); } else if (n == 1 && insert_line && bot == maxy) { GoTo(NCURSES_SP_ARGx top, 0); UpdateAttrs(SP_PARM, blank); NCURSES_PUTP2("insert_line", insert_line); } else if (parm_rindex && top == miny && bot == maxy) { GoTo(NCURSES_SP_ARGx top, 0); UpdateAttrs(SP_PARM, blank); TPUTS_TRACE("parm_rindex"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_1(parm_rindex, n), n, NCURSES_SP_NAME(_nc_outch)); } else if (parm_insert_line && bot == maxy) { GoTo(NCURSES_SP_ARGx top, 0); UpdateAttrs(SP_PARM, blank); TPUTS_TRACE("parm_insert_line"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_1(parm_insert_line, n), n, NCURSES_SP_NAME(_nc_outch)); } else if (scroll_reverse && top == miny && bot == maxy) { GoTo(NCURSES_SP_ARGx top, 0); UpdateAttrs(SP_PARM, blank); for (i = 0; i < n; i++) { NCURSES_PUTP2("scroll_reverse", scroll_reverse); } } else if (insert_line && bot == maxy) { GoTo(NCURSES_SP_ARGx top, 0); UpdateAttrs(SP_PARM, blank); for (i = 0; i < n; i++) { NCURSES_PUTP2("insert_line", insert_line); } } else return ERR; #if NCURSES_EXT_FUNCS if (FILL_BCE(SP_PARM)) { int j; for (i = 0; i < n; i++) { GoTo(NCURSES_SP_ARGx top + i, 0); for (j = 0; j < screen_columns(SP_PARM); j++) PutChar(NCURSES_SP_ARGx CHREF(blank)); } } #endif return OK; } /* scroll by using delete_line at del and insert_line at ins */ /* n > 0 */ static int scroll_idl(NCURSES_SP_DCLx int n, int del, int ins, NCURSES_CH_T blank) { int i; if (!((parm_delete_line || delete_line) && (parm_insert_line || insert_line))) return ERR; GoTo(NCURSES_SP_ARGx del, 0); UpdateAttrs(SP_PARM, blank); if (n == 1 && delete_line) { NCURSES_PUTP2("delete_line", delete_line); } else if (parm_delete_line) { TPUTS_TRACE("parm_delete_line"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_1(parm_delete_line, n), n, NCURSES_SP_NAME(_nc_outch)); } else { /* if (delete_line) */ for (i = 0; i < n; i++) { NCURSES_PUTP2("delete_line", delete_line); } } GoTo(NCURSES_SP_ARGx ins, 0); UpdateAttrs(SP_PARM, blank); if (n == 1 && insert_line) { NCURSES_PUTP2("insert_line", insert_line); } else if (parm_insert_line) { TPUTS_TRACE("parm_insert_line"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TIPARM_1(parm_insert_line, n), n, NCURSES_SP_NAME(_nc_outch)); } else { /* if (insert_line) */ for (i = 0; i < n; i++) { NCURSES_PUTP2("insert_line", insert_line); } } return OK; } /* * Note: some terminals require the cursor to be within the scrolling margins * before setting them. Generally, the cursor must be at the appropriate end * of the scrolling margins when issuing an indexing operation (it is not * apparent whether it must also be at the left margin; we do this just to be * safe). To make the related cursor movement a little faster, we use the * save/restore cursor capabilities if the terminal has them. */ NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_scrolln) (NCURSES_SP_DCLx int n, int top, int bot, int maxy) /* scroll region from top to bot by n lines */ { NCURSES_CH_T blank; int i; bool cursor_saved = FALSE; int res; TR(TRACE_MOVE, ("_nc_scrolln(%p, %d, %d, %d, %d)", (void *) SP_PARM, n, top, bot, maxy)); if (!IsValidScreen(SP_PARM)) return (ERR); blank = ClrBlank(NCURSES_SP_ARGx StdScreen(SP_PARM)); #if USE_XMC_SUPPORT /* * If we scroll, we might remove a cookie. */ if (magic_cookie_glitch > 0) { return (ERR); } #endif if (n > 0) { /* scroll up (forward) */ /* * Explicitly clear if stuff pushed off top of region might * be saved by the terminal. */ res = scroll_csr_forward(NCURSES_SP_ARGx n, top, bot, 0, maxy, blank); if (res == ERR && change_scroll_region) { if ((((n == 1 && scroll_forward) || parm_index) && (SP_PARM->_cursrow == bot || SP_PARM->_cursrow == bot - 1)) && save_cursor && restore_cursor) { cursor_saved = TRUE; NCURSES_PUTP2("save_cursor", save_cursor); } NCURSES_PUTP2("change_scroll_region", TIPARM_2(change_scroll_region, top, bot)); if (cursor_saved) { NCURSES_PUTP2("restore_cursor", restore_cursor); } else { SP_PARM->_cursrow = SP_PARM->_curscol = -1; } res = scroll_csr_forward(NCURSES_SP_ARGx n, top, bot, top, bot, blank); NCURSES_PUTP2("change_scroll_region", TIPARM_2(change_scroll_region, 0, maxy)); SP_PARM->_cursrow = SP_PARM->_curscol = -1; } if (res == ERR && SP_PARM->_nc_sp_idlok) res = scroll_idl(NCURSES_SP_ARGx n, top, bot - n + 1, blank); /* * Clear the newly shifted-in text. */ if (res != ERR && (non_dest_scroll_region || (memory_below && bot == maxy))) { static const NCURSES_CH_T blank2 = NewChar(BLANK_TEXT); if (bot == maxy && clr_eos) { GoTo(NCURSES_SP_ARGx bot - n + 1, 0); ClrToEOS(NCURSES_SP_ARGx blank2); } else { for (i = 0; i < n; i++) { GoTo(NCURSES_SP_ARGx bot - i, 0); ClrToEOL(NCURSES_SP_ARGx blank2, FALSE); } } } } else { /* (n < 0) - scroll down (backward) */ res = scroll_csr_backward(NCURSES_SP_ARGx -n, top, bot, 0, maxy, blank); if (res == ERR && change_scroll_region) { if (top != 0 && (SP_PARM->_cursrow == top || SP_PARM->_cursrow == top - 1) && save_cursor && restore_cursor) { cursor_saved = TRUE; NCURSES_PUTP2("save_cursor", save_cursor); } NCURSES_PUTP2("change_scroll_region", TIPARM_2(change_scroll_region, top, bot)); if (cursor_saved) { NCURSES_PUTP2("restore_cursor", restore_cursor); } else { SP_PARM->_cursrow = SP_PARM->_curscol = -1; } res = scroll_csr_backward(NCURSES_SP_ARGx -n, top, bot, top, bot, blank); NCURSES_PUTP2("change_scroll_region", TIPARM_2(change_scroll_region, 0, maxy)); SP_PARM->_cursrow = SP_PARM->_curscol = -1; } if (res == ERR && SP_PARM->_nc_sp_idlok) res = scroll_idl(NCURSES_SP_ARGx -n, bot + n + 1, top, blank); /* * Clear the newly shifted-in text. */ if (res != ERR && (non_dest_scroll_region || (memory_above && top == 0))) { static const NCURSES_CH_T blank2 = NewChar(BLANK_TEXT); for (i = 0; i < -n; i++) { GoTo(NCURSES_SP_ARGx i + top, 0); ClrToEOL(NCURSES_SP_ARGx blank2, FALSE); } } } if (res == ERR) return (ERR); _nc_scroll_window(CurScreen(SP_PARM), n, (NCURSES_SIZE_T) top, (NCURSES_SIZE_T) bot, blank); /* shift hash values too - they can be reused */ NCURSES_SP_NAME(_nc_scroll_oldhash) (NCURSES_SP_ARGx n, top, bot); return (OK); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) _nc_scrolln(int n, int top, int bot, int maxy) { return NCURSES_SP_NAME(_nc_scrolln) (CURRENT_SCREEN, n, top, bot, maxy); } #endif NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_DCL0) { assert(SP_PARM); /* make sure terminal is in a sane known state */ SetAttr(SCREEN_ATTRS(SP_PARM), A_NORMAL); NewScreen(SP_PARM)->_clear = TRUE; /* reset color pairs and definitions */ if (SP_PARM->_coloron || SP_PARM->_color_defs) NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_ARG); /* restore user-defined colors, if any */ if (SP_PARM->_color_defs < 0 && !SP_PARM->_direct_color.value) { int n; SP_PARM->_color_defs = -(SP_PARM->_color_defs); for (n = 0; n < SP_PARM->_color_defs; ++n) { if (SP_PARM->_color_table[n].init) { _nc_init_color(SP_PARM, n, SP_PARM->_color_table[n].r, SP_PARM->_color_table[n].g, SP_PARM->_color_table[n].b); } } } if (exit_attribute_mode) NCURSES_PUTP2("exit_attribute_mode", exit_attribute_mode); else { /* turn off attributes */ if (exit_alt_charset_mode) NCURSES_PUTP2("exit_alt_charset_mode", exit_alt_charset_mode); if (exit_standout_mode) NCURSES_PUTP2("exit_standout_mode", exit_standout_mode); if (exit_underline_mode) NCURSES_PUTP2("exit_underline_mode", exit_underline_mode); } if (exit_insert_mode) NCURSES_PUTP2("exit_insert_mode", exit_insert_mode); if (enter_am_mode && exit_am_mode) { if (auto_right_margin) { NCURSES_PUTP2("enter_am_mode", enter_am_mode); } else { NCURSES_PUTP2("exit_am_mode", exit_am_mode); } } } #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) _nc_screen_resume(void) { NCURSES_SP_NAME(_nc_screen_resume) (CURRENT_SCREEN); } #endif NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_screen_init) (NCURSES_SP_DCL0) { NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) _nc_screen_init(void) { NCURSES_SP_NAME(_nc_screen_init) (CURRENT_SCREEN); } #endif /* wrap up screen handling */ NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_screen_wrap) (NCURSES_SP_DCL0) { if (SP_PARM != 0) { UpdateAttrs(SP_PARM, normal); #if NCURSES_EXT_FUNCS if (SP_PARM->_coloron && !SP_PARM->_default_color) { static const NCURSES_CH_T blank = NewChar(BLANK_TEXT); SP_PARM->_default_color = TRUE; NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx -1, 0, FALSE, NCURSES_SP_NAME(_nc_outch)); SP_PARM->_default_color = FALSE; TINFO_MVCUR(NCURSES_SP_ARGx SP_PARM->_cursrow, SP_PARM->_curscol, screen_lines(SP_PARM) - 1, 0); ClrToEOL(NCURSES_SP_ARGx blank, TRUE); } #endif if (SP_PARM->_color_defs) { NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_ARG); } } } #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) _nc_screen_wrap(void) { NCURSES_SP_NAME(_nc_screen_wrap) (CURRENT_SCREEN); } #endif #if USE_XMC_SUPPORT NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_do_xmc_glitch) (NCURSES_SP_DCLx attr_t previous) { if (SP_PARM != 0) { attr_t chg = XMC_CHANGES(previous ^ AttrOf(SCREEN_ATTRS(SP_PARM))); while (chg != 0) { if (chg & 1) { SP_PARM->_curscol += magic_cookie_glitch; if (SP_PARM->_curscol >= SP_PARM->_columns) wrap_cursor(NCURSES_SP_ARG); TR(TRACE_UPDATE, ("bumped to %d,%d after cookie", SP_PARM->_cursrow, SP_PARM->_curscol)); } chg >>= 1; } } } #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) _nc_do_xmc_glitch(attr_t previous) { NCURSES_SP_NAME(_nc_do_xmc_glitch) (CURRENT_SCREEN, previous); } #endif #endif /* USE_XMC_SUPPORT */ ncurses-6.4-20240113/ncurses/tty/MKexpanded.sh0000755000000000000000000001045314177531566017340 0ustar rootroot#! /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 */ ncurses-6.4-20240113/ncurses/llib-lncursest0000644000000000000000000022140314465752644017027 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/ncurses/llib-ltic0000644000000000000000000001253014465753133015731 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/mk-0th.awk0000644000000000000000000001354614025360060014246 0ustar rootroot# $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 ncurses-6.4-20240113/COPYING0000644000000000000000000000264714546070355013512 0ustar rootrootCopyright 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 $ ncurses-6.4-20240113/INSTALL0000644000000000000000000030144414521257123013476 0ustar rootroot------------------------------------------------------------------------------- -- Copyright 2018-2022,2023 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.253 2023/11/03 20:55:47 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 ancient BSD programs (such as nethack) call 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-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 are generated using a set of scripts which build several configurations for each release version, checking to see which of the "_nc_" symbols can be made local. In addition to the ncurses libraries and programs, the symbols used by the "tack" program before version 1.08 are made global. These sample ".map" files will not cover all possible combinations. In some cases, e.g., when using the --with-weak-symbols option, you may prefer to use a different ".map" file by setting this option's value. --with-wrap-prefix=XXX When using the --enable-reentrant option, ncurses redefines variables that would be global in curses, e.g., LINES, as a macro that calls a "wrapping" function which fetches the data from the current SCREEN structure. Normally that function is named by prepending "_nc_" to the variable's name. The function is technically private (since portable applications would not refer directly to it). But according to one line of reasoning, it is not the same type of "private" as functions which applications should not call even via a macro. This configure option lets you choose the prefix for these wrapped variables. --with-x11-rgb=FILE Provide a pathname for the X11 rgb file, used by the picsmap program. This overrides a configure check which usually works, but is needed due to the lack of standardization for X11's files. --with-xterm-kbs=XXX Configure xterm's terminfo entries to use either BS (^H, i.e., ASCII backspace) or DEL (^?, or 127). XXX can be BS (or bs, 8) or DEL (or del, 127). 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 (TBD; not stable; in development) 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. 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 ncurses-6.4-20240113/progs/0000755000000000000000000000000014537357023013600 5ustar rootrootncurses-6.4-20240113/progs/tabs.c0000644000000000000000000004107014521526621014672 0ustar rootroot/**************************************************************************** * Copyright 2020-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 * ****************************************************************************/ /* * tabs.c -- set terminal hard-tabstops */ #define USE_LIBTINFO #include #include MODULE_ID("$Id: tabs.c,v 1.53 2023/11/04 20:46:09 tom Exp $") static GCC_NORETURN void usage(void); const char *_nc_progname; static int max_cols; static void failed(const char *s) { perror(s); ExitProgram(EXIT_FAILURE); } static int putch(int c) { return putchar(c); } static char * skip_csi(char *value) { if (UChar(*value) == 0x9b) ++value; else if (!strncmp(value, "\033[", 2)) value += 2; return value; } /* * If the terminal uses ANSI clear_all_tabs, then it is not necessary to first * move to the left margin before clearing tabs. */ static bool ansi_clear_tabs(void) { bool result = FALSE; if (VALID_STRING(clear_all_tabs)) { char *param = skip_csi(clear_all_tabs); if (!strcmp(param, "3g")) result = TRUE; } return result; } static void do_tabs(int *tab_list) { int last = 1; int stop; bool first = TRUE; while ((stop = *tab_list++) > 0) { if (first) { first = FALSE; putchar('\r'); } if (last < stop) { while (last++ < stop) { if (last > max_cols) break; putchar(' '); } } if (stop <= max_cols) { tputs(set_tab, 1, putch); last = stop; } else { break; } } putchar('\r'); } /* * Decode a list of tab-stops from a string, returning an array of integers. * If the margin is positive (because the terminal does not support margins), * work around this by adding the margin to the decoded values. */ static int * decode_tabs(const char *tab_list, int margin) { int *result = typeCalloc(int, strlen(tab_list) + (unsigned) max_cols); int n = 0; int value = 0; int prior = 0; int ch; if (result == NULL) failed("decode_tabs"); if (margin < 0) margin = 0; while ((ch = *tab_list++) != '\0') { if (isdigit(UChar(ch))) { value *= 10; value += (ch - '0'); if (value > max_cols) value = max_cols; } else if (ch == ',') { result[n] = value + prior + margin; if (n > 0 && result[n] <= result[n - 1]) { fprintf(stderr, "%s: tab-stops are not in increasing order: %d %d\n", _nc_progname, value, result[n - 1]); free(result); result = 0; break; } ++n; value = 0; prior = 0; } else if (ch == '+') { if (n) prior = result[n - 1]; } } if (result != 0) { /* * If there is only one value, then it is an option such as "-8". */ if ((n == 0) && (value > 0)) { int step = value; value = 1; while (n < max_cols - 1) { result[n++] = value + margin; value += step; } } /* * Add the last value, if any. */ result[n++] = value + prior + margin; result[n] = 0; } return result; } static void print_ruler(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(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("Usage: tabs [options] [tabstop-list]") DATA("") DATA("Options:") DATA(" -0 reset tabs") DATA(" -8 set tabs to standard interval") DATA(" -a Assembler, IBM S/370, first format") DATA(" -a2 Assembler, IBM S/370, second format") DATA(" -c COBOL, normal format") DATA(" -c2 COBOL compact format") DATA(" -c3 COBOL compact format extended") DATA(" -d debug (show ruler with expected/actual tab positions)") DATA(" -f FORTRAN") DATA(" -n no-op (do not modify terminal settings)") DATA(" -p PL/I") DATA(" -s SNOBOL") DATA(" -u UNIVAC 1100 Assembler") DATA(" -T name use terminal type 'name'") DATA(" -V print version") DATA("") DATA("A tabstop-list is an ordered list of column numbers, e.g., 1,11,21") DATA("or 1,+10,+10 which is the same.") }; #undef DATA fflush(stdout); fputs(msg, stderr); ExitProgram(EXIT_FAILURE); } int main(int argc, char *argv[]) { int rc = EXIT_FAILURE; bool debug = FALSE; bool no_op = FALSE; bool change_tty = FALSE; int n, ch; NCURSES_CONST char *term_name = 0; char *append = 0; const char *tab_list = 0; const char *new_line = "\n"; int margin = -1; TTY tty_settings; int fd; _nc_progname = _nc_rootname(argv[0]); if ((term_name = getenv("TERM")) == 0) term_name = "ansi+tabs"; /* cannot use getopt, since some options are two-character */ for (n = 1; n < argc; ++n) { char *option = argv[n]; switch (option[0]) { case '-': while ((ch = *++option) != '\0') { switch (ch) { case 'a': switch (*++option) { default: case '\0': tab_list = "1,10,16,36,72"; option--; /* Assembler, IBM S/370, first format */ break; case '2': tab_list = "1,10,16,40,72"; /* Assembler, IBM S/370, second format */ break; } break; case 'c': switch (*++option) { default: case '\0': tab_list = "1,8,12,16,20,55"; option--; /* COBOL, normal format */ break; case '2': tab_list = "1,6,10,14,49"; /* COBOL compact format */ break; case '3': tab_list = "1,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,67"; /* COBOL compact format extended */ break; } break; case 'd': /* ncurses extension */ debug = TRUE; break; case 'f': tab_list = "1,7,11,15,19,23"; /* FORTRAN */ break; case 'n': /* ncurses extension */ no_op = TRUE; break; case 'p': tab_list = "1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61"; /* PL/I */ break; case 's': tab_list = "1,10,55"; /* SNOBOL */ break; case 'u': tab_list = "1,12,20,44"; /* UNIVAC 1100 Assembler */ break; case 'T': ++n; if (*++option != '\0') { term_name = option; } else { term_name = argv[n]; option--; } option += ((int) strlen(option)) - 1; continue; case 'V': puts(curses_version()); ExitProgram(EXIT_SUCCESS); default: if (isdigit(UChar(*option))) { char *copy = strdup(option); *skip_list(copy) = '\0'; tab_list = copy; option = skip_list(option) - 1; } else { usage(); } break; } } break; case '+': if ((ch = *++option) != '\0') { int digits = 0; int number = 0; switch (ch) { case 'm': /* * The "+mXXX" option is unimplemented because only the long-obsolete * att510d implements smgl, which is needed to support * this option. */ while ((ch = *++option) != '\0') { if (isdigit(UChar(ch))) { ++digits; number = number * 10 + (ch - '0'); } else { usage(); } } if (digits == 0) number = 10; margin = number; break; default: /* special case of relative stops separated by spaces? */ if (option == argv[n] + 1) { tab_list = add_to_tab_list(&append, argv[n]); } break; } } break; default: if (append != 0) { if (tab_list != (const char *) append) { /* one of the predefined options was used */ free(append); append = 0; } } tab_list = add_to_tab_list(&append, option); break; } } fd = save_tty_settings(&tty_settings, FALSE); setupterm(term_name, fd, (int *) 0); max_cols = (columns > 0) ? columns : 80; if (margin > 0) max_cols -= margin; if (!VALID_STRING(clear_all_tabs)) { fprintf(stderr, "%s: terminal type '%s' cannot reset tabs\n", _nc_progname, term_name); } else if (!VALID_STRING(set_tab)) { fprintf(stderr, "%s: terminal type '%s' cannot set tabs\n", _nc_progname, term_name); } else if (legal_tab_list(tab_list)) { int *list; if (tab_list == NULL) tab_list = add_to_tab_list(&append, "8"); if (!no_op) { #if defined(TERMIOS) && defined(OCRNL) /* set tty modes to -ocrnl to allow \r */ if (isatty(STDOUT_FILENO)) { TTY new_settings = tty_settings; new_settings.c_oflag &= (unsigned) ~OCRNL; update_tty_settings(&tty_settings, &new_settings); change_tty = TRUE; new_line = "\r\n"; } #endif if (!ansi_clear_tabs()) putch('\r'); tputs(clear_all_tabs, 1, putch); } if (margin >= 0) { putch('\r'); if (margin > 0) { /* reset existing margin before setting margin, to reduce * problems moving left of the current margin. */ if (do_set_margin(0, no_op)) putch('\r'); } if (do_set_margin(margin, no_op)) margin = -1; } list = decode_tabs(tab_list, margin); if (list != 0) { if (!no_op) do_tabs(list); if (debug) { fflush(stderr); printf("tabs %s%s", tab_list, new_line); print_ruler(list, new_line); write_tabs(list, new_line); } free(list); } else if (debug) { fflush(stderr); printf("tabs %s%s", tab_list, new_line); } if (!no_op) { if (change_tty) { restore_tty_settings(); } } rc = EXIT_SUCCESS; } if (append != 0) free(append); ExitProgram(rc); } ncurses-6.4-20240113/progs/dump_entry.h0000644000000000000000000001054614037107331016133 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/progs/MKtermsort.sh0000755000000000000000000001520614177560215016251 0ustar rootroot#!/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 < 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.102 2023/04/08 16:26:36 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 set_window_size(fd, &lines, &columns); #else (void) fd; #endif set_control_chars(settings, terasechar, intrchar, tkillchar); set_conversions(settings); if (send_init_strings(fd, &oldmode)) { reset_flush(); } update_tty_settings(&oldmode, settings); return 0; } if (strcmp(name, "longname") == 0) { PUTS(longname()); return 0; } #if !PURE_TERMINFO retry: #endif if (strcmp(name, "clear") == 0) { return (clear_cmd(opt_x) == ERR) ? ErrUsage : 0; } else if ((status = tigetflag(name)) != -1) { return exit_code(BOOLEAN, status); } else if ((status = tigetnum(name)) != CANCELLED_NUMERIC) { (void) printf("%d\n", status); return exit_code(NUMBER, 0); } else if ((s = tigetstr(name)) == CANCELLED_STRING) { #if !PURE_TERMINFO if (!termcap) { const struct name_table_entry *np; termcap = TRUE; if ((np = _nc_find_entry(name, _nc_get_hash_table(termcap))) != 0) { switch (np->nte_type) { case BOOLEAN: name = boolnames[np->nte_index]; break; case NUMBER: name = numnames[np->nte_index]; break; case STRING: name = strnames[np->nte_index]; break; } goto retry; } } #endif quit(ErrCapName, "unknown terminfo capability '%s'", name); } else if (VALID_STRING(s)) { if (argc > 1) { int k; int 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, 10); 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); } ncurses-6.4-20240113/progs/reset_cmd.h0000644000000000000000000000660514126144022015710 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E Dickey * ****************************************************************************/ /* * $Id: reset_cmd.h,v 1.9 2021/10/02 20:58:58 tom Exp $ * * Utility functions for resetting terminal. */ #ifndef RESET_CMD_H #define RESET_CMD_H 1 /* *INDENT-OFF* */ #define USE_LIBTINFO #define __INTERNAL_CAPS_VISIBLE /* we need to see has_hardware_tabs */ #include #undef CTRL #define CTRL(x) ((x) & 0x1f) extern bool send_init_strings(int /* fd */, TTY * /* old_settings */); extern void print_tty_chars(TTY * /* old_settings */, TTY * /* new_settings */); extern void reset_flush(void); extern void reset_start(FILE * /* fp */, bool /* is_reset */, bool /* is_init */ ); extern void reset_tty_settings(int /* fd */, TTY * /* tty_settings */, int /* noset */); extern void set_control_chars(TTY * /* tty_settings */, int /* erase */, int /* intr */, int /* kill */); extern void set_conversions(TTY * /* tty_settings */); #if HAVE_SIZECHANGE extern void set_window_size(int /* fd */, short * /* high */, short * /* wide */); #endif extern const char *_nc_progname; /* *INDENT-ON* */ #endif /* RESET_CMD_H */ ncurses-6.4-20240113/progs/reset_cmd.c0000644000000000000000000004132014521555635015713 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,2023 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.35 2023/11/05 00:02:37 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, short *high, short *wide) { STRUCT_WINSIZE win; (void) ioctl(fd, IOCTL_GET_WINSIZE, &win); if (WINSIZE_ROWS(win) == 0 && WINSIZE_COLS(win) == 0) { if (*high > 0 && *wide > 0) { WINSIZE_ROWS(win) = (unsigned short) *high; WINSIZE_COLS(win) = (unsigned short) *wide; (void) ioctl(fd, IOCTL_SET_WINSIZE, &win); } } else if (WINSIZE_ROWS(win) > 0 && WINSIZE_COLS(win) > 0) { *high = (short) WINSIZE_ROWS(win); *wide = (short) WINSIZE_COLS(win); } } #endif ncurses-6.4-20240113/progs/clear_cmd.h0000644000000000000000000000513513615656212015664 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/progs/tset.c0000644000000000000000000005524014152771565014735 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 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.131 2021/12/04 23:02:13 tom Exp $") #ifndef environ extern char **environ; #endif const char *_nc_progname = "tset"; #define LOWERCASE(c) ((isalpha(UChar(c)) && isupper(UChar(c))) ? tolower(UChar(c)) : (c)) static GCC_NORETURN void exit_error(void); static int CaselessCmp(const char *a, const char *b) { /* strcasecmp isn't portable */ while (*a && *b) { int cmp = LOWERCASE(*a) - LOWERCASE(*b); if (cmp != 0) break; a++, b++; } return LOWERCASE(*a) - LOWERCASE(*b); } static GCC_NORETURN void exit_error(void) { restore_tty_settings(); (void) fprintf(stderr, "\n"); fflush(stderr); ExitProgram(EXIT_FAILURE); /* NOTREACHED */ } static GCC_NORETURN void err(const char *fmt, ...) { va_list ap; va_start(ap, fmt); (void) fprintf(stderr, "%s: ", _nc_progname); (void) vfprintf(stderr, fmt, ap); va_end(ap); exit_error(); /* NOTREACHED */ } static GCC_NORETURN void failed(const char *msg) { char temp[BUFSIZ]; size_t len = strlen(_nc_progname) + 2; if ((int) len < (int) sizeof(temp) - 12) { _nc_STRCPY(temp, _nc_progname, sizeof(temp)); _nc_STRCAT(temp, ": ", sizeof(temp)); } else { _nc_STRCPY(temp, "tset: ", sizeof(temp)); } _nc_STRNCAT(temp, msg, sizeof(temp), sizeof(temp) - strlen(temp) - 2); perror(temp); exit_error(); /* NOTREACHED */ } /* Prompt the user for a terminal type. */ static const char * askuser(const char *dflt) { static char answer[256]; /* We can get recalled; if so, don't continue uselessly. */ clearerr(stdin); if (feof(stdin) || ferror(stdin)) { (void) fprintf(stderr, "\n"); exit_error(); /* NOTREACHED */ } for (;;) { char *p; if (dflt) (void) fprintf(stderr, "Terminal type? [%s] ", dflt); else (void) fprintf(stderr, "Terminal type? "); (void) fflush(stderr); if (fgets(answer, sizeof(answer), stdin) == 0) { if (dflt == 0) { exit_error(); /* NOTREACHED */ } return (dflt); } if ((p = strchr(answer, '\n')) != 0) *p = '\0'; if (answer[0]) return (answer); if (dflt != 0) return (dflt); } } /************************************************************************** * * Mapping logic begins here * **************************************************************************/ /* Baud rate conditionals for mapping. */ #define GT 0x01 #define EQ 0x02 #define LT 0x04 #define NOT 0x08 #define GE (GT | EQ) #define LE (LT | EQ) typedef struct map { struct map *next; /* Linked list of maps. */ const char *porttype; /* Port type, or "" for any. */ const char *type; /* Terminal type to select. */ int conditional; /* Baud rate conditionals bitmask. */ int speed; /* Baud rate to compare against. */ } MAP; static MAP *cur, *maplist; #define DATA(name,value) { { name }, value } typedef struct speeds { const char string[8]; int speed; } SPEEDS; #if defined(EXP_WIN32_DRIVER) static const SPEEDS speeds[] = { {"0", 0} }; #else static const SPEEDS speeds[] = { DATA("0", B0), DATA("50", B50), DATA("75", B75), DATA("110", B110), DATA("134", B134), DATA("134.5", B134), DATA("150", B150), DATA("200", B200), DATA("300", B300), DATA("600", B600), DATA("1200", B1200), DATA("1800", B1800), DATA("2400", B2400), DATA("4800", B4800), DATA("9600", B9600), /* sgttyb may define up to this point */ #ifdef B19200 DATA("19200", B19200), #endif #ifdef B38400 DATA("38400", B38400), #endif #ifdef B19200 DATA("19200", B19200), #endif #ifdef B38400 DATA("38400", B38400), #endif #ifdef B19200 DATA("19200", B19200), #else #ifdef EXTA DATA("19200", EXTA), #endif #endif #ifdef B38400 DATA("38400", B38400), #else #ifdef EXTB DATA("38400", EXTB), #endif #endif #ifdef B57600 DATA("57600", B57600), #endif #ifdef B76800 DATA("76800", B57600), #endif #ifdef B115200 DATA("115200", B115200), #endif #ifdef B153600 DATA("153600", B153600), #endif #ifdef B230400 DATA("230400", B230400), #endif #ifdef B307200 DATA("307200", B307200), #endif #ifdef B460800 DATA("460800", B460800), #endif #ifdef B500000 DATA("500000", B500000), #endif #ifdef B576000 DATA("576000", B576000), #endif #ifdef B921600 DATA("921600", B921600), #endif #ifdef B1000000 DATA("1000000", B1000000), #endif #ifdef B1152000 DATA("1152000", B1152000), #endif #ifdef B1500000 DATA("1500000", B1500000), #endif #ifdef B2000000 DATA("2000000", B2000000), #endif #ifdef B2500000 DATA("2500000", B2500000), #endif #ifdef B3000000 DATA("3000000", B3000000), #endif #ifdef B3500000 DATA("3500000", B3500000), #endif #ifdef B4000000 DATA("4000000", B4000000), #endif }; #undef DATA #endif static int tbaudrate(char *rate) { const SPEEDS *sp = 0; size_t n; /* The baudrate number can be preceded by a 'B', which is ignored. */ if (*rate == 'B') ++rate; for (n = 0; n < SIZEOF(speeds); ++n) { if (n > 0 && (speeds[n].speed <= speeds[n - 1].speed)) { /* if the speeds are not increasing, likely a numeric overflow */ break; } if (!CaselessCmp(rate, speeds[n].string)) { sp = speeds + n; break; } } if (sp == 0) err("unknown baud rate %s", rate); return (sp->speed); } /* * Syntax for -m: * [port-type][test baudrate]:terminal-type * The baud rate tests are: >, <, @, =, ! */ static void add_mapping(const char *port, char *arg) { MAP *mapp; char *copy, *p; const char *termp; char *base = 0; copy = strdup(arg); mapp = typeMalloc(MAP, 1); if (copy == 0 || mapp == 0) failed("malloc"); assert(copy != 0); assert(mapp != 0); mapp->next = 0; if (maplist == 0) cur = maplist = mapp; else { cur->next = mapp; cur = mapp; } mapp->porttype = arg; mapp->conditional = 0; arg = strpbrk(arg, "><@=!:"); if (arg == 0) { /* [?]term */ mapp->type = mapp->porttype; mapp->porttype = 0; goto done; } if (arg == mapp->porttype) /* [><@=! baud]:term */ termp = mapp->porttype = 0; else termp = base = arg; for (;; ++arg) { /* Optional conditionals. */ switch (*arg) { case '<': if (mapp->conditional & GT) goto badmopt; mapp->conditional |= LT; break; case '>': if (mapp->conditional & LT) goto badmopt; mapp->conditional |= GT; break; case '@': case '=': /* Not documented. */ mapp->conditional |= EQ; break; case '!': mapp->conditional |= NOT; break; default: goto next; } } next: if (*arg == ':') { if (mapp->conditional) goto badmopt; ++arg; } else { /* Optional baudrate. */ arg = strchr(p = arg, ':'); if (arg == 0) goto badmopt; *arg++ = '\0'; mapp->speed = tbaudrate(p); } mapp->type = arg; /* Terminate porttype, if specified. */ if (termp != 0) *base = '\0'; /* If a NOT conditional, reverse the test. */ if (mapp->conditional & NOT) mapp->conditional = ~mapp->conditional & (EQ | GT | LT); /* If user specified a port with an option flag, set it. */ done: if (port) { if (mapp->porttype) { badmopt: err("illegal -m option format: %s", copy); } mapp->porttype = port; } free(copy); #ifdef MAPDEBUG (void) printf("port: %s\n", mapp->porttype ? mapp->porttype : "ANY"); (void) printf("type: %s\n", mapp->type); (void) printf("conditional: "); p = ""; if (mapp->conditional & GT) { (void) printf("GT"); p = "/"; } if (mapp->conditional & EQ) { (void) printf("%sEQ", p); p = "/"; } if (mapp->conditional & LT) (void) printf("%sLT", p); (void) printf("\nspeed: %d\n", mapp->speed); #endif } /* * Return the type of terminal to use for a port of type 'type', as specified * by the first applicable mapping in 'map'. If no mappings apply, return * 'type'. */ static const char * mapped(const char *type) { MAP *mapp; int match; for (mapp = maplist; mapp; mapp = mapp->next) if (mapp->porttype == 0 || !strcmp(mapp->porttype, type)) { switch (mapp->conditional) { case 0: /* No test specified. */ match = TRUE; break; case EQ: match = ((int) ospeed == mapp->speed); break; case GE: match = ((int) ospeed >= mapp->speed); break; case GT: match = ((int) ospeed > mapp->speed); break; case LE: match = ((int) ospeed <= mapp->speed); break; case LT: match = ((int) ospeed < mapp->speed); break; default: match = FALSE; } if (match) return (mapp->type); } /* No match found; return given type. */ return (type); } /************************************************************************** * * Entry fetching * **************************************************************************/ /* * Figure out what kind of terminal we're dealing with, and then read in * its termcap entry. */ static const char * get_termcap_entry(int fd, char *userarg) { int errret; char *p; const char *ttype; #if HAVE_PATH_TTYS #if HAVE_GETTTYNAM struct ttyent *t; #else FILE *fp; #endif char *ttypath; #endif /* HAVE_PATH_TTYS */ (void) fd; if (userarg) { ttype = userarg; goto found; } /* Try the environment. */ if ((ttype = getenv("TERM")) != 0) goto map; #if HAVE_PATH_TTYS if ((ttypath = ttyname(fd)) != 0) { p = _nc_basename(ttypath); #if HAVE_GETTTYNAM /* * We have the 4.3BSD library call getttynam(3); that means * there's an /etc/ttys to look up device-to-type mappings in. * Try ttyname(3); check for dialup or other mapping. */ if ((t = getttynam(p))) { ttype = t->ty_type; goto map; } #else if ((fp = fopen("/etc/ttytype", "r")) != 0 || (fp = fopen("/etc/ttys", "r")) != 0) { char buffer[BUFSIZ]; char *s, *t, *d; while (fgets(buffer, sizeof(buffer) - 1, fp) != 0) { for (s = buffer, t = d = 0; *s; s++) { if (isspace(UChar(*s))) *s = '\0'; else if (t == 0) t = s; else if (d == 0 && s != buffer && s[-1] == '\0') d = s; } if (t != 0 && d != 0 && !strcmp(d, p)) { ttype = strdup(t); fclose(fp); goto map; } } fclose(fp); } #endif /* HAVE_GETTTYNAM */ } #endif /* HAVE_PATH_TTYS */ /* If still undefined, use "unknown". */ ttype = "unknown"; map:ttype = mapped(ttype); /* * If not a path, remove TERMCAP from the environment so we get a * real entry from /etc/termcap. This prevents us from being fooled * by out of date stuff in the environment. */ found: if ((p = getenv("TERMCAP")) != 0 && !_nc_is_abs_path(p)) { /* 'unsetenv("TERMCAP")' is not portable. * The 'environ' array is better. */ int n; for (n = 0; environ[n] != 0; n++) { if (!strncmp("TERMCAP=", environ[n], (size_t) 8)) { while ((environ[n] = environ[n + 1]) != 0) { n++; } break; } } } /* * ttype now contains a pointer to the type of the terminal. * If the first character is '?', ask the user. */ if (ttype[0] == '?') { if (ttype[1] != '\0') ttype = askuser(ttype + 1); else ttype = askuser(0); } /* Find the terminfo entry. If it doesn't exist, ask the user. */ while (setupterm((NCURSES_CONST char *) ttype, fd, &errret) != OK) { if (errret == 0) { (void) fprintf(stderr, "%s: unknown terminal type %s\n", _nc_progname, ttype); ttype = 0; } else { (void) fprintf(stderr, "%s: can't initialize terminal type %s (error %d)\n", _nc_progname, ttype, errret); ttype = 0; } ttype = askuser(ttype); } #if BROKEN_LINKER tgetflag("am"); /* force lib_termcap.o to be linked for 'ospeed' */ #endif return (ttype); } /************************************************************************** * * Main sequence * **************************************************************************/ /* * Convert the obsolete argument forms into something that getopt can handle. * This means that -e, -i and -k get default arguments supplied for them. */ static void obsolete(char **argv) { for (; *argv; ++argv) { char *parm = argv[0]; if (parm[0] == '-' && parm[1] == '\0') { argv[0] = strdup("-q"); continue; } if ((parm[0] != '-') || (argv[1] && argv[1][0] != '-') || (parm[1] != 'e' && parm[1] != 'i' && parm[1] != 'k') || (parm[2] != '\0')) continue; switch (argv[0][1]) { case 'e': argv[0] = strdup("-e^H"); break; case 'i': argv[0] = strdup("-i^C"); break; case 'k': argv[0] = strdup("-k^U"); break; } } } static void print_shell_commands(const char *ttype) { const char *p; int len; char *var; char *leaf; /* * Figure out what shell we're using. A hack, we look for an * environmental variable SHELL ending in "csh". */ if ((var = getenv("SHELL")) != 0 && ((len = (int) strlen(leaf = _nc_basename(var))) >= 3) && !strcmp(leaf + len - 3, "csh")) p = "set noglob;\nsetenv TERM %s;\nunset noglob;\n"; else p = "TERM=%s;\n"; (void) printf(p, ttype); } static void usage(void) { #define SKIP(s) /* nothing */ #define KEEP(s) s "\n" static const char msg[] = { KEEP("") KEEP("Options:") SKIP(" -a arpanet (obsolete)") KEEP(" -c set control characters") SKIP(" -d dialup (obsolete)") KEEP(" -e ch erase character") KEEP(" -I no initialization strings") KEEP(" -i ch interrupt character") KEEP(" -k ch kill character") KEEP(" -m mapping map identifier to type") SKIP(" -p plugboard (obsolete)") KEEP(" -Q do not output control key settings") KEEP(" -q display term only, do no changes") KEEP(" -r display term on stderr") SKIP(" -S (obsolete)") KEEP(" -s output TERM set command") KEEP(" -V print curses-version") KEEP(" -w set window-size") KEEP("") KEEP("If neither -c/-w are given, both are assumed.") }; #undef KEEP #undef SKIP (void) fprintf(stderr, "Usage: %s [options] [terminal]\n", _nc_progname); fputs(msg, stderr); ExitProgram(EXIT_FAILURE); /* NOTREACHED */ } static char arg_to_char(void) { return (char) ((optarg[0] == '^' && optarg[1] != '\0') ? ((optarg[1] == '?') ? '\177' : CTRL(optarg[1])) : optarg[0]); } int main(int argc, char **argv) { int ch, noinit, noset, quiet, Sflag, sflag, showterm; const char *ttype; int terasechar = -1; /* new erase character */ int intrchar = -1; /* new interrupt character */ int tkillchar = -1; /* new kill character */ int my_fd; bool opt_c = FALSE; /* set control-chars */ bool opt_w = FALSE; /* set window-size */ TTY mode, oldmode; _nc_progname = _nc_rootname(*argv); obsolete(argv); noinit = noset = quiet = Sflag = sflag = showterm = 0; while ((ch = getopt(argc, argv, "a:cd:e:Ii:k:m:p:qQrSsVw")) != -1) { switch (ch) { case 'c': /* set control-chars */ opt_c = TRUE; break; case 'a': /* OBSOLETE: map identifier to type */ add_mapping("arpanet", optarg); break; case 'd': /* OBSOLETE: map identifier to type */ add_mapping("dialup", optarg); break; case 'e': /* erase character */ terasechar = arg_to_char(); break; case 'I': /* no initialization strings */ noinit = 1; break; case 'i': /* interrupt character */ intrchar = arg_to_char(); break; case 'k': /* kill character */ tkillchar = arg_to_char(); break; case 'm': /* map identifier to type */ add_mapping(0, optarg); break; case 'p': /* OBSOLETE: map identifier to type */ add_mapping("plugboard", optarg); break; case 'Q': /* don't output control key settings */ quiet = 1; break; case 'q': /* display term only */ noset = 1; break; case 'r': /* display term on stderr */ showterm = 1; break; case 'S': /* OBSOLETE: output TERM & TERMCAP */ Sflag = 1; break; case 's': /* output TERM set command */ sflag = 1; break; case 'V': /* print curses-version */ puts(curses_version()); ExitProgram(EXIT_SUCCESS); case 'w': /* set window-size */ opt_w = TRUE; break; case '?': default: usage(); } } argc -= optind; argv += optind; if (argc > 1) usage(); if (!opt_c && !opt_w) opt_c = opt_w = TRUE; my_fd = save_tty_settings(&mode, TRUE); oldmode = mode; #ifdef TERMIOS ospeed = (NCURSES_OSPEED) cfgetospeed(&mode); #elif defined(EXP_WIN32_DRIVER) ospeed = 0; #else ospeed = (NCURSES_OSPEED) mode.sg_ospeed; #endif if (same_program(_nc_progname, PROG_RESET)) { reset_start(stderr, TRUE, FALSE); reset_tty_settings(my_fd, &mode, noset); } else { reset_start(stderr, FALSE, TRUE); } ttype = get_termcap_entry(my_fd, *argv); if (!noset) { #if HAVE_SIZECHANGE if (opt_w) { set_window_size(my_fd, &lines, &columns); } #endif if (opt_c) { set_control_chars(&mode, terasechar, intrchar, tkillchar); set_conversions(&mode); if (!noinit) { if (send_init_strings(my_fd, &oldmode)) { (void) putc('\r', stderr); (void) fflush(stderr); (void) napms(1000); /* Settle the terminal. */ } } update_tty_settings(&oldmode, &mode); } } if (noset) { (void) printf("%s\n", ttype); } else { if (showterm) (void) fprintf(stderr, "Terminal type is %s.\n", ttype); /* * If erase, kill and interrupt characters could have been * modified and not -Q, display the changes. */ if (!quiet) { print_tty_chars(&oldmode, &mode); } } if (Sflag) err("The -S option is not supported under terminfo."); if (sflag) { print_shell_commands(ttype); } ExitProgram(EXIT_SUCCESS); } ncurses-6.4-20240113/progs/capconvert0000755000000000000000000002136714264623353015702 0ustar rootroot#!/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 ncurses-6.4-20240113/progs/dump_entry.c0000644000000000000000000012641014434462126016133 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ #define __INTERNAL_CAPS_VISIBLE #include #include #include /* this C file is generated */ #include /* so is this */ MODULE_ID("$Id: dump_entry.c,v 1.196 2023/05/27 20:13:10 tom Exp $") #define DISCARD(string) string = ABSENT_STRING #define PRINTF (void) printf #define WRAPPED 32 #define OkIndex(index,array) ((int)(index) >= 0 && (int)(index) < (int) SIZEOF(array)) #define TcOutput() (outform == F_TERMCAP || outform == F_TCONVERR) typedef struct { char *text; size_t used; size_t size; } DYNBUF; static int tversion; /* terminfo version */ static int outform; /* output format to use */ static int sortmode; /* sort mode to use */ static int width = 60; /* max line width for listings */ static int height = 65535; /* max number of lines for listings */ static int column; /* current column, limited by 'width' */ static int oldcol; /* last value of column before wrap */ static bool pretty; /* true if we format if-then-else strings */ static bool wrapped; /* true if we wrap too-long strings */ static bool did_wrap; /* true if last wrap_concat did wrapping */ static bool checking; /* true if we are checking for tic */ static int quickdump; /* true if we are dumping compiled data */ static char *save_sgr; static DYNBUF outbuf; static DYNBUF tmpbuf; /* indirection pointers for implementing sort and display modes */ static const PredIdx *bool_indirect, *num_indirect, *str_indirect; static NCURSES_CONST char *const *bool_names; static NCURSES_CONST char *const *num_names; static NCURSES_CONST char *const *str_names; static const char *separator = "", *trailer = ""; static int indent = 8; /* cover various ports and variants of terminfo */ #define V_ALLCAPS 0 /* all capabilities (SVr4, XSI, ncurses) */ #define V_SVR1 1 /* SVR1, Ultrix */ #define V_HPUX 2 /* HP-UX */ #define V_AIX 3 /* AIX */ #define V_BSD 4 /* BSD */ #if NCURSES_XNAMES #define OBSOLETE(n) (!_nc_user_definable && (n[0] == 'O' && n[1] == 'T')) #else #define OBSOLETE(n) (n[0] == 'O' && n[1] == 'T') #endif #define isObsolete(f,n) ((f == F_TERMINFO || f == F_VARIABLE) && (sortmode != S_VARIABLE) && OBSOLETE(n)) #if NCURSES_XNAMES #define BoolIndirect(j) ((j >= BOOLCOUNT) ? (j) : ((sortmode == S_NOSORT) ? j : bool_indirect[j])) #define NumIndirect(j) ((j >= NUMCOUNT) ? (j) : ((sortmode == S_NOSORT) ? j : num_indirect[j])) #define StrIndirect(j) ((j >= STRCOUNT) ? (j) : ((sortmode == S_NOSORT) ? j : str_indirect[j])) #else #define BoolIndirect(j) ((sortmode == S_NOSORT) ? (j) : bool_indirect[j]) #define NumIndirect(j) ((sortmode == S_NOSORT) ? (j) : num_indirect[j]) #define StrIndirect(j) ((sortmode == S_NOSORT) ? (j) : str_indirect[j]) #endif static GCC_NORETURN void failed(const char *s) { perror(s); ExitProgram(EXIT_FAILURE); } static void strncpy_DYN(DYNBUF * dst, const char *src, size_t need) { size_t want = need + dst->used + 1; if (want > dst->size) { dst->size += (want + 1024); /* be generous */ dst->text = typeRealloc(char, dst->size, dst->text); if (dst->text == 0) failed("strncpy_DYN"); } _nc_STRNCPY(dst->text + dst->used, src, need + 1); dst->used += need; dst->text[dst->used] = 0; } static void strcpy_DYN(DYNBUF * dst, const char *src) { if (src == 0) { dst->used = 0; strcpy_DYN(dst, ""); } else { strncpy_DYN(dst, src, strlen(src)); } } #if NO_LEAKS static void free_DYN(DYNBUF * p) { if (p->text != 0) free(p->text); p->text = 0; p->size = 0; p->used = 0; } void _nc_leaks_dump_entry(void) { free_DYN(&outbuf); free_DYN(&tmpbuf); } #endif #define NameTrans(check,result) \ if ((np->nte_index <= OK_ ## check) \ && check[np->nte_index]) \ return (result[np->nte_index]) NCURSES_CONST char * nametrans(const char *name) /* translate a capability name to termcap from terminfo */ { const struct name_table_entry *np; if ((np = _nc_find_entry(name, _nc_get_hash_table(0))) != 0) { switch (np->nte_type) { case BOOLEAN: NameTrans(bool_from_termcap, boolcodes); break; case NUMBER: NameTrans(num_from_termcap, numcodes); break; case STRING: NameTrans(str_from_termcap, strcodes); break; } } return (0); } void dump_init(const char *version, int mode, int sort, bool wrap_strings, int twidth, int theight, unsigned traceval, bool formatted, bool check, int quick) /* set up for entry display */ { width = twidth; height = theight; pretty = formatted; wrapped = wrap_strings; checking = check; quickdump = (quick & 3); did_wrap = (width <= 0); /* versions */ if (version == 0) tversion = V_ALLCAPS; else if (!strcmp(version, "SVr1") || !strcmp(version, "SVR1") || !strcmp(version, "Ultrix")) tversion = V_SVR1; else if (!strcmp(version, "HP")) tversion = V_HPUX; else if (!strcmp(version, "AIX")) tversion = V_AIX; else if (!strcmp(version, "BSD")) tversion = V_BSD; else tversion = V_ALLCAPS; /* implement display modes */ switch (outform = mode) { case F_LITERAL: case F_TERMINFO: bool_names = boolnames; num_names = numnames; str_names = strnames; separator = (twidth > 0 && theight > 1) ? ", " : ","; trailer = "\n\t"; break; case F_VARIABLE: bool_names = boolfnames; num_names = numfnames; str_names = strfnames; separator = (twidth > 0 && theight > 1) ? ", " : ","; trailer = "\n\t"; break; case F_TERMCAP: case F_TCONVERR: bool_names = boolcodes; num_names = numcodes; str_names = strcodes; separator = ":"; trailer = "\\\n\t:"; break; } indent = 8; /* implement sort modes */ switch (sortmode = sort) { case S_NOSORT: if (traceval) (void) fprintf(stderr, "%s: sorting by term structure order\n", _nc_progname); break; case S_TERMINFO: if (traceval) (void) fprintf(stderr, "%s: sorting by terminfo name order\n", _nc_progname); bool_indirect = bool_terminfo_sort; num_indirect = num_terminfo_sort; str_indirect = str_terminfo_sort; break; case S_VARIABLE: if (traceval) (void) fprintf(stderr, "%s: sorting by C variable order\n", _nc_progname); bool_indirect = bool_variable_sort; num_indirect = num_variable_sort; str_indirect = str_variable_sort; break; case S_TERMCAP: if (traceval) (void) fprintf(stderr, "%s: sorting by termcap name order\n", _nc_progname); bool_indirect = bool_termcap_sort; num_indirect = num_termcap_sort; str_indirect = str_termcap_sort; break; } if (traceval) (void) fprintf(stderr, "%s: width = %d, tversion = %d, outform = %d\n", _nc_progname, width, tversion, outform); } static TERMTYPE2 *cur_type; static int dump_predicate(PredType type, PredIdx idx) /* predicate function to use for ordinary decompilation */ { switch (type) { case BOOLEAN: return (cur_type->Booleans[idx] == FALSE) ? FAIL : cur_type->Booleans[idx]; case NUMBER: return (cur_type->Numbers[idx] == ABSENT_NUMERIC) ? FAIL : cur_type->Numbers[idx]; case STRING: return (cur_type->Strings[idx] != ABSENT_STRING) ? (int) TRUE : FAIL; } return (FALSE); /* pacify compiler */ } static void set_obsolete_termcaps(TERMTYPE2 *tp); /* is this the index of a function key string? */ #define FNKEY(i) \ (((i) >= STR_IDX(key_f0) && \ (i) <= STR_IDX(key_f9)) || \ ((i) >= STR_IDX(key_f11) && \ (i) <= STR_IDX(key_f63))) /* * If we configure with a different Caps file, the offsets into the arrays * will change. So we use an address expression. */ #define BOOL_IDX(name) (PredType) (&(name) - &(CUR Booleans[0])) #define NUM_IDX(name) (PredType) (&(name) - &(CUR Numbers[0])) #define STR_IDX(name) (PredType) (&(name) - &(CUR Strings[0])) static bool version_filter(PredType type, PredIdx idx) /* filter out capabilities we may want to suppress */ { switch (tversion) { case V_ALLCAPS: /* SVr4, XSI Curses */ return (TRUE); case V_SVR1: /* System V Release 1, Ultrix */ switch (type) { case BOOLEAN: return ((idx <= BOOL_IDX(xon_xoff)) ? TRUE : FALSE); case NUMBER: return ((idx <= NUM_IDX(width_status_line)) ? TRUE : FALSE); case STRING: return ((idx <= STR_IDX(prtr_non)) ? TRUE : FALSE); } break; case V_HPUX: /* Hewlett-Packard */ switch (type) { case BOOLEAN: return ((idx <= BOOL_IDX(xon_xoff)) ? TRUE : FALSE); case NUMBER: return ((idx <= NUM_IDX(label_width)) ? TRUE : FALSE); case STRING: if (idx <= STR_IDX(prtr_non)) return (TRUE); else if (FNKEY(idx)) /* function keys */ return (TRUE); else if (idx == STR_IDX(plab_norm) || idx == STR_IDX(label_on) || idx == STR_IDX(label_off)) return (TRUE); else return (FALSE); } break; case V_AIX: /* AIX */ switch (type) { case BOOLEAN: return ((idx <= BOOL_IDX(xon_xoff)) ? TRUE : FALSE); case NUMBER: return ((idx <= NUM_IDX(width_status_line)) ? TRUE : FALSE); case STRING: if (idx <= STR_IDX(prtr_non)) return (TRUE); else if (FNKEY(idx)) /* function keys */ return (TRUE); else return (FALSE); } break; #define is_termcap(type) (OkIndex(idx, type##_from_termcap) && \ type##_from_termcap[idx]) case V_BSD: /* BSD */ switch (type) { case BOOLEAN: return is_termcap(bool); case NUMBER: return is_termcap(num); case STRING: return is_termcap(str); } break; } return (FALSE); /* pacify the compiler */ } static void trim_trailing(void) { while (outbuf.used > 0 && outbuf.text[outbuf.used - 1] == ' ') outbuf.text[--outbuf.used] = '\0'; } static void force_wrap(void) { oldcol = column; trim_trailing(); strcpy_DYN(&outbuf, trailer); column = indent; } static int op_length(const char *src, int offset) { int result = 0; if (offset > 0 && src[offset - 1] == '\\') { result = 0; } else { int ch; result++; /* for '%' mark */ ch = src[offset + result]; if (TcOutput()) { if (ch == '>') { result += 3; } else if (ch == '+') { result += 2; } else { result++; } } else if (ch == '\'') { result += 3; } else if (ch == L_CURL[0]) { int n = result; while ((ch = src[offset + n]) != '\0') { if (ch == R_CURL[0]) { result = ++n; break; } n++; } } else if (strchr("pPg", ch) != 0) { result += 2; } else { result++; /* ordinary operator */ } } return result; } /* * When wrapping too-long strings, avoid splitting a backslash sequence, or * a terminfo '%' operator. That will leave things a little ragged, but avoids * a stray backslash at the end of the line, as well as making the result a * little more readable. */ static int find_split(const char *src, int step, int size) { int result = size; if (size > 0) { /* check if that would split a backslash-sequence */ int mark = size; int n; for (n = size - 1; n > 0; --n) { int ch = UChar(src[step + n]); if (ch == '\\') { if (n > 0 && src[step + n - 1] == ch) --n; mark = n; break; } else if (!isalnum(ch)) { break; } } if (mark < size) { result = mark; } else { /* check if that would split a backslash-sequence */ for (n = size - 1; n > 0; --n) { int ch = UChar(src[step + n]); if (ch == '%') { int need = op_length(src, step + n); if ((n + need) > size) { mark = n; } break; } } if (mark < size) { result = mark; } } } return result; } /* * If we are going to wrap lines, we cannot leave literal spaces because that * would be ambiguous if we split on that space. */ static char * fill_spaces(const char *src) { const char *fill = "\\s"; size_t need = strlen(src); size_t size = strlen(fill); char *result = 0; int pass; size_t s, d; for (pass = 0; pass < 2; ++pass) { for (s = d = 0; src[s] != '\0'; ++s) { if (src[s] == ' ') { if (pass) { _nc_STRCPY(&result[d], fill, need + 1 - d); d += size; } else { need += size; } } else { if (pass) { result[d++] = src[s]; } else { ++d; } } } if (pass) { result[d] = '\0'; } else { result = calloc(need + 1, sizeof(char)); if (result == 0) failed("fill_spaces"); } } return result; } typedef enum { wOFF = 0 ,w1ST = 1 ,w2ND = 2 ,wEND = 4 ,wERR = 8 } WRAPMODE; #define wrap_1ST(mode) ((mode)&w1ST) #define wrap_END(mode) ((mode)&wEND) #define wrap_ERR(mode) ((mode)&wERR) static void wrap_concat(const char *src, int need, unsigned mode) { int gaps = (int) strlen(separator); int want = gaps + need; did_wrap = (width <= 0); if (wrap_1ST(mode) && column > indent && column + want > width) { force_wrap(); } if ((wrap_END(mode) && !wrap_ERR(mode)) && wrapped && (width >= 0) && (column + want) > width) { int step = 0; int used = width > WRAPPED ? width : WRAPPED; int base = 0; char *p, align[9]; const char *my_t = trailer; char *fill = fill_spaces(src); int last = (int) strlen(fill); need = last; if (TcOutput()) trailer = "\\\n\t "; if (!TcOutput() && (p = strchr(fill, '=')) != 0) { base = (int) (p + 1 - fill); if (base > 8) base = 8; _nc_SPRINTF(align, _nc_SLIMIT(align) "%*s", base, " "); } else if (column > 8) { base = column - 8; if (base > 8) base = 8; _nc_SPRINTF(align, _nc_SLIMIT(align) "%*s", base, " "); } else { align[base] = '\0'; } /* "pretty" overrides wrapping if it already split the line */ if (!pretty || strchr(fill, '\n') == 0) { int tag = 0; if (TcOutput() && outbuf.used && !wrap_1ST(mode)) { tag = 3; } while ((column + (need + gaps)) > used) { int size = used - tag; if (step) { strcpy_DYN(&outbuf, align); size -= base; } if (size > (last - step)) { size = (last - step); } size = find_split(fill, step, size); strncpy_DYN(&outbuf, fill + step, (size_t) size); step += size; need -= size; if (need > 0) { force_wrap(); did_wrap = TRUE; tag = 0; } } } if (need > 0) { if (step) strcpy_DYN(&outbuf, align); strcpy_DYN(&outbuf, fill + step); } if (wrap_END(mode)) strcpy_DYN(&outbuf, separator); trailer = my_t; force_wrap(); free(fill); } else { strcpy_DYN(&outbuf, src); if (wrap_END(mode)) strcpy_DYN(&outbuf, separator); column += (int) strlen(src); } } static void wrap_concat1(const char *src) { int need = (int) strlen(src); wrap_concat(src, need, w1ST | wEND); } static void wrap_concat3(const char *name, const char *eqls, const char *value) { int nlen = (int) strlen(name); int elen = (int) strlen(eqls); int vlen = (int) strlen(value); wrap_concat(name, nlen + elen + vlen, w1ST); wrap_concat(eqls, elen + vlen, w2ND); wrap_concat(value, vlen, wEND); } #define IGNORE_SEP_TRAIL(first,last,sep_trail) \ if ((size_t)(last - first) > sizeof(sep_trail)-1 \ && !strncmp(first, sep_trail, sizeof(sep_trail)-1)) \ first += sizeof(sep_trail)-2 /* Returns the nominal length of the buffer assuming it is termcap format, * i.e., the continuation sequence is treated as a single character ":". * * There are several implementations of termcap which read the text into a * fixed-size buffer. Generally they strip the newlines from the text, but may * not do it until after the buffer is read. Also, "tc=" resolution may be * expanded in the same buffer. This function is useful for measuring the size * of the best fixed-buffer implementation; the worst case may be much worse. */ #ifdef TEST_TERMCAP_LENGTH static int termcap_length(const char *src) { static const char pattern[] = ":\\\n\t:"; int len = 0; const char *const t = src + strlen(src); while (*src != '\0') { IGNORE_SEP_TRAIL(src, t, pattern); src++; len++; } return len; } #else #define termcap_length(src) strlen(src) #endif static void indent_DYN(DYNBUF * buffer, int level) { int n; for (n = 0; n < level; n++) strncpy_DYN(buffer, "\t", (size_t) 1); } /* * Check if the current line which was begun consists only of a tab and the * given leading text. */ static bool leading_DYN(DYNBUF * buffer, const char *leading) { bool result = FALSE; size_t need = strlen(leading); if (buffer->used > need) { need = buffer->used - need; if (!strcmp(buffer->text + need, leading)) { result = TRUE; while (--need != 0) { if (buffer->text[need] == '\n') { break; } if (buffer->text[need] != '\t') { result = FALSE; break; } } } } return result; } bool has_params(const char *src, bool formatting) { bool result = FALSE; int len = (int) strlen(src); int n; bool ifthen = FALSE; bool params = FALSE; for (n = 0; n < len - 1; ++n) { if (!strncmp(src + n, "%p", (size_t) 2)) { params = TRUE; } else if (!strncmp(src + n, "%;", (size_t) 2)) { ifthen = TRUE; result = params; break; } } if (!ifthen) { if (formatting) { result = ((len > 50) && params); } else { result = params; } } return result; } static char * fmt_complex(TERMTYPE2 *tterm, const char *capability, char *src, int level) { bool percent = FALSE; bool params = has_params(src, TRUE); while (*src != '\0') { switch (*src) { case '^': percent = FALSE; strncpy_DYN(&tmpbuf, src++, (size_t) 1); break; case '\\': percent = FALSE; strncpy_DYN(&tmpbuf, src++, (size_t) 1); break; case '%': percent = TRUE; break; case '?': /* "if" */ case 't': /* "then" */ case 'e': /* "else" */ if (percent) { percent = FALSE; tmpbuf.text[tmpbuf.used - 1] = '\n'; /* treat a "%e" as else-if, on the same level */ if (*src == 'e') { indent_DYN(&tmpbuf, level); strncpy_DYN(&tmpbuf, "%", (size_t) 1); strncpy_DYN(&tmpbuf, src, (size_t) 1); src++; params = has_params(src, TRUE); if (!params && *src != '\0' && *src != '%') { strncpy_DYN(&tmpbuf, "\n", (size_t) 1); indent_DYN(&tmpbuf, level + 1); } } else { indent_DYN(&tmpbuf, level + 1); strncpy_DYN(&tmpbuf, "%", (size_t) 1); strncpy_DYN(&tmpbuf, src, (size_t) 1); if (*src++ == '?') { src = fmt_complex(tterm, capability, src, level + 1); if (*src != '\0' && *src != '%') { strncpy_DYN(&tmpbuf, "\n", (size_t) 1); indent_DYN(&tmpbuf, level + 1); } } else if (level == 1) { if (checking) _nc_warning("%s: %%%c without %%? in %s", _nc_first_name(tterm->term_names), *src, capability); } } continue; } break; case ';': /* "endif" */ if (percent) { percent = FALSE; if (level > 1) { tmpbuf.text[tmpbuf.used - 1] = '\n'; indent_DYN(&tmpbuf, level); strncpy_DYN(&tmpbuf, "%", (size_t) 1); strncpy_DYN(&tmpbuf, src++, (size_t) 1); if (src[0] == '%' && src[1] != '\0' && (strchr("?e;", src[1])) == 0) { tmpbuf.text[tmpbuf.used++] = '\n'; indent_DYN(&tmpbuf, level); } return src; } if (checking) _nc_warning("%s: %%; without %%? in %s", _nc_first_name(tterm->term_names), capability); } break; case 'p': if (percent && params && !leading_DYN(&tmpbuf, "%")) { tmpbuf.text[tmpbuf.used - 1] = '\n'; indent_DYN(&tmpbuf, level + 1); strncpy_DYN(&tmpbuf, "%", (size_t) 1); } percent = FALSE; break; case ' ': strncpy_DYN(&tmpbuf, "\\s", (size_t) 2); ++src; continue; default: percent = FALSE; break; } strncpy_DYN(&tmpbuf, src++, (size_t) 1); } return src; } /* * Make "large" numbers a little easier to read by showing them in hexadecimal * if they are "close" to a power of two. */ static const char * number_format(int value) { const char *result = "%d"; if ((outform != F_TERMCAP) && (value > 255)) { unsigned long lv = (unsigned long) value; int bits = sizeof(unsigned long) * 8; int nn; for (nn = 8; nn < bits; ++nn) { unsigned long mm; mm = 1UL << nn; if ((mm - 16) <= lv && (mm + 16) > lv) { result = "%#x"; break; } } } return result; } #define SAME_CAP(n,cap) (&tterm->Strings[n] == &cap) #define EXTRA_CAP 20 int fmt_entry(TERMTYPE2 *tterm, PredFunc pred, int content_only, int suppress_untranslatable, int infodump, int numbers) { PredIdx i, j; char buffer[MAX_TERMINFO_LENGTH + EXTRA_CAP]; NCURSES_CONST char *name; int predval, len; PredIdx num_bools = 0; PredIdx num_values = 0; PredIdx num_strings = 0; bool outcount = 0; #define WRAP_CONCAT1(s) wrap_concat1(s); outcount = TRUE #define WRAP_CONCAT WRAP_CONCAT1(buffer) len = 12; /* terminfo file-header */ if (pred == 0) { cur_type = tterm; pred = dump_predicate; } strcpy_DYN(&outbuf, 0); if (content_only) { column = indent; /* workaround to prevent empty lines */ } else { strcpy_DYN(&outbuf, tterm->term_names); /* * Colon is legal in terminfo descriptions, but not in termcap. */ if (!infodump) { char *p = outbuf.text; while (*p) { if (*p == ':') { *p = '='; } ++p; } } strcpy_DYN(&outbuf, separator); column = (int) outbuf.used; if (height > 1) force_wrap(); } for_each_boolean(j, tterm) { i = BoolIndirect(j); name = ExtBoolname(tterm, (int) i, bool_names); assert(strlen(name) < sizeof(buffer) - EXTRA_CAP); if (!version_filter(BOOLEAN, i)) continue; else if (isObsolete(outform, name)) continue; predval = pred(BOOLEAN, i); if (predval != FAIL) { _nc_STRCPY(buffer, name, sizeof(buffer)); if (predval <= 0) _nc_STRCAT(buffer, "@", sizeof(buffer)); else if (i + 1 > num_bools) num_bools = i + 1; WRAP_CONCAT; } } if (column != indent && height > 1) force_wrap(); for_each_number(j, tterm) { i = NumIndirect(j); name = ExtNumname(tterm, (int) i, num_names); assert(strlen(name) < sizeof(buffer) - EXTRA_CAP); if (!version_filter(NUMBER, i)) continue; else if (isObsolete(outform, name)) continue; predval = pred(NUMBER, i); if (predval != FAIL) { if (tterm->Numbers[i] < 0) { _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%s@", name); } else { size_t nn; _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%s#", name); nn = strlen(buffer); _nc_SPRINTF(buffer + nn, _nc_SLIMIT(sizeof(buffer) - nn) number_format(tterm->Numbers[i]), tterm->Numbers[i]); if (i + 1 > num_values) num_values = i + 1; } WRAP_CONCAT; } } if (column != indent && height > 1) force_wrap(); len += (int) (num_bools + num_values * 2 + strlen(tterm->term_names) + 1); if (len & 1) len++; #undef CUR #define CUR tterm-> if (outform == F_TERMCAP) { if (VALID_STRING(termcap_reset)) { if (VALID_STRING(init_3string) && !strcmp(init_3string, termcap_reset)) DISCARD(init_3string); if (VALID_STRING(reset_2string) && !strcmp(reset_2string, termcap_reset)) DISCARD(reset_2string); } } for_each_string(j, tterm) { char *capability; i = StrIndirect(j); name = ExtStrname(tterm, (int) i, str_names); assert(strlen(name) < sizeof(buffer) - EXTRA_CAP); capability = tterm->Strings[i]; if (!version_filter(STRING, i)) continue; else if (isObsolete(outform, name)) continue; #if NCURSES_XNAMES /* * Extended names can be longer than 2 characters, but termcap programs * cannot read those (filter them out). */ if (outform == F_TERMCAP && (strlen(name) > 2)) continue; #endif if (outform == F_TERMCAP) { /* * Some older versions of vi want rmir/smir to be defined * for ich/ich1 to work. If they're not defined, force * them to be output as defined and empty. */ if (PRESENT(insert_character) || PRESENT(parm_ich)) { if (SAME_CAP(i, enter_insert_mode) && enter_insert_mode == ABSENT_STRING) { _nc_STRCPY(buffer, "im=", sizeof(buffer)); WRAP_CONCAT; continue; } if (SAME_CAP(i, exit_insert_mode) && exit_insert_mode == ABSENT_STRING) { _nc_STRCPY(buffer, "ei=", sizeof(buffer)); WRAP_CONCAT; continue; } } /* * termcap applications such as screen will be confused if sgr0 * is translated to a string containing rmacs. Filter that out. */ if (PRESENT(exit_attribute_mode)) { if (SAME_CAP(i, exit_attribute_mode)) { char *trimmed_sgr0; char *my_sgr = set_attributes; set_attributes = save_sgr; trimmed_sgr0 = _nc_trim_sgr0(tterm); if (strcmp(capability, trimmed_sgr0)) { capability = trimmed_sgr0; } else { if (trimmed_sgr0 != exit_attribute_mode) free(trimmed_sgr0); } set_attributes = my_sgr; } } } predval = pred(STRING, i); buffer[0] = '\0'; if (predval != FAIL) { if (VALID_STRING(capability) && i + 1 > num_strings) num_strings = i + 1; if (!VALID_STRING(capability)) { _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%s@", name); WRAP_CONCAT; } else if (TcOutput()) { char *srccap = _nc_tic_expand(capability, TRUE, numbers); int params = ((i < (int) SIZEOF(parametrized)) ? parametrized[i] : ((*srccap == 'k') ? 0 : has_params(srccap, FALSE))); char *cv = _nc_infotocap(name, srccap, params); if (cv == 0) { if (outform == F_TCONVERR) { _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%s=!!! %s WILL NOT CONVERT !!!", name, srccap); WRAP_CONCAT; } else if (suppress_untranslatable) { continue; } else { char *s = srccap, *d = buffer; int need = 3 + (int) strlen(name); while ((*d = *s++) != 0) { if ((d - buffer + 2) >= (int) sizeof(buffer)) { fprintf(stderr, "%s: value for %s is too long\n", _nc_progname, name); *d = '\0'; break; } if (*d == ':') { *d++ = '\\'; *d = ':'; } else if (*d == '\\') { if ((*++d = *s++) == '\0') break; } d++; *d = '\0'; } need += (int) (d - buffer); wrap_concat("..", need, w1ST | wERR); need -= 2; wrap_concat(name, need, wOFF | wERR); need -= (int) strlen(name); wrap_concat("=", need, w2ND | wERR); need -= 1; wrap_concat(buffer, need, wEND | wERR); outcount = TRUE; } } else { wrap_concat3(name, "=", cv); } len += (int) strlen(capability) + 1; } else { char *src = _nc_tic_expand(capability, outform == F_TERMINFO, numbers); strcpy_DYN(&tmpbuf, 0); strcpy_DYN(&tmpbuf, name); strcpy_DYN(&tmpbuf, "="); if (pretty && (outform == F_TERMINFO || outform == F_VARIABLE)) { fmt_complex(tterm, name, src, 1); } else { strcpy_DYN(&tmpbuf, src); } len += (int) strlen(capability) + 1; WRAP_CONCAT1(tmpbuf.text); } } /* e.g., trimmed_sgr0 */ if (VALID_STRING(capability) && capability != tterm->Strings[i]) free(capability); } len += (int) (num_strings * 2); /* * This piece of code should be an effective inverse of the functions * postprocess_terminfo() and postprocess_terminfo() in parse_entry.c. * Much more work should be done on this to support dumping termcaps. */ if (tversion == V_HPUX) { if (VALID_STRING(memory_lock)) { _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "meml=%s", memory_lock); WRAP_CONCAT; } if (VALID_STRING(memory_unlock)) { _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "memu=%s", memory_unlock); WRAP_CONCAT; } } else if (tversion == V_AIX) { if (VALID_STRING(acs_chars)) { bool box_ok = TRUE; const char *acstrans = "lqkxjmwuvtn"; const char *cp; char *tp, *sp, boxchars[11]; tp = boxchars; for (cp = acstrans; *cp; cp++) { sp = (strchr) (acs_chars, *cp); if (sp) *tp++ = sp[1]; else { box_ok = FALSE; break; } } tp[0] = '\0'; if (box_ok) { char *tmp = _nc_tic_expand(boxchars, (outform == F_TERMINFO), numbers); _nc_STRCPY(buffer, "box1=", sizeof(buffer)); while (*tmp != '\0') { size_t have = strlen(buffer); size_t next = strlen(tmp); size_t want = have + next + 1; size_t last = next; char save = '\0'; /* * If the expanded string is too long for the buffer, * chop it off and save the location where we chopped it. */ if (want >= sizeof(buffer)) { save = tmp[last]; tmp[last] = '\0'; } _nc_STRCAT(buffer, tmp, sizeof(buffer)); /* * If we chopped the buffer, replace the missing piece and * shift everything to append the remainder. */ if (save != '\0') { next = 0; tmp[last] = save; while ((tmp[next] = tmp[last + next]) != '\0') { ++next; } } else { break; } } WRAP_CONCAT; } } } /* * kludge: trim off trailer to avoid an extra blank line * in infocmp -u output when there are no string differences */ if (outcount) { bool trimmed = FALSE; j = (PredIdx) outbuf.used; if (wrapped && did_wrap) { /* EMPTY */ ; } else if (j >= 2 && outbuf.text[j - 1] == '\t' && outbuf.text[j - 2] == '\n') { outbuf.used -= 2; trimmed = TRUE; } else if (j >= 4 && outbuf.text[j - 1] == ':' && outbuf.text[j - 2] == '\t' && outbuf.text[j - 3] == '\n' && outbuf.text[j - 4] == '\\') { outbuf.used -= 4; trimmed = TRUE; } if (trimmed) { outbuf.text[outbuf.used] = '\0'; column = oldcol; strcpy_DYN(&outbuf, " "); } } #if 0 fprintf(stderr, "num_bools = %d\n", num_bools); fprintf(stderr, "num_values = %d\n", num_values); fprintf(stderr, "num_strings = %d\n", num_strings); fprintf(stderr, "term_names=%s, len=%d, strlen(outbuf)=%d, outbuf=%s\n", tterm->term_names, len, outbuf.used, outbuf.text); #endif /* * Here's where we use infodump to trigger a more stringent length check * for termcap-translation purposes. * Return the length of the raw entry, without tc= expansions, * It gives an idea of which entries are deadly to even *scan past*, * as opposed to *use*. */ return (infodump ? len : (int) termcap_length(outbuf.text)); } static bool kill_string(TERMTYPE2 *tterm, 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, char *name) { PredIdx n; for (n = 0; n < NUM_STRINGS(tterm); ++n) { if (version_filter(STRING, n) && !strcmp(name, strnames[n])) { char *cap = tterm->Strings[n]; if (VALID_STRING(cap)) { return cap; } break; } } return ABSENT_STRING; } /* * This is used to remove function-key labels from a termcap entry to * make it smaller. */ static int kill_labels(TERMTYPE2 *tterm, int target) { int n; int result = 0; char name[20]; for (n = 0; n <= 10; ++n) { char *cap; _nc_SPRINTF(name, _nc_SLIMIT(sizeof(name)) "lf%d", n); cap = find_string(tterm, name); if (VALID_STRING(cap) && kill_string(tterm, cap)) { target -= (int) (strlen(cap) + 5); ++result; if (target < 0) break; } } return result; } /* * This is used to remove function-key definitions from a termcap entry to * make it smaller. */ static int kill_fkeys(TERMTYPE2 *tterm, int target) { int n; int result = 0; char name[20]; for (n = 60; n >= 0; --n) { char *cap; _nc_SPRINTF(name, _nc_SLIMIT(sizeof(name)) "kf%d", n); cap = find_string(tterm, name); if (VALID_STRING(cap) && kill_string(tterm, cap)) { target -= (int) (strlen(cap) + 5); ++result; if (target < 0) break; } } return result; } /* * Check if the given acsc string is a 1-1 mapping, i.e., just-like-vt100. * Also, since this is for termcap, we only care about the line-drawing map. */ #define isLine(c) (strchr("lmkjtuvwqxn", c) != 0) static bool one_one_mapping(const char *mapping) { bool result = TRUE; if (VALID_STRING(mapping)) { int n = 0; while (mapping[n] != '\0' && mapping[n + 1] != '\0') { if (isLine(mapping[n]) && mapping[n] != mapping[n + 1]) { result = FALSE; break; } n += 2; } } return result; } #define FMT_ENTRY() \ fmt_entry(tterm, pred, \ 0, \ suppress_untranslatable, \ infodump, numbers) #define SHOW_WHY PRINTF static bool purged_acs(TERMTYPE2 *tterm) { bool result = FALSE; if (VALID_STRING(acs_chars)) { if (!one_one_mapping(acs_chars)) { enter_alt_charset_mode = ABSENT_STRING; exit_alt_charset_mode = ABSENT_STRING; SHOW_WHY("# (rmacs/smacs removed for consistency)\n"); } result = TRUE; } return result; } static void encode_b64(char *target, char *source, unsigned state, int *saved) { /* RFC-4648 */ static const char data[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789" "-_"; int ch = UChar(source[state]); switch (state % 3) { case 0: *target++ = data[(ch >> 2) & 077]; *saved = (ch << 4); break; case 1: *target++ = data[((ch >> 4) | *saved) & 077]; *saved = (ch << 2); break; case 2: *target++ = data[((ch >> 6) | *saved) & 077]; *target++ = data[ch & 077]; *saved = 0; break; } *target = '\0'; } /* * Dump a single entry. */ void dump_entry(TERMTYPE2 *tterm, int suppress_untranslatable, int limited, int numbers, PredFunc pred) { TERMTYPE2 save_tterm; int critlen; const char *legend; bool infodump; if (quickdump) { char bigbuf[65536]; unsigned offset = 0; separator = ""; trailer = "\n"; indent = 0; if (_nc_write_object(tterm, bigbuf, &offset, sizeof(bigbuf)) == OK) { char numbuf[80]; unsigned n; if (quickdump & 1) { if (outbuf.used) wrap_concat1("\n"); wrap_concat1("hex:"); for (n = 0; n < offset; ++n) { _nc_SPRINTF(numbuf, _nc_SLIMIT(sizeof(numbuf)) "%02X", UChar(bigbuf[n])); wrap_concat1(numbuf); } } if (quickdump & 2) { static char padding[] = {0, 0}; int value = 0; if (outbuf.used) wrap_concat1("\n"); wrap_concat1("b64:"); for (n = 0; n < offset; ++n) { encode_b64(numbuf, bigbuf, n, &value); wrap_concat1(numbuf); } switch (n % 3) { case 0: break; case 1: encode_b64(numbuf, padding, 1, &value); wrap_concat1(numbuf); wrap_concat1("=="); break; case 2: encode_b64(numbuf, padding, 1, &value); wrap_concat1(numbuf); wrap_concat1("="); break; } } } return; } if (TcOutput()) { critlen = MAX_TERMCAP_LENGTH; legend = "older termcap"; infodump = FALSE; set_obsolete_termcaps(tterm); } else { critlen = MAX_TERMINFO_LENGTH; legend = "terminfo"; infodump = TRUE; } save_sgr = set_attributes; if ((FMT_ENTRY() > critlen) && 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; } } } ncurses-6.4-20240113/progs/transform.c0000644000000000000000000000641113615656212015757 0ustar rootroot/**************************************************************************** * 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); } ncurses-6.4-20240113/progs/tty_settings.c0000644000000000000000000000773214130154774016512 0ustar rootroot/**************************************************************************** * 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); } } ncurses-6.4-20240113/progs/clear.sh0000755000000000000000000000427613615656212015234 0ustar rootroot#!/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 ncurses-6.4-20240113/progs/infocmp.c0000644000000000000000000014231514537357023015405 0ustar rootroot/**************************************************************************** * Copyright 2020-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 * ****************************************************************************/ /* * 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.163 2023/12/16 17:27:47 tom Exp $") #define MAX_STRING 1024 /* maximum formatted string */ const char *_nc_progname = "infocmp"; typedef char path[PATH_MAX]; /*************************************************************************** * * The following control variables, together with the contents of the * terminfo entries, completely determine the actions of the program. * ***************************************************************************/ static ENTRY *entries; /* terminfo entries */ static int termcount; /* count of terminal entries */ static bool limited = TRUE; /* "-r" option is not set */ static bool quiet = FALSE; static bool literal = FALSE; static const char *bool_sep = ":"; static const char *s_absent = "NULL"; static const char *s_cancel = "NULL"; static const char *tversion; /* terminfo version selected */ static unsigned itrace; /* trace flag for debugging */ static int mwidth = 60; static int mheight = 65535; static int numbers = 0; /* format "%'char'" to/from "%{number}" */ static int outform = F_TERMINFO; /* output format */ static int sortmode; /* sort_mode */ /* main comparison mode */ static int compare; #define C_DEFAULT 0 /* don't force comparison mode */ #define C_DIFFERENCE 1 /* list differences between two terminals */ #define C_COMMON 2 /* list common capabilities */ #define C_NAND 3 /* list capabilities in neither terminal */ #define C_USEALL 4 /* generate relative use-form entry */ static bool ignorepads; /* ignore pad prefixes when diffing */ #if NO_LEAKS typedef struct { ENTRY *head; ENTRY *tail; } ENTERED; static ENTERED *entered; #undef ExitProgram static GCC_NORETURN void ExitProgram(int code); /* prototype is to get gcc to accept the noreturn attribute */ static void ExitProgram(int code) { int n; for (n = 0; n < termcount; ++n) { ENTRY *new_head = _nc_head; ENTRY *new_tail = _nc_tail; _nc_head = entered[n].head; _nc_tail = entered[n].tail; _nc_free_entries(entered[n].head); _nc_head = new_head; _nc_tail = new_tail; } _nc_leaks_dump_entry(); free(entries); free(entered); _nc_free_tic(code); } #endif static void failed(const char *s) { perror(s); ExitProgram(EXIT_FAILURE); } static void canonical_name(char *source, char *target) /* extract the terminal type's primary name */ { int limit = NAMESIZE; while (--limit > 0) { char ch = *source++; if (ch == '|') break; *target++ = ch; } *target = '\0'; } static bool no_boolean(int value) { bool result = (value == ABSENT_BOOLEAN); if (!strcmp(s_absent, s_cancel)) result = !VALID_BOOLEAN(value); return result; } static bool no_numeric(int value) { bool result = (value == ABSENT_NUMERIC); if (!strcmp(s_absent, s_cancel)) result = !VALID_NUMERIC(value); return result; } static bool no_string(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: { int is_set = FALSE; /* * This assumes that multiple use entries are supposed * to contribute the logical or of their boolean capabilities. * This is true if we take the semantics of multiple uses to * be 'each capability gets the first non-default value found * in the sequence of use entries'. * * Note that cancelled or absent booleans are stored as FALSE, * unlike numbers and strings, whose cancelled/absent state is * recorded in the terminfo database. */ if (idx < NUM_BOOLEANS(&(entries[0].tterm))) { 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: { int value = ABSENT_NUMERIC; /* * We take the semantics of multiple uses to be 'each * capability gets the first non-default value found * in the sequence of use entries'. */ if (idx < NUM_NUMBERS(&(entries[0].tterm))) { 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: { char *termstr = entries[0].tterm.Strings[idx]; 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(ENTRY * e1, ENTRY * e2) /* are the use references in two entries equivalent? */ { unsigned i, j; if (e1->nuses != e2->nuses) return (FALSE); /* Ugh...this is quadratic again */ for (i = 0; i < e1->nuses; i++) { bool foundmatch = FALSE; /* search second entry for given use reference */ for (j = 0; j < e2->nuses; j++) if (!strcmp(e1->uses[i].name, e2->uses[j].name)) { foundmatch = TRUE; break; } if (!foundmatch) return (FALSE); } return (TRUE); } static bool entryeq(TERMTYPE2 *t1, TERMTYPE2 *t2) /* are two entries equivalent? */ { unsigned i; for (i = 0; i < NUM_BOOLEANS(t1); i++) if (t1->Booleans[i] != t2->Booleans[i]) return (FALSE); for (i = 0; i < NUM_NUMBERS(t1); i++) if (t1->Numbers[i] != t2->Numbers[i]) return (FALSE); for (i = 0; i < NUM_STRINGS(t1); i++) if (capcmp((PredIdx) i, t1->Strings[i], t2->Strings[i])) return (FALSE); return (TRUE); } #define TIC_EXPAND(result) _nc_tic_expand(result, outform==F_TERMINFO, numbers) static void print_uses(ENTRY * ep, FILE *fp) /* print an entry's use references */ { if (!ep->nuses) { fputs("NULL", fp); } else { unsigned i; for (i = 0; i < ep->nuses; i++) { fputs(ep->uses[i].name, fp); if (i < ep->nuses - 1) fputs(" ", fp); } } } static const char * dump_boolean(int val) /* display the value of a boolean capability */ { switch (val) { case ABSENT_BOOLEAN: return (s_absent); case CANCELLED_BOOLEAN: return (s_cancel); case FALSE: return ("F"); case TRUE: return ("T"); default: return ("?"); } } static void dump_numeric(int val, char *buf) /* display the value of a numeric capability */ { switch (val) { case ABSENT_NUMERIC: _nc_STRCPY(buf, s_absent, MAX_STRING); break; case CANCELLED_NUMERIC: _nc_STRCPY(buf, s_cancel, MAX_STRING); break; default: _nc_SPRINTF(buf, _nc_SLIMIT(MAX_STRING) "%d", val); break; } } static void dump_string(char *val, char *buf) /* display the value of a string capability */ { if (val == ABSENT_STRING) _nc_STRCPY(buf, s_absent, MAX_STRING); else if (val == CANCELLED_STRING) _nc_STRCPY(buf, s_cancel, MAX_STRING); else { _nc_SPRINTF(buf, _nc_SLIMIT(MAX_STRING) "'%.*s'", MAX_STRING - 3, TIC_EXPAND(val)); } } /* * Show "comparing..." message for the given terminal names. */ static void show_comparing(char **names) { if (itrace) { switch (compare) { case C_DIFFERENCE: (void) fprintf(stderr, "%s: dumping differences\n", _nc_progname); break; case C_COMMON: (void) fprintf(stderr, "%s: dumping common capabilities\n", _nc_progname); break; case C_NAND: (void) fprintf(stderr, "%s: dumping differences\n", _nc_progname); break; } } if (*names) { printf("comparing %s", *names++); if (*names) { printf(" to %s", *names++); while (*names) { printf(", %s", *names++); } } printf(".\n"); } } /* * ncurses stores two types of non-standard capabilities: * a) capabilities listed past the "STOP-HERE" comment in the Caps file. * These are used in the terminfo source file to provide data for termcaps, * e.g., when there is no equivalent capability in terminfo, as well as for * widely-used non-standard capabilities. * b) user-definable capabilities, via "tic -x". * * However, if "-x" is omitted from the tic command, both types of * non-standard capability are not loaded into the terminfo database. This * macro is used for limit-checks against the symbols that tic uses to omit * the two types of non-standard entry. */ #if NCURSES_XNAMES #define check_user_definable(n,limit) if (!_nc_user_definable && (n) > (limit)) break #else #define check_user_definable(n,limit) if ((n) > (limit)) break #endif /* * Use these macros to simplify loops on C_COMMON and C_NAND: */ #define for_each_entry() while (entries[extra].tterm.term_names) #define next_entry (&(entries[extra++].tterm)) static void compare_predicate(PredType type, PredIdx idx, const char *name) /* predicate function to use for entry difference reports */ { ENTRY *e1 = &entries[0]; ENTRY *e2 = &entries[1]; char buf1[MAX_STRING]; char buf2[MAX_STRING]; int b1, b2; int n1, n2; char *s1, *s2; bool found; int extra = 1; switch (type) { case CMP_BOOLEAN: check_user_definable(idx, BOOLWRITE); b1 = e1->tterm.Booleans[idx]; switch (compare) { case C_DIFFERENCE: b2 = next_entry->Booleans[idx]; if (!(no_boolean(b1) && no_boolean(b2)) && (b1 != b2)) (void) printf("\t%s: %s%s%s.\n", name, dump_boolean(b1), bool_sep, dump_boolean(b2)); break; case C_COMMON: if (b1 != ABSENT_BOOLEAN) { found = TRUE; for_each_entry() { b2 = next_entry->Booleans[idx]; if (b1 != b2) { found = FALSE; break; } } if (found) { (void) printf("\t%s= %s.\n", name, dump_boolean(b1)); } } break; case C_NAND: if (b1 == ABSENT_BOOLEAN) { found = TRUE; for_each_entry() { b2 = next_entry->Booleans[idx]; if (b1 != b2) { found = FALSE; break; } } if (found) { (void) printf("\t!%s.\n", name); } } break; } break; case CMP_NUMBER: check_user_definable(idx, NUMWRITE); n1 = e1->tterm.Numbers[idx]; switch (compare) { case C_DIFFERENCE: n2 = next_entry->Numbers[idx]; if (!(no_numeric(n1) && no_numeric(n2)) && n1 != n2) { dump_numeric(n1, buf1); dump_numeric(n2, buf2); (void) printf("\t%s: %s, %s.\n", name, buf1, buf2); } break; case C_COMMON: if (n1 != ABSENT_NUMERIC) { found = TRUE; for_each_entry() { n2 = next_entry->Numbers[idx]; if (n1 != n2) { found = FALSE; break; } } if (found) { dump_numeric(n1, buf1); (void) printf("\t%s= %s.\n", name, buf1); } } break; case C_NAND: if (n1 == ABSENT_NUMERIC) { found = TRUE; for_each_entry() { n2 = next_entry->Numbers[idx]; if (n1 != n2) { found = FALSE; break; } } if (found) { (void) printf("\t!%s.\n", name); } } break; } break; case CMP_STRING: check_user_definable(idx, STRWRITE); s1 = e1->tterm.Strings[idx]; switch (compare) { case C_DIFFERENCE: s2 = next_entry->Strings[idx]; if (!(no_string(s1) && no_string(s2)) && capcmp(idx, s1, s2)) { dump_string(s1, buf1); dump_string(s2, buf2); if (strcmp(buf1, buf2)) (void) printf("\t%s: %s, %s.\n", name, buf1, buf2); } break; case C_COMMON: if (s1 != ABSENT_STRING) { found = TRUE; for_each_entry() { s2 = next_entry->Strings[idx]; if (capcmp(idx, s1, s2) != 0) { found = FALSE; break; } } if (found) { (void) printf("\t%s= '%s'.\n", name, TIC_EXPAND(s1)); } } break; case C_NAND: if (s1 == ABSENT_STRING) { found = TRUE; for_each_entry() { s2 = next_entry->Strings[idx]; if (s2 != s1) { found = FALSE; break; } } if (found) { (void) printf("\t!%s.\n", name); } } break; } break; case CMP_USE: /* unlike the other modes, this compares *all* use entries */ switch (compare) { case C_DIFFERENCE: if (!useeq(e1, e2)) { (void) fputs("\tuse: ", stdout); print_uses(e1, stdout); fputs(", ", stdout); print_uses(e2, stdout); fputs(".\n", stdout); } break; case C_COMMON: if (e1->nuses) { found = TRUE; for_each_entry() { e2 = &entries[extra++]; if (e2->nuses != e1->nuses || !useeq(e1, e2)) { found = FALSE; break; } } if (found) { (void) fputs("\tuse: ", stdout); print_uses(e1, stdout); fputs(".\n", stdout); } } break; case C_NAND: if (!e1->nuses) { found = TRUE; for_each_entry() { e2 = &entries[extra++]; if (e2->nuses != e1->nuses) { found = FALSE; break; } } if (found) { (void) printf("\t!use.\n"); } } break; } } } /*************************************************************************** * * Init string analysis * ***************************************************************************/ #define DATA(from, to) { { from }, { to } } #define DATAX() DATA("", "") typedef struct { const char from[4]; const char to[12]; } assoc; static const assoc std_caps[] = { /* these are specified by X.364 and iBCS2 */ DATA("\033c", "RIS"), /* full reset */ DATA("\0337", "SC"), /* save cursor */ DATA("\0338", "RC"), /* restore cursor */ DATA("\033[r", "RSR"), /* not an X.364 mnemonic */ DATA("\033[m", "SGR0"), /* not an X.364 mnemonic */ DATA("\033[2J", "ED2"), /* clear page */ /* this group is specified by ISO 2022 */ DATA("\033(0", "ISO DEC G0"), /* enable DEC graphics for G0 */ DATA("\033(A", "ISO UK G0"), /* enable UK chars for G0 */ DATA("\033(B", "ISO US G0"), /* enable US chars for G0 */ DATA("\033)0", "ISO DEC G1"), /* enable DEC graphics for G1 */ DATA("\033)A", "ISO UK G1"), /* enable UK chars for G1 */ DATA("\033)B", "ISO US G1"), /* enable US chars for G1 */ /* these are DEC private controls widely supported by emulators */ DATA("\033=", "DECPAM"), /* application keypad mode */ DATA("\033>", "DECPNM"), /* normal keypad mode */ DATA("\033<", "DECANSI"), /* enter ANSI mode */ DATA("\033[!p", "DECSTR"), /* soft reset */ DATA("\033 F", "S7C1T"), /* 7-bit controls */ DATAX() }; static const assoc std_modes[] = /* ECMA \E[ ... [hl] modes recognized by many emulators */ { DATA("2", "AM"), /* keyboard action mode */ DATA("4", "IRM"), /* insert/replace mode */ DATA("12", "SRM"), /* send/receive mode */ DATA("20", "LNM"), /* linefeed mode */ DATAX() }; static const assoc private_modes[] = /* DEC \E[ ... [hl] modes recognized by many emulators */ { DATA("1", "CKM"), /* application cursor keys */ DATA("2", "ANM"), /* set VT52 mode */ DATA("3", "COLM"), /* 132-column mode */ DATA("4", "SCLM"), /* smooth scroll */ DATA("5", "SCNM"), /* reverse video mode */ DATA("6", "OM"), /* origin mode */ DATA("7", "AWM"), /* wraparound mode */ DATA("8", "ARM"), /* auto-repeat mode */ DATAX() }; static const assoc ecma_highlights[] = /* recognize ECMA attribute sequences */ { DATA("0", "NORMAL"), /* normal */ DATA("1", "+BOLD"), /* bold on */ DATA("2", "+DIM"), /* dim on */ DATA("3", "+ITALIC"), /* italic on */ DATA("4", "+UNDERLINE"), /* underline on */ DATA("5", "+BLINK"), /* blink on */ DATA("6", "+FASTBLINK"), /* fastblink on */ DATA("7", "+REVERSE"), /* reverse on */ DATA("8", "+INVISIBLE"), /* invisible on */ DATA("9", "+DELETED"), /* deleted on */ DATA("10", "MAIN-FONT"), /* select primary font */ DATA("11", "ALT-FONT-1"), /* select alternate font 1 */ DATA("12", "ALT-FONT-2"), /* select alternate font 2 */ DATA("13", "ALT-FONT-3"), /* select alternate font 3 */ DATA("14", "ALT-FONT-4"), /* select alternate font 4 */ DATA("15", "ALT-FONT-5"), /* select alternate font 5 */ DATA("16", "ALT-FONT-6"), /* select alternate font 6 */ DATA("17", "ALT-FONT-7"), /* select alternate font 7 */ DATA("18", "ALT-FONT-1"), /* select alternate font 1 */ DATA("19", "ALT-FONT-1"), /* select alternate font 1 */ DATA("20", "FRAKTUR"), /* Fraktur font */ DATA("21", "DOUBLEUNDER"), /* double underline */ DATA("22", "-DIM"), /* dim off */ DATA("23", "-ITALIC"), /* italic off */ DATA("24", "-UNDERLINE"), /* underline off */ DATA("25", "-BLINK"), /* blink off */ DATA("26", "-FASTBLINK"), /* fastblink off */ DATA("27", "-REVERSE"), /* reverse off */ DATA("28", "-INVISIBLE"), /* invisible off */ DATA("29", "-DELETED"), /* deleted off */ DATAX() }; #undef DATA static int skip_csi(const char *cap) { int result = 0; if (cap[0] == '\033' && cap[1] == '[') result = 2; else if (UChar(cap[0]) == 0233) result = 1; return result; } static bool same_param(const char *table, const char *param, size_t length) { bool result = FALSE; if (strncmp(table, param, length) == 0) { result = !isdigit(UChar(param[length])); } return result; } static char * lookup_params(const assoc * table, char *dst, char *src) { char *result = 0; const char *ep = strtok(src, ";"); if (ep != 0) { const assoc *ap; do { bool found = FALSE; for (ap = table; ap->from[0]; ap++) { size_t tlen = strlen(ap->from); if (same_param(ap->from, ep, tlen)) { _nc_STRCAT(dst, ap->to, MAX_TERMINFO_LENGTH); found = TRUE; break; } } if (!found) _nc_STRCAT(dst, ep, MAX_TERMINFO_LENGTH); _nc_STRCAT(dst, ";", MAX_TERMINFO_LENGTH); } while ((ep = strtok((char *) 0, ";"))); dst[strlen(dst) - 1] = '\0'; result = dst; } return result; } static void analyze_string(const char *name, const char *cap, TERMTYPE2 *tp) { char buf2[MAX_TERMINFO_LENGTH]; const char *sp; const assoc *ap; int tp_lines = tp->Numbers[2]; if (!VALID_STRING(cap)) return; (void) printf("%s: ", name); for (sp = cap; *sp; sp++) { int i; int csi; size_t len = 0; size_t next; const char *expansion = 0; char buf3[MAX_TERMINFO_LENGTH]; /* first, check other capabilities in this entry */ for (i = 0; i < STRCOUNT; i++) { char *cp = tp->Strings[i]; /* don't use function-key capabilities */ if (strnames[i] == NULL) continue; if (strnames[i][0] == 'k' && strnames[i][1] == 'f') continue; if (VALID_STRING(cp) && cp[0] != '\0' && cp != cap) { len = strlen(cp); _nc_STRNCPY(buf2, sp, len); buf2[len] = '\0'; if (_nc_capcmp(cp, buf2)) continue; #define ISRS(s) (!strncmp((s), "is", (size_t) 2) || !strncmp((s), "rs", (size_t) 2)) /* * Theoretically we just passed the test for translation * (equality once the padding is stripped). However, there * are a few more hoops that need to be jumped so that * identical pairs of initialization and reset strings * don't just refer to each other. */ if (ISRS(name) || ISRS(strnames[i])) if (cap < cp) continue; #undef ISRS expansion = strnames[i]; break; } } /* now check the standard capabilities */ if (!expansion) { csi = skip_csi(sp); for (ap = std_caps; ap->from[0]; ap++) { size_t adj = (size_t) (csi ? 2 : 0); len = strlen(ap->from); if (csi && skip_csi(ap->from) != csi) continue; if (len > adj && strncmp(ap->from + adj, sp + csi, len - adj) == 0) { expansion = ap->to; len -= adj; len += (size_t) csi; break; } } } /* now check for standard-mode sequences */ if (!expansion && (csi = skip_csi(sp)) != 0 && (len = (strspn) (sp + csi, "0123456789;")) && (len < sizeof(buf3)) && (next = (size_t) csi + len) && ((sp[next] == 'h') || (sp[next] == 'l'))) { _nc_STRCPY(buf2, ((sp[next] == 'h') ? "ECMA+" : "ECMA-"), sizeof(buf2)); _nc_STRNCPY(buf3, sp + csi, len); buf3[len] = '\0'; expansion = lookup_params(std_modes, buf2, buf3); } /* now check for private-mode sequences */ if (!expansion && (csi = skip_csi(sp)) != 0 && sp[csi] == '?' && (len = (strspn) (sp + csi + 1, "0123456789;")) && (len < sizeof(buf3)) && (next = (size_t) csi + 1 + len) && ((sp[next] == 'h') || (sp[next] == 'l'))) { _nc_STRCPY(buf2, ((sp[next] == 'h') ? "DEC+" : "DEC-"), sizeof(buf2)); _nc_STRNCPY(buf3, sp + csi + 1, len); buf3[len] = '\0'; expansion = lookup_params(private_modes, buf2, buf3); } /* now check for ECMA highlight sequences */ if (!expansion && (csi = skip_csi(sp)) != 0 && (len = (strspn) (sp + csi, "0123456789;")) != 0 && (len < sizeof(buf3)) && (next = (size_t) csi + len) && sp[next] == 'm') { _nc_STRCPY(buf2, "SGR:", sizeof(buf2)); _nc_STRNCPY(buf3, sp + csi, len); buf3[len] = '\0'; len += (size_t) csi + 1; expansion = lookup_params(ecma_highlights, buf2, buf3); } if (!expansion && (csi = skip_csi(sp)) != 0 && sp[csi] == 'm') { len = (size_t) csi + 1; _nc_STRCPY(buf2, "SGR:", sizeof(buf2)); _nc_STRCAT(buf2, ecma_highlights[0].to, sizeof(buf2)); expansion = buf2; } /* now check for scroll region reset */ if (!expansion && (csi = skip_csi(sp)) != 0) { if (sp[csi] == 'r') { expansion = "RSR"; len = 1; } else { _nc_SPRINTF(buf2, _nc_SLIMIT(sizeof(buf2)) "1;%dr", tp_lines); len = strlen(buf2); if (strncmp(buf2, sp + csi, len) == 0) expansion = "RSR"; } len += (size_t) csi; } /* now check for home-down */ if (!expansion && (csi = skip_csi(sp)) != 0) { _nc_SPRINTF(buf2, _nc_SLIMIT(sizeof(buf2)) "%d;1H", tp_lines); len = strlen(buf2); if (strncmp(buf2, sp + csi, len) == 0) { expansion = "LL"; } else { _nc_SPRINTF(buf2, _nc_SLIMIT(sizeof(buf2)) "%dH", tp_lines); len = strlen(buf2); if (strncmp(buf2, sp + csi, len) == 0) { expansion = "LL"; } } len += (size_t) csi; } /* now look at the expansion we got, if any */ if (expansion) { printf("{%s}", expansion); sp += len - 1; } else { /* couldn't match anything */ buf2[0] = *sp; buf2[1] = '\0'; fputs(TIC_EXPAND(buf2), stdout); } } putchar('\n'); } /*************************************************************************** * * File comparison * ***************************************************************************/ static void file_comparison(int argc, char *argv[]) { #define MAXCOMPARE 2 /* someday we may allow comparisons on more files */ int filecount = 0; ENTRY *heads[MAXCOMPARE]; ENTRY *qp, *rp; int i, n; memset(heads, 0, sizeof(heads)); dump_init((char *) 0, F_LITERAL, S_TERMINFO, FALSE, 0, 65535, itrace, FALSE, FALSE, FALSE); for (n = 0; n < argc && n < MAXCOMPARE; n++) { if (freopen(argv[n], "r", stdin) == 0) _nc_err_abort("Can't open %s", argv[n]); #if NO_LEAKS entered[n].head = _nc_head; entered[n].tail = _nc_tail; #endif _nc_head = _nc_tail = 0; /* parse entries out of the source file */ _nc_set_source(argv[n]); _nc_read_entry_source(stdin, NULL, TRUE, literal, NULLHOOK); if (itrace) (void) fprintf(stderr, "Resolving file %d...\n", n - 0); /* maybe do use resolution */ if (!_nc_resolve_uses2(!limited, literal)) { (void) fprintf(stderr, "There are unresolved use entries in %s:\n", argv[n]); for_entry_list(qp) { if (qp->nuses) { (void) fputs(qp->tterm.term_names, stderr); (void) fputc('\n', stderr); } } ExitProgram(EXIT_FAILURE); } heads[filecount] = _nc_head; filecount++; } /* OK, all entries are in core. Ready to do the comparison */ if (itrace) (void) fprintf(stderr, "Entries are now in core...\n"); /* The entry-matching loop. Sigh, this is intrinsically quadratic. */ for (qp = heads[0]; qp; qp = qp->next) { for (rp = heads[1]; rp; rp = rp->next) if (_nc_entry_match(qp->tterm.term_names, rp->tterm.term_names)) { if (qp->ncrosslinks < MAX_CROSSLINKS) qp->crosslinks[qp->ncrosslinks] = rp; qp->ncrosslinks++; if (rp->ncrosslinks < MAX_CROSSLINKS) rp->crosslinks[rp->ncrosslinks] = qp; rp->ncrosslinks++; } } /* now we have two circular lists with crosslinks */ if (itrace) (void) fprintf(stderr, "Name matches are done...\n"); for (qp = heads[0]; qp; qp = qp->next) { if (qp->ncrosslinks > 1) { (void) fprintf(stderr, "%s in file 1 (%s) has %d matches in file 2 (%s):\n", _nc_first_name(qp->tterm.term_names), argv[0], qp->ncrosslinks, argv[1]); for (i = 0; i < qp->ncrosslinks; i++) (void) fprintf(stderr, "\t%s\n", _nc_first_name((qp->crosslinks[i])->tterm.term_names)); } } for (rp = heads[1]; rp; rp = rp->next) { if (rp->ncrosslinks > 1) { (void) fprintf(stderr, "%s in file 2 (%s) has %d matches in file 1 (%s):\n", _nc_first_name(rp->tterm.term_names), argv[1], rp->ncrosslinks, argv[0]); for (i = 0; i < rp->ncrosslinks; i++) (void) fprintf(stderr, "\t%s\n", _nc_first_name((rp->crosslinks[i])->tterm.term_names)); } } (void) printf("In file 1 (%s) only:\n", argv[0]); for (qp = heads[0]; qp; qp = qp->next) if (qp->ncrosslinks == 0) (void) printf("\t%s\n", _nc_first_name(qp->tterm.term_names)); (void) printf("In file 2 (%s) only:\n", argv[1]); for (rp = heads[1]; rp; rp = rp->next) if (rp->ncrosslinks == 0) (void) printf("\t%s\n", _nc_first_name(rp->tterm.term_names)); (void) printf("The following entries are equivalent:\n"); for (qp = heads[0]; qp; qp = qp->next) { if (qp->ncrosslinks == 1) { rp = qp->crosslinks[0]; repair_acsc(&qp->tterm); repair_acsc(&rp->tterm); #if NCURSES_XNAMES _nc_align_termtype(&qp->tterm, &rp->tterm); #endif if (entryeq(&qp->tterm, &rp->tterm) && useeq(qp, rp)) { char name1[NAMESIZE], name2[NAMESIZE]; canonical_name(qp->tterm.term_names, name1); canonical_name(rp->tterm.term_names, name2); (void) printf("%s = %s\n", name1, name2); } } } (void) printf("Differing entries:\n"); termcount = 2; for (qp = heads[0]; qp; qp = qp->next) { if (qp->ncrosslinks == 1) { rp = qp->crosslinks[0]; #if NCURSES_XNAMES /* sorry - we have to do this on each pass */ _nc_align_termtype(&qp->tterm, &rp->tterm); #endif if (!(entryeq(&qp->tterm, &rp->tterm) && useeq(qp, rp))) { char name1[NAMESIZE], name2[NAMESIZE]; char *names[3]; names[0] = name1; names[1] = name2; names[2] = 0; entries[0] = *qp; entries[1] = *rp; canonical_name(qp->tterm.term_names, name1); canonical_name(rp->tterm.term_names, name2); switch (compare) { case C_DIFFERENCE: show_comparing(names); compare_entry(compare_predicate, &entries->tterm, quiet); break; case C_COMMON: show_comparing(names); compare_entry(compare_predicate, &entries->tterm, quiet); break; case C_NAND: show_comparing(names); compare_entry(compare_predicate, &entries->tterm, quiet); break; } } } } } static void usage(void) { #define DATA(s) s "\n" static const char head[] = { DATA("Usage: infocmp [options] [-A directory] [-B directory] [termname...]") DATA("") DATA("Options:") }; #undef DATA /* length is given here so the compiler can make everything readonly */ #define DATA(s) s static const char options[][46] = { " -0 print single-row" ," -1 print single-column" ," -C use termcap-names" ," -D print database locations" ," -E format output as C tables" ," -F compare terminfo-files" ," -G format %{number} to %'char'" ," -I use terminfo-names" ," -K use termcap-names and BSD syntax" ," -L use long names" ," -R subset (see manpage)" ," -T eliminate size limits (test)" ," -U do not post-process entries" ," -V print version" ," -W wrap long strings per -w[n]" #if NCURSES_XNAMES ," -a with -F, list commented-out caps" #endif ," -c list common capabilities" ," -d list different capabilities" ," -e format output for C initializer" ," -f with -1, format complex strings" ," -g format %'char' to %{number}" ," -i analyze initialization/reset" ," -l output terminfo names" ," -n list capabilities in neither" ," -p ignore padding specifiers" ," -Q number dump compiled description" ," -q brief listing, removes headers" ," -r with -C, output in termcap form" ," -r with -F, resolve use-references" ," -s [d|i|l|c] sort fields" #if NCURSES_XNAMES ," -t suppress commented-out capabilities" #endif ," -u produce source with 'use='" ," -v number (verbose)" ," -w number (width)" #if NCURSES_XNAMES ," -x unknown capabilities are user-defined" #endif }; #undef DATA const size_t last = SIZEOF(options); const size_t left = (last + 1) / 2; size_t n; fputs(head, stderr); for (n = 0; n < left; n++) { size_t m = n + left; if (m < last) fprintf(stderr, "%-40.40s%s\n", options[n], options[m]); else fprintf(stderr, "%s\n", options[n]); } ExitProgram(EXIT_FAILURE); } static char * any_initializer(const char *fmt, const char *type) { static char *initializer; static size_t need; char *s; if (initializer == 0) { need = (strlen(entries->tterm.term_names) + strlen(type) + strlen(fmt)); initializer = (char *) malloc(need + 1); if (initializer == 0) failed("any_initializer"); } _nc_STRCPY(initializer, entries->tterm.term_names, need); for (s = initializer; *s != 0 && *s != '|'; s++) { if (!isalnum(UChar(*s))) *s = '_'; } *s = 0; _nc_SPRINTF(s, _nc_SLIMIT(need) fmt, type); return initializer; } static char * name_initializer(const char *type) { return any_initializer("_%s_data", type); } static char * string_variable(const char *type) { return any_initializer("_s_%s", type); } /* dump C initializers for the terminal type */ static void dump_initializers(TERMTYPE2 *term) { unsigned n; const char *str = 0; printf("\nstatic char %s[] = \"%s\";\n\n", name_initializer("alias"), entries->tterm.term_names); for_each_string(n, term) { if (VALID_STRING(term->Strings[n])) { char buf[MAX_STRING], *sp, *tp; tp = buf; #define TP_LIMIT ((MAX_STRING - 5) - (size_t)(tp - buf)) *tp++ = '"'; for (sp = term->Strings[n]; *sp != 0 && TP_LIMIT > 2; sp++) { if (isascii(UChar(*sp)) && isprint(UChar(*sp)) && *sp != '\\' && *sp != '"') *tp++ = *sp; else { _nc_SPRINTF(tp, _nc_SLIMIT(TP_LIMIT) "\\%03o", UChar(*sp)); tp += 4; } } *tp++ = '"'; *tp = '\0'; (void) printf("static char %-20s[] = %s;\n", string_variable(ExtStrname(term, (int) n, strnames)), buf); } } printf("\n"); (void) printf("static char %s[] = %s\n", name_initializer("bool"), L_CURL); for_each_boolean(n, term) { switch ((int) (term->Booleans[n])) { case TRUE: str = "TRUE"; break; case FALSE: str = "FALSE"; break; case ABSENT_BOOLEAN: str = "ABSENT_BOOLEAN"; break; case CANCELLED_BOOLEAN: str = "CANCELLED_BOOLEAN"; break; } (void) printf("\t/* %3u: %-8s */\t%s,\n", n, ExtBoolname(term, (int) n, boolnames), str); } (void) printf("%s;\n", R_CURL); (void) printf("static short %s[] = %s\n", name_initializer("number"), L_CURL); for_each_number(n, term) { char buf[BUFSIZ]; switch (term->Numbers[n]) { case ABSENT_NUMERIC: str = "ABSENT_NUMERIC"; break; case CANCELLED_NUMERIC: str = "CANCELLED_NUMERIC"; break; default: _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "%d", term->Numbers[n]); str = buf; break; } (void) printf("\t/* %3u: %-8s */\t%s,\n", n, ExtNumname(term, (int) n, numnames), str); } (void) printf("%s;\n", R_CURL); (void) printf("static char * %s[] = %s\n", name_initializer("string"), L_CURL); for_each_string(n, term) { if (term->Strings[n] == ABSENT_STRING) str = "ABSENT_STRING"; else if (term->Strings[n] == CANCELLED_STRING) str = "CANCELLED_STRING"; else { str = string_variable(ExtStrname(term, (int) n, strnames)); } (void) printf("\t/* %3u: %-8s */\t%s,\n", n, ExtStrname(term, (int) n, strnames), str); } (void) printf("%s;\n", R_CURL); #if NCURSES_XNAMES if ((NUM_BOOLEANS(term) != BOOLCOUNT) || (NUM_NUMBERS(term) != NUMCOUNT) || (NUM_STRINGS(term) != STRCOUNT)) { (void) printf("static char * %s[] = %s\n", name_initializer("string_ext"), L_CURL); for (n = BOOLCOUNT; n < NUM_BOOLEANS(term); ++n) { (void) printf("\t/* %3u: bool */\t\"%s\",\n", n, ExtBoolname(term, (int) n, boolnames)); } for (n = NUMCOUNT; n < NUM_NUMBERS(term); ++n) { (void) printf("\t/* %3u: num */\t\"%s\",\n", n, ExtNumname(term, (int) n, numnames)); } for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) { (void) printf("\t/* %3u: str */\t\"%s\",\n", n, ExtStrname(term, (int) n, strnames)); } (void) printf("%s;\n", R_CURL); } #endif } /* dump C initializers for the terminal type */ static void dump_termtype(TERMTYPE2 *term) { (void) printf("\t%s\n\t\t%s,\n", L_CURL, name_initializer("alias")); (void) printf("\t\t(char *)0,\t/* pointer to string table */\n"); (void) printf("\t\t%s,\n", name_initializer("bool")); (void) printf("\t\t%s,\n", name_initializer("number")); (void) printf("\t\t%s,\n", name_initializer("string")); #if NCURSES_XNAMES (void) printf("#if NCURSES_XNAMES\n"); (void) printf("\t\t(char *)0,\t/* pointer to extended string table */\n"); (void) printf("\t\t%s,\t/* ...corresponding names */\n", ((NUM_BOOLEANS(term) != BOOLCOUNT) || (NUM_NUMBERS(term) != NUMCOUNT) || (NUM_STRINGS(term) != STRCOUNT)) ? name_initializer("string_ext") : "(char **)0"); (void) printf("\t\t%d,\t\t/* count total Booleans */\n", NUM_BOOLEANS(term)); (void) printf("\t\t%d,\t\t/* count total Numbers */\n", NUM_NUMBERS(term)); (void) printf("\t\t%d,\t\t/* count total Strings */\n", NUM_STRINGS(term)); (void) printf("\t\t%d,\t\t/* count extensions to Booleans */\n", NUM_BOOLEANS(term) - BOOLCOUNT); (void) printf("\t\t%d,\t\t/* count extensions to Numbers */\n", NUM_NUMBERS(term) - NUMCOUNT); (void) printf("\t\t%d,\t\t/* count extensions to Strings */\n", NUM_STRINGS(term) - STRCOUNT); (void) printf("#endif /* NCURSES_XNAMES */\n"); #else (void) term; #endif /* NCURSES_XNAMES */ (void) printf("\t%s\n", R_CURL); } static int optarg_to_number(void) { char *temp = 0; long value = strtol(optarg, &temp, 0); if (temp == 0 || temp == optarg || *temp != 0) { fprintf(stderr, "Expected a number, not \"%s\"\n", optarg); ExitProgram(EXIT_FAILURE); } return (int) value; } static char * terminal_env(void) { char *terminal; if ((terminal = getenv("TERM")) == 0) { (void) fprintf(stderr, "%s: environment variable TERM not set\n", _nc_progname); exit(EXIT_FAILURE); } return terminal; } /* * Show the databases that infocmp knows about. The location to which it writes is */ static void show_databases(void) { DBDIRS state; int offset; const char *path2; _nc_first_db(&state, &offset); while ((path2 = _nc_next_db(&state, &offset)) != 0) { printf("%s\n", path2); } _nc_last_db(); } /*************************************************************************** * * Main sequence * ***************************************************************************/ #if NO_LEAKS #define MAIN_LEAKS() \ _nc_free_termtype2(&entries[0].tterm); \ _nc_free_termtype2(&entries[1].tterm); \ free(myargv); \ free(tfile); \ free(tname) #else #define MAIN_LEAKS() /* nothing */ #endif int main(int argc, char *argv[]) { /* Avoid "local data >32k" error with mwcc */ /* Also avoid overflowing smaller stacks on systems like AmigaOS */ path *tfile = 0; char **tname = 0; size_t maxterms; char **myargv; char *firstdir, *restdir; int c; bool formatted = FALSE; bool filecompare = FALSE; int initdump = 0; bool init_analyze = FALSE; bool suppress_untranslatable = FALSE; int quickdump = 0; bool wrap_strings = FALSE; /* where is the terminfo database location going to default to? */ restdir = firstdir = 0; #if NCURSES_XNAMES use_extended_names(FALSE); #endif _nc_strict_bsd = 0; _nc_progname = _nc_rootname(argv[0]); /* make sure we have enough space to add two terminal entries */ myargv = typeCalloc(char *, (size_t) (argc + 3)); if (myargv == 0) failed("myargv"); memcpy(myargv, argv, (sizeof(char *) * (size_t) argc)); argv = myargv; while ((c = getopt(argc, argv, "01A:aB:CcDdEeFfGgIiKLlnpQ:qR:rs:TtUuVv:Ww:x")) != -1) { switch (c) { case '0': mwidth = 65535; mheight = 1; break; case '1': mwidth = 0; break; case 'A': firstdir = optarg; break; #if NCURSES_XNAMES case 'a': _nc_disable_period = TRUE; use_extended_names(TRUE); break; #endif case 'B': restdir = optarg; break; case 'K': _nc_strict_bsd = 1; /* FALLTHRU */ case 'C': outform = F_TERMCAP; tversion = "BSD"; if (sortmode == S_DEFAULT) sortmode = S_TERMCAP; break; case 'D': show_databases(); ExitProgram(EXIT_SUCCESS); break; case 'c': compare = C_COMMON; break; case 'd': compare = C_DIFFERENCE; break; case 'E': initdump |= 2; break; case 'e': initdump |= 1; break; case 'F': filecompare = TRUE; break; case 'f': formatted = TRUE; break; case 'G': numbers = 1; break; case 'g': numbers = -1; break; case 'I': outform = F_TERMINFO; if (sortmode == S_DEFAULT) sortmode = S_VARIABLE; tversion = 0; break; case 'i': init_analyze = TRUE; break; case 'L': outform = F_VARIABLE; if (sortmode == S_DEFAULT) sortmode = S_VARIABLE; break; case 'l': outform = F_TERMINFO; break; case 'n': compare = C_NAND; break; case 'p': ignorepads = TRUE; break; case 'Q': quickdump = optarg_to_number(); break; case 'q': quiet = TRUE; s_absent = "-"; s_cancel = "@"; bool_sep = ", "; break; case 'R': tversion = optarg; break; case 'r': tversion = 0; break; case 's': if (*optarg == 'd') sortmode = S_NOSORT; else if (*optarg == 'i') sortmode = S_TERMINFO; else if (*optarg == 'l') sortmode = S_VARIABLE; else if (*optarg == 'c') sortmode = S_TERMCAP; else { (void) fprintf(stderr, "%s: unknown sort mode\n", _nc_progname); ExitProgram(EXIT_FAILURE); } break; case 'T': limited = FALSE; break; #if NCURSES_XNAMES case 't': _nc_disable_period = FALSE; suppress_untranslatable = TRUE; break; #endif case 'U': literal = TRUE; break; case 'u': compare = C_USEALL; break; case 'V': puts(curses_version()); ExitProgram(EXIT_SUCCESS); case 'v': itrace = (unsigned) optarg_to_number(); use_verbosity(itrace); break; case 'W': wrap_strings = TRUE; break; case 'w': mwidth = optarg_to_number(); break; #if NCURSES_XNAMES case 'x': use_extended_names(TRUE); break; #endif default: usage(); } } maxterms = (size_t) (argc + 2 - optind); if ((tfile = typeMalloc(path, maxterms)) == 0) failed("tfile"); if ((tname = typeCalloc(char *, maxterms)) == 0) failed("tname"); if ((entries = typeCalloc(ENTRY, maxterms)) == 0) failed("entries"); #if NO_LEAKS if ((entered = typeCalloc(ENTERED, maxterms)) == 0) failed("entered"); #endif if (tfile == 0 || tname == 0 || entries == 0) { fprintf(stderr, "%s: not enough memory\n", _nc_progname); ExitProgram(EXIT_FAILURE); } /* by default, sort by terminfo name */ if (sortmode == S_DEFAULT) sortmode = S_TERMINFO; /* make sure we have at least one terminal name to work with */ if (optind >= argc) argv[argc++] = terminal_env(); /* if user is after a comparison, make sure we have two entries */ if (compare != C_DEFAULT && optind >= argc - 1) argv[argc++] = terminal_env(); /* exactly one terminal name with no options means display it */ /* exactly two terminal names with no options means do -d */ if (compare == C_DEFAULT) { switch (argc - optind) { default: fprintf(stderr, "%s: too many names to compare\n", _nc_progname); ExitProgram(EXIT_FAILURE); case 1: break; case 2: compare = C_DIFFERENCE; break; } } /* set up for display */ dump_init(tversion, outform, sortmode, wrap_strings, mwidth, mheight, itrace, formatted, FALSE, quickdump); if (!filecompare) { /* grab the entries */ termcount = 0; for (; optind < argc; optind++) { const char *directory = termcount ? restdir : firstdir; int status; tname[termcount] = argv[optind]; if (directory) { #if NCURSES_USE_DATABASE #if MIXEDCASE_FILENAMES #define LEAF_FMT "%c" #else #define LEAF_FMT "%02x" #endif _nc_SPRINTF(tfile[termcount], _nc_SLIMIT(sizeof(path)) "%s/" LEAF_FMT "/%s", directory, UChar(*argv[optind]), argv[optind]); if (itrace) (void) fprintf(stderr, "%s: reading entry %s from file %s\n", _nc_progname, argv[optind], tfile[termcount]); status = _nc_read_file_entry(tfile[termcount], &entries[termcount].tterm); #else (void) fprintf(stderr, "%s: terminfo files not supported\n", _nc_progname); MAIN_LEAKS(); ExitProgram(EXIT_FAILURE); #endif } else { if (itrace) (void) fprintf(stderr, "%s: reading entry %s from database\n", _nc_progname, tname[termcount]); status = _nc_read_entry2(tname[termcount], tfile[termcount], &entries[termcount].tterm); } if (status <= 0) { (void) fprintf(stderr, "%s: couldn't open terminfo file %s.\n", _nc_progname, tfile[termcount]); MAIN_LEAKS(); ExitProgram(EXIT_FAILURE); } repair_acsc(&entries[termcount].tterm); termcount++; } #if NCURSES_XNAMES if (termcount > 1) { /* * 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 infocmp from file: %s\n", tfile[0]); dump_entry(&entries[0].tterm, suppress_untranslatable, limited, numbers, NULL); len = show_entry(); if (itrace) (void) fprintf(stderr, "%s: length %d\n", _nc_progname, len); break; case C_DIFFERENCE: show_comparing(tname); compare_entry(compare_predicate, &entries->tterm, quiet); break; case C_COMMON: show_comparing(tname); compare_entry(compare_predicate, &entries->tterm, quiet); break; case C_NAND: show_comparing(tname); compare_entry(compare_predicate, &entries->tterm, quiet); break; case C_USEALL: if (itrace) (void) fprintf(stderr, "%s: dumping use entry\n", _nc_progname); dump_entry(&entries[0].tterm, suppress_untranslatable, limited, numbers, use_predicate); for (i = 1; i < termcount; i++) dump_uses(tname[i], !(outform == F_TERMCAP || outform == F_TCONVERR)); len = show_entry(); if (itrace) (void) fprintf(stderr, "%s: length %d\n", _nc_progname, len); break; } } } else if (compare == C_USEALL) { (void) fprintf(stderr, "Sorry, -u doesn't work with -F\n"); } else if (compare == C_DEFAULT) { (void) fprintf(stderr, "Use `tic -[CI] ' 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 */ ncurses-6.4-20240113/progs/clear_cmd.c0000644000000000000000000000554713615656212015666 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/progs/modules0000644000000000000000000000644014037065177015200 0ustar rootroot# $Id: modules,v 1.25 2021/04/18 17:21:03 tom Exp $ # Program modules (some are in ncurses lib!) ############################################################################## # Copyright 2020,2021 Thomas E. Dickey # # Copyright 1998-2014,2016 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1995-on # @ base clear progs $(srcdir) $(HEADER_DEPS) tty_settings.h tic progs $(srcdir) $(HEADER_DEPS) transform.h $(srcdir)/dump_entry.h $(srcdir)/tparm_type.h toe progs $(srcdir) $(HEADER_DEPS) $(INCDIR)/hashed_db.h clear_cmd progs $(srcdir) $(HEADER_DEPS) clear_cmd.h dump_entry progs $(srcdir) $(HEADER_DEPS) $(srcdir)/dump_entry.h ../include/parametrized.h $(INCDIR)/capdefaults.c termsort.h infocmp progs $(srcdir) $(HEADER_DEPS) $(srcdir)/dump_entry.h reset_cmd progs $(srcdir) $(HEADER_DEPS) reset_cmd.h tty_settings.h tabs progs $(srcdir) $(HEADER_DEPS) tparm_type progs $(srcdir) $(HEADER_DEPS) $(srcdir)/tparm_type.h tput progs $(srcdir) $(HEADER_DEPS) transform.h $(srcdir)/tparm_type.h reset_cmd.h tty_settings.h tset progs $(srcdir) $(HEADER_DEPS) transform.h ../include/termcap.h reset_cmd.h tty_settings.h transform progs $(srcdir) $(HEADER_DEPS) transform.h tty_settings progs $(srcdir) $(HEADER_DEPS) tty_settings.h # vile:makemode ncurses-6.4-20240113/progs/Makefile.in0000644000000000000000000003135714070103035015636 0ustar rootroot# $Id: Makefile.in,v 1.111 2021/07/03 15:45:33 tom Exp $ ############################################################################## # Copyright 2020,2021 Thomas E. Dickey # # Copyright 1998-2016,2018 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # # to deal in the Software without restriction, including without limitation # # the rights to use, copy, modify, merge, publish, distribute, distribute # # with modifications, sublicense, and/or sell copies of the Software, and to # # permit persons to whom the Software is furnished to do so, subject to the # # following conditions: # # # # The above copyright notice and this permission notice shall be included in # # all copies or substantial portions of the Software. # # # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # # THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # # DEALINGS IN THE SOFTWARE. # # # # Except as contained in this notice, the name(s) of the above copyright # # holders shall not be used in advertising or otherwise to promote the sale, # # use or other dealings in this Software without prior written # # authorization. # ############################################################################## # # Author: Thomas E. Dickey 1996-on # # Makefile for ncurses source code. # # This makes the ncurses utility programs. # # The variable 'srcdir' refers to the source-distribution, and can be set with # the configure script by "--srcdir=DIR". # # The rules are organized to produce the libraries for the configured models, # and the programs with the configured default model. # turn off _all_ suffix rules; we'll generate our own .SUFFIXES: SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile TOP_MFLAGS = @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" RPATH_LIST="$(RPATH_LIST)" @SET_MAKE@ x = @EXEEXT@ o = .@OBJEXT@ MODEL = ../@DFT_OBJ_SUBDIR@ DESTDIR = @DESTDIR@ top_srcdir = @top_srcdir@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ datarootdir = @datarootdir@ datadir = @datadir@ includesubdir = @includesubdir@ INCLUDEDIR = $(DESTDIR)$(includedir)$(includesubdir) PACKAGE = @PACKAGE@ LIBTOOL = @LIBTOOL@ LIBTOOL_OPTS = @LIBTOOL_OPTS@ LIBTOOL_CLEAN = @LIB_CLEAN@ LIBTOOL_COMPILE = @LIB_COMPILE@ LIBTOOL_LINK = @LIB_LINK@ LIBTOOL_INSTALL = @LIB_INSTALL@ LIBTOOL_UNINSTALL = @LIB_UNINSTALL@ INSTALL = @INSTALL@ INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ transform = @program_transform_name@ AWK = @AWK@ LN_S = @LN_S@ CTAGS = @CTAGS@ ETAGS = @ETAGS@ CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ INCDIR = $(top_srcdir)/include CPPFLAGS = -DHAVE_CONFIG_H -I../progs @CPPFLAGS@ CCFLAGS = $(CPPFLAGS) $(CFLAGS) CFLAGS_LIBTOOL = $(CCFLAGS) CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) REL_VERSION = @cf_cv_rel_version@ ABI_VERSION = @cf_cv_abi_version@ LOCAL_LIBDIR = @top_builddir@/lib LD = @LD@ LINK = @LINK_PROGS@ $(LIBTOOL_LINK) LDFLAGS = @EXTRA_LDFLAGS@ @LDFLAGS@ RPATH_LIST = @RPATH_LIST@ LDFLAGS_LIBTOOL = $(LDFLAGS) $(CFLAGS_LIBTOOL) LDFLAGS_NORMAL = $(LDFLAGS) $(CFLAGS_NORMAL) LDFLAGS_DEBUG = $(LDFLAGS) $(CFLAGS_DEBUG) LDFLAGS_PROFILE = $(LDFLAGS) $(CFLAGS_PROFILE) LDFLAGS_SHARED = $(LDFLAGS) $(CFLAGS_SHARED) @LD_SHARED_OPTS@ LDFLAGS_DEFAULT = $(LDFLAGS_@DFT_UPR_MODEL@) LIBS_TIC = @TINFO_LDFLAGS@ @LDFLAGS_STATIC@ @TICS_LIBS@ @TINFO_LIBS@ @LDFLAGS_SHARED@ @LD_MODEL@ @LIBS@ LDFLAGS_TIC = @TICS_LDFLAGS@ $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_TIC) LIBS_TINFO = @LDFLAGS_STATIC@ @TINFO_LIBS@ @LDFLAGS_SHARED@ @LD_MODEL@ @LIBS@ LDFLAGS_TINFO = @TINFO_LDFLAGS@ $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_TINFO) LINT = @LINT@ LINT_OPTS = @LINT_OPTS@ LINT_LIBS = -lncurses @LIBS@ AUTO_SRC = \ termsort.h \ transform.h # tic relies on direct access to the terminfo database GET_PROGS = infocmp$x clear$x tabs$x tput$x tset$x toe$x PUT_PROGS = @MAKE_TERMINFO@ tic$x PROGS = $(PUT_PROGS) $(GET_PROGS) # Default library, for linking applications DEPS_CURSES = ../lib/@LIB_PREFIX@ncurses@DFT_DEP_SUFFIX@ HEADER_DEPS = \ ../include/curses.h \ $(INCDIR)/term_entry.h \ $(INCDIR)/tic.h \ $(INCDIR)/nc_alloc.h ################################################################################ @MAKE_PHONY@.PHONY : all @MAKE_PHONY@.PHONY : check @MAKE_PHONY@.PHONY : clean @MAKE_PHONY@.PHONY : distclean @MAKE_PHONY@.PHONY : install @MAKE_PHONY@.PHONY : install.libs @MAKE_PHONY@.PHONY : install.progs @MAKE_PHONY@.PHONY : libs @MAKE_PHONY@.PHONY : lint @MAKE_PHONY@.PHONY : mostlyclean @MAKE_PHONY@.PHONY : realclean @MAKE_PHONY@.PHONY : sources @MAKE_PHONY@.PHONY : uninstall @MAKE_PHONY@.PHONY : uninstall.libs @MAKE_PHONY@.PHONY : uninstall.progs all: $(AUTO_SRC) $(PROGS) sources: $(AUTO_SRC) install: $(AUTO_SRC) install.progs uninstall: uninstall.progs # this line simplifies the configure-script libs \ install.libs \ uninstall.libs: TRANSFORM = sed 's/$x$$//'|sed '$(transform)'|sed 's/$$/$x/' # transformed names for installing files actual_captoinfo = `echo captoinfo$x| $(TRANSFORM)` actual_clear = `echo clear$x| $(TRANSFORM)` actual_infocmp = `echo infocmp$x| $(TRANSFORM)` actual_infotocap = `echo infotocap$x| $(TRANSFORM)` actual_init = `echo init$x| $(TRANSFORM)` actual_reset = `echo reset$x| $(TRANSFORM)` actual_tabs = `echo tabs$x| $(TRANSFORM)` actual_tic = `echo tic$x| $(TRANSFORM)` actual_toe = `echo toe$x| $(TRANSFORM)` actual_tput = `echo tput$x| $(TRANSFORM)` actual_tset = `echo tset$x| $(TRANSFORM)` # transformed names for comparing at runtime define_captoinfo = `echo captoinfo| $(TRANSFORM)` define_clear = `echo clear| $(TRANSFORM)` define_infotocap = `echo infotocap| $(TRANSFORM)` define_init = `echo init| $(TRANSFORM)` define_reset = `echo reset| $(TRANSFORM)` transform.h : echo "#ifndef __TRANSFORM_H" >$@ echo "#define __TRANSFORM_H 1" >>$@ echo "#include " >>$@ echo "extern bool same_program(const char *, const char *);" >>$@ -$(SHELL) -c 'if test -n "$x" ; then echo "#define SUFFIX_IGNORED \"$x\"">>$@; fi' echo "#define PROG_CAPTOINFO \"$(define_captoinfo)\"" >>$@ echo "#define PROG_INFOTOCAP \"$(define_infotocap)\"" >>$@ echo "#define PROG_CLEAR \"$(define_clear)\"" >>$@ echo "#define PROG_RESET \"$(define_reset)\"" >>$@ echo "#define PROG_INIT \"$(define_init)\"" >>$@ echo "#endif /* __TRANSFORM_H */" >>$@ install.progs: $(AUTO_SRC) $(PROGS) $(DESTDIR)$(bindir) @MAKE_TERMINFO@ $(LIBTOOL_INSTALL) $(INSTALL_PROG) tic$x $(DESTDIR)$(bindir)/$(actual_tic) @MAKE_TERMINFO@ $(LIBTOOL_INSTALL) $(INSTALL_PROG) toe$x $(DESTDIR)$(bindir)/$(actual_toe) @MAKE_TERMINFO@ @echo "linking $(actual_infotocap) to $(actual_tic)" @MAKE_TERMINFO@ -@rm -f $(DESTDIR)$(bindir)/$(actual_infotocap) @MAKE_TERMINFO@ ( cd $(DESTDIR)$(bindir) && $(LN_S) $(actual_tic) $(actual_infotocap) ) @MAKE_TERMINFO@ @echo "linking $(actual_captoinfo) to $(actual_tic)" @MAKE_TERMINFO@ -@rm -f $(DESTDIR)$(bindir)/$(actual_captoinfo) @MAKE_TERMINFO@ ( cd $(DESTDIR)$(bindir) && $(LN_S) $(actual_tic) $(actual_captoinfo) ) $(LIBTOOL_INSTALL) $(INSTALL_PROG) infocmp$x $(DESTDIR)$(bindir)/$(actual_infocmp) $(LIBTOOL_INSTALL) $(INSTALL_PROG) clear$x $(DESTDIR)$(bindir)/$(actual_clear) $(LIBTOOL_INSTALL) $(INSTALL_PROG) tabs$x $(DESTDIR)$(bindir)/$(actual_tabs) $(LIBTOOL_INSTALL) $(INSTALL_PROG) tput$x $(DESTDIR)$(bindir)/$(actual_tput) $(LIBTOOL_INSTALL) $(INSTALL_PROG) tset$x $(DESTDIR)$(bindir)/$(actual_tset) @echo "linking $(actual_reset) to $(actual_tset)" -@rm -f $(DESTDIR)$(bindir)/$(actual_reset) ( cd $(DESTDIR)$(bindir) && $(LN_S) $(actual_tset) $(actual_reset) ) uninstall.progs: @MAKE_TERMINFO@ -@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_tic) @MAKE_TERMINFO@ -@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_toe) @MAKE_TERMINFO@ -@rm -f $(DESTDIR)$(bindir)/$(actual_captoinfo) @MAKE_TERMINFO@ -@rm -f $(DESTDIR)$(bindir)/$(actual_infotocap) -@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_infocmp) -@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_clear) -@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_tabs) -@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_tput) -@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_tset) -@rm -f $(DESTDIR)$(bindir)/$(actual_reset) $(DESTDIR)$(bindir) : mkdir -p $@ # # Utilities normally built by make all start here # DEPS_TIC = \ $(MODEL)/tic$o \ $(MODEL)/dump_entry$o \ $(MODEL)/tparm_type$o \ $(MODEL)/transform$o tic$x: $(DEPS_TIC) $(DEPS_CURSES) transform.h @ECHO_LD@ $(LINK) $(DEPS_TIC) $(LDFLAGS_TIC) -o $@ DEPS_TOE = \ $(MODEL)/toe$o toe$x: $(DEPS_TOE) $(DEPS_CURSES) @ECHO_LD@ $(LINK) $(DEPS_TOE) $(LDFLAGS_TIC) -o $@ DEPS_CLEAR = \ $(MODEL)/clear$o \ $(MODEL)/clear_cmd$o \ $(MODEL)/tty_settings$o clear$x: $(DEPS_CLEAR) $(DEPS_CURSES) @ECHO_LD@ $(LINK) $(DEPS_CLEAR) $(LDFLAGS_TINFO) -o $@ DEPS_TABS = \ $(MODEL)/tabs$o \ $(MODEL)/tty_settings$o tabs$x: $(DEPS_TABS) $(DEPS_TABS) @ECHO_LD@ $(LINK) $(DEPS_TABS) $(LDFLAGS_TINFO) -o $@ DEPS_TPUT = \ $(MODEL)/tput$o \ $(MODEL)/clear_cmd$o \ $(MODEL)/reset_cmd$o \ $(MODEL)/tparm_type$o \ $(MODEL)/transform$o \ $(MODEL)/tty_settings$o tput$x: $(DEPS_TPUT) $(DEPS_CURSES) transform.h @ECHO_LD@ $(LINK) $(DEPS_TPUT) $(LDFLAGS_TINFO) -o $@ DEPS_INFOCMP = \ $(MODEL)/infocmp$o \ $(MODEL)/dump_entry$o infocmp$x: $(DEPS_INFOCMP) $(DEPS_CURSES) @ECHO_LD@ $(LINK) $(DEPS_INFOCMP) $(LDFLAGS_TIC) -o $@ DEPS_TSET = \ $(MODEL)/tset$o \ $(MODEL)/reset_cmd$o \ $(MODEL)/transform$o \ $(MODEL)/tty_settings$o tset$x: $(DEPS_TSET) $(DEPS_CURSES) transform.h @ECHO_LD@ $(LINK) $(DEPS_TSET) $(LDFLAGS_TINFO) -o $@ termsort.h: $(srcdir)/MKtermsort.sh $(SHELL) $(srcdir)/MKtermsort.sh $(AWK) $(srcdir)/../include/@TERMINFO_CAPS@ >$@ # # Utility productions start here # tags: $(CTAGS) *.[ch] @MAKE_UPPER_TAGS@TAGS: @MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] mostlyclean :: -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace clean :: mostlyclean -$(SHELL) -c "if test -n '$x' ; then $(MAKE) clean x=''; fi" -rm -f $(AUTO_SRC) -rm -f $(PROGS) -rm -rf .libs *.dSYM distclean :: clean -rm -f Makefile realclean :: distclean # These rules are used to allow "make -n" to work on a clean directory-tree ../include/hashsize.h \ ../include/parametrized.h \ ../include/term.h : ( cd ../include && $(MAKE) $(TOP_MFLAGS) ) $(DEPS_CURSES) : ( cd ../ncurses && $(MAKE) $(TOP_MFLAGS) ) lint: @MAKE_TERMINFO@ $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tic.c $(srcdir)/dump_entry.c $(LINT_LIBS) @MAKE_TERMINFO@ $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/toe.c $(LINT_LIBS) $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/clear.c $(LINT_LIBS) $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/infocmp.c $(srcdir)/dump_entry.c $(LINT_LIBS) $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tabs.c $(LINT_LIBS) $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tput.c $(LINT_LIBS) $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tset.c $(LINT_LIBS) # Verify that each header-file can be compiled without including another. check: @$(SHELL) -c "for header in *.h;\ do \ echo \"** testing \$${header}\" ; \ echo \"#include <\$${header}>\" >headers.c; \ echo \"int main(void) { return 0; }\" >>headers.c; \ $(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \ done" -@rm -f headers.* ############################################################################### # The remainder of this file is automatically generated during configuration ############################################################################### ncurses-6.4-20240113/progs/progs.priv.h0000644000000000000000000001571014311414275016057 0ustar rootroot/**************************************************************************** * Copyright 2019-2021,2022 Thomas E. Dickey * * Copyright 1998-2015,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Thomas E. Dickey 1997-on * ****************************************************************************/ /* * $Id: progs.priv.h,v 1.59 2022/09/17 18:58:05 tom Exp $ * * progs.priv.h * * Header file for curses utility programs */ #ifndef PROGS_PRIV_H #define PROGS_PRIV_H 1 #include #if USE_RCS_IDS #define MODULE_ID(id) static const char Ident[] = id; #else #define MODULE_ID(id) /*nothing */ #endif #include #include #include #include #if HAVE_UNISTD_H #include #endif #if HAVE_LIMITS_H # include #elif HAVE_SYS_PARAM_H # include #endif #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_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #include #include #if DECL_ERRNO extern int errno; #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 */ #undef _NC_WINDOWS #if (defined(_WIN32) || defined(_WIN64)) #define _NC_WINDOWS 1 #endif #define NCURSES_INTERNALS 1 #define NCURSES_OPAQUE 0 #include #if !(defined(NCURSES_WGETCH_EVENTS) && defined(NEED_KEY_EVENT)) #undef KEY_EVENT /* reduce compiler-warnings with Visual C++ */ #endif #include #include #include #include #include #include #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)) #if defined(__GNUC__) && defined(_FORTIFY_SOURCE) #define IGNORE_RC(func) errno = (int) func #else #define IGNORE_RC(func) (void) func #endif /* gcc workarounds */ /* usually in */ #ifndef STDIN_FILENO #define STDIN_FILENO 0 #endif #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif #ifndef STDERR_FILENO #define STDERR_FILENO 2 #endif #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 #endif #ifndef EXIT_FAILURE #define EXIT_FAILURE 1 #endif #ifndef R_OK #define R_OK 4 /* Test for readable. */ #endif #ifndef W_OK #define W_OK 2 /* Test for writable. */ #endif #ifndef X_OK #define X_OK 1 /* Test for executable. */ #endif #ifndef F_OK #define F_OK 0 /* Test for existence. */ #endif /* usually in */ #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif #ifndef STDERR_FILENO #define STDERR_FILENO 2 #endif /* may be in limits.h, included from various places */ #ifndef PATH_MAX # if defined(_POSIX_PATH_MAX) # define PATH_MAX _POSIX_PATH_MAX # elif defined(MAXPATHLEN) # define PATH_MAX MAXPATHLEN # else # define PATH_MAX 255 /* the Posix minimum pathsize */ # endif #endif /* We use isascii only to guard against use of 7-bit ctype tables in the * isprint test in infocmp. */ #if !HAVE_ISASCII # undef isascii # if ('z'-'a' == 25) && ('z' < 127) && ('Z'-'A' == 25) && ('Z' < 127) && ('9' < 127) # define isascii(c) (UChar(c) <= 127) # else # define isascii(c) 1 /* not really ascii anyway */ # endif #endif #define UChar(c) ((unsigned char)(c)) #define SIZEOF(v) (sizeof(v)/sizeof(v[0])) #define VtoTrace(opt) (unsigned) ((opt > 0) ? opt : (opt == 0)) /* * If configured for tracing, the debug- and trace-output are merged together * in the trace file for "upper" levels of the verbose option. */ #ifdef TRACE #define use_verbosity(level) do { \ set_trace_level(level); \ if (_nc_tracing > DEBUG_LEVEL(2)) \ _nc_tracing |= TRACE_MAXIMUM; \ else if (_nc_tracing == DEBUG_LEVEL(2)) \ _nc_tracing |= TRACE_ORDINARY; \ if (level >= 2) \ curses_trace(_nc_tracing); \ } while (0) #else #define use_verbosity(level) do { set_trace_level(level); } while (0) #endif #define NCURSES_EXT_NUMBERS (NCURSES_EXT_COLORS && HAVE_INIT_EXTENDED_COLOR) #if NCURSES_EXT_NUMBERS #else #define _nc_free_termtype2(t) _nc_free_termtype(t) #define _nc_read_entry2(n,f,t) _nc_read_entry(n,f,t) #endif #endif /* PROGS_PRIV_H */ ncurses-6.4-20240113/progs/tparm_type.c0000644000000000000000000001006414414307315016122 0ustar rootroot/**************************************************************************** * 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; } ncurses-6.4-20240113/progs/clear.c0000644000000000000000000000770114025436622015032 0ustar rootroot/**************************************************************************** * Copyright 2020,2021 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * * "Software"), to deal in the Software without restriction, including * * without limitation the rights to use, copy, modify, merge, publish, * * distribute, distribute with modifications, sublicense, and/or sell * * copies of the Software, and to permit persons to whom the Software is * * furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included * * in all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * * Except as contained in this notice, the name(s) of the above copyright * * holders shall not be used in advertising or otherwise to promote the * * sale, use or other dealings in this Software without prior written * * authorization. * ****************************************************************************/ /**************************************************************************** * Author: Zeyd M. Ben-Halim 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.24 2021/03/20 18:23:14 tom Exp $") const char *_nc_progname = "clear"; static GCC_NORETURN void usage(void) { #define KEEP(s) s "\n" static const char msg[] = { KEEP("") KEEP("Options:") KEEP(" -T TERM use this instead of $TERM") KEEP(" -V print curses-version") KEEP(" -x do not try to clear scrollback") }; #undef KEEP (void) fprintf(stderr, "Usage: %s [options]\n", _nc_progname); fputs(msg, stderr); ExitProgram(EXIT_FAILURE); } int main( int argc GCC_UNUSED, char *argv[]GCC_UNUSED) { TTY tty_settings; int fd; int c; char *term; bool opt_x = FALSE; /* clear scrollback if possible */ _nc_progname = _nc_rootname(argv[0]); term = getenv("TERM"); while ((c = getopt(argc, argv, "T:Vx")) != -1) { switch (c) { case 'T': use_env(FALSE); use_tioctl(TRUE); term = optarg; break; case 'V': puts(curses_version()); ExitProgram(EXIT_SUCCESS); case 'x': /* do not try to clear scrollback */ opt_x = TRUE; break; default: usage(); /* NOTREACHED */ } } if (optind < argc) usage(); fd = save_tty_settings(&tty_settings, FALSE); setupterm(term, fd, (int *) 0); ExitProgram((clear_cmd(opt_x) == ERR) ? EXIT_FAILURE : EXIT_SUCCESS); } ncurses-6.4-20240113/progs/tic.c0000644000000000000000000024312014521517357014526 0ustar rootroot/**************************************************************************** * Copyright 2018-2022,2023 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.324 2023/11/04 19:43:43 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, *t; char result[MAX_ENTRY_SIZE]; /* * Look for strings that contain %{number}, convert them to %'char', * which is shorter and runs a little faster. */ for (n = 0; n < STRCOUNT; n++) { s = ep->tterm.Strings[n]; if (VALID_STRING(s) && strchr(s, L_BRACE) != 0) { d = result; t = s; while ((ch = *t++) != 0) { *d++ = (char) ch; if (ch == '\\') { if ((*d++ = *t++) == '\0') break; } else if ((ch == '%') && (*t == L_BRACE)) { char *v = 0; long value = strtol(t + 1, &v, 0); if (v != 0 && *v == R_BRACE && value > 0 && value != '\\' /* FIXME */ && value < 127 && isprint((int) value)) { *d++ = S_QUOTE; *d++ = (char) value; *d++ = S_QUOTE; t = (v + 1); } } } *d = 0; if (strlen(result) < strlen(s)) _nc_STRCPY(s, result, strlen(s) + 1); } } _nc_set_type(_nc_first_name(ep->tterm.term_names)); _nc_curr_line = (int) ep->startline; _nc_write_entry(&ep->tterm); } static bool immedhook(ENTRY * ep GCC_UNUSED) /* write out entries with no use capabilities immediately to save storage */ { #if !HAVE_BIG_CORE /* * This is strictly a core-economy kluge. The really clean way to handle * compilation is to slurp the whole file into core and then do all the * name-collision checks and entry writes in one swell foop. But the * terminfo master file is large enough that some core-poor systems swap * like crazy when you compile it this way...there have been reports of * this process taking *three hours*, rather than the twenty seconds or * less typical on my development box. * * So. This hook *immediately* writes out the referenced entry if it * has no use capabilities. The compiler main loop refrains from * adding the entry to the in-core list when this hook fires. If some * other entry later needs to reference an entry that got written * immediately, that's OK; the resolution code will fetch it off disk * when it can't find it in core. * * Name collisions will still be detected, just not as cleanly. The * write_entry() code complains before overwriting an entry that * postdates the time of tic's first call to write_entry(). Thus * it will complain about overwriting entries newly made during the * tic run, but not about overwriting ones that predate it. * * The reason this is a hook, and not in line with the rest of the * compiler code, is that the support for termcap fallback cannot assume * it has anywhere to spool out these entries! * * The _nc_set_type() call here requires a compensating one in * _nc_parse_entry(). * * If you define HAVE_BIG_CORE, you'll disable this kluge. This will * make tic a bit faster (because the resolution code won't have to do * disk I/O nearly as often). */ if (ep->nuses == 0) { int oldline = _nc_curr_line; write_it(ep); _nc_curr_line = oldline; free(ep->tterm.str_table); return (TRUE); } #endif /* HAVE_BIG_CORE */ return (FALSE); } static void put_translate(int c) /* emit a comment char, translating terminfo names to termcap names */ { static bool in_name = FALSE; static size_t used; if (in_name) { static size_t have; static char *namebuf, *suffix; if (used + 1 >= have) { have += 132; if ((namebuf = typeRealloc(char, have, namebuf)) == NULL) failed("put_translate namebuf"); if ((suffix = typeRealloc(char, have, suffix)) == NULL) failed("put_translate suffix"); } if (c == '\n' || c == '@') { namebuf[used++] = '\0'; (void) putchar('<'); (void) fputs(namebuf, stdout); putchar(c); in_name = FALSE; } else if (c != '>') { namebuf[used++] = (char) c; } else { /* ah! candidate name! */ char *up; NCURSES_CONST char *tp; namebuf[used++] = '\0'; in_name = FALSE; suffix[0] = '\0'; if ((up = strchr(namebuf, '#')) != 0 || (up = strchr(namebuf, '=')) != 0 || ((up = strchr(namebuf, '@')) != 0 && up[1] == '>')) { _nc_STRCPY(suffix, up, have); *up = '\0'; } if ((tp = nametrans(namebuf)) != 0) { (void) putchar(':'); (void) fputs(tp, stdout); (void) fputs(suffix, stdout); (void) putchar(':'); } else { /* couldn't find a translation, just dump the name */ (void) putchar('<'); (void) fputs(namebuf, stdout); (void) fputs(suffix, stdout); (void) putchar('>'); } } } else { used = 0; if (c == '<') { in_name = TRUE; } else { putchar(c); } } } /* Returns a string, stripped of leading/trailing whitespace */ static char * stripped(char *src) { char *dst = 0; while (isspace(UChar(*src))) src++; if (*src != '\0') { if ((dst = strdup(src)) == NULL) { failed("strdup"); } else { size_t len = strlen(dst); while (--len != 0 && isspace(UChar(dst[len]))) dst[len] = '\0'; } } return dst; } static FILE * open_tempfile(char *filename) { FILE *result = 0; _nc_STRCPY(filename, "/tmp/XXXXXX", PATH_MAX); #if HAVE_MKSTEMP { int oldmask = (int) umask(077); int fd = mkstemp(filename); if (fd >= 0) result = fdopen(fd, "w"); umask((mode_t) oldmask); } #else if (tmpnam(filename) != 0) result = safe_fopen(filename, "w"); #endif return result; } static FILE * copy_input(FILE *source, const char *filename, char *alt_file) { char my_altfile[PATH_MAX]; FILE *result = 0; FILE *target; int ch; if (alt_file == NULL) alt_file = my_altfile; if (source == NULL) { failed("copy_input (source)"); } else if ((target = open_tempfile(alt_file)) == NULL) { failed("copy_input (target)"); } else { clearerr(source); for (;;) { ch = fgetc(source); if (feof(source)) { break; } else if (ferror(source)) { failed(filename); } else if (ch == 0) { /* don't loop in case someone wants to convert /dev/zero */ fprintf(stderr, "%s: %s is not a text-file\n", _nc_progname, filename); ExitProgram(EXIT_FAILURE); } fputc(ch, target); } fclose(source); /* * rewind() does not force the target file's data to disk (not does * fflush()...). So open a second stream on the data and then close * the one that we were writing on before starting to read from the * second stream. */ result = safe_fopen(alt_file, "r+"); fclose(target); to_remove = strdup(alt_file); } return result; } static FILE * open_input(const char *filename, char *alt_file) { FILE *fp; struct stat sb; int mode; if (!strcmp(filename, "-")) { fp = copy_input(stdin, STDIN_NAME, alt_file); } else if (stat(filename, &sb) == -1) { fprintf(stderr, "%s: 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 = "terminfo"; char *outdir = (char *) NULL; bool check_only = FALSE; bool suppress_untranslatable = FALSE; int quickdump = 0; bool quiet = FALSE; bool wrap_strings = FALSE; log_fp = stderr; _nc_progname = _nc_rootname(argv[0]); atexit(cleanup); if ((infodump = same_program(_nc_progname, PROG_CAPTOINFO)) != FALSE) { outform = F_TERMINFO; sortmode = S_TERMINFO; } if ((capdump = same_program(_nc_progname, PROG_INFOTOCAP)) != FALSE) { outform = F_TERMCAP; sortmode = S_TERMCAP; } #if NCURSES_XNAMES /* set this directly to avoid interaction with -v and -D options */ _nc_user_definable = FALSE; #endif _nc_strict_bsd = 0; /* * Processing arguments is a little complicated, since someone made a * design decision to allow the numeric values for -w, -v options to * be optional. */ while ((this_opt = getopt(argc, argv, "0123456789CDIKLNQR:TUVWace:fGgo:qrstvwx")) != -1) { if (isdigit(this_opt)) { switch (last_opt) { case 'Q': add_digit(&quickdump, this_opt); break; case 'v': add_digit(&v_opt, this_opt); break; case 'w': add_digit(&width, this_opt); break; default: switch (this_opt) { case '0': last_opt = this_opt; width = 65535; height = 1; break; case '1': last_opt = this_opt; width = 0; break; default: usage(); } } continue; } switch (this_opt) { case 'K': _nc_strict_bsd = 1; /* the initial version of -K in 20110730 fell-thru here, but the * same flag is useful when reading sources -TD */ break; case 'C': capdump = TRUE; outform = F_TERMCAP; sortmode = S_TERMCAP; break; case 'D': debug_level = VtoTrace(v_opt); use_verbosity(debug_level); show_databases(outdir); ExitProgram(EXIT_SUCCESS); break; case 'I': infodump = TRUE; outform = F_TERMINFO; sortmode = S_TERMINFO; break; case 'L': infodump = TRUE; outform = F_VARIABLE; sortmode = S_VARIABLE; break; case 'N': smart_defaults = FALSE; literal = TRUE; break; case 'Q': quickdump = 0; break; case 'R': tversion = optarg; break; case 'T': limited = FALSE; break; case 'U': literal = TRUE; break; case 'V': puts(curses_version()); ExitProgram(EXIT_SUCCESS); case 'W': wrap_strings = TRUE; break; case 'c': check_only = TRUE; break; case 'e': namelst = make_namelist(optarg); break; case 'f': formatted = TRUE; break; case 'G': numbers = 1; break; case 'g': numbers = -1; break; case 'o': outdir = optarg; break; case 'q': quiet = TRUE; break; case 'r': forceresolve = TRUE; break; case 's': showsummary = TRUE; break; case 'v': v_opt = 0; break; case 'w': width = 0; break; #if NCURSES_XNAMES case 't': _nc_disable_period = FALSE; suppress_untranslatable = TRUE; break; case 'a': _nc_disable_period = TRUE; /* FALLTHRU */ case 'x': using_extensions = TRUE; break; #endif default: usage(); } last_opt = this_opt; } /* * If the -v option is set, it may override the $NCURSES_TRACE environment * variable, e.g., for -v3 and up. */ debug_level = VtoTrace(v_opt); use_verbosity(debug_level); /* * Do this after setting debug_level, since the function calls START_TRACE, * which uses the $NCURSES_TRACE environment variable if _nc_tracing bits * for tracing are zero. */ #if NCURSES_XNAMES if (using_extensions) { use_extended_names(TRUE); } #endif if (_nc_tracing) { save_check_termtype = _nc_check_termtype2; _nc_check_termtype2 = check_termtype; } #if !HAVE_BIG_CORE /* * Aaargh! immedhook seriously hoses us! * * One problem with immedhook is it means we can't do -e. Problem * is that we can't guarantee that for each terminal listed, all the * terminals it depends on will have been kept in core for reference * resolution -- in fact it is certain the primitive types at the end * of reference chains *won't* be in core unless they were explicitly * in the select list themselves. */ if (namelst && (!infodump && !capdump)) { (void) fprintf(stderr, "%s: Sorry, -e can't be used without -I or -C\n", _nc_progname); ExitProgram(EXIT_FAILURE); } #endif /* HAVE_BIG_CORE */ if (optind < argc) { source_file = argv[optind++]; if (optind < argc) { fprintf(stderr, "%s: Too many file names. Usage:\n\t%s %s", _nc_progname, _nc_progname, usage_string); ExitProgram(EXIT_FAILURE); } } else { if (infodump == TRUE) { /* captoinfo's no-argument case */ source_file = "/etc/termcap"; if ((termcap = getenv("TERMCAP")) != 0 && (namelst = make_namelist(getenv("TERM"))) != 0) { if (access(termcap, F_OK) == 0) { /* file exists */ source_file = termcap; } else { if ((tmp_fp = open_tempfile(my_tmpname)) != 0) { source_file = my_tmpname; fprintf(tmp_fp, "%s\n", termcap); fclose(tmp_fp); tmp_fp = open_input(source_file, (char *) 0); to_remove = source_file; } else { failed("tmpnam"); } } } } else { /* tic */ fprintf(stderr, "%s: File name needed. Usage:\n\t%s %s", _nc_progname, _nc_progname, usage_string); ExitProgram(EXIT_FAILURE); } } if (tmp_fp == NULL) { char my_altfile[PATH_MAX]; tmp_fp = open_input(source_file, my_altfile); if (!strcmp(source_file, "-")) { source_file = STDIN_NAME; } } if (infodump || check_only) { dump_init(tversion, (smart_defaults ? outform : F_LITERAL), sortmode, wrap_strings, width, height, debug_level, formatted || check_only, check_only, quickdump); } else if (capdump) { dump_init(tversion, outform, sortmode, wrap_strings, width, height, debug_level, FALSE, FALSE, FALSE); } /* parse entries out of the source file */ _nc_set_source(source_file); #if !HAVE_BIG_CORE if (!(check_only || infodump || capdump)) _nc_set_writedir(outdir); #endif /* HAVE_BIG_CORE */ _nc_read_entry_source(tmp_fp, (char *) NULL, !smart_defaults || literal, FALSE, ((check_only || infodump || capdump) ? NULLHOOK : immedhook)); /* do use resolution */ if (check_only || (!infodump && !capdump) || forceresolve) { if (!_nc_resolve_uses2(TRUE, literal) && !check_only) { ExitProgram(EXIT_FAILURE); } } /* length check */ if (check_only && limited && (capdump || infodump)) { for_entry_list(qp) { if (matches(namelst, qp->tterm.term_names)) { int len = fmt_entry(&qp->tterm, NULL, FALSE, TRUE, infodump, numbers); if (len > (infodump ? MAX_TERMINFO_LENGTH : MAX_TERMCAP_LENGTH)) (void) fprintf(stderr, "%s: resolved %s entry is %d bytes long\n", _nc_progname, _nc_first_name(qp->tterm.term_names), len); } } } /* write or dump all entries */ if (check_only) { /* this is in case infotocap() generates warnings */ _nc_curr_col = _nc_curr_line = -1; for_entry_list(qp) { if (matches(namelst, qp->tterm.term_names)) { /* this is in case infotocap() generates warnings */ _nc_set_type(_nc_first_name(qp->tterm.term_names)); _nc_curr_line = (int) qp->startline; repair_acsc(&qp->tterm); dump_entry(&qp->tterm, suppress_untranslatable, limited, numbers, NULL); } } } else { if (!infodump && !capdump) { _nc_set_writedir(outdir); for_entry_list(qp) { if (matches(namelst, qp->tterm.term_names)) write_it(qp); } } else { /* this is in case infotocap() generates warnings */ _nc_curr_col = _nc_curr_line = -1; for_entry_list(qp) { if (matches(namelst, qp->tterm.term_names)) { long j = qp->cend - qp->cstart; int len = 0; /* this is in case infotocap() generates warnings */ _nc_set_type(_nc_first_name(qp->tterm.term_names)); if (!quiet) { (void) fseek(tmp_fp, qp->cstart, SEEK_SET); while (j-- > 0) { int ch = fgetc(tmp_fp); if (ch == EOF || ferror(tmp_fp)) { break; } else if (infodump) { (void) putchar(ch); } else { put_translate(ch); } } } repair_acsc(&qp->tterm); dump_entry(&qp->tterm, suppress_untranslatable, limited, numbers, NULL); for (j = 0; j < (long) qp->nuses; j++) dump_uses(qp->uses[j].name, !capdump); len = show_entry(); if (debug_level != 0 && !limited) printf("# length=%d\n", len); } } if (!namelst && _nc_tail && !quiet) { int c, oldc = '\0'; bool in_comment = FALSE; bool trailing_comment = FALSE; (void) fseek(tmp_fp, _nc_tail->cend, SEEK_SET); while ((c = fgetc(tmp_fp)) != EOF) { if (oldc == '\n') { if (c == '#') { trailing_comment = TRUE; in_comment = TRUE; } else { in_comment = FALSE; } } if (trailing_comment && (in_comment || (oldc == '\n' && c == '\n'))) putchar(c); oldc = c; } } } } /* Show the directory into which entries were written, and the total * number of entries */ if (showsummary && (!(check_only || infodump || capdump))) { int total = _nc_tic_written(); if (total != 0) fprintf(log_fp, "%d entries written to %s\n", total, _nc_tic_dir(NULL)); else fprintf(log_fp, "No entries written\n"); } ExitProgram(EXIT_SUCCESS); } /* * This bit of legerdemain turns all the terminfo variable names into * references to locations in the arrays Booleans, Numbers, and Strings --- * precisely what's needed (see comp_parse.c). */ #undef CUR #define CUR tp-> /* * Check if the alternate character-set capabilities are consistent. */ static void check_acs(TERMTYPE2 *tp) { int vt100_smacs = 0; int vt100_rmacs = 0; int vt100_enacs = 0; /* * ena_acs is not always necessary, but if it is present, the enter/exit * capabilities should be. */ ANDMISSING(ena_acs, enter_alt_charset_mode); ANDMISSING(ena_acs, exit_alt_charset_mode); PAIRED(exit_alt_charset_mode, exit_alt_charset_mode); /* * vt100-like is frequently used, but perhaps ena_acs is missing, etc. */ if (VALID_STRING(enter_alt_charset_mode)) { vt100_smacs = (!strcmp("\033(0", enter_alt_charset_mode) ? 2 : (!strcmp("\016", enter_alt_charset_mode) ? 1 : 0)); } if (VALID_STRING(exit_alt_charset_mode)) { vt100_rmacs = (!strcmp("\033(B", exit_alt_charset_mode) ? 2 : (!strcmp("\017", exit_alt_charset_mode) ? 1 : 0)); } if (VALID_STRING(ena_acs)) { vt100_enacs = (!strcmp("\033(B\033)0", ena_acs) ? 2 : 0); } if (vt100_rmacs && vt100_smacs && (vt100_rmacs != vt100_smacs)) { _nc_warning("rmacs/smacs are inconsistent"); } if ((vt100_rmacs == 2) && (vt100_smacs == 2) && vt100_enacs) { _nc_warning("rmacs/smacs make enacs redundant"); } if ((vt100_rmacs == 1) && (vt100_smacs == 1) && !vt100_enacs) { _nc_warning("VT100-style rmacs/smacs require enacs"); } if (VALID_STRING(acs_chars)) { const char *boxes = "lmkjtuvwqxn"; char mapped[256]; char missing[256]; const char *p; char *q; memset(mapped, 0, sizeof(mapped)); 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" */ 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) { char *up = list[1]; size_t prefix = (size_t) csi_length(up); size_t suffix; if (prefix) { suffix = prefix; while (up[suffix] && isdigit(UChar(up[suffix]))) ++suffix; } if (prefix && up[suffix] == 'A') { skip[1] = TRUE; if (!strcmp(list[0], "\n")) skip[0] = TRUE; if (!strcmp(list[2], "\b")) skip[2] = TRUE; for (j = 0; j < 4; ++j) { int want; if (skip[j] || strlen(list[j]) == 1) continue; if (memcmp(list[j], up, prefix)) { char *value = _nc_tic_expand(list[j], TRUE, 0); _nc_warning("inconsistent prefix for %s", value); continue; } if (strlen(list[j]) < suffix) { char *value = _nc_tic_expand(list[j], TRUE, 0); _nc_warning("inconsistent length for %s, expected %d", value, (int) suffix + 1); continue; } want = "BADC"[j]; if (list[j][suffix] != want) { char *value = _nc_tic_expand(list[j], TRUE, 0); _nc_warning("inconsistent suffix for %s, expected %c, have %c", value, want, list[j][suffix]); } } } } } #define EXPECTED(name) if (!PRESENT(name)) _nc_warning("expected " #name) #define UNEXPECTED(name) if (PRESENT(name)) _nc_warning("unexpected " #name ", for %s", why) static void check_noaddress(TERMTYPE2 *tp, const char *why) { UNEXPECTED(column_address); UNEXPECTED(cursor_address); UNEXPECTED(cursor_home); UNEXPECTED(cursor_mem_address); UNEXPECTED(cursor_to_ll); UNEXPECTED(row_address); UNEXPECTED(row_address); } static void check_cursor(TERMTYPE2 *tp) { int count; char *list[4]; if (hard_copy) { check_noaddress(tp, "hard_copy"); } else if (generic_type) { check_noaddress(tp, "generic_type"); } else if (strchr(tp->term_names, '+') == NULL) { int y = 0; int x = 0; if (PRESENT(column_address)) ++y; if (PRESENT(cursor_address)) y = x = 10; if (PRESENT(cursor_home)) ++y, ++x; if (PRESENT(cursor_mem_address)) y = x = 10; if (PRESENT(cursor_to_ll)) ++y, ++x; if (PRESENT(row_address)) ++x; if (PRESENT(cursor_down)) ++y; if (PRESENT(cursor_up)) ++y; if (PRESENT(cursor_left)) ++x; if (PRESENT(cursor_right)) ++x; if (x < 2 && y < 2) { _nc_warning("terminal lacks cursor addressing"); } else { if (x < 2) _nc_warning("terminal lacks cursor column-addressing"); if (y < 2) _nc_warning("terminal lacks cursor row-addressing"); } } /* it is rare to have an insert-line feature without a matching delete */ ANDMISSING(parm_insert_line, insert_line); ANDMISSING(parm_delete_line, delete_line); ANDMISSING(parm_insert_line, parm_delete_line); /* if we have a parameterized form, then the non-parameterized is easy */ ANDMISSING(parm_down_cursor, cursor_down); ANDMISSING(parm_up_cursor, cursor_up); ANDMISSING(parm_left_cursor, cursor_left); ANDMISSING(parm_right_cursor, cursor_right); /* Given any of a set of cursor movement, the whole set should be present. * Technically this is not true (we could use cursor_address to fill in * unsupported controls), but it is likely. */ count = 0; if (PRESENT(parm_down_cursor)) { list[count++] = parm_down_cursor; } if (PRESENT(parm_up_cursor)) { list[count++] = parm_up_cursor; } if (PRESENT(parm_left_cursor)) { list[count++] = parm_left_cursor; } if (PRESENT(parm_right_cursor)) { list[count++] = parm_right_cursor; } if (count == 4) { check_ansi_cursor(list); } else if (count != 0) { EXPECTED(parm_down_cursor); EXPECTED(parm_up_cursor); EXPECTED(parm_left_cursor); EXPECTED(parm_right_cursor); } count = 0; if (PRESENT(cursor_down)) { list[count++] = cursor_down; } if (PRESENT(cursor_up)) { list[count++] = cursor_up; } if (PRESENT(cursor_left)) { list[count++] = cursor_left; } if (PRESENT(cursor_right)) { list[count++] = cursor_right; } if (count == 4) { check_ansi_cursor(list); } else if (count != 0) { count = 0; if (PRESENT(cursor_down) && strcmp(cursor_down, "\n")) ++count; if (PRESENT(cursor_left) && strcmp(cursor_left, "\b")) ++count; if (PRESENT(cursor_up) && strlen(cursor_up) > 1) ++count; if (PRESENT(cursor_right) && strlen(cursor_right) > 1) ++count; if (count) { EXPECTED(cursor_down); EXPECTED(cursor_up); EXPECTED(cursor_left); EXPECTED(cursor_right); } } } #define MAX_KP 5 /* * Do a quick sanity-check for vt100-style keypads to see if the 5-key keypad * is mapped inconsistently. */ static void check_keypad(TERMTYPE2 *tp) { char show[80]; if (VALID_STRING(key_a1) && VALID_STRING(key_a3) && VALID_STRING(key_b2) && VALID_STRING(key_c1) && VALID_STRING(key_c3)) { char final[MAX_KP + 1]; long list[MAX_KP]; int increase = 0; int j; final[0] = keypad_final(key_a1); final[1] = keypad_final(key_a3); final[2] = keypad_final(key_b2); final[3] = keypad_final(key_c1); final[4] = keypad_final(key_c3); final[5] = '\0'; /* special case: legacy coding using 1,2,3,0,. on the bottom */ assert(strlen(final) <= MAX_KP); if (!strcmp(final, "qsrpn")) return; list[0] = keypad_index(key_a1); list[1] = keypad_index(key_a3); list[2] = keypad_index(key_b2); list[3] = keypad_index(key_c1); list[4] = keypad_index(key_c3); /* check that they're all vt100 keys */ for (j = 0; j < MAX_KP; ++j) { if (list[j] < 0) { return; } } /* check if they're all in increasing order */ for (j = 1; j < MAX_KP; ++j) { if (list[j] > list[j - 1]) { ++increase; } } if (increase != (MAX_KP - 1)) { long last; show[0] = '\0'; for (j = 0, last = -1; j < MAX_KP; ++j) { int k; int kk; long test; for (k = 0, kk = -1, test = 100; k < 5; ++k) { if (list[k] > last && list[k] < test) { test = list[k]; kk = k; } } last = test; assert(strlen(show) < (MAX_KP * 4)); switch (kk) { case 0: _nc_STRCAT(show, " ka1", sizeof(show)); break; case 1: _nc_STRCAT(show, " ka3", sizeof(show)); break; case 2: _nc_STRCAT(show, " kb2", sizeof(show)); break; case 3: _nc_STRCAT(show, " kc1", sizeof(show)); break; case 4: _nc_STRCAT(show, " kc3", sizeof(show)); break; } } _nc_warning("vt100 keypad order inconsistent: %s", show); } } else if (VALID_STRING(key_a1) || VALID_STRING(key_a3) || VALID_STRING(key_b2) || VALID_STRING(key_c1) || VALID_STRING(key_c3)) { show[0] = '\0'; if (keypad_index(key_a1) >= 0) _nc_STRCAT(show, " ka1", sizeof(show)); if (keypad_index(key_a3) >= 0) _nc_STRCAT(show, " ka3", sizeof(show)); if (keypad_index(key_b2) >= 0) _nc_STRCAT(show, " kb2", sizeof(show)); if (keypad_index(key_c1) >= 0) _nc_STRCAT(show, " kc1", sizeof(show)); if (keypad_index(key_c3) >= 0) _nc_STRCAT(show, " kc3", sizeof(show)); if (*show != '\0') _nc_warning("vt100 keypad map incomplete:%s", show); } /* * These warnings are useful for consistency checks - it is possible that * there are real terminals with mismatches in these */ ANDMISSING(key_ic, key_dc); } static void check_printer(TERMTYPE2 *tp) { (void) tp; #if defined(enter_doublewide_mode) && defined(exit_doublewide_mode) PAIRED(enter_doublewide_mode, exit_doublewide_mode); #endif #if defined(enter_italics_mode) && defined(exit_italics_mode) PAIRED(enter_italics_mode, exit_italics_mode); #endif #if defined(enter_leftward_mode) && defined(exit_leftward_mode) PAIRED(enter_leftward_mode, exit_leftward_mode); #endif #if defined(enter_micro_mode) && defined(exit_micro_mode) PAIRED(enter_micro_mode, exit_micro_mode); #endif #if defined(enter_shadow_mode) && defined(exit_shadow_mode) PAIRED(enter_shadow_mode, exit_shadow_mode); #endif #if defined(enter_subscript_mode) && defined(exit_subscript_mode) PAIRED(enter_subscript_mode, exit_subscript_mode); #endif #if defined(enter_superscript_mode) && defined(exit_superscript_mode) PAIRED(enter_superscript_mode, exit_superscript_mode); #endif #if defined(enter_upward_mode) && defined(exit_upward_mode) PAIRED(enter_upward_mode, exit_upward_mode); #endif #if defined(start_char_set_def) && defined(stop_char_set_def) ANDMISSING(start_char_set_def, stop_char_set_def); #endif /* * If we have a parameterized form, then the non-parameterized is easy. * note: parameterized/non-parameterized margin settings are unrelated. */ #if defined(parm_down_micro) && defined(micro_down) ANDMISSING(parm_down_micro, micro_down); #endif #if defined(parm_left_micro) && defined(micro_left) ANDMISSING(parm_left_micro, micro_left); #endif #if defined(parm_right_micro) && defined(micro_right) ANDMISSING(parm_right_micro, micro_right); #endif #if defined(parm_up_micro) && defined(micro_up) ANDMISSING(parm_up_micro, micro_up); #endif } #if NCURSES_XNAMES static bool uses_SGR_39_49(const char *value) { return (strstr(value, "39;49") != 0 || strstr(value, "49;39") != 0); } /* * Check consistency of termcap extensions related to "screen". */ static void check_screen(TERMTYPE2 *tp) { if (_nc_user_definable) { int have_XT = tigetflag("XT"); int have_XM = tigetflag("XM"); int have_bce = back_color_erase; bool have_kmouse = FALSE; bool use_sgr_39_49 = FALSE; const char *name_39_49 = "orig_pair or orig_colors"; char *name = _nc_first_name(tp->term_names); bool is_screen = !strncmp(name, "screen", 6); bool screen_base = (is_screen && strchr(name, '.') == NULL); if (!VALID_BOOLEAN(have_bce)) { have_bce = FALSE; } if (!VALID_BOOLEAN(have_XM)) { have_XM = FALSE; } if (!VALID_BOOLEAN(have_XT)) { have_XT = FALSE; } if (VALID_STRING(key_mouse)) { have_kmouse = !strcmp("\033[M", key_mouse); } if (have_bce) { if (VALID_STRING(orig_pair)) { name_39_49 = "orig_pair"; use_sgr_39_49 = uses_SGR_39_49(orig_pair); } if (!use_sgr_39_49 && VALID_STRING(orig_colors)) { name_39_49 = "orig_colors"; use_sgr_39_49 = uses_SGR_39_49(orig_colors); } } if (have_XM && have_XT) { _nc_warning("screen's XT capability conflicts with XM"); } else if (have_XT && screen_base) { _nc_warning("screen's \"screen\" entries should not have XT set"); } else if (have_XT) { char *s; if (!have_kmouse && is_screen) { if (VALID_STRING(key_mouse)) { _nc_warning("value of kmous inconsistent with screen's usage"); } else { _nc_warning("expected kmous capability with XT"); } } if (max_colors > 0) { if (!have_bce) { _nc_warning("expected bce capability with XT"); } else if (!use_sgr_39_49) { _nc_warning("expected %s capability with XT " "to have 39/49 parameters", name_39_49); } } if (VALID_STRING(to_status_line) && (s = strchr(to_status_line, ';')) != NULL && *++s == '\0') _nc_warning("\"tsl\" capability is redundant, given XT"); } else { if (have_kmouse && !have_XM && !screen_base && strchr(name, '+') == NULL) { _nc_warning("expected XT to be set, given kmous"); } } } } #else #define check_screen(tp) /* nothing */ #endif /* * Returns the expected number of parameters for the given capability. */ static int expected_params(const char *name) { #define DATA(name,count) { { name }, count } /* *INDENT-OFF* */ static const struct { const char name[9]; int count; } table[] = { DATA( "S0", 1 ), /* 'screen' extension */ DATA( "birep", 2 ), DATA( "chr", 1 ), DATA( "colornm", 1 ), DATA( "cpi", 1 ), DATA( "csnm", 1 ), DATA( "csr", 2 ), DATA( "cub", 1 ), DATA( "cud", 1 ), DATA( "cuf", 1 ), DATA( "cup", 2 ), DATA( "cuu", 1 ), DATA( "cvr", 1 ), DATA( "cwin", 5 ), DATA( "dch", 1 ), DATA( "defc", 3 ), DATA( "dial", 1 ), DATA( "dispc", 1 ), DATA( "dl", 1 ), DATA( "ech", 1 ), DATA( "getm", 1 ), DATA( "hpa", 1 ), DATA( "ich", 1 ), DATA( "il", 1 ), DATA( "indn", 1 ), DATA( "initc", 4 ), DATA( "initp", 7 ), DATA( "lpi", 1 ), DATA( "mc5p", 1 ), DATA( "mrcup", 2 ), DATA( "mvpa", 1 ), DATA( "pfkey", 2 ), DATA( "pfloc", 2 ), DATA( "pfx", 2 ), DATA( "pfxl", 3 ), DATA( "pln", 2 ), DATA( "qdial", 1 ), DATA( "rcsd", 1 ), DATA( "rep", 2 ), DATA( "rin", 1 ), DATA( "sclk", 3 ), DATA( "scp", 1 ), DATA( "scs", 1 ), DATA( "scsd", 2 ), DATA( "setab", 1 ), DATA( "setaf", 1 ), DATA( "setb", 1 ), DATA( "setcolor", 1 ), DATA( "setf", 1 ), DATA( "sgr", 9 ), DATA( "sgr1", 6 ), DATA( "slength", 1 ), DATA( "slines", 1 ), DATA( "smgbp", 1 ), /* 2 if smgtp is not given */ DATA( "smglp", 1 ), DATA( "smglr", 2 ), DATA( "smgrp", 1 ), DATA( "smgtb", 2 ), DATA( "smgtp", 1 ), DATA( "tsl", 1 ), DATA( "u6", -1 ), DATA( "vpa", 1 ), DATA( "wind", 4 ), DATA( "wingo", 1 ), }; /* *INDENT-ON* */ #undef DATA unsigned n; int result = 0; /* function-keys, etc., use none */ for (n = 0; n < SIZEOF(table); n++) { if (!strcmp(name, table[n].name)) { result = table[n].count; break; } } return result; } /* * Check for user-capabilities that happen to be used in ncurses' terminal * database. */ #if NCURSES_XNAMES static struct user_table_entry const * lookup_user_capability(const char *name) { struct user_table_entry const *result = 0; if (*name != 'k') { result = _nc_find_user_entry(name); } return result; } #endif /* * If a given name is likely to be a user-capability, return the number of * parameters it would be used with. If not, return -1. * * ncurses assumes that u6 could be used for getting the cursor-position, but * that is not implemented. Make a special case for that, to quiet needless * warnings. * * The other string-capability extensions (see terminfo.src) which could have * parameters such as "Ss", "%u", are not used by ncurses. But we check those * anyway, to validate the terminfo database. */ static int is_user_capability(const char *name) { int result = -1; if (name[0] == 'u' && (name[1] >= '0' && name[1] <= '9') && name[2] == '\0') { result = (name[1] == '6') ? 2 : 0; } #if NCURSES_XNAMES else if (using_extensions) { struct user_table_entry const *p = lookup_user_capability(name); if (p != 0) { result = (int) p->ute_argc; } } #endif return result; } static bool line_capability(const char *name) { bool result = FALSE; static const char *table[] = { "csr", /* change_scroll_region */ "clear", /* clear_screen */ "ed", /* clr_eos */ "cwin", /* create_window */ "cup", /* cursor_address */ "cud1", /* cursor_down */ "home", /* cursor_home */ "mrcup", /* cursor_mem_address */ "ll", /* cursor_to_ll */ "cuu1", /* cursor_up */ "dl1", /* delete_line */ "hd", /* down_half_line */ "flash", /* flash_screen */ "ff", /* form_feed */ "il1", /* insert_line */ "nel", /* newline */ "dl", /* parm_delete_line */ "cud", /* parm_down_cursor */ "indn", /* parm_index */ "il", /* parm_insert_line */ "rin", /* parm_rindex */ "cuu", /* parm_up_cursor */ "mc0", /* print_screen */ "vpa", /* row_address */ "ind", /* scroll_forward */ "ri", /* scroll_reverse */ "hu", /* up_half_line */ }; size_t n; for (n = 0; n < SIZEOF(table); ++n) { if (!strcmp(name, table[n])) { result = TRUE; break; } } return result; } /* * Make a quick sanity check for the parameters which are used in the given * strings. If there are no "%p" tokens, then there should be no other "%" * markers. */ static void check_params(TERMTYPE2 *tp, const char *name, const char *value, int extended) { int expected = expected_params(name); int actual = 0; int n; bool params[1 + NUM_PARM]; const char *s = value; #ifdef set_left_margin_parm if (!strcmp(name, "smgrp") && !VALID_STRING(set_left_margin_parm)) expected = 2; #endif #ifdef set_right_margin_parm if (!strcmp(name, "smglp") && !VALID_STRING(set_right_margin_parm)) expected = 2; #endif #ifdef set_top_margin_parm if (!strcmp(name, "smgbp") && !VALID_STRING(set_top_margin_parm)) expected = 2; #endif #ifdef set_bottom_margin_parm if (!strcmp(name, "smgtp") && !VALID_STRING(set_bottom_margin_parm)) expected = 2; #endif for (n = 0; n <= NUM_PARM; n++) params[n] = FALSE; while (*s != 0) { if (*s == '%') { if (*++s == '\0') { _nc_warning("expected character after %% in %s", name); break; } else if (*s == 'p') { if (*++s == '\0' || !isdigit((int) *s)) { _nc_warning("expected digit after %%p in %s", name); return; } else { n = (*s - '0'); if (n > actual) actual = n; params[n] = TRUE; } } } s++; } #if NCURSES_XNAMES if (extended) { int check = is_user_capability(name); if (check != actual && (check >= 0 && actual >= 0)) { _nc_warning("extended %s capability has %d parameters, expected %d", name, actual, check); } else if (debug_level > 1) { _nc_warning("extended %s capability has %d parameters, as expected", name, actual); } expected = actual; } #else (void) extended; #endif if (params[0]) { _nc_warning("%s refers to parameter 0 (%%p0), which is not allowed", name); } if (value == set_attributes || expected < 0) { ; } else if (expected != actual) { _nc_warning("%s uses %d parameters, expected %d", name, actual, expected); for (n = 1; n < actual; n++) { if (!params[n]) _nc_warning("%s omits parameter %d", name, n); } } /* * Counting "%p" markers does not account for termcap expressions which * may not have been fully translated. Also, tparm does its own analysis. * Report differences here. */ _nc_reset_tparm(NULL); if (actual >= 0) { char *p_is_s[NUM_PARM]; int popcount; int analyzed = _nc_tparm_analyze(NULL, value, p_is_s, &popcount); if (analyzed < popcount) { analyzed = popcount; } if (actual != analyzed && expected != analyzed) { #if NCURSES_XNAMES int user_cap = is_user_capability(name); if ((user_cap == analyzed) && using_extensions) { ; /* ignore */ } else if (user_cap >= 0) { _nc_warning("tparm will use %d parameters for %s, expected %d", analyzed, name, user_cap); } else #endif { _nc_warning("tparm analyzed %d parameters for %s, expected %d", analyzed, name, actual); } } else if (expected > 0 && actual == expected && guess_tparm_type(expected, p_is_s) == Numbers) { int limit = 1; if (!strcmp(name, "setf") || !strcmp(name, "setb") || !strcmp(name, "setaf") || !strcmp(name, "setab")) { if ((limit = max_colors) > 256) limit = 256; } else if (line_capability(name)) { limit = 24; } else if (is_user_capability(name) < 0) { limit = 80; } for (n = 0; n < limit; ++n) { _nc_reset_tparm(NULL); (void) TPARM_9(value, n, n, n, n, n, n, n, n, n); if (_nc_tparm_err) { _nc_warning("problem%s in tparm(%s, %d, ...)", (_nc_tparm_err == 1) ? "" : "s", name, n); if (debug_level < 2) break; } } } } } /* * Check for DEC VT100 private mode for reverse video. */ static const char * skip_DECSCNM(const char *value, int *flag) { *flag = -1; if (value != 0) { int skip = csi_length(value); if (skip > 0 && value[skip++] == '?' && value[skip++] == '5') { if (value[skip] == 'h') { *flag = 1; } else if (value[skip] == 'l') { *flag = 0; } value += skip + 1; } } return value; } static void check_delays(TERMTYPE2 *tp, const char *name, const char *value) { const char *p, *q; const char *first = 0; const char *last = 0; for (p = value; *p != '\0'; ++p) { if (p[0] == '$' && p[1] == '<') { const char *base = p + 2; const char *mark = 0; bool mixed = FALSE; int proportional = 0; int mandatory = 0; first = p; for (q = base; *q != '\0'; ++q) { if (*q == '>') { if (mark == NULL) mark = q; break; } else if (*q == '*' || *q == '/') { if (*q == '*') ++proportional; if (*q == '/') ++mandatory; if (mark == NULL) mark = q; } else if (!(isalnum(UChar(*q)) || strchr("+-.", *q) != 0)) { break; } else if (proportional || mandatory) { mixed = TRUE; } } last = *q ? (q + 1) : q; if (*q != '\0') { float check_f; char check_c; int rc = sscanf(base, "%f%c", &check_f, &check_c); if ((rc != 2) || (mark != NULL && (check_c != *mark)) || mixed) { _nc_warning("syntax error in %s delay '%.*s'", name, (int) (q - base), base); } else if (*name == 'k') { _nc_warning("function-key %s has delay", name); } else if (proportional && !line_capability(name)) { _nc_warning("non-line capability using proportional delay: %s", name); } else if (!xon_xoff && !mandatory && strchr(_nc_first_name(tp->term_names), '+') == NULL) { _nc_warning("%s in %s is used since no xon/xoff", (proportional ? "proportional delay" : "delay"), name); } } else { p = q - 1; /* restart scan */ } } } if (!strcmp(name, "flash") || !strcmp(name, "beep")) { if (first != 0) { if (first == value || *last == 0) { /* * Delay is on one end or the other. */ _nc_warning("expected delay embedded within %s", name); } } else { int flag; /* * Check for missing delay when using VT100 reverse-video. * A real VT100 might not need this, but terminal emulators do. */ if ((p = skip_DECSCNM(value, &flag)) != 0 && flag > 0 && skip_DECSCNM(p, &flag) != 0 && flag == 0) { _nc_warning("expected a delay in %s", name); } } } } static char * check_1_infotocap(const char *name, NCURSES_CONST char *value, int count) { int k; int ignored; long numbers[1 + NUM_PARM]; char *strings[1 + NUM_PARM]; char *p_is_s[NUM_PARM]; char *result; char blob[NUM_PARM * 10]; char *next = blob; TParams expect; TParams actual; int nparam; *next++ = '\0'; for (k = 1; k <= NUM_PARM; k++) { numbers[k] = count; _nc_SPRINTF(next, _nc_SLIMIT(sizeof(blob) - (size_t) (next - blob)) "XYZ%d", count); strings[k] = next; next += strlen(next) + 1; } _nc_reset_tparm(NULL); expect = tparm_type(name); nparam = _nc_tparm_analyze(NULL, value, p_is_s, &ignored); actual = guess_tparm_type(nparam, p_is_s); if (expect != actual) { _nc_warning("%s has mismatched parameters", name); actual = Other; } _nc_reset_tparm(NULL); switch (actual) { case 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; char *base_b = b; int delaying = 0; while (*b != 0) { while (*a != *b) { if (*a == 0) { if (num < 0) { ; } else if (b[0] == '$' && b[1] == '<') { _nc_warning("did not find delay %s", _nc_visbuf(b)); } else { _nc_warning("checking sgr(%s) %s\n\tcompare to %s\n\tunmatched %s", sgr_names[num], _nc_visbuf2(1, base_a), _nc_visbuf2(2, base_b), _nc_visbuf2(3, b)); } return FALSE; } else if (delaying) { a = skip_delay(a); b = skip_delay(b); } else if ((*b == '0' || (*b == ';')) && *a == 'm') { b++; } else { a++; } } switch (*a) { case '$': if (delaying == 0) delaying = 1; break; case '<': if (delaying == 1) delaying = 2; break; default: delaying = 0; break; } a++; b++; } /* ignore delays on the end of the string */ a = ignore_delays(a); return ((num != 0) || (*a == 0)); } static void check_tparm_err(int num) { if (_nc_tparm_err) _nc_warning("tparam error in sgr(%d): %s", num, sgr_names[num]); } static char * check_sgr(TERMTYPE2 *tp, char *zero, int num, char *cap, const char *name) { char *test; _nc_tparm_err = 0; test = TIPARM_9(set_attributes, num == 1, num == 2, num == 3, num == 4, num == 5, num == 6, num == 7, num == 8, num == 9); if (test != 0) { if (PRESENT(cap)) { if (!similar_sgr(num, test, cap)) { _nc_warning("%s differs from sgr(%d)\n\t%s=%s\n\tsgr(%d)=%s", name, num, name, _nc_visbuf2(1, cap), num, _nc_visbuf2(2, test)); } } else if (_nc_capcmp(test, zero)) { _nc_warning("sgr(%d) present, but not %s", num, name); } } else if (PRESENT(cap)) { _nc_warning("sgr(%d) missing, but %s present", num, name); } check_tparm_err(num); return test; } #define CHECK_SGR(num,name) check_sgr(tp, zero, num, name, #name) #ifdef TRACE /* * If tic is compiled with TRACE, we'll be able to see the output from the * DEBUG() macro. But since it doesn't use traceon(), it always goes to * the standard error. Use this function to make it simpler to follow the * resulting debug traces. */ static void show_where(unsigned level) { if (_nc_tracing >= DEBUG_LEVEL(level)) { char my_name[MAX_NAME_SIZE]; _nc_get_type(my_name); _tracef("\"%s\", line %d, '%s'", _nc_get_source(), _nc_curr_line, my_name); } } #else #define show_where(level) /* nothing */ #endif typedef struct { int keycode; const char *name; const char *value; } NAME_VALUE; static NAME_VALUE * get_fkey_list(TERMTYPE2 *tp) { NAME_VALUE *result = typeMalloc(NAME_VALUE, NUM_STRINGS(tp) + 1); const struct tinfo_fkeys *all_fkeys = _nc_tinfo_fkeys; int used = 0; unsigned j; if (result == NULL) failed("get_fkey_list"); for (j = 0; all_fkeys[j].code; j++) { char *a = tp->Strings[all_fkeys[j].offset]; if (VALID_STRING(a)) { result[used].keycode = (int) all_fkeys[j].code; result[used].name = strnames[all_fkeys[j].offset]; result[used].value = a; ++used; } } #if NCURSES_XNAMES for (j = STRCOUNT; j < NUM_STRINGS(tp); ++j) { const char *name = ExtStrname(tp, (int) j, strnames); if (*name == 'k') { result[used].keycode = -1; result[used].name = name; result[used].value = tp->Strings[j]; ++used; } } #endif result[used].keycode = 0; return result; } static void show_fkey_name(NAME_VALUE * data) { if (data->keycode > 0) { fprintf(stderr, " %s", keyname(data->keycode)); fprintf(stderr, " (capability \"%s\")", data->name); } else { fprintf(stderr, " capability \"%s\"", data->name); } } /* * A terminal entry may contain more than one keycode assigned to a given * string (e.g., KEY_END and KEY_LL). But curses will only return one (the * last one assigned). */ static void check_conflict(TERMTYPE2 *tp) { if (!(_nc_syntax == SYN_TERMCAP && capdump)) { char *check = calloc((size_t) (NUM_STRINGS(tp) + 1), sizeof(char)); NAME_VALUE *given = get_fkey_list(tp); unsigned j, k; bool conflict = FALSE; if (check == NULL) failed("check_conflict"); for (j = 0; given[j].keycode; ++j) { const char *a = given[j].value; bool first = TRUE; if (!VALID_STRING(a)) continue; for (k = j + 1; given[k].keycode; k++) { const char *b = given[k].value; if (!VALID_STRING(b)) continue; if (check[k]) continue; if (!_nc_capcmp(a, b)) { check[j] = 1; check[k] = 1; if (first) { if (!conflict) { _nc_warning("conflicting key definitions (using the last)"); conflict = TRUE; } fprintf(stderr, "..."); show_fkey_name(given + j); fprintf(stderr, " is the same as"); show_fkey_name(given + k); first = FALSE; } else { fprintf(stderr, ", "); show_fkey_name(given + k); } } } if (!first) fprintf(stderr, "\n"); } #if NCURSES_XNAMES if (using_extensions) { /* *INDENT-OFF* */ static struct { const char *xcurses; const char *shifted; } table[] = { { "kDC", NULL }, { "kDN", "kind" }, { "kEND", NULL }, { "kHOM", NULL }, { "kLFT", NULL }, { "kNXT", NULL }, { "kPRV", NULL }, { "kRIT", NULL }, { "kUP", "kri" }, { NULL, NULL }, }; /* *INDENT-ON* */ /* * SVr4 curses defines the "xcurses" names listed above except for * the special cases in the "shifted" column. When using these * names for xterm's extensions, that was confusing, and resulted * in adding extended capabilities with "2" (shift) suffix. This * check warns about unnecessary use of extensions for this quirk. */ for (j = 0; given[j].keycode; ++j) { const char *find = given[j].name; int value; char ch; if (!VALID_STRING(given[j].value)) continue; for (k = 0; table[k].xcurses; ++k) { const char *test = table[k].xcurses; size_t size = strlen(test); if (!strncmp(find, test, size) && strcmp(find, test)) { switch (sscanf(find + size, "%d%c", &value, &ch)) { case 1: if (value == 2) { _nc_warning("expected '%s' rather than '%s'", (table[k].shifted ? table[k].shifted : test), find); } else if (value < 2 || value > 15) { _nc_warning("expected numeric 2..15 '%s'", find); } break; default: _nc_warning("expected numeric suffix for '%s'", find); break; } break; } } } } #endif free(given); free(check); } } /* * Exiting a video mode should not duplicate sgr0 */ static void check_exit_attribute(const char *name, char *test, char *trimmed, char *untrimmed) { if (VALID_STRING(test) && (trimmed != 0)) { if (similar_sgr(-1, trimmed, test) || similar_sgr(-1, untrimmed, test)) { _nc_warning("%s matches exit_attribute_mode", name); } } } /* * Returns true if the string looks like a standard SGR string. */ static bool is_sgr_string(char *value) { bool result = FALSE; if (VALID_STRING(value)) { int skip = csi_length(value); if (skip) { int ch; result = TRUE; value += skip; while ((ch = UChar(*value++)) != '\0') { if (isdigit(ch) || ch == ';') { ; } else if (ch == 'm' && *value == '\0') { ; } else { result = FALSE; break; } } } } return result; } /* * Check if the given capability contains a given SGR attribute. */ static void check_sgr_param(TERMTYPE2 *tp, int code, const char *name, char *value) { if (VALID_STRING(value)) { int ncv = ((code != 0) ? (1 << (code - 1)) : 0); char *test = tgoto(value, 0, 0); if (is_sgr_string(test)) { int param = 0; int count = 0; int skips = 0; int color = (value == set_a_foreground || value == set_a_background || value == set_foreground || value == set_background); while (*test != 0) { if (isdigit(UChar(*test))) { param = 10 * param + (*test - '0'); ++count; } else { if (count) { /* * Avoid unnecessary warning for xterm 256color codes. */ if (color && (param == 38 || param == 48)) skips = 3; if ((skips-- <= 0) && (param == code)) break; } count = 0; param = 0; } ++test; } if (count != 0 && param == code) { if (code == 0 || no_color_video < 0 || !(no_color_video & ncv)) { _nc_warning("\"%s\" SGR-attribute used in %s", sgr_names[code], name); } } } } } #if NCURSES_XNAMES static int standard_type(const char *name) { int result = -1; const struct name_table_entry *np; if ((np = _nc_find_entry(name, _nc_get_hash_table(0))) != 0) { result = np->nte_type; } return result; } static const char * name_of_type(int type) { const char *result = "unknown"; switch (type) { case BOOLEAN: result = "boolean"; break; case NUMBER: result = "number"; break; case STRING: result = "string"; break; } return result; } static void check_user_capability_type(const char *name, int actual) { if (lookup_user_capability(name) == 0) { int expected = standard_type(name); if (expected >= 0) { _nc_warning("expected %s to be %s, but actually %s", name, name_of_type(actual), name_of_type(expected) ); } else if (*name != 'k') { _nc_warning("undocumented %s capability %s", name_of_type(actual), name); } } } #endif #define IN_DELAY "0123456789*/." static bool check_ANSI_cap(const char *value, int nparams, char final) { bool result = FALSE; if (VALID_STRING(value) && csi_length(value) > 0) { char *p_is_s[NUM_PARM]; int popcount; int analyzed = _nc_tparm_analyze(NULL, value, p_is_s, &popcount); if (analyzed < popcount) { analyzed = popcount; } if (analyzed == nparams) { bool numbers = TRUE; int p; for (p = 0; p < nparams; ++p) { if (p_is_s[p]) { numbers = FALSE; break; } } if (numbers) { int in_delay = 0; p = (int) strlen(value); while (p-- > 0) { char ch = value[p]; if (ch == final) { result = TRUE; break; } switch (in_delay) { case 0: if (ch == '>') in_delay = 1; break; case 1: if (strchr(IN_DELAY, value[p]) != NULL) break; if (ch != '<') p = 0; in_delay = 2; break; case 2: if (ch != '$') p = 0; in_delay = 0; break; } } } } } return result; } static const char * skip_Delay(const char *value) { const char *result = value; if (*value == '$') { ++result; if (*result++ == '<') { while (strchr(IN_DELAY, *result) != NULL) ++result; if (*result++ != '>') { result = value; } } else { result = value; } } return result; } static bool isValidString(const char *value, const char *expect) { bool result = FALSE; if (VALID_STRING(value)) { if (!strcmp(value, expect)) result = TRUE; } return result; } static bool isValidEscape(const char *value, const char *expect) { bool result = FALSE; if (VALID_STRING(value)) { if (*value == '\033') { size_t need = strlen(expect); size_t have = strlen(value) - 1; if (have >= need && !strncmp(value + 1, expect, need)) { if (*skip_Delay(value + need + 1) == '\0') { result = TRUE; } } } } return result; } static int guess_ANSI_VTxx(TERMTYPE2 *tp) { int result = -1; int checks = 0; /* VT100s have scrolling region, but ANSI (ECMA-48) does not specify */ if (check_ANSI_cap(change_scroll_region, 2, 'r') && (isValidEscape(scroll_forward, "D") || isValidString(scroll_forward, "\n") || isValidEscape(scroll_forward, "6")) && (isValidEscape(scroll_reverse, "M") || isValidEscape(scroll_reverse, "9"))) { checks |= 2; } if (check_ANSI_cap(cursor_address, 2, 'H') && check_ANSI_cap(cursor_up, 0, 'A') && (check_ANSI_cap(cursor_down, 0, 'B') || isValidString(cursor_down, "\n")) && check_ANSI_cap(cursor_right, 0, 'C') && (check_ANSI_cap(cursor_left, 0, 'D') || isValidString(cursor_left, "\b")) && check_ANSI_cap(clr_eos, 0, 'J') && check_ANSI_cap(clr_bol, 0, 'K') && check_ANSI_cap(clr_eol, 0, 'K')) { checks |= 1; } if (checks == 3) result = 1; if (checks == 1) result = 0; return result; } /* * u6/u7 and u8/u9 are query/response extensions which most terminals support. * In particular, any ECMA-48 terminal should support these, though the details * for u9 are implementation dependent. */ #if defined(user6) && defined(user7) && defined(user8) && defined(user9) static void check_user_6789(TERMTYPE2 *tp) { /* * Check if the terminal is known to not */ #define NO_QUERY(longname,shortname) \ if (PRESENT(longname)) _nc_warning(#shortname " is not supported") if (tigetflag("NQ") > 0) { NO_QUERY(user6, u6); NO_QUERY(user7, u7); NO_QUERY(user8, u8); NO_QUERY(user9, u9); return; } PAIRED(user6, user7); PAIRED(user8, user9); if (strchr(tp->term_names, '+') != NULL) return; switch (guess_ANSI_VTxx(tp)) { case 1: if (!PRESENT(user8)) { _nc_warning("expected u8/u9 for device-attributes"); } /* FALLTHRU */ case 0: if (!PRESENT(user6)) { _nc_warning("expected u6/u7 for cursor-position"); } break; } } #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) { 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); } ncurses-6.4-20240113/progs/tty_settings.h0000644000000000000000000000552113615656212016512 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/progs/tparm_type.h0000644000000000000000000000551414414305440016130 0ustar rootroot/**************************************************************************** * 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 */ ncurses-6.4-20240113/progs/toe.c0000644000000000000000000004315514450056256014541 0ustar rootroot/**************************************************************************** * 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 * ****************************************************************************/ /* * toe.c --- table of entries report generator */ #include #include #if USE_HASHED_DB #include #endif MODULE_ID("$Id: toe.c,v 1.89 2023/07/01 17:04:46 tom Exp $") #define isDotname(name) (!strcmp(name, ".") || !strcmp(name, "..")) typedef struct { int db_index; unsigned long checksum; char *term_name; char *description; } TERMDATA; const char *_nc_progname; static TERMDATA *ptr_termdata; /* array of terminal data */ static size_t use_termdata; /* actual usage in ptr_termdata[] */ static size_t len_termdata; /* allocated size of ptr_termdata[] */ #if NO_LEAKS #undef ExitProgram static GCC_NORETURN void ExitProgram(int code); static void ExitProgram(int code) { _nc_free_entries(_nc_head); _nc_free_tic(code); } #endif static GCC_NORETURN void failed(const char *); static void failed(const char *msg) { perror(msg); ExitProgram(EXIT_FAILURE); } static char * strmalloc(const char *value) { char *result = strdup(value); if (result == 0) { failed("strmalloc"); } return result; } static TERMDATA * new_termdata(void) { size_t want = use_termdata + 1; if (want >= len_termdata) { len_termdata = (2 * want) + 10; ptr_termdata = typeRealloc(TERMDATA, len_termdata, ptr_termdata); if (ptr_termdata == 0) failed("ptr_termdata"); } return ptr_termdata + use_termdata++; } static int compare_termdata(const void *a, const void *b) { const TERMDATA *p = (const TERMDATA *) a; const TERMDATA *q = (const TERMDATA *) b; int result = strcmp(p->term_name, q->term_name); if (result == 0) { result = (p->db_index - q->db_index); } return result; } /* * Sort the array of TERMDATA and print it. If more than one database is being * reported, add a column to show which database has a given entry. */ static void show_termdata(int eargc, char **eargv) { if (use_termdata) { size_t n; if (eargc > 1) { int j; for (j = 0; j < eargc; ++j) { int k; for (k = 0; k <= j; ++k) { printf("--"); } printf("> "); printf("%s\n", eargv[j]); } } if (use_termdata > 1) qsort(ptr_termdata, use_termdata, sizeof(TERMDATA), compare_termdata); for (n = 0; n < use_termdata; ++n) { int nk = -1; /* * If there is more than one database, show how they differ. */ if (eargc > 1) { unsigned long check = 0; int k = 0; for (;;) { char mark = ((check == 0 || (check != ptr_termdata[n].checksum)) ? '*' : '+'); for (; k < ptr_termdata[n].db_index; ++k) { printf("--"); } /* * If this is the first entry, or its checksum differs * from the first entry's checksum, print "*". Otherwise * it looks enough like a duplicate to print "+". */ printf("%c-", mark); check = ptr_termdata[n].checksum; if (mark == '*' && nk < 0) nk = (int) n; ++k; if ((n + 1) >= use_termdata || strcmp(ptr_termdata[n].term_name, ptr_termdata[n + 1].term_name)) { break; } ++n; } for (; k < eargc; ++k) { printf("--"); } printf(":\t"); } if (nk < 0) nk = (int) n; (void) printf("%-10s\t%s\n", ptr_termdata[n].term_name, ptr_termdata[nk].description); } } } static void free_termdata(void) { if (ptr_termdata != 0) { while (use_termdata != 0) { --use_termdata; free(ptr_termdata[use_termdata].term_name); free(ptr_termdata[use_termdata].description); } free(ptr_termdata); ptr_termdata = 0; } use_termdata = 0; len_termdata = 0; } static char ** allocArgv(size_t count) { char **result = typeCalloc(char *, count + 1); if (result == 0) failed("realloc eargv"); assert(result != 0); return result; } static void freeArgv(char **argv) { if (argv) { int count = 0; while (argv[count]) { free(argv[count++]); } free(argv); } } #if USE_HASHED_DB static bool make_db_name(char *dst, const char *src, unsigned limit) { static const char suffix[] = DBM_SUFFIX; bool result = FALSE; size_t lens = sizeof(suffix) - 1; size_t size = strlen(src); size_t need = lens + size; if (need <= limit) { if (size >= lens && !strcmp(src + size - lens, suffix)) { _nc_STRCPY(dst, src, PATH_MAX); } else { _nc_SPRINTF(dst, _nc_SLIMIT(PATH_MAX) "%.*s%s", (int) (PATH_MAX - sizeof(suffix)), src, suffix); } result = TRUE; } return result; } #endif typedef void (DescHook) (int /* db_index */ , int /* db_limit */ , const char * /* term_name */ , TERMTYPE2 * /* term */ ); static const char * term_description(TERMTYPE2 *tp) { const char *desc; if (tp->term_names == 0 || (desc = strrchr(tp->term_names, '|')) == 0 || (*++desc == '\0')) { desc = "(No description)"; } return desc; } /* display a description for the type */ static void deschook(int db_index, int db_limit, const char *term_name, TERMTYPE2 *tp) { (void) db_index; (void) db_limit; (void) printf("%-10s\t%s\n", term_name, term_description(tp)); } static unsigned long string_sum(const char *value) { unsigned long result = 0; if ((intptr_t) value == (intptr_t) (-1)) { result = ~result; } else if (value) { while (*value) { result += UChar(*value); ++value; } } return result; } static unsigned long checksum_of(TERMTYPE2 *tp) { unsigned long result = string_sum(tp->term_names); unsigned i; for (i = 0; i < NUM_BOOLEANS(tp); i++) { result += (unsigned long) (tp->Booleans[i]); } for (i = 0; i < NUM_NUMBERS(tp); i++) { result += (unsigned long) (tp->Numbers[i]); } for (i = 0; i < NUM_STRINGS(tp); i++) { result += string_sum(tp->Strings[i]); } return result; } /* collect data, to sort before display */ static void sorthook(int db_index, int db_limit, const char *term_name, TERMTYPE2 *tp) { TERMDATA *data = new_termdata(); data->db_index = db_index; data->checksum = ((db_limit > 1) ? checksum_of(tp) : 0); data->term_name = strmalloc(term_name); data->description = strmalloc(term_description(tp)); } #if NCURSES_USE_TERMCAP /* * Check if the buffer contents are printable ASCII, ensuring that we do not * accidentally pick up incompatible binary content from a hashed database. */ static bool is_termcap(char *buffer) { bool result = TRUE; while (*buffer != '\0') { int ch = UChar(*buffer++); if (ch == '\t') continue; if (ch < ' ' || ch > '~') { result = FALSE; break; } } return result; } static void show_termcap(int db_index, int db_limit, char *buffer, DescHook hook) { TERMTYPE2 data; char *next = strchr(buffer, ':'); char *last; char *list = buffer; if (next) *next = '\0'; last = strrchr(buffer, '|'); if (last) ++last; memset(&data, 0, sizeof(data)); data.term_names = strmalloc(buffer); while ((next = strtok(list, "|")) != 0) { if (next != last) hook(db_index, db_limit, next, &data); list = 0; } free(data.term_names); } #endif #if NCURSES_USE_DATABASE static char * copy_entryname(DIRENT * src) { size_t len = NAMLEN(src); char *result = malloc(len + 1); if (result == 0) failed("copy entryname"); memcpy(result, src->d_name, len); result[len] = '\0'; return result; } #endif static int typelist(int eargc, char *eargv[], int verbosity, DescHook hook) /* apply a function to each entry in given terminfo directories */ { int i; for (i = 0; i < eargc; i++) { #if NCURSES_USE_DATABASE if (_nc_is_dir_path(eargv[i])) { char *cwd_buf = 0; DIR *termdir; DIRENT *subdir; if ((termdir = opendir(eargv[i])) == 0) { (void) fflush(stdout); (void) fprintf(stderr, "%s: can't open terminfo directory %s\n", _nc_progname, eargv[i]); continue; } if (verbosity) (void) printf("#\n#%s:\n#\n", eargv[i]); while ((subdir = readdir(termdir)) != 0) { size_t cwd_len; char *name_1; DIR *entrydir; DIRENT *entry; name_1 = copy_entryname(subdir); if (isDotname(name_1)) { free(name_1); continue; } cwd_len = NAMLEN(subdir) + strlen(eargv[i]) + 3; cwd_buf = typeRealloc(char, cwd_len, cwd_buf); if (cwd_buf == 0) failed("realloc cwd_buf"); assert(cwd_buf != 0); _nc_SPRINTF(cwd_buf, _nc_SLIMIT(cwd_len) "%s/%s/", eargv[i], name_1); free(name_1); if (chdir(cwd_buf) != 0) continue; entrydir = opendir("."); if (entrydir == 0) { perror(cwd_buf); continue; } while ((entry = readdir(entrydir)) != 0) { char *name_2; TERMTYPE2 lterm; char *cn; int status; name_2 = copy_entryname(entry); if (isDotname(name_2) || !_nc_is_file_path(name_2)) { free(name_2); continue; } status = _nc_read_file_entry(name_2, <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; 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); } ncurses-6.4-20240113/aclocal.m40000644000000000000000000111026714533217711014311 0ustar rootrootdnl*************************************************************************** dnl Copyright 2018-2022,2023 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.1062 2023/12/04 00:39:37 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: 11 updated: 2022/12/04 15:40:08 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: 2 updated: 2021/05/01 16:24:34 dnl ------------------------ dnl Show the version of libtool dnl dnl Save the version in a cache variable - this is not entirely a good thing, dnl but the version string from libtool is very ugly, and for bug reports it dnl might be useful to have the original string. dnl dnl There is an imitation in OpenBSD, which has no apparent use other than to dnl deny that it is GNU libtool. Just ignore it. AC_DEFUN([CF_CHECK_LIBTOOL_VERSION],[ if test -n "$LIBTOOL" && test "$LIBTOOL" != none then AC_MSG_CHECKING(version of $LIBTOOL) CF_LIBTOOL_VERSION AC_MSG_RESULT($cf_cv_libtool_version) if test -n "$cf_cv_libtool_version" then cf_check_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' -e 's,[[()]],...,g' -e 's,[[ ]],-,g' -e '2,$d'` case "x$cf_check_libtool_version" in (*...GNU-libtool...*) ;; (*) AC_MSG_ERROR(This is not GNU libtool) ;; esac else AC_MSG_ERROR(No version found for $LIBTOOL) fi else AC_MSG_ERROR(GNU libtool has not been found) fi ])dnl dnl --------------------------------------------------------------------------- dnl CF_CHECK_WCHAR_H version: 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: 2 updated: 2023/02/25 08:45:56 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],[ AC_CACHE_CHECK(for clock_gettime,cf_cv_func_clock_gettime,[ AC_TRY_LINK([#include ], [struct timespec ts; int rc = clock_gettime(CLOCK_REALTIME, &ts); (void) rc; (void)ts], [cf_cv_func_clock_gettime=yes], [cf_cv_func_clock_gettime=no]) ]) 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_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_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: 1 updated: 2013/04/06 18:03:09 dnl ------------------ AC_DEFUN([CF_LIBTOOL_VERSION],[ if test -n "$LIBTOOL" && test "$LIBTOOL" != none then cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([[^)]]*)//g' -e 's/^[[^1-9]]*//' -e 's/[[^0-9.]].*//'` else cf_cv_libtool_version= fi test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version ])dnl dnl --------------------------------------------------------------------------- dnl CF_LIB_PREFIX version: 14 updated: 2021/01/01 13:31:04 dnl ------------- dnl Compute the library-prefix for the given host system dnl $1 = variable to set define([CF_LIB_PREFIX], [ case "$cf_cv_system_name" in (OS/2*|os2*) if test "$DFT_LWR_MODEL" = libtool; then LIB_PREFIX='lib' else LIB_PREFIX='' fi ;; (*-msvc*) LIB_PREFIX='' ;; (*) LIB_PREFIX='lib' ;; esac ifelse($1,,,[$1=$LIB_PREFIX]) AC_SUBST(LIB_PREFIX) ])dnl dnl --------------------------------------------------------------------------- dnl CF_LIB_RULES version: 100 updated: 2023/06/03 15:17:30 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 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: 18 updated: 2023/05/19 18:35:02 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= 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 ;; (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) ])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: 58 updated: 2023/07/28 20:13:29 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_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: 18 updated: 2020/12/31 18:40:20 dnl -------------- dnl Check the argument to see that it looks like a pathname. Rewrite it if it dnl begins with one of the prefix/exec_prefix variables, and then again if the dnl result begins with 'NONE'. This is necessary to work around autoconf's dnl delayed evaluation of those symbols. AC_DEFUN([CF_PATH_SYNTAX],[ if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".[$]$1" in (.\[$]\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[[a-zA-Z]]:[[\\/]]*) # OS/2 EMX ;; (.\[$]\{*prefix\}*|.\[$]\{*dir\}*) eval $1="[$]$1" case ".[$]$1" in (.NONE/*) $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` ;; (*) ifelse([$2],,[AC_MSG_ERROR([expected a pathname, not \"[$]$1\"])],$2) ;; esac ])dnl dnl --------------------------------------------------------------------------- dnl CF_PKG_CONFIG version: 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: 10 updated: 2021/01/04 19:33:05 dnl --------------- dnl Force $INSTALL to be an absolute-path. Otherwise, edit_man.sh and the dnl misc/tabset install won't work properly. Usually this happens only when dnl using the fallback mkinstalldirs script AC_DEFUN([CF_PROG_INSTALL], [AC_PROG_INSTALL case $INSTALL in (/*) ;; (*) CF_DIRNAME(cf_dir,$INSTALL) test -z "$cf_dir" && cf_dir=. INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" ;; esac ])dnl dnl --------------------------------------------------------------------------- dnl CF_PROG_LDCONFIG version: 5 updated: 2015/04/18 08:56:57 dnl ---------------- dnl Check for ldconfig, needed to fixup shared libraries that would be built dnl and then used in the install. AC_DEFUN([CF_PROG_LDCONFIG],[ if test "$cross_compiling" = yes ; then LDCONFIG=: else case "$cf_cv_system_name" in (dragonfly*|mirbsd*|freebsd*) test -z "$LDCONFIG" && LDCONFIG="/sbin/ldconfig -R" ;; (*) LDPATH=$PATH:/sbin:/usr/sbin AC_PATH_PROG(LDCONFIG,ldconfig,,$LDPATH) ;; esac fi AC_SUBST(LDCONFIG) ])dnl dnl --------------------------------------------------------------------------- dnl CF_PROG_LINT version: 5 updated: 2022/08/20 15:44:13 dnl ------------ AC_DEFUN([CF_PROG_LINT], [ AC_CHECK_PROGS(LINT, lint cppcheck splint) case "x$LINT" in (xcppcheck|x*/cppcheck) test -z "$LINT_OPTS" && LINT_OPTS="--enable=all" ;; esac AC_SUBST(LINT_OPTS) AC_SUBST(LINT_LIBS) ])dnl dnl --------------------------------------------------------------------------- dnl CF_PROG_LN_S version: 2 updated: 2010/08/14 18:25:37 dnl ------------ dnl Combine checks for "ln -s" and "ln -sf", updating $LN_S to include "-f" dnl option if it is supported. AC_DEFUN([CF_PROG_LN_S],[ AC_PROG_LN_S AC_MSG_CHECKING(if $LN_S -f options work) rm -f conf$$.src conf$$dst echo >conf$$.dst echo first >conf$$.src if $LN_S -f conf$$.src conf$$.dst 2>/dev/null; then cf_prog_ln_sf=yes else cf_prog_ln_sf=no fi rm -f conf$$.dst conf$$src AC_MSG_RESULT($cf_prog_ln_sf) test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f" ])dnl dnl --------------------------------------------------------------------------- dnl CF_REGEX version: 18 updated: 2021/01/01 16:53:59 dnl -------- dnl Attempt to determine if we've got one of the flavors of regular-expression dnl code that we can support. AC_DEFUN([CF_REGEX], [ cf_regex_func=no cf_regex_libs= case "$host_os" in (mingw*) # -lsystre -ltre -lintl -liconv AC_CHECK_LIB(systre,regcomp,[ AC_CHECK_LIB(iconv,libiconv_open,[CF_ADD_LIB(iconv)]) AC_CHECK_LIB(intl,libintl_gettext,[CF_ADD_LIB(intl)]) AC_CHECK_LIB(tre,tre_regcomp,[CF_ADD_LIB(tre)]) CF_ADD_LIB(systre) cf_regex_func=regcomp ],[ AC_CHECK_LIB(gnurx,regcomp,[ CF_ADD_LIB(gnurx) cf_regex_func=regcomp]) ]) ;; (*) cf_regex_libs="regex re" AC_CHECK_FUNC(regcomp,[cf_regex_func=regcomp],[ for cf_regex_lib in $cf_regex_libs do AC_CHECK_LIB($cf_regex_lib,regcomp,[ CF_ADD_LIB($cf_regex_lib) cf_regex_func=regcomp break]) done ]) ;; esac if test "$cf_regex_func" = no ; then AC_CHECK_FUNC(compile,[cf_regex_func=compile],[ AC_CHECK_LIB(gen,compile,[ CF_ADD_LIB(gen) cf_regex_func=compile])]) fi if test "$cf_regex_func" = no ; then AC_MSG_WARN(cannot find regular expression library) fi AC_CACHE_CHECK(for regular-expression headers,cf_cv_regex_hdrs,[ cf_cv_regex_hdrs=no case "$cf_regex_func" in (compile) for cf_regex_hdr in regexp.h regexpr.h do AC_TRY_LINK([#include <$cf_regex_hdr>],[ char *p = compile("", "", "", 0); int x = step("", ""); (void)p; (void)x; ],[ cf_cv_regex_hdrs=$cf_regex_hdr break ]) done ;; (*) for cf_regex_hdr in regex.h do AC_TRY_LINK([#include #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: 109 updated: 2023/12/03 09:21:34 dnl -------------- dnl -------------- dnl Attempt to determine the appropriate CC/LD options for creating a shared dnl library. dnl dnl Notes: dnl a) ${LOCAL_LDFLAGS} is used to link executables that will run within dnl the build-tree, i.e., by making use of the libraries that are compiled in dnl $rel_builddir/lib We avoid compiling-in a $rel_builddir/lib path for the dnl shared library since that can lead to unexpected results at runtime. dnl b) ${LOCAL_LDFLAGS2} has the same intention but assumes that the shared dnl libraries are compiled in ../../lib dnl dnl The variable 'cf_cv_do_symlinks' is used to control whether we configure dnl to install symbolic links to the rel/abi versions of shared libraries. dnl dnl The variable 'cf_cv_shlib_version' controls whether we use the rel or abi dnl version when making symbolic links. dnl dnl The variable 'cf_cv_shlib_version_infix' controls whether shared library dnl version numbers are infix (ex: libncurses..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 -h '$cf_cv_shared_soname' -o $[@]' else MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -h '$cf_cv_shared_soname' -o $[@]' fi ;; (sysv5uw7*|unix_sv*) # tested with UnixWare 7.1.0 (gcc 2.95.2 and cc) if test "$GCC" != yes; then CC_SHARED_OPTS='-KPIC' fi MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o [$]@' ;; (*) CC_SHARED_OPTS='unknown' MK_SHARED_LIB='echo unknown' ;; esac # This works if the last tokens in $MK_SHARED_LIB are the -o target. case "$cf_cv_shlib_version" in (rel|abi) case "$MK_SHARED_LIB" in (*'-o $[@]') test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes ;; (*) AC_MSG_WARN(ignored --with-shlib-version) ;; esac ;; esac if test -n "$cf_try_cflags" then cat > conftest.$ac_ext < 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: 10 updated: 2023/01/11 04:05:23 dnl ----------- dnl Check for multibyte support, and if not found, utf8 compatibility library AC_DEFUN([CF_UTF8_LIB], [ AC_HAVE_HEADERS(wchar.h) AC_CACHE_CHECK(for multibyte character support,cf_cv_utf8_lib,[ cf_save_LIBS="$LIBS" AC_TRY_LINK([ $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: 8 updated: 2021/01/01 13:31:04 dnl --------------- dnl Define several useful symbols derived from the VERSION file. A separate dnl file is preferred to embedding the version numbers in various scripts. dnl (automake is a textbook-example of why the latter is a bad idea, but there dnl are others). dnl dnl The file contents are: dnl libtool-version release-version patch-version dnl or dnl release-version dnl where dnl libtool-version (see ?) consists of 3 integers separated by '.' dnl release-version consists of a major version and minor version dnl separated by '.', optionally followed by a patch-version dnl separated by '-'. The minor version need not be an dnl integer (but it is preferred). dnl patch-version is an integer in the form yyyymmdd, so ifdef's and dnl scripts can easily compare versions. dnl dnl If libtool is used, the first form is required, since CF_WITH_LIBTOOL dnl simply extracts the first field using 'cut -f1'. dnl dnl Optional parameters: dnl $1 = internal name for package dnl $2 = external name for package AC_DEFUN([CF_VERSION_INFO], [ if test -f "$srcdir/VERSION" ; then AC_MSG_CHECKING(for package version) # if there are not enough fields, cut returns the last one... cf_field1=`sed -e '2,$d' "$srcdir/VERSION" |cut -f1` cf_field2=`sed -e '2,$d' "$srcdir/VERSION" |cut -f2` cf_field3=`sed -e '2,$d' "$srcdir/VERSION" |cut -f3` # this is how CF_BUNDLED_INTL uses $VERSION: VERSION="$cf_field1" VERSION_MAJOR=`echo "$cf_field2" | sed -e 's/\..*//'` test -z "$VERSION_MAJOR" && AC_MSG_ERROR(missing major-version) VERSION_MINOR=`echo "$cf_field2" | sed -e 's/^[[^.]]*\.//' -e 's/-.*//'` test -z "$VERSION_MINOR" && AC_MSG_ERROR(missing minor-version) AC_MSG_RESULT(${VERSION_MAJOR}.${VERSION_MINOR}) AC_MSG_CHECKING(for package patch date) VERSION_PATCH=`echo "$cf_field3" | sed -e 's/^[[^-]]*-//'` case .$VERSION_PATCH in (.) AC_MSG_ERROR(missing patch-date $VERSION_PATCH) ;; (.[[0-9]][[0-9]][[0-9]][[0-9]][[0-9]][[0-9]][[0-9]][[0-9]]) ;; (*) AC_MSG_ERROR(illegal patch-date $VERSION_PATCH) ;; esac AC_MSG_RESULT($VERSION_PATCH) else AC_MSG_ERROR(did not find $srcdir/VERSION) fi # show the actual data that we have for versions: CF_VERBOSE(ABI VERSION $VERSION) CF_VERBOSE(VERSION_MAJOR $VERSION_MAJOR) CF_VERBOSE(VERSION_MINOR $VERSION_MINOR) CF_VERBOSE(VERSION_PATCH $VERSION_PATCH) AC_SUBST(VERSION) AC_SUBST(VERSION_MAJOR) AC_SUBST(VERSION_MINOR) AC_SUBST(VERSION_PATCH) dnl if a package name is given, define its corresponding version info. We dnl need the package name to ensure that the defined symbols are unique. ifelse($1,,,[ cf_PACKAGE=$1 PACKAGE=ifelse($2,,$1,$2) AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE",[Define to the package-name]) AC_SUBST(PACKAGE) CF_UPPER(cf_PACKAGE,$cf_PACKAGE) AC_DEFINE_UNQUOTED(${cf_PACKAGE}_VERSION,"${VERSION_MAJOR}.${VERSION_MINOR}") AC_DEFINE_UNQUOTED(${cf_PACKAGE}_PATCHDATE,${VERSION_PATCH}) ]) ])dnl dnl --------------------------------------------------------------------------- dnl CF_WCHAR_TYPE version: 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_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: 23 updated: 2023/11/22 20:48:30 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],[ 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/*\ *) PKG_CONFIG_LIBDIR= ;; (x/*) PKG_CONFIG_LIBDIR="$cf_search_path" AC_MSG_RESULT($PKG_CONFIG_LIBDIR) cf_search_path= ;; (xyes|xauto) AC_MSG_RESULT(auto) cf_search_path= # Look for the library directory using the same prefix as the executable AC_MSG_CHECKING(for search-list) if test "x$PKG_CONFIG" != xnone then # works for pkg-config since version 0.24 (2009) # works for pkgconf since version 0.8.3 (2012) for cf_pkg_program in \ `echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \ pkg-config \ pkgconf do cf_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null | tr : ' '` test -n "$cf_search_path" && break done # works for pkg-config since import in 2005 of original 2001 HP code. test -z "$cf_search_path" && \ cf_search_path=` "$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\ /^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \ sub(\"^[[^']]*'\",\"\"); \ sub(\"'.*\",\"\"); \ printf \" %s\", \\[$]0; } \ { next; } \ "` fi AC_MSG_RESULT($cf_search_path) ;; (*) AC_MSG_ERROR(Unexpected option value: $cf_search_path) ;; esac if test -n "$cf_search_path" then AC_MSG_CHECKING(for first directory) cf_pkg_config_path=none for cf_config in $cf_search_path do if test -d "$cf_config" then cf_pkg_config_path=$cf_config break fi done AC_MSG_RESULT($cf_pkg_config_path) if test "x$cf_pkg_config_path" != xnone ; then # limit this to the first directory found PKG_CONFIG_LIBDIR="$cf_pkg_config_path" fi if test -z "$PKG_CONFIG_LIBDIR" && test -n "$cf_search_path" then AC_MSG_CHECKING(for workaround) if test "$prefix" = "NONE" ; then cf_prefix="$ac_default_prefix" else cf_prefix="$prefix" fi eval cf_libdir=$libdir cf_libdir=`echo "$cf_libdir" | sed -e "s,^NONE,$cf_prefix,"` cf_backup= for cf_config in $cf_search_path do case $cf_config in $cf_libdir/pkgconfig) PKG_CONFIG_LIBDIR=$cf_libdir/pkgconfig break ;; *) test -z "$cf_backup" && cf_backup=$cf_config ;; esac done test -z "$PKG_CONFIG_LIBDIR" && PKG_CONFIG_LIBDIR=$cf_backup AC_MSG_RESULT($PKG_CONFIG_LIBDIR) fi fi AC_SUBST(PKG_CONFIG_LIBDIR) ])dnl dnl --------------------------------------------------------------------------- dnl CF_WITH_PTHREAD version: 7 updated: 2015/04/18 08:56:57 dnl --------------- dnl Check for POSIX thread library. AC_DEFUN([CF_WITH_PTHREAD], [ AC_MSG_CHECKING(if you want to link with the pthread library) AC_ARG_WITH(pthread, [ --with-pthread use POSIX thread library], [with_pthread=$withval], [with_pthread=no]) AC_MSG_RESULT($with_pthread) if test "$with_pthread" != no ; then AC_CHECK_HEADER(pthread.h,[ AC_DEFINE(HAVE_PTHREADS_H,1,[Define to 1 if we have pthreads.h header]) for cf_lib_pthread in pthread c_r do AC_MSG_CHECKING(if we can link with the $cf_lib_pthread library) cf_save_LIBS="$LIBS" CF_ADD_LIB($cf_lib_pthread) AC_TRY_LINK([ #include ],[ 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: 13 updated: 2023/12/03 09:24:04 dnl ---------------------- dnl Use this when building shared library with ELF, to markup symbols with the dnl version identifier from the given input file. Generally that identifier is dnl the same as the SONAME at which the symbol was first introduced. dnl dnl $1 = basename of the ".map" file (default $PACKAGE) AC_DEFUN([CF_WITH_VERSIONED_SYMS], [AC_REQUIRE([AC_PROG_FGREP])dnl AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING(if versioned-symbols file should be used) AC_ARG_WITH(versioned-syms, [[ --with-versioned-syms[=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/*) 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 ]) ncurses-6.4-20240113/configure0000755000000000000000000315466714535120411014366 0ustar rootroot#! /bin/sh # From configure.in Revision: 1.773 . # Guess values for system-dependent variables and create Makefiles. # Generated by Autoconf 2.52.20230903. # # 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 ;; -*) { 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:1076: 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:1087: 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:1095: 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:1111: 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:1115: 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:1121: 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:1123: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:1125: 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:1144: 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:1146: 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:1175: PATH=\".;.\"; conftest.sh") >&5 (PATH=".;."; conftest.sh) 2>&5 ac_status=$? echo "$as_me:1178: \$? = $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:1195: 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:1210: found $ac_dir/$ac_word" >&5 break done fi fi GREP=$ac_cv_prog_GREP if test -n "$GREP"; then echo "$as_me:1218: result: $GREP" >&5 echo "${ECHO_T}$GREP" >&6 else echo "$as_me:1221: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$GREP" && break done test -n "$GREP" || GREP=": " echo "$as_me:1229: 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:1241: 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:1258: found $ac_dir/$ac_word" >&5 break fi done ;; esac fi EGREP=$ac_cv_path_EGREP if test -n "$EGREP"; then echo "$as_me:1269: result: $EGREP" >&5 echo "${ECHO_T}$EGREP" >&6 else echo "$as_me:1272: 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:1280: error: cannot find workable egrep" >&5 echo "$as_me: error: cannot find workable egrep" >&2;} { (exit 1); exit 1; }; } fi fi echo "$as_me:1285: 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:1296: 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:1300: 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:1312: 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:1317: error: missing minor-version" >&5 echo "$as_me: error: missing minor-version" >&2;} { (exit 1); exit 1; }; } echo "$as_me:1321: result: ${VERSION_MAJOR}.${VERSION_MINOR}" >&5 echo "${ECHO_T}${VERSION_MAJOR}.${VERSION_MINOR}" >&6 echo "$as_me:1324: 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:1329: 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:1336: 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:1341: result: $VERSION_PATCH" >&5 echo "${ECHO_T}$VERSION_PATCH" >&6 else { { echo "$as_me:1344: 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}:1352: testing ABI VERSION $VERSION ..." 1>&5 test -n "$verbose" && echo " VERSION_MAJOR $VERSION_MAJOR" 1>&6 echo "${as_me:-configure}:1356: testing VERSION_MAJOR $VERSION_MAJOR ..." 1>&5 test -n "$verbose" && echo " VERSION_MINOR $VERSION_MINOR" 1>&6 echo "${as_me:-configure}:1360: testing VERSION_MINOR $VERSION_MINOR ..." 1>&5 test -n "$verbose" && echo " VERSION_PATCH $VERSION_PATCH" 1>&6 echo "${as_me:-configure}:1364: testing VERSION_PATCH $VERSION_PATCH ..." 1>&5 cf_PACKAGE=NCURSES 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:1402: 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:1408: 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:1418: 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:1424: 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:1437: 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:1456: 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:1462: 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:1495: 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:1505: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:1509: 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:1518: 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:1522: 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:1527: 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:1534: 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:1543: 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:1548: 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:1556: 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:1565: 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:1570: 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:1602: 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:1606: 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:1608: 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:1616: 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:1627: 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:1639: 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:1656: found $ac_dir/$ac_word" >&5 break fi done ;; esac fi FGREP=$ac_cv_path_FGREP if test -n "$FGREP"; then echo "$as_me:1667: result: $FGREP" >&5 echo "${ECHO_T}$FGREP" >&6 else echo "$as_me:1670: 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:1678: error: cannot find workable fgrep" >&5 echo "$as_me: error: cannot find workable fgrep" >&2;} { (exit 1); exit 1; }; } fi fi echo "$as_me:1683: result: $ac_cv_path_FGREP" >&5 echo "${ECHO_T}$ac_cv_path_FGREP" >&6 FGREP="$ac_cv_path_FGREP" echo "$as_me:1687: 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:1699: result: $prefix" >&5 echo "${ECHO_T}$prefix" >&6 if test "x$prefix" = "xNONE" ; then echo "$as_me:1703: 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:1726: 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:1791: 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:1797: 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:1804: 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; if test "x$cf_with_ada" = xyes then cf_prog_cc="gnatgcc gcc cc" else cf_prog_cc="gcc cc" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_main_return="return" if test -n "$ac_tool_prefix"; then for ac_prog in $cf_prog_cc do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:1839: 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:1854: found $ac_dir/$ac_word" >&5 break done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:1862: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:1865: 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:1878: 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:1893: 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:1901: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:1904: 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:1914: 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:1919:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo "$2"` { (eval echo "$as_me:1922: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:1925: \$? = $ac_status" >&5 (exit "$ac_status"); } { (eval echo "$as_me:1927: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:1930: \$? = $ac_status" >&5 (exit "$ac_status"); } { (eval echo "$as_me:1932: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:1935: \$? = $ac_status" >&5 (exit "$ac_status"); } cat >"conftest.$ac_ext" <<_ACEOF #line 1939 "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:1955: 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:1958: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:1961: \$? = $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:1984: 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:1990: 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:1995: 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:2001: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2004: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:2011: 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:2019: 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:2026: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:2028: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:2031: checking for executable suffix" >&5 echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6 if { (eval echo "$as_me:2033: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:2036: \$? = $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:2052: 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:2058: 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:2064: 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 2070 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:2082: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2085: \$? = $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:2097: 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:2104: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:2108: 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 2114 "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:2129: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2132: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:2135: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2138: \$? = $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:2150: 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:2156: 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 2162 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:2174: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2177: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:2180: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2183: \$? = $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:2193: 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:2220: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2223: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:2226: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2229: \$? = $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 2241 "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:2254: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2257: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:2260: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2263: \$? = $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 2273 "configure" #include "confdefs.h" $ac_declaration int main (void) { exit (42); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:2285: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2288: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:2291: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2294: \$? = $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:2324: 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:2328: 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:2337: 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 2342 "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:2359: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2362: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:2365: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2368: \$? = $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:2379: result: $INTEL_COMPILER" >&5 echo "${ECHO_T}$INTEL_COMPILER" >&6 ;; esac fi CLANG_COMPILER=no if test "$GCC" = yes ; then echo "$as_me:2388: 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 2392 "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:2409: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2412: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:2415: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2418: \$? = $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:2428: 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:2437: 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:2444: 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:2448: 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:2455: 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 2460 "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:2474: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:2477: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:2480: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2483: \$? = $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:2494: 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}:2500: testing adding option $cf_clang_opt ..." 1>&5 test -n "$CFLAGS" && CFLAGS="$CFLAGS " CFLAGS="${CFLAGS}$cf_clang_opt" fi done fi echo "$as_me:2509: 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 2517 "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:2564: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2567: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:2570: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2573: \$? = $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:2590: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:2593: 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:2601: checking \$CFLAGS variable" >&5 echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6 case "x$CFLAGS" in (*-[IUD]*) echo "$as_me:2605: result: broken" >&5 echo "${ECHO_T}broken" >&6 { echo "$as_me:2607: 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:2715: result: ok" >&5 echo "${ECHO_T}ok" >&6 ;; esac echo "$as_me:2720: checking \$CC variable" >&5 echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6 case "$CC" in (*[\ \ ]-*) echo "$as_me:2724: result: broken" >&5 echo "${ECHO_T}broken" >&6 { echo "$as_me:2726: 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}:2843: testing resulting CC: '$CC' ..." 1>&5 test -n "$verbose" && echo " resulting CFLAGS: '$CFLAGS'" 1>&6 echo "${as_me:-configure}:2847: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5 test -n "$verbose" && echo " resulting CPPFLAGS: '$CPPFLAGS'" 1>&6 echo "${as_me:-configure}:2851: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5 ;; (*) echo "$as_me:2855: result: ok" >&5 echo "${ECHO_T}ok" >&6 ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_main_return="return" echo "$as_me:2866: 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 2887 "configure" #include "confdefs.h" #include Syntax error _ACEOF if { (eval echo "$as_me:2892: \"$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:2898: \$? = $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 2921 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:2925: \"$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:2931: \$? = $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:2968: 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 2978 "configure" #include "confdefs.h" #include Syntax error _ACEOF if { (eval echo "$as_me:2983: \"$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:2989: \$? = $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 3012 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:3016: \"$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:3022: \$? = $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:3050: 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:3063: 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 3070 "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 3085 "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:3098: 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:3105: 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:3123: \$? = $ac_status" >&5 (exit "$ac_status"); } && test -f conftest2.$ac_objext && { (eval echo "$as_me:3125: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3128: \$? = $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:3139: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:3142: 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:3156: 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:3173: found $ac_dir/$ac_word" >&5 break fi done ;; esac fi LDCONFIG=$ac_cv_path_LDCONFIG if test -n "$LDCONFIG"; then echo "$as_me:3184: result: $LDCONFIG" >&5 echo "${ECHO_T}$LDCONFIG" >&6 else echo "$as_me:3187: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; esac fi echo "$as_me:3195: 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:3205: 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:3223: 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:3238: found $ac_dir/$ac_word" >&5 break done fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then echo "$as_me:3246: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:3249: 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:3262: 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:3277: 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:3285: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6 else echo "$as_me:3288: 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:3300:" \ "checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:3303: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:3306: \$? = $ac_status" >&5 (exit "$ac_status"); } { (eval echo "$as_me:3308: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:3311: \$? = $ac_status" >&5 (exit "$ac_status"); } { (eval echo "$as_me:3313: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:3316: \$? = $ac_status" >&5 (exit "$ac_status"); } echo "$as_me:3319: 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 3325 "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:3340: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:3343: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:3346: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3349: \$? = $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:3361: 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:3367: 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 3373 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:3385: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:3388: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:3391: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3394: \$? = $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:3404: 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 3431 "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:3444: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:3447: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:3450: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3453: \$? = $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 3463 "configure" #include "confdefs.h" $ac_declaration int main (void) { exit (42); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:3475: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:3478: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:3481: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3484: \$? = $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:3518: 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 3526 "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:3543: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:3546: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:3549: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3552: \$? = $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:3563: result: $cf_cxx_works" >&5 echo "${ECHO_T}$cf_cxx_works" >&6 if test "x$cf_cxx_works" = xno then { echo "$as_me:3567: 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:3583: 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:3600: found $ac_dir/$ac_word" >&5 break fi done ;; esac fi CXX=$ac_cv_path_CXX if test -n "$CXX"; then echo "$as_me:3611: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:3614: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi case "x$CXX" in (x|xg++) { echo "$as_me:3621: 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:3630: 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:3638: 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:3646: WARNING: templates do not work" >&5 echo "$as_me: WARNING: templates do not work" >&2;} ;; esac echo "$as_me:3651: 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:3661: result: $cf_with_cxx_binding" >&5 echo "${ECHO_T}$cf_with_cxx_binding" >&6 echo "$as_me:3664: 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:3666: result: $cf_with_ada" >&5 echo "${ECHO_T}$cf_with_ada" >&6 echo "$as_me:3669: 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:3679: result: $cf_with_db_install" >&5 echo "${ECHO_T}$cf_with_db_install" >&6 echo "$as_me:3682: 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:3692: result: $cf_with_manpages" >&5 echo "${ECHO_T}$cf_with_manpages" >&6 echo "$as_me:3695: 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:3705: result: $cf_with_progs" >&5 echo "${ECHO_T}$cf_with_progs" >&6 echo "$as_me:3708: 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:3718: result: $cf_with_tests" >&5 echo "${ECHO_T}$cf_with_tests" >&6 echo "$as_me:3721: 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:3731: 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:3755: 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:3770: found $ac_dir/$ac_word" >&5 break done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:3778: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:3781: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done test -z "$AWK" && { { echo "$as_me:3788: error: No awk program found" >&5 echo "$as_me: error: No awk program found" >&2;} { (exit 1); exit 1; }; } # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:3804: 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:3853: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' case $INSTALL in (/*) ;; (*) cf_dir=`echo "$INSTALL" | sed -e 's%/[^/]*$%%'` test -z "$cf_dir" && cf_dir=. INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" ;; esac for ac_prog in lint cppcheck splint do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:3878: 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:3893: found $ac_dir/$ac_word" >&5 break done fi fi LINT=$ac_cv_prog_LINT if test -n "$LINT"; then echo "$as_me:3901: result: $LINT" >&5 echo "${ECHO_T}$LINT" >&6 else echo "$as_me:3904: 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:3917: 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:3921: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:3924: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6 fi echo "$as_me:3928: 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:3940: 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:3945: 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:3984: 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:4003: 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:4013: 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:4023: 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:4035: 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:4052: 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:4063: result: $PKG_CONFIG" >&5 echo "${ECHO_T}$PKG_CONFIG" >&6 else echo "$as_me:4066: 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:4075: 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:4092: 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:4104: result: $ac_pt_PKG_CONFIG" >&5 echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6 else echo "$as_me:4107: result: no" >&5 echo "${ECHO_T}no" >&6 fi PKG_CONFIG=$ac_pt_PKG_CONFIG else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi ;; (*) PKG_CONFIG=$withval ;; esac test -z "$PKG_CONFIG" && PKG_CONFIG=none if test "$PKG_CONFIG" != none ; then if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$PKG_CONFIG" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval PKG_CONFIG="$PKG_CONFIG" case ".$PKG_CONFIG" in (.NONE/*) PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:4150: 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:4157: 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:4163: checking for pkg-config library directory" >&5 echo $ECHO_N "checking for pkg-config library directory... $ECHO_C" >&6 ;; (*) echo "$as_me:4167: 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:4194: result: $PKG_CONFIG_LIBDIR" >&5 echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 cf_search_path= ;; (x) ;; (x/*\ *) PKG_CONFIG_LIBDIR= ;; (x/*) PKG_CONFIG_LIBDIR="$cf_search_path" echo "$as_me:4205: result: $PKG_CONFIG_LIBDIR" >&5 echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 cf_search_path= ;; (xyes|xauto) echo "$as_me:4210: 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:4214: checking for search-list" >&5 echo $ECHO_N "checking for search-list... $ECHO_C" >&6 if test "x$PKG_CONFIG" != xnone then # works for pkg-config since version 0.24 (2009) # works for pkgconf since version 0.8.3 (2012) for cf_pkg_program in \ `echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \ pkg-config \ pkgconf do cf_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null | tr : ' '` test -n "$cf_search_path" && break done # works for pkg-config since import in 2005 of original 2001 HP code. test -z "$cf_search_path" && \ cf_search_path=` "$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\ /^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \ sub(\"^[^']*'\",\"\"); \ sub(\"'.*\",\"\"); \ printf \" %s\", \\$0; } \ { next; } \ "` fi echo "$as_me:4241: result: $cf_search_path" >&5 echo "${ECHO_T}$cf_search_path" >&6 ;; (*) { { echo "$as_me:4245: 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:4253: 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:4264: 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:4274: 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:4297: result: $PKG_CONFIG_LIBDIR" >&5 echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 fi fi if test "x$PKG_CONFIG" != xnone then echo "$as_me:4304: 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:4307: 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:4318: 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:4326: WARNING: no PKG_CONFIG_LIBDIR was found" >&5 echo "$as_me: WARNING: no PKG_CONFIG_LIBDIR was found" >&2;} ;; (*) cf_pkg_config_libdir="$PKG_CONFIG_LIBDIR" if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$cf_pkg_config_libdir" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval cf_pkg_config_libdir="$cf_pkg_config_libdir" case ".$cf_pkg_config_libdir" in (.NONE/*) cf_pkg_config_libdir=`echo "$cf_pkg_config_libdir" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) cf_pkg_config_libdir=`echo "$cf_pkg_config_libdir" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:4357: 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:4371: 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:4386: result: $PC_MODULE_SUFFIX" >&5 echo "${ECHO_T}$PC_MODULE_SUFFIX" >&6 test "$PC_MODULE_SUFFIX" = none && PC_MODULE_SUFFIX= fi echo "$as_me:4392: 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:4402: result: $enable_mixedcase" >&5 echo "${ECHO_T}$enable_mixedcase" >&6 if test "$enable_mixedcase" = "auto" ; then echo "$as_me:4406: 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:4433: 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:4452: 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:4472: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:4476: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi echo "$as_me:4481: 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:4536: 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:4547: 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:4562: found $ac_dir/$ac_word" >&5 break done fi fi CTAGS=$ac_cv_prog_CTAGS if test -n "$CTAGS"; then echo "$as_me:4570: result: $CTAGS" >&5 echo "${ECHO_T}$CTAGS" >&6 else echo "$as_me:4573: 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:4584: 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:4599: found $ac_dir/$ac_word" >&5 break done fi fi ETAGS=$ac_cv_prog_ETAGS if test -n "$ETAGS"; then echo "$as_me:4607: result: $ETAGS" >&5 echo "${ECHO_T}$ETAGS" >&6 else echo "$as_me:4610: 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:4619: 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:4634: 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:4643: result: $MAKE_LOWER_TAGS" >&5 echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6 else echo "$as_me:4646: 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:4653: 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:4668: 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:4677: result: $MAKE_UPPER_TAGS" >&5 echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6 else echo "$as_me:4680: 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:4700: 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}:4730: testing given option \"$cf_option\",no match \"$cf_result\" ..." 1>&5 ;; esac done rm -f cf_makeflags.tmp fi echo "$as_me:4738: 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:4744: 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:4759: found $ac_dir/$ac_word" >&5 break done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:4767: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:4770: 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:4779: 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:4794: 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:4803: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:4806: 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:4818: 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:4833: found $ac_dir/$ac_word" >&5 break done fi fi LD=$ac_cv_prog_LD if test -n "$LD"; then echo "$as_me:4841: result: $LD" >&5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:4844: 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:4853: 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:4868: 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:4877: result: $ac_ct_LD" >&5 echo "${ECHO_T}$ac_ct_LD" >&6 else echo "$as_me:4880: 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:4892: 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:4907: found $ac_dir/$ac_word" >&5 break done fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then echo "$as_me:4915: result: $AR" >&5 echo "${ECHO_T}$AR" >&6 else echo "$as_me:4918: 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:4927: 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:4942: 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:4951: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6 else echo "$as_me:4954: 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:4966: 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:4981: found $ac_dir/$ac_word" >&5 break done fi fi NM=$ac_cv_prog_NM if test -n "$NM"; then echo "$as_me:4989: result: $NM" >&5 echo "${ECHO_T}$NM" >&6 else echo "$as_me:4992: 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:5001: 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:5016: 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:5025: result: $ac_ct_NM" >&5 echo "${ECHO_T}$ac_ct_NM" >&6 else echo "$as_me:5028: 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:5040: 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:5055: found $ac_dir/$ac_word" >&5 break done fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then echo "$as_me:5063: result: $AR" >&5 echo "${ECHO_T}$AR" >&6 else echo "$as_me:5066: 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:5075: 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:5090: 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:5099: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6 else echo "$as_me:5102: result: no" >&5 echo "${ECHO_T}no" >&6 fi AR=$ac_ct_AR else AR="$ac_cv_prog_AR" fi echo "$as_me:5111: 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:5154: \$? = $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}:5165: 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:5175: 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:5186: 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:5199: result: ${DESTDIR:-(none)}" >&5 echo "${ECHO_T}${DESTDIR:-(none)}" >&6 ############################################################################### # If we're cross-compiling, allow the user to override the tools and their # options. The configure script is oriented toward identifying the host # compiler, etc., but we need a build compiler to generate parts of the source. case "$cf_cv_system_name" in (*-msvc*) LDFLAGS="$LDFLAGS user32.lib" export LDFLAGS ;; esac if test "$cross_compiling" = yes ; then # defaults that we might want to override : ${BUILD_CFLAGS:=''} : ${BUILD_CPPFLAGS:=''} : ${BUILD_LDFLAGS:=''} : ${BUILD_LIBS:=''} : ${BUILD_EXEEXT:='$x'} : ${BUILD_OBJEXT:='o'} # Check whether --with-build-cc or --without-build-cc was given. if test "${with_build_cc+set}" = set; then withval="$with_build_cc" BUILD_CC="$withval" else for ac_prog in gcc clang c99 c89 cc cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:5234: 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:5249: 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:5257: result: $BUILD_CC" >&5 echo "${ECHO_T}$BUILD_CC" >&6 else echo "$as_me:5260: 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:5269: checking for native build C compiler" >&5 echo $ECHO_N "checking for native build C compiler... $ECHO_C" >&6 echo "$as_me:5271: result: $BUILD_CC" >&5 echo "${ECHO_T}$BUILD_CC" >&6 echo "$as_me:5274: 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:5284: result: $BUILD_CPP" >&5 echo "${ECHO_T}$BUILD_CPP" >&6 echo "$as_me:5287: 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:5295: result: $BUILD_CFLAGS" >&5 echo "${ECHO_T}$BUILD_CFLAGS" >&6 echo "$as_me:5298: 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:5306: result: $BUILD_CPPFLAGS" >&5 echo "${ECHO_T}$BUILD_CPPFLAGS" >&6 echo "$as_me:5309: 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:5317: result: $BUILD_LDFLAGS" >&5 echo "${ECHO_T}$BUILD_LDFLAGS" >&6 echo "$as_me:5320: 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:5328: 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:5337: 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 5351 "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:5361: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:5364: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:5366: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:5369: \$? = $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:5384: 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:5389: 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:5414: 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:5431: 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:5440: 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}:5447: 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}:5454: testing ABI_VERSION: $ABI_VERSION ..." 1>&5 ;; (*) { echo "$as_me:5458: 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:5480: 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:5490: result: $with_libtool" >&5 echo "${ECHO_T}$with_libtool" >&6 if test "$with_libtool" != "no"; then if test "$with_libtool" != "yes" ; then if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$with_libtool" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval with_libtool="$with_libtool" case ".$with_libtool" in (.NONE/*) with_libtool=`echo "$with_libtool" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) with_libtool=`echo "$with_libtool" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:5521: 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:5534: 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:5549: found $ac_dir/$ac_word" >&5 break done fi fi LIBTOOL=$ac_cv_prog_LIBTOOL if test -n "$LIBTOOL"; then echo "$as_me:5557: result: $LIBTOOL" >&5 echo "${ECHO_T}$LIBTOOL" >&6 else echo "$as_me:5560: 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:5573: 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:5588: 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:5596: result: $ac_ct_LIBTOOL" >&5 echo "${ECHO_T}$ac_ct_LIBTOOL" >&6 else echo "$as_me:5599: 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:5630: 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:5645: found $ac_dir/$ac_word" >&5 break done fi fi LIBTOOL=$ac_cv_prog_LIBTOOL if test -n "$LIBTOOL"; then echo "$as_me:5653: result: $LIBTOOL" >&5 echo "${ECHO_T}$LIBTOOL" >&6 else echo "$as_me:5656: 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:5669: 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:5684: 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:5692: result: $ac_ct_LIBTOOL" >&5 echo "${ECHO_T}$ac_ct_LIBTOOL" >&6 else echo "$as_me:5695: 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:5717: 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:5733: 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:5744: 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:5753: 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:5759: 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:5764: 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:5800: 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:5810: 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:5814: 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:5824: 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:5828: 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:5838: 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:5842: 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:5852: 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:5860: 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:5870: result: $with_shared_cxx" >&5 echo "${ECHO_T}$with_shared_cxx" >&6 fi fi ############################################################################### echo "$as_me:5877: 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:5881: 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:5886: 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:5889: 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:5903: 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:5913: 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:5944: 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:5951: result: $PATH_SEPARATOR" >&5 echo "${ECHO_T}$PATH_SEPARATOR" >&6 # headers needed for checks... echo "$as_me:5955: 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 5961 "configure" #include "confdefs.h" #include #include #include #include _ACEOF if { (eval echo "$as_me:5969: \"$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:5975: \$? = $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 5997 "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 6015 "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 6036 "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:6062: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6065: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:6067: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6070: \$? = $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:6083: 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:6099: 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 6105 "configure" #include "confdefs.h" $ac_includes_default #include <$ac_header> _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:6111: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6114: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6117: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6120: \$? = $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:6130: 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 6146 "configure" #include "confdefs.h" $ac_includes_default int main (void) { #ifndef exit char *p = (char *) exit; (void) p; #endif ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:6161: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6164: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6167: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6170: \$? = $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:6180: 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:6186: 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 6192 "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:6207: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6210: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6213: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6216: \$? = $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:6226: 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 6247 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main (void) { opendir (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:6266: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6269: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6272: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6275: \$? = $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:6286: 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:6293: 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 6301 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main (void) { opendir (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:6320: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6323: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6326: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6329: \$? = $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:6340: 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:6350: 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:6360: result: $with_termlib" >&5 echo "${ECHO_T}$with_termlib" >&6 echo "$as_me:6363: 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:6373: 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:6386: 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:6395: result: ${LD_MODEL:-(none)}" >&5 echo "${ECHO_T}${LD_MODEL:-(none)}" >&6 case "$DFT_LWR_MODEL" in (shared) echo "$as_me:6401: 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:6411: result: $cf_cv_enable_rpath" >&5 echo "${ECHO_T}$cf_cv_enable_rpath" >&6 echo "$as_me:6414: 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:6424: 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:6435: 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:6466: result: $LD_RPATH_OPT" >&5 echo "${ECHO_T}$LD_RPATH_OPT" >&6 case "x$LD_RPATH_OPT" in (x-R*) echo "$as_me:6471: 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 6492 "configure" #include "confdefs.h" int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:6504: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6507: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6510: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6513: \$? = $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:6523: 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:6545: 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:6560: result: $withval" >&5 echo "${ECHO_T}$withval" >&6 { { echo "$as_me:6562: 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:6571: 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:6594: 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 6601 "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:6613: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:6616: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:6619: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6622: \$? = $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:6631: 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:6702: 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 6711 "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:6723: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:6726: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:6729: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:6732: \$? = $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:6743: 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 7093 "configure" #include "confdefs.h" #include int main (void) { printf("Hello\\n"); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:7105: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:7108: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:7111: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7114: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then break else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 fi rm -f "conftest.$ac_objext" "conftest.$ac_ext" done CFLAGS="$cf_save_CFLAGS" CC_SHARED_OPTS=$cf_shared_opts MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dy -G -h '$cf_cv_shared_soname' -o $@' else MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -h '$cf_cv_shared_soname' -o $@' fi ;; (sysv5uw7*|unix_sv*) # tested with UnixWare 7.1.0 (gcc 2.95.2 and cc) if test "$GCC" != yes; then CC_SHARED_OPTS='-KPIC' fi MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o $@' ;; (*) CC_SHARED_OPTS='unknown' MK_SHARED_LIB='echo unknown' ;; esac # This works if the last tokens in $MK_SHARED_LIB are the -o target. case "$cf_cv_shlib_version" in (rel|abi) case "$MK_SHARED_LIB" in (*'-o $@') test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes ;; (*) { echo "$as_me:7151: 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:7173: 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:7175: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:7178: \$? = $ac_status" >&5 (exit "$ac_status"); }; then echo "$as_me:7180: result: yes" >&5 echo "${ECHO_T}yes" >&6 cf_save_CFLAGS="$CFLAGS" else echo "$as_me:7184: 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}:7199: 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}:7203: testing MK_SHARED_LIB: $MK_SHARED_LIB ..." 1>&5 for model in $cf_list_models ; do case "$model" in (libtool) echo "$as_me:7209: 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:7219: 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:7230: 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:7245: 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:7256: 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:7261: 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 7264 "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:7276: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7279: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7282: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7285: \$? = $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:7294: 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}:7300: testing try to work around by appending shared-options ..." 1>&5 CFLAGS="$CFLAGS $CC_SHARED_OPTS" fi echo "$as_me:7305: checking if versioned-symbols file should be used" >&5 echo $ECHO_N "checking if versioned-symbols file should be used... $ECHO_C" >&6 # Check whether --with-versioned-syms or --without-versioned-syms was given. if test "${with_versioned_syms+set}" = set; then withval="$with_versioned_syms" with_versioned_syms=$withval else with_versioned_syms=no fi; case "x$with_versioned_syms" in (xyes) with_versioned_syms='${top_srcdir}/package/${PACKAGE}.map' ;; (xno) ;; (x/*) test -f "$with_versioned_syms" || { { echo "$as_me:7323: 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:7328: 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:7334: 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}:7350: 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}:7358: testing MK_SHARED_LIB: $MK_SHARED_LIB ..." 1>&5 ;; (*) { echo "$as_me:7362: 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:7374: 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:7442: 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:7455: 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:7465: result: $with_gpm" >&5 echo "${ECHO_T}$with_gpm" >&6 if test "$with_gpm" != no ; then echo "$as_me:7469: 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 7475 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:7479: \"$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:7485: \$? = $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:7504: 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}:7515: 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:7523: 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 7531 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char Gpm_Open (); int main (void) { Gpm_Open (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:7550: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7553: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7556: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7559: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then ac_cv_lib_gpm_Gpm_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:7570: 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:7577: WARNING: Cannot link with GPM library" >&5 echo "$as_me: WARNING: Cannot link with GPM library" >&2;} with_gpm=no else { { echo "$as_me:7581: 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:7592: 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:7601: 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:7611: result: $with_dlsym" >&5 echo "${ECHO_T}$with_dlsym" >&6 if test "x$with_dlsym" = xyes ; then cf_have_dlsym=no echo "$as_me:7616: 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 7622 "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:7653: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7656: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7659: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7662: \$? = $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:7672: 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:7679: 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 7687 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlsym (); int main (void) { dlsym (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:7706: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7709: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7712: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7715: \$? = $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:7726: 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:7755: 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 7758 "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:7776: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7779: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7782: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7785: \$? = $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:7796: 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:7801: result: ok" >&5 echo "${ECHO_T}ok" >&6 else { { echo "$as_me:7804: 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}:7812: testing assuming soname for gpm is $with_gpm ..." 1>&5 cf_cv_gpm_soname="$with_gpm" else echo "$as_me:7817: 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:7851: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:7854: \$? = $ac_status" >&5 (exit "$ac_status"); } ; then if { (eval echo "$as_me:7856: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7859: \$? = $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:7870: 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:7938: 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 7946 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char Gpm_Wgetch (); int main (void) { Gpm_Wgetch (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:7965: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:7968: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:7971: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:7974: \$? = $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:7985: 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:7989: 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:8013: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8016: \$? = $ac_status" >&5 (exit "$ac_status"); } ; then if { (eval echo "$as_me:8018: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8021: \$? = $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:8033: 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:8037: 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:8045: 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:8054: 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}:8065: 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}:8071: 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}:8075: 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:8199: 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:8212: 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 8220 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char regcomp (); int main (void) { regcomp (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:8239: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8242: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:8245: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8248: \$? = $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:8259: 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:8280: 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 8288 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char regcomp (); int main (void) { regcomp (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:8307: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8310: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:8313: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8316: \$? = $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:8327: 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:8348: 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:8363: 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 8369 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:8373: \"$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:8379: \$? = $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:8398: 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 8417 "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:8448: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8451: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:8454: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8457: \$? = $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:8467: 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:8481: 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 8493 "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:8516: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:8519: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:8522: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8525: \$? = $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:8535: 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:8545: 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:8562: 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:8568: 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:8586: result: $cf_disable_rpath_hack" >&5 echo "${ECHO_T}$cf_disable_rpath_hack" >&6 if test "$enable_rpath_hack" = yes ; then echo "$as_me:8591: 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:8594: 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:8601: 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:8616: 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:8624: result: $cf_ldd_prog" >&5 echo "${ECHO_T}$cf_ldd_prog" >&6 else echo "$as_me:8627: 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 8641 "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:8653: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:8656: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:8659: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:8662: \$? = $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}:8690: 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}:8702: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5 test -n "$verbose" && echo " ...checking LDFLAGS $LDFLAGS" 1>&6 echo "${as_me:-configure}:8706: 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}:8743: 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}:8756: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5 test -n "$verbose" && echo " ...checking LIBS $LIBS" 1>&6 echo "${as_me:-configure}:8760: 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}:8797: 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}:8810: testing ...checked LIBS $LIBS ..." 1>&5 test -n "$verbose" && echo " ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6 echo "${as_me:-configure}:8814: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5 else echo "$as_me:8817: 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:8831: 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:8848: 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:8856: 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:8875: 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:8879: 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:8889: result: $with_overwrite" >&5 echo "${ECHO_T}$with_overwrite" >&6 echo "$as_me:8892: 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:8902: 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:8918: 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:8926: result: $TERMINFO_SRC" >&5 echo "${ECHO_T}$TERMINFO_SRC" >&6 echo "$as_me:8929: 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:8939: result: $with_hashed_db" >&5 echo "${ECHO_T}$with_hashed_db" >&6 else with_hashed_db=no fi echo "$as_me:8945: 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:8955: result: ${with_fallback:-(none)}" >&5 echo "${ECHO_T}${with_fallback:-(none)}" >&6 case ".$with_fallback" in (.|.no) FALLBACK_LIST= ;; (.yes) { echo "$as_me:8963: 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:8979: 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:8994: found $ac_dir/$ac_word" >&5 break done fi fi TIC=$ac_cv_prog_TIC if test -n "$TIC"; then echo "$as_me:9002: result: $TIC" >&5 echo "${ECHO_T}$TIC" >&6 else echo "$as_me:9005: 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:9014: 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:9029: 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:9037: result: $ac_ct_TIC" >&5 echo "${ECHO_T}$ac_ct_TIC" >&6 else echo "$as_me:9040: 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:9052: 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:9067: found $ac_dir/$ac_word" >&5 break done fi fi INFOCMP=$ac_cv_prog_INFOCMP if test -n "$INFOCMP"; then echo "$as_me:9075: result: $INFOCMP" >&5 echo "${ECHO_T}$INFOCMP" >&6 else echo "$as_me:9078: 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:9087: 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:9102: 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:9110: result: $ac_ct_INFOCMP" >&5 echo "${ECHO_T}$ac_ct_INFOCMP" >&6 else echo "$as_me:9113: 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:9128: checking for tic program for fallbacks" >&5 echo $ECHO_N "checking for tic program for fallbacks... $ECHO_C" >&6 TIC=$withval echo "$as_me:9131: result: $TIC" >&5 echo "${ECHO_T}$TIC" >&6 if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$TIC" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval TIC="$TIC" case ".$TIC" in (.NONE/*) TIC=`echo "$TIC" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) TIC=`echo "$TIC" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:9159: 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:9172: 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:9189: found $ac_dir/$ac_word" >&5 break fi done ;; esac fi TIC=$ac_cv_path_TIC if test -n "$TIC"; then echo "$as_me:9200: result: $TIC" >&5 echo "${ECHO_T}$TIC" >&6 else echo "$as_me:9203: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$TIC" && break done test -n "$TIC" || TIC="$TIC" cf_path_prog="" cf_path_args="" IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR" for cf_temp in $ac_cv_path_TIC do if test -z "$cf_path_prog" ; then if test "$with_full_paths" = yes ; then if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$cf_temp" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval cf_temp="$cf_temp" case ".$cf_temp" in (.NONE/*) cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%` ;; (*) break ;; esac cf_path_prog="$cf_temp" else cf_path_prog="`basename "$cf_temp"`" fi elif test -z "$cf_path_args" ; then cf_path_args="$cf_temp" else cf_path_args="$cf_path_args $cf_temp" fi done IFS="$cf_save_ifs" if test -n "$cf_path_prog" ; then echo "${as_me:-configure}:9262: 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:9286: checking for infocmp program for fallbacks" >&5 echo $ECHO_N "checking for infocmp program for fallbacks... $ECHO_C" >&6 INFOCMP=$withval echo "$as_me:9289: result: $INFOCMP" >&5 echo "${ECHO_T}$INFOCMP" >&6 if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$INFOCMP" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval INFOCMP="$INFOCMP" case ".$INFOCMP" in (.NONE/*) INFOCMP=`echo "$INFOCMP" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) INFOCMP=`echo "$INFOCMP" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:9317: 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:9330: 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:9347: found $ac_dir/$ac_word" >&5 break fi done ;; esac fi INFOCMP=$ac_cv_path_INFOCMP if test -n "$INFOCMP"; then echo "$as_me:9358: result: $INFOCMP" >&5 echo "${ECHO_T}$INFOCMP" >&6 else echo "$as_me:9361: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$INFOCMP" && break done test -n "$INFOCMP" || INFOCMP="$INFOCMP" cf_path_prog="" cf_path_args="" IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR" for cf_temp in $ac_cv_path_INFOCMP do if test -z "$cf_path_prog" ; then if test "$with_full_paths" = yes ; then if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$cf_temp" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval cf_temp="$cf_temp" case ".$cf_temp" in (.NONE/*) cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%` ;; (*) break ;; esac cf_path_prog="$cf_temp" else cf_path_prog="`basename "$cf_temp"`" fi elif test -z "$cf_path_args" ; then cf_path_args="$cf_temp" else cf_path_args="$cf_path_args $cf_temp" fi done IFS="$cf_save_ifs" if test -n "$cf_path_prog" ; then echo "${as_me:-configure}:9420: 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:9445: 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:9453: 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:9467: 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:9480: 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:9504: 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:9510: 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:9520: checking for list of terminfo directories" >&5 echo $ECHO_N "checking for list of terminfo directories... $ECHO_C" >&6 # Check whether --with-terminfo-dirs or --without-terminfo-dirs was given. if test "${with_terminfo_dirs+set}" = set; then withval="$with_terminfo_dirs" else withval=${TERMINFO_DIRS:-${datadir}/terminfo} fi; IFS="${IFS:- }"; ac_save_ifs="$IFS"; IFS="${PATH_SEPARATOR}" cf_dst_path= for cf_src_path in $withval do if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$cf_src_path" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval cf_src_path="$cf_src_path" case ".$cf_src_path" in (.NONE/*) cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:9560: 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:9583: 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:9598: checking for default terminfo directory" >&5 echo $ECHO_N "checking for default terminfo directory... $ECHO_C" >&6 # Check whether --with-default-terminfo-dir or --without-default-terminfo-dir was given. if test "${with_default_terminfo_dir+set}" = set; then withval="$with_default_terminfo_dir" else withval="${TERMINFO:-${datadir}/terminfo}" fi; if test -n "${datadir}/terminfo" ; then if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$withval" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval withval="$withval" case ".$withval" in (.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:9634: 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:9643: 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 9666 "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:9680: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:9683: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:9685: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:9688: \$? = $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:9700: 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:9710: 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:9734: 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:9741: 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:9751: 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:9758: 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:9771: 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:9777: checking for list of termcap files" >&5 echo $ECHO_N "checking for list of termcap files... $ECHO_C" >&6 # Check whether --with-termpath or --without-termpath was given. if test "${with_termpath+set}" = set; then withval="$with_termpath" else withval=${TERMPATH:-/etc/termcap:/usr/share/misc/termcap} fi; IFS="${IFS:- }"; ac_save_ifs="$IFS"; IFS="${PATH_SEPARATOR}" cf_dst_path= for cf_src_path in $withval do if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$cf_src_path" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval cf_src_path="$cf_src_path" case ".$cf_src_path" in (.NONE/*) cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:9817: 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:9840: 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:9858: 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:9865: 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:9875: 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:9885: 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:9895: 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:9902: 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:9912: 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:9919: 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:9929: 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:9936: 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:9946: 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:9961: 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 9967 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:9971: \"$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:9977: \$? = $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:9996: 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 10017 "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:10048: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10051: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:10054: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10057: \$? = $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:10067: 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 10090 "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:10121: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10124: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:10127: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10130: \$? = $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:10140: 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 10164 "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:10198: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:10201: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:10203: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10206: \$? = $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:10224: 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:10244: 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:10254: 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:10261: 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:10268: 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:10284: 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:10294: 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:10308: 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:10318: 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:10337: 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 10344 "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:10363: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10366: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10369: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10372: \$? = $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:10383: 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:10425: 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 10432 "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:10451: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10454: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10457: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10460: \$? = $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:10471: 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:10479: 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 10491 "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:10510: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10513: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10516: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10519: \$? = $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:10531: 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:10536: 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 10641 "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:10661: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10664: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10667: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10670: \$? = $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:10681: 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:10690: 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 10697 "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:10712: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10715: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10718: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10721: \$? = $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 10828 "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:10843: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10846: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10849: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10852: \$? = $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:10867: 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:10872: 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 10882 "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:10897: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10900: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10903: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10906: \$? = $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:10917: 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:10954: 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}:10960: testing if the symbol is already defined go no further ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 10963 "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:10978: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:10981: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:10984: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:10987: \$? = $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 11008 "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:11023: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11026: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11029: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11032: \$? = $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}:11043: 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}:11051: testing if the second compile does not leave our definition intact error ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 11054 "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:11069: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11072: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11075: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11078: \$? = $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:11094: 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:11211: 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:11243: 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 11250 "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:11268: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11271: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11274: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11277: \$? = $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 11289 "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:11307: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11310: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11313: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11316: \$? = $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:11331: 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:11491: 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}:11497: testing if the symbol is already defined go no further ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 11500 "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:11515: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11518: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11521: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11524: \$? = $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 11545 "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:11560: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11563: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11566: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11569: \$? = $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}:11580: 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}:11588: testing if the second compile does not leave our definition intact error ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 11591 "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:11606: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11609: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11612: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11615: \$? = $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:11631: 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}:11744: testing checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 11747 "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:11765: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11768: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11771: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11774: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then : else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 { echo "$as_me:11781: 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}:11804: 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}:11816: 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}:11904: 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}:11914: 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}:11924: 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:11936: 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 11939 "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:11954: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11957: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11960: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:11963: \$? = $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:11972: 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 11977 "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:11992: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:11995: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:11998: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12001: \$? = $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:12012: WARNING: _XOPEN_SOURCE is lower than requested" >&5 echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;} fi else echo "$as_me:12017: 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 12024 "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:12042: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12045: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12048: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12051: \$? = $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 12063 "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:12081: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12084: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12087: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12090: \$? = $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:12105: 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:12256: 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 12263 "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:12278: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12281: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12284: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12287: \$? = $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 12294 "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:12312: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12315: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12318: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12321: \$? = $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:12335: 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:12339: 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 12350 "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:12372: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12375: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12378: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12381: \$? = $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:12395: 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:12405: 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 12411 "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:12425: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12428: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12431: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12434: \$? = $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:12445: 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:12459: 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:12469: 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:12491: 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:12504: 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 12510 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:12514: \"$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:12520: \$? = $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:12539: 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 12556 "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:12578: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12581: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12584: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12587: \$? = $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:12597: 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:12603: 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 12606 "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:12622: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12625: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12628: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12631: \$? = $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:12640: 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:12646: 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 12649 "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:12665: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:12668: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:12671: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12674: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then 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:12683: 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:12693: 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 12764 "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:12809: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12812: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:12814: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12817: \$? = $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:12830: 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:12841: 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 12847 "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:12878: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12881: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12884: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12887: \$? = $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:12897: 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 12918 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:12922: \"$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:12928: \$? = $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:12947: 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 12965 "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:12982: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:12985: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:12988: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:12991: \$? = $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}:13003: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5 cf_save_LIBS="$LIBS" cat >"conftest.$ac_ext" <<_ACEOF #line 13008 "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:13021: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13024: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13027: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13030: \$? = $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 13044 "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:13057: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13060: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13063: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13066: \$? = $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}:13083: testing find linkage for utf8 library ..." 1>&5 echo "${as_me:-configure}:13085: 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}:13176: 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 13184 "configure" #include "confdefs.h" #include int main (void) { putwc(0,0); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:13197: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13200: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13203: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13206: \$? = $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}:13211: 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}:13229: 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}:13304: 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 13310 "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:13323: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:13326: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:13329: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13332: \$? = $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}:13337: 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:13379: 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 13417 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:13429: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13432: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13435: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13438: \$? = $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}:13455: 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}:13491: 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:13523: 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 13530 "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:13548: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13551: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13554: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13557: \$? = $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 13564 "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:13583: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13586: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13589: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13592: \$? = $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:13604: 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:13622: 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 13629 "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:13647: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13650: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13653: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13656: \$? = $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 13663 "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:13682: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13685: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13688: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13691: \$? = $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:13703: 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:13726: 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 13733 "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:13751: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13754: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13757: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13760: \$? = $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 13767 "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:13786: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13789: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13792: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13795: \$? = $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:13807: 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:13839: 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:13849: 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:13865: 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 13877 "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:13897: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13900: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13903: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13906: \$? = $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:13916: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13919: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13922: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13925: \$? = $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:13939: 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:13945: 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 13953 "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:13973: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:13976: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:13979: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:13982: \$? = $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 13991 "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:14012: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14015: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14018: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14021: \$? = $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:14032: 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 14050 "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:14070: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14073: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14076: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14079: \$? = $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 14088 "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:14109: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14112: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14115: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14118: \$? = $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:14129: 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 14150 "configure" #include "confdefs.h" #include int main (void) { return !fseeko; ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:14162: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14165: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14168: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14171: \$? = $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 14180 "configure" #include "confdefs.h" #define _LARGEFILE_SOURCE 1 #include int main (void) { return !fseeko; ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:14193: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14196: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14199: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14202: \$? = $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:14213: 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 14233 "configure" #include "confdefs.h" #include int main (void) { return fseeko && fseeko (stdin, 0, 0); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:14245: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:14248: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:14251: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14254: \$? = $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:14264: 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:14303: 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 14310 "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:14337: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14340: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14343: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14346: \$? = $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:14357: 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:14367: 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:14377: 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:14384: 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:14394: 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:14401: 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:14413: result: no" >&5 echo "${ECHO_T}no" >&6 else NCURSES_WATTR_MACROS=1 echo "$as_me:14417: result: yes" >&5 echo "${ECHO_T}yes" >&6 fi echo "$as_me:14421: checking for X11 rgb file" >&5 echo $ECHO_N "checking for X11 rgb file... $ECHO_C" >&6 # Check whether --with-x11-rgb or --without-x11-rgb was given. if test "${with_x11_rgb+set}" = set; then withval="$with_x11_rgb" RGB_PATH=$withval else RGB_PATH=auto fi; if test "x$RGB_PATH" = xauto then RGB_PATH='${exec_prefix}/lib/X11/rgb.txt' for cf_path in \ /opt/local/share/X11/rgb.txt \ /opt/X11/share/X11/rgb.txt \ /usr/share/X11/rgb.txt \ /usr/X11/share/X11/rgb.txt \ /usr/X11/lib/X11/rgb.txt \ /usr/lib/X11/rgb.txt \ /etc/X11/rgb.txt \ /usr/pkg/lib/X11/rgb.txt \ /usr/X11R7/lib/X11/rgb.txt \ /usr/X11R6/lib/X11/rgb.txt \ /usr/X11R5/lib/X11/rgb.txt \ /usr/X11R4/lib/X11/rgb.txt \ /usr/local/lib/X11/rgb.txt \ /usr/local/share/X11/rgb.txt \ /usr/lib64/X11/rgb.txt do if test -f "$cf_path" ; then RGB_PATH="$cf_path" break fi done else cf_path=$RGB_PATH if test "x$prefix" != xNONE; then cf_path_syntax="$prefix" else cf_path_syntax="$ac_default_prefix" fi case ".$cf_path" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval cf_path="$cf_path" case ".$cf_path" in (.NONE/*) cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:14485: 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:14493: 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:14518: result: $NCURSES_BOOL" >&5 echo "${ECHO_T}$NCURSES_BOOL" >&6 case x$NCURSES_BOOL in (x|xyes|xno) { { echo "$as_me:14522: 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:14528: 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:14540: 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:14544: result: $TERMINFO_CAPS" >&5 echo "${ECHO_T}$TERMINFO_CAPS" >&6 ### use option --with-chtype to override chtype's type echo "$as_me:14549: 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:14559: result: $NCURSES_CHTYPE" >&5 echo "${ECHO_T}$NCURSES_CHTYPE" >&6 case x$NCURSES_CHTYPE in (x|xyes|xno) { { echo "$as_me:14563: 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:14571: 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:14581: result: $NCURSES_OSPEED" >&5 echo "${ECHO_T}$NCURSES_OSPEED" >&6 case x$NCURSES_OSPEED in (x|xyes|xno) { { echo "$as_me:14585: 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:14593: 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:14603: result: $NCURSES_MMASK_T" >&5 echo "${ECHO_T}$NCURSES_MMASK_T" >&6 case x$NCURSES_MMASK_T in (x|xyes|xno) { { echo "$as_me:14607: 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:14614: 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:14624: result: $NCURSES_CCHARW_MAX" >&5 echo "${ECHO_T}$NCURSES_CCHARW_MAX" >&6 echo "$as_me:14627: 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 14633 "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:14648: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14651: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14654: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14657: \$? = $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:14667: result: $ac_cv_type_signed_char" >&5 echo "${ECHO_T}$ac_cv_type_signed_char" >&6 echo "$as_me:14670: 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 14679 "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:14691: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14694: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14697: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14700: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then ac_lo=0 ac_mid=0 while :; do cat >"conftest.$ac_ext" <<_ACEOF #line 14705 "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:14717: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14720: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14723: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14726: \$? = $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 14742 "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:14754: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14757: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14760: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14763: \$? = $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 14779 "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:14791: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:14794: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:14797: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14800: \$? = $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:14813: 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 14818 "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:14834: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:14837: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:14839: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:14842: \$? = $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:14858: 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:14879: 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:14885: 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:14895: result: $NCURSES_TPARM_ARG" >&5 echo "${ECHO_T}$NCURSES_TPARM_ARG" >&6 case x$NCURSES_TPARM_ARG in (x|xyes|xno) { { echo "$as_me:14899: 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:14906: 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:14916: 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:14925: 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:15016: result: $MANPAGE_FORMAT" >&5 echo "${ECHO_T}$MANPAGE_FORMAT" >&6 if test -n "$cf_unknown" ; then { echo "$as_me:15019: 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= 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 ;; (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:15058: 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:15087: 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:15092: result: $MANPAGE_RENAMES" >&5 echo "${ECHO_T}$MANPAGE_RENAMES" >&6 echo "$as_me:15095: 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:15106: 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:15120: 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:15133: WARNING: cannot make symlinks" >&5 echo "$as_me: WARNING: cannot make symlinks" >&2;} MANPAGE_SYMLINKS=no fi fi echo "$as_me:15139: result: $MANPAGE_SYMLINKS" >&5 echo "${ECHO_T}$MANPAGE_SYMLINKS" >&6 fi echo "$as_me:15143: 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:15154: 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:15482: 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 test "x$with_ext_funcs" = xyes || cf_dft_ext_spfuncs=no else NCURSES_EXT_FUNCS=0 GENERATED_EXT_FUNCS= fi echo "$as_me:15538: 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:15548: 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:15567: 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:15577: 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:15586: 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:15591: 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:15598: 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:15608: 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:15616: 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:15626: 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:15631: 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:15642: 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:15670: 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:15680: 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:15690: 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:15707: 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:15717: 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:15727: 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:15737: 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:15745: 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:15755: result: $with_sigwinch" >&5 echo "${ECHO_T}$with_sigwinch" >&6 test "x$with_sigwinch" = xyes && cat >>confdefs.h <<\EOF #define USE_SIGWINCH 1 EOF ### use option --enable-tcap-names to allow user to define new capabilities echo "$as_me:15763: 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:15773: 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:15787: 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:15797: result: $with_pthread" >&5 echo "${ECHO_T}$with_pthread" >&6 if test "$with_pthread" != no ; then echo "$as_me:15801: 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 15807 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:15811: \"$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:15817: \$? = $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:15836: 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:15846: 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 15867 "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:15884: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:15887: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:15890: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15893: \$? = $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:15903: 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:15931: 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:15941: 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 15947 "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:15978: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:15981: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:15984: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:15987: \$? = $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:15997: 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:16001: 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:16011: 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:16022: 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:16032: result: $use_weak_symbols" >&5 echo "${ECHO_T}$use_weak_symbols" >&6 if test "x$use_weak_symbols" = xyes ; then echo "$as_me:16036: 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 16043 "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:16069: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:16072: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:16075: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16078: \$? = $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:16089: 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:16139: 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:16149: 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:16238: 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:16250: 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" != yes && enableval=no if test "$enableval" != "no" ; then enable_opaque_curses=yes else test "$cf_cv_enable_reentrant" = 1 && enable_opaque_curses=yes test "$cf_cv_enable_reentrant" = 1 || enable_opaque_curses=$cf_dft_opaque_curses fi else enableval=no test "$cf_cv_enable_reentrant" = 1 && enable_opaque_curses=yes test "$cf_cv_enable_reentrant" = 1 || enable_opaque_curses=$cf_dft_opaque_curses fi; echo "$as_me:16272: 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:16277: error: reentrant configuration requires opaque library" >&5 echo "$as_me: error: reentrant configuration requires opaque library" >&2;} { (exit 1); exit 1; }; } echo "$as_me:16281: 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" enable_opaque_form=yes else enable_opaque_form=$cf_dft_opaque_curses fi; echo "$as_me:16291: result: $enable_opaque_form" >&5 echo "${ECHO_T}$enable_opaque_form" >&6 echo "$as_me:16294: 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" enable_opaque_menu=yes else enable_opaque_menu=$cf_dft_opaque_curses fi; echo "$as_me:16304: result: $enable_opaque_menu" >&5 echo "${ECHO_T}$enable_opaque_menu" >&6 echo "$as_me:16307: 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" enable_opaque_panel=yes else enable_opaque_panel=$cf_dft_opaque_curses fi; echo "$as_me:16317: 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:16327: 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:16337: 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:16360: result: $with_develop" >&5 echo "${ECHO_T}$with_develop" >&6 ### use option --enable-hard-tabs to turn on use of hard-tabs optimize echo "$as_me:16364: 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:16374: 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:16382: 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:16392: 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:16402: 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:16412: 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:16420: 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:16430: 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:16438: checking if you want code to check screensize" >&5 echo $ECHO_N "checking if you want code to check screensize... $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" with_check_size=$enableval else with_check_size=no fi; echo "$as_me:16448: result: $with_check_size" >&5 echo "${ECHO_T}$with_check_size" >&6 test "x$with_check_size" = xyes && cat >>confdefs.h <<\EOF #define USE_CHECK_SIZE 1 EOF ### use option --enable-colorfgbg to turn on use of $COLORFGBG environment echo "$as_me:16456: 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:16466: 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:16474: 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:16484: 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:16491: 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 16500 "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:16516: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16519: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16522: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16525: \$? = $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:16537: 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:16652: 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 16661 "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:16677: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:16680: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:16683: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:16686: \$? = $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:16698: 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:16821: 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:16831: 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:16837: 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:16847: 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:16853: 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:16863: 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:16872: 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:16882: 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:16897: 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:16907: 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:16933: 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:16967: 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:16980: 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:16997: 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:17008: 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:17039: result: $cf_cv_install_p" >&5 echo "${ECHO_T}$cf_cv_install_p" >&6 echo "$as_me:17042: 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:17053: 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:17064: 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:17074: result: $with_strip_program" >&5 echo "${ECHO_T}$with_strip_program" >&6 if test "$with_strip_program" != no then echo "$as_me:17078: 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:17099: result: $check_install_strip" >&5 echo "${ECHO_T}$check_install_strip" >&6 case "$check_install_strip" in (no) { echo "$as_me:17103: 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}:17118: 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:17144: 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:17161: result: $enable_stdnoreturn" >&5 echo "${ECHO_T}$enable_stdnoreturn" >&6 if test $enable_stdnoreturn = yes; then echo "$as_me:17165: 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 17171 "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:17187: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17190: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:17193: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17196: \$? = $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:17207: 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}:17263: testing repairing CFLAGS: $CFLAGS ..." 1>&5 CFLAGS="$cf_temp_flags" test -n "$verbose" && echo " ... fixed $CFLAGS" 1>&6 echo "${as_me:-configure}:17268: testing ... fixed $CFLAGS ..." 1>&5 test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 echo "${as_me:-configure}:17272: 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}:17311: testing repairing CPPFLAGS: $CPPFLAGS ..." 1>&5 CPPFLAGS="$cf_temp_flags" test -n "$verbose" && echo " ... fixed $CPPFLAGS" 1>&6 echo "${as_me:-configure}:17316: testing ... fixed $CPPFLAGS ..." 1>&5 test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 echo "${as_me:-configure}:17320: 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}:17359: testing repairing LDFLAGS: $LDFLAGS ..." 1>&5 LDFLAGS="$cf_temp_flags" test -n "$verbose" && echo " ... fixed $LDFLAGS" 1>&6 echo "${as_me:-configure}:17364: testing ... fixed $LDFLAGS ..." 1>&5 test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 echo "${as_me:-configure}:17368: testing ... extra $EXTRA_CFLAGS ..." 1>&5 fi ;; esac fi echo "$as_me:17375: 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:17392: 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 17416 "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:17431: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17434: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:17437: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17440: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then echo "$as_me:17443: 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 17450 "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:17468: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17471: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:17474: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17477: \$? = $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:17492: 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:17553: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17556: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:17558: 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:17566: 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:17589: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17592: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:17594: 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}:17602: 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}:17612: 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:17701: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:17703: 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:17775: 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 17780 "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:17797: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17800: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:17803: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17806: \$? = $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:17817: result: $INTEL_CPLUSPLUS" >&5 echo "${ECHO_T}$INTEL_CPLUSPLUS" >&6 ;; esac fi CLANG_CPLUSPLUS=no if test "$GCC" = yes ; then echo "$as_me:17826: 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 17830 "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:17847: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17850: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:17853: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:17856: \$? = $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:17866: 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:17875: 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:17882: 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:17886: 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:17893: 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 17898 "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:17912: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:17915: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "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_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:17932: 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}:17938: 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:17990: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:17993: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:17995: 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:18004: 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:18034: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:18037: \$? = $ac_status" >&5 (exit "$ac_status"); }; then test -n "$verbose" && echo "$as_me:18039: result: ... -$cf_opt" >&5 echo "${ECHO_T}... -$cf_opt" >&6 EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -$cf_opt" else test -n "$verbose" && echo "$as_me:18043: 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:18061: 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:18071: 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:18080: 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:18082: 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 18088 "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:18119: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18122: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:18125: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18128: \$? = $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:18138: 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:18148: 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 18156 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char strlcat (); int main (void) { strlcat (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:18175: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18178: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:18181: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18184: \$? = $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:18195: 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:18218: 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 18224 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:18228: \"$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:18234: \$? = $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:18253: 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:18274: 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 18280 "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:18311: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18314: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:18317: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18320: \$? = $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:18330: 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:18353: 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:18369: 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:18505: 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 18511 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:18515: \"$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:18521: \$? = $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:18540: 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:18544: 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 18552 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dmalloc_debug (); int main (void) { dmalloc_debug (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:18571: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18574: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:18577: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18580: \$? = $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:18591: 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:18742: 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 18748 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:18752: \"$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:18758: \$? = $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:18777: 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:18781: 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 18789 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char debug_malloc (); int main (void) { debug_malloc (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:18808: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:18811: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:18814: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:18817: \$? = $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:18828: 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:18978: 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:18989: 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:19041: 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:19051: result: $cf_with_trace" >&5 echo "${ECHO_T}$cf_with_trace" >&6 if test "x$cf_with_trace" = xyes ; then LIB_TRACING=all ADA_TRACE=TRUE cf_fix_cppflags=no cf_new_cflags= cf_new_cppflags= cf_new_extra_cppflags= for cf_add_cflags in -DTRACE do case "$cf_fix_cppflags" in (no) case "$cf_add_cflags" in (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) case "$cf_add_cflags" in (-D*) cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ && test -z "${cf_tst_cflags}" \ && cf_fix_cppflags=yes if test "$cf_fix_cppflags" = yes ; then test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" continue elif test "${cf_tst_cflags}" = "\"'" ; then test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" continue fi ;; esac case "$CPPFLAGS" in (*$cf_add_cflags) ;; (*) case "$cf_add_cflags" in (-D*) cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` CPPFLAGS=`echo "$CPPFLAGS" | \ sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` ;; esac test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" ;; esac ;; (*) test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " cf_new_cflags="${cf_new_cflags}$cf_add_cflags" ;; esac ;; (yes) test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ && test -z "${cf_tst_cflags}" \ && cf_fix_cppflags=no ;; esac done if test -n "$cf_new_cflags" ; then test -n "$CFLAGS" && CFLAGS="$CFLAGS " CFLAGS="${CFLAGS}$cf_new_cflags" fi if test -n "$cf_new_cppflags" ; then test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" fi if test -n "$cf_new_extra_cppflags" ; then test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" fi cat >>confdefs.h <<\EOF #define HAVE__TRACEF 1 EOF else LIB_TRACING=DEBUG ADA_TRACE=FALSE fi echo "$as_me:19165: 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:19182: 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:19195: 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 19202 "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:19219: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19222: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19225: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19228: \$? = $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 19238 "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:19255: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19258: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19261: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19264: \$? = $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:19278: 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:19307: 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 19314 "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:19330: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19333: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19336: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19339: \$? = $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:19349: 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:19357: 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 19364 "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:19380: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19383: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19386: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19389: \$? = $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:19399: 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:19421: 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 19427 "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:19443: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:19446: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:19449: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19452: \$? = $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:19462: 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:19477: 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 19485 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char regcomp (); int main (void) { regcomp (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:19504: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19507: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19510: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19513: \$? = $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:19524: 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:19528: 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 19536 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char libiconv_open (); int main (void) { libiconv_open (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:19555: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19558: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19561: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19564: \$? = $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:19575: 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:19597: 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 19605 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char libintl_gettext (); int main (void) { libintl_gettext (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:19624: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19627: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19630: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19633: \$? = $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:19644: 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:19666: 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 19674 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char tre_regcomp (); int main (void) { tre_regcomp (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:19693: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19696: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19699: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19702: \$? = $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:19713: 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:19755: 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 19763 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char regcomp (); int main (void) { regcomp (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:19782: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19785: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19788: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19791: \$? = $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:19802: 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:19830: 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 19836 "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:19867: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19870: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:19873: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:19876: \$? = $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:19886: 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:19895: 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 19903 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char regcomp (); int main (void) { regcomp (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:19922: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:19925: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (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 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:19942: 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:19974: 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 19980 "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:20011: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20014: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20017: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20020: \$? = $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:20030: 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:20036: 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 20044 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char compile (); int main (void) { compile (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:20063: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20066: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20069: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20072: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then 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:20083: 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:20111: WARNING: cannot find regular expression library" >&5 echo "$as_me: WARNING: cannot find regular expression library" >&2;} fi echo "$as_me:20115: 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 20127 "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:20144: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20147: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20150: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20153: \$? = $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 20170 "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:20190: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20193: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20196: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20199: \$? = $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:20215: result: $cf_cv_regex_hdrs" >&5 echo "${ECHO_T}$cf_cv_regex_hdrs" >&6 case "$cf_cv_regex_hdrs" in (no) { echo "$as_me:20219: 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:20257: 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 20263 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:20267: \"$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:20273: \$? = $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:20292: 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 20311 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:20315: \"$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:20321: \$? = $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:20340: 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 20360 "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:20373: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20376: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20379: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20382: \$? = $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:20394: 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:20411: 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 20418 "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:20431: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20434: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20437: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20440: \$? = $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:20451: 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 20473 "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:20488: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20491: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20494: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20497: \$? = $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:20508: 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 20527 "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:20558: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20561: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20564: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20567: \$? = $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:20577: 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:20583: 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 20589 "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:20620: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20623: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:20626: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20629: \$? = $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:20639: 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 20659 "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:20764: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:20767: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:20769: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20772: \$? = $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:20785: 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:20800: 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:20804: 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 20811 "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:20831: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20834: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20837: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20840: \$? = $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:20852: 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:20867: 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 20873 "configure" #include "confdefs.h" int main (void) { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset x; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; ccp = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++ccp; p = (char**) ccp; ccp = (char const *const *) p; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } #endif ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:20931: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20934: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20937: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20940: \$? = $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:20950: 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:20960: 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 20968 "configure" #include "confdefs.h" #ifndef __cplusplus static $ac_kw int static_foo () {return 0; } $ac_kw int foo () {return 0; } #endif _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:20977: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:20980: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:20983: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:20986: \$? = $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:20997: 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 21032 "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:21044: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:21047: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:21050: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21053: \$? = $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:21065: 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:21171: 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 21183 "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:21207: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:21210: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:21213: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21216: \$? = $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:21230: 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 21249 "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:21284: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21287: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:21289: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21292: \$? = $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:21307: 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 21326 "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:21338: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:21341: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:21344: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21347: \$? = $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:21359: 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:21375: 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 21382 "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:21396: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:21399: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:21402: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21405: \$? = $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:21416: 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 21438 "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:21453: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21456: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21459: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21462: \$? = $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:21473: 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:21500: \$? = $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:21527: \$? = $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 21540 "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:21551: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21554: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:21556: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21559: \$? = $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:21574: 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. echo "$as_me:21588: checking for clock_gettime" >&5 echo $ECHO_N "checking for clock_gettime... $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 21595 "configure" #include "confdefs.h" #include int main (void) { struct timespec ts; int rc = clock_gettime(CLOCK_REALTIME, &ts); (void) rc; (void)ts ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:21608: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21611: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21614: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21617: \$? = $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:21628: result: $cf_cv_func_clock_gettime" >&5 echo "${ECHO_T}$cf_cv_func_clock_gettime" >&6 if test "$cf_cv_func_clock_gettime" = yes then cat >>confdefs.h <<\EOF #define HAVE_CLOCK_GETTIME 1 EOF else echo "$as_me:21639: 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 21645 "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:21676: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21679: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21682: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21685: \$? = $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:21695: 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:21705: 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 21713 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gettimeofday (); int main (void) { gettimeofday (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:21732: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21735: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21738: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21741: \$? = $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:21752: 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 \ putenv \ remove \ select \ setbuf \ setbuffer \ setenv \ setfsuid \ setvbuf \ sigaction \ sigvec \ snprintf \ strdup \ strstr \ sysconf \ tcgetpgrp \ times \ tsearch \ vsnprintf \ do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:21813: 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 21819 "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:21850: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21853: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:21856: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21859: \$? = $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:21869: 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 21886 "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:21901: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:21904: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:21907: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21910: \$? = $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:21920: 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:21942: 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 21952 "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:21965: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:21968: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:21970: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:21973: \$? = $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:21985: 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:21997: 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 22004 "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:22016: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22019: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22022: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22025: \$? = $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:22035: 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:22045: 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:22054: 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:22067: 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 22074 "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:22094: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22097: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22100: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22103: \$? = $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:22114: 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:22124: 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 22131 "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:22154: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22157: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22160: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22163: \$? = $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:22174: 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 22195 "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:22207: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22210: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22213: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22216: \$? = $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:22227: 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:22235: 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 22238 "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:22252: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:22255: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:22258: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22261: \$? = $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 22269 "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:22284: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:22287: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:22290: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22293: \$? = $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:22309: result: $sigact_bad" >&5 echo "${ECHO_T}$sigact_bad" >&6 fi echo "$as_me:22313: 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 22323 "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:22349: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22352: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:22354: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22357: \$? = $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:22369: 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:22386: 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 22392 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:22396: \"$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:22402: \$? = $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:22421: 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 22441 "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:22453: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:22456: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:22459: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22462: \$? = $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 22470 "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:22484: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:22487: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:22490: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22493: \$? = $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:22509: result: $termios_bad" >&5 echo "${ECHO_T}$termios_bad" >&6 fi fi echo "$as_me:22514: 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 22521 "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:22549: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22552: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22555: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22558: \$? = $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:22568: 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:22575: 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 22582 "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: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_func_vsscanf=vsscanf else echo "$as_me: failed program was:" >&5 cat "conftest.$ac_ext" >&5 cat >"conftest.$ac_ext" <<_ACEOF #line 22625 "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:22647: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22650: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22653: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22656: \$? = $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 22664 "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:22686: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22689: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22692: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22695: \$? = $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:22710: 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:22736: 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 22742 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:22746: \"$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:22752: \$? = $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:22771: 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 22792 "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:22827: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22830: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:22832: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22835: \$? = $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:22850: 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:22853: 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 22859 "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:22890: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22893: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:22896: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22899: \$? = $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:22909: 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:22930: 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:22933: 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:22939: 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 22944 "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:22961: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:22964: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:22966: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:22969: \$? = $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:22982: 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:22993: 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 22999 "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:23014: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:23017: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:23020: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23023: \$? = $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:23033: 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 23051 "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:23066: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:23069: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:23072: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23075: \$? = $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:23085: 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 23104 "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:23117: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:23120: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:23123: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23126: \$? = $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:23137: 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:23144: 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 23165 "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:23215: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:23218: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:23221: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23224: \$? = $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:23243: 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 23267 "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:23298: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23301: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23304: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23307: \$? = $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:23317: 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:23323: 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 23329 "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:23360: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23363: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23366: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23369: \$? = $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:23379: 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:23383: 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 23393 "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:23409: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23412: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:23414: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23417: \$? = $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:23430: 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:23457: 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 23463 "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:23494: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23497: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23500: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23503: \$? = $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:23513: 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 23533 "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:23586: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23589: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:23591: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23594: \$? = $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:23606: 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:23613: 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 23620 "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:23637: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23640: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23643: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23646: \$? = $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:23656: 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:23668: 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 23675 "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:23692: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23695: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23698: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23701: \$? = $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:23711: 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:23723: 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 23730 "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:23747: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23750: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23753: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23756: \$? = $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:23766: 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:23784: 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 23791 "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:23808: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23811: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23814: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23817: \$? = $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:23827: 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:23832: 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 23839 "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:23856: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:23859: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:23862: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23865: \$? = $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:23875: 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:23886: 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 23892 "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:23907: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:23910: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:23913: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:23916: \$? = $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:23926: 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 23947 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:23951: \"$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:23957: \$? = $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:23976: 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 23995 "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:24026: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:24029: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:24032: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:24035: \$? = $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:24045: 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:24080: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:24083: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:24085: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:24088: \$? = $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:24100: 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:24114: 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:24119: 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 24128 "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:24221: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:24224: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:24226: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:24229: \$? = $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:24241: 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:24247: 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:24272: 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 24282 "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:24317: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:24320: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:24322: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:24325: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then cf_cv_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:24338: 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:24347: 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 24355 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char openpty (); int main (void) { openpty (); ; return 0; } _ACEOF rm -f "conftest.$ac_objext" "conftest$ac_exeext" if { (eval echo "$as_me:24374: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:24377: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:24380: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:24383: \$? = $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:24394: 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:24402: 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 24429 "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:24447: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:24450: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:24453: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:24456: \$? = $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:24474: 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 24547 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:24559: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:24562: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:24565: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:24568: \$? = $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}:24585: 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}:24621: 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:24632: 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 24704 "configure" #include "confdefs.h" #include int main (void) { printf("Hello") ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:24716: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:24719: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:24722: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:24725: \$? = $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}:24742: 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}:24822: 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:24839: 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 24845 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:24849: \"$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:24855: \$? = $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:24874: 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:24878: 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}:24889: testing checking for db version $cf_db_version ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 24892 "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:24922: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:24925: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:24928: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:24931: \$? = $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:24945: 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:24949: 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:24954: 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}:24984: testing checking for library $cf_db_libs ..." 1>&5 cat >"conftest.$ac_ext" <<_ACEOF #line 24987 "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:25042: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:25045: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:25048: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:25051: \$? = $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:25071: 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:25075: 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:25101: 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:25116: 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 25124 "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:25136: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:25139: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:25142: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:25145: \$? = $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 25152 "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:25168: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:25171: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:25174: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:25177: \$? = $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:25191: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:25193: result: no" >&5 echo "${ECHO_T}no" >&6 fi echo "$as_me:25197: 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 25205 "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:25220: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:25223: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:25226: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:25229: \$? = $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:25242: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:25244: 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:25261: 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 25264 "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:25278: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:25281: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:25284: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:25287: \$? = $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:25296: 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:25315: 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 25341 "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:25355: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:25358: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:25361: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:25364: \$? = $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:25376: 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:25398: 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:25416: \$? = $ac_status" >&5 (exit "$ac_status"); } && test -f conftest2.$ac_objext && { (eval echo "$as_me:25418: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:25421: \$? = $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:25432: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:25435: 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:25455: 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 25476 "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:25490: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:25493: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:25496: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:25499: \$? = $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 25536 "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:25550: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:25553: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:25556: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:25559: \$? = $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:25592: 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:25608: 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 25625 "configure" #include "confdefs.h" #include Syntax error _ACEOF if { (eval echo "$as_me:25630: \"$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:25636: \$? = $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 25659 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:25663: \"$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:25669: \$? = $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:25706: 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 25716 "configure" #include "confdefs.h" #include Syntax error _ACEOF if { (eval echo "$as_me:25721: \"$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:25727: \$? = $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 25750 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:25754: \"$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:25760: \$? = $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:25788: 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:25803: 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 25809 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:25813: \"$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:25819: \$? = $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:25838: 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 25857 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:25861: \"$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:25867: \$? = $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:25886: 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 25900 "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:25917: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:25920: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:25923: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:25926: \$? = $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:25935: 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:25946: 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 25954 "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:25966: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:25969: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:25972: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:25975: \$? = $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 25982 "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:25998: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:26001: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:26004: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26007: \$? = $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:26021: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:26023: result: no" >&5 echo "${ECHO_T}no" >&6 fi echo "$as_me:26027: 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 26035 "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:26050: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:26053: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:26056: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26059: \$? = $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:26072: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:26074: result: no" >&5 echo "${ECHO_T}no" >&6 fi echo "$as_me:26078: 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 26084 "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:26119: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:26122: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:26125: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26128: \$? = $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:26138: result: $ac_cv_type_bool" >&5 echo "${ECHO_T}$ac_cv_type_bool" >&6 echo "$as_me:26141: 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 26150 "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:26182: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:26185: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:26188: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26191: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then ac_lo=0 ac_mid=0 while :; do cat >"conftest.$ac_ext" <<_ACEOF #line 26196 "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:26228: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:26231: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:26234: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26237: \$? = $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 26253 "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:26285: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:26288: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:26291: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26294: \$? = $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 26310 "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:26342: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:26345: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:26348: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26351: \$? = $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:26364: 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 26369 "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:26405: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:26408: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:26410: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26413: \$? = $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:26429: 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 26454 "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:26495: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:26498: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:26500: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26503: \$? = $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:26520: 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:26527: 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:26532: 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 26550 "configure" #include "confdefs.h" #include int main (void) { ; return 0; } _ACEOF rm -f "conftest.$ac_objext" if { (eval echo "$as_me:26564: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:26567: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:26570: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26573: \$? = $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:26594: result: ${cf_result:-(none)}" >&5 echo "${ECHO_T}${cf_result:-(none)}" >&6 CXXFLAGS="$cf_save_CXXFLAGS" if test -n "$CXX"; then echo "$as_me:26599: 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 26616 "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:26635: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:26638: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:26640: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26643: \$? = $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:26662: 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:26671: 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 26688 "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:26707: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:26710: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:26712: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26715: \$? = $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:26734: 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:26744: 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 26758 "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:26802: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:26805: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:26808: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26811: \$? = $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:26829: 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:26878: 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 26884 "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:26919: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:26922: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:26925: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26928: \$? = $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:26938: result: $ac_cv_type_bool" >&5 echo "${ECHO_T}$ac_cv_type_bool" >&6 echo "$as_me:26941: 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 26950 "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:26982: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:26985: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:26988: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:26991: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then ac_lo=0 ac_mid=0 while :; do cat >"conftest.$ac_ext" <<_ACEOF #line 26996 "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:27028: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:27031: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:27034: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:27037: \$? = $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 27053 "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:27085: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:27088: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:27091: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:27094: \$? = $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 27110 "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:27142: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:27145: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:27148: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:27151: \$? = $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:27164: 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 27169 "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:27205: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:27208: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:27210: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:27213: \$? = $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:27229: 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 27254 "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:27295: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:27298: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:27300: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:27303: \$? = $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:27320: 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:27327: 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:27333: 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:27339: 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:27368: WARNING: libtool does not support Ada - disabling feature" >&5 echo "$as_me: WARNING: libtool does not support Ada - disabling feature" >&2;} cf_with_ada=no fi fi if test "$cf_with_ada" != "no" ; then for cf_prog_gnat in gnat gnatmake gprconfig gprbuild do cf_upper_prog_gnat=`echo "${cf_prog_gnat}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` unset ac_cv_path_cf_TEMP_gnat unset cf_TEMP_gnat # Extract the first word of "$cf_prog_gnat", so it can be a program name with args. set dummy $cf_prog_gnat; ac_word=$2 echo "$as_me:27385: 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:27402: 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:27414: result: $cf_TEMP_gnat" >&5 echo "${ECHO_T}$cf_TEMP_gnat" >&6 else echo "$as_me:27417: 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:27427: 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:27438: 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:27467: 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:27486: result: $cf_gprconfig_value" >&5 echo "${ECHO_T}$cf_gprconfig_value" >&6 else echo "$as_me:27489: 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:27502: 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:27513: 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:27522: 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:27530: 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:27545: 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:27554: result: $M4_exists" >&5 echo "${ECHO_T}$M4_exists" >&6 else echo "$as_me:27557: 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:27563: 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:27567: 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:27595: result: $cf_cv_prog_gnat_correct" >&5 echo "${ECHO_T}$cf_cv_prog_gnat_correct" >&6 fi else cf_cv_prog_gnat_correct=no fi fi if test "x$cf_cv_prog_gnat_correct" = xyes; then ADAFLAGS="$ADAFLAGS -gnatpn" echo "$as_me:27607: 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:27624: result: $ADAFLAGS" >&5 echo "${ECHO_T}$ADAFLAGS" >&6 echo "$as_me:27627: 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:27637: 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:27641: 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:27651: 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:27663: 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:27711: 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:27724: 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:27787: 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:27793: checking if GNAT supports libraries" >&5 echo $ECHO_N "checking if GNAT supports libraries... $ECHO_C" >&6 echo "$as_me:27795: 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:27815: 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:27827: 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:27838: result: $cf_ada_compiler" >&5 echo "${ECHO_T}$cf_ada_compiler" >&6 cf_ada_package=terminal_interface echo "$as_me:27843: 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 ".$withval" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval withval="$withval" case ".$withval" in (.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:27879: 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:27888: result: $ADA_INCLUDE" >&5 echo "${ECHO_T}$ADA_INCLUDE" >&6 echo "$as_me:27891: 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 ".$withval" in (.\$\(*\)*|.\'*\'*) ;; (..|./*|.\\*) ;; (.[a-zA-Z]:[\\/]*) # OS/2 EMX ;; (.\$\{*prefix\}*|.\$\{*dir\}*) eval withval="$withval" case ".$withval" in (.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; esac ;; (.no|.NONE/*) withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` ;; (*) { { echo "$as_me:27927: 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:27936: result: $ADA_OBJECTS" >&5 echo "${ECHO_T}$ADA_OBJECTS" >&6 echo "$as_me:27939: 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:27960: result: $with_ada_sharedlib" >&5 echo "${ECHO_T}$with_ada_sharedlib" >&6 if test "x$cf_ada_sharedlib_warn" != xno then { echo "$as_me:27964: 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:27982: 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:27998: 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:28009: 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 28015 "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:28030: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:28033: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:28036: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:28039: \$? = $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:28049: result: $ac_cv_type_wchar_t" >&5 echo "${ECHO_T}$ac_cv_type_wchar_t" >&6 echo "$as_me:28052: 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 28061 "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:28073: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:28076: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:28079: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:28082: \$? = $ac_status" >&5 (exit "$ac_status"); }; }; then ac_lo=0 ac_mid=0 while :; do cat >"conftest.$ac_ext" <<_ACEOF #line 28087 "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:28099: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:28102: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:28105: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:28108: \$? = $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 28124 "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:28136: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:28139: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:28142: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:28145: \$? = $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 28161 "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:28173: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:28176: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest.$ac_objext"' { (eval echo "$as_me:28179: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:28182: \$? = $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:28195: 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 28200 "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:28216: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:28219: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' { (eval echo "$as_me:28221: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:28224: \$? = $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:28240: result: $ac_cv_sizeof_wchar_t" >&5 echo "${ECHO_T}$ac_cv_sizeof_wchar_t" >&6 cat >>confdefs.h <&6 echo "${as_me:-configure}:28253: 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:28271: checking for library subsets" >&5 echo $ECHO_N "checking for library subsets... $ECHO_C" >&6 LIB_SUBSETS= if test "x$cf_with_progs" = xyes || test "$with_ticlib" != no || test "$with_termcap" != no; then LIB_SUBSETS="${LIB_SUBSETS}ticlib" if test "$with_ticlib" != no ; then LIB_SUBSETS="${LIB_SUBSETS} " else LIB_SUBSETS="${LIB_SUBSETS}+" fi fi LIB_SUBSETS="${LIB_SUBSETS}termlib" test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_tinfo" if test "$with_termlib" != no ; then LIB_SUBSETS="${LIB_SUBSETS} " else LIB_SUBSETS="${LIB_SUBSETS}+" fi LIB_SUBSETS="${LIB_SUBSETS}base" # Most term-driver calls are to tinfo, but some like init_pair are to the # base library (so it resides in base). if test "$with_term_driver" != no ; then LIB_SUBSETS="${LIB_SUBSETS}+port_drivers" case "$cf_cv_system_name" in (*mingw32*|*mingw64*) if test "x$with_exp_win32" = xyes ; then LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32" else LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32con" fi CPPFLAGS="$CPPFLAGS -DUSE_WIN32CON_DRIVER" ;; (*) LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo" ;; esac elif test "x$with_exp_win32" = xyes ; then case "$cf_cv_system_name" in (*mingw32*|*mingw64*) LIB_SUBSETS="${LIB_SUBSETS}+port_win32" ;; (*) ;; esac fi test "x$with_widec" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+widechar" test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_funcs" echo "$as_me:28325: 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:28356: 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:28367: result: $DFT_ARG_SUFFIX" >&5 echo "${ECHO_T}$DFT_ARG_SUFFIX" >&6 echo "$as_me:28370: 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:28453: result: $DFT_DEP_SUFFIX" >&5 echo "${ECHO_T}$DFT_DEP_SUFFIX" >&6 echo "$as_me:28456: 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:28472: result: $DFT_OBJ_SUBDIR" >&5 echo "${ECHO_T}$DFT_OBJ_SUBDIR" >&6 if test "x$cf_with_cxx" = xyes ; then echo "$as_me:28476: 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:28569: 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:28745: 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:28754: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:28757: \$? = $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 28768 "configure" #include "confdefs.h" #line 28771 "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:28786: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:28789: \$? = $ac_status" >&5 (exit "$ac_status"); } && { ac_try='test -s "conftest$ac_exeext"' { (eval echo "$as_me:28792: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:28795: \$? = $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:28818: 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:28834: 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:28844: 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:28852: 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:28877: 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:28897: result: $FORM_NAME" >&5 echo "${ECHO_T}$FORM_NAME" >&6 echo "$as_me:28900: 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:28920: result: $MENU_NAME" >&5 echo "${ECHO_T}$MENU_NAME" >&6 echo "$as_me:28923: 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:28943: result: $PANEL_NAME" >&5 echo "${ECHO_T}$PANEL_NAME" >&6 echo "$as_me:28946: 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:28966: 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:28972: 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}:29192: 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:29203: 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:29219: result: $PKG_CFLAGS" >&5 echo "${ECHO_T}$PKG_CFLAGS" >&6 # AC_CHECK_SIZEOF demands a literal parameter, no variables. So we do this. case "x$NCURSES_OSPEED" in (*short*) cf_compatible=1 ;; (*) cf_compatible=0 ;; esac cat >>confdefs.h <&6 echo "${as_me:-configure}:29280: 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:29307: 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:29355: 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:29396: 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 overriden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if cmp -s $cache_file confcache; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi DEFS=-DHAVE_CONFIG_H : "${CONFIG_STATUS=./config.status}" ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:29482: 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:29663: 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:29682: 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.20230903, 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:29812: 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,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t s,@CPP@,$CPP,;t t s,@LDCONFIG@,$LDCONFIG,;t t s,@CXX@,$CXX,;t t s,@CXXFLAGS@,$CXXFLAGS,;t t s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@AWK@,$AWK,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@LINT@,$LINT,;t t s,@LINT_OPTS@,$LINT_OPTS,;t t s,@LINT_LIBS@,$LINT_LIBS,;t t s,@LN_S@,$LN_S,;t t s,@cf_config_suffix@,$cf_config_suffix,;t t s,@PKG_CONFIG@,$PKG_CONFIG,;t t s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t s,@PKG_CONFIG_LIBDIR@,$PKG_CONFIG_LIBDIR,;t t s,@MAKE_PC_FILES@,$MAKE_PC_FILES,;t t s,@PC_MODULE_SUFFIX@,$PC_MODULE_SUFFIX,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@MAKE_NO_PHONY@,$MAKE_NO_PHONY,;t t s,@MAKE_PHONY@,$MAKE_PHONY,;t t s,@CTAGS@,$CTAGS,;t t s,@ETAGS@,$ETAGS,;t t s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t s,@cf_cv_makeflags@,$cf_cv_makeflags,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@LD@,$LD,;t t s,@ac_ct_LD@,$ac_ct_LD,;t t s,@AR@,$AR,;t t s,@ac_ct_AR@,$ac_ct_AR,;t t s,@NM@,$NM,;t t s,@ac_ct_NM@,$ac_ct_NM,;t t s,@ARFLAGS@,$ARFLAGS,;t t s,@DESTDIR@,$DESTDIR,;t t s,@BUILD_CC@,$BUILD_CC,;t t s,@BUILD_CPP@,$BUILD_CPP,;t t s,@BUILD_CFLAGS@,$BUILD_CFLAGS,;t t s,@BUILD_CPPFLAGS@,$BUILD_CPPFLAGS,;t t s,@BUILD_LDFLAGS@,$BUILD_LDFLAGS,;t t s,@BUILD_LIBS@,$BUILD_LIBS,;t t s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t s,@BUILD_OBJEXT@,$BUILD_OBJEXT,;t t s,@cf_list_models@,$cf_list_models,;t t s,@ABI_VERSION@,$ABI_VERSION,;t t s,@LIBTOOL_VERSION@,$LIBTOOL_VERSION,;t t s,@LIBTOOL@,$LIBTOOL,;t t s,@ac_ct_LIBTOOL@,$ac_ct_LIBTOOL,;t t s,@LT_UNDEF@,$LT_UNDEF,;t t s,@LIBTOOL_CXX@,$LIBTOOL_CXX,;t t s,@LIBTOOL_OPTS@,$LIBTOOL_OPTS,;t t s,@LIB_CREATE@,$LIB_CREATE,;t t s,@LIB_OBJECT@,$LIB_OBJECT,;t t s,@LIB_SUFFIX@,$LIB_SUFFIX,;t t s,@LIB_PREP@,$LIB_PREP,;t t s,@LIB_CLEAN@,$LIB_CLEAN,;t t s,@LIB_COMPILE@,$LIB_COMPILE,;t t s,@LIB_LINK@,$LIB_LINK,;t t s,@LIB_INSTALL@,$LIB_INSTALL,;t t s,@LIB_UNINSTALL@,$LIB_UNINSTALL,;t t s,@DFT_LWR_MODEL@,$DFT_LWR_MODEL,;t t s,@DFT_UPR_MODEL@,$DFT_UPR_MODEL,;t t s,@TICS_NAME@,$TICS_NAME,;t t s,@TINFO_NAME@,$TINFO_NAME,;t t s,@LIB_NAME@,$LIB_NAME,;t t s,@LIB_PREFIX@,$LIB_PREFIX,;t t s,@CC_G_OPT@,$CC_G_OPT,;t t s,@CXX_G_OPT@,$CXX_G_OPT,;t t s,@LD_MODEL@,$LD_MODEL,;t t s,@shlibdir@,$shlibdir,;t t s,@MAKE_DLLS@,$MAKE_DLLS,;t t s,@CC_SHARED_OPTS@,$CC_SHARED_OPTS,;t t s,@LD_RPATH_OPT@,$LD_RPATH_OPT,;t t s,@LD_SHARED_OPTS@,$LD_SHARED_OPTS,;t t s,@MK_SHARED_LIB@,$MK_SHARED_LIB,;t t s,@RM_SHARED_OPTS@,$RM_SHARED_OPTS,;t t s,@LINK_PROGS@,$LINK_PROGS,;t t s,@LINK_TESTS@,$LINK_TESTS,;t t s,@EXTRA_LDFLAGS@,$EXTRA_LDFLAGS,;t t s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t s,@LOCAL_LDFLAGS2@,$LOCAL_LDFLAGS2,;t t s,@INSTALL_LIB@,$INSTALL_LIB,;t t s,@RPATH_LIST@,$RPATH_LIST,;t t s,@EXPORT_SYMS@,$EXPORT_SYMS,;t t s,@RESULTING_SYMS@,$RESULTING_SYMS,;t t s,@VERSIONED_SYMS@,$VERSIONED_SYMS,;t t s,@WILDCARD_SYMS@,$WILDCARD_SYMS,;t t s,@cf_ldd_prog@,$cf_ldd_prog,;t t s,@EXTRA_PKG_LDFLAGS@,$EXTRA_PKG_LDFLAGS,;t t s,@EXTRA_SUFFIX@,$EXTRA_SUFFIX,;t t s,@TERMINFO_SRC@,$TERMINFO_SRC,;t t s,@NCURSES_USE_DATABASE@,$NCURSES_USE_DATABASE,;t t s,@TIC@,$TIC,;t t s,@ac_ct_TIC@,$ac_ct_TIC,;t t s,@INFOCMP@,$INFOCMP,;t t s,@ac_ct_INFOCMP@,$ac_ct_INFOCMP,;t t s,@FALLBACK_LIST@,$FALLBACK_LIST,;t t s,@USE_FALLBACKS@,$USE_FALLBACKS,;t t s,@WHICH_XTERM@,$WHICH_XTERM,;t t s,@XTERM_KBS@,$XTERM_KBS,;t t s,@TERMINFO_DIRS@,$TERMINFO_DIRS,;t t s,@TERMINFO@,$TERMINFO,;t t s,@MAKE_TERMINFO@,$MAKE_TERMINFO,;t t s,@USE_BIG_STRINGS@,$USE_BIG_STRINGS,;t t s,@TERMPATH@,$TERMPATH,;t t s,@NCURSES_USE_TERMCAP@,$NCURSES_USE_TERMCAP,;t t s,@BROKEN_LINKER@,$BROKEN_LINKER,;t t s,@NCURSES_WCWIDTH_GRAPHICS@,$NCURSES_WCWIDTH_GRAPHICS,;t t s,@NCURSES_CH_T@,$NCURSES_CH_T,;t t s,@NCURSES_LIBUTF8@,$NCURSES_LIBUTF8,;t t s,@NEED_WCHAR_H@,$NEED_WCHAR_H,;t t s,@NCURSES_MBSTATE_T@,$NCURSES_MBSTATE_T,;t t s,@NCURSES_WCHAR_T@,$NCURSES_WCHAR_T,;t t s,@NCURSES_WINT_T@,$NCURSES_WINT_T,;t t s,@NCURSES_OK_WCHAR_T@,$NCURSES_OK_WCHAR_T,;t t s,@NCURSES_OK_WINT_T@,$NCURSES_OK_WINT_T,;t t s,@cf_cv_enable_lp64@,$cf_cv_enable_lp64,;t t s,@NCURSES_TPARM_VARARGS@,$NCURSES_TPARM_VARARGS,;t t s,@NCURSES_WATTR_MACROS@,$NCURSES_WATTR_MACROS,;t t s,@RGB_PATH@,$RGB_PATH,;t t s,@no_x11_rgb@,$no_x11_rgb,;t t s,@NCURSES_BOOL@,$NCURSES_BOOL,;t t s,@TERMINFO_CAPS@,$TERMINFO_CAPS,;t t s,@NCURSES_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,@MANPAGE_RENAMES@,$MANPAGE_RENAMES,;t t s,@NCURSES_EXT_FUNCS@,$NCURSES_EXT_FUNCS,;t t s,@GENERATED_EXT_FUNCS@,$GENERATED_EXT_FUNCS,;t t s,@NCURSES_SP_FUNCS@,$NCURSES_SP_FUNCS,;t t s,@GENERATED_SP_FUNCS@,$GENERATED_SP_FUNCS,;t t s,@NCURSES_CONST@,$NCURSES_CONST,;t t s,@NCURSES_EXT_COLORS@,$NCURSES_EXT_COLORS,;t t s,@NCURSES_MOUSE_VERSION@,$NCURSES_MOUSE_VERSION,;t t s,@NCURSES_XNAMES@,$NCURSES_XNAMES,;t t s,@PTHREAD@,$PTHREAD,;t t s,@cf_cv_enable_reentrant@,$cf_cv_enable_reentrant,;t t s,@cf_cv_enable_opaque@,$cf_cv_enable_opaque,;t t s,@NCURSES_SIZE_T@,$NCURSES_SIZE_T,;t t s,@NCURSES_OPAQUE@,$NCURSES_OPAQUE,;t t s,@NCURSES_OPAQUE_FORM@,$NCURSES_OPAQUE_FORM,;t t s,@NCURSES_OPAQUE_MENU@,$NCURSES_OPAQUE_MENU,;t t s,@NCURSES_OPAQUE_PANEL@,$NCURSES_OPAQUE_PANEL,;t t s,@NCURSES_WRAP_PREFIX@,$NCURSES_WRAP_PREFIX,;t t s,@NCURSES_IMPEXP@,$NCURSES_IMPEXP,;t t s,@NCURSES_CXX_IMPEXP@,$NCURSES_CXX_IMPEXP,;t t s,@NCURSES_INTEROP_FUNCS@,$NCURSES_INTEROP_FUNCS,;t t s,@NCURSES_WGETCH_EVENTS@,$NCURSES_WGETCH_EVENTS,;t t s,@EXP_WIN32_DRIVER@,$EXP_WIN32_DRIVER,;t t s,@INTERNALS_HDR@,$INTERNALS_HDR,;t t s,@ECHO_LT@,$ECHO_LT,;t t s,@ECHO_LD@,$ECHO_LD,;t t s,@RULE_CC@,$RULE_CC,;t t s,@SHOW_CC@,$SHOW_CC,;t t s,@ECHO_CC@,$ECHO_CC,;t t s,@ECHO_LINK@,$ECHO_LINK,;t t s,@INSTALL_OPT_S@,$INSTALL_OPT_S,;t t s,@INSTALL_OPT_O@,$INSTALL_OPT_O,;t t s,@INSTALL_OPT_P@,$INSTALL_OPT_P,;t t s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t s,@HAVE_STDNORETURN_H@,$HAVE_STDNORETURN_H,;t t s,@STDC_NORETURN@,$STDC_NORETURN,;t t s,@ADAFLAGS@,$ADAFLAGS,;t t s,@EXTRA_CXXFLAGS@,$EXTRA_CXXFLAGS,;t t s,@ADA_TRACE@,$ADA_TRACE,;t t s,@MATH_LIB@,$MATH_LIB,;t t s,@NCURSES_INLINE@,$NCURSES_INLINE,;t t s,@cf_cv_typeof_chtype@,$cf_cv_typeof_chtype,;t t s,@cf_cv_1UL@,$cf_cv_1UL,;t t s,@cf_cv_typeof_mmask_t@,$cf_cv_typeof_mmask_t,;t t s,@HAVE_VSSCANF@,$HAVE_VSSCANF,;t t s,@TEST_LIBS@,$TEST_LIBS,;t t s,@TEST_LIBS2@,$TEST_LIBS2,;t t s,@CXXCPP@,$CXXCPP,;t t s,@CXXLDFLAGS@,$CXXLDFLAGS,;t t s,@CXX_AR@,$CXX_AR,;t t s,@CXX_ARFLAGS@,$CXX_ARFLAGS,;t t s,@CXXLIBS@,$CXXLIBS,;t t s,@USE_CXX_BOOL@,$USE_CXX_BOOL,;t t s,@cf_TEMP_gnat@,$cf_TEMP_gnat,;t t s,@M4_exists@,$M4_exists,;t t s,@cf_ada_make@,$cf_ada_make,;t t s,@cf_ada_config@,$cf_ada_config,;t t s,@cf_ada_config_Ada@,$cf_ada_config_Ada,;t t s,@cf_ada_config_C@,$cf_ada_config_C,;t t s,@GNATPREP_OPTS@,$GNATPREP_OPTS,;t t s,@cf_compile_generics@,$cf_compile_generics,;t t s,@cf_generic_objects@,$cf_generic_objects,;t t s,@USE_GNAT_SIGINT@,$USE_GNAT_SIGINT,;t t s,@USE_OLD_MAKERULES@,$USE_OLD_MAKERULES,;t t s,@USE_GNAT_PROJECTS@,$USE_GNAT_PROJECTS,;t t s,@USE_GNAT_LIBRARIES@,$USE_GNAT_LIBRARIES,;t t s,@USE_GNAT_MAKE_GPR@,$USE_GNAT_MAKE_GPR,;t t s,@USE_GNAT_GPRBUILD@,$USE_GNAT_GPRBUILD,;t t s,@cf_ada_compiler@,$cf_ada_compiler,;t t s,@cf_ada_package@,$cf_ada_package,;t t s,@ADA_INCLUDE@,$ADA_INCLUDE,;t t s,@ADA_OBJECTS@,$ADA_OBJECTS,;t t s,@ADA_SHAREDLIB@,$ADA_SHAREDLIB,;t t s,@MAKE_ADA_SHAREDLIB@,$MAKE_ADA_SHAREDLIB,;t t s,@ADA_LIBNAME@,$ADA_LIBNAME,;t t s,@ACPPFLAGS@,$ACPPFLAGS,;t t s,@DFT_ARG_SUFFIX@,$DFT_ARG_SUFFIX,;t t s,@DFT_DEP_SUFFIX@,$DFT_DEP_SUFFIX,;t t s,@DFT_OBJ_SUBDIR@,$DFT_OBJ_SUBDIR,;t t s,@CXX_LIB_SUFFIX@,$CXX_LIB_SUFFIX,;t t s,@USE_ARG_SUFFIX@,$USE_ARG_SUFFIX,;t t s,@USE_CFG_SUFFIX@,$USE_CFG_SUFFIX,;t t s,@USE_LIB_SUFFIX@,$USE_LIB_SUFFIX,;t t s,@TICS_ARG_SUFFIX@,$TICS_ARG_SUFFIX,;t t s,@TICS_DEP_SUFFIX@,$TICS_DEP_SUFFIX,;t t s,@TICS_LIB_SUFFIX@,$TICS_LIB_SUFFIX,;t t s,@TICS_LDFLAGS@,$TICS_LDFLAGS,;t t s,@TICS_LIBS@,$TICS_LIBS,;t t s,@TINFO_ARG_SUFFIX@,$TINFO_ARG_SUFFIX,;t t s,@TINFO_DEP_SUFFIX@,$TINFO_DEP_SUFFIX,;t t s,@TINFO_LIB_SUFFIX@,$TINFO_LIB_SUFFIX,;t t s,@TINFO_LDFLAGS@,$TINFO_LDFLAGS,;t t s,@TINFO_LIBS@,$TINFO_LIBS,;t t s,@TINFO_LDFLAGS2@,$TINFO_LDFLAGS2,;t t s,@LDFLAGS_STATIC@,$LDFLAGS_STATIC,;t t s,@LDFLAGS_SHARED@,$LDFLAGS_SHARED,;t t s,@includesubdir@,$includesubdir,;t t s,@WITH_OVERWRITE@,$WITH_OVERWRITE,;t t s,@TICS_LIST@,$TICS_LIST,;t t s,@TINFO_LIST@,$TINFO_LIST,;t t s,@SHLIB_LIST@,$SHLIB_LIST,;t t s,@FORM_NAME@,$FORM_NAME,;t t s,@MENU_NAME@,$MENU_NAME,;t t s,@PANEL_NAME@,$PANEL_NAME,;t t s,@CXX_NAME@,$CXX_NAME,;t t s,@TEST_ARGS@,$TEST_ARGS,;t t s,@TEST_DEPS@,$TEST_DEPS,;t t s,@TEST_ARG2@,$TEST_ARG2,;t t s,@TEST_DEP2@,$TEST_DEP2,;t t s,@PC_MODULES_TO_MAKE@,$PC_MODULES_TO_MAKE,;t t s,@ADA_SUBDIRS@,$ADA_SUBDIRS,;t t s,@DIRS_TO_MAKE@,$DIRS_TO_MAKE,;t t s,@NCURSES_SHLIB2@,$NCURSES_SHLIB2,;t t s,@HAVE_TCGETATTR@,$HAVE_TCGETATTR,;t t s,@HAVE_STDINT_H@,$HAVE_STDINT_H,;t t s,@HAVE_TERMIO_H@,$HAVE_TERMIO_H,;t t s,@HAVE_TERMIOS_H@,$HAVE_TERMIOS_H,;t t s,@cross_compiling@,$cross_compiling,;t t s,@MAKE_TESTS@,$MAKE_TESTS,;t t s,@ADAHTML_DIR@,$ADAHTML_DIR,;t t s,@LIBTOOL_OPTS_CXX@,$LIBTOOL_OPTS_CXX,;t t s,@PKG_CFLAGS@,$PKG_CFLAGS,;t t s,@MISC_INSTALL_DATA@,$MISC_INSTALL_DATA,;t t s,@MISC_UNINSTALL_DATA@,$MISC_UNINSTALL_DATA,;t t s,@MAKE_DATABASE@,$MAKE_DATABASE,;t t s,@UNALTERED_SYMS@,$UNALTERED_SYMS,;t t s,@ADAGEN_LDFLAGS@,$ADAGEN_LDFLAGS,;t t s,@CHECK_BUILD@,$CHECK_BUILD,;t t s,@PRIVATE_LIBS@,$PRIVATE_LIBS,;t t s,@LD_SEARCHPATH@,$LD_SEARCHPATH,;t t CEOF EOF cat >>"$CONFIG_STATUS" <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while "$ac_more_lines"; do if test "$ac_beg" -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag else sed "${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag fi if test ! -s "$tmp"/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat "$tmp"/subs.frag) >"$tmp"/subs-$ac_sed_frag.sed # It is possible to make a multiline substitution using escaped newlines. # Ensure that we do not split the substitution between script fragments. ac_BEG=$ac_end ac_END=`expr "$ac_end" + "$ac_max_sed_lines"` sed "1,${ac_BEG}d; ${ac_END}p; q" "$tmp"/subs.sed >"$tmp"/subs.next if test -s "$tmp"/subs.next; then grep '^s,@[^@,][^@,]*@,.*\\$' "$tmp"/subs.next >"$tmp"/subs.edit if test ! -s "$tmp"/subs.edit; then grep "^s,@[^@,][^@,]*@,.*,;t t$" "$tmp"/subs.next >"$tmp"/subs.edit if test ! -s "$tmp"/subs.edit; then if test "$ac_beg" -gt 1; then ac_end=`expr "$ac_end" - 1` continue fi fi fi fi if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f \"$tmp\"/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f \"$tmp\"/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr "$ac_sed_frag" + 1` ac_beg=$ac_end ac_end=`expr "$ac_end" + "$ac_max_sed_lines"` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds="cat" fi fi # test -n "$CONFIG_FILES" EOF cat >>"$CONFIG_STATUS" <<\EOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in - | *:- | *:-:* ) # input from stdin cat >"$tmp"/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then { case "$ac_dir" in [\\/]* | ?:[\\/]* ) as_incr_dir=;; *) as_incr_dir=.;; esac as_dummy="$ac_dir" for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do case $as_mkdir_dir in # Skip DOS drivespec ?:) as_incr_dir=$as_mkdir_dir ;; *) as_incr_dir=$as_incr_dir/$as_mkdir_dir test -d "$as_incr_dir" || mkdir "$as_incr_dir" ;; esac done; } ac_dir_suffix="/`echo "$ac_dir"|sed 's,^\./,,'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'` else ac_dir_suffix= ac_dots= fi case "$srcdir" in .) ac_srcdir=. if test -z "$ac_dots"; then ac_top_srcdir=. else ac_top_srcdir=`echo "$ac_dots" | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) ac_srcdir="$srcdir$ac_dir_suffix"; ac_top_srcdir="$srcdir" ;; *) # Relative path. ac_srcdir="$ac_dots$srcdir$ac_dir_suffix" ac_top_srcdir="$ac_dots$srcdir" ;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_dots$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:30331: 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:30349: 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:30362: 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:30378: 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:30387: 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:30432: 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:30443: 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:30492: 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:30503: 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:30516: 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:30574: $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}:30961: 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