diff options
Diffstat (limited to 'ncurses')
214 files changed, 9152 insertions, 3843 deletions
diff --git a/ncurses/Makefile.in b/ncurses/Makefile.in index 2b5e1c0..b242078 100644 --- a/ncurses/Makefile.in +++ b/ncurses/Makefile.in @@ -1,6 +1,7 @@ -# $Id: Makefile.in,v 1.146 2015/01/21 10:24:18 tom Exp $ +# $Id: Makefile.in,v 1.168 2020/02/02 23:34:34 tom Exp $ ############################################################################## -# Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. # +# Copyright 2018-2019,2020 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"), # @@ -45,7 +46,7 @@ # turn off _all_ suffix rules; we'll generate our own .SUFFIXES: -SHELL = /bin/sh +SHELL = @SHELL@ VPATH = @srcdir@ THIS = Makefile @@ -83,7 +84,7 @@ LT_UNDEF = @LT_UNDEF@ INSTALL = @INSTALL@ INSTALL_LIB = @INSTALL@ @INSTALL_LIB@ -INSTALL_PROG = @INSTALL_PROGRAM@ +INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ INSTALL_DATA = @INSTALL_DATA@ AR = @AR@ @@ -101,7 +102,7 @@ CPP = @CPP@ CFLAGS = @CFLAGS@ INCDIR = $(srcdir)/../include -CPPFLAGS = -DHAVE_CONFIG_H @CPPFLAGS@ +CPPFLAGS = -DHAVE_CONFIG_H -I../ncurses @CPPFLAGS@ CCFLAGS = $(CPPFLAGS) $(CFLAGS) @@ -126,12 +127,12 @@ CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) LINK = $(LIBTOOL) -LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@ +LDFLAGS = @LDFLAGS@ @LD_MODEL@ SHLIB_DIRS = -L../lib -SHLIB_LIST = $(SHLIB_DIRS) @SHLIB_LIST@ -TINFO_LIST = $(SHLIB_DIRS) @TINFO_LIST@ -TICS_LIST = $(SHLIB_DIRS) @TICS_LIST@ +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@ @@ -155,14 +156,17 @@ 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_PATH@ +TIC_PATH = @TIC@ +INFOCMP_PATH = @INFOCMP@ AUTO_SRC = \ ./codes.c \ ./comp_captab.c \ + ./comp_userdefs.c \ ./expanded.c \ ./fallback.c \ ./lib_gen.c \ @@ -192,9 +196,12 @@ TEST_LDFLAGS = @LD_MODEL@ $(TEST_ARGS) @LIBS@ @LOCAL_LDFLAGS@ @LDFLAGS@ TEST_PROGS = \ captoinfo$x \ hardscroll$x \ - link_test$x \ hashmap$x \ - lib_mvcur$x + lib_mvcur$x \ + link_test$x \ + report_hashing$x + +LOCAL_LIBDIR = @top_builddir@/lib base = $(srcdir)/base serial = $(srcdir)/tty @@ -204,8 +211,9 @@ wide = $(srcdir)/widechar win32con = $(srcdir)/win32con ################################################################################ -all \ -libs :: $(AUTO_SRC) ../lib $(LIBRARIES) +all libs :: $(AUTO_SRC) ../lib $(LIBRARIES) + +@CHECK_BUILD@all libs :: report_offsets$(BUILD_EXEEXT) sources: $(AUTO_SRC) @@ -216,45 +224,59 @@ $(DESTDIR)$(libdir) : ../lib : ; mkdir $@ ./fallback.c : $(tinfo)/MKfallback.sh - sh -e $(tinfo)/MKfallback.sh $(TERMINFO) $(TERMINFO_SRC) $(TIC_PATH) $(FALLBACK_LIST) >$@ + $(SHELL) -e $(tinfo)/MKfallback.sh $(TERMINFO) $(TERMINFO_SRC) $(TIC_PATH) $(INFOCMP_PATH) $(FALLBACK_LIST) >$@ ./lib_gen.c : $(base)/MKlib_gen.sh ../include/curses.h - sh -e $(base)/MKlib_gen.sh "$(CPP) $(CPPFLAGS)" "$(AWK)" generated <../include/curses.h >$@ + $(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) sh $(tinfo)/MKkeys_list.sh $(TERMINFO_CAPS) | sort >$@ + 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 - sh -e $(serial)/MKexpanded.sh "$(CPP)" $(CPPFLAGS) > $@ + $(SHELL) -e $(serial)/MKexpanded.sh "$(CPP)" $(CPPFLAGS) > $@ ./comp_captab.c: \ make_hash$(BUILD_EXEEXT) \ ../include/hashsize.h \ $(tinfo)/MKcaptab.sh \ $(tinfo)/MKcaptab.awk - sh -e $(tinfo)/MKcaptab.sh $(AWK) $(USE_BIG_STRINGS) $(tinfo)/MKcaptab.awk $(srcdir)/../include/@TERMINFO_CAPS@ > $@ + $(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) $(srcdir)/../include/@TERMINFO_CAPS@ >$@ + $(AWK) -f $(tinfo)/MKcodes.awk bigstrings=$(USE_BIG_STRINGS) $(CAPLIST) >$@ ./names.c: $(tinfo)/MKnames.awk - $(AWK) -f $(tinfo)/MKnames.awk bigstrings=$(USE_BIG_STRINGS) $(srcdir)/../include/@TERMINFO_CAPS@ >$@ + $(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) >$@ @@ -266,13 +288,15 @@ tags: @MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] */*.[ch] mostlyclean :: - -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace + -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 @@ -290,7 +314,7 @@ realclean :: distclean test_progs : $(TEST_PROGS) ./link_test.c : $(base)/MKlib_gen.sh ../include/curses.h - sh -e $(base)/MKlib_gen.sh "$(CPP) $(CPPFLAGS)" "$(AWK)" implemented <../include/curses.h >$@ + $(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) @@ -312,6 +336,11 @@ link_test$x : ./link_test.c $(TEST_DEPS) \ ../@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) + ############################################################################### # The remainder of this file is automatically generated during configuration ############################################################################### diff --git a/ncurses/README b/ncurses/README index cbde335..f52a652 100644 --- a/ncurses/README +++ b/ncurses/README @@ -1,5 +1,6 @@ ------------------------------------------------------------------------------- --- Copyright (c) 1998-2006,2009 Free Software Foundation, Inc. -- +-- 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 -- @@ -25,7 +26,7 @@ -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------- --- $Id: README,v 1.10 2009/06/27 14:44:30 tom Exp $ +-- $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. diff --git a/ncurses/README.IZ b/ncurses/README.IZ index 78206cd..25058a9 100644 --- a/ncurses/README.IZ +++ b/ncurses/README.IZ @@ -1,5 +1,6 @@ ------------------------------------------------------------------------------- --- Copyright (c) 2002,2006 Free Software Foundation, Inc. -- +-- Copyright 2020 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 -- @@ -25,11 +26,11 @@ -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------- --- $Id: README.IZ,v 1.2 2006/04/22 23:13:05 tom Exp $ +-- $Id: README.IZ,v 1.4 2020/02/02 23:34:34 tom Exp $ --------------------------------------------------------------------- Here is the patch. I did no testing whatsoever with event watching -requests present (I need some applications which exersize this before +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... diff --git a/ncurses/SigAction.h b/ncurses/SigAction.h index 5dfde64..30f2474 100644 --- a/ncurses/SigAction.h +++ b/ncurses/SigAction.h @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998,2000 Free Software Foundation, Inc. * + * 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 * @@ -32,7 +33,7 @@ ****************************************************************************/ /* - * $Id: SigAction.h,v 1.8 2005/08/06 20:05:32 tom Exp $ + * $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 <unistd.h>, * and usually no sigaction() nor <termios.h> diff --git a/ncurses/base/MKkeyname.awk b/ncurses/base/MKkeyname.awk index 7901611..b3d04ee 100644 --- a/ncurses/base/MKkeyname.awk +++ b/ncurses/base/MKkeyname.awk @@ -1,6 +1,7 @@ -# $Id: MKkeyname.awk,v 1.48 2013/08/24 17:37:22 tom Exp $ +# $Id: MKkeyname.awk,v 1.51 2020/02/02 23:34:34 tom Exp $ ############################################################################## -# Copyright (c) 1999-2012,2013 Free Software Foundation, Inc. # +# 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"), # @@ -70,14 +71,13 @@ END { print "NCURSES_EXPORT(NCURSES_CONST char *)" print "safe_keyname (SCREEN *sp, int c)" print "{" - print " int i;" print " char name[20];" - print " char *p;" 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) {" @@ -114,7 +114,7 @@ END { print " /* create and cache result as needed */" print " if (MyTable[c] == 0) {" print " int cc = c;" - print " p = name;" + 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);" @@ -135,7 +135,7 @@ END { print " } else if (result == 0 && HasTerminal(sp)) {" print " int j, k;" print " char * bound;" - print " TERMTYPE *tp = &(TerminalOf(sp)->type);" + print " TERMTYPE2 *tp = &TerminalType(TerminalOf(sp));" print " unsigned save_trace = _nc_tracing;" print "" print " _nc_tracing = 0; /* prevent recursion via keybound() */" @@ -166,8 +166,8 @@ END { print "#if NO_LEAKS" print "void _nc_keyname_leaks(void)" print "{" - print " int j;" print " if (MyTable != 0) {" + print " int j;" print " for (j = 0; j < SIZEOF_TABLE; ++j) {" print " FreeIfNeeded(MyTable[j]);" print " }" diff --git a/ncurses/base/MKlib_gen.sh b/ncurses/base/MKlib_gen.sh index b91398c..5a3770e 100755 --- a/ncurses/base/MKlib_gen.sh +++ b/ncurses/base/MKlib_gen.sh @@ -2,10 +2,11 @@ # # MKlib_gen.sh -- generate sources from curses.h macro definitions # -# ($Id: MKlib_gen.sh,v 1.47 2014/12/06 18:56:25 tom Exp $) +# ($Id: MKlib_gen.sh,v 1.63 2020/02/02 23:34:34 tom Exp $) # ############################################################################## -# Copyright (c) 1998-2011,2014 Free Software Foundation, Inc. # +# 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"), # @@ -62,10 +63,27 @@ 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_INTERNALS -I../include" +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. +PRG=`echo "$1" | $AWK '{ sub(/^[ ]*/,""); sub(/[ ].*$/, ""); print; }' || exit 0` +FSF=`"$PRG" --version 2>/dev/null || exit 0 | fgrep "Free Software Foundation" | head -n 1` +ALL=`"$PRG" -dumpversion 2>/dev/null || exit 0` +ONE=`echo "$ALL" | sed -e 's/\..*$//'` +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 @@ -74,7 +92,7 @@ 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" 0 1 2 5 15 +trap "rm -f $ED1 $ED2 $ED3 $ED4 $AW1 $AW2 $TMP" 0 1 2 3 15 ALL=$USE if test "$USE" = implemented ; then @@ -82,6 +100,7 @@ if test "$USE" = implemented ; then cat >$ED1 <<EOF1 /^extern.*implemented/{ h + s/GCC_DEPRECATED([^)]*)// s/NCURSES_SP_NAME(\([^)]*\))/NCURSES_SP_NAME___\1/ h s/^.*implemented:\([^ *]*\).*/P_POUNDCif_USE_\1_SUPPORT/p @@ -160,6 +179,7 @@ EOF3 if test "$USE" = generated ; then cat >$ED4 <<EOF s/^\(.*\) \(.*\) (\(.*\))\$/NCURSES_EXPORT(\1) (\2) (\3)/ + /attr_[sg]et.* z)/s,z),z GCC_UNUSED), EOF else cat >$ED4 <<EOF @@ -213,7 +233,7 @@ $0 !~ /^P_/ { } else if ( $first == "bool" || $first == "NCURSES_BOOL" ) { returnType = "Bool"; } else if ( $second == "*" ) { - returnType = "Ptr"; + returnType = ($1 == "NCURSES_CONST") ? "CPtr" : "Ptr"; } else { returnType = "Code"; } @@ -224,6 +244,9 @@ $0 !~ /^P_/ { break; } } + if (using == "implemented") { + printf "#undef %s\n", $myfunc; + } print $0; print "{"; argcount = 1; @@ -256,6 +279,11 @@ $0 !~ /^P_/ { dotrace = 0; } + do_getstr = 0; + if ($myfunc ~ /get[n]?str/) { + do_getstr = 1; + } + call = "@@T((T_CALLED(\"" args = "" comma = "" @@ -292,7 +320,11 @@ $0 !~ /^P_/ { call = call "%s" } else if (pointer) { if ( argtype == "char" ) { - call = call "%s" + if (do_getstr) { + call = call "%p" + } else { + call = call "%s" + } comma = comma "_nc_visbuf2(" num "," pointer = 0; } else { @@ -342,7 +374,7 @@ $0 !~ /^P_/ { call = call ")); " if (dotrace) - printf "%s", call + printf "%s\n\t@@", call if (match($0, "^void")) { call = "" @@ -381,9 +413,10 @@ EOF1 cat >$AW2 <<EOF1 BEGIN { + printf "/* This file was generated by $0 $USE */\n" + print "" print "/*" print " * DO NOT EDIT THIS FILE BY HAND!" - printf " * It is generated by $0 %s.\n", "$USE" if ( "$USE" == "generated" ) { print " *" print " * This is a file of trivial functions generated from macro" @@ -403,11 +436,6 @@ BEGIN { print "" print "#include <curses.priv.h>" print "" - print "#undef vw_scanw" - print "#undef vwscanw" - print "" - print "#undef vw_printw" - print "#undef vwprintw" } /^DECLARATIONS/ {start = 1; next;} { @@ -432,16 +460,16 @@ END { for (n = 1; n < start; ++n) { value = calls[n]; if ( value !~ /P_POUNDC/ ) { - gsub(/[[:blank:]]+/," ",value); - sub(/^[[:alnum:]_]+ /,"",value); + gsub(/[ \t]+/," ",value); + sub(/^[0-9a-zA-Z_]+ /,"",value); sub(/^\* /,"",value); - gsub(/[[:alnum:]_]+ \* /,"",value); + gsub(/[0-9a-zA-Z_]+ \* /,"",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[[:digit:]]|z) /, " 0 ", value); - gsub(/ int[[:blank:]]*[(][^)]+[)][(][^)]+[)]/, "0", value); + gsub(/ (a[0-9]|z) /, " 0 ", value); + gsub(/ int[ \t]*[(][^)]+[)][(][^)]+[)]/, "0", value); printf "\t%s;\n", value; } else { print value; @@ -474,22 +502,11 @@ sed -n -f $ED1 \ -e 's/gen_$//' \ -e 's/ / /g' >>$TMP -cat >$ED1 <<EOF -s/ / /g -s/^ // -s/ $// -s/P_NCURSES_BOOL/NCURSES_BOOL/g -EOF - -# A patch discussed here: -# https://gcc.gnu.org/ml/gcc-patches/2014-06/msg02185.html -# introduces spurious #line markers. Work around that by ignoring the system's -# attempt to define "bool" and using our own symbol here. -sed -e 's/bool/P_NCURSES_BOOL/g' $TMP > $ED2 -cat $ED2 >$TMP - $preprocessor $TMP 2>/dev/null \ -| sed -f $ED1 \ +| sed \ + -e 's/ / /g' \ + -e 's/^ //' \ + -e 's/_Bool/NCURSES_BOOL/g' \ | $AWK -f $AW2 \ | sed -f $ED3 \ | sed \ diff --git a/ncurses/base/MKunctrl.awk b/ncurses/base/MKunctrl.awk index 51ceb63..9a2a6db 100644 --- a/ncurses/base/MKunctrl.awk +++ b/ncurses/base/MKunctrl.awk @@ -1,6 +1,7 @@ -# $Id: MKunctrl.awk,v 1.27 2012/06/09 20:29:33 tom Exp $ +# $Id: MKunctrl.awk,v 1.29 2020/02/02 23:34:34 tom Exp $ ############################################################################## -# Copyright (c) 1998-2009,2012 Free Software Foundation, Inc. # +# 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"), # @@ -143,6 +144,7 @@ END { 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)" diff --git a/ncurses/base/README b/ncurses/base/README index 4677e42..2710b36 100644 --- a/ncurses/base/README +++ b/ncurses/base/README @@ -1,5 +1,6 @@ ------------------------------------------------------------------------------- --- Copyright (c) 1998,2006 Free Software Foundation, Inc. -- +-- 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 -- @@ -25,7 +26,7 @@ -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------- --- $Id: README,v 1.2 2006/04/22 22:19:37 tom Exp $ +-- $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 diff --git a/ncurses/base/define_key.c b/ncurses/base/define_key.c index c78375a..fb9ae36 100644 --- a/ncurses/base/define_key.c +++ b/ncurses/base/define_key.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2014 Free Software Foundation, Inc. * + * 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 * @@ -33,7 +34,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: define_key.c,v 1.21 2014/03/08 20:32:59 tom Exp $") +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) diff --git a/ncurses/base/key_defined.c b/ncurses/base/key_defined.c index ef987a5..25d5a67 100644 --- a/ncurses/base/key_defined.c +++ b/ncurses/base/key_defined.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2003-2006,2009 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -32,7 +33,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: key_defined.c,v 1.9 2009/10/24 22:15:47 tom Exp $") +MODULE_ID("$Id: key_defined.c,v 1.10 2020/02/02 23:34:34 tom Exp $") static int find_definition(TRIES * tree, const char *str) diff --git a/ncurses/base/keybound.c b/ncurses/base/keybound.c index 72790e8..bbd912a 100644 --- a/ncurses/base/keybound.c +++ b/ncurses/base/keybound.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1999-2009,2011 Free Software Foundation, Inc. * + * 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 * @@ -33,7 +34,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: keybound.c,v 1.11 2011/10/22 16:47:05 tom Exp $") +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 diff --git a/ncurses/base/keyok.c b/ncurses/base/keyok.c index 37fddec..8e0b962 100644 --- a/ncurses/base/keyok.c +++ b/ncurses/base/keyok.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2014 Free Software Foundation, Inc. * + * 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 * @@ -33,7 +34,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: keyok.c,v 1.14 2014/03/08 20:32:59 tom Exp $") +MODULE_ID("$Id: keyok.c,v 1.16 2020/02/02 23:34:34 tom Exp $") /* * Enable (or disable) ncurses' interpretation of a keycode by adding (or @@ -55,7 +56,6 @@ NCURSES_SP_NAME(keyok) (NCURSES_SP_DCLx int c, bool flag) #ifdef USE_TERM_DRIVER code = CallDriver_2(sp, td_kyOk, c, flag); #else - T((T_CALLED("keyok(%d,%d)"), c, flag)); if (c >= 0) { int count = 0; char *s; diff --git a/ncurses/base/legacy_coding.c b/ncurses/base/legacy_coding.c index d8c8020..a71aee0 100644 --- a/ncurses/base/legacy_coding.c +++ b/ncurses/base/legacy_coding.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2005,2009 Free Software Foundation, Inc. * + * 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 * @@ -33,7 +34,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: legacy_coding.c,v 1.5 2009/10/24 22:15:00 tom Exp $") +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) diff --git a/ncurses/base/lib_addch.c b/ncurses/base/lib_addch.c index 4b16a47..604b13b 100644 --- a/ncurses/base/lib_addch.c +++ b/ncurses/base/lib_addch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -36,7 +37,7 @@ #include <curses.priv.h> #include <ctype.h> -MODULE_ID("$Id: lib_addch.c,v 1.129 2014/08/16 20:41:04 tom Exp $") +MODULE_ID("$Id: lib_addch.c,v 1.134 2020/02/02 23:34:34 tom Exp $") static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT); @@ -51,7 +52,7 @@ static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT); */ /* 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)) +#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) @@ -117,14 +118,18 @@ _nc_render(WINDOW *win, NCURSES_CH_T ch) #endif static bool -newline_forces_scroll(WINDOW *win, NCURSES_SIZE_T * ypos) +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 { + 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; @@ -270,11 +275,11 @@ waddch_literal(WINDOW *win, NCURSES_CH_T ch) /* handle EILSEQ (i.e., when len >= -1) */ if (len == -1 && is8bits(CharOf(ch))) { - int rc = OK; 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) @@ -299,7 +304,7 @@ waddch_literal(WINDOW *win, NCURSES_CH_T ch) * adjustments. */ if_WIDEC({ - int len = wcwidth(CharOf(ch)); + int len = _nc_wacs_width(CharOf(ch)); int i; int j; wchar_t *chars; @@ -339,6 +344,7 @@ waddch_literal(WINDOW *win, NCURSES_CH_T ch) return ERR; x = win->_curx; y = win->_cury; + CHECK_POSITION(win, x, y); line = win->_line + y; } /* @@ -427,7 +433,7 @@ waddch_nosync(WINDOW *win, const NCURSES_CH_T ch) s[1] == 0 ) || ( - (isprint((int)t) && !iscntrl((int)t)) + (isprint((int) t) && !iscntrl((int) t)) #if USE_WIDEC_SUPPORT || ((sp == 0 || !sp->_legacy_coding) && (WINDOW_EXT(win, addch_used) @@ -443,6 +449,7 @@ waddch_nosync(WINDOW *win, const NCURSES_CH_T ch) */ x = win->_curx; y = win->_cury; + CHECK_POSITION(win, x, y); switch (t) { case '\t': diff --git a/ncurses/base/lib_addstr.c b/ncurses/base/lib_addstr.c index a1a55cb..19ebfcd 100644 --- a/ncurses/base/lib_addstr.c +++ b/ncurses/base/lib_addstr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * 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 * @@ -44,7 +45,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_addstr.c,v 1.52 2011/05/28 23:02:09 tom Exp $") +MODULE_ID("$Id: lib_addstr.c,v 1.56 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) waddnstr(WINDOW *win, const char *astr, int n) @@ -87,7 +88,7 @@ waddchnstr(WINDOW *win, const chtype *astr, int n) T((T_CALLED("waddchnstr(%p,%p,%d)"), (void *) win, (const void *) astr, n)); - if (!win) + if (!win || !astr) returnCode(ERR); y = win->_cury; @@ -183,7 +184,7 @@ wadd_wchnstr(WINDOW *win, const cchar_t *astr, int n) if (isWidecExt(astr[i])) continue; - len = wcwidth(CharOf(astr[i])); + len = _nc_wacs_width(CharOf(astr[i])); if (x + len - 1 <= win->_maxx) { line->text[x] = _nc_render(win, astr[i]); @@ -194,6 +195,8 @@ wadd_wchnstr(WINDOW *win, const cchar_t *astr, int n) } SetWidecExt(line->text[x + j], j); } + } else { + len = 1; } x = (NCURSES_SIZE_T) (x + len); end += len - 1; diff --git a/ncurses/base/lib_beep.c b/ncurses/base/lib_beep.c index b775d56..b1a60b9 100644 --- a/ncurses/base/lib_beep.c +++ b/ncurses/base/lib_beep.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -46,7 +47,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_beep.c,v 1.17 2014/03/08 20:32:59 tom Exp $") +MODULE_ID("$Id: lib_beep.c,v 1.18 2020/02/02 23:34:34 tom Exp $") /* * beep() diff --git a/ncurses/base/lib_bkgd.c b/ncurses/base/lib_bkgd.c index c46ca42..2030030 100644 --- a/ncurses/base/lib_bkgd.c +++ b/ncurses/base/lib_bkgd.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2014 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -36,7 +37,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_bkgd.c,v 1.49 2014/09/04 09:36:20 tom Exp $") +MODULE_ID("$Id: lib_bkgd.c,v 1.54 2020/02/02 23:34:34 tom Exp $") /* * Set the window's background information. @@ -117,29 +118,98 @@ static NCURSES_INLINE int #endif wbkgrnd(WINDOW *win, const ARG_CH_T ch) { +#undef SP_PARM +#define SP_PARM SP /* to use Charable() */ int code = ERR; - int x, y; T((T_CALLED("wbkgd(%p,%s)"), (void *) win, _tracech_t(ch))); - if (win) { + if (SP == 0) { + ; + } else if (win) { NCURSES_CH_T new_bkgd = CHDEREF(ch); - NCURSES_CH_T old_bkgrnd; + 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); + } + + 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); + } - memset(&old_bkgrnd, 0, sizeof(old_bkgrnd)); - (void) wgetbkgrnd(win, &old_bkgrnd); + 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(CharOf(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 (!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(CharOf(new_char)), _traceattr(new_attr), new_pair)); (void) wbkgrndset(win, CHREF(new_bkgd)); - (void) wattrset(win, (int) AttrOf(win->_nc_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++) { - if (CharEq(win->_line[y].text[x], old_bkgrnd)) { - win->_line[y].text[x] = win->_nc_bkgd; + 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)) { + 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 { - NCURSES_CH_T wch = win->_line[y].text[x]; - RemAttr(wch, (~(A_ALTCHARSET | A_CHARTEXT))); - win->_line[y].text[x] = _nc_render(win, wch); + SetAttr(*cp, (tmp_attr & ~old_attr) | new_attr); + SetPair(*cp, new_pair); } } } diff --git a/ncurses/base/lib_box.c b/ncurses/base/lib_box.c index 6f17c97..186f112 100644 --- a/ncurses/base/lib_box.c +++ b/ncurses/base/lib_box.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_box.c,v 1.24 2010/04/24 23:51:57 tom Exp $") +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 @@ -114,10 +115,20 @@ wborder(WINDOW *win, 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); diff --git a/ncurses/base/lib_chgat.c b/ncurses/base/lib_chgat.c index 1eb1f59..74c4f75 100644 --- a/ncurses/base/lib_chgat.c +++ b/ncurses/base/lib_chgat.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2014 Free Software Foundation, Inc. * + * 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 * @@ -42,35 +43,38 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_chgat.c,v 1.10 2014/02/01 22:13:31 tom Exp $") +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 color, + NCURSES_PAIRS_T pair_arg, const void *opts GCC_UNUSED) { - int i; + int code = ERR; + int color_pair = pair_arg; T((T_CALLED("wchgat(%p,%d,%s,%d)"), (void *) win, n, _traceattr(attr), - (int) color)); + 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)); + 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); + SetPair(line->text[i], color_pair); CHANGED_CELL(line, i); } - returnCode(OK); - } else - returnCode(ERR); + code = OK; + } + returnCode(code); } diff --git a/ncurses/base/lib_clear.c b/ncurses/base/lib_clear.c index 008744c..2a1c97c 100644 --- a/ncurses/base/lib_clear.c +++ b/ncurses/base/lib_clear.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2000,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_clear.c,v 1.8 2009/10/24 22:33:29 tom Exp $") +MODULE_ID("$Id: lib_clear.c,v 1.9 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) wclear(WINDOW *win) diff --git a/ncurses/base/lib_clearok.c b/ncurses/base/lib_clearok.c index ffc7d02..d98287c 100644 --- a/ncurses/base/lib_clearok.c +++ b/ncurses/base/lib_clearok.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2000,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_clearok.c,v 1.5 2009/10/24 22:34:53 tom Exp $") +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) diff --git a/ncurses/base/lib_clrbot.c b/ncurses/base/lib_clrbot.c index cbf2206..e5482b9 100644 --- a/ncurses/base/lib_clrbot.c +++ b/ncurses/base/lib_clrbot.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2006,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_clrbot.c,v 1.21 2009/10/24 22:33:19 tom Exp $") +MODULE_ID("$Id: lib_clrbot.c,v 1.22 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) wclrtobot(WINDOW *win) diff --git a/ncurses/base/lib_clreol.c b/ncurses/base/lib_clreol.c index 7aff84b..d6cb9b2 100644 --- a/ncurses/base/lib_clreol.c +++ b/ncurses/base/lib_clreol.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2001,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_clreol.c,v 1.22 2009/10/24 22:33:06 tom Exp $") +MODULE_ID("$Id: lib_clreol.c,v 1.23 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) wclrtoeol(WINDOW *win) diff --git a/ncurses/base/lib_color.c b/ncurses/base/lib_color.c index 1322600..376ad4f 100644 --- a/ncurses/base/lib_color.c +++ b/ncurses/base/lib_color.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -38,14 +39,17 @@ * Handles color emulation of SYS V curses */ +#define NEW_PAIR_INTERNAL 1 + #include <curses.priv.h> +#include <new_pair.h> #include <tic.h> #ifndef CUR #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_color.c,v 1.110 2014/03/08 20:04:44 tom Exp $") +MODULE_ID("$Id: lib_color.c,v 1.143 2020/02/02 23:34:34 tom Exp $") #ifdef USE_TERM_DRIVER #define CanChange InfoOf(SP_PARM).canchange @@ -137,13 +141,6 @@ NCURSES_EXPORT_VAR(const color_t*) _nc_hls_palette = hls_palette; /* *INDENT-ON* */ -/* - * 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(pair) \ - ((SP_PARM != 0) && (pair >= 0) && (pair < SP_PARM->_pair_limit) && SP_PARM->_coloron) - #if NCURSES_EXT_FUNCS /* * These are called from _nc_do_color(), which in turn is called from @@ -251,6 +248,60 @@ init_color_table(NCURSES_SP_DCL0) } } +static bool +init_direct_colors(NCURSES_SP_DCL0) +{ + static NCURSES_CONST char name[] = "RGB"; + + int n; + const char *s; + int width; + rgb_bits_t *result = &(SP_PARM->_direct_color); + + result->value = 0; + + if (COLORS >= 8) { + /* find the number of bits needed for the maximum color value */ + for (width = 0; (1 << width) - 1 < (COLORS - 1); ++width) { + ; + } + + if ((n = 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. */ @@ -346,7 +397,10 @@ NCURSES_SP_NAME(start_color) (NCURSES_SP_DCL0) * 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 @@ -354,19 +408,26 @@ NCURSES_SP_NAME(start_color) (NCURSES_SP_DCL0) COLORS = maxcolors; #endif - SP_PARM->_color_pairs = TYPE_CALLOC(colorpair_t, SP_PARM->_pair_limit); + ReservePairs(SP_PARM, 16); if (SP_PARM->_color_pairs != 0) { - SP_PARM->_color_table = TYPE_CALLOC(color_t, maxcolors); - if (SP_PARM->_color_table != 0) { - SP_PARM->_color_pairs[0] = PAIR_OF(default_fg(NCURSES_SP_ARG), - default_bg(NCURSES_SP_ARG)); - init_color_table(NCURSES_SP_ARG); - + if (init_direct_colors(NCURSES_SP_ARG)) { + result = OK; + } else { + SP_PARM->_color_table = TYPE_CALLOC(color_t, maxcolors); + 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; - result = OK; } else if (SP_PARM->_color_pairs != 0) { FreeAndNull(SP_PARM->_color_pairs); } @@ -388,7 +449,7 @@ start_color(void) /* This function was originally written by Daniel Weaver <danw@znyx.com> */ static void -rgb2hls(int r, int g, int b, NCURSES_COLOR_T *h, NCURSES_COLOR_T *l, NCURSES_COLOR_T *s) +rgb2hls(int r, int g, int b, int *h, int *l, int *s) /* convert RGB to HLS system */ { int min, max, t; @@ -399,7 +460,7 @@ rgb2hls(int r, int g, int b, NCURSES_COLOR_T *h, NCURSES_COLOR_T *l, NCURSES_COL max = b; /* calculate lightness */ - *l = (NCURSES_COLOR_T) ((min + max) / 20); + *l = ((min + max) / 20); if (min == max) { /* black, white and all shades of gray */ *h = 0; @@ -409,19 +470,88 @@ rgb2hls(int r, int g, int b, NCURSES_COLOR_T *h, NCURSES_COLOR_T *l, NCURSES_COL /* calculate saturation */ if (*l < 50) - *s = (NCURSES_COLOR_T) (((max - min) * 100) / (max + min)); + *s = (((max - min) * 100) / (max + min)); else - *s = (NCURSES_COLOR_T) (((max - min) * 100) / (2000 - max - min)); + *s = (((max - min) * 100) / (2000 - max - min)); /* calculate hue */ if (r == max) - t = (NCURSES_COLOR_T) (120 + ((g - b) * 60) / (max - min)); + t = (120 + ((g - b) * 60) / (max - min)); else if (g == max) - t = (NCURSES_COLOR_T) (240 + ((b - r) * 60) / (max - min)); + t = (240 + ((b - r) * 60) / (max - min)); else - t = (NCURSES_COLOR_T) (360 + ((r - g) * 60) / (max - min)); + 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); + } +} - *h = (NCURSES_COLOR_T) (t % 360); +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) { + sp->_color_pairs = TYPE_CALLOC(colorpair_t, have); + } 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; + } } /* @@ -429,32 +559,27 @@ rgb2hls(int r, int g, int b, NCURSES_COLOR_T *h, NCURSES_COLOR_T *l, NCURSES_COL * values. */ NCURSES_EXPORT(int) -NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx - NCURSES_PAIRS_T pair, - NCURSES_COLOR_T f, - NCURSES_COLOR_T b) +_nc_init_pair(SCREEN *sp, int pair, int f, int b) { - colorpair_t result; + 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_PARM, - (int) pair, - (int) f, - (int) b)); + T((T_CALLED("init_pair(%p,%d,%d,%d)"), (void *) sp, pair, f, b)); - if (!ValidPair(pair)) + if (!ValidPair(sp, pair)) returnCode(ERR); maxcolors = MaxColors; - previous = SP_PARM->_color_pairs[pair]; + ReservePairs(sp, pair); + previous = sp->_color_pairs[pair]; #if NCURSES_EXT_FUNCS - if (SP_PARM->_default_color || SP_PARM->_assumed_color) { + if (sp->_default_color || sp->_assumed_color) { bool isDefault = FALSE; bool wasDefault = FALSE; - int default_pairs = SP_PARM->_default_pairs; + int default_pairs = sp->_default_pairs; /* * Map caller's color number, e.g., -1, 0, 1, .., 7, etc., into @@ -479,8 +604,8 @@ NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx * Check if the table entry that we are going to init/update used * default colors. */ - if ((FORE_OF(previous) == COLOR_DEFAULT) - || (BACK_OF(previous) == COLOR_DEFAULT)) + if (isDefaultColor(FORE_OF(previous)) + || isDefaultColor(BACK_OF(previous))) wasDefault = TRUE; /* @@ -501,10 +626,10 @@ NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx * that does not will decrement the count - and possibly interfere * with sequentially adding new pairs. */ - if (pair > (SP_PARM->_pair_count + default_pairs)) { + if (pair > (sp->_pair_count + default_pairs)) { returnCode(ERR); } - SP_PARM->_default_pairs = default_pairs; + sp->_default_pairs = default_pairs; } else #endif { @@ -520,34 +645,22 @@ NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx * initialized before a screen update is performed replacing original * pair colors with the new ones). */ - result = PAIR_OF(f, b); - if (previous != 0 - && previous != result) { - int y, x; - - for (y = 0; y <= CurScreen(SP_PARM)->_maxy; y++) { - struct ldat *ptr = &(CurScreen(SP_PARM)->_line[y]); - bool changed = FALSE; - for (x = 0; x <= CurScreen(SP_PARM)->_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); - } + MakeColorPair(result, f, b); + if ((FORE_OF(previous) != 0 + || BACK_OF(previous) != 0) + && !isSamePair(previous, result)) { + _nc_change_pair(sp, pair); } - SP_PARM->_color_pairs[pair] = result; - if (GET_SCREEN_PAIR(SP_PARM) == pair) - SET_SCREEN_PAIR(SP_PARM, (chtype) (~0)); /* force attribute update */ + _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_PARM, td_initpair, pair, f, b); + CallDriver_3(sp, td_initpair, pair, f, b); #else if (initialize_pair && InPalette(f) && InPalette(b)) { const color_t *tp = DefaultPalette; @@ -573,6 +686,15 @@ NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx 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) @@ -584,59 +706,65 @@ init_pair(NCURSES_COLOR_T pair, NCURSES_COLOR_T f, NCURSES_COLOR_T b) #define okRGB(n) ((n) >= 0 && (n) <= 1000) 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) +_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_PARM, + (void *) sp, color, r, g, b)); - if (SP_PARM == 0) + if (sp == 0 || sp->_direct_color.value) returnCode(result); maxcolors = MaxColors; if (InitColor - && SP_PARM->_coloron + && sp->_coloron && (color >= 0 && OkColorHi(color)) && (okRGB(r) && okRGB(g) && okRGB(b))) { - SP_PARM->_color_table[color].init = 1; - SP_PARM->_color_table[color].r = r; - SP_PARM->_color_table[color].g = g; - SP_PARM->_color_table[color].b = 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_PARM->_color_table[color].red, - &SP_PARM->_color_table[color].green, - &SP_PARM->_color_table[color].blue); + &sp->_color_table[color].red, + &sp->_color_table[color].green, + &sp->_color_table[color].blue); } else { - SP_PARM->_color_table[color].red = r; - SP_PARM->_color_table[color].green = g; - SP_PARM->_color_table[color].blue = b; + 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_PARM, td_initcolor, color, r, g, b); + CallDriver_4(sp, td_initcolor, color, r, g, b); #else NCURSES_PUTP2("initialize_color", TPARM_4(initialize_color, color, r, g, b)); #endif - SP_PARM->_color_defs = max(color + 1, SP_PARM->_color_defs); + 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, @@ -676,7 +804,7 @@ NCURSES_SP_NAME(has_colors) (NCURSES_SP_DCL0) int code = FALSE; (void) SP_PARM; - T((T_CALLED("has_colors()"))); + T((T_CALLED("has_colors(%p)"), (void *) SP_PARM)); if (HasTerminal(SP_PARM)) { #ifdef USE_TERM_DRIVER code = HasColor; @@ -700,34 +828,54 @@ has_colors(void) } #endif -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) +static int +_nc_color_content(SCREEN *sp, int color, int *r, int *g, int *b) { int result = ERR; int maxcolors; T((T_CALLED("color_content(%p,%d,%p,%p,%p)"), - (void *) SP_PARM, + (void *) sp, color, (void *) r, (void *) g, (void *) b)); - if (SP_PARM == 0) + if (sp == 0) returnCode(result); maxcolors = MaxColors; - if (color < 0 || !OkColorHi(color) || !SP_PARM->_coloron) { + if (color < 0 || !OkColorHi(color) || !sp->_coloron) { result = ERR; } else { - NCURSES_COLOR_T c_r = SP_PARM->_color_table[color].red; - NCURSES_COLOR_T c_g = SP_PARM->_color_table[color].green; - NCURSES_COLOR_T c_b = SP_PARM->_color_table[color].blue; + 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; @@ -743,6 +891,23 @@ NCURSES_SP_NAME(color_content) (NCURSES_SP_DCLx 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, @@ -755,29 +920,29 @@ color_content(NCURSES_COLOR_T color, #endif NCURSES_EXPORT(int) -NCURSES_SP_NAME(pair_content) (NCURSES_SP_DCLx - NCURSES_PAIRS_T pair, - NCURSES_COLOR_T *f, - NCURSES_COLOR_T *b) +_nc_pair_content(SCREEN *sp, int pair, int *f, int *b) { int result; T((T_CALLED("pair_content(%p,%d,%p,%p)"), - (void *) SP_PARM, + (void *) sp, (int) pair, (void *) f, (void *) b)); - if (!ValidPair(pair)) { + if (!ValidPair(sp, pair)) { result = ERR; } else { - NCURSES_COLOR_T fg = (NCURSES_COLOR_T) FORE_OF(SP_PARM->_color_pairs[pair]); - NCURSES_COLOR_T bg = (NCURSES_COLOR_T) BACK_OF(SP_PARM->_color_pairs[pair]); + 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 (fg == COLOR_DEFAULT) + if (isDefaultColor(fg)) fg = -1; - if (bg == COLOR_DEFAULT) + if (isDefaultColor(bg)) bg = -1; #endif @@ -787,7 +952,7 @@ NCURSES_SP_NAME(pair_content) (NCURSES_SP_DCLx *b = bg; TR(TRACE_ATTRS, ("...pair_content(%p,%d,%d,%d)", - (void *) SP_PARM, + (void *) sp, (int) pair, (int) fg, (int) bg)); result = OK; @@ -795,6 +960,21 @@ NCURSES_SP_NAME(pair_content) (NCURSES_SP_DCLx 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) @@ -813,12 +993,12 @@ NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_DCLx #ifdef USE_TERM_DRIVER CallDriver_4(SP_PARM, td_docolor, old_pair, pair, reverse, outc); #else - NCURSES_COLOR_T fg = COLOR_DEFAULT; - NCURSES_COLOR_T bg = COLOR_DEFAULT; - NCURSES_COLOR_T old_fg = -1; - NCURSES_COLOR_T old_bg = -1; + int fg = COLOR_DEFAULT; + int bg = COLOR_DEFAULT; + int old_fg = -1; + int old_bg = -1; - if (!ValidPair(pair)) { + if (!ValidPair(SP_PARM, pair)) { return; } else if (pair != 0) { if (set_color_pair) { @@ -828,14 +1008,14 @@ NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_DCLx 1, outc); return; } else if (SP_PARM != 0) { - if (pair_content((NCURSES_COLOR_T) pair, &fg, &bg) == ERR) + if (_nc_pair_content(SP_PARM, pair, &fg, &bg) == ERR) return; } } if (old_pair >= 0 && SP_PARM != 0 - && pair_content((NCURSES_COLOR_T) old_pair, &old_fg, &old_bg) != ERR) { + && _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 @@ -858,19 +1038,19 @@ NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_DCLx } } else { reset_color_pair(NCURSES_SP_ARG); - if (old_pair < 0) + if (old_pair < 0 && pair <= 0) return; } #if NCURSES_EXT_FUNCS if (isDefaultColor(fg)) - fg = (NCURSES_COLOR_T) default_fg(NCURSES_SP_ARG); + fg = default_fg(NCURSES_SP_ARG); if (isDefaultColor(bg)) - bg = (NCURSES_COLOR_T) default_bg(NCURSES_SP_ARG); + bg = default_bg(NCURSES_SP_ARG); #endif if (reverse) { - NCURSES_COLOR_T xx = fg; + int xx = fg; fg = bg; bg = xx; } @@ -899,3 +1079,87 @@ _nc_do_color(int old_pair, int pair, int reverse, NCURSES_OUTC outc) _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 */ diff --git a/ncurses/base/lib_colorset.c b/ncurses/base/lib_colorset.c index e935486..387edef 100644 --- a/ncurses/base/lib_colorset.c +++ b/ncurses/base/lib_colorset.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2014 Free Software Foundation, Inc. * + * 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 * @@ -41,22 +42,23 @@ #include <curses.priv.h> #include <ctype.h> -MODULE_ID("$Id: lib_colorset.c,v 1.14 2014/02/01 22:10:42 tom Exp $") +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 color_pair_number, void *opts) +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, (int) color_pair_number)); + T((T_CALLED("wcolor_set(%p,%d)"), (void *) win, color_pair)); + set_extended_pair(opts, color_pair); if (win - && !opts && (SP != 0) - && (color_pair_number >= 0) - && (color_pair_number < SP->_pair_limit)) { + && (color_pair >= 0) + && (color_pair < SP->_pair_limit)) { TR(TRACE_ATTRS, ("... current %ld", (long) GET_WINDOW_PAIR(win))); - SET_WINDOW_PAIR(win, color_pair_number); - if_EXT_COLORS(win->_color = color_pair_number); + SET_WINDOW_PAIR(win, color_pair); + if_EXT_COLORS(win->_color = color_pair); code = OK; } returnCode(code); diff --git a/ncurses/base/lib_delch.c b/ncurses/base/lib_delch.c index 64c9da7..d39a8eb 100644 --- a/ncurses/base/lib_delch.c +++ b/ncurses/base/lib_delch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2001,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_delch.c,v 1.13 2009/10/24 22:32:47 tom Exp $") +MODULE_ID("$Id: lib_delch.c,v 1.14 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) wdelch(WINDOW *win) diff --git a/ncurses/base/lib_delwin.c b/ncurses/base/lib_delwin.c index 4bb536c..2f0621c 100644 --- a/ncurses/base/lib_delwin.c +++ b/ncurses/base/lib_delwin.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. * + * Copyright 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_delwin.c,v 1.20 2009/10/24 22:02:14 tom Exp $") +MODULE_ID("$Id: lib_delwin.c,v 1.21 2020/02/02 23:34:34 tom Exp $") static bool cannot_delete(WINDOW *win) diff --git a/ncurses/base/lib_dft_fgbg.c b/ncurses/base/lib_dft_fgbg.c index 4d7fdd0..95dc0c2 100644 --- a/ncurses/base/lib_dft_fgbg.c +++ b/ncurses/base/lib_dft_fgbg.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2014 Free Software Foundation, Inc. * + * 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 * @@ -37,7 +38,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_dft_fgbg.c,v 1.27 2014/03/08 20:32:59 tom Exp $") +MODULE_ID("$Id: lib_dft_fgbg.c,v 1.30 2020/02/02 23:34:34 tom Exp $") /* * Modify the behavior of color-pair 0 so that the library doesn't assume that @@ -68,26 +69,27 @@ 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 - if (sp != 0) - code = CallDriver_2(sp, td_defaultcolors, fg, bg); + code = CallDriver_2(SP_PARM, td_defaultcolors, fg, bg); #else - if ((orig_pair || orig_colors) && !initialize_pair) { + 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 & C_MASK); - SP_PARM->_default_bg = isDefaultColor(bg) ? COLOR_DEFAULT : (bg & C_MASK); - if (SP_PARM->_color_pairs != 0) { - bool save = SP_PARM->_default_color; - SP_PARM->_assumed_color = TRUE; - SP_PARM->_default_color = TRUE; - init_pair(0, (short) fg, (short) bg); - SP_PARM->_default_color = save; + 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; + init_pair(0, (short) fg, (short) bg); + SP_PARM->_default_color = save; + } + code = OK; } - code = OK; - } #endif + } returnCode(code); } diff --git a/ncurses/base/lib_driver.c b/ncurses/base/lib_driver.c index fb63b3c..5467607 100644 --- a/ncurses/base/lib_driver.c +++ b/ncurses/base/lib_driver.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2008-2012,2014 Free Software Foundation, Inc. * + * 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 * @@ -33,7 +34,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_driver.c,v 1.6 2014/04/11 08:21:23 jpf Exp $") +MODULE_ID("$Id: lib_driver.c,v 1.8 2020/02/02 23:34:34 tom Exp $") typedef struct DriverEntry { const char *name; @@ -42,7 +43,7 @@ typedef struct DriverEntry { static DRIVER_ENTRY DriverTable[] = { -#ifdef __MINGW32__ +#ifdef _WIN32 {"win32console", &_nc_WIN_DRIVER}, #endif {"tinfo", &_nc_TINFO_DRIVER} /* must be last */ diff --git a/ncurses/base/lib_echo.c b/ncurses/base/lib_echo.c index 9e1d3c2..d8f57f2 100644 --- a/ncurses/base/lib_echo.c +++ b/ncurses/base/lib_echo.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. * + * 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 * @@ -44,7 +45,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_echo.c,v 1.8 2009/10/24 22:02:14 tom Exp $") +MODULE_ID("$Id: lib_echo.c,v 1.9 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) NCURSES_SP_NAME(echo) (NCURSES_SP_DCL0) diff --git a/ncurses/base/lib_endwin.c b/ncurses/base/lib_endwin.c index 9ebf769..b8a9e4e 100644 --- a/ncurses/base/lib_endwin.c +++ b/ncurses/base/lib_endwin.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2014 Free Software Foundation, Inc. * + * 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_endwin.c,v 1.23 2014/03/08 20:32:59 tom Exp $") +MODULE_ID("$Id: lib_endwin.c,v 1.25 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) NCURSES_SP_NAME(endwin) (NCURSES_SP_DCL0) @@ -55,11 +56,11 @@ NCURSES_SP_NAME(endwin) (NCURSES_SP_DCL0) #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *TCB = TCBOf(SP_PARM); - SP_PARM->_endwin = TRUE; + SP_PARM->_endwin = ewSuspend; if (TCB && TCB->drv && TCB->drv->td_scexit) TCB->drv->td_scexit(SP_PARM); #else - SP_PARM->_endwin = TRUE; + SP_PARM->_endwin = ewSuspend; SP_PARM->_mouse_wrap(SP_PARM); _nc_screen_wrap(); _nc_mvcur_wrap(); /* wrap up cursor addressing */ diff --git a/ncurses/base/lib_erase.c b/ncurses/base/lib_erase.c index bbf10ef..e190ebd 100644 --- a/ncurses/base/lib_erase.c +++ b/ncurses/base/lib_erase.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2005,2009 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -41,21 +42,25 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_erase.c,v 1.17 2009/10/24 22:32:29 tom Exp $") +MODULE_ID("$Id: lib_erase.c,v 1.19 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) werase(WINDOW *win) { int code = ERR; - int y; NCURSES_CH_T blank; - NCURSES_CH_T *sp, *end, *start; + NCURSES_CH_T *start; T((T_CALLED("werase(%p)"), (void *) win)); if (win) { + 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]; diff --git a/ncurses/base/lib_flash.c b/ncurses/base/lib_flash.c index 7f25038..975d5f5 100644 --- a/ncurses/base/lib_flash.c +++ b/ncurses/base/lib_flash.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -46,7 +47,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_flash.c,v 1.14 2014/03/08 20:32:59 tom Exp $") +MODULE_ID("$Id: lib_flash.c,v 1.15 2020/02/02 23:34:34 tom Exp $") /* * flash() diff --git a/ncurses/base/lib_freeall.c b/ncurses/base/lib_freeall.c index 0313749..9133d08 100644 --- a/ncurses/base/lib_freeall.c +++ b/ncurses/base/lib_freeall.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -39,7 +40,7 @@ extern int malloc_errfd; /* FIXME */ #endif -MODULE_ID("$Id: lib_freeall.c,v 1.62 2012/11/17 23:53:03 tom Exp $") +MODULE_ID("$Id: lib_freeall.c,v 1.72 2020/02/02 23:34:34 tom Exp $") /* * Free all ncurses data. This is used for testing only (there's no practical @@ -48,11 +49,11 @@ MODULE_ID("$Id: lib_freeall.c,v 1.62 2012/11/17 23:53:03 tom Exp $") NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_freeall) (NCURSES_SP_DCL0) { - WINDOWLIST *p, *q; 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); @@ -60,12 +61,16 @@ NCURSES_SP_NAME(_nc_freeall) (NCURSES_SP_DCL0) 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 */ @@ -73,8 +78,19 @@ NCURSES_SP_NAME(_nc_freeall) (NCURSES_SP_DCL0) WINDOW *p_win = &(p->win); bool found = FALSE; +#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) && (q_win->_flags & _SUBWIN) && (p_win == q_win->_parent)) { @@ -131,22 +147,20 @@ _nc_freeall(void) NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_free_and_exit) (NCURSES_SP_DCLx int code) { - char *last_buffer = (SP_PARM != 0) ? SP_PARM->out_buffer : 0; - + 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 - trace(0); /* close trace file, freeing its setbuf */ + curses_trace(0); /* close trace file, freeing its setbuf */ { static va_list fake; free(_nc_varargs("?", fake)); } #endif - FreeIfNeeded(last_buffer); exit(code); } -#else +#else /* !HAVE_NC_FREEALL */ NCURSES_EXPORT(void) _nc_freeall(void) { @@ -162,7 +176,7 @@ NCURSES_SP_NAME(_nc_free_and_exit) (NCURSES_SP_DCLx int code) } exit(code); } -#endif +#endif /* HAVE_NC_FREEALL */ #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) @@ -171,3 +185,16 @@ _nc_free_and_exit(int code) NCURSES_SP_NAME(_nc_free_and_exit) (CURRENT_SCREEN, code); } #endif + +NCURSES_EXPORT(void) +exit_curses(int code) +{ +#if NO_LEAKS +#if NCURSES_SP_FUNCS + NCURSES_SP_NAME(_nc_free_and_exit) (CURRENT_SCREEN, code); +#else + _nc_free_and_exit(code); /* deprecated... */ +#endif +#endif + exit(code); +} diff --git a/ncurses/base/lib_getch.c b/ncurses/base/lib_getch.c index ff2c5bd..bf2115d 100644 --- a/ncurses/base/lib_getch.c +++ b/ncurses/base/lib_getch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_getch.c,v 1.131 2014/05/10 20:36:57 tom Exp $") +MODULE_ID("$Id: lib_getch.c,v 1.139 2020/02/02 23:34:34 tom Exp $") #include <fifo_defs.h> @@ -69,16 +70,20 @@ NCURSES_EXPORT(int) NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_DCLx int value) { int code = OK; -#if USE_REENTRANT - if (SP_PARM) { - SET_ESCDELAY(value); - } else { + if (value < 0) { code = ERR; - } + } else { +#if USE_REENTRANT + if (SP_PARM) { + SET_ESCDELAY(value); + } else { + code = ERR; + } #else - (void) SP_PARM; - ESCDELAY = value; + (void) SP_PARM; + ESCDELAY = value; #endif + } return code; } @@ -87,12 +92,16 @@ 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); + code = NCURSES_SP_NAME(set_escdelay) (CURRENT_SCREEN, value); #else - ESCDELAY = value; - code = OK; + ESCDELAY = value; + code = OK; #endif + } return code; } #endif @@ -125,7 +134,7 @@ _nc_use_meta(WINDOW *win) } #ifdef USE_TERM_DRIVER -# ifdef __MINGW32__ +# ifdef _WIN32 static HANDLE _nc_get_handle(int fd) { @@ -146,7 +155,7 @@ check_mouse_activity(SCREEN *sp, int delay EVENTLIST_2nd(_nc_eventlist * evl)) #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *TCB = TCBOf(sp); rc = TCBOf(sp)->drv->td_testmouse(TCBOf(sp), delay EVENTLIST_2nd(evl)); -# ifdef __MINGW32__ +# ifdef _WIN32 /* if we emulate terminfo on console, we have to use the console routine */ if (IsTermInfoOnConsole(sp)) { HANDLE fd = _nc_get_handle(sp->_ifd); @@ -224,11 +233,6 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) if (tail < 0) return ERR; -#ifdef HIDE_EINTR - again: - errno = 0; -#endif - #ifdef NCURSES_WGETCH_EVENTS if (evl #if USE_GPM_SUPPORT || USE_EMX_MOUSE || USE_SYSMOUSE @@ -288,7 +292,7 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) { /* Can block... */ #ifdef USE_TERM_DRIVER int buf; -#ifdef __MINGW32__ +#ifdef _WIN32 if (NC_ISATTY(sp->_ifd) && IsTermInfoOnConsole(sp) && sp->_cbreak) n = _nc_mingw_console_read(sp, _nc_get_handle(sp->_ifd), @@ -313,24 +317,6 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) #endif } -#ifdef HIDE_EINTR - /* - * Under System V curses with non-restarting signals, getch() returns - * with value ERR when a handled signal keeps it from completing. - * If signals restart system calls, OTOH, the signal is invisible - * except to its handler. - * - * We don't want this difference to show. This piece of code - * tries to make it look like we always have restarting signals. - */ - if (n <= 0 && errno == EINTR -# if USE_PTHREADS_EINTR - && (_nc_globals.have_sigwinch == 0) -# endif - ) - goto again; -#endif - if ((n == -1) || (n == 0)) { TR(TRACE_IEVENT, ("read(%d,&ch,1)=%d, errno=%d", sp->_ifd, n, errno)); ch = ERR; @@ -360,7 +346,7 @@ fifo_clear(SCREEN *sp) tail = peek = 0; } -static int kgetch(SCREEN *EVENTLIST_2nd(_nc_eventlist * evl)); +static int kgetch(SCREEN *, bool EVENTLIST_2nd(_nc_eventlist *)); static void recur_wrefresh(WINDOW *win) @@ -426,7 +412,7 @@ _nc_wgetch(WINDOW *win, int ch; int rc = 0; #ifdef NCURSES_WGETCH_EVENTS - long event_delay = -1; + int event_delay = -1; #endif T((T_CALLED("_nc_wgetch(%p)"), (void *) win)); @@ -537,7 +523,7 @@ _nc_wgetch(WINDOW *win, int runcount = 0; do { - ch = kgetch(sp EVENTLIST_2nd(evl)); + ch = kgetch(sp, win->_notimeout EVENTLIST_2nd(evl)); if (ch == KEY_MOUSE) { ++runcount; if (sp->_mouse_inline(sp)) @@ -649,7 +635,7 @@ wgetch_events(WINDOW *win, _nc_eventlist * evl) int code; int value; - T((T_CALLED("wgetch_events(%p,%p)"), win, evl)); + T((T_CALLED("wgetch_events(%p,%p)"), (void *) win, (void *) evl)); code = _nc_wgetch(win, &value, _nc_use_meta(win) @@ -692,11 +678,11 @@ wgetch(WINDOW *win) */ static int -kgetch(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) +kgetch(SCREEN *sp, bool forever EVENTLIST_2nd(_nc_eventlist * evl)) { TRIES *ptr; int ch = 0; - int timeleft = GetEscdelay(sp); + int timeleft = forever ? 9999999 : GetEscdelay(sp); TR(TRACE_IEVENT, ("kgetch() called")); diff --git a/ncurses/base/lib_getstr.c b/ncurses/base/lib_getstr.c index 0e44634..d0b09a3 100644 --- a/ncurses/base/lib_getstr.c +++ b/ncurses/base/lib_getstr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2011 Free Software Foundation, Inc. * + * Copyright 2018,2020 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 * @@ -40,7 +41,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_getstr.c,v 1.30 2011/10/22 16:31:35 tom Exp $") +MODULE_ID("$Id: lib_getstr.c,v 1.34 2020/02/02 23:34:34 tom Exp $") /* * This wipes out the last character, no matter whether it was a tab, control @@ -85,9 +86,11 @@ wgetnstr_events(WINDOW *win, T((T_CALLED("wgetnstr(%p,%p,%d)"), (void *) win, (void *) str, maxlen)); - if (!win) + if (!win || !str) returnCode(ERR); + maxlen = _nc_getstr_limit(maxlen); + NCURSES_SP_NAME(_nc_get_tty_mode) (NCURSES_SP_ARGx &buf); oldnl = sp->_nl; @@ -142,7 +145,7 @@ wgetnstr_events(WINDOW *win, str = WipeOut(win, y, x, oldstr, str, oldecho); } } else if (ch >= KEY_MIN - || (maxlen >= 0 && str - oldstr >= maxlen)) { + || (str - oldstr >= maxlen)) { NCURSES_SP_NAME(beep) (NCURSES_SP_ARG); } else { *str++ = (char) ch; diff --git a/ncurses/base/lib_hline.c b/ncurses/base/lib_hline.c index 1f03808..938c499 100644 --- a/ncurses/base/lib_hline.c +++ b/ncurses/base/lib_hline.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -29,6 +30,8 @@ /**************************************************************************** * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * * and: Eric S. Raymond <esr@snark.thyrsus.com> * + * and: Thomas E. Dickey 1996-on * + * and: Sven Verdoolaege 2001 * ****************************************************************************/ /* @@ -40,23 +43,21 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_hline.c,v 1.13 2010/12/19 01:48:39 tom Exp $") +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; - int start; - int end; 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; - start = win->_curx; - end = start + n - 1; if (end > win->_maxx) end = win->_maxx; @@ -68,6 +69,14 @@ whline(WINDOW *win, chtype ch, int n) 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--; diff --git a/ncurses/base/lib_immedok.c b/ncurses/base/lib_immedok.c index d51b60a..23afe5b 100644 --- a/ncurses/base/lib_immedok.c +++ b/ncurses/base/lib_immedok.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2000,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_immedok.c,v 1.5 2009/10/24 22:32:11 tom Exp $") +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) diff --git a/ncurses/base/lib_inchstr.c b/ncurses/base/lib_inchstr.c index aebb6d6..38af239 100644 --- a/ncurses/base/lib_inchstr.c +++ b/ncurses/base/lib_inchstr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -41,7 +42,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_inchstr.c,v 1.12 2010/12/20 01:37:41 tom Exp $") +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) @@ -50,16 +51,19 @@ winchnstr(WINDOW *win, chtype *str, int n) T((T_CALLED("winchnstr(%p,%p,%d)"), (void *) win, (void *) str, n)); - if (!str) - returnCode(0); + if (!win || !str) { + i = ERR; + } else { + int row = win->_cury; + int col = win->_curx; + NCURSES_CH_T *text = win->_line[row].text; - if (win) { - for (; (n < 0 || (i < n)) && (win->_curx + i <= win->_maxx); i++) - str[i] = - (chtype) CharOf(win->_line[win->_cury].text[win->_curx + i]) | - AttrOf(win->_line[win->_cury].text[win->_curx + i]); + 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; } - str[i] = (chtype) 0; returnCode(i); } diff --git a/ncurses/base/lib_initscr.c b/ncurses/base/lib_initscr.c index 0e8a297..2ace092 100644 --- a/ncurses/base/lib_initscr.c +++ b/ncurses/base/lib_initscr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2014 Free Software Foundation, Inc. * + * 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 * @@ -29,7 +30,7 @@ /**************************************************************************** * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * * and: Eric S. Raymond <esr@snark.thyrsus.com> * - * and: Thomas E. Dickey 1996-2003 * + * and: Thomas E. Dickey 1996-on * ****************************************************************************/ /* @@ -45,15 +46,13 @@ #include <sys/termio.h> /* needed for ISC */ #endif -MODULE_ID("$Id: lib_initscr.c,v 1.40 2014/04/26 18:47:51 juergen Exp $") +MODULE_ID("$Id: lib_initscr.c,v 1.45 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(WINDOW *) initscr(void) { WINDOW *result; - NCURSES_CONST char *name; - START_TRACE(); T((T_CALLED("initscr()"))); @@ -62,11 +61,19 @@ initscr(void) /* Portable applications must not call initscr() more than once */ if (!_nc_globals.init_screen) { + const char *env; + char *name; + _nc_globals.init_screen = TRUE; - if ((name = getenv("TERM")) == 0 - || *name == '\0') - name = "unknown"; + if ((env = getenv("TERM")) == 0 + || *env == '\0') { + env = "unknown"; + } + if ((name = strdup(env)) == NULL) { + fprintf(stderr, "Error opening allocating $TERM.\n"); + ExitProgram(EXIT_FAILURE); + } #ifdef __CYGWIN__ /* * 2002/9/21 @@ -86,7 +93,7 @@ initscr(void) #endif if (newterm(name, stdout, stdin) == 0) { fprintf(stderr, "Error opening terminal: %s.\n", name); - exit(EXIT_FAILURE); + ExitProgram(EXIT_FAILURE); } /* def_shell_mode - done in newterm/_nc_setupscreen */ @@ -95,6 +102,7 @@ initscr(void) #else def_prog_mode(); #endif + free(name); } result = stdscr; _nc_unlock_global(curses); diff --git a/ncurses/base/lib_insch.c b/ncurses/base/lib_insch.c index 32eaed7..894605c 100644 --- a/ncurses/base/lib_insch.c +++ b/ncurses/base/lib_insch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * + * 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 * @@ -43,7 +44,7 @@ #include <curses.priv.h> #include <ctype.h> -MODULE_ID("$Id: lib_insch.c,v 1.35 2013/05/18 21:58:56 tom Exp $") +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 @@ -56,7 +57,6 @@ _nc_insert_ch(SCREEN *sp, WINDOW *win, chtype ch) int ch8 = (int) ChCharOf(ch); NCURSES_CH_T wch; int count; - NCURSES_CONST char *s; int tabsize = ( #if USE_REENTRANT sp->_TABSIZE @@ -102,6 +102,7 @@ _nc_insert_ch(SCREEN *sp, WINDOW *win, chtype ch) 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)); @@ -121,6 +122,7 @@ _nc_insert_ch(SCREEN *sp, WINDOW *win, chtype ch) 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) { @@ -145,15 +147,13 @@ _nc_insert_ch(SCREEN *sp, WINDOW *win, chtype ch) NCURSES_EXPORT(int) winsch(WINDOW *win, chtype c) { - NCURSES_SIZE_T oy; - NCURSES_SIZE_T ox; int code = ERR; T((T_CALLED("winsch(%p, %s)"), (void *) win, _tracechtype(c))); if (win != 0) { - oy = win->_cury; - ox = win->_curx; + NCURSES_SIZE_T oy = win->_cury; + NCURSES_SIZE_T ox = win->_curx; code = _nc_insert_ch(_nc_screen_of(win), win, c); diff --git a/ncurses/base/lib_insdel.c b/ncurses/base/lib_insdel.c index 8f51bbe..7c00739 100644 --- a/ncurses/base/lib_insdel.c +++ b/ncurses/base/lib_insdel.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2003,2009 Free Software Foundation, Inc. * + * 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_insdel.c,v 1.13 2009/10/24 22:34:41 tom Exp $") +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) diff --git a/ncurses/base/lib_insnstr.c b/ncurses/base/lib_insnstr.c index ce03e64..ff1ae57 100644 --- a/ncurses/base/lib_insnstr.c +++ b/ncurses/base/lib_insnstr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2004,2009 Free Software Foundation, Inc. * + * Copyright 2018,2020 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 * @@ -40,31 +41,55 @@ #include <curses.priv.h> #include <ctype.h> -MODULE_ID("$Id: lib_insnstr.c,v 1.3 2009/10/24 22:04:35 tom Exp $") +MODULE_ID("$Id: lib_insnstr.c,v 1.7 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) winsnstr(WINDOW *win, const char *s, int n) { int code = ERR; - NCURSES_SIZE_T oy; - NCURSES_SIZE_T ox; const unsigned char *str = (const unsigned char *) s; - const unsigned char *cp; T((T_CALLED("winsnstr(%p,%s,%d)"), (void *) win, _nc_visbufn(s, n), n)); if (win != 0 && str != 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)) { + 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; - oy = win->_cury; - ox = win->_curx; - for (cp = str; *cp && (n <= 0 || (cp - str) < n); cp++) { - _nc_insert_ch(sp, win, (chtype) UChar(*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; } - win->_curx = ox; - win->_cury = oy; - _nc_synchook(win); - code = OK; } returnCode(code); } diff --git a/ncurses/base/lib_instr.c b/ncurses/base/lib_instr.c index f708ecc..2aa0fc3 100644 --- a/ncurses/base/lib_instr.c +++ b/ncurses/base/lib_instr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -41,41 +42,44 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_instr.c,v 1.21 2014/02/01 22:09:27 tom Exp $") +MODULE_ID("$Id: lib_instr.c,v 1.24 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) winnstr(WINDOW *win, char *str, int n) { - int i = 0, row, col; + int i = 0; T((T_CALLED("winnstr(%p,%p,%d)"), (void *) win, str, n)); - if (!str) - returnCode(0); - - if (win) { - getyx(win, row, col); + 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 - win->_curx + 1; + n = win->_maxx - col + 1; for (; i < n;) { #if USE_WIDEC_SUPPORT - cchar_t *cell = &(win->_line[row].text[col]); - wchar_t *wch; + cchar_t *cell = &(text[col]); attr_t attrs; NCURSES_PAIRS_T pair; - int n2; - bool done = FALSE; mbstate_t state; - size_t i3, n3; 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) { + size_t n3; init_mb(state); n3 = wcstombs(0, wch, (size_t) 0); @@ -89,6 +93,8 @@ winnstr(WINDOW *win, char *str, int n) } 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) @@ -103,14 +109,14 @@ winnstr(WINDOW *win, char *str, int n) } } #else - str[i++] = (char) CharOf(win->_line[row].text[col]); + str[i++] = (char) CharOf(text[col]); #endif if (++col > win->_maxx) { break; } } + str[i] = '\0'; /* SVr4 does not seem to count the null */ } - str[i] = '\0'; /* SVr4 does not seem to count the null */ T(("winnstr returns %s", _nc_visbuf(str))); returnCode(i); } diff --git a/ncurses/base/lib_isendwin.c b/ncurses/base/lib_isendwin.c index 923e35b..a54d500 100644 --- a/ncurses/base/lib_isendwin.c +++ b/ncurses/base/lib_isendwin.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2000,2009 Free Software Foundation, Inc. * + * 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 * @@ -42,14 +43,14 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_isendwin.c,v 1.7 2009/02/15 00:36:24 tom Exp $") +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; + return (SP_PARM->_endwin == ewSuspend); } #if NCURSES_SP_FUNCS diff --git a/ncurses/base/lib_leaveok.c b/ncurses/base/lib_leaveok.c index e6995f8..4d05b2c 100644 --- a/ncurses/base/lib_leaveok.c +++ b/ncurses/base/lib_leaveok.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2000,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_leaveok.c,v 1.6 2009/10/24 22:34:23 tom Exp $") +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) diff --git a/ncurses/base/lib_mouse.c b/ncurses/base/lib_mouse.c index 60bf488..2530dec 100644 --- a/ncurses/base/lib_mouse.c +++ b/ncurses/base/lib_mouse.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -84,7 +85,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_mouse.c,v 1.165 2014/11/01 12:27:59 tom Exp $") +MODULE_ID("$Id: lib_mouse.c,v 1.184 2020/02/02 23:34:34 tom Exp $") #include <tic.h> @@ -225,7 +226,7 @@ write_event(SCREEN *sp, int down, int button, int x, int y) char buf[6]; unsigned long ignore; - strcpy(buf, "\033[M"); /* should be the same as key_mouse */ + _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; @@ -438,7 +439,7 @@ allow_gpm_mouse(SCREEN *sp GCC_UNUSED) #if USE_WEAK_SYMBOLS /* Danger Robinson: do not use dlopen for libgpm if already loaded */ - if ((Gpm_Wgetch)) { + if ((Gpm_Wgetch) != 0) { if (!sp->_mouse_gpm_loaded) { T(("GPM library was already dlopen'd, not by us")); } @@ -486,10 +487,17 @@ load_gpm_library(SCREEN *sp) { sp->_mouse_gpm_found = FALSE; 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); } else { @@ -597,8 +605,8 @@ initialize_mousetype(SCREEN *sp) /* OS/2 VIO */ #if USE_EMX_MOUSE if (!sp->_emxmouse_thread - && strstr(TerminalOf(sp)->type.term_names, "xterm") == 0 - && key_mouse) { + && strstr(SP_TERMTYPE term_names, "xterm") == 0 + && NonEmpty(key_mouse)) { int handles[2]; if (pipe(handles) < 0) { @@ -641,13 +649,14 @@ initialize_mousetype(SCREEN *sp) #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"; + the_device = dev_tty; sp->_mouse_fd = open(the_device, O_RDWR); @@ -708,12 +717,9 @@ initialize_mousetype(SCREEN *sp) CallDriver(sp, td_initmouse); #else /* we know how to recognize mouse events under "xterm" */ - if (key_mouse != 0) { - if (!strcmp(key_mouse, xterm_kmous) - || strstr(TerminalOf(sp)->type.term_names, "xterm") != 0) { - init_xterm_mouse(sp); - } - } else if (strstr(TerminalOf(sp)->type.term_names, "xterm") != 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); } @@ -727,10 +733,11 @@ _nc_mouse_init(SCREEN *sp) /* initialize the mouse */ { bool result = FALSE; - int i; if (sp != 0) { if (!sp->_mouse_initialized) { + int i; + sp->_mouse_initialized = TRUE; TR(MY_TRACE, ("_nc_mouse_init() called")); @@ -888,7 +895,7 @@ _nc_mouse_event(SCREEN *sp) do { \ eventp->bstate = MASK_PRESS(n); \ sp->_mouse_bstate |= MASK_PRESS(n); \ - if (kbuf[0] & 0x40) { \ + if (button & 0x40) { \ eventp->bstate = MASK_RELEASE(n); \ sp->_mouse_bstate &= ~MASK_PRESS(n); \ } \ @@ -896,7 +903,7 @@ _nc_mouse_event(SCREEN *sp) #else #define PRESS_POSITION(n) \ do { \ - eventp->bstate = (mmask_t) (sp->_mouse_bstate & MASK_PRESS(n) \ + eventp->bstate = (mmask_t) ((sp->_mouse_bstate & MASK_PRESS(n)) \ ? REPORT_MOUSE_POSITION \ : MASK_PRESS(n)); \ sp->_mouse_bstate |= MASK_PRESS(n); \ @@ -946,11 +953,11 @@ static bool decode_X10_bstate(SCREEN *sp, MEVENT * eventp, unsigned intro) { bool result; - int b; eventp->bstate = 0; if (!handle_wheel(sp, eventp, (int) intro, (intro & 96) == 96)) { + /* * Release events aren't reported for individual buttons, just for * the button set as a whole. However, because there are normally @@ -959,6 +966,8 @@ decode_X10_bstate(SCREEN *sp, MEVENT * eventp, unsigned intro) * 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))) @@ -1019,7 +1028,8 @@ decode_X10_bstate(SCREEN *sp, MEVENT * eventp, unsigned intro) static bool decode_xterm_X10(SCREEN *sp, MEVENT * eventp) { - unsigned char kbuf[4]; +#define MAX_KBUF 3 + unsigned char kbuf[MAX_KBUF + 1]; size_t grabbed; int res; bool result; @@ -1030,7 +1040,7 @@ decode_xterm_X10(SCREEN *sp, MEVENT * eventp) # endif _nc_globals.read_thread = pthread_self(); # endif - for (grabbed = 0; grabbed < 3; grabbed += (size_t) res) { + 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( @@ -1039,14 +1049,14 @@ decode_xterm_X10(SCREEN *sp, MEVENT * eventp) #else sp->_ifd, #endif - kbuf + grabbed, 3 - grabbed); + kbuf + grabbed, (size_t) (MAX_KBUF - (int) grabbed)); if (res == -1) break; } #if USE_PTHREADS_EINTR _nc_globals.read_thread = 0; #endif - kbuf[3] = '\0'; + kbuf[MAX_KBUF] = '\0'; TR(TRACE_IEVENT, ("_nc_mouse_inline sees the following xterm data: '%s'", kbuf)); @@ -1074,7 +1084,6 @@ decode_xterm_1005(SCREEN *sp, MEVENT * eventp) size_t grabbed; size_t limit = (sizeof(kbuf) - 1); unsigned coords[2]; - int res; bool result; coords[0] = 0; @@ -1087,6 +1096,7 @@ decode_xterm_1005(SCREEN *sp, MEVENT * eventp) _nc_globals.read_thread = pthread_self(); # endif for (grabbed = 0; grabbed < limit;) { + int res; res = (int) read( #if USE_EMX_MOUSE @@ -1094,15 +1104,17 @@ decode_xterm_1005(SCREEN *sp, MEVENT * eventp) #else sp->_ifd, #endif - kbuf + grabbed, 1); + (kbuf + grabbed), (size_t) 1); if (res == -1) break; grabbed += (size_t) res; if (grabbed > 1) { size_t check = 1; int n; - int rc; + for (n = 0; n < 2; ++n) { + int rc; + if (check >= grabbed) break; rc = _nc_conv_to_utf32(&coords[n], kbuf + check, (unsigned) @@ -1156,7 +1168,6 @@ read_SGR(SCREEN *sp, SGR_DATA * result) { char kbuf[80]; /* bigger than any possible mouse response */ int grabbed = 0; - int res; int ch = 0; int now = -1; int marker = 1; @@ -1168,17 +1179,20 @@ read_SGR(SCREEN *sp, SGR_DATA * result) # endif _nc_globals.read_thread = pthread_self(); # endif + 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, 1); + (kbuf + grabbed), (size_t) 1); if (res == -1) break; - if ((grabbed + 3) >= (int) sizeof(kbuf)) { + if ((grabbed + MAX_KBUF) >= (int) sizeof(kbuf)) { result->nerror++; break; } @@ -1248,7 +1262,6 @@ decode_xterm_SGR1006(SCREEN *sp, MEVENT * eventp) int b = data.params[0]; int b3 = 1 + (b & 3); - result = TRUE; eventp->id = NORMAL_EVENT; if (data.final == 'M') { (void) handle_wheel(sp, eventp, b, (b & 64) == 64); @@ -1262,6 +1275,15 @@ decode_xterm_SGR1006(SCREEN *sp, MEVENT * eventp) 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); @@ -1739,11 +1761,14 @@ 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)) { - MEVENT *eventp = SP_PARM->_mouse_eventp; + 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); @@ -1792,11 +1817,13 @@ 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) { - MEVENT *eventp = SP_PARM->_mouse_eventp; + if (aevent != 0 && + SP_PARM != 0 && + (eventp = SP_PARM->_mouse_eventp) != 0) { /* stick the given event in the next-free slot */ *eventp = *aevent; @@ -1824,7 +1851,6 @@ NCURSES_SP_NAME(mousemask) (NCURSES_SP_DCLx mmask_t newmask, mmask_t * oldmask) /* set the mouse event mask */ { mmask_t result = 0; - int b; T((T_CALLED("mousemask(%p,%#lx,%p)"), (void *) SP_PARM, @@ -1837,7 +1863,10 @@ NCURSES_SP_NAME(mousemask) (NCURSES_SP_DCLx mmask_t newmask, mmask_t * oldmask) 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 diff --git a/ncurses/base/lib_move.c b/ncurses/base/lib_move.c index 488b195..d9ba8c0 100644 --- a/ncurses/base/lib_move.c +++ b/ncurses/base/lib_move.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2004,2009 Free Software Foundation, Inc. * + * 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 * @@ -41,7 +42,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_move.c,v 1.13 2009/10/24 22:34:07 tom Exp $") +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) diff --git a/ncurses/base/lib_mvwin.c b/ncurses/base/lib_mvwin.c index 18d31c1..58bdb19 100644 --- a/ncurses/base/lib_mvwin.c +++ b/ncurses/base/lib_mvwin.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_mvwin.c,v 1.18 2010/12/19 01:22:58 tom Exp $") +MODULE_ID("$Id: lib_mvwin.c,v 1.19 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) mvwin(WINDOW *win, int by, int bx) diff --git a/ncurses/base/lib_newterm.c b/ncurses/base/lib_newterm.c index edbf956..ac89790 100644 --- a/ncurses/base/lib_newterm.c +++ b/ncurses/base/lib_newterm.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -48,7 +49,7 @@ #include <tic.h> -MODULE_ID("$Id: lib_newterm.c,v 1.92 2014/04/26 18:00:39 tom Exp $") +MODULE_ID("$Id: lib_newterm.c,v 1.102 2020/02/02 23:34:34 tom Exp $") #ifdef USE_TERM_DRIVER #define NumLabels InfoOf(SP_PARM).numlabels @@ -76,6 +77,7 @@ _nc_initscr(NCURSES_SP_DCL0) /* 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; @@ -93,7 +95,7 @@ _nc_initscr(NCURSES_SP_DCL0) if (result == OK) term->Nttyb = buf; } - return result; + returnCode(result); } /* @@ -162,20 +164,16 @@ nofilter(void) NCURSES_EXPORT(SCREEN *) NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx - NCURSES_CONST char *name, + const char *name, FILE *ofp, FILE *ifp) { - int value; int errret; SCREEN *result = 0; SCREEN *current; TERMINAL *its_term; FILE *_ofp = ofp ? ofp : stdout; FILE *_ifp = ifp ? ifp : stdin; - int cols; - int slk_format; - int filter_mode; TERMINAL *new_term = 0; START_TRACE(); @@ -202,6 +200,8 @@ NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx 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 @@ -232,6 +232,9 @@ NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx _nc_set_screen(current); result = 0; } else { + int value; + int cols; + #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *TCB; #elif !NCURSES_SP_FUNCS @@ -265,7 +268,11 @@ NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx /* 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 */ @@ -281,7 +288,7 @@ NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx #else SP_PARM->_use_meta = FALSE; #endif - SP_PARM->_endwin = FALSE; + SP_PARM->_endwin = ewInitial; #ifndef USE_TERM_DRIVER /* * Check whether we can optimize scrolling under dumb terminals in @@ -341,8 +348,14 @@ NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx #if NCURSES_SP_FUNCS NCURSES_EXPORT(SCREEN *) -newterm(NCURSES_CONST char *name, FILE *ofp, FILE *ifp) +newterm(const char *name, FILE *ofp, FILE *ifp) { - return NCURSES_SP_NAME(newterm) (CURRENT_SCREEN_PRE, name, ofp, ifp); + SCREEN *rc; + _nc_lock_global(prescreen); + START_TRACE(); + rc = NCURSES_SP_NAME(newterm) (CURRENT_SCREEN_PRE, name, ofp, ifp); + _nc_forget_prescr(); + _nc_unlock_global(prescreen); + return rc; } #endif diff --git a/ncurses/base/lib_newwin.c b/ncurses/base/lib_newwin.c index a6c64be..580d033 100644 --- a/ncurses/base/lib_newwin.c +++ b/ncurses/base/lib_newwin.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * 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 * @@ -43,7 +44,7 @@ #include <curses.priv.h> #include <stddef.h> -MODULE_ID("$Id: lib_newwin.c,v 1.71 2011/05/28 21:32:51 tom Exp $") +MODULE_ID("$Id: lib_newwin.c,v 1.75 2020/02/02 23:34:34 tom Exp $") #define window_is(name) ((sp)->_##name == win) @@ -91,8 +92,6 @@ remove_window_from_screen(WINDOW *win) NCURSES_EXPORT(int) _nc_freewin(WINDOW *win) { - WINDOWLIST *p, *q; - int i; int result = ERR; #ifdef USE_SP_WINDOWLIST SCREEN *sp = _nc_screen_of(win); /* pretend this is parameter */ @@ -101,17 +100,23 @@ _nc_freewin(WINDOW *win) 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_PARM, p)) { + for (each_window(sp, p)) { + if (&(p->win) == win) { remove_window_from_screen(win); if (q == 0) - WindowList(SP_PARM) = p->next; + WindowList(sp) = p->next; else q->next = p->next; if (!(win->_flags & _SUBWIN)) { + int i; + for (i = 0; i <= win->_maxy; i++) FreeIfNeeded(win->_line[i].text); } @@ -384,18 +389,18 @@ NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_DCLx NCURSES_EXPORT(WINDOW *) _nc_curscr_of(SCREEN *sp) { - return sp == 0 ? 0 : CurScreen(sp); + return (sp == 0) ? NULL : CurScreen(sp); } NCURSES_EXPORT(WINDOW *) _nc_newscr_of(SCREEN *sp) { - return sp == 0 ? 0 : NewScreen(sp); + return (sp == 0) ? NULL : NewScreen(sp); } NCURSES_EXPORT(WINDOW *) _nc_stdscr_of(SCREEN *sp) { - return sp == 0 ? 0 : StdScreen(sp); + return (sp == 0) ? NULL : StdScreen(sp); } #endif diff --git a/ncurses/base/lib_nl.c b/ncurses/base/lib_nl.c index 3425487..df07349 100644 --- a/ncurses/base/lib_nl.c +++ b/ncurses/base/lib_nl.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. * + * 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 * @@ -44,7 +45,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_nl.c,v 1.12 2009/10/24 22:05:55 tom Exp $") +MODULE_ID("$Id: lib_nl.c,v 1.13 2020/02/02 23:34:34 tom Exp $") #ifdef __EMX__ #include <io.h> diff --git a/ncurses/base/lib_overlay.c b/ncurses/base/lib_overlay.c index a206248..6d451d0 100644 --- a/ncurses/base/lib_overlay.c +++ b/ncurses/base/lib_overlay.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2013 Free Software Foundation, Inc. * + * 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 * @@ -40,21 +41,19 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_overlay.c,v 1.31 2013/04/06 23:47:13 tom Exp $") +MODULE_ID("$Id: lib_overlay.c,v 1.33 2020/02/02 23:34:34 tom Exp $") static int overlap(const WINDOW *const src, WINDOW *const dst, int const flag) { int rc = ERR; - int sx1, sy1, sx2, sy2; - int dx1, dy1, dx2, dy2; - int sminrow, smincol; - int dminrow, dmincol; - int dmaxrow, dmaxcol; 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", @@ -79,12 +78,12 @@ overlap(const WINDOW *const src, WINDOW *const dst, int const flag) dy2 = dy1 + dst->_maxy; if (dx2 >= sx1 && dx1 <= sx2 && dy2 >= sy1 && dy1 <= sy2) { - sminrow = max(sy1, dy1) - sy1; - smincol = max(sx1, dx1) - sx1; - dminrow = max(sy1, dy1) - dy1; - dmincol = max(sx1, dx1) - dx1; - dmaxrow = min(sy2, dy2) - dy1; - dmaxcol = min(sx2, dx2) - dx1; + 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, @@ -139,10 +138,6 @@ copywin(const WINDOW *src, WINDOW *dst, int over) { int rc = ERR; - int sx, sy, dx, dy; - bool touched; - attr_t bk; - attr_t mask; T((T_CALLED("copywin(%p, %p, %d, %d, %d, %d, %d, %d, %d)"), (const void *) src, @@ -155,6 +150,9 @@ copywin(const WINDOW *src, WINDOW *dst, && dst != 0 && dmaxrow >= dminrow && dmaxcol >= dmincol) { + attr_t bk; + attr_t mask; + _nc_lock_global(curses); bk = AttrOf(dst->_nc_bkgd); @@ -163,18 +161,20 @@ copywin(const WINDOW *src, WINDOW *dst, /* make sure rectangle exists in source */ if ((sminrow + dmaxrow - dminrow) <= (src->_maxy + 1) && (smincol + dmaxcol - dmincol) <= (src->_maxx + 1)) { - bool copied = FALSE; 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; diff --git a/ncurses/base/lib_pad.c b/ncurses/base/lib_pad.c index b87498b..73978fb 100644 --- a/ncurses/base/lib_pad.c +++ b/ncurses/base/lib_pad.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_pad.c,v 1.46 2010/04/24 23:50:45 tom Exp $") +MODULE_ID("$Id: lib_pad.c,v 1.48 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(newpad) (NCURSES_SP_DCLx int l, int c) @@ -188,6 +189,12 @@ pnoutrefresh(WINDOW *win, 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 diff --git a/ncurses/base/lib_printw.c b/ncurses/base/lib_printw.c index 56528f6..d901b72 100644 --- a/ncurses/base/lib_printw.c +++ b/ncurses/base/lib_printw.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2012 Free Software Foundation, Inc. * + * 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 * @@ -39,10 +40,10 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_printw.c,v 1.23 2012/09/03 17:55:28 tom Exp $") +MODULE_ID("$Id: lib_printw.c,v 1.28 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) -printw(const char *fmt,...) +printw(const char *fmt, ...) { va_list argp; int code; @@ -56,14 +57,14 @@ printw(const char *fmt,...) #endif va_start(argp, fmt); - code = vwprintw(stdscr, fmt, argp); + code = vw_printw(stdscr, fmt, argp); va_end(argp); returnCode(code); } NCURSES_EXPORT(int) -wprintw(WINDOW *win, const char *fmt,...) +wprintw(WINDOW *win, const char *fmt, ...) { va_list argp; int code; @@ -77,16 +78,15 @@ wprintw(WINDOW *win, const char *fmt,...) #endif va_start(argp, fmt); - code = vwprintw(win, fmt, argp); + code = vw_printw(win, fmt, argp); va_end(argp); returnCode(code); } NCURSES_EXPORT(int) -mvprintw(int y, int x, const char *fmt,...) +mvprintw(int y, int x, const char *fmt, ...) { - va_list argp; int code; #ifdef TRACE @@ -98,17 +98,18 @@ mvprintw(int y, int x, const char *fmt,...) #endif if ((code = move(y, x)) != ERR) { + va_list argp; + va_start(argp, fmt); - code = vwprintw(stdscr, fmt, argp); + code = vw_printw(stdscr, fmt, argp); va_end(argp); } returnCode(code); } NCURSES_EXPORT(int) -mvwprintw(WINDOW *win, int y, int x, const char *fmt,...) +mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...) { - va_list argp; int code; #ifdef TRACE @@ -120,8 +121,10 @@ mvwprintw(WINDOW *win, int y, int x, const char *fmt,...) #endif if ((code = wmove(win, y, x)) != ERR) { + va_list argp; + va_start(argp, fmt); - code = vwprintw(win, fmt, argp); + code = vw_printw(win, fmt, argp); va_end(argp); } returnCode(code); @@ -144,3 +147,21 @@ vwprintw(WINDOW *win, const char *fmt, va_list argp) } 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); +} diff --git a/ncurses/base/lib_redrawln.c b/ncurses/base/lib_redrawln.c index 72905f8..c99d699 100644 --- a/ncurses/base/lib_redrawln.c +++ b/ncurses/base/lib_redrawln.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_redrawln.c,v 1.17 2010/12/19 00:03:23 tom Exp $") +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) diff --git a/ncurses/base/lib_refresh.c b/ncurses/base/lib_refresh.c index a77bc48..d844428 100644 --- a/ncurses/base/lib_refresh.c +++ b/ncurses/base/lib_refresh.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2010,2011 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -42,7 +43,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_refresh.c,v 1.45 2011/06/25 19:02:22 Vassili.Courzakis Exp $") +MODULE_ID("$Id: lib_refresh.c,v 1.46 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) wrefresh(WINDOW *win) diff --git a/ncurses/base/lib_restart.c b/ncurses/base/lib_restart.c index 3a3756e..81eb368 100644 --- a/ncurses/base/lib_restart.c +++ b/ncurses/base/lib_restart.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright 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 * @@ -41,7 +42,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_restart.c,v 1.15 2012/12/08 20:40:06 tom Exp $") +MODULE_ID("$Id: lib_restart.c,v 1.17 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) NCURSES_SP_NAME(restartterm) (NCURSES_SP_DCLx @@ -54,6 +55,7 @@ NCURSES_SP_NAME(restartterm) (NCURSES_SP_DCLx TERMINAL *new_term = 0; #endif + START_TRACE(); T((T_CALLED("restartterm(%p,%s,%d,%p)"), (void *) SP_PARM, termp, @@ -110,6 +112,7 @@ NCURSES_SP_NAME(restartterm) (NCURSES_SP_DCLx NCURSES_EXPORT(int) restartterm(NCURSES_CONST char *termp, int filenum, int *errret) { + START_TRACE(); return NCURSES_SP_NAME(restartterm) (CURRENT_SCREEN, termp, filenum, errret); } #endif diff --git a/ncurses/base/lib_scanw.c b/ncurses/base/lib_scanw.c index 637aa46..1ed36a5 100644 --- a/ncurses/base/lib_scanw.c +++ b/ncurses/base/lib_scanw.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2011 Free Software Foundation, Inc. * + * 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 * @@ -40,21 +41,40 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_scanw.c,v 1.13 2011/10/22 16:31:35 tom Exp $") +MODULE_ID("$Id: lib_scanw.c,v 1.19 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) -vwscanw(WINDOW *win, NCURSES_CONST char *fmt, va_list argp) +vwscanw(WINDOW *win, const char *fmt, va_list argp) { char buf[BUFSIZ]; + int code = ERR; - if (wgetnstr(win, buf, (int) sizeof(buf) - 1) == ERR) - return (ERR); + if (wgetnstr(win, buf, (int) sizeof(buf) - 1) != ERR) { + if ((code = vsscanf(buf, fmt, argp)) == EOF) { + code = ERR; + } + } - return (vsscanf(buf, fmt, argp)); + return code; } NCURSES_EXPORT(int) -scanw(NCURSES_CONST char *fmt,...) +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; @@ -62,13 +82,13 @@ scanw(NCURSES_CONST char *fmt,...) T(("scanw(\"%s\",...) called", fmt)); va_start(ap, fmt); - code = vwscanw(stdscr, fmt, ap); + code = vw_scanw(stdscr, fmt, ap); va_end(ap); return (code); } NCURSES_EXPORT(int) -wscanw(WINDOW *win, NCURSES_CONST char *fmt,...) +wscanw(WINDOW *win, const char *fmt, ...) { int code; va_list ap; @@ -76,31 +96,31 @@ wscanw(WINDOW *win, NCURSES_CONST char *fmt,...) T(("wscanw(%p,\"%s\",...) called", (void *) win, fmt)); va_start(ap, fmt); - code = vwscanw(win, fmt, ap); + code = vw_scanw(win, fmt, ap); va_end(ap); return (code); } NCURSES_EXPORT(int) -mvscanw(int y, int x, NCURSES_CONST char *fmt,...) +mvscanw(int y, int x, const char *fmt, ...) { int code; va_list ap; va_start(ap, fmt); - code = (move(y, x) == OK) ? vwscanw(stdscr, fmt, ap) : ERR; + 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, NCURSES_CONST char *fmt,...) +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) ? vwscanw(win, fmt, ap) : ERR; + code = (wmove(win, y, x) == OK) ? vw_scanw(win, fmt, ap) : ERR; va_end(ap); return (code); } diff --git a/ncurses/base/lib_screen.c b/ncurses/base/lib_screen.c index 695ed30..164356d 100644 --- a/ncurses/base/lib_screen.c +++ b/ncurses/base/lib_screen.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2011 Free Software Foundation, Inc. * + * Copyright 2019,2020 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 * @@ -35,32 +36,509 @@ #include <curses.priv.h> +#include <ctype.h> + #ifndef CUR #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_screen.c,v 1.41 2011/10/22 15:03:11 tom Exp $") +MODULE_ID("$Id: lib_screen.c,v 1.97 2020/02/02 23:34:34 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 - (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'}; + +#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 size; + 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 sizeof2(type,name) sizeof(((type *)0)->name) +#define DATA(name, type) { { #name }, type, sizeof2(WINDOW, name), 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'; + T(("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; + + T(("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"; + + T(("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; + + T(("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; + + T(("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; - int n; + bool old_format = FALSE; T((T_CALLED("getwin(%p)"), (void *) filep)); if (filep == 0) { returnWin(0); } - clearerr(filep); - if (fread(&tmp, (size_t) 1, sizeof(WINDOW), filep) < sizeof(WINDOW) - || ferror(filep) - || tmp._maxy == 0 - || tmp._maxy > MAX_SIZE - || tmp._maxx == 0 - || tmp._maxx > MAX_SIZE) { + + /* + * 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); } @@ -80,6 +558,7 @@ NCURSES_SP_NAME(getwin) (NCURSES_SP_DCLx FILE *filep) * 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; @@ -111,14 +590,55 @@ NCURSES_SP_NAME(getwin) (NCURSES_SP_DCLx FILE *filep) if (tmp._flags & _ISPAD) nwin->_pad = tmp._pad; - for (n = 0; n <= nwin->_maxy; n++) { - clearerr(filep); - if (fread(nwin->_line[n].text, (size_t) 1, linesize, filep) < linesize - || ferror(filep)) { + 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); @@ -132,24 +652,283 @@ getwin(FILE *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; - int n; 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) && !(win->_flags & _ISPAD)) { + 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 (n = 0; n <= win->_maxy; n++) { - if (fwrite(win->_line[n].text, + for (y = 0; y <= win->_maxy; y++) { + if (fwrite(win->_line[y].text, sizeof(NCURSES_CH_T), len, filep) != len || ferror(filep)) { returnCode(code); @@ -157,6 +936,7 @@ putwin(WINDOW *win, FILE *filep) } code = OK; } +#endif returnCode(code); } @@ -164,21 +944,23 @@ 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 = fopen(file, "rb")) == 0) { - returnCode(ERR); - } else { + if (_nc_access(file, R_OK) >= 0 + && (fp = fopen(file, BIN_R)) != 0) { delwin(NewScreen(SP_PARM)); NewScreen(SP_PARM) = getwin(fp); #if !USE_REENTRANT newscr = NewScreen(SP_PARM); #endif (void) fclose(fp); - returnCode(OK); + if (NewScreen(SP_PARM) != 0) { + code = OK; + } } + returnCode(code); } #if NCURSES_SP_FUNCS @@ -198,7 +980,7 @@ scr_dump(const char *file) T((T_CALLED("scr_dump(%s)"), _nc_visbuf(file))); if (_nc_access(file, W_OK) < 0 - || (fp = fopen(file, "wb")) == 0) { + || (fp = fopen(file, BIN_W)) == 0) { result = ERR; } else { (void) putwin(newscr, fp); @@ -211,7 +993,6 @@ scr_dump(const char *file) NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_init) (NCURSES_SP_DCLx const char *file) { - FILE *fp = 0; int code = ERR; T((T_CALLED("scr_init(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file))); @@ -223,15 +1004,19 @@ NCURSES_SP_NAME(scr_init) (NCURSES_SP_DCLx const char *file) !(exit_ca_mode && non_rev_rmcup) #endif ) { + FILE *fp = 0; + if (_nc_access(file, R_OK) >= 0 - && (fp = fopen(file, "rb")) != 0) { + && (fp = fopen(file, BIN_R)) != 0) { delwin(CurScreen(SP_PARM)); CurScreen(SP_PARM) = getwin(fp); #if !USE_REENTRANT curscr = CurScreen(SP_PARM); #endif (void) fclose(fp); - code = OK; + if (CurScreen(SP_PARM) != 0) { + code = OK; + } } } returnCode(code); @@ -248,18 +1033,21 @@ scr_init(const char *file) 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) == ERR) { - returnCode(ERR); - } else { + 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 - returnCode(OK); + if (NewScreen(SP_PARM) != 0) { + code = OK; + } } + returnCode(code); } #if NCURSES_SP_FUNCS diff --git a/ncurses/base/lib_scroll.c b/ncurses/base/lib_scroll.c index 8684e25..ecc0ba5 100644 --- a/ncurses/base/lib_scroll.c +++ b/ncurses/base/lib_scroll.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * 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 * @@ -43,7 +44,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_scroll.c,v 1.29 2011/10/22 16:34:50 tom Exp $") +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, @@ -77,11 +78,13 @@ _nc_scroll_window(WINDOW *win, * 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 && line >= 0; line--) { + 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, @@ -89,7 +92,7 @@ _nc_scroll_window(WINDOW *win, if_USE_SCROLL_HINTS(win->_line[line].oldindex = win->_line[line + n].oldindex); } - for (line = top; line < limit && line <= win->_maxy; line++) { + 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; @@ -100,14 +103,14 @@ _nc_scroll_window(WINDOW *win, /* shift n lines upwards */ if (n > 0) { limit = bottom - n; - for (line = top; line <= limit && line <= win->_maxy; line++) { + 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 && line >= 0; line--) { + 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); diff --git a/ncurses/base/lib_scrollok.c b/ncurses/base/lib_scrollok.c index 6a698a3..c9462c3 100644 --- a/ncurses/base/lib_scrollok.c +++ b/ncurses/base/lib_scrollok.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2000,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_scrollok.c,v 1.5 2009/10/24 22:35:38 tom Exp $") +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) diff --git a/ncurses/base/lib_scrreg.c b/ncurses/base/lib_scrreg.c index 546fbc1..5207f6f 100644 --- a/ncurses/base/lib_scrreg.c +++ b/ncurses/base/lib_scrreg.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2000,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_scrreg.c,v 1.11 2009/10/24 22:35:28 tom Exp $") +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) diff --git a/ncurses/base/lib_set_term.c b/ncurses/base/lib_set_term.c index f2870eb..c5f26bc 100644 --- a/ncurses/base/lib_set_term.c +++ b/ncurses/base/lib_set_term.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -43,11 +44,10 @@ #include <curses.priv.h> #include <tic.h> -#ifndef CUR +#undef CUR #define CUR SP_TERMTYPE -#endif -MODULE_ID("$Id: lib_set_term.c,v 1.150 2014/11/01 12:30:47 tom Exp $") +MODULE_ID("$Id: lib_set_term.c,v 1.169 2020/02/02 23:34:34 tom Exp $") #ifdef USE_TERM_DRIVER #define MaxColors InfoOf(sp).maxcolors @@ -134,7 +134,6 @@ delink_screen(SCREEN *sp) NCURSES_EXPORT(void) delscreen(SCREEN *sp) { - int i; T((T_CALLED("delscreen(%p)"), (void *) sp)); @@ -159,7 +158,10 @@ delscreen(SCREEN *sp) (void) _nc_freewin(StdScreen(sp)); 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); @@ -181,6 +183,7 @@ delscreen(SCREEN *sp) FreeIfNeeded(sp->_color_table); FreeIfNeeded(sp->_color_pairs); + FreeIfNeeded(sp->_oldnum_list); FreeIfNeeded(sp->oldhash); FreeIfNeeded(sp->newhash); FreeIfNeeded(sp->hashtab); @@ -190,6 +193,10 @@ delscreen(SCREEN *sp) 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(); + } free(sp); /* @@ -206,6 +213,12 @@ delscreen(SCREEN *sp) COLOR_PAIRS = 0; #endif _nc_set_screen(0); +#if USE_WIDEC_SUPPORT + if (SP == 0) { + FreeIfNeeded(_nc_wacs); + _nc_wacs = 0; + } +#endif } } _nc_unlock_global(curses); @@ -245,13 +258,14 @@ no_mouse_wrap(SCREEN *sp GCC_UNUSED) static const char * extract_fgbg(const char *src, int *result) { - char *dst = 0; - long value = strtol(src, &dst, 0); + const char *dst = 0; + char *tmp = 0; + long value = strtol(src, &tmp, 0); - if (dst == 0) { + if ((dst = tmp) == 0) { dst = src; } else if (value >= 0) { - *result = value; + *result = (int) value; } while (*dst != 0 && *dst != ';') dst++; @@ -261,7 +275,7 @@ extract_fgbg(const char *src, int *result) } #endif -#define ReturnScreenError() { _nc_set_screen(0); \ +#define ReturnScreenError() do { _nc_set_screen(0); \ returnCode(ERR); } while (0) /* OS-independent screen initializations */ @@ -276,9 +290,11 @@ NCURSES_SP_NAME(_nc_setupscreen) ( 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; - ripoff_t *rop; SCREEN *sp; #ifndef USE_TERM_DRIVER bool support_cookies = USE_XMC_SUPPORT; @@ -295,6 +311,7 @@ NCURSES_SP_NAME(_nc_setupscreen) ( if (!sp) { sp = _nc_alloc_screen_sp(); + T(("_nc_alloc_screen_sp %p", (void *) sp)); *spp = sp; } if (!sp @@ -353,13 +370,19 @@ NCURSES_SP_NAME(_nc_setupscreen) ( #ifdef USE_TERM_DRIVER CallDriver(sp, td_setfilter); #else - clear_screen = 0; - cursor_down = parm_down_cursor = 0; - cursor_address = 0; - cursor_up = parm_up_cursor = 0; - row_address = 0; + /* *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; - cursor_home = carriage_return; #endif T(("filter screensize %dx%d", slines, scolumns)); } @@ -411,8 +434,8 @@ NCURSES_SP_NAME(_nc_setupscreen) ( sp->_default_fg = COLOR_WHITE; sp->_default_bg = COLOR_BLACK; #else - sp->_default_fg = C_MASK; - sp->_default_bg = C_MASK; + sp->_default_fg = COLOR_DEFAULT; + sp->_default_bg = COLOR_DEFAULT; #endif /* @@ -424,9 +447,9 @@ NCURSES_SP_NAME(_nc_setupscreen) ( 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 : C_MASK); + sp->_default_fg = ((fg >= 0 && fg < MaxColors) ? fg : COLOR_DEFAULT); if (count >= 3) { - sp->_default_bg = ((bg >= 0 && bg < MaxColors) ? bg : C_MASK); + sp->_default_bg = ((bg >= 0 && bg < MaxColors) ? bg : COLOR_DEFAULT); } TR(TRACE_CHARPUT | TRACE_MOVE, ("from environment assumed fg=%d, bg=%d", @@ -453,7 +476,7 @@ NCURSES_SP_NAME(_nc_setupscreen) ( if (sp->_default_fg >= MaxColors) { if (set_a_foreground != ABSENT_STRING && !strcmp(set_a_foreground, "\033[3%p1%dm")) { - set_a_foreground = "\033[3%?%p1%{8}%>%t9%e%p1%d%;m"; + set_a_foreground = strdup("\033[3%?%p1%{8}%>%t9%e%p1%d%;m"); } else { sp->_default_fg %= MaxColors; } @@ -461,7 +484,7 @@ NCURSES_SP_NAME(_nc_setupscreen) ( if (sp->_default_bg >= MaxColors) { if (set_a_background != ABSENT_STRING && !strcmp(set_a_background, "\033[4%p1%dm")) { - set_a_background = "\033[4%?%p1%{8}%>%t9%e%p1%d%;m"; + set_a_background = strdup("\033[4%?%p1%{8}%>%t9%e%p1%d%;m"); } else { sp->_default_bg %= MaxColors; } @@ -573,7 +596,9 @@ NCURSES_SP_NAME(_nc_setupscreen) ( NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_ARG); #if USE_WIDEC_SUPPORT sp->_screen_unicode = _nc_unicode_locale(); - _nc_init_wacs(); + if (_nc_wacs == 0) { + _nc_init_wacs(); + } if (_nc_wacs == 0) { ReturnScreenError(); } @@ -617,10 +642,22 @@ NCURSES_SP_NAME(_nc_setupscreen) ( NewScreen(sp)->_clear = TRUE; CurScreen(sp)->_clear = FALSE; - NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG); - NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG); + /* + * 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++) { @@ -714,9 +751,12 @@ NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_DCLx int (*init) (WINDOW *, int)) { int code = ERR; + TR_FUNC_BFR(1); START_TRACE(); - T((T_CALLED("ripoffline(%p,%d,%p)"), (void *) SP_PARM, line, init)); + 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) @@ -725,12 +765,15 @@ NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_DCLx if (line == 0) { code = OK; } else { - if (safe_ripoff_sp == 0) + 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; } } @@ -743,7 +786,12 @@ NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_DCLx NCURSES_EXPORT(int) _nc_ripoffline(int line, int (*init) (WINDOW *, int)) { - return NCURSES_SP_NAME(_nc_ripoffline) (CURRENT_SCREEN_PRE, line, init); + int rc; + _nc_lock_global(prescreen); + START_TRACE(); + rc = NCURSES_SP_NAME(_nc_ripoffline) (CURRENT_SCREEN_PRE, line, init); + _nc_unlock_global(prescreen); + return rc; } #endif @@ -762,6 +810,11 @@ NCURSES_SP_NAME(ripoffline) (NCURSES_SP_DCLx NCURSES_EXPORT(int) ripoffline(int line, int (*init) (WINDOW *, int)) { - return NCURSES_SP_NAME(ripoffline) (CURRENT_SCREEN_PRE, line, init); + int rc; + _nc_lock_global(prescreen); + START_TRACE(); + rc = NCURSES_SP_NAME(ripoffline) (CURRENT_SCREEN_PRE, line, init); + _nc_unlock_global(prescreen); + return rc; } #endif diff --git a/ncurses/base/lib_slk.c b/ncurses/base/lib_slk.c index 84f17ae..f4b3ce6 100644 --- a/ncurses/base/lib_slk.c +++ b/ncurses/base/lib_slk.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2010,2011 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -47,7 +48,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_slk.c,v 1.48 2011/03/05 21:21:52 tom Exp $") +MODULE_ID("$Id: lib_slk.c,v 1.49 2020/02/02 23:34:34 tom Exp $") #ifdef USE_TERM_DRIVER #define NumLabels InfoOf(SP_PARM).numlabels diff --git a/ncurses/base/lib_slkatr_set.c b/ncurses/base/lib_slkatr_set.c index a3132e9..7c5a23a 100644 --- a/ncurses/base/lib_slkatr_set.c +++ b/ncurses/base/lib_slkatr_set.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2014 Free Software Foundation, Inc. * + * 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 * @@ -38,30 +39,31 @@ */ #include <curses.priv.h> -MODULE_ID("$Id: lib_slkatr_set.c,v 1.15 2014/02/01 22:10:42 tom Exp $") +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 color_pair_number, + 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), - (int) color_pair_number)); + color_pair)); + set_extended_pair(opts, color_pair); if (SP_PARM != 0 && SP_PARM->_slk != 0 - && !opts - && color_pair_number >= 0 - && color_pair_number < SP_PARM->_pair_limit) { + && 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_number > 0) { - SetPair(SP_PARM->_slk->attr, color_pair_number); + 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; @@ -71,9 +73,9 @@ NCURSES_SP_NAME(slk_attr_set) (NCURSES_SP_DCLx #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) -slk_attr_set(const attr_t attr, NCURSES_COLOR_T color_pair_number, void *opts) +slk_attr_set(const attr_t attr, NCURSES_COLOR_T pair_arg, void *opts) { return NCURSES_SP_NAME(slk_attr_set) (CURRENT_SCREEN, attr, - color_pair_number, opts); + pair_arg, opts); } #endif diff --git a/ncurses/base/lib_slkatrof.c b/ncurses/base/lib_slkatrof.c index bb980ab..2d53ab2 100644 --- a/ncurses/base/lib_slkatrof.c +++ b/ncurses/base/lib_slkatrof.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2005,2009 Free Software Foundation, Inc. * + * 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 * @@ -38,7 +39,7 @@ */ #include <curses.priv.h> -MODULE_ID("$Id: lib_slkatrof.c,v 1.11 2009/10/24 22:12:21 tom Exp $") +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) diff --git a/ncurses/base/lib_slkatron.c b/ncurses/base/lib_slkatron.c index bc2fb33..accc2f2 100644 --- a/ncurses/base/lib_slkatron.c +++ b/ncurses/base/lib_slkatron.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -38,7 +39,7 @@ */ #include <curses.priv.h> -MODULE_ID("$Id: lib_slkatron.c,v 1.12 2010/03/31 23:38:02 tom Exp $") +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) diff --git a/ncurses/base/lib_slkatrset.c b/ncurses/base/lib_slkatrset.c index 544b8d0..11fa7e6 100644 --- a/ncurses/base/lib_slkatrset.c +++ b/ncurses/base/lib_slkatrset.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2005,2009 Free Software Foundation, Inc. * + * 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 * @@ -38,7 +39,7 @@ */ #include <curses.priv.h> -MODULE_ID("$Id: lib_slkatrset.c,v 1.10 2009/10/24 22:12:21 tom Exp $") +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) diff --git a/ncurses/base/lib_slkattr.c b/ncurses/base/lib_slkattr.c index bec11e8..af49f3b 100644 --- a/ncurses/base/lib_slkattr.c +++ b/ncurses/base/lib_slkattr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -38,7 +39,7 @@ */ #include <curses.priv.h> -MODULE_ID("$Id: lib_slkattr.c,v 1.11 2010/12/20 01:41:25 tom Exp $") +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) diff --git a/ncurses/base/lib_slkclear.c b/ncurses/base/lib_slkclear.c index 264c8c4..10531e4 100644 --- a/ncurses/base/lib_slkclear.c +++ b/ncurses/base/lib_slkclear.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2007,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ */ #include <curses.priv.h> -MODULE_ID("$Id: lib_slkclear.c,v 1.14 2009/11/07 16:27:05 tom Exp $") +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) diff --git a/ncurses/base/lib_slkcolor.c b/ncurses/base/lib_slkcolor.c index 2cf9e5d..00d1eaa 100644 --- a/ncurses/base/lib_slkcolor.c +++ b/ncurses/base/lib_slkcolor.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2014 Free Software Foundation, Inc. * + * 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 * @@ -38,31 +39,53 @@ */ #include <curses.priv.h> -MODULE_ID("$Id: lib_slkcolor.c,v 1.17 2014/02/01 22:10:42 tom Exp $") +MODULE_ID("$Id: lib_slkcolor.c,v 1.20 2020/02/02 23:34:34 tom Exp $") -NCURSES_EXPORT(int) -NCURSES_SP_NAME(slk_color) (NCURSES_SP_DCLx NCURSES_PAIRS_T color_pair_number) +static int +_nc_slk_color(SCREEN *sp, int pair_arg) { int code = ERR; - T((T_CALLED("slk_color(%p,%d)"), (void *) SP_PARM, (int) color_pair_number)); + T((T_CALLED("slk_color(%p,%d)"), (void *) sp, pair_arg)); - if (SP_PARM != 0 - && SP_PARM->_slk != 0 - && color_pair_number >= 0 - && color_pair_number < SP_PARM->_pair_limit) { - TR(TRACE_ATTRS, ("... current is %s", _tracech_t(CHREF(SP_PARM->_slk->attr)))); - SetPair(SP_PARM->_slk->attr, color_pair_number); - TR(TRACE_ATTRS, ("new attribute is %s", _tracech_t(CHREF(SP_PARM->_slk->attr)))); + 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) -slk_color(NCURSES_PAIRS_T color_pair_number) +extended_slk_color(int pair_arg) { - return NCURSES_SP_NAME(slk_color) (CURRENT_SCREEN, color_pair_number); + return NCURSES_SP_NAME(extended_slk_color) (CURRENT_SCREEN, pair_arg); } #endif +#endif diff --git a/ncurses/base/lib_slkinit.c b/ncurses/base/lib_slkinit.c index 9cbdfea..e1602ab 100644 --- a/ncurses/base/lib_slkinit.c +++ b/ncurses/base/lib_slkinit.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ */ #include <curses.priv.h> -MODULE_ID("$Id: lib_slkinit.c,v 1.13 2009/10/31 00:10:46 tom Exp $") +MODULE_ID("$Id: lib_slkinit.c,v 1.15 2020/02/02 23:34:34 tom Exp $") #ifdef USE_SP_RIPOFF #define SoftkeyFormat SP_PARM->slk_format @@ -75,6 +76,11 @@ NCURSES_SP_NAME(slk_init) (NCURSES_SP_DCLx int format) NCURSES_EXPORT(int) slk_init(int format) { - return NCURSES_SP_NAME(slk_init) (CURRENT_SCREEN_PRE, format); + int rc; + _nc_lock_global(prescreen); + START_TRACE(); + rc = NCURSES_SP_NAME(slk_init) (CURRENT_SCREEN_PRE, format); + _nc_unlock_global(prescreen); + return rc; } #endif diff --git a/ncurses/base/lib_slklab.c b/ncurses/base/lib_slklab.c index d0b2a23..894ff26 100644 --- a/ncurses/base/lib_slklab.c +++ b/ncurses/base/lib_slklab.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2003,2009 Free Software Foundation, Inc. * + * 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 * @@ -40,7 +41,7 @@ */ #include <curses.priv.h> -MODULE_ID("$Id: lib_slklab.c,v 1.10 2009/10/24 22:12:21 tom Exp $") +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) diff --git a/ncurses/base/lib_slkrefr.c b/ncurses/base/lib_slkrefr.c index 382f9c4..c6bf9d2 100644 --- a/ncurses/base/lib_slkrefr.c +++ b/ncurses/base/lib_slkrefr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -43,7 +44,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_slkrefr.c,v 1.30 2014/03/08 20:32:59 tom Exp $") +MODULE_ID("$Id: lib_slkrefr.c,v 1.31 2020/02/02 23:34:34 tom Exp $") #ifdef USE_TERM_DRIVER #define NumLabels InfoOf(SP_PARM).numlabels diff --git a/ncurses/base/lib_slkset.c b/ncurses/base/lib_slkset.c index 9091e00..3e777f1 100644 --- a/ncurses/base/lib_slkset.c +++ b/ncurses/base/lib_slkset.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * 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 * @@ -44,7 +45,7 @@ #endif #endif -MODULE_ID("$Id: lib_slkset.c,v 1.24 2012/12/08 23:09:25 tom Exp $") +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) @@ -89,9 +90,9 @@ NCURSES_SP_NAME(slk_set) (NCURSES_SP_DCLx int i, const char *astr, int format) mbrtowc(&wc, p, need, &state); if (!iswprint((wint_t) wc)) break; - if (wcwidth(wc) + numcols > limit) + if (_nc_wacs_width(wc) + numcols > limit) break; - numcols += wcwidth(wc); + numcols += _nc_wacs_width(wc); p += need; } numchrs = (int) (p - str); diff --git a/ncurses/base/lib_slktouch.c b/ncurses/base/lib_slktouch.c index ba77fd2..6696a25 100644 --- a/ncurses/base/lib_slktouch.c +++ b/ncurses/base/lib_slktouch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2000,2009 Free Software Foundation, Inc. * + * 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 * @@ -38,7 +39,7 @@ */ #include <curses.priv.h> -MODULE_ID("$Id: lib_slktouch.c,v 1.8 2009/10/24 22:12:21 tom Exp $") +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) diff --git a/ncurses/base/lib_touch.c b/ncurses/base/lib_touch.c index 20ac945..d8d59e1 100644 --- a/ncurses/base/lib_touch.c +++ b/ncurses/base/lib_touch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2012 Free Software Foundation, Inc. * + * 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 * @@ -43,16 +44,19 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_touch.c,v 1.12 2012/06/09 20:29:33 tom Exp $") +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 */ - if (!win || (line > win->_maxy) || (line < 0)) - returnCode((bool) ERR); + /* 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); } @@ -60,14 +64,15 @@ is_linetouched(WINDOW *win, int line) NCURSES_EXPORT(bool) is_wintouched(WINDOW *win) { - int i; - T((T_CALLED("is_wintouched(%p)"), (void *) win)); - if (win) + if (win) { + int i; + for (i = 0; i <= win->_maxy; i++) if (win->_line[i].firstchar != _NOCHANGE) returnCode(TRUE); + } returnCode(FALSE); } diff --git a/ncurses/base/lib_ungetch.c b/ncurses/base/lib_ungetch.c index 4ee9119..fcbe6f4 100644 --- a/ncurses/base/lib_ungetch.c +++ b/ncurses/base/lib_ungetch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_ungetch.c,v 1.16 2012/08/04 17:38:53 tom Exp $") +MODULE_ID("$Id: lib_ungetch.c,v 1.17 2020/02/02 23:34:34 tom Exp $") #include <fifo_defs.h> diff --git a/ncurses/base/lib_vline.c b/ncurses/base/lib_vline.c index 2f3148e..ae4af62 100644 --- a/ncurses/base/lib_vline.c +++ b/ncurses/base/lib_vline.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -29,6 +30,8 @@ /**************************************************************************** * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * * and: Eric S. Raymond <esr@snark.thyrsus.com> * + * and: Thomas E. Dickey 1996-on * + * and: Sven Verdoolaege 2001 * ****************************************************************************/ /* @@ -40,22 +43,21 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_vline.c,v 1.12 2010/12/19 01:22:58 tom Exp $") +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; - int row, col; - int end; T((T_CALLED("wvline(%p,%s,%d)"), (void *) win, _tracechtype(ch), n)); if (win) { NCURSES_CH_T wch; - row = win->_cury; - col = win->_curx; - end = row + n - 1; + int row = win->_cury; + int col = win->_curx; + int end = row + n - 1; + if (end > win->_maxy) end = win->_maxy; @@ -67,6 +69,14 @@ wvline(WINDOW *win, chtype ch, int n) 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--; diff --git a/ncurses/base/lib_wattroff.c b/ncurses/base/lib_wattroff.c index fff0b39..eac07f0 100644 --- a/ncurses/base/lib_wattroff.c +++ b/ncurses/base/lib_wattroff.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2006,2009 Free Software Foundation, Inc. * + * 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> #include <ctype.h> -MODULE_ID("$Id: lib_wattroff.c,v 1.10 2009/10/24 22:36:08 tom Exp $") +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) diff --git a/ncurses/base/lib_wattron.c b/ncurses/base/lib_wattron.c index 3806285..c589f10 100644 --- a/ncurses/base/lib_wattron.c +++ b/ncurses/base/lib_wattron.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> #include <ctype.h> -MODULE_ID("$Id: lib_wattron.c,v 1.11 2010/03/31 23:38:02 tom Exp $") +MODULE_ID("$Id: lib_wattron.c,v 1.12 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) wattr_on(WINDOW *win, attr_t at, void *opts GCC_UNUSED) diff --git a/ncurses/base/lib_winch.c b/ncurses/base/lib_winch.c index 7e75f85..91253d1 100644 --- a/ncurses/base/lib_winch.c +++ b/ncurses/base/lib_winch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_winch.c,v 1.8 2010/12/19 01:22:58 tom Exp $") +MODULE_ID("$Id: lib_winch.c,v 1.9 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(chtype) winch(WINDOW *win) diff --git a/ncurses/base/lib_window.c b/ncurses/base/lib_window.c index 4baa369..7222bfe 100644 --- a/ncurses/base/lib_window.c +++ b/ncurses/base/lib_window.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_window.c,v 1.29 2010/12/19 01:47:22 tom Exp $") +MODULE_ID("$Id: lib_window.c,v 1.31 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(void) _nc_synchook(WINDOW *win) @@ -56,7 +57,6 @@ mvderwin(WINDOW *win, int y, int x) /* move a derived window */ { WINDOW *orig; - int i; int rc = ERR; T((T_CALLED("mvderwin(%p,%d,%d)"), (void *) win, y, x)); @@ -66,6 +66,8 @@ mvderwin(WINDOW *win, int y, int x) && (x >= 0 && y >= 0) && (x + getmaxx(win) <= getmaxx(orig)) && (y + getmaxy(win) <= getmaxy(orig))) { + int i; + wsyncup(win); win->_parx = x; win->_pary = y; @@ -177,8 +179,6 @@ dupwin(WINDOW *win) /* make an exact duplicate of the given window */ { WINDOW *nwin = 0; - size_t linesize; - int i; T((T_CALLED("dupwin(%p)"), (void *) win)); @@ -200,6 +200,8 @@ dupwin(WINDOW *win) } if (nwin != 0) { + int i; + size_t linesize; nwin->_curx = win->_curx; nwin->_cury = win->_cury; diff --git a/ncurses/base/nc_panel.c b/ncurses/base/nc_panel.c index 69b10bc..002f118 100644 --- a/ncurses/base/nc_panel.c +++ b/ncurses/base/nc_panel.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2000,2009 Free Software Foundation, Inc. * + * 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 * @@ -32,7 +33,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: nc_panel.c,v 1.5 2009/04/11 21:05:10 tom Exp $") +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) diff --git a/ncurses/base/new_pair.c b/ncurses/base/new_pair.c new file mode 100644 index 0000000..547ab28 --- /dev/null +++ b/ncurses/base/new_pair.c @@ -0,0 +1,386 @@ +/**************************************************************************** + * Copyright 2018-2019,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. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* new_pair.c + * + * New color-pair functions, alloc_pair and free_pair + */ + +#define NEW_PAIR_INTERNAL 1 +#include <curses.priv.h> + +#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 <search.h> + +#endif + +MODULE_ID("$Id: new_pair.c,v 1.19 2020/02/02 23:34:34 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_limit; ++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; + void *pp; + + find.fg = fg; + find.bg = bg; + if (sp != 0 && + (pp = tfind(&find, &sp->_ordered_pairs, compare_data)) != 0) { + colorpair_t *temp = *(colorpair_t **) pp; + result = (int) (temp - sp->_color_pairs); + } else { + result = -1; + } + 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)) { + 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); + /* 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) { + for (pair = 1; pair <= hint; pair++) { + if (SP_PARM->_color_pairs[pair].mode == cpFREE) { + T(("found gap %d", pair)); + found = TRUE; + break; + } + } + } + if (found) { + SP_PARM->_recent_pair = pair; + } else { + pair = ERR; + } + } else { + /* reuse the oldest one */ + pair = SP_PARM->_color_pairs[0].prev; + T(("reusing %d", pair)); + } + + if (_nc_init_pair(SP_PARM, pair, fg, bg) == ERR) + pair = ERR; + } + returnCode(pair); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(find_pair) (NCURSES_SP_DCLx int fg, int bg) +{ + int pair; + + T((T_CALLED("find_pair(%d,%d)"), fg, bg)); + pair = _nc_find_color_pair(SP_PARM, fg, bg); + returnCode(pair); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(free_pair) (NCURSES_SP_DCLx int pair) +{ + int result = ERR; + T((T_CALLED("free_pair(%d)"), pair)); + if (ValidPair(SP_PARM, pair) && pair < SP_PARM->_pair_alloc) { + colorpair_t *cp = &(SP_PARM->_color_pairs[pair]); + if (pair != 0) { + _nc_change_pair(SP_PARM, pair); + delink_color_pair(SP_PARM, pair); + tdelete(cp, &SP_PARM->_ordered_pairs, compare_data); + cp->mode = cpFREE; + result = OK; + SP_PARM->_pairs_used--; + } + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +alloc_pair(int f, int b) +{ + return NCURSES_SP_NAME(alloc_pair) (CURRENT_SCREEN, f, b); +} + +NCURSES_EXPORT(int) +find_pair(int f, int b) +{ + return NCURSES_SP_NAME(find_pair) (CURRENT_SCREEN, f, b); +} + +NCURSES_EXPORT(int) +free_pair(int pair) +{ + return NCURSES_SP_NAME(free_pair) (CURRENT_SCREEN, pair); +} +#endif + +#if NO_LEAKS +NCURSES_EXPORT(void) +_nc_new_pair_leaks(SCREEN *sp) +{ + if (sp->_color_pairs) { + while (sp->_color_pairs[0].next) { + free_pair(sp->_color_pairs[0].next); + } + } +} +#endif + +#else +void _nc_new_pair(void); +void +_nc_new_pair(void) +{ +} +#endif /* NCURSES_EXT_COLORS */ diff --git a/ncurses/base/resizeterm.c b/ncurses/base/resizeterm.c index 1eca279..9b04287 100644 --- a/ncurses/base/resizeterm.c +++ b/ncurses/base/resizeterm.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2014 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -45,7 +46,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: resizeterm.c,v 1.47 2014/10/13 08:56:49 tom Exp $") +MODULE_ID("$Id: resizeterm.c,v 1.50 2020/02/02 23:34:34 tom Exp $") /* * If we're trying to be reentrant, do not want any local statics. @@ -62,6 +63,12 @@ static int current_cols; #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) @@ -140,9 +147,10 @@ static int ripped_bottom(WINDOW *win) { int result = 0; - ripoff_t *rop; if (win != 0) { + ripoff_t *rop; + #ifdef USE_SP_RIPOFF SCREEN *sp = _nc_screen_of(win); #endif @@ -276,6 +284,7 @@ decrease_size(NCURSES_SP_DCLx int ToLines, int ToCols, int stolen EXTRA_DCLS) WINDOWLIST *wp; T((T_CALLED("decrease_size(%p, %d, %d)"), (void *) SP_PARM, ToLines, ToCols)); + UNUSED_SP; do { found = FALSE; @@ -310,6 +319,7 @@ increase_size(NCURSES_SP_DCLx int ToLines, int ToCols, int stolen EXTRA_DCLS) WINDOWLIST *wp; T((T_CALLED("increase_size(%p, %d, %d)"), (void *) SP_PARM, ToLines, ToCols)); + UNUSED_SP; do { found = FALSE; @@ -440,7 +450,7 @@ NCURSES_SP_NAME(resize_term) (NCURSES_SP_DCLx int ToLines, int ToCols) NCURSES_EXPORT(int) resize_term(int ToLines, int ToCols) { - int res = ERR; + int res; _nc_sp_lock_global(curses); res = NCURSES_SP_NAME(resize_term) (CURRENT_SCREEN, ToLines, ToCols); _nc_sp_unlock_global(curses); diff --git a/ncurses/base/safe_sprintf.c b/ncurses/base/safe_sprintf.c index 34abd2f..1868c00 100644 --- a/ncurses/base/safe_sprintf.c +++ b/ncurses/base/safe_sprintf.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * + * 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 * @@ -33,7 +34,7 @@ #include <curses.priv.h> #include <ctype.h> -MODULE_ID("$Id: safe_sprintf.c,v 1.27 2013/01/20 01:04:32 tom Exp $") +MODULE_ID("$Id: safe_sprintf.c,v 1.33 2020/02/02 23:34:34 tom Exp $") #if USE_SAFE_SPRINTF @@ -41,7 +42,7 @@ typedef enum { Flags, Width, Prec, Type, Format } PRINTF; -#define VA_INTGR(type) ival = va_arg(ap, type) +#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) @@ -157,9 +158,9 @@ _nc_printf_length(const char *fmt, va_list ap) case 's': VA_POINT(char *); if (prec < 0) - prec = strlen(pval); + prec = (int) strlen(pval); if (prec > (int) length) { - length = length + prec; + length = length + (size_t) prec; buffer = typeRealloc(char, length, buffer); if (buffer == 0) { free(format); @@ -224,7 +225,7 @@ NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_DCLx { char *result = 0; - if (fmt != 0) { + if (SP_PARM != 0 && fmt != 0) { #if USE_SAFE_SPRINTF va_list ap2; int len; @@ -234,7 +235,7 @@ NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_DCLx end_va_copy(ap2); if ((int) my_length < len + 1) { - my_length = 2 * (len + 1); + my_length = (size_t) (2 * (len + 1)); my_buffer = typeRealloc(char, my_length, my_buffer); } if (my_buffer != 0) { @@ -259,9 +260,9 @@ NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_DCLx if (my_buffer != 0) { # if HAVE_VSNPRINTF - vsnprintf(my_buffer, my_length, fmt, ap); /* GNU extension */ + vsnprintf(my_buffer, my_length, fmt, ap); /* SUSv2, 1997 */ # else - vsprintf(my_buffer, fmt, ap); /* ANSI */ + vsprintf(my_buffer, fmt, ap); /* ISO/ANSI C, 1989 */ # endif result = my_buffer; } diff --git a/ncurses/base/sigaction.c b/ncurses/base/sigaction.c index 36442e0..9688c69 100644 --- a/ncurses/base/sigaction.c +++ b/ncurses/base/sigaction.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2002,2003 Free Software Foundation, Inc. * + * 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 * @@ -35,7 +36,7 @@ /* This file provides sigaction() emulation using sigvec() */ /* Use only if this is non POSIX system */ -MODULE_ID("$Id: sigaction.c,v 1.14 2003/12/07 01:06:52 tom Exp $") +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) diff --git a/ncurses/base/tries.c b/ncurses/base/tries.c index ad85d22..0f309c2 100644 --- a/ncurses/base/tries.c +++ b/ncurses/base/tries.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: tries.c,v 1.30 2010/08/28 21:08:23 tom Exp $") +MODULE_ID("$Id: tries.c,v 1.31 2020/02/02 23:34:34 tom Exp $") /* * Expand a keycode into the string that it corresponds to, returning null if diff --git a/ncurses/base/use_window.c b/ncurses/base/use_window.c index 8eb7339..4893053 100644 --- a/ncurses/base/use_window.c +++ b/ncurses/base/use_window.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2007-2008,2009 Free Software Foundation, Inc. * + * 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 * @@ -32,14 +33,19 @@ #include <curses.priv.h> -MODULE_ID("$Id: use_window.c,v 1.9 2009/10/24 22:40:24 tom Exp $") +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)); - T((T_CALLED("use_window(%p,%p,%p)"), (void *) win, func, data)); _nc_lock_global(curses); code = func(win, data); _nc_unlock_global(curses); diff --git a/ncurses/base/version.c b/ncurses/base/version.c index ef83967..4d8ee81 100644 --- a/ncurses/base/version.c +++ b/ncurses/base/version.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1999-2004,2005 Free Software Foundation, Inc. * + * 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 * @@ -32,7 +33,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: version.c,v 1.6 2005/01/02 01:23:54 tom Exp $") +MODULE_ID("$Id: version.c,v 1.7 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(const char *) curses_version(void) diff --git a/ncurses/base/vsscanf.c b/ncurses/base/vsscanf.c index 38c7926..ef52425 100644 --- a/ncurses/base/vsscanf.c +++ b/ncurses/base/vsscanf.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2004,2012 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -38,7 +39,7 @@ #if !HAVE_VSSCANF -MODULE_ID("$Id: vsscanf.c,v 1.20 2012/02/22 22:26:58 tom Exp $") +MODULE_ID("$Id: vsscanf.c,v 1.21 2020/02/02 23:34:34 tom Exp $") #if !(HAVE_VFSCANF || HAVE__DOSCAN) diff --git a/ncurses/base/wresize.c b/ncurses/base/wresize.c index bc6b573..93276ef 100644 --- a/ncurses/base/wresize.c +++ b/ncurses/base/wresize.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * 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 * @@ -33,13 +34,13 @@ #include <curses.priv.h> -MODULE_ID("$Id: wresize.c,v 1.35 2011/05/21 18:55:07 tom Exp $") +MODULE_ID("$Id: wresize.c,v 1.39 2020/02/02 23:34:34 tom Exp $") static int cleanup_lines(struct ldat *data, int length) { while (--length >= 0) - free(data[length].text); + FreeAndNull(data[length].text); free(data); return ERR; } @@ -65,15 +66,29 @@ repair_subwindows(WINDOW *cmp) if (tst->_parent == cmp) { - if (tst->_pary > cmp->_maxy) - tst->_pary = cmp->_maxy; - if (tst->_parx > cmp->_maxx) - tst->_parx = cmp->_maxx; +#define REPAIR1(field, limit) \ + if (tst->field > cmp->limit) \ + tst->field = cmp->limit - if (tst->_maxy + tst->_pary > cmp->_maxy) - tst->_maxy = (NCURSES_SIZE_T) (cmp->_maxy - tst->_pary); - if (tst->_maxx + tst->_parx > cmp->_maxx) - tst->_maxx = (NCURSES_SIZE_T) (cmp->_maxx - tst->_parx); + 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]; @@ -204,16 +219,16 @@ wresize(WINDOW *win, int ToLines, int ToCols) if (!(win->_flags & _SUBWIN)) { if (ToCols == size_x) { for (row = ToLines + 1; row <= size_y; row++) { - free(win->_line[row].text); + FreeAndNull(win->_line[row].text); } } else { for (row = 0; row <= size_y; row++) { - free(win->_line[row].text); + FreeAndNull(win->_line[row].text); } } } - free(win->_line); + FreeAndNull(win->_line); win->_line = new_lines; /* diff --git a/ncurses/build.priv.h b/ncurses/build.priv.h index 096a443..9014e74 100644 --- a/ncurses/build.priv.h +++ b/ncurses/build.priv.h @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2010,2012 Free Software Foundation, Inc. * + * 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 * @@ -31,11 +32,11 @@ ****************************************************************************/ /* - * $Id: build.priv.h,v 1.9 2012/02/22 22:17:02 tom Exp $ + * $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 utilties. + * This is a reduced version of curses.priv.h, for build-time utilities. * Because it has fewer dependencies, this simplifies cross-compiling. * */ @@ -54,7 +55,7 @@ extern "C" { #if USE_RCS_IDS #define MODULE_ID(id) static const char Ident[] = id; #else -#define MODULE_ID(id) /*nothing*/ +#define MODULE_ID(id) /*nothing */ #endif #include <stdlib.h> @@ -66,7 +67,7 @@ extern "C" { #include <errno.h> -#include <curses.h> /* we'll use -Ipath directive to get the right one! */ +#include <curses.h> /* we'll use -Ipath directive to get the right one! */ /* usually in <unistd.h> */ #ifndef EXIT_SUCCESS @@ -77,7 +78,7 @@ extern "C" { #define EXIT_FAILURE 1 #endif -#define FreeAndNull(p) free(p); p = 0 +#define FreeAndNull(p) do { free(p); p = 0; } while (0) #define UChar(c) ((unsigned char)(c)) #define SIZEOF(v) (sizeof(v) / sizeof(v[0])) @@ -89,20 +90,19 @@ extern "C" { #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); + 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); + NCURSES_EXPORT(void) _nc_names_leaks(void); #endif #ifdef __cplusplus } #endif - -#endif /* CURSES_PRIV_H */ +#endif /* CURSES_PRIV_H */ diff --git a/ncurses/curses.priv.h b/ncurses/curses.priv.h index 66d1594..9ca0263 100644 --- a/ncurses/curses.priv.h +++ b/ncurses/curses.priv.h @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -34,7 +35,7 @@ ****************************************************************************/ /* - * $Id: curses.priv.h,v 1.546 2014/11/01 13:52:34 tom Exp $ + * $Id: curses.priv.h,v 1.628 2020/02/02 23:34:34 tom Exp $ * * curses.priv.h * @@ -71,7 +72,7 @@ extern "C" { #include <unistd.h> #endif -#if HAVE_SYS_BSDTYPES_H +#if HAVE_SYS_BSDTYPES_H && !(defined(_WIN32) || defined(_WIN64)) #include <sys/bsdtypes.h> /* needed for ISC */ #endif @@ -184,7 +185,7 @@ extern int errno; * the path separator in configure doesn't work properly. So, if building * for MinGW, we enforce the correct Windows PATH separator */ -#ifdef __MINGW32__ +#ifdef _WIN32 # ifdef NCURSES_PATHSEP # undef NCURSES_PATHSEP # endif @@ -240,6 +241,18 @@ extern NCURSES_EXPORT(void *) _nc_memmove (void *, const void *, size_t); #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 @@ -326,12 +339,21 @@ typedef TRIES { typedef struct { - NCURSES_COLOR_T red, green, blue; /* what color_content() returns */ - NCURSES_COLOR_T r, g, b; /* params to init_color() */ + 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. @@ -358,6 +380,9 @@ color_t; #include <nc_panel.h> +#include <term.h> +#include <nc_termios.h> + #define IsPreScreen(sp) (((sp) != 0) && sp->_prescreen) #define HasTerminal(sp) (((sp) != 0) && (0 != ((sp)->_term))) #define IsValidScreen(sp) (HasTerminal(sp) && !IsPreScreen(sp)) @@ -374,8 +399,31 @@ color_t; #define TerminalOf(sp) CurTerm #endif -#include <term.h> -#include <nc_termios.h> +/* + * 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 @@ -385,7 +433,7 @@ color_t; #undef CUR #endif -#define SP_TERMTYPE TerminalOf(sp)->type. +#define SP_TERMTYPE TerminalType(TerminalOf(sp)). #include <term_entry.h> @@ -394,10 +442,11 @@ color_t; /* * Simplify ifdef's for the "*_ATTR" macros in case italics are not configured. */ -#ifdef A_ITALIC +#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 @@ -406,7 +455,7 @@ color_t; * option for compiling the tracing into the library. */ #if 1 -#define ColorPair(n) NCURSES_BITS(n, 0) +#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) @@ -426,7 +475,7 @@ color_t; #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) | (A_COLOR & (unsigned) ColorPair(oldColor(c)))) + 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)) @@ -434,20 +483,27 @@ color_t; #define SET_WINDOW_PAIR(w,p) (w)->_color = (p) #define SameAttrOf(a,b) (AttrOf(a) == AttrOf(b) && GetPair(a) == GetPair(b)) -#define VIDATTR(sp,attr,pair) NCURSES_SP_NAME(vid_puts)(NCURSES_SP_ARGx attr, (short) pair, 0, NCURSES_OUTC_FUNC) +#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) | (A_COLOR & (attr_t) ColorPair(p))) + 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) |= (A_COLOR & (attr_t) ColorPair(p)) + WINDOW_ATTRS(w) |= ColorPair(p) #define SameAttrOf(a,b) (AttrOf(a) == AttrOf(b)) -#define VIDATTR(sp,attr,pair) NCURSES_SP_NAME(vidputs)(NCURSES_SP_ARGx attr, NCURSES_OUTC_FUNC) +#define VIDPUTS(sp,attr,pair) NCURSES_SP_NAME(vidputs)(NCURSES_SP_ARGx attr, NCURSES_OUTC_FUNC) #endif /* NCURSES_EXT_COLORS */ @@ -503,6 +559,8 @@ NCURSES_EXPORT(int *) _nc_ptr_Escdelay (SCREEN *); #endif +#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()), \ @@ -561,7 +619,10 @@ 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 _nc_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 @@ -581,7 +642,7 @@ weak_symbol(pthread_self); weak_symbol(pthread_equal); extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *); # undef sigprocmask -# define sigprocmask _nc_sigprocmask +# define sigprocmask(a, b, c) _nc_sigprocmask(a, b, c) # endif #endif /* USE_PTHREADS_EINTR */ @@ -635,15 +696,13 @@ extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *); /* * Definitions for color pairs */ -typedef unsigned colorpair_t; /* type big enough to store PAIR_OF() */ -#define C_SHIFT 9 /* we need more bits than there are colors */ -#define C_MASK ((1 << C_SHIFT) - 1) -#define PAIR_OF(fg, bg) (colorpair_t) ((((fg) & C_MASK) << C_SHIFT) | ((bg) & C_MASK)) -#define FORE_OF(c) (((c) >> C_SHIFT) & C_MASK) -#define BACK_OF(c) ((c) & C_MASK) -#define isDefaultColor(c) ((c) >= COLOR_DEFAULT || (c) < 0) -#define COLOR_DEFAULT C_MASK +#define MAX_OF_TYPE(t) (int)(((unsigned t)(~0))>>1) + +#include <new_pair.h> + +#define isDefaultColor(c) ((c) < 0) +#define COLOR_DEFAULT -1 #if defined(USE_BUILD_CC) || (defined(USE_TERMLIB) && !defined(NEED_NCURSES_CH_T)) @@ -768,6 +827,16 @@ typedef struct { #define TGETENT_MAX 4 /* + * 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') + +/* * State of tparm(). */ #define STACKSIZE 20 @@ -783,9 +852,6 @@ typedef struct { #define NUM_VARS 26 typedef struct { -#ifdef TRACE - const char *tname; -#endif const char *tparam_base; STACK_FRAME stack[STACKSIZE]; @@ -800,6 +866,9 @@ typedef struct { int dynamic_var[NUM_VARS]; int static_vars[NUM_VARS]; +#ifdef TRACE + const char *tname; +#endif } TPARM_STATE; typedef struct { @@ -869,6 +938,8 @@ typedef struct { int slk_format; + int getstr_limit; /* getstr_limit based on POSIX LINE_MAX */ + char *safeprint_buf; size_t safeprint_used; @@ -882,6 +953,10 @@ typedef struct { time_t dbd_time; /* cache last updated */ ITERATOR_VARS dbd_vars[dbdLAST]; +#ifdef USE_TERM_DRIVER + int (*term_driver)(struct DriverTCB*, const char*, int*); +#endif + #ifndef USE_SP_WINDOWLIST WINDOWLIST *_nc_windowlist; #define WindowList(sp) _nc_globals._nc_windowlist @@ -896,15 +971,30 @@ typedef struct { int safeprint_rows; #endif -#ifdef USE_TERM_DRIVER - int (*term_driver)(struct DriverTCB*, const char*, int*); +#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 init_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; @@ -928,16 +1018,8 @@ typedef struct { #endif #endif /* TRACE */ -#ifdef USE_PTHREADS - pthread_mutex_t mutex_curses; - 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 -#endif -#if USE_PTHREADS_EINTR - pthread_t read_thread; /* The reading thread */ +#if NO_LEAKS + bool leak_checking; #endif } NCURSES_GLOBALS; @@ -945,24 +1027,47 @@ extern NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals; #define N_RIPS 5 +/* 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))) + +#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 - TPARM_STATE tparm_state; - TTY *saved_tty; /* savetty/resetty information */ #if NCURSES_NO_PADDING bool _no_padding; /* flag to set if padding disabled */ #endif - NCURSES_SP_OUTC _outch; /* output handler if not putc */ #if BROKEN_LINKER || USE_REENTRANT chtype *real_acs_map; int _LINES; @@ -970,12 +1075,13 @@ typedef struct { int _TABSIZE; int _ESCDELAY; TERMINAL *_cur_term; +#endif #ifdef TRACE +#if BROKEN_LINKER || USE_REENTRANT long _outchars; const char *_tputs_trace; #endif #endif - bool use_tioctl; } NCURSES_PRESCREEN; /* @@ -991,6 +1097,12 @@ typedef struct { extern NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen; +typedef enum { + ewInitial = 0, + ewRunning, + ewSuspend +} ENDWIN; + /* * The SCREEN structure. */ @@ -1051,18 +1163,11 @@ struct screen { 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 */ -#if NCURSES_NO_PADDING - bool _no_padding; /* flag to set if padding disabled */ -#endif int _char_padding; /* cost of character put */ int _cr_cost; /* cost of (carriage_return) */ int _cup_cost; /* cost of (cursor_address) */ int _home_cost; /* cost of (cursor_home) */ int _ll_cost; /* cost of (cursor_to_ll) */ -#if USE_HARD_TABS - int _ht_cost; /* cost of (tab) */ - int _cbt_cost; /* cost of (backtab) */ -#endif /* USE_HARD_TABS */ int _cub1_cost; /* cost of (cursor_left) */ int _cuf1_cost; /* cost of (cursor_right) */ int _cud1_cost; /* cost of (cursor_down) */ @@ -1096,19 +1201,13 @@ struct screen { 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; /* count of color pairs */ + int _pair_count; /* same as COLOR_PAIRS */ int _pair_limit; /* actual limit of color-pairs */ -#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 + 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 */ @@ -1119,13 +1218,6 @@ struct screen { /* used in lib_vidattr.c */ bool _use_rmso; /* true if we may use 'rmso' */ bool _use_rmul; /* true if we may use 'rmul' */ -#if USE_ITALIC - bool _use_ritm; /* true if we may use 'ritm' */ -#endif - -#if USE_KLIBC_KBD - bool _extended_key; /* true if an extended key */ -#endif /* * These data correspond to the state of the idcok() and idlok() @@ -1158,6 +1250,60 @@ struct screen { 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; @@ -1203,25 +1349,10 @@ struct screen { int (*_ungetch)(SCREEN *, int); #endif - /* - * 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 */ - - int _legacy_coding; /* see use_legacy_coding() */ +#ifdef USE_SP_WINDOWLIST + WINDOWLIST* _windowlist; +#define WindowList(sp) (sp)->_windowlist +#endif #if USE_REENTRANT char _ttytype[NAMESIZE]; @@ -1229,24 +1360,11 @@ struct screen { int _TABSIZE; int _LINES; int _COLS; -#ifdef TRACE - long _outchars; - const char *_tputs_trace; -#endif #endif -#ifdef TRACE - char tracechr_buf[40]; - char tracemse_buf[TRACEMSE_MAX]; -#endif -#ifdef USE_SP_WINDOWLIST - WINDOWLIST* _windowlist; -#define WindowList(sp) (sp)->_windowlist +#if NCURSES_SP_FUNCS + bool use_tioctl; #endif - NCURSES_OUTC jump; - - ripoff_t rippedoff[N_RIPS]; - ripoff_t *rsp; /* * ncurses/ncursesw are the same up to this point. @@ -1259,7 +1377,20 @@ struct screen { bool _screen_unicode; #endif - bool _use_tioctl; +#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 }; extern NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain; @@ -1279,6 +1410,12 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #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; \ @@ -1287,9 +1424,9 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; sp->_cbreak = 0; \ sp->_echo = TRUE; \ sp->_fifohead = -1; \ - sp->_endwin = TRUE; \ + sp->_endwin = ewSuspend; \ sp->_cursor = -1; \ - WindowList(sp) = 0; \ + SP_INIT_WINDOWLIST(sp); \ sp->_outch = NCURSES_OUTC_FUNC; \ sp->jump = 0 \ @@ -1371,6 +1508,8 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #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 8 /* should be >= MB_CUR_MAX, but that may be a function */ #endif @@ -1405,6 +1544,8 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; && (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 @@ -1425,23 +1566,27 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #define PUTC_INIT init_mb (PUT_st) #define PUTC(ch) do { if(!isWidecExt(ch)) { \ if (Charable(ch)) { \ - NCURSES_OUTC_FUNC (NCURSES_SP_ARGx CharOf(ch)); \ + TR_PUTC(CharOf(ch)); \ + NCURSES_OUTC_FUNC (NCURSES_SP_ARGx CharOf(ch)); \ COUNT_OUTCHARS(1); \ } else { \ - PUTC_INIT; \ 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) \ + 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]); \ } \ } \ @@ -1489,7 +1634,10 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #define ARG_CH_T NCURSES_CH_T #define CARG_CH_T NCURSES_CH_T #define PUTC_DATA /* nothing */ -#define PUTC(ch) NCURSES_OUTC_FUNC (NCURSES_SP_ARGx (int) ch) +#define PUTC(ch) { \ + TR_PUTC(ch); \ + NCURSES_OUTC_FUNC (NCURSES_SP_ARGx (int) ch); \ + } #define BLANK (' '|A_NORMAL) #define ZEROS ('\0'|A_NORMAL) @@ -1498,6 +1646,7 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #define isWidecExt(ch) (0) #define if_WIDEC(code) /* nothing */ +#define Charable(ch) ((ch) >= ' ' && (ch) <= '~') #define L(ch) ch #endif /* } */ @@ -1544,7 +1693,7 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; /* FreeAndNull() is not a comma-separated expression because some compilers * do not accept a mixture of void with values. */ -#define FreeAndNull(p) free(p); p = 0 +#define FreeAndNull(p) do { free(p); p = 0; } while (0) #include <nc_alloc.h> @@ -1553,14 +1702,18 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; * tries to limp along after a failure. */ #define TYPE_MALLOC(type, size, name) \ - name = typeMalloc(type, size); \ - if (name == 0) \ - _nc_err_abort(MSG_NO_MEMORY) + do { \ + name = typeMalloc(type, size); \ + if (name == 0) \ + _nc_err_abort(MSG_NO_MEMORY); \ + } while (0) #define TYPE_REALLOC(type, size, name) \ - name = typeRealloc(type, size, name); \ - if (name == 0) \ - _nc_err_abort(MSG_NO_MEMORY) + 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. @@ -1579,6 +1732,14 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; # endif #endif +#ifdef __TANDEM +#define ROOT_UID 65535 +#endif + +#ifndef ROOT_UID +#define ROOT_UID 0 +#endif + /* * Standardize/simplify common loops */ @@ -1595,6 +1756,9 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #define T_CREATE(fmt) "create :" fmt #define T_RETURN(fmt) "return }" fmt +#define NonNull(s) ((s) != 0 ? s : "<null>") +#define NonEmpty(s) ((s) != 0 && *(s) != '\0') + #ifdef TRACE #if USE_REENTRANT @@ -1603,12 +1767,16 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #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) \ - trace((unsigned) t); \ + curses_trace((unsigned) t); \ } +#else +#define START_TRACE() /* nothing */ +#endif /* * Many of the _tracef() calls use static buffers; lock the trace state before @@ -1630,7 +1798,11 @@ extern NCURSES_EXPORT(void) _nc_locked_tracef (const char *, ...) GCC_PRINTFLIKE #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) -#define NonNull(s) ((s) != 0 ? s : "<null>") +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) @@ -1648,6 +1820,8 @@ extern NCURSES_EXPORT(void) _nc_locked_tracef (const char *, ...) GCC_PRINTFLIKE #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) + 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 *); @@ -1667,6 +1841,8 @@ 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); @@ -1681,6 +1857,10 @@ extern NCURSES_EXPORT_VAR(long) _nc_outchars; 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); @@ -1696,6 +1876,7 @@ extern NCURSES_EXPORT(const char *) _nc_viscbuf (const NCURSES_CH_T *, int); #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 @@ -1713,6 +1894,8 @@ extern NCURSES_EXPORT(const char *) _nc_viscbuf (const NCURSES_CH_T *, int); #define returnVoidPtr(code) return code #define returnWin(code) return code +#define returnDB(code) return code + #endif /* TRACE/!TRACE */ /* @@ -1780,7 +1963,7 @@ extern NCURSES_EXPORT(void) name (void); \ #if USE_XMC_SUPPORT #define UpdateAttrs(sp,c) if (!SameAttrOf(SCREEN_ATTRS(sp), c)) { \ attr_t chg = AttrOf(SCREEN_ATTRS(sp)); \ - VIDATTR(sp, AttrOf(c), GetPair(c)); \ + 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", \ @@ -1792,7 +1975,7 @@ extern NCURSES_EXPORT(void) name (void); \ } #else #define UpdateAttrs(sp,c) if (!SameAttrOf(SCREEN_ATTRS(sp), c)) { \ - VIDATTR(sp, AttrOf(c), GetPair(c)); \ + VIDPUTS(sp, AttrOf(c), GetPair(c)); \ } #endif @@ -1859,6 +2042,20 @@ extern NCURSES_EXPORT(void) _nc_expanded (void); #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); @@ -1881,6 +2078,16 @@ typedef struct 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); @@ -1906,7 +2113,16 @@ 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 *)); @@ -1940,29 +2156,43 @@ extern NCURSES_EXPORT(bool) _nc_has_mouse (SCREEN *); 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(NCURSES_CONST char *, int, int *, int); +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 ret_error(code, fmt, arg) if (errret) {\ - *errret = code;\ - returnCode(ERR);\ +#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, arg);\ - exit(EXIT_FAILURE);\ + fprintf(stderr, fmt, p);\ + q;\ + ExitTerminfo(EXIT_FAILURE);\ } -#define ret_error1(code, fmt, arg) ret_error(code, "'%s': " fmt, arg) +#define ret_error1(rc, fmt, p, q) ret_error(rc, "'%s': " fmt, p, q) -#define ret_error0(code, msg) if (errret) {\ - *errret = code;\ - returnCode(ERR);\ +#define ret_error0(rc, msg) if (errret) {\ + *errret = rc;\ + returnCode(SETUP_FAIL);\ } else {\ fprintf(stderr, msg);\ - exit(EXIT_FAILURE);\ + ExitTerminfo(EXIT_FAILURE);\ } /* lib_tstp.c */ @@ -2006,7 +2236,6 @@ extern NCURSES_EXPORT(int) _nc_remove_key (TRIES **, unsigned); extern NCURSES_EXPORT(int) _nc_remove_string (TRIES **, const char *); /* elsewhere ... */ -extern NCURSES_EXPORT(ENTRY *) _nc_delink_entry (ENTRY *, TERMTYPE *); 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); @@ -2025,14 +2254,14 @@ 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, TERMTYPE *const); -extern NCURSES_EXPORT(int) _nc_setup_tinfo(const char *, TERMTYPE *); +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(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_and_exit (int) GCC_NORETURN; -extern NCURSES_EXPORT(void) _nc_free_entry (ENTRY *, TERMTYPE *); +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 *); @@ -2046,6 +2275,23 @@ 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 + +#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); @@ -2053,9 +2299,11 @@ 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(TERMINAL *); extern NCURSES_EXPORT(void) _nc_tgetent_leaks(void); #endif @@ -2095,7 +2343,7 @@ extern NCURSES_EXPORT(int) _nc_eventlist_timeout(_nc_eventlist *); */ #if USE_WIDEC_SUPPORT -#if defined(__MINGW32__) +#if defined(_WIN32) /* * MinGW has wide-character functions, but they do not work correctly. */ @@ -2110,7 +2358,7 @@ extern int __MINGW_NOTHROW _nc_mbtowc(wchar_t *, const char *, size_t); extern int __MINGW_NOTHROW _nc_mblen(const char *, size_t); #define mblen(s,n) _nc_mblen(s, n) -#endif /* __MINGW32__ */ +#endif /* _WIN32 */ #if HAVE_MBTOWC && HAVE_MBLEN #define reset_mbytes(state) IGNORE_RC(mblen(NULL, (size_t) 0)), IGNORE_RC(mbtowc(NULL, NULL, (size_t) 0)) @@ -2141,7 +2389,7 @@ extern NCURSES_EXPORT_VAR(int *) _nc_oldnums; #define USE_SETBUF_0 0 -#define NC_OUTPUT(sp) ((sp != 0) ? sp->_ofp : stdout) +#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 @@ -2337,7 +2585,7 @@ extern NCURSES_EXPORT(int) TINFO_MVCUR(SCREEN*, int, int, int, int); */ #ifdef USE_TERM_DRIVER extern NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *, TERMINAL *, int *, int *); -extern NCURSES_EXPORT(int) _nc_setupterm_ex(TERMINAL **, NCURSES_CONST char *, int , 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) \ @@ -2367,7 +2615,7 @@ extern NCURSES_EXPORT(int) _nc_mingw_console_read( extern NCURSES_EXPORT(int) _nc_mingw_testmouse( SCREEN * sp, HANDLE fd, - int delay); + int delay EVENTLIST_2nd(_nc_eventlist*)); #else #endif extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_TINFO_DRIVER; @@ -2422,7 +2670,6 @@ extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(_nc_makenew) (SCREEN*, 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_curs_set)(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); @@ -2431,19 +2678,11 @@ 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_resetty)(SCREEN*); -extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_resize_term)(SCREEN*,int,int); extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_ripoffline)(SCREEN*, int, int (*)(WINDOW *,int)); -extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_savetty)(SCREEN*); -extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_scr_init)(SCREEN*,const char*); -extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_scr_restore)(SCREEN*, const char*); 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(int) NCURSES_SP_NAME(_nc_tigetnum)(SCREEN*,NCURSES_CONST char*); -extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_vid_attr)(SCREEN *, attr_t, NCURSES_COLOR_T, void *); -extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_vidputs)(SCREEN*,chtype,int(*) (SCREEN*, int)); 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*); diff --git a/ncurses/fifo_defs.h b/ncurses/fifo_defs.h index c0c795a..ab9266d 100644 --- a/ncurses/fifo_defs.h +++ b/ncurses/fifo_defs.h @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2012 Free Software Foundation, Inc. * + * 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 * @@ -34,7 +35,7 @@ /* * Common macros for lib_getch.c, lib_ungetch.c * - * $Id: fifo_defs.h,v 1.7 2012/08/04 15:59:17 tom Exp $ + * $Id: fifo_defs.h,v 1.9 2020/02/02 23:34:34 tom Exp $ */ #ifndef FIFO_DEFS_H @@ -82,6 +83,4 @@ #define cooked_key_in_fifo() ((head >= 0) && (peek != head)) #define raw_key_in_fifo() ((head >= 0) && (peek != tail)) -#undef HIDE_EINTR - #endif /* FIFO_DEFS_H */ diff --git a/ncurses/llib-lncurses b/ncurses/llib-lncurses index d98dcd5..642c68d 100644 --- a/ncurses/llib-lncurses +++ b/ncurses/llib-lncurses @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2013 Free Software Foundation, Inc. * + * 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 * @@ -27,7 +28,7 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 1996-on * + * Author: Thomas E. Dickey 1996-on * ****************************************************************************/ /* LINTLIBRARY */ @@ -182,7 +183,7 @@ int wchgat( WINDOW *win, int n, attr_t attr, - short color, + short pair_arg, const void *opts) { return(*(int *)0); } @@ -240,6 +241,26 @@ int start_color_sp( 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, @@ -255,6 +276,15 @@ int init_pair( 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, @@ -307,6 +337,14 @@ int color_content( 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, @@ -344,7 +382,7 @@ void _nc_do_color( #undef wcolor_set int wcolor_set( WINDOW *win, - short color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } @@ -1023,20 +1061,6 @@ int (vline)( int z) { return(*(int *)0); } -#undef vw_printw -int (vw_printw)( - WINDOW *a1, - const char *a2, - va_list z) - { return(*(int *)0); } - -#undef vw_scanw -int (vw_scanw)( - WINDOW *a1, - char *a2, - va_list z) - { return(*(int *)0); } - #undef waddchstr int (waddchstr)( WINDOW *a1, @@ -1237,6 +1261,11 @@ 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, @@ -1586,14 +1615,14 @@ void nofilter(void) #undef newterm_sp SCREEN *newterm_sp( SCREEN *sp, - char *name, + const char *name, FILE *ofp, FILE *ifp) { return(*(SCREEN **)0); } #undef newterm SCREEN *newterm( - char *name, + const char *name, FILE *ofp, FILE *ifp) { return(*(SCREEN **)0); } @@ -1803,6 +1832,13 @@ int vwprintw( 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 @@ -1829,14 +1865,14 @@ int wnoutrefresh( #undef restartterm_sp int restartterm_sp( SCREEN *sp, - char *termp, + const char *termp, int filenum, int *errret) { return(*(int *)0); } #undef restartterm int restartterm( - char *termp, + const char *termp, int filenum, int *errret) { return(*(int *)0); } @@ -1846,20 +1882,27 @@ int restartterm( #undef vwscanw int vwscanw( WINDOW *win, - char *fmt, + 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( - char *fmt, + const char *fmt, ...) { return(*(int *)0); } #undef wscanw int wscanw( WINDOW *win, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -1867,7 +1910,7 @@ int wscanw( int mvscanw( int y, int x, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -1876,7 +1919,7 @@ int mvwscanw( WINDOW *win, int y, int x, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -2065,14 +2108,14 @@ int slk_restore(void) int slk_attr_set_sp( SCREEN *sp, const attr_t attr, - short color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } #undef slk_attr_set int slk_attr_set( const attr_t attr, - short color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } @@ -2142,12 +2185,12 @@ int slk_clear(void) #undef slk_color_sp int slk_color_sp( SCREEN *sp, - short color_pair_number) + short pair_arg) { return(*(int *)0); } #undef slk_color int slk_color( - short color_pair_number) + short pair_arg) { return(*(int *)0); } /* ./base/lib_slkinit.c */ @@ -2255,6 +2298,12 @@ void _tracedump( /* ./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, @@ -2500,10 +2549,6 @@ void _nc_do_xmc_glitch( /* ./trace/varargs.c */ -typedef enum { - atUnknown = 0, atInteger, atFloat, atPoint, atString -} ARGTYPE; - #undef _nc_varargs char *_nc_varargs( const char *fmt, @@ -2533,6 +2578,11 @@ void _nc_free_and_exit( int code) { /* void */ } +#undef exit_curses +void exit_curses( + int code) + { /* void */ } + /* ./expanded.c */ #undef _nc_toggle_attr_on @@ -2632,6 +2682,12 @@ int mcprint( 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 @@ -2762,8 +2818,8 @@ int _nc_add_to_try( #undef _nc_align_termtype void _nc_align_termtype( - TERMTYPE *to, - TERMTYPE *from) + TERMTYPE2 *to, + TERMTYPE2 *from) { /* void */ } #undef _nc_copy_termtype @@ -2775,11 +2831,11 @@ void _nc_copy_termtype( /* ./codes.c */ #undef boolcodes -char *const boolcodes[] = {0}; +const char *const boolcodes[] = {0}; #undef numcodes -char *const numcodes[] = {0}; +const char *const numcodes[] = {0}; #undef strcodes -char *const strcodes[] = {0}; +const char *const strcodes[] = {0}; /* ./comp_captab.c */ @@ -2864,6 +2920,21 @@ struct name_table_entry const *_nc_find_type_entry( 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 @@ -2910,7 +2981,7 @@ ENTRY *_nc_tail; #undef _nc_free_entry void _nc_free_entry( ENTRY *headp, - TERMTYPE *tterm) + TERMTYPE2 *tterm) { /* void */ } #undef _nc_free_entries @@ -2918,22 +2989,21 @@ void _nc_free_entries( ENTRY *headp) { /* void */ } -#undef _nc_delink_entry -ENTRY *_nc_delink_entry( - ENTRY *headp, - TERMTYPE *tterm) - { return(*(ENTRY **)0); } - #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 TERMTYPE2 *_nc_fallback( const char *name) - { return(*(const TERMTYPE **)0); } + { return(*(const TERMTYPE2 **)0); } /* ./tinfo/free_ttype.c */ @@ -2993,8 +3063,8 @@ void _nc_init_acs(void) /* ./tinfo/lib_baudrate.c */ struct speed { - int s; - int sp; + int given_speed; + int actual_speed; }; #undef _nc_baudrate @@ -3119,18 +3189,23 @@ int flushinp(void) struct kn { short offset; int code; }; #undef keyname_sp -char *keyname_sp( +const char *keyname_sp( SCREEN *sp, int c) - { return(*(char **)0); } + { return(*(const char **)0); } #undef keyname -char *keyname( +const char *keyname( int c) - { return(*(char **)0); } + { 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); } @@ -3382,7 +3457,7 @@ void _nc_update_screensize( #undef _nc_setup_tinfo int _nc_setup_tinfo( const char *const tn, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } #undef _nc_tinfo_cmdch @@ -3406,7 +3481,7 @@ int _nc_locale_breaks_acs( #undef _nc_setupterm int _nc_setupterm( - char *tname, + const char *tname, int Filedes, int *errret, int reuse) @@ -3418,7 +3493,7 @@ SCREEN *new_prescr(void) #undef setupterm int setupterm( - char *tname, + const char *tname, int Filedes, int *errret) { return(*(int *)0); } @@ -3446,35 +3521,35 @@ int tgetent( #undef tgetflag_sp int tgetflag_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetflag int tgetflag( - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum_sp int tgetnum_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum int tgetnum( - char *id) + const char *id) { return(*(int *)0); } #undef tgetstr_sp char *tgetstr_sp( SCREEN *sp, - char *id, + const char *id, char **area) { return(*(char **)0); } #undef tgetstr char *tgetstr( - char *id, + const char *id, char **area) { return(*(char **)0); } @@ -3503,34 +3578,34 @@ char *tgoto( #undef tigetflag_sp int tigetflag_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetflag int tigetflag( - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum_sp int tigetnum_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum int tigetnum( - char *str) + const char *str) { return(*(int *)0); } #undef tigetstr_sp char *tigetstr_sp( SCREEN *sp, - char *str) + const char *str) { return(*(char **)0); } #undef tigetstr char *tigetstr( - char *str) + const char *str) { return(*(char **)0); } /* ./tinfo/lib_tparm.c */ @@ -3547,7 +3622,7 @@ int _nc_tparm_analyze( #undef tparm char *tparm( - char *string, + const char *string, ...) { return(*(char **)0); } @@ -3668,6 +3743,11 @@ 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) @@ -3710,9 +3790,9 @@ const char *_nc_retrace_cptr( { return(*(const char **)0); } #undef _nc_retrace_cvoid_ptr -void *_nc_retrace_cvoid_ptr( - void *code) - { return(*(void **)0); } +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } #undef _nc_retrace_void_ptr void *_nc_retrace_void_ptr( @@ -3729,6 +3809,13 @@ 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 @@ -3776,11 +3863,6 @@ chtype _nc_retrace_chtype( /* ./trace/lib_tracebits.c */ -typedef struct { - unsigned int val; - const char *name; -} BITNAMES; - #undef _nc_trace_ttymode char *_nc_trace_ttymode( struct termios *tty) @@ -3908,17 +3990,17 @@ int _nc_name_match( /* ./names.c */ #undef boolnames -char *const boolnames[] = {0}; +const char *const boolnames[] = {0}; #undef boolfnames -char *const boolfnames[] = {0}; +const char *const boolfnames[] = {0}; #undef numnames -char *const numnames[] = {0}; +const char *const numnames[] = {0}; #undef numfnames -char *const numfnames[] = {0}; +const char *const numfnames[] = {0}; #undef strnames -char *const strnames[] = {0}; +const char *const strnames[] = {0}; #undef strfnames -char *const strfnames[] = {0}; +const char *const strfnames[] = {0}; /* ./tinfo/obsolete.c */ @@ -3939,12 +4021,12 @@ void _nc_set_buffer( #undef _nc_init_termtype void _nc_init_termtype( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } #undef _nc_read_termtype int _nc_read_termtype( - TERMTYPE *ptr, + TERMTYPE2 *ptr, char *buffer, int limit) { return(*(int *)0); } @@ -3952,21 +4034,23 @@ int _nc_read_termtype( #undef _nc_read_file_entry int _nc_read_file_entry( const char *const filename, - TERMTYPE *ptr) + TERMTYPE2 *ptr) { return(*(int *)0); } #undef _nc_read_entry int _nc_read_entry( const char *const name, char *const filename, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } /* ./tinfo/read_termcap.c */ -#undef _nc_read_termcap -void _nc_read_termcap(void) - { /* void */ } +#undef _nc_read_termcap_entry +int _nc_read_termcap_entry( + const char *const tn, + TERMTYPE2 *const tp) + { return(*(int *)0); } /* ./tinfo/strings.c */ @@ -4048,21 +4132,21 @@ int _nc_remove_string( #undef _nc_trim_sgr0 char *_nc_trim_sgr0( - TERMTYPE *tp) + TERMTYPE2 *tp) { return(*(char **)0); } /* ./unctrl.c */ #undef unctrl_sp -char *unctrl_sp( +const char *unctrl_sp( SCREEN *sp, chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } #undef unctrl -char *unctrl( +const char *unctrl( chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./trace/visbuf.c */ @@ -4100,7 +4184,7 @@ const char *_nc_viscbuf( #undef _nc_init_entry void _nc_init_entry( - TERMTYPE *const tp) + ENTRY *const tp) { /* void */ } #undef _nc_copy_entry @@ -4121,8 +4205,8 @@ void _nc_wrap_entry( #undef _nc_merge_entry void _nc_merge_entry( - TERMTYPE *const to, - TERMTYPE *const from) + ENTRY *const target, + ENTRY *const source) { /* void */ } /* ./tinfo/captoinfo.c */ @@ -4154,11 +4238,8 @@ char *_nc_tic_expand( #undef _nc_check_termtype2 void (*_nc_check_termtype2)( - TERMTYPE *p1, + TERMTYPE2 *p1, NCURSES_BOOL p2); -#undef _nc_check_termtype -void (*_nc_check_termtype)( - TERMTYPE *p1); #undef _nc_entry_match NCURSES_BOOL _nc_entry_match( @@ -4182,11 +4263,6 @@ int _nc_resolve_uses2( NCURSES_BOOL literal) { return(*(int *)0); } -#undef _nc_resolve_uses -int _nc_resolve_uses( - NCURSES_BOOL fullresolve) - { return(*(int *)0); } - /* ./tinfo/comp_scan.c */ #undef _nc_syntax @@ -4237,7 +4313,7 @@ void _nc_panic_mode( #undef _nc_parse_entry int _nc_parse_entry( - struct entry *entryp, + ENTRY *entryp, int literal, NCURSES_BOOL silent) { return(*(int *)0); } @@ -4248,23 +4324,26 @@ int _nc_capcmp( const char *t) { return(*(int *)0); } -typedef struct { - const char *from; - const char *to; -} assoc; - /* ./tinfo/write_entry.c */ #undef _nc_set_writedir void _nc_set_writedir( - char *dir) + const char *dir) { /* void */ } #undef _nc_write_entry void _nc_write_entry( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + #undef _nc_tic_written int _nc_tic_written(void) { return(*(int *)0); } diff --git a/ncurses/llib-lncursest b/ncurses/llib-lncursest index 3401ad3..0fbde93 100644 --- a/ncurses/llib-lncursest +++ b/ncurses/llib-lncursest @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2008-2011,2013 Free Software Foundation, Inc. * + * Copyright 2019,2020 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 * @@ -27,7 +28,7 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2008-on * + * Author: Thomas E. Dickey 2008-on * ****************************************************************************/ /* LINTLIBRARY */ @@ -95,8 +96,6 @@ void _nc_scroll_oldhash( /* ./base/lib_addch.c */ -#include <ctype.h> - #undef _nc_render chtype _nc_render( WINDOW *win, @@ -184,7 +183,7 @@ int wchgat( WINDOW *win, int n, attr_t attr, - short color, + short pair_arg, const void *opts) { return(*(int *)0); } @@ -219,8 +218,6 @@ int wclrtoeol( /* ./base/lib_color.c */ -#include <tic.h> - #undef _nc_COLOR_PAIRS int _nc_COLOR_PAIRS(void) { return(*(int *)0); } @@ -247,6 +244,26 @@ int start_color_sp( 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, @@ -262,6 +279,15 @@ int init_pair( 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, @@ -314,6 +340,14 @@ int color_content( 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, @@ -351,7 +385,7 @@ void _nc_do_color( #undef wcolor_set int wcolor_set( WINDOW *win, - short color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } @@ -420,8 +454,6 @@ int flash(void) /* ./lib_gen.c */ -#include <ncurses_cfg.h> - #undef addch int (addch)( const chtype z) @@ -451,17 +483,17 @@ int (addstr)( #undef attroff int (attroff)( - int z) + NCURSES_ATTR_T z) { return(*(int *)0); } #undef attron int (attron)( - int z) + NCURSES_ATTR_T z) { return(*(int *)0); } #undef attrset int (attrset)( - int z) + NCURSES_ATTR_T z) { return(*(int *)0); } #undef attr_get @@ -1032,20 +1064,6 @@ int (vline)( int z) { return(*(int *)0); } -#undef vw_printw -int (vw_printw)( - WINDOW *a1, - const char *a2, - va_list z) - { return(*(int *)0); } - -#undef vw_scanw -int (vw_scanw)( - WINDOW *a1, - char *a2, - va_list z) - { return(*(int *)0); } - #undef waddchstr int (waddchstr)( WINDOW *a1, @@ -1246,6 +1264,11 @@ 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, @@ -1262,8 +1285,6 @@ NCURSES_BOOL (mouse_trafo)( /* ./base/lib_getch.c */ -#include <fifo_defs.h> - #undef _nc_ESCDELAY int _nc_ESCDELAY(void) { return(*(int *)0); } @@ -1603,22 +1624,20 @@ void nofilter(void) #undef newterm_sp SCREEN *newterm_sp( SCREEN *sp, - char *name, + const char *name, FILE *ofp, FILE *ifp) { return(*(SCREEN **)0); } #undef newterm SCREEN *newterm( - char *name, + const char *name, FILE *ofp, FILE *ifp) { return(*(SCREEN **)0); } /* ./base/lib_newwin.c */ -#include "/usr/lib/gcc/x86_64-linux-gnu/4.4.5/include/stddef.h" - #undef _nc_freewin int _nc_freewin( WINDOW *win) @@ -1822,6 +1841,13 @@ int vwprintw( 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 @@ -1848,14 +1874,14 @@ int wnoutrefresh( #undef restartterm_sp int restartterm_sp( SCREEN *sp, - char *termp, + const char *termp, int filenum, int *errret) { return(*(int *)0); } #undef restartterm int restartterm( - char *termp, + const char *termp, int filenum, int *errret) { return(*(int *)0); } @@ -1865,20 +1891,27 @@ int restartterm( #undef vwscanw int vwscanw( WINDOW *win, - char *fmt, + 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( - char *fmt, + const char *fmt, ...) { return(*(int *)0); } #undef wscanw int wscanw( WINDOW *win, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -1886,7 +1919,7 @@ int wscanw( int mvscanw( int y, int x, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -1895,7 +1928,7 @@ int mvwscanw( WINDOW *win, int y, int x, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -2084,14 +2117,14 @@ int slk_restore(void) int slk_attr_set_sp( SCREEN *sp, const attr_t attr, - short color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } #undef slk_attr_set int slk_attr_set( const attr_t attr, - short color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } @@ -2161,12 +2194,12 @@ int slk_clear(void) #undef slk_color_sp int slk_color_sp( SCREEN *sp, - short color_pair_number) + short pair_arg) { return(*(int *)0); } #undef slk_color int slk_color( - short color_pair_number) + short pair_arg) { return(*(int *)0); } /* ./base/lib_slkinit.c */ @@ -2274,6 +2307,12 @@ void _tracedump( /* ./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, @@ -2293,8 +2332,6 @@ char *_tracemouse( /* ./tty/lib_tstp.c */ -#include <SigAction.h> - #undef _nc_signal_handler void _nc_signal_handler( int enable) @@ -2455,9 +2492,6 @@ char *_nc_printf_string( /* ./tty/tty_update.c */ -#include <sys/time.h> -#include <sys/times.h> - #undef doupdate_sp int doupdate_sp( SCREEN *sp) @@ -2524,10 +2558,6 @@ void _nc_do_xmc_glitch( /* ./trace/varargs.c */ -typedef enum { - atUnknown = 0, atInteger, atFloat, atPoint, atString -} ARGTYPE; - #undef _nc_varargs char *_nc_varargs( const char *fmt, @@ -2557,6 +2587,11 @@ void _nc_free_and_exit( int code) { /* void */ } +#undef exit_curses +void exit_curses( + int code) + { /* void */ } + /* ./expanded.c */ #undef _nc_toggle_attr_on @@ -2656,6 +2691,12 @@ int mcprint( 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 @@ -2786,8 +2827,8 @@ int _nc_add_to_try( #undef _nc_align_termtype void _nc_align_termtype( - TERMTYPE *to, - TERMTYPE *from) + TERMTYPE2 *to, + TERMTYPE2 *from) { /* void */ } #undef _nc_copy_termtype @@ -2799,21 +2840,19 @@ void _nc_copy_termtype( /* ./codes.c */ #undef _nc_boolcodes -char *const *_nc_boolcodes(void) - { return(*(char **)0); } +const char *const *_nc_boolcodes(void) + { return(*(const char **)0); } #undef _nc_numcodes -char *const *_nc_numcodes(void) - { return(*(char **)0); } +const char *const *_nc_numcodes(void) + { return(*(const char **)0); } #undef _nc_strcodes -char *const *_nc_strcodes(void) - { return(*(char **)0); } +const char *const *_nc_strcodes(void) + { return(*(const char **)0); } /* ./comp_captab.c */ -#include <hashsize.h> - #undef _nc_get_table const struct name_table_entry *_nc_get_table( NCURSES_BOOL termcap) @@ -2895,9 +2934,22 @@ struct name_table_entry const *_nc_find_type_entry( NCURSES_BOOL termcap) { return(*(struct name_table_entry const **)0); } -/* ./tinfo/db_iterator.c */ +#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); } -#include <time.h> +#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( @@ -2943,7 +2995,7 @@ ENTRY *_nc_tail; #undef _nc_free_entry void _nc_free_entry( ENTRY *headp, - TERMTYPE *tterm) + TERMTYPE2 *tterm) { /* void */ } #undef _nc_free_entries @@ -2951,22 +3003,21 @@ void _nc_free_entries( ENTRY *headp) { /* void */ } -#undef _nc_delink_entry -ENTRY *_nc_delink_entry( - ENTRY *headp, - TERMTYPE *tterm) - { return(*(ENTRY **)0); } - #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 TERMTYPE2 *_nc_fallback( const char *name) - { return(*(const TERMTYPE **)0); } + { return(*(const TERMTYPE2 **)0); } /* ./tinfo/free_ttype.c */ @@ -3004,15 +3055,6 @@ char *_nc_home_terminfo(void) /* ./tinfo/init_keytry.c */ -#if 0 - -#include <init_keytry.h> - -#undef _nc_tinfo_fkeys -const struct tinfo_fkeys _nc_tinfo_fkeys[] = {0}; - -#endif - #undef _nc_init_keytry void _nc_init_keytry( SCREEN *sp) @@ -3035,11 +3077,9 @@ void _nc_init_acs(void) /* ./tinfo/lib_baudrate.c */ -#include <termcap.h> - struct speed { - int s; - int sp; + int given_speed; + int actual_speed; }; #undef _nc_baudrate @@ -3204,15 +3244,15 @@ int flushinp(void) struct kn { short offset; int code; }; #undef keyname_sp -char *keyname_sp( +const char *keyname_sp( SCREEN *sp, int c) - { return(*(char **)0); } + { return(*(const char **)0); } #undef keyname -char *keyname( +const char *keyname( int c) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./tinfo/lib_longname.c */ @@ -3410,10 +3450,6 @@ int intrflush( /* ./tinfo/lib_setup.c */ -#include <locale.h> -#include <sys/ioctl.h> -#include <langinfo.h> - #undef _nc_ttytype char *_nc_ttytype(void) { return(*(char **)0); } @@ -3498,7 +3534,7 @@ void _nc_update_screensize( #undef _nc_setup_tinfo int _nc_setup_tinfo( const char *const tn, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } #undef _nc_tinfo_cmdch @@ -3522,19 +3558,27 @@ int _nc_locale_breaks_acs( #undef _nc_setupterm int _nc_setupterm( - char *tname, + 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( - char *tname, + const char *tname, int Filedes, int *errret) { return(*(int *)0); } @@ -3553,12 +3597,6 @@ int tgetent_sp( const char *name) { return(*(int *)0); } -#if 0 - -#include <capdefaults.c> - -#endif - #undef tgetent int tgetent( char *bufp, @@ -3568,35 +3606,35 @@ int tgetent( #undef tgetflag_sp int tgetflag_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetflag int tgetflag( - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum_sp int tgetnum_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum int tgetnum( - char *id) + const char *id) { return(*(int *)0); } #undef tgetstr_sp char *tgetstr_sp( SCREEN *sp, - char *id, + const char *id, char **area) { return(*(char **)0); } #undef tgetstr char *tgetstr( - char *id, + const char *id, char **area) { return(*(char **)0); } @@ -3625,34 +3663,34 @@ char *tgoto( #undef tigetflag_sp int tigetflag_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetflag int tigetflag( - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum_sp int tigetnum_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum int tigetnum( - char *str) + const char *str) { return(*(int *)0); } #undef tigetstr_sp char *tigetstr_sp( SCREEN *sp, - char *str) + const char *str) { return(*(char **)0); } #undef tigetstr char *tigetstr( - char *str) + const char *str) { return(*(char **)0); } /* ./tinfo/lib_tparm.c */ @@ -3669,7 +3707,7 @@ int _nc_tparm_analyze( #undef tparm char *tparm( - char *string, + const char *string, ...) { return(*(char **)0); } @@ -3804,6 +3842,11 @@ 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) @@ -3846,9 +3889,9 @@ const char *_nc_retrace_cptr( { return(*(const char **)0); } #undef _nc_retrace_cvoid_ptr -void *_nc_retrace_cvoid_ptr( - void *code) - { return(*(void **)0); } +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } #undef _nc_retrace_void_ptr void *_nc_retrace_void_ptr( @@ -3865,6 +3908,13 @@ 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) @@ -3923,11 +3973,6 @@ chtype _nc_retrace_chtype( /* ./trace/lib_tracebits.c */ -typedef struct { - unsigned int val; - const char *name; -} BITNAMES; - #undef _nc_trace_ttymode char *_nc_trace_ttymode( struct termios *tty) @@ -4055,28 +4100,28 @@ int _nc_name_match( /* ./names.c */ #undef _nc_boolnames -char *const *_nc_boolnames(void) - { return(*(char **)0); } +const char *const *_nc_boolnames(void) + { return(*(const char **)0); } #undef _nc_boolfnames -char *const *_nc_boolfnames(void) - { return(*(char **)0); } +const char *const *_nc_boolfnames(void) + { return(*(const char **)0); } #undef _nc_numnames -char *const *_nc_numnames(void) - { return(*(char **)0); } +const char *const *_nc_numnames(void) + { return(*(const char **)0); } #undef _nc_numfnames -char *const *_nc_numfnames(void) - { return(*(char **)0); } +const char *const *_nc_numfnames(void) + { return(*(const char **)0); } #undef _nc_strnames -char *const *_nc_strnames(void) - { return(*(char **)0); } +const char *const *_nc_strnames(void) + { return(*(const char **)0); } #undef _nc_strfnames -char *const *_nc_strfnames(void) - { return(*(char **)0); } +const char *const *_nc_strfnames(void) + { return(*(const char **)0); } /* ./tinfo/obsolete.c */ @@ -4095,16 +4140,14 @@ void _nc_set_buffer( /* ./tinfo/read_entry.c */ -#include <hashed_db.h> - #undef _nc_init_termtype void _nc_init_termtype( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } #undef _nc_read_termtype int _nc_read_termtype( - TERMTYPE *ptr, + TERMTYPE2 *ptr, char *buffer, int limit) { return(*(int *)0); } @@ -4112,23 +4155,23 @@ int _nc_read_termtype( #undef _nc_read_file_entry int _nc_read_file_entry( const char *const filename, - TERMTYPE *ptr) + TERMTYPE2 *ptr) { return(*(int *)0); } #undef _nc_read_entry int _nc_read_entry( const char *const name, char *const filename, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } /* ./tinfo/read_termcap.c */ -#include <sys/types.h> - -#undef _nc_read_termcap -void _nc_read_termcap(void) - { /* void */ } +#undef _nc_read_termcap_entry +int _nc_read_termcap_entry( + const char *const tn, + TERMTYPE2 *const tp) + { return(*(int *)0); } /* ./tinfo/strings.c */ @@ -4210,21 +4253,21 @@ int _nc_remove_string( #undef _nc_trim_sgr0 char *_nc_trim_sgr0( - TERMTYPE *tp) + TERMTYPE2 *tp) { return(*(char **)0); } /* ./unctrl.c */ #undef unctrl_sp -char *unctrl_sp( +const char *unctrl_sp( SCREEN *sp, chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } #undef unctrl -char *unctrl( +const char *unctrl( chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./trace/visbuf.c */ @@ -4262,7 +4305,7 @@ const char *_nc_viscbuf( #undef _nc_init_entry void _nc_init_entry( - TERMTYPE *const tp) + ENTRY *const tp) { /* void */ } #undef _nc_copy_entry @@ -4283,8 +4326,8 @@ void _nc_wrap_entry( #undef _nc_merge_entry void _nc_merge_entry( - TERMTYPE *const to, - TERMTYPE *const from) + ENTRY *const target, + ENTRY *const source) { /* void */ } /* ./tinfo/captoinfo.c */ @@ -4316,11 +4359,8 @@ char *_nc_tic_expand( #undef _nc_check_termtype2 void (*_nc_check_termtype2)( - TERMTYPE *p1, + TERMTYPE2 *p1, NCURSES_BOOL p2); -#undef _nc_check_termtype -void (*_nc_check_termtype)( - TERMTYPE *p1); #undef _nc_entry_match NCURSES_BOOL _nc_entry_match( @@ -4344,11 +4384,6 @@ int _nc_resolve_uses2( NCURSES_BOOL literal) { return(*(int *)0); } -#undef _nc_resolve_uses -int _nc_resolve_uses( - NCURSES_BOOL fullresolve) - { return(*(int *)0); } - /* ./tinfo/comp_scan.c */ #undef _nc_syntax @@ -4399,7 +4434,7 @@ void _nc_panic_mode( #undef _nc_parse_entry int _nc_parse_entry( - struct entry *entryp, + ENTRY *entryp, int literal, NCURSES_BOOL silent) { return(*(int *)0); } @@ -4410,23 +4445,26 @@ int _nc_capcmp( const char *t) { return(*(int *)0); } -typedef struct { - const char *from; - const char *to; -} assoc; - /* ./tinfo/write_entry.c */ #undef _nc_set_writedir void _nc_set_writedir( - char *dir) + const char *dir) { /* void */ } #undef _nc_write_entry void _nc_write_entry( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + #undef _nc_tic_written int _nc_tic_written(void) { return(*(int *)0); } diff --git a/ncurses/llib-lncursestw b/ncurses/llib-lncursestw index b1919c4..0463139 100644 --- a/ncurses/llib-lncursestw +++ b/ncurses/llib-lncursestw @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2009-2011,2013 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -27,7 +28,7 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2009-on * + * Author: Thomas E. Dickey 2009-on * ****************************************************************************/ /* LINTLIBRARY */ @@ -95,8 +96,6 @@ void _nc_scroll_oldhash( /* ./base/lib_addch.c */ -#include <ctype.h> - #undef _nc_render cchar_t _nc_render( WINDOW *win, @@ -221,7 +220,7 @@ int wchgat( WINDOW *win, int n, attr_t attr, - short color, + short pair_arg, const void *opts) { return(*(int *)0); } @@ -256,8 +255,6 @@ int wclrtoeol( /* ./base/lib_color.c */ -#include <tic.h> - #undef _nc_COLOR_PAIRS int _nc_COLOR_PAIRS(void) { return(*(int *)0); } @@ -284,6 +281,26 @@ int start_color_sp( 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, @@ -299,6 +316,15 @@ int init_pair( 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, @@ -351,6 +377,14 @@ int color_content( 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, @@ -383,12 +417,85 @@ void _nc_do_color( 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 color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } @@ -457,8 +564,6 @@ int flash(void) /* ./lib_gen.c */ -#include <ncurses_cfg.h> - #undef addch int (addch)( const chtype z) @@ -488,17 +593,17 @@ int (addstr)( #undef attroff int (attroff)( - int z) + NCURSES_ATTR_T z) { return(*(int *)0); } #undef attron int (attron)( - int z) + NCURSES_ATTR_T z) { return(*(int *)0); } #undef attrset int (attrset)( - int z) + NCURSES_ATTR_T z) { return(*(int *)0); } #undef attr_get @@ -1081,20 +1186,6 @@ int (vline)( int z) { return(*(int *)0); } -#undef vw_printw -int (vw_printw)( - WINDOW *a1, - const char *a2, - va_list z) - { return(*(int *)0); } - -#undef vw_scanw -int (vw_scanw)( - WINDOW *a1, - char *a2, - va_list z) - { return(*(int *)0); } - #undef waddchstr int (waddchstr)( WINDOW *a1, @@ -1295,6 +1386,11 @@ 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, @@ -1770,8 +1866,6 @@ NCURSES_BOOL (mouse_trafo)( /* ./base/lib_getch.c */ -#include <fifo_defs.h> - #undef _nc_ESCDELAY int _nc_ESCDELAY(void) { return(*(int *)0); } @@ -2111,22 +2205,20 @@ void nofilter(void) #undef newterm_sp SCREEN *newterm_sp( SCREEN *sp, - char *name, + const char *name, FILE *ofp, FILE *ifp) { return(*(SCREEN **)0); } #undef newterm SCREEN *newterm( - char *name, + const char *name, FILE *ofp, FILE *ifp) { return(*(SCREEN **)0); } /* ./base/lib_newwin.c */ -#include "/usr/lib/gcc/x86_64-linux-gnu/4.4.5/include/stddef.h" - #undef _nc_freewin int _nc_freewin( WINDOW *win) @@ -2330,6 +2422,13 @@ int vwprintw( 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 @@ -2356,14 +2455,14 @@ int wnoutrefresh( #undef restartterm_sp int restartterm_sp( SCREEN *sp, - char *termp, + const char *termp, int filenum, int *errret) { return(*(int *)0); } #undef restartterm int restartterm( - char *termp, + const char *termp, int filenum, int *errret) { return(*(int *)0); } @@ -2373,20 +2472,27 @@ int restartterm( #undef vwscanw int vwscanw( WINDOW *win, - char *fmt, + 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( - char *fmt, + const char *fmt, ...) { return(*(int *)0); } #undef wscanw int wscanw( WINDOW *win, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -2394,7 +2500,7 @@ int wscanw( int mvscanw( int y, int x, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -2403,7 +2509,7 @@ int mvwscanw( WINDOW *win, int y, int x, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -2592,14 +2698,14 @@ int slk_restore(void) int slk_attr_set_sp( SCREEN *sp, const attr_t attr, - short color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } #undef slk_attr_set int slk_attr_set( const attr_t attr, - short color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } @@ -2669,12 +2775,23 @@ int slk_clear(void) #undef slk_color_sp int slk_color_sp( SCREEN *sp, - short color_pair_number) + short pair_arg) { return(*(int *)0); } #undef slk_color int slk_color( - short color_pair_number) + 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 */ @@ -2725,8 +2842,6 @@ int slk_refresh(void) /* ./base/lib_slkset.c */ -#include <wctype.h> - #undef slk_set_sp int slk_set_sp( SCREEN *sp, @@ -2784,6 +2899,12 @@ void _tracedump( /* ./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, @@ -2803,8 +2924,6 @@ char *_tracemouse( /* ./tty/lib_tstp.c */ -#include <SigAction.h> - #undef _nc_signal_handler void _nc_signal_handler( int enable) @@ -2965,9 +3084,6 @@ char *_nc_printf_string( /* ./tty/tty_update.c */ -#include <sys/time.h> -#include <sys/times.h> - #undef doupdate_sp int doupdate_sp( SCREEN *sp) @@ -3034,10 +3150,6 @@ void _nc_do_xmc_glitch( /* ./trace/varargs.c */ -typedef enum { - atUnknown = 0, atInteger, atFloat, atPoint, atString -} ARGTYPE; - #undef _nc_varargs char *_nc_varargs( const char *fmt, @@ -3067,6 +3179,11 @@ void _nc_free_and_exit( int code) { /* void */ } +#undef exit_curses +void exit_curses( + int code) + { /* void */ } + /* ./widechar/charable.c */ #undef _nc_is_charable @@ -3120,7 +3237,7 @@ int setcchar( cchar_t *wcval, const wchar_t *wch, const attr_t attrs, - short color_pair, + short pair_arg, const void *opts) { return(*(int *)0); } @@ -3129,7 +3246,7 @@ int getcchar( const cchar_t *wcval, wchar_t *wch, attr_t *attrs, - short *color_pair, + short *pair_arg, void *opts) { return(*(int *)0); } @@ -3227,9 +3344,9 @@ int winwstr( /* ./widechar/lib_key_name.c */ #undef key_name -char *key_name( +const char *key_name( wchar_t c) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./widechar/lib_pecho_wchar.c */ @@ -3274,7 +3391,7 @@ int unget_wch( int vid_puts_sp( SCREEN *sp, attr_t newmode, - short pair, + short pair_arg, void *opts, NCURSES_OUTC_sp outc) { return(*(int *)0); } @@ -3282,7 +3399,7 @@ int vid_puts_sp( #undef vid_puts int vid_puts( attr_t newmode, - short pair, + short pair_arg, void *opts, NCURSES_OUTC outc) { return(*(int *)0); } @@ -3291,14 +3408,14 @@ int vid_puts( int vid_attr_sp( SCREEN *sp, attr_t newmode, - short pair, + short pair_arg, void *opts) { return(*(int *)0); } #undef vid_attr int vid_attr( attr_t newmode, - short pair, + short pair_arg, void *opts) { return(*(int *)0); } @@ -3441,6 +3558,72 @@ int mcprint( 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 @@ -3571,8 +3754,8 @@ int _nc_add_to_try( #undef _nc_align_termtype void _nc_align_termtype( - TERMTYPE *to, - TERMTYPE *from) + TERMTYPE2 *to, + TERMTYPE2 *from) { /* void */ } #undef _nc_copy_termtype @@ -3581,24 +3764,34 @@ void _nc_copy_termtype( 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 -char *const *_nc_boolcodes(void) - { return(*(char **)0); } +const char *const *_nc_boolcodes(void) + { return(*(const char **)0); } #undef _nc_numcodes -char *const *_nc_numcodes(void) - { return(*(char **)0); } +const char *const *_nc_numcodes(void) + { return(*(const char **)0); } #undef _nc_strcodes -char *const *_nc_strcodes(void) - { return(*(char **)0); } +const char *const *_nc_strcodes(void) + { return(*(const char **)0); } /* ./comp_captab.c */ -#include <hashsize.h> - #undef _nc_get_table const struct name_table_entry *_nc_get_table( NCURSES_BOOL termcap) @@ -3680,9 +3873,22 @@ struct name_table_entry const *_nc_find_type_entry( NCURSES_BOOL termcap) { return(*(struct name_table_entry const **)0); } -/* ./tinfo/db_iterator.c */ +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } -#include <time.h> +/* ./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( @@ -3728,7 +3934,7 @@ ENTRY *_nc_tail; #undef _nc_free_entry void _nc_free_entry( ENTRY *headp, - TERMTYPE *tterm) + TERMTYPE2 *tterm) { /* void */ } #undef _nc_free_entries @@ -3736,18 +3942,22 @@ void _nc_free_entries( ENTRY *headp) { /* void */ } -#undef _nc_delink_entry -ENTRY *_nc_delink_entry( - ENTRY *headp, - TERMTYPE *tterm) - { return(*(ENTRY **)0); } - #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) @@ -3760,6 +3970,11 @@ void _nc_free_termtype( TERMTYPE *ptr) { /* void */ } +#undef _nc_free_termtype2 +void _nc_free_termtype2( + TERMTYPE2 *ptr) + { /* void */ } + #undef _nc_user_definable NCURSES_BOOL _nc_user_definable; @@ -3789,15 +4004,6 @@ char *_nc_home_terminfo(void) /* ./tinfo/init_keytry.c */ -#if 0 - -#include <init_keytry.h> - -#undef _nc_tinfo_fkeys -const struct tinfo_fkeys _nc_tinfo_fkeys[] = {0}; - -#endif - #undef _nc_init_keytry void _nc_init_keytry( SCREEN *sp) @@ -3820,11 +4026,9 @@ void _nc_init_acs(void) /* ./tinfo/lib_baudrate.c */ -#include <termcap.h> - struct speed { - int s; - int sp; + int given_speed; + int actual_speed; }; #undef _nc_baudrate @@ -3989,15 +4193,15 @@ int flushinp(void) struct kn { short offset; int code; }; #undef keyname_sp -char *keyname_sp( +const char *keyname_sp( SCREEN *sp, int c) - { return(*(char **)0); } + { return(*(const char **)0); } #undef keyname -char *keyname( +const char *keyname( int c) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./tinfo/lib_longname.c */ @@ -4195,10 +4399,6 @@ int intrflush( /* ./tinfo/lib_setup.c */ -#include <locale.h> -#include <sys/ioctl.h> -#include <langinfo.h> - #undef _nc_ttytype char *_nc_ttytype(void) { return(*(char **)0); } @@ -4283,7 +4483,7 @@ void _nc_update_screensize( #undef _nc_setup_tinfo int _nc_setup_tinfo( const char *const tn, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } #undef _nc_tinfo_cmdch @@ -4307,19 +4507,27 @@ int _nc_locale_breaks_acs( #undef _nc_setupterm int _nc_setupterm( - char *tname, + 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( - char *tname, + const char *tname, int Filedes, int *errret) { return(*(int *)0); } @@ -4338,12 +4546,6 @@ int tgetent_sp( const char *name) { return(*(int *)0); } -#if 0 - -#include <capdefaults.c> - -#endif - #undef tgetent int tgetent( char *bufp, @@ -4353,35 +4555,35 @@ int tgetent( #undef tgetflag_sp int tgetflag_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetflag int tgetflag( - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum_sp int tgetnum_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum int tgetnum( - char *id) + const char *id) { return(*(int *)0); } #undef tgetstr_sp char *tgetstr_sp( SCREEN *sp, - char *id, + const char *id, char **area) { return(*(char **)0); } #undef tgetstr char *tgetstr( - char *id, + const char *id, char **area) { return(*(char **)0); } @@ -4410,34 +4612,34 @@ char *tgoto( #undef tigetflag_sp int tigetflag_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetflag int tigetflag( - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum_sp int tigetnum_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum int tigetnum( - char *str) + const char *str) { return(*(int *)0); } #undef tigetstr_sp char *tigetstr_sp( SCREEN *sp, - char *str) + const char *str) { return(*(char **)0); } #undef tigetstr char *tigetstr( - char *str) + const char *str) { return(*(char **)0); } /* ./tinfo/lib_tparm.c */ @@ -4454,7 +4656,7 @@ int _nc_tparm_analyze( #undef tparm char *tparm( - char *string, + const char *string, ...) { return(*(char **)0); } @@ -4589,6 +4791,11 @@ 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) @@ -4631,9 +4838,9 @@ const char *_nc_retrace_cptr( { return(*(const char **)0); } #undef _nc_retrace_cvoid_ptr -void *_nc_retrace_cvoid_ptr( - void *code) - { return(*(void **)0); } +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } #undef _nc_retrace_void_ptr void *_nc_retrace_void_ptr( @@ -4650,6 +4857,13 @@ 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) @@ -4719,11 +4933,6 @@ char *_tracecchar_t( /* ./trace/lib_tracebits.c */ -typedef struct { - unsigned int val; - const char *name; -} BITNAMES; - #undef _nc_trace_ttymode char *_nc_trace_ttymode( struct termios *tty) @@ -4851,28 +5060,28 @@ int _nc_name_match( /* ./names.c */ #undef _nc_boolnames -char *const *_nc_boolnames(void) - { return(*(char **)0); } +const char *const *_nc_boolnames(void) + { return(*(const char **)0); } #undef _nc_boolfnames -char *const *_nc_boolfnames(void) - { return(*(char **)0); } +const char *const *_nc_boolfnames(void) + { return(*(const char **)0); } #undef _nc_numnames -char *const *_nc_numnames(void) - { return(*(char **)0); } +const char *const *_nc_numnames(void) + { return(*(const char **)0); } #undef _nc_numfnames -char *const *_nc_numfnames(void) - { return(*(char **)0); } +const char *const *_nc_numfnames(void) + { return(*(const char **)0); } #undef _nc_strnames -char *const *_nc_strnames(void) - { return(*(char **)0); } +const char *const *_nc_strnames(void) + { return(*(const char **)0); } #undef _nc_strfnames -char *const *_nc_strfnames(void) - { return(*(char **)0); } +const char *const *_nc_strfnames(void) + { return(*(const char **)0); } /* ./tinfo/obsolete.c */ @@ -4891,16 +5100,14 @@ void _nc_set_buffer( /* ./tinfo/read_entry.c */ -#include <hashed_db.h> - #undef _nc_init_termtype void _nc_init_termtype( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } #undef _nc_read_termtype int _nc_read_termtype( - TERMTYPE *ptr, + TERMTYPE2 *ptr, char *buffer, int limit) { return(*(int *)0); } @@ -4908,7 +5115,14 @@ int _nc_read_termtype( #undef _nc_read_file_entry int _nc_read_file_entry( const char *const filename, - TERMTYPE *ptr) + 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 @@ -4920,11 +5134,11 @@ int _nc_read_entry( /* ./tinfo/read_termcap.c */ -#include <sys/types.h> - -#undef _nc_read_termcap -void _nc_read_termcap(void) - { /* void */ } +#undef _nc_read_termcap_entry +int _nc_read_termcap_entry( + const char *const tn, + TERMTYPE2 *const tp) + { return(*(int *)0); } /* ./tinfo/strings.c */ @@ -5006,21 +5220,21 @@ int _nc_remove_string( #undef _nc_trim_sgr0 char *_nc_trim_sgr0( - TERMTYPE *tp) + TERMTYPE2 *tp) { return(*(char **)0); } /* ./unctrl.c */ #undef unctrl_sp -char *unctrl_sp( +const char *unctrl_sp( SCREEN *sp, chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } #undef unctrl -char *unctrl( +const char *unctrl( chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./trace/visbuf.c */ @@ -5080,7 +5294,7 @@ const char *_nc_viscbuf( #undef _nc_init_entry void _nc_init_entry( - TERMTYPE *const tp) + ENTRY *const tp) { /* void */ } #undef _nc_copy_entry @@ -5101,8 +5315,8 @@ void _nc_wrap_entry( #undef _nc_merge_entry void _nc_merge_entry( - TERMTYPE *const to, - TERMTYPE *const from) + ENTRY *const target, + ENTRY *const source) { /* void */ } /* ./tinfo/captoinfo.c */ @@ -5134,11 +5348,8 @@ char *_nc_tic_expand( #undef _nc_check_termtype2 void (*_nc_check_termtype2)( - TERMTYPE *p1, + TERMTYPE2 *p1, NCURSES_BOOL p2); -#undef _nc_check_termtype -void (*_nc_check_termtype)( - TERMTYPE *p1); #undef _nc_entry_match NCURSES_BOOL _nc_entry_match( @@ -5162,11 +5373,6 @@ int _nc_resolve_uses2( NCURSES_BOOL literal) { return(*(int *)0); } -#undef _nc_resolve_uses -int _nc_resolve_uses( - NCURSES_BOOL fullresolve) - { return(*(int *)0); } - /* ./tinfo/comp_scan.c */ #undef _nc_syntax @@ -5217,7 +5423,7 @@ void _nc_panic_mode( #undef _nc_parse_entry int _nc_parse_entry( - struct entry *entryp, + ENTRY *entryp, int literal, NCURSES_BOOL silent) { return(*(int *)0); } @@ -5228,23 +5434,26 @@ int _nc_capcmp( const char *t) { return(*(int *)0); } -typedef struct { - const char *from; - const char *to; -} assoc; - /* ./tinfo/write_entry.c */ #undef _nc_set_writedir void _nc_set_writedir( - char *dir) + const char *dir) { /* void */ } #undef _nc_write_entry void _nc_write_entry( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + #undef _nc_tic_written int _nc_tic_written(void) { return(*(int *)0); } diff --git a/ncurses/llib-lncursesw b/ncurses/llib-lncursesw index be768d7..dd084a4 100644 --- a/ncurses/llib-lncursesw +++ b/ncurses/llib-lncursesw @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2001-2011,2013 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -27,7 +28,7 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2001-on * + * Author: Thomas E. Dickey 2001-on * ****************************************************************************/ /* LINTLIBRARY */ @@ -95,8 +96,6 @@ void _nc_scroll_oldhash( /* ./base/lib_addch.c */ -#include <ctype.h> - #undef _nc_render cchar_t _nc_render( WINDOW *win, @@ -221,7 +220,7 @@ int wchgat( WINDOW *win, int n, attr_t attr, - short color, + short pair_arg, const void *opts) { return(*(int *)0); } @@ -256,8 +255,6 @@ int wclrtoeol( /* ./base/lib_color.c */ -#include <tic.h> - #undef COLOR_PAIRS int COLOR_PAIRS; #undef COLORS @@ -281,6 +278,26 @@ int start_color_sp( 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, @@ -296,6 +313,15 @@ int init_pair( 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, @@ -348,6 +374,14 @@ int color_content( 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, @@ -380,12 +414,85 @@ void _nc_do_color( 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 color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } @@ -454,8 +561,6 @@ int flash(void) /* ./lib_gen.c */ -#include <ncurses_cfg.h> - #undef addch int (addch)( const chtype z) @@ -485,17 +590,17 @@ int (addstr)( #undef attroff int (attroff)( - int z) + NCURSES_ATTR_T z) { return(*(int *)0); } #undef attron int (attron)( - int z) + NCURSES_ATTR_T z) { return(*(int *)0); } #undef attrset int (attrset)( - int z) + NCURSES_ATTR_T z) { return(*(int *)0); } #undef attr_get @@ -1078,20 +1183,6 @@ int (vline)( int z) { return(*(int *)0); } -#undef vw_printw -int (vw_printw)( - WINDOW *a1, - const char *a2, - va_list z) - { return(*(int *)0); } - -#undef vw_scanw -int (vw_scanw)( - WINDOW *a1, - char *a2, - va_list z) - { return(*(int *)0); } - #undef waddchstr int (waddchstr)( WINDOW *a1, @@ -1292,6 +1383,11 @@ 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, @@ -1767,8 +1863,6 @@ NCURSES_BOOL (mouse_trafo)( /* ./base/lib_getch.c */ -#include <fifo_defs.h> - #undef ESCDELAY int ESCDELAY; @@ -2102,22 +2196,20 @@ void nofilter(void) #undef newterm_sp SCREEN *newterm_sp( SCREEN *sp, - char *name, + const char *name, FILE *ofp, FILE *ifp) { return(*(SCREEN **)0); } #undef newterm SCREEN *newterm( - char *name, + const char *name, FILE *ofp, FILE *ifp) { return(*(SCREEN **)0); } /* ./base/lib_newwin.c */ -#include "/usr/lib/gcc/x86_64-linux-gnu/4.4.5/include/stddef.h" - #undef _nc_freewin int _nc_freewin( WINDOW *win) @@ -2321,6 +2413,13 @@ int vwprintw( 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 @@ -2347,14 +2446,14 @@ int wnoutrefresh( #undef restartterm_sp int restartterm_sp( SCREEN *sp, - char *termp, + const char *termp, int filenum, int *errret) { return(*(int *)0); } #undef restartterm int restartterm( - char *termp, + const char *termp, int filenum, int *errret) { return(*(int *)0); } @@ -2364,20 +2463,27 @@ int restartterm( #undef vwscanw int vwscanw( WINDOW *win, - char *fmt, + 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( - char *fmt, + const char *fmt, ...) { return(*(int *)0); } #undef wscanw int wscanw( WINDOW *win, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -2385,7 +2491,7 @@ int wscanw( int mvscanw( int y, int x, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -2394,7 +2500,7 @@ int mvwscanw( WINDOW *win, int y, int x, - char *fmt, + const char *fmt, ...) { return(*(int *)0); } @@ -2583,14 +2689,14 @@ int slk_restore(void) int slk_attr_set_sp( SCREEN *sp, const attr_t attr, - short color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } #undef slk_attr_set int slk_attr_set( const attr_t attr, - short color_pair_number, + short pair_arg, void *opts) { return(*(int *)0); } @@ -2660,12 +2766,23 @@ int slk_clear(void) #undef slk_color_sp int slk_color_sp( SCREEN *sp, - short color_pair_number) + short pair_arg) { return(*(int *)0); } #undef slk_color int slk_color( - short color_pair_number) + 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 */ @@ -2716,8 +2833,6 @@ int slk_refresh(void) /* ./base/lib_slkset.c */ -#include <wctype.h> - #undef slk_set_sp int slk_set_sp( SCREEN *sp, @@ -2775,6 +2890,12 @@ void _tracedump( /* ./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, @@ -2794,8 +2915,6 @@ char *_tracemouse( /* ./tty/lib_tstp.c */ -#include <SigAction.h> - #undef _nc_signal_handler void _nc_signal_handler( int enable) @@ -2956,9 +3075,6 @@ char *_nc_printf_string( /* ./tty/tty_update.c */ -#include <sys/time.h> -#include <sys/times.h> - #undef doupdate_sp int doupdate_sp( SCREEN *sp) @@ -3025,10 +3141,6 @@ void _nc_do_xmc_glitch( /* ./trace/varargs.c */ -typedef enum { - atUnknown = 0, atInteger, atFloat, atPoint, atString -} ARGTYPE; - #undef _nc_varargs char *_nc_varargs( const char *fmt, @@ -3058,6 +3170,11 @@ void _nc_free_and_exit( int code) { /* void */ } +#undef exit_curses +void exit_curses( + int code) + { /* void */ } + /* ./widechar/charable.c */ #undef _nc_is_charable @@ -3111,7 +3228,7 @@ int setcchar( cchar_t *wcval, const wchar_t *wch, const attr_t attrs, - short color_pair, + short pair_arg, const void *opts) { return(*(int *)0); } @@ -3120,7 +3237,7 @@ int getcchar( const cchar_t *wcval, wchar_t *wch, attr_t *attrs, - short *color_pair, + short *pair_arg, void *opts) { return(*(int *)0); } @@ -3218,9 +3335,9 @@ int winwstr( /* ./widechar/lib_key_name.c */ #undef key_name -char *key_name( +const char *key_name( wchar_t c) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./widechar/lib_pecho_wchar.c */ @@ -3265,7 +3382,7 @@ int unget_wch( int vid_puts_sp( SCREEN *sp, attr_t newmode, - short pair, + short pair_arg, void *opts, NCURSES_OUTC_sp outc) { return(*(int *)0); } @@ -3273,7 +3390,7 @@ int vid_puts_sp( #undef vid_puts int vid_puts( attr_t newmode, - short pair, + short pair_arg, void *opts, NCURSES_OUTC outc) { return(*(int *)0); } @@ -3282,14 +3399,14 @@ int vid_puts( int vid_attr_sp( SCREEN *sp, attr_t newmode, - short pair, + short pair_arg, void *opts) { return(*(int *)0); } #undef vid_attr int vid_attr( attr_t newmode, - short pair, + short pair_arg, void *opts) { return(*(int *)0); } @@ -3432,6 +3549,72 @@ int mcprint( 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 @@ -3562,8 +3745,8 @@ int _nc_add_to_try( #undef _nc_align_termtype void _nc_align_termtype( - TERMTYPE *to, - TERMTYPE *from) + TERMTYPE2 *to, + TERMTYPE2 *from) { /* void */ } #undef _nc_copy_termtype @@ -3572,19 +3755,29 @@ void _nc_copy_termtype( 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 -char *const boolcodes[] = {0}; +const char *const boolcodes[] = {0}; #undef numcodes -char *const numcodes[] = {0}; +const char *const numcodes[] = {0}; #undef strcodes -char *const strcodes[] = {0}; +const char *const strcodes[] = {0}; /* ./comp_captab.c */ -#include <hashsize.h> - #undef _nc_get_table const struct name_table_entry *_nc_get_table( NCURSES_BOOL termcap) @@ -3666,9 +3859,22 @@ struct name_table_entry const *_nc_find_type_entry( NCURSES_BOOL termcap) { return(*(struct name_table_entry const **)0); } -/* ./tinfo/db_iterator.c */ +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } -#include <time.h> +/* ./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( @@ -3714,7 +3920,7 @@ ENTRY *_nc_tail; #undef _nc_free_entry void _nc_free_entry( ENTRY *headp, - TERMTYPE *tterm) + TERMTYPE2 *tterm) { /* void */ } #undef _nc_free_entries @@ -3722,18 +3928,22 @@ void _nc_free_entries( ENTRY *headp) { /* void */ } -#undef _nc_delink_entry -ENTRY *_nc_delink_entry( - ENTRY *headp, - TERMTYPE *tterm) - { return(*(ENTRY **)0); } - #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) @@ -3746,6 +3956,11 @@ void _nc_free_termtype( TERMTYPE *ptr) { /* void */ } +#undef _nc_free_termtype2 +void _nc_free_termtype2( + TERMTYPE2 *ptr) + { /* void */ } + #undef _nc_user_definable NCURSES_BOOL _nc_user_definable; @@ -3775,15 +3990,6 @@ char *_nc_home_terminfo(void) /* ./tinfo/init_keytry.c */ -#if 0 - -#include <init_keytry.h> - -#undef _nc_tinfo_fkeys -const struct tinfo_fkeys _nc_tinfo_fkeys[] = {0}; - -#endif - #undef _nc_init_keytry void _nc_init_keytry( SCREEN *sp) @@ -3805,11 +4011,9 @@ void _nc_init_acs(void) /* ./tinfo/lib_baudrate.c */ -#include <termcap.h> - struct speed { - int s; - int sp; + int given_speed; + int actual_speed; }; #undef _nc_baudrate @@ -3934,18 +4138,23 @@ int flushinp(void) struct kn { short offset; int code; }; #undef keyname_sp -char *keyname_sp( +const char *keyname_sp( SCREEN *sp, int c) - { return(*(char **)0); } + { return(*(const char **)0); } #undef keyname -char *keyname( +const char *keyname( int c) - { return(*(char **)0); } + { 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); } @@ -4135,10 +4344,6 @@ int intrflush( /* ./tinfo/lib_setup.c */ -#include <locale.h> -#include <sys/ioctl.h> -#include <langinfo.h> - #undef ttytype char ttytype[256]; #undef LINES @@ -4201,7 +4406,7 @@ void _nc_update_screensize( #undef _nc_setup_tinfo int _nc_setup_tinfo( const char *const tn, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } #undef _nc_tinfo_cmdch @@ -4225,7 +4430,7 @@ int _nc_locale_breaks_acs( #undef _nc_setupterm int _nc_setupterm( - char *tname, + const char *tname, int Filedes, int *errret, int reuse) @@ -4237,7 +4442,7 @@ SCREEN *new_prescr(void) #undef setupterm int setupterm( - char *tname, + const char *tname, int Filedes, int *errret) { return(*(int *)0); } @@ -4256,12 +4461,6 @@ int tgetent_sp( const char *name) { return(*(int *)0); } -#if 0 - -#include <capdefaults.c> - -#endif - #undef tgetent int tgetent( char *bufp, @@ -4271,35 +4470,35 @@ int tgetent( #undef tgetflag_sp int tgetflag_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetflag int tgetflag( - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum_sp int tgetnum_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum int tgetnum( - char *id) + const char *id) { return(*(int *)0); } #undef tgetstr_sp char *tgetstr_sp( SCREEN *sp, - char *id, + const char *id, char **area) { return(*(char **)0); } #undef tgetstr char *tgetstr( - char *id, + const char *id, char **area) { return(*(char **)0); } @@ -4328,34 +4527,34 @@ char *tgoto( #undef tigetflag_sp int tigetflag_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetflag int tigetflag( - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum_sp int tigetnum_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum int tigetnum( - char *str) + const char *str) { return(*(int *)0); } #undef tigetstr_sp char *tigetstr_sp( SCREEN *sp, - char *str) + const char *str) { return(*(char **)0); } #undef tigetstr char *tigetstr( - char *str) + const char *str) { return(*(char **)0); } /* ./tinfo/lib_tparm.c */ @@ -4372,7 +4571,7 @@ int _nc_tparm_analyze( #undef tparm char *tparm( - char *string, + const char *string, ...) { return(*(char **)0); } @@ -4493,6 +4692,11 @@ 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) @@ -4535,9 +4739,9 @@ const char *_nc_retrace_cptr( { return(*(const char **)0); } #undef _nc_retrace_cvoid_ptr -void *_nc_retrace_cvoid_ptr( - void *code) - { return(*(void **)0); } +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } #undef _nc_retrace_void_ptr void *_nc_retrace_void_ptr( @@ -4554,6 +4758,13 @@ 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 @@ -4612,11 +4823,6 @@ char *_tracecchar_t( /* ./trace/lib_tracebits.c */ -typedef struct { - unsigned int val; - const char *name; -} BITNAMES; - #undef _nc_trace_ttymode char *_nc_trace_ttymode( struct termios *tty) @@ -4744,17 +4950,17 @@ int _nc_name_match( /* ./names.c */ #undef boolnames -char *const boolnames[] = {0}; +const char *const boolnames[] = {0}; #undef boolfnames -char *const boolfnames[] = {0}; +const char *const boolfnames[] = {0}; #undef numnames -char *const numnames[] = {0}; +const char *const numnames[] = {0}; #undef numfnames -char *const numfnames[] = {0}; +const char *const numfnames[] = {0}; #undef strnames -char *const strnames[] = {0}; +const char *const strnames[] = {0}; #undef strfnames -char *const strfnames[] = {0}; +const char *const strfnames[] = {0}; /* ./tinfo/obsolete.c */ @@ -4773,16 +4979,14 @@ void _nc_set_buffer( /* ./tinfo/read_entry.c */ -#include <hashed_db.h> - #undef _nc_init_termtype void _nc_init_termtype( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } #undef _nc_read_termtype int _nc_read_termtype( - TERMTYPE *ptr, + TERMTYPE2 *ptr, char *buffer, int limit) { return(*(int *)0); } @@ -4790,7 +4994,14 @@ int _nc_read_termtype( #undef _nc_read_file_entry int _nc_read_file_entry( const char *const filename, - TERMTYPE *ptr) + 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 @@ -4802,11 +5013,11 @@ int _nc_read_entry( /* ./tinfo/read_termcap.c */ -#include <sys/types.h> - -#undef _nc_read_termcap -void _nc_read_termcap(void) - { /* void */ } +#undef _nc_read_termcap_entry +int _nc_read_termcap_entry( + const char *const tn, + TERMTYPE2 *const tp) + { return(*(int *)0); } /* ./tinfo/strings.c */ @@ -4888,21 +5099,21 @@ int _nc_remove_string( #undef _nc_trim_sgr0 char *_nc_trim_sgr0( - TERMTYPE *tp) + TERMTYPE2 *tp) { return(*(char **)0); } /* ./unctrl.c */ #undef unctrl_sp -char *unctrl_sp( +const char *unctrl_sp( SCREEN *sp, chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } #undef unctrl -char *unctrl( +const char *unctrl( chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./trace/visbuf.c */ @@ -4962,7 +5173,7 @@ const char *_nc_viscbuf( #undef _nc_init_entry void _nc_init_entry( - TERMTYPE *const tp) + ENTRY *const tp) { /* void */ } #undef _nc_copy_entry @@ -4983,8 +5194,8 @@ void _nc_wrap_entry( #undef _nc_merge_entry void _nc_merge_entry( - TERMTYPE *const to, - TERMTYPE *const from) + ENTRY *const target, + ENTRY *const source) { /* void */ } /* ./tinfo/captoinfo.c */ @@ -5016,11 +5227,8 @@ char *_nc_tic_expand( #undef _nc_check_termtype2 void (*_nc_check_termtype2)( - TERMTYPE *p1, + TERMTYPE2 *p1, NCURSES_BOOL p2); -#undef _nc_check_termtype -void (*_nc_check_termtype)( - TERMTYPE *p1); #undef _nc_entry_match NCURSES_BOOL _nc_entry_match( @@ -5044,11 +5252,6 @@ int _nc_resolve_uses2( NCURSES_BOOL literal) { return(*(int *)0); } -#undef _nc_resolve_uses -int _nc_resolve_uses( - NCURSES_BOOL fullresolve) - { return(*(int *)0); } - /* ./tinfo/comp_scan.c */ #undef _nc_syntax @@ -5099,7 +5302,7 @@ void _nc_panic_mode( #undef _nc_parse_entry int _nc_parse_entry( - struct entry *entryp, + ENTRY *entryp, int literal, NCURSES_BOOL silent) { return(*(int *)0); } @@ -5110,23 +5313,26 @@ int _nc_capcmp( const char *t) { return(*(int *)0); } -typedef struct { - const char *from; - const char *to; -} assoc; - /* ./tinfo/write_entry.c */ #undef _nc_set_writedir void _nc_set_writedir( - char *dir) + const char *dir) { /* void */ } #undef _nc_write_entry void _nc_write_entry( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + #undef _nc_tic_written int _nc_tic_written(void) { return(*(int *)0); } diff --git a/ncurses/llib-ltic b/ncurses/llib-ltic index 981bb19..6ea2714 100644 --- a/ncurses/llib-ltic +++ b/ncurses/llib-ltic @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2012 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -27,18 +28,17 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2012 * + * Author: Thomas E. Dickey 2012-on * ****************************************************************************/ /* LINTLIBRARY */ /* ./tinfo/alloc_entry.c */ #include <curses.priv.h> -#include <tic.h> #undef _nc_init_entry void _nc_init_entry( - TERMTYPE *const tp) + ENTRY *const tp) { /* void */ } #undef _nc_copy_entry @@ -59,14 +59,12 @@ void _nc_wrap_entry( #undef _nc_merge_entry void _nc_merge_entry( - TERMTYPE *const to, - TERMTYPE *const from) + ENTRY *const target, + ENTRY *const source) { /* void */ } /* ./tinfo/captoinfo.c */ -#include <ctype.h> - #undef _nc_captoinfo char *_nc_captoinfo( const char *cap, @@ -94,11 +92,8 @@ char *_nc_tic_expand( #undef _nc_check_termtype2 void (*_nc_check_termtype2)( - TERMTYPE *p1, + TERMTYPE2 *p1, NCURSES_BOOL p2); -#undef _nc_check_termtype -void (*_nc_check_termtype)( - TERMTYPE *p1); #undef _nc_entry_match NCURSES_BOOL _nc_entry_match( @@ -122,11 +117,6 @@ int _nc_resolve_uses2( NCURSES_BOOL literal) { return(*(int *)0); } -#undef _nc_resolve_uses -int _nc_resolve_uses( - NCURSES_BOOL fullresolve) - { return(*(int *)0); } - /* ./tinfo/comp_scan.c */ #undef _nc_syntax @@ -177,7 +167,7 @@ void _nc_panic_mode( #undef _nc_parse_entry int _nc_parse_entry( - struct entry *entryp, + ENTRY *entryp, int literal, NCURSES_BOOL silent) { return(*(int *)0); } @@ -188,25 +178,26 @@ int _nc_capcmp( const char *t) { return(*(int *)0); } -typedef struct { - const char *from; - const char *to; -} assoc; - /* ./tinfo/write_entry.c */ -#include <hashed_db.h> - #undef _nc_set_writedir void _nc_set_writedir( - char *dir) + const char *dir) { /* void */ } #undef _nc_write_entry void _nc_write_entry( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + #undef _nc_tic_written int _nc_tic_written(void) { return(*(int *)0); } diff --git a/ncurses/llib-ltict b/ncurses/llib-ltict index 8371c18..e1625df 100644 --- a/ncurses/llib-ltict +++ b/ncurses/llib-ltict @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2013 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -27,18 +28,17 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2013 * + * Author: Thomas E. Dickey 2013-on * ****************************************************************************/ /* LINTLIBRARY */ /* ./tinfo/alloc_entry.c */ #include <curses.priv.h> -#include <tic.h> #undef _nc_init_entry void _nc_init_entry( - TERMTYPE *const tp) + ENTRY *const tp) { /* void */ } #undef _nc_copy_entry @@ -59,14 +59,12 @@ void _nc_wrap_entry( #undef _nc_merge_entry void _nc_merge_entry( - TERMTYPE *const to, - TERMTYPE *const from) + ENTRY *const target, + ENTRY *const source) { /* void */ } /* ./tinfo/captoinfo.c */ -#include <ctype.h> - #undef _nc_captoinfo char *_nc_captoinfo( const char *cap, @@ -94,11 +92,8 @@ char *_nc_tic_expand( #undef _nc_check_termtype2 void (*_nc_check_termtype2)( - TERMTYPE *p1, + TERMTYPE2 *p1, NCURSES_BOOL p2); -#undef _nc_check_termtype -void (*_nc_check_termtype)( - TERMTYPE *p1); #undef _nc_entry_match NCURSES_BOOL _nc_entry_match( @@ -122,11 +117,6 @@ int _nc_resolve_uses2( NCURSES_BOOL literal) { return(*(int *)0); } -#undef _nc_resolve_uses -int _nc_resolve_uses( - NCURSES_BOOL fullresolve) - { return(*(int *)0); } - /* ./tinfo/comp_scan.c */ #undef _nc_syntax @@ -177,7 +167,7 @@ void _nc_panic_mode( #undef _nc_parse_entry int _nc_parse_entry( - struct entry *entryp, + ENTRY *entryp, int literal, NCURSES_BOOL silent) { return(*(int *)0); } @@ -188,25 +178,26 @@ int _nc_capcmp( const char *t) { return(*(int *)0); } -typedef struct { - const char *from; - const char *to; -} assoc; - /* ./tinfo/write_entry.c */ -#include <hashed_db.h> - #undef _nc_set_writedir void _nc_set_writedir( - char *dir) + const char *dir) { /* void */ } #undef _nc_write_entry void _nc_write_entry( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + #undef _nc_tic_written int _nc_tic_written(void) { return(*(int *)0); } diff --git a/ncurses/llib-ltictw b/ncurses/llib-ltictw index 981bb19..6ea2714 100644 --- a/ncurses/llib-ltictw +++ b/ncurses/llib-ltictw @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2012 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -27,18 +28,17 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2012 * + * Author: Thomas E. Dickey 2012-on * ****************************************************************************/ /* LINTLIBRARY */ /* ./tinfo/alloc_entry.c */ #include <curses.priv.h> -#include <tic.h> #undef _nc_init_entry void _nc_init_entry( - TERMTYPE *const tp) + ENTRY *const tp) { /* void */ } #undef _nc_copy_entry @@ -59,14 +59,12 @@ void _nc_wrap_entry( #undef _nc_merge_entry void _nc_merge_entry( - TERMTYPE *const to, - TERMTYPE *const from) + ENTRY *const target, + ENTRY *const source) { /* void */ } /* ./tinfo/captoinfo.c */ -#include <ctype.h> - #undef _nc_captoinfo char *_nc_captoinfo( const char *cap, @@ -94,11 +92,8 @@ char *_nc_tic_expand( #undef _nc_check_termtype2 void (*_nc_check_termtype2)( - TERMTYPE *p1, + TERMTYPE2 *p1, NCURSES_BOOL p2); -#undef _nc_check_termtype -void (*_nc_check_termtype)( - TERMTYPE *p1); #undef _nc_entry_match NCURSES_BOOL _nc_entry_match( @@ -122,11 +117,6 @@ int _nc_resolve_uses2( NCURSES_BOOL literal) { return(*(int *)0); } -#undef _nc_resolve_uses -int _nc_resolve_uses( - NCURSES_BOOL fullresolve) - { return(*(int *)0); } - /* ./tinfo/comp_scan.c */ #undef _nc_syntax @@ -177,7 +167,7 @@ void _nc_panic_mode( #undef _nc_parse_entry int _nc_parse_entry( - struct entry *entryp, + ENTRY *entryp, int literal, NCURSES_BOOL silent) { return(*(int *)0); } @@ -188,25 +178,26 @@ int _nc_capcmp( const char *t) { return(*(int *)0); } -typedef struct { - const char *from; - const char *to; -} assoc; - /* ./tinfo/write_entry.c */ -#include <hashed_db.h> - #undef _nc_set_writedir void _nc_set_writedir( - char *dir) + const char *dir) { /* void */ } #undef _nc_write_entry void _nc_write_entry( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + #undef _nc_tic_written int _nc_tic_written(void) { return(*(int *)0); } diff --git a/ncurses/llib-lticw b/ncurses/llib-lticw index 981bb19..6ea2714 100644 --- a/ncurses/llib-lticw +++ b/ncurses/llib-lticw @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2012 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -27,18 +28,17 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2012 * + * Author: Thomas E. Dickey 2012-on * ****************************************************************************/ /* LINTLIBRARY */ /* ./tinfo/alloc_entry.c */ #include <curses.priv.h> -#include <tic.h> #undef _nc_init_entry void _nc_init_entry( - TERMTYPE *const tp) + ENTRY *const tp) { /* void */ } #undef _nc_copy_entry @@ -59,14 +59,12 @@ void _nc_wrap_entry( #undef _nc_merge_entry void _nc_merge_entry( - TERMTYPE *const to, - TERMTYPE *const from) + ENTRY *const target, + ENTRY *const source) { /* void */ } /* ./tinfo/captoinfo.c */ -#include <ctype.h> - #undef _nc_captoinfo char *_nc_captoinfo( const char *cap, @@ -94,11 +92,8 @@ char *_nc_tic_expand( #undef _nc_check_termtype2 void (*_nc_check_termtype2)( - TERMTYPE *p1, + TERMTYPE2 *p1, NCURSES_BOOL p2); -#undef _nc_check_termtype -void (*_nc_check_termtype)( - TERMTYPE *p1); #undef _nc_entry_match NCURSES_BOOL _nc_entry_match( @@ -122,11 +117,6 @@ int _nc_resolve_uses2( NCURSES_BOOL literal) { return(*(int *)0); } -#undef _nc_resolve_uses -int _nc_resolve_uses( - NCURSES_BOOL fullresolve) - { return(*(int *)0); } - /* ./tinfo/comp_scan.c */ #undef _nc_syntax @@ -177,7 +167,7 @@ void _nc_panic_mode( #undef _nc_parse_entry int _nc_parse_entry( - struct entry *entryp, + ENTRY *entryp, int literal, NCURSES_BOOL silent) { return(*(int *)0); } @@ -188,25 +178,26 @@ int _nc_capcmp( const char *t) { return(*(int *)0); } -typedef struct { - const char *from; - const char *to; -} assoc; - /* ./tinfo/write_entry.c */ -#include <hashed_db.h> - #undef _nc_set_writedir void _nc_set_writedir( - char *dir) + const char *dir) { /* void */ } #undef _nc_write_entry void _nc_write_entry( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + #undef _nc_tic_written int _nc_tic_written(void) { return(*(int *)0); } diff --git a/ncurses/llib-ltinfo b/ncurses/llib-ltinfo index 79ac229..27680ca 100644 --- a/ncurses/llib-ltinfo +++ b/ncurses/llib-ltinfo @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2012,2013 Free Software Foundation, Inc. * + * Copyright 2019,2020 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 * @@ -27,15 +28,13 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2012 * + * Author: Thomas E. Dickey 2012-on * ****************************************************************************/ /* LINTLIBRARY */ /* ./tinfo/access.c */ #include <curses.priv.h> -#include <ctype.h> -#include <tic.h> #undef _nc_rootname char *_nc_rootname( @@ -90,8 +89,8 @@ int _nc_add_to_try( #undef _nc_align_termtype void _nc_align_termtype( - TERMTYPE *to, - TERMTYPE *from) + TERMTYPE2 *to, + TERMTYPE2 *from) { /* void */ } #undef _nc_copy_termtype @@ -103,16 +102,14 @@ void _nc_copy_termtype( /* ./codes.c */ #undef boolcodes -char *const boolcodes[] = {0}; +const char *const boolcodes[] = {0}; #undef numcodes -char *const numcodes[] = {0}; +const char *const numcodes[] = {0}; #undef strcodes -char *const strcodes[] = {0}; +const char *const strcodes[] = {0}; /* ./comp_captab.c */ -#include <hashsize.h> - #undef _nc_get_table const struct name_table_entry *_nc_get_table( NCURSES_BOOL termcap) @@ -194,9 +191,22 @@ struct name_table_entry const *_nc_find_type_entry( NCURSES_BOOL termcap) { return(*(struct name_table_entry const **)0); } -/* ./tinfo/db_iterator.c */ +#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); } -#include <time.h> +/* ./tinfo/db_iterator.c */ #undef _nc_tic_dir const char *_nc_tic_dir( @@ -242,7 +252,7 @@ ENTRY *_nc_tail; #undef _nc_free_entry void _nc_free_entry( ENTRY *headp, - TERMTYPE *tterm) + TERMTYPE2 *tterm) { /* void */ } #undef _nc_free_entries @@ -250,12 +260,6 @@ void _nc_free_entries( ENTRY *headp) { /* void */ } -#undef _nc_delink_entry -ENTRY *_nc_delink_entry( - ENTRY *headp, - TERMTYPE *tterm) - { return(*(ENTRY **)0); } - #undef _nc_leaks_tinfo void _nc_leaks_tinfo(void) { /* void */ } @@ -263,9 +267,9 @@ void _nc_leaks_tinfo(void) /* ./fallback.c */ #undef _nc_fallback -const TERMTYPE *_nc_fallback( +const TERMTYPE2 *_nc_fallback( const char *name) - { return(*(const TERMTYPE **)0); } + { return(*(const TERMTYPE2 **)0); } /* ./tinfo/free_ttype.c */ @@ -303,15 +307,6 @@ char *_nc_home_terminfo(void) /* ./tinfo/init_keytry.c */ -#if 0 - -#include <init_keytry.h> - -#undef _nc_tinfo_fkeys -const struct tinfo_fkeys _nc_tinfo_fkeys[] = {0}; - -#endif - #undef _nc_init_keytry void _nc_init_keytry( SCREEN *sp) @@ -333,11 +328,9 @@ void _nc_init_acs(void) /* ./tinfo/lib_baudrate.c */ -#include <termcap.h> - struct speed { - int s; - int sp; + int given_speed; + int actual_speed; }; #undef _nc_baudrate @@ -462,26 +455,29 @@ int flushinp(void) struct kn { short offset; int code; }; #undef keyname_sp -char *keyname_sp( +const char *keyname_sp( SCREEN *sp, int c) - { return(*(char **)0); } + { return(*(const char **)0); } #undef keyname -char *keyname( +const char *keyname( int c) - { return(*(char **)0); } + { 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 */ -#include <sys/time.h> - #undef napms_sp int napms_sp( SCREEN *sp, @@ -665,10 +661,6 @@ int intrflush( /* ./tinfo/lib_setup.c */ -#include <locale.h> -#include <sys/ioctl.h> -#include <langinfo.h> - #undef ttytype char ttytype[256]; #undef LINES @@ -731,7 +723,7 @@ void _nc_update_screensize( #undef _nc_setup_tinfo int _nc_setup_tinfo( const char *const tn, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } #undef _nc_tinfo_cmdch @@ -755,7 +747,7 @@ int _nc_locale_breaks_acs( #undef _nc_setupterm int _nc_setupterm( - char *tname, + const char *tname, int Filedes, int *errret, int reuse) @@ -767,7 +759,7 @@ SCREEN *new_prescr(void) #undef setupterm int setupterm( - char *tname, + const char *tname, int Filedes, int *errret) { return(*(int *)0); } @@ -786,12 +778,6 @@ int tgetent_sp( const char *name) { return(*(int *)0); } -#if 0 - -#include <capdefaults.c> - -#endif - #undef tgetent int tgetent( char *bufp, @@ -801,35 +787,35 @@ int tgetent( #undef tgetflag_sp int tgetflag_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetflag int tgetflag( - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum_sp int tgetnum_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum int tgetnum( - char *id) + const char *id) { return(*(int *)0); } #undef tgetstr_sp char *tgetstr_sp( SCREEN *sp, - char *id, + const char *id, char **area) { return(*(char **)0); } #undef tgetstr char *tgetstr( - char *id, + const char *id, char **area) { return(*(char **)0); } @@ -858,34 +844,34 @@ char *tgoto( #undef tigetflag_sp int tigetflag_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetflag int tigetflag( - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum_sp int tigetnum_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum int tigetnum( - char *str) + const char *str) { return(*(int *)0); } #undef tigetstr_sp char *tigetstr_sp( SCREEN *sp, - char *str) + const char *str) { return(*(char **)0); } #undef tigetstr char *tigetstr( - char *str) + const char *str) { return(*(char **)0); } /* ./tinfo/lib_tparm.c */ @@ -902,7 +888,7 @@ int _nc_tparm_analyze( #undef tparm char *tparm( - char *string, + const char *string, ...) { return(*(char **)0); } @@ -1065,9 +1051,9 @@ const char *_nc_retrace_cptr( { return(*(const char **)0); } #undef _nc_retrace_cvoid_ptr -void *_nc_retrace_cvoid_ptr( - void *code) - { return(*(void **)0); } +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } #undef _nc_retrace_void_ptr void *_nc_retrace_void_ptr( @@ -1084,6 +1070,13 @@ 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 @@ -1131,11 +1124,6 @@ chtype _nc_retrace_chtype( /* ./trace/lib_tracebits.c */ -typedef struct { - unsigned int val; - const char *name; -} BITNAMES; - #undef _nc_trace_ttymode char *_nc_trace_ttymode( struct termios *tty) @@ -1263,17 +1251,17 @@ int _nc_name_match( /* ./names.c */ #undef boolnames -char *const boolnames[] = {0}; +const char *const boolnames[] = {0}; #undef boolfnames -char *const boolfnames[] = {0}; +const char *const boolfnames[] = {0}; #undef numnames -char *const numnames[] = {0}; +const char *const numnames[] = {0}; #undef numfnames -char *const numfnames[] = {0}; +const char *const numfnames[] = {0}; #undef strnames -char *const strnames[] = {0}; +const char *const strnames[] = {0}; #undef strfnames -char *const strfnames[] = {0}; +const char *const strfnames[] = {0}; /* ./tinfo/obsolete.c */ @@ -1292,16 +1280,14 @@ void _nc_set_buffer( /* ./tinfo/read_entry.c */ -#include <hashed_db.h> - #undef _nc_init_termtype void _nc_init_termtype( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } #undef _nc_read_termtype int _nc_read_termtype( - TERMTYPE *ptr, + TERMTYPE2 *ptr, char *buffer, int limit) { return(*(int *)0); } @@ -1309,20 +1295,18 @@ int _nc_read_termtype( #undef _nc_read_file_entry int _nc_read_file_entry( const char *const filename, - TERMTYPE *ptr) + TERMTYPE2 *ptr) { return(*(int *)0); } #undef _nc_read_entry int _nc_read_entry( const char *const name, char *const filename, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } /* ./tinfo/read_termcap.c */ -#include <sys/types.h> - #undef _nc_read_termcap void _nc_read_termcap(void) { /* void */ } @@ -1407,21 +1391,21 @@ int _nc_remove_string( #undef _nc_trim_sgr0 char *_nc_trim_sgr0( - TERMTYPE *tp) + TERMTYPE2 *tp) { return(*(char **)0); } /* ./unctrl.c */ #undef unctrl_sp -char *unctrl_sp( +const char *unctrl_sp( SCREEN *sp, chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } #undef unctrl -char *unctrl( +const char *unctrl( chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./trace/visbuf.c */ diff --git a/ncurses/llib-ltinfot b/ncurses/llib-ltinfot index 4f66f6a..8ac9fac 100644 --- a/ncurses/llib-ltinfot +++ b/ncurses/llib-ltinfot @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2013 Free Software Foundation, Inc. * + * Copyright 2019,2020 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 * @@ -27,15 +28,13 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2013 * + * Author: Thomas E. Dickey 2013-on * ****************************************************************************/ /* LINTLIBRARY */ /* ./tinfo/access.c */ #include <curses.priv.h> -#include <ctype.h> -#include <tic.h> #undef _nc_rootname char *_nc_rootname( @@ -90,8 +89,8 @@ int _nc_add_to_try( #undef _nc_align_termtype void _nc_align_termtype( - TERMTYPE *to, - TERMTYPE *from) + TERMTYPE2 *to, + TERMTYPE2 *from) { /* void */ } #undef _nc_copy_termtype @@ -103,21 +102,19 @@ void _nc_copy_termtype( /* ./codes.c */ #undef _nc_boolcodes -char *const *_nc_boolcodes(void) - { return(*(char **)0); } +const char *const *_nc_boolcodes(void) + { return(*(const char **)0); } #undef _nc_numcodes -char *const *_nc_numcodes(void) - { return(*(char **)0); } +const char *const *_nc_numcodes(void) + { return(*(const char **)0); } #undef _nc_strcodes -char *const *_nc_strcodes(void) - { return(*(char **)0); } +const char *const *_nc_strcodes(void) + { return(*(const char **)0); } /* ./comp_captab.c */ -#include <hashsize.h> - #undef _nc_get_table const struct name_table_entry *_nc_get_table( NCURSES_BOOL termcap) @@ -199,9 +196,22 @@ struct name_table_entry const *_nc_find_type_entry( NCURSES_BOOL termcap) { return(*(struct name_table_entry const **)0); } -/* ./tinfo/db_iterator.c */ +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } -#include <time.h> +/* ./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( @@ -247,7 +257,7 @@ ENTRY *_nc_tail; #undef _nc_free_entry void _nc_free_entry( ENTRY *headp, - TERMTYPE *tterm) + TERMTYPE2 *tterm) { /* void */ } #undef _nc_free_entries @@ -255,12 +265,6 @@ void _nc_free_entries( ENTRY *headp) { /* void */ } -#undef _nc_delink_entry -ENTRY *_nc_delink_entry( - ENTRY *headp, - TERMTYPE *tterm) - { return(*(ENTRY **)0); } - #undef _nc_leaks_tinfo void _nc_leaks_tinfo(void) { /* void */ } @@ -268,9 +272,9 @@ void _nc_leaks_tinfo(void) /* ./fallback.c */ #undef _nc_fallback -const TERMTYPE *_nc_fallback( +const TERMTYPE2 *_nc_fallback( const char *name) - { return(*(const TERMTYPE **)0); } + { return(*(const TERMTYPE2 **)0); } /* ./tinfo/free_ttype.c */ @@ -308,15 +312,6 @@ char *_nc_home_terminfo(void) /* ./tinfo/init_keytry.c */ -#if 0 - -#include <init_keytry.h> - -#undef _nc_tinfo_fkeys -const struct tinfo_fkeys _nc_tinfo_fkeys[] = {0}; - -#endif - #undef _nc_init_keytry void _nc_init_keytry( SCREEN *sp) @@ -339,11 +334,9 @@ void _nc_init_acs(void) /* ./tinfo/lib_baudrate.c */ -#include <termcap.h> - struct speed { - int s; - int sp; + int given_speed; + int actual_speed; }; #undef _nc_baudrate @@ -508,15 +501,15 @@ int flushinp(void) struct kn { short offset; int code; }; #undef keyname_sp -char *keyname_sp( +const char *keyname_sp( SCREEN *sp, int c) - { return(*(char **)0); } + { return(*(const char **)0); } #undef keyname -char *keyname( +const char *keyname( int c) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./tinfo/lib_longname.c */ @@ -714,10 +707,6 @@ int intrflush( /* ./tinfo/lib_setup.c */ -#include <locale.h> -#include <sys/ioctl.h> -#include <langinfo.h> - #undef _nc_ttytype char *_nc_ttytype(void) { return(*(char **)0); } @@ -802,7 +791,7 @@ void _nc_update_screensize( #undef _nc_setup_tinfo int _nc_setup_tinfo( const char *const tn, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } #undef _nc_tinfo_cmdch @@ -826,19 +815,27 @@ int _nc_locale_breaks_acs( #undef _nc_setupterm int _nc_setupterm( - char *tname, + 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( - char *tname, + const char *tname, int Filedes, int *errret) { return(*(int *)0); } @@ -857,12 +854,6 @@ int tgetent_sp( const char *name) { return(*(int *)0); } -#if 0 - -#include <capdefaults.c> - -#endif - #undef tgetent int tgetent( char *bufp, @@ -872,35 +863,35 @@ int tgetent( #undef tgetflag_sp int tgetflag_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetflag int tgetflag( - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum_sp int tgetnum_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum int tgetnum( - char *id) + const char *id) { return(*(int *)0); } #undef tgetstr_sp char *tgetstr_sp( SCREEN *sp, - char *id, + const char *id, char **area) { return(*(char **)0); } #undef tgetstr char *tgetstr( - char *id, + const char *id, char **area) { return(*(char **)0); } @@ -929,34 +920,34 @@ char *tgoto( #undef tigetflag_sp int tigetflag_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetflag int tigetflag( - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum_sp int tigetnum_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum int tigetnum( - char *str) + const char *str) { return(*(int *)0); } #undef tigetstr_sp char *tigetstr_sp( SCREEN *sp, - char *str) + const char *str) { return(*(char **)0); } #undef tigetstr char *tigetstr( - char *str) + const char *str) { return(*(char **)0); } /* ./tinfo/lib_tparm.c */ @@ -973,7 +964,7 @@ int _nc_tparm_analyze( #undef tparm char *tparm( - char *string, + const char *string, ...) { return(*(char **)0); } @@ -1150,9 +1141,9 @@ const char *_nc_retrace_cptr( { return(*(const char **)0); } #undef _nc_retrace_cvoid_ptr -void *_nc_retrace_cvoid_ptr( - void *code) - { return(*(void **)0); } +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } #undef _nc_retrace_void_ptr void *_nc_retrace_void_ptr( @@ -1169,6 +1160,13 @@ 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) @@ -1227,11 +1225,6 @@ chtype _nc_retrace_chtype( /* ./trace/lib_tracebits.c */ -typedef struct { - unsigned int val; - const char *name; -} BITNAMES; - #undef _nc_trace_ttymode char *_nc_trace_ttymode( struct termios *tty) @@ -1334,8 +1327,6 @@ int resetty(void) /* ./tty/lib_twait.c */ -#include <sys/time.h> - #undef _nc_timed_wait int _nc_timed_wait( SCREEN *sp, @@ -1361,28 +1352,28 @@ int _nc_name_match( /* ./names.c */ #undef _nc_boolnames -char *const *_nc_boolnames(void) - { return(*(char **)0); } +const char *const *_nc_boolnames(void) + { return(*(const char **)0); } #undef _nc_boolfnames -char *const *_nc_boolfnames(void) - { return(*(char **)0); } +const char *const *_nc_boolfnames(void) + { return(*(const char **)0); } #undef _nc_numnames -char *const *_nc_numnames(void) - { return(*(char **)0); } +const char *const *_nc_numnames(void) + { return(*(const char **)0); } #undef _nc_numfnames -char *const *_nc_numfnames(void) - { return(*(char **)0); } +const char *const *_nc_numfnames(void) + { return(*(const char **)0); } #undef _nc_strnames -char *const *_nc_strnames(void) - { return(*(char **)0); } +const char *const *_nc_strnames(void) + { return(*(const char **)0); } #undef _nc_strfnames -char *const *_nc_strfnames(void) - { return(*(char **)0); } +const char *const *_nc_strfnames(void) + { return(*(const char **)0); } /* ./tinfo/obsolete.c */ @@ -1401,16 +1392,14 @@ void _nc_set_buffer( /* ./tinfo/read_entry.c */ -#include <hashed_db.h> - #undef _nc_init_termtype void _nc_init_termtype( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } #undef _nc_read_termtype int _nc_read_termtype( - TERMTYPE *ptr, + TERMTYPE2 *ptr, char *buffer, int limit) { return(*(int *)0); } @@ -1418,20 +1407,18 @@ int _nc_read_termtype( #undef _nc_read_file_entry int _nc_read_file_entry( const char *const filename, - TERMTYPE *ptr) + TERMTYPE2 *ptr) { return(*(int *)0); } #undef _nc_read_entry int _nc_read_entry( const char *const name, char *const filename, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } /* ./tinfo/read_termcap.c */ -#include <sys/types.h> - #undef _nc_read_termcap void _nc_read_termcap(void) { /* void */ } @@ -1516,21 +1503,21 @@ int _nc_remove_string( #undef _nc_trim_sgr0 char *_nc_trim_sgr0( - TERMTYPE *tp) + TERMTYPE2 *tp) { return(*(char **)0); } /* ./unctrl.c */ #undef unctrl_sp -char *unctrl_sp( +const char *unctrl_sp( SCREEN *sp, chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } #undef unctrl -char *unctrl( +const char *unctrl( chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./trace/visbuf.c */ diff --git a/ncurses/llib-ltinfotw b/ncurses/llib-ltinfotw index ec9b63d..7011dbe 100644 --- a/ncurses/llib-ltinfotw +++ b/ncurses/llib-ltinfotw @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2012,2013 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -27,15 +28,13 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2012 * + * Author: Thomas E. Dickey 2012-on * ****************************************************************************/ /* LINTLIBRARY */ /* ./tinfo/access.c */ #include <curses.priv.h> -#include <ctype.h> -#include <tic.h> #undef _nc_rootname char *_nc_rootname( @@ -90,8 +89,8 @@ int _nc_add_to_try( #undef _nc_align_termtype void _nc_align_termtype( - TERMTYPE *to, - TERMTYPE *from) + TERMTYPE2 *to, + TERMTYPE2 *from) { /* void */ } #undef _nc_copy_termtype @@ -100,24 +99,34 @@ void _nc_copy_termtype( 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 -char *const *_nc_boolcodes(void) - { return(*(char **)0); } +const char *const *_nc_boolcodes(void) + { return(*(const char **)0); } #undef _nc_numcodes -char *const *_nc_numcodes(void) - { return(*(char **)0); } +const char *const *_nc_numcodes(void) + { return(*(const char **)0); } #undef _nc_strcodes -char *const *_nc_strcodes(void) - { return(*(char **)0); } +const char *const *_nc_strcodes(void) + { return(*(const char **)0); } /* ./comp_captab.c */ -#include <hashsize.h> - #undef _nc_get_table const struct name_table_entry *_nc_get_table( NCURSES_BOOL termcap) @@ -199,9 +208,22 @@ struct name_table_entry const *_nc_find_type_entry( NCURSES_BOOL termcap) { return(*(struct name_table_entry const **)0); } -/* ./tinfo/db_iterator.c */ +#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 */ -#include <time.h> +#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( @@ -247,7 +269,7 @@ ENTRY *_nc_tail; #undef _nc_free_entry void _nc_free_entry( ENTRY *headp, - TERMTYPE *tterm) + TERMTYPE2 *tterm) { /* void */ } #undef _nc_free_entries @@ -255,18 +277,17 @@ void _nc_free_entries( ENTRY *headp) { /* void */ } -#undef _nc_delink_entry -ENTRY *_nc_delink_entry( - ENTRY *headp, - TERMTYPE *tterm) - { return(*(ENTRY **)0); } - #undef _nc_leaks_tinfo void _nc_leaks_tinfo(void) { /* 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) @@ -279,6 +300,11 @@ void _nc_free_termtype( TERMTYPE *ptr) { /* void */ } +#undef _nc_free_termtype2 +void _nc_free_termtype2( + TERMTYPE2 *ptr) + { /* void */ } + #undef _nc_user_definable NCURSES_BOOL _nc_user_definable; @@ -308,15 +334,6 @@ char *_nc_home_terminfo(void) /* ./tinfo/init_keytry.c */ -#if 0 - -#include <init_keytry.h> - -#undef _nc_tinfo_fkeys -const struct tinfo_fkeys _nc_tinfo_fkeys[] = {0}; - -#endif - #undef _nc_init_keytry void _nc_init_keytry( SCREEN *sp) @@ -339,11 +356,9 @@ void _nc_init_acs(void) /* ./tinfo/lib_baudrate.c */ -#include <termcap.h> - struct speed { - int s; - int sp; + int given_speed; + int actual_speed; }; #undef _nc_baudrate @@ -508,15 +523,15 @@ int flushinp(void) struct kn { short offset; int code; }; #undef keyname_sp -char *keyname_sp( +const char *keyname_sp( SCREEN *sp, int c) - { return(*(char **)0); } + { return(*(const char **)0); } #undef keyname -char *keyname( +const char *keyname( int c) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./tinfo/lib_longname.c */ @@ -714,10 +729,6 @@ int intrflush( /* ./tinfo/lib_setup.c */ -#include <locale.h> -#include <sys/ioctl.h> -#include <langinfo.h> - #undef _nc_ttytype char *_nc_ttytype(void) { return(*(char **)0); } @@ -802,7 +813,7 @@ void _nc_update_screensize( #undef _nc_setup_tinfo int _nc_setup_tinfo( const char *const tn, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } #undef _nc_tinfo_cmdch @@ -826,19 +837,27 @@ int _nc_locale_breaks_acs( #undef _nc_setupterm int _nc_setupterm( - char *tname, + 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( - char *tname, + const char *tname, int Filedes, int *errret) { return(*(int *)0); } @@ -857,12 +876,6 @@ int tgetent_sp( const char *name) { return(*(int *)0); } -#if 0 - -#include <capdefaults.c> - -#endif - #undef tgetent int tgetent( char *bufp, @@ -872,35 +885,35 @@ int tgetent( #undef tgetflag_sp int tgetflag_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetflag int tgetflag( - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum_sp int tgetnum_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum int tgetnum( - char *id) + const char *id) { return(*(int *)0); } #undef tgetstr_sp char *tgetstr_sp( SCREEN *sp, - char *id, + const char *id, char **area) { return(*(char **)0); } #undef tgetstr char *tgetstr( - char *id, + const char *id, char **area) { return(*(char **)0); } @@ -929,34 +942,34 @@ char *tgoto( #undef tigetflag_sp int tigetflag_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetflag int tigetflag( - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum_sp int tigetnum_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum int tigetnum( - char *str) + const char *str) { return(*(int *)0); } #undef tigetstr_sp char *tigetstr_sp( SCREEN *sp, - char *str) + const char *str) { return(*(char **)0); } #undef tigetstr char *tigetstr( - char *str) + const char *str) { return(*(char **)0); } /* ./tinfo/lib_tparm.c */ @@ -973,7 +986,7 @@ int _nc_tparm_analyze( #undef tparm char *tparm( - char *string, + const char *string, ...) { return(*(char **)0); } @@ -1150,9 +1163,9 @@ const char *_nc_retrace_cptr( { return(*(const char **)0); } #undef _nc_retrace_cvoid_ptr -void *_nc_retrace_cvoid_ptr( - void *code) - { return(*(void **)0); } +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } #undef _nc_retrace_void_ptr void *_nc_retrace_void_ptr( @@ -1169,6 +1182,13 @@ 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) @@ -1238,11 +1258,6 @@ char *_tracecchar_t( /* ./trace/lib_tracebits.c */ -typedef struct { - unsigned int val; - const char *name; -} BITNAMES; - #undef _nc_trace_ttymode char *_nc_trace_ttymode( struct termios *tty) @@ -1345,8 +1360,6 @@ int resetty(void) /* ./tty/lib_twait.c */ -#include <sys/time.h> - #undef _nc_timed_wait int _nc_timed_wait( SCREEN *sp, @@ -1372,28 +1385,28 @@ int _nc_name_match( /* ./names.c */ #undef _nc_boolnames -char *const *_nc_boolnames(void) - { return(*(char **)0); } +const char *const *_nc_boolnames(void) + { return(*(const char **)0); } #undef _nc_boolfnames -char *const *_nc_boolfnames(void) - { return(*(char **)0); } +const char *const *_nc_boolfnames(void) + { return(*(const char **)0); } #undef _nc_numnames -char *const *_nc_numnames(void) - { return(*(char **)0); } +const char *const *_nc_numnames(void) + { return(*(const char **)0); } #undef _nc_numfnames -char *const *_nc_numfnames(void) - { return(*(char **)0); } +const char *const *_nc_numfnames(void) + { return(*(const char **)0); } #undef _nc_strnames -char *const *_nc_strnames(void) - { return(*(char **)0); } +const char *const *_nc_strnames(void) + { return(*(const char **)0); } #undef _nc_strfnames -char *const *_nc_strfnames(void) - { return(*(char **)0); } +const char *const *_nc_strfnames(void) + { return(*(const char **)0); } /* ./tinfo/obsolete.c */ @@ -1412,16 +1425,14 @@ void _nc_set_buffer( /* ./tinfo/read_entry.c */ -#include <hashed_db.h> - #undef _nc_init_termtype void _nc_init_termtype( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } #undef _nc_read_termtype int _nc_read_termtype( - TERMTYPE *ptr, + TERMTYPE2 *ptr, char *buffer, int limit) { return(*(int *)0); } @@ -1429,7 +1440,14 @@ int _nc_read_termtype( #undef _nc_read_file_entry int _nc_read_file_entry( const char *const filename, - TERMTYPE *ptr) + 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 @@ -1441,8 +1459,6 @@ int _nc_read_entry( /* ./tinfo/read_termcap.c */ -#include <sys/types.h> - #undef _nc_read_termcap void _nc_read_termcap(void) { /* void */ } @@ -1527,21 +1543,21 @@ int _nc_remove_string( #undef _nc_trim_sgr0 char *_nc_trim_sgr0( - TERMTYPE *tp) + TERMTYPE2 *tp) { return(*(char **)0); } /* ./unctrl.c */ #undef unctrl_sp -char *unctrl_sp( +const char *unctrl_sp( SCREEN *sp, chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } #undef unctrl -char *unctrl( +const char *unctrl( chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./trace/visbuf.c */ diff --git a/ncurses/llib-ltinfow b/ncurses/llib-ltinfow index f219698..7a68d70 100644 --- a/ncurses/llib-ltinfow +++ b/ncurses/llib-ltinfow @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2012,2013 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -27,15 +28,13 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey 2012 * + * Author: Thomas E. Dickey 2012-on * ****************************************************************************/ /* LINTLIBRARY */ /* ./tinfo/access.c */ #include <curses.priv.h> -#include <ctype.h> -#include <tic.h> #undef _nc_rootname char *_nc_rootname( @@ -90,8 +89,8 @@ int _nc_add_to_try( #undef _nc_align_termtype void _nc_align_termtype( - TERMTYPE *to, - TERMTYPE *from) + TERMTYPE2 *to, + TERMTYPE2 *from) { /* void */ } #undef _nc_copy_termtype @@ -100,19 +99,29 @@ void _nc_copy_termtype( 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 -char *const boolcodes[] = {0}; +const char *const boolcodes[] = {0}; #undef numcodes -char *const numcodes[] = {0}; +const char *const numcodes[] = {0}; #undef strcodes -char *const strcodes[] = {0}; +const char *const strcodes[] = {0}; /* ./comp_captab.c */ -#include <hashsize.h> - #undef _nc_get_table const struct name_table_entry *_nc_get_table( NCURSES_BOOL termcap) @@ -194,9 +203,22 @@ struct name_table_entry const *_nc_find_type_entry( NCURSES_BOOL termcap) { return(*(struct name_table_entry const **)0); } -/* ./tinfo/db_iterator.c */ +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } -#include <time.h> +/* ./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( @@ -242,7 +264,7 @@ ENTRY *_nc_tail; #undef _nc_free_entry void _nc_free_entry( ENTRY *headp, - TERMTYPE *tterm) + TERMTYPE2 *tterm) { /* void */ } #undef _nc_free_entries @@ -250,18 +272,17 @@ void _nc_free_entries( ENTRY *headp) { /* void */ } -#undef _nc_delink_entry -ENTRY *_nc_delink_entry( - ENTRY *headp, - TERMTYPE *tterm) - { return(*(ENTRY **)0); } - #undef _nc_leaks_tinfo void _nc_leaks_tinfo(void) { /* 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) @@ -274,6 +295,11 @@ void _nc_free_termtype( TERMTYPE *ptr) { /* void */ } +#undef _nc_free_termtype2 +void _nc_free_termtype2( + TERMTYPE2 *ptr) + { /* void */ } + #undef _nc_user_definable NCURSES_BOOL _nc_user_definable; @@ -303,15 +329,6 @@ char *_nc_home_terminfo(void) /* ./tinfo/init_keytry.c */ -#if 0 - -#include <init_keytry.h> - -#undef _nc_tinfo_fkeys -const struct tinfo_fkeys _nc_tinfo_fkeys[] = {0}; - -#endif - #undef _nc_init_keytry void _nc_init_keytry( SCREEN *sp) @@ -333,11 +350,9 @@ void _nc_init_acs(void) /* ./tinfo/lib_baudrate.c */ -#include <termcap.h> - struct speed { - int s; - int sp; + int given_speed; + int actual_speed; }; #undef _nc_baudrate @@ -462,26 +477,29 @@ int flushinp(void) struct kn { short offset; int code; }; #undef keyname_sp -char *keyname_sp( +const char *keyname_sp( SCREEN *sp, int c) - { return(*(char **)0); } + { return(*(const char **)0); } #undef keyname -char *keyname( +const char *keyname( int c) - { return(*(char **)0); } + { 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 */ -#include <sys/time.h> - #undef napms_sp int napms_sp( SCREEN *sp, @@ -665,10 +683,6 @@ int intrflush( /* ./tinfo/lib_setup.c */ -#include <locale.h> -#include <sys/ioctl.h> -#include <langinfo.h> - #undef ttytype char ttytype[256]; #undef LINES @@ -731,7 +745,7 @@ void _nc_update_screensize( #undef _nc_setup_tinfo int _nc_setup_tinfo( const char *const tn, - TERMTYPE *const tp) + TERMTYPE2 *const tp) { return(*(int *)0); } #undef _nc_tinfo_cmdch @@ -755,7 +769,7 @@ int _nc_locale_breaks_acs( #undef _nc_setupterm int _nc_setupterm( - char *tname, + const char *tname, int Filedes, int *errret, int reuse) @@ -767,7 +781,7 @@ SCREEN *new_prescr(void) #undef setupterm int setupterm( - char *tname, + const char *tname, int Filedes, int *errret) { return(*(int *)0); } @@ -786,12 +800,6 @@ int tgetent_sp( const char *name) { return(*(int *)0); } -#if 0 - -#include <capdefaults.c> - -#endif - #undef tgetent int tgetent( char *bufp, @@ -801,35 +809,35 @@ int tgetent( #undef tgetflag_sp int tgetflag_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetflag int tgetflag( - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum_sp int tgetnum_sp( SCREEN *sp, - char *id) + const char *id) { return(*(int *)0); } #undef tgetnum int tgetnum( - char *id) + const char *id) { return(*(int *)0); } #undef tgetstr_sp char *tgetstr_sp( SCREEN *sp, - char *id, + const char *id, char **area) { return(*(char **)0); } #undef tgetstr char *tgetstr( - char *id, + const char *id, char **area) { return(*(char **)0); } @@ -858,34 +866,34 @@ char *tgoto( #undef tigetflag_sp int tigetflag_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetflag int tigetflag( - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum_sp int tigetnum_sp( SCREEN *sp, - char *str) + const char *str) { return(*(int *)0); } #undef tigetnum int tigetnum( - char *str) + const char *str) { return(*(int *)0); } #undef tigetstr_sp char *tigetstr_sp( SCREEN *sp, - char *str) + const char *str) { return(*(char **)0); } #undef tigetstr char *tigetstr( - char *str) + const char *str) { return(*(char **)0); } /* ./tinfo/lib_tparm.c */ @@ -902,7 +910,7 @@ int _nc_tparm_analyze( #undef tparm char *tparm( - char *string, + const char *string, ...) { return(*(char **)0); } @@ -1065,9 +1073,9 @@ const char *_nc_retrace_cptr( { return(*(const char **)0); } #undef _nc_retrace_cvoid_ptr -void *_nc_retrace_cvoid_ptr( - void *code) - { return(*(void **)0); } +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } #undef _nc_retrace_void_ptr void *_nc_retrace_void_ptr( @@ -1084,6 +1092,13 @@ 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 @@ -1142,11 +1157,6 @@ char *_tracecchar_t( /* ./trace/lib_tracebits.c */ -typedef struct { - unsigned int val; - const char *name; -} BITNAMES; - #undef _nc_trace_ttymode char *_nc_trace_ttymode( struct termios *tty) @@ -1274,17 +1284,17 @@ int _nc_name_match( /* ./names.c */ #undef boolnames -char *const boolnames[] = {0}; +const char *const boolnames[] = {0}; #undef boolfnames -char *const boolfnames[] = {0}; +const char *const boolfnames[] = {0}; #undef numnames -char *const numnames[] = {0}; +const char *const numnames[] = {0}; #undef numfnames -char *const numfnames[] = {0}; +const char *const numfnames[] = {0}; #undef strnames -char *const strnames[] = {0}; +const char *const strnames[] = {0}; #undef strfnames -char *const strfnames[] = {0}; +const char *const strfnames[] = {0}; /* ./tinfo/obsolete.c */ @@ -1303,16 +1313,14 @@ void _nc_set_buffer( /* ./tinfo/read_entry.c */ -#include <hashed_db.h> - #undef _nc_init_termtype void _nc_init_termtype( - TERMTYPE *const tp) + TERMTYPE2 *const tp) { /* void */ } #undef _nc_read_termtype int _nc_read_termtype( - TERMTYPE *ptr, + TERMTYPE2 *ptr, char *buffer, int limit) { return(*(int *)0); } @@ -1320,7 +1328,14 @@ int _nc_read_termtype( #undef _nc_read_file_entry int _nc_read_file_entry( const char *const filename, - TERMTYPE *ptr) + 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 @@ -1332,8 +1347,6 @@ int _nc_read_entry( /* ./tinfo/read_termcap.c */ -#include <sys/types.h> - #undef _nc_read_termcap void _nc_read_termcap(void) { /* void */ } @@ -1418,21 +1431,21 @@ int _nc_remove_string( #undef _nc_trim_sgr0 char *_nc_trim_sgr0( - TERMTYPE *tp) + TERMTYPE2 *tp) { return(*(char **)0); } /* ./unctrl.c */ #undef unctrl_sp -char *unctrl_sp( +const char *unctrl_sp( SCREEN *sp, chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } #undef unctrl -char *unctrl( +const char *unctrl( chtype ch) - { return(*(char **)0); } + { return(*(const char **)0); } /* ./trace/visbuf.c */ diff --git a/ncurses/modules b/ncurses/modules index b3b9732..f4c3e8b 100644 --- a/ncurses/modules +++ b/ncurses/modules @@ -1,6 +1,7 @@ -# $Id: modules,v 1.120 2013/01/26 22:17:55 tom Exp $ +# $Id: modules,v 1.124 2020/02/02 23:34:34 tom Exp $ ############################################################################## -# Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. # +# 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"), # @@ -44,7 +45,7 @@ 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 +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) @@ -125,7 +126,7 @@ lib_freeall lib $(base) $(HEADER_DEPS) $(INCDIR)/tic.h 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) +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) @@ -149,6 +150,7 @@ 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) @@ -164,6 +166,7 @@ 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 diff --git a/ncurses/new_pair.h b/ncurses/new_pair.h new file mode 100644 index 0000000..811abc1 --- /dev/null +++ b/ncurses/new_pair.h @@ -0,0 +1,131 @@ +/**************************************************************************** + * 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. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* + * Common type definitions and macros for new_pair.c, lib_color.c + * + * $Id: new_pair.h,v 1.10 2020/02/02 23:34:34 tom Exp $ + */ + +#ifndef NEW_PAIR_H +#define NEW_PAIR_H 1 +/* *INDENT-OFF* */ + +#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, /* init_pair() */ + cpAUTO = 1 /* alloc_pair() */ +} 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 */ diff --git a/ncurses/report_hashing.c b/ncurses/report_hashing.c new file mode 100644 index 0000000..bed96ef --- /dev/null +++ b/ncurses/report_hashing.c @@ -0,0 +1,73 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#include <curses.priv.h> +#include <tic.h> + +MODULE_ID("$Id: report_hashing.c,v 1.3 2020/02/02 23:34:34 tom Exp $") + +static void +check_names(const char *name, NCURSES_CONST char *const *table, int termcap) +{ + int errs = 0; + int n; + struct name_table_entry const *entry_ptr; + const HashValue *hash_table = _nc_get_hash_table(termcap); + + printf("%s:\n", name); + for (n = 0; table[n] != NULL; ++n) { + entry_ptr = _nc_find_entry(table[n], hash_table); + if (entry_ptr == 0) { + printf(" %s\n", table[n]); + errs++; + } + } + if (errs) + printf("%d errors\n", errs); +} + +int +main(void) +{ +#define CHECK_TI(name) check_names(#name, name, 0) +#define CHECK_TC(name) check_names(#name, name, 1) + + CHECK_TI(boolnames); + CHECK_TI(numnames); + CHECK_TI(strnames); + + CHECK_TC(boolcodes); + CHECK_TC(numcodes); + CHECK_TC(strcodes); + + return EXIT_SUCCESS; +} diff --git a/ncurses/report_offsets.c b/ncurses/report_offsets.c new file mode 100644 index 0000000..2e7083a --- /dev/null +++ b/ncurses/report_offsets.c @@ -0,0 +1,229 @@ +/**************************************************************************** + * 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. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#include <curses.priv.h> + +MODULE_ID("$Id: report_offsets.c,v 1.21 2020/02/02 23:34:34 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 + +#ifdef USE_TERM_DRIVER +#define show_NORMAL(type,member) /* nothing */ +#else +#define show_NORMAL(type,member) { flag = "n"; show_offset(type,member); } +#endif + +#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 + show_DRIVER(SCREEN, _windowlist); + 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); +#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(WINDOW); + show_WIDECH(WINDOW, _bkgrnd); + show_COLORS(WINDOW, _color); + + printf("\n"); + show_size(NCURSES_GLOBALS); + show_offset(NCURSES_GLOBALS, init_signals); + show_DRIVER(NCURSES_GLOBALS, term_driver); + show_NORMAL(NCURSES_GLOBALS, _nc_windowlist); +#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, saved_tty); + show_offset(NCURSES_PRESCREEN, use_tioctl); + show_offset(NCURSES_PRESCREEN, _outch); + show_NORMAL(NCURSES_PRESCREEN, rippedoff); +#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 + + return EXIT_SUCCESS; +} diff --git a/ncurses/tinfo/MKcaptab.awk b/ncurses/tinfo/MKcaptab.awk index 56d3d17..ee4e2e9 100644 --- a/ncurses/tinfo/MKcaptab.awk +++ b/ncurses/tinfo/MKcaptab.awk @@ -1,5 +1,6 @@ ############################################################################## -# Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. # +# 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"), # @@ -25,7 +26,7 @@ # use or other dealings in this Software without prior written # # authorization. # ############################################################################## -# $Id: MKcaptab.awk,v 1.20 2007/08/12 00:26:15 tom Exp $ +# $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; diff --git a/ncurses/tinfo/MKcaptab.sh b/ncurses/tinfo/MKcaptab.sh index 20c94a6..c800023 100755 --- a/ncurses/tinfo/MKcaptab.sh +++ b/ncurses/tinfo/MKcaptab.sh @@ -1,6 +1,7 @@ #!/bin/sh ############################################################################## -# Copyright (c) 2007-2010,2011 Free Software Foundation, Inc. # +# Copyright 2019,2020 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"), # @@ -26,11 +27,28 @@ # use or other dealings in this Software without prior written # # authorization. # ############################################################################## -# $Id: MKcaptab.sh,v 1.14 2011/10/22 16:34:50 tom Exp $ -AWK=${1-awk} -OPT1=${2-0} -OPT2=${3-tinfo/MKcaptab.awk} -DATA=${4-../include/Caps} +# $Id: MKcaptab.sh,v 1.19 2020/02/02 23:34:34 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 <<EOF /* @@ -50,16 +68,18 @@ cat <<'EOF' #include <tic.h> #include <hashsize.h> +/* *INDENT-OFF* */ EOF -./make_hash 1 info $OPT1 <$DATA -./make_hash 3 cap $OPT1 <$DATA +cat "$@" |./make_hash 1 info $OPT1 +cat "$@" |./make_hash 3 cap $OPT1 -$AWK -f $OPT2 bigstrings=$OPT1 tablename=capalias <$DATA +cat "$@" |$AWK -f $OPT2 bigstrings=$OPT1 tablename=capalias -$AWK -f $OPT2 bigstrings=$OPT1 tablename=infoalias <$DATA +cat "$@" |$AWK -f $OPT2 bigstrings=$OPT1 tablename=infoalias cat <<EOF +/* *INDENT-ON* */ #if $OPT1 static void @@ -70,7 +90,7 @@ next_string(const char *strings, unsigned *offset) static const struct name_table_entry * _nc_build_names(struct name_table_entry **actual, - const name_table_data *source, + const name_table_data * source, const char *strings) { if (*actual == 0) { @@ -97,7 +117,7 @@ _nc_build_names(struct name_table_entry **actual, static const struct alias * _nc_build_alias(struct alias **actual, - const alias_table_data *source, + const alias_table_data * source, const char *strings, size_t tablesize) { @@ -127,20 +147,23 @@ _nc_build_alias(struct alias **actual, #define build_alias(root) _nc_ ## root ## alias_table #endif -NCURSES_EXPORT(const struct name_table_entry *) _nc_get_table (bool termcap) +NCURSES_EXPORT(const struct name_table_entry *) +_nc_get_table(bool termcap) { - return termcap ? build_names(cap) : build_names(info) ; + return termcap ? build_names(cap) : build_names(info); } -/* entrypoint used by tack (do not alter) */ -NCURSES_EXPORT(const HashValue *) _nc_get_hash_table (bool termcap) +/* entrypoint used by tack 1.07 */ +NCURSES_EXPORT(const HashValue *) +_nc_get_hash_table(bool termcap) { - return termcap ? _nc_cap_hash_table: _nc_info_hash_table ; + return termcap ? _nc_cap_hash_table : _nc_info_hash_table; } -NCURSES_EXPORT(const struct alias *) _nc_get_alias_table (bool termcap) +NCURSES_EXPORT(const struct alias *) +_nc_get_alias_table(bool termcap) { - return termcap ? build_alias(cap) : build_alias(info) ; + return termcap ? build_alias(cap) : build_alias(info); } static HashValue @@ -150,7 +173,7 @@ info_hash(const char *string) DEBUG(9, ("hashing %s", string)); while (*string) { - sum += (long) (*string + (*(string + 1) << 8)); + sum += (long) (UChar(*string) + (UChar(*(string + 1)) << 8)); string++; } @@ -187,18 +210,21 @@ 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 } +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) +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) +NCURSES_EXPORT(void) +_nc_comp_captab_leaks(void) { #if $OPT1 FreeIfNeeded(_nc_cap_table); diff --git a/ncurses/tinfo/MKcodes.awk b/ncurses/tinfo/MKcodes.awk index 97e5131..48f4800 100644 --- a/ncurses/tinfo/MKcodes.awk +++ b/ncurses/tinfo/MKcodes.awk @@ -1,5 +1,6 @@ ############################################################################## -# Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. # +# 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"), # @@ -25,7 +26,7 @@ # use or other dealings in this Software without prior written # # authorization. # ############################################################################## -# $Id: MKcodes.awk,v 1.9 2010/01/23 17:57:43 tom Exp $ +# $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; @@ -79,7 +80,9 @@ BEGIN { } $1 ~ /^#/ {next;} +$1 ~ /^(cap|info)alias/ {next;} +$1 == "userdef" {next;} $1 == "SKIPWARN" {next;} $3 == "bool" { diff --git a/ncurses/tinfo/MKfallback.sh b/ncurses/tinfo/MKfallback.sh index 11f1d2e..319ab06 100755 --- a/ncurses/tinfo/MKfallback.sh +++ b/ncurses/tinfo/MKfallback.sh @@ -1,6 +1,7 @@ #!/bin/sh ############################################################################## -# Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. # +# Copyright 2020 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"), # @@ -26,7 +27,7 @@ # use or other dealings in this Software without prior written # # authorization. # ############################################################################## -# $Id: MKfallback.sh,v 1.15 2010/08/07 20:32:34 tom Exp $ +# $Id: MKfallback.sh,v 1.24 2020/02/08 21:52:37 tom Exp $ # # MKfallback.sh -- create fallback table for entry reads # @@ -45,6 +46,9 @@ shift tic_path=$1 shift +infocmp_path=$1 +shift + case $tic_path in #(vi /*) tic_head=`echo "$tic_path" | sed -e 's,/[^/]*$,,'` @@ -69,8 +73,10 @@ else fi cat <<EOF +/* This file was generated by $0 */ + /* - * DO NOT EDIT THIS FILE BY HAND! It is generated by MKfallback.sh. + * DO NOT EDIT THIS FILE BY HAND! */ #include <curses.priv.h> @@ -87,18 +93,18 @@ EOF for x in $* do echo "/* $x */" - infocmp -E $x + $infocmp_path -E $x | sed -e 's/\<short\>/NCURSES_INT2/g' done cat <<EOF -static const TERMTYPE fallbacks[$#] = +static const TERMTYPE2 fallbacks[$#] = { EOF comma="" for x in $* do echo "$comma /* $x */" - infocmp -e $x + $infocmp_path -e $x comma="," done @@ -109,28 +115,51 @@ EOF fi cat <<EOF -NCURSES_EXPORT(const TERMTYPE *) _nc_fallback (const char *name GCC_UNUSED) +NCURSES_EXPORT(const TERMTYPE2 *) +_nc_fallback2 (const char *name GCC_UNUSED) { EOF if [ "$*" ] then cat <<EOF - const TERMTYPE *tp; + const TERMTYPE2 *tp; for (tp = fallbacks; - tp < fallbacks + sizeof(fallbacks)/sizeof(TERMTYPE); - tp++) - if (_nc_name_match(tp->term_names, name, "|")) + tp < fallbacks + sizeof(fallbacks)/sizeof(TERMTYPE2); + tp++) { + if (_nc_name_match(tp->term_names, name, "|")) { return(tp); + } + } EOF else echo " /* the fallback list is empty */"; fi cat <<EOF - return((TERMTYPE *)0); + return((const TERMTYPE2 *)0); +} + +#if NCURSES_EXT_NUMBERS +#undef _nc_fallback + +/* + * This entrypoint is used by tack 1.07 + */ +NCURSES_EXPORT(const TERMTYPE *) +_nc_fallback (const char *name) +{ + const TERMTYPE2 *tp = _nc_fallback2(name); + const TERMTYPE *result = 0; + if (tp != 0) { + static TERMTYPE temp; + _nc_export_termtype2(&temp, tp); + result = &temp; + } + return result; } +#endif EOF if test -n "$tmp_info" ; then diff --git a/ncurses/tinfo/MKkeys_list.sh b/ncurses/tinfo/MKkeys_list.sh index 14017b0..3b8beae 100755 --- a/ncurses/tinfo/MKkeys_list.sh +++ b/ncurses/tinfo/MKkeys_list.sh @@ -1,7 +1,8 @@ #! /bin/sh -# $Id: MKkeys_list.sh,v 1.4 2003/10/25 16:19:54 tom Exp $ +# $Id: MKkeys_list.sh,v 1.7 2020/02/02 23:34:34 tom Exp $ ############################################################################## -# Copyright (c) 2001,2003 Free Software Foundation, Inc. # +# Copyright 2019,2020 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"), # @@ -35,11 +36,16 @@ # Extract function-key names from the Caps file # : ${AWK-awk} -DATA=${1-../../include/Caps} +if test $# != 0 +then + DATA="$*" +else + DATA=../../include/Caps +fi data=data$$ -trap 'rm -f $data' 0 1 2 5 15 -sed -e 's/[ ][ ]*/ /g' < $DATA >$data +trap 'rm -f $data' EXIT INT QUIT TERM HUP +cat $DATA | sed -e 's/[ ][ ]*/ /g' >$data cat <<EOF # These definitions were generated by $0 $DATA @@ -53,6 +59,7 @@ ${AWK-awk} <$data ' /^#/ {next;} /^capalias/ {next;} /^infoalias/ {next;} +/^userdef/ {next;} $5 != "-" { if (substr($5, 1, 4) == "KEY_" ) { diff --git a/ncurses/tinfo/MKnames.awk b/ncurses/tinfo/MKnames.awk index 7685d18..4594c72 100644 --- a/ncurses/tinfo/MKnames.awk +++ b/ncurses/tinfo/MKnames.awk @@ -1,5 +1,6 @@ ############################################################################## -# Copyright (c) 2007-2008,2009 Free Software Foundation, Inc. # +# 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"), # @@ -25,7 +26,7 @@ # use or other dealings in this Software without prior written # # authorization. # ############################################################################## -# $Id: MKnames.awk,v 1.22 2009/03/21 21:03:39 tom Exp $ +# $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; @@ -79,7 +80,9 @@ BEGIN { } $1 ~ /^#/ {next;} +$1 ~ /^(cap|info)alias/ {next;} +$1 == "userdef" {next;} $1 == "SKIPWARN" {next;} $3 == "bool" { diff --git a/ncurses/tinfo/MKuserdefs.sh b/ncurses/tinfo/MKuserdefs.sh new file mode 100755 index 0000000..109dd64 --- /dev/null +++ b/ncurses/tinfo/MKuserdefs.sh @@ -0,0 +1,146 @@ +#!/bin/sh +############################################################################## +# Copyright 2019,2020 Thomas E. Dickey # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: MKuserdefs.sh,v 1.10 2020/02/02 23:34:34 tom Exp $ +AWK=${1-awk}; shift 1 +OPT1=${1-0}; shift 1 + +cat <<EOF +/* + * generated by $0 + */ + +EOF + +cat <<'EOF' +/* + * comp_userdefs.c -- The names of widely used user-defined capabilities + * indexed via a hash table for the compiler. + * + */ + +#include <curses.priv.h> +#include <tic.h> +#include <hashsize.h> + +#if NCURSES_XNAMES +EOF + +cat "$@" | ./make_hash 1 user $OPT1 + +cat <<EOF + +#define USERTABSIZE SIZEOF(user_names_data) + +#if $OPT1 +static void +next_string(const char *strings, unsigned *offset) +{ + *offset += (unsigned) strlen(strings + *offset) + 1; +} + +static const struct user_table_entry * +_nc_build_names(struct user_table_entry **actual, + const user_table_data *source, + const char *strings) +{ + if (*actual == 0) { + *actual = typeCalloc(struct user_table_entry, USERTABSIZE); + if (*actual != 0) { + unsigned n; + unsigned len = 0; + for (n = 0; n < USERTABSIZE; ++n) { + (*actual)[n].ute_name = strings + len; + (*actual)[n].ute_type = (int) source[n].ute_type; + (*actual)[n].ute_argc = source[n].ute_argc; + (*actual)[n].ute_args = source[n].ute_args; + (*actual)[n].ute_index = source[n].ute_index; + (*actual)[n].ute_link = source[n].ute_link; + next_string(strings, &len); + } + } + } + return *actual; +} + +#define build_names(root) _nc_build_names(&_nc_##root##_table, \\ + root##_names_data, \\ + root##_names_text) +#else +#define build_names(root) _nc_ ## root ## _table +#endif + +NCURSES_EXPORT(const struct user_table_entry *) _nc_get_userdefs_table (void) +{ + return build_names(user) ; +} + +static HashValue +info_hash(const char *string) +{ + long sum = 0; + + DEBUG(9, ("hashing %s", string)); + while (*string) { + sum += (long) (*string + (*(string + 1) << 8)); + string++; + } + + DEBUG(9, ("sum is %ld", sum)); + return (HashValue) (sum % HASHTABSIZE); +} + +static int +compare_info_names(const char *a, const char *b) +{ + return !strcmp(a, b); +} + +static const HashData hash_data[] = { + { HASHTABSIZE, _nc_user_hash_table, info_hash, compare_info_names } +}; + +NCURSES_EXPORT(const HashData *) _nc_get_hash_user (void) +{ + return hash_data; +} + +#if NO_LEAKS +NCURSES_EXPORT(void) _nc_comp_userdefs_leaks(void) +{ +#if $OPT1 + FreeIfNeeded(_nc_user_table); +#endif +} +#endif /* NO_LEAKS */ + +#else /*! NCURSES_XNAMES */ +NCURSES_EXPORT(void) _nc_comp_userdefs(void); +NCURSES_EXPORT(void) _nc_comp_userdefs(void) { } +#endif /* NCURSES_XNAMES */ +EOF diff --git a/ncurses/tinfo/README b/ncurses/tinfo/README index 14c4220..6157ba1 100644 --- a/ncurses/tinfo/README +++ b/ncurses/tinfo/README @@ -1,5 +1,6 @@ ------------------------------------------------------------------------------- --- Copyright (c) 1998,2006 Free Software Foundation, Inc. -- +-- 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 -- @@ -25,7 +26,7 @@ -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------- --- $Id: README,v 1.2 2006/04/22 22:19:37 tom Exp $ +-- $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 diff --git a/ncurses/tinfo/access.c b/ncurses/tinfo/access.c index d987687..c69707f 100644 --- a/ncurses/tinfo/access.c +++ b/ncurses/tinfo/access.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * 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 * @@ -36,15 +37,7 @@ #include <tic.h> -MODULE_ID("$Id: access.c,v 1.23 2012/09/01 19:21:29 tom Exp $") - -#ifdef __TANDEM -#define ROOT_UID 65535 -#endif - -#ifndef ROOT_UID -#define ROOT_UID 0 -#endif +MODULE_ID("$Id: access.c,v 1.25 2020/02/02 23:34:34 tom Exp $") #define LOWERCASE(c) ((isalpha(UChar(c)) && isupper(UChar(c))) ? tolower(UChar(c)) : (c)) diff --git a/ncurses/tinfo/add_tries.c b/ncurses/tinfo/add_tries.c index 29a1a60..d41f488 100644 --- a/ncurses/tinfo/add_tries.c +++ b/ncurses/tinfo/add_tries.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * Copyright 2019,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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: add_tries.c,v 1.10 2010/12/19 01:31:14 tom Exp $") +MODULE_ID("$Id: add_tries.c,v 1.12 2020/02/02 23:34:34 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)) @@ -109,6 +110,7 @@ _nc_add_to_try(TRIES ** tree, const char *str, unsigned code) savedptr = ptr->child; free(ptr); } + *tree = NULL; returnCode(ERR); } diff --git a/ncurses/tinfo/alloc_entry.c b/ncurses/tinfo/alloc_entry.c index 14ea391..4bf7d6c 100644 --- a/ncurses/tinfo/alloc_entry.c +++ b/ncurses/tinfo/alloc_entry.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -47,7 +48,7 @@ #include <tic.h> -MODULE_ID("$Id: alloc_entry.c,v 1.58 2013/08/17 19:20:38 tom Exp $") +MODULE_ID("$Id: alloc_entry.c,v 1.64 2020/02/02 23:34:34 tom Exp $") #define ABSENT_OFFSET -1 #define CANCELLED_OFFSET -2 @@ -58,7 +59,7 @@ static char *stringbuf; /* buffer for string capabilities */ static size_t next_free; /* next free character in stringbuf */ NCURSES_EXPORT(void) -_nc_init_entry(TERMTYPE *const tp) +_nc_init_entry(ENTRY * const tp) /* initialize a terminal type data block */ { #if NO_LEAKS @@ -75,7 +76,7 @@ _nc_init_entry(TERMTYPE *const tp) next_free = 0; - _nc_init_termtype(tp); + _nc_init_termtype(&(tp->tterm)); } NCURSES_EXPORT(ENTRY *) @@ -85,7 +86,7 @@ _nc_copy_entry(ENTRY * oldp) if (newp != 0) { *newp = *oldp; - _nc_copy_termtype(&(newp->tterm), &(oldp->tterm)); + _nc_copy_termtype2(&(newp->tterm), &(oldp->tterm)); } return newp; } @@ -96,7 +97,11 @@ _nc_save_str(const char *const string) { char *result = 0; size_t old_next_free = next_free; - size_t len = strlen(string) + 1; + size_t len; + + if (!VALID_STRING(string)) + return _nc_save_str(""); + len = strlen(string) + 1; if (len == 1 && next_free != 0) { /* @@ -126,7 +131,7 @@ _nc_wrap_entry(ENTRY * const ep, bool copy_strings) int useoffsets[MAX_USES]; unsigned i, n; unsigned nuses = ep->nuses; - TERMTYPE *tp = &(ep->tterm); + TERMTYPE2 *tp = &(ep->tterm); if (copy_strings) { next_free = 0; /* clear static storage */ @@ -218,12 +223,22 @@ _nc_wrap_entry(ENTRY * const ep, bool copy_strings) } NCURSES_EXPORT(void) -_nc_merge_entry(TERMTYPE *const to, TERMTYPE *const from) +_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; +#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); #endif for_each_boolean(i, from) { @@ -233,18 +248,18 @@ _nc_merge_entry(TERMTYPE *const to, TERMTYPE *const from) if (mergebool == CANCELLED_BOOLEAN) to->Booleans[i] = FALSE; else if (mergebool == TRUE) - to->Booleans[i] = (char) mergebool; + to->Booleans[i] = (NCURSES_SBOOL) mergebool; } } for_each_number(i, from) { if (to->Numbers[i] != CANCELLED_NUMERIC) { - short mergenum = from->Numbers[i]; + int mergenum = from->Numbers[i]; if (mergenum == CANCELLED_NUMERIC) to->Numbers[i] = ABSENT_NUMERIC; else if (mergenum != ABSENT_NUMERIC) - to->Numbers[i] = mergenum; + to->Numbers[i] = (NCURSES_INT2) mergenum; } } @@ -263,6 +278,16 @@ _nc_merge_entry(TERMTYPE *const to, TERMTYPE *const from) to->Strings[i] = mergestring; } } +#if NCURSES_XNAMES + /* Discard the data allocated in _nc_copy_termtype2, but do not use + * _nc_free_termtype2 because that frees the string-table (which is + * not allocated by _nc_copy_termtype2). + */ + free(copy.Booleans); + free(copy.Numbers); + free(copy.Strings); + free(copy.ext_Names); +#endif } #if NO_LEAKS diff --git a/ncurses/tinfo/alloc_ttype.c b/ncurses/tinfo/alloc_ttype.c index 35c92dd..222868e 100644 --- a/ncurses/tinfo/alloc_ttype.c +++ b/ncurses/tinfo/alloc_ttype.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1999-2012,2013 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -42,7 +43,7 @@ #include <tic.h> -MODULE_ID("$Id: alloc_ttype.c,v 1.27 2013/06/08 16:54:50 tom Exp $") +MODULE_ID("$Id: alloc_ttype.c,v 1.33 2020/02/02 23:34:34 tom Exp $") #if NCURSES_XNAMES /* @@ -61,7 +62,7 @@ merge_names(char **dst, char **a, int na, char **b, int nb) } else if (cmp > 0) { dst[n++] = *b++; nb--; - } else if (cmp == 0) { + } else { dst[n++] = *a; a++, b++; na--, nb--; @@ -78,37 +79,59 @@ merge_names(char **dst, char **a, int na, char **b, int nb) } static bool -find_name(char **table, int length, char *name) +find_name(char **table, int item, int length, const char *name) { - while (length-- > 0) { - if (!strcmp(*table++, name)) { - DEBUG(4, ("found name '%s'", name)); - return TRUE; + 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; } } - DEBUG(4, ("did not find name '%s'", name)); - return FALSE; + 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(TERMTYPE *to, char **ext_Names, +realign_data(TERMTYPE2 *to, char **ext_Names, int ext_Booleans, int ext_Numbers, int ext_Strings) { int n, m, base; - int limit = (to->ext_Booleans + to->ext_Numbers + to->ext_Strings); + 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, limit, ext_Names[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; @@ -118,12 +141,15 @@ realign_data(TERMTYPE *to, char **ext_Names, } if (to->ext_Numbers != ext_Numbers) { + to1 = to_Booleans; + to2 = to_Numbers + to1; + from = ext_Booleans; EXTEND_NUM(num_Numbers, ext_Numbers); - TYPE_REALLOC(short, to->num_Numbers, to->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, limit, ext_Names[m + ext_Booleans])) { + 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; @@ -131,13 +157,17 @@ realign_data(TERMTYPE *to, char **ext_Names, } 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, limit, ext_Names[m + ext_Booleans + ext_Numbers])) { + 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; @@ -151,7 +181,7 @@ realign_data(TERMTYPE *to, char **ext_Names, * Returns the first index in ext_Names[] for the given token-type */ static unsigned -_nc_first_ext_name(TERMTYPE *tp, int token_type) +_nc_first_ext_name(TERMTYPE2 *tp, int token_type) { unsigned first; @@ -176,7 +206,7 @@ _nc_first_ext_name(TERMTYPE *tp, int token_type) * Returns the last index in ext_Names[] for the given token-type */ static unsigned -_nc_last_ext_name(TERMTYPE *tp, int token_type) +_nc_last_ext_name(TERMTYPE2 *tp, int token_type) { unsigned last; @@ -199,7 +229,7 @@ _nc_last_ext_name(TERMTYPE *tp, int token_type) * Lookup an entry from extended-names, returning -1 if not found */ static int -_nc_find_ext_name(TERMTYPE *tp, char *name, int token_type) +_nc_find_ext_name(TERMTYPE2 *tp, char *name, int token_type) { unsigned j; unsigned first = _nc_first_ext_name(tp, token_type); @@ -218,7 +248,7 @@ _nc_find_ext_name(TERMTYPE *tp, char *name, int token_type) * (e.g., Booleans[]). */ static int -_nc_ext_data_index(TERMTYPE *tp, int n, int token_type) +_nc_ext_data_index(TERMTYPE2 *tp, int n, int token_type) { switch (token_type) { case BOOLEAN: @@ -241,13 +271,14 @@ _nc_ext_data_index(TERMTYPE *tp, int n, int token_type) * data. */ static bool -_nc_del_ext_name(TERMTYPE *tp, char *name, int token_type) +_nc_del_ext_name(TERMTYPE2 *tp, char *name, int token_type) { - int j; - int first, last; + int first; if ((first = _nc_find_ext_name(tp, name, token_type)) >= 0) { - last = (int) NUM_EXT_NAMES(tp) - 1; + 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]; } @@ -285,7 +316,7 @@ _nc_del_ext_name(TERMTYPE *tp, char *name, int token_type) * index into the corresponding data array is returned. */ static int -_nc_ins_ext_name(TERMTYPE *tp, char *name, int token_type) +_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); @@ -319,7 +350,7 @@ _nc_ins_ext_name(TERMTYPE *tp, char *name, int token_type) case NUMBER: tp->ext_Numbers++; tp->num_Numbers++; - TYPE_REALLOC(short, tp->num_Numbers, tp->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; @@ -340,7 +371,7 @@ _nc_ins_ext_name(TERMTYPE *tp, char *name, int token_type) * cancellation of a name that is inherited from another entry. */ static void -adjust_cancels(TERMTYPE *to, TERMTYPE *from) +adjust_cancels(TERMTYPE2 *to, TERMTYPE2 *from) { int first = to->ext_Booleans + to->ext_Numbers; int last = first + to->ext_Strings; @@ -385,24 +416,30 @@ adjust_cancels(TERMTYPE *to, TERMTYPE *from) } NCURSES_EXPORT(void) -_nc_align_termtype(TERMTYPE *to, TERMTYPE *from) +_nc_align_termtype(TERMTYPE2 *to, TERMTYPE2 *from) { - int na = (int) NUM_EXT_NAMES(to); - int nb = (int) NUM_EXT_NAMES(from); - int n; - bool same; + int na; + int nb; char **ext_Names; - int ext_Booleans, ext_Numbers, ext_Strings; - bool used_ext_Names = FALSE; - DEBUG(2, ("align_termtype to(%d:%s), from(%d:%s)", na, to->term_names, - nb, from->term_names)); + na = to ? ((int) NUM_EXT_NAMES(to)) : 0; + nb = from ? ((int) NUM_EXT_NAMES(from)) : 0; + + DEBUG(2, ("align_termtype to(%d:%s), from(%d:%s)", + na, to ? NonNull(to->term_names) : "?", + nb, from ? NonNull(from->term_names) : "?")); if (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; @@ -473,29 +510,80 @@ _nc_align_termtype(TERMTYPE *to, TERMTYPE *from) } #endif -NCURSES_EXPORT(void) -_nc_copy_termtype(TERMTYPE *dst, const TERMTYPE *src) +#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) { -#if NCURSES_XNAMES +#if NCURSES_XNAMES || NCURSES_EXT_NUMBERS unsigned i; #endif +#if NCURSES_EXT_NUMBERS + short *oldptr = 0; + int *newptr = 0; +#endif + DEBUG(2, ("copy_termtype")); *dst = *src; /* ...to copy the sizes and string-tables */ TYPE_MALLOC(NCURSES_SBOOL, NUM_BOOLEANS(dst), dst->Booleans); - TYPE_MALLOC(short, NUM_NUMBERS(dst), dst->Numbers); TYPE_MALLOC(char *, NUM_STRINGS(dst), dst->Strings); memcpy(dst->Booleans, src->Booleans, NUM_BOOLEANS(dst) * sizeof(dst->Booleans[0])); - memcpy(dst->Numbers, - src->Numbers, - NUM_NUMBERS(dst) * sizeof(dst->Numbers[0])); memcpy(dst->Strings, src->Strings, NUM_STRINGS(dst) * sizeof(dst->Strings[0])); +#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 + /* FIXME: we probably should also copy str_table and ext_str_table, * but tic and infocmp are not written to exploit that (yet). */ @@ -509,3 +597,33 @@ _nc_copy_termtype(TERMTYPE *dst, const TERMTYPE *src) } #endif } + +/* + * This entrypoint is used by tack 1.07 + */ +NCURSES_EXPORT(void) +_nc_copy_termtype(TERMTYPE *dst, const TERMTYPE *src) +{ + DEBUG(2, ("_nc_copy_termtype...")); + copy_termtype((TERMTYPE2 *) dst, (const TERMTYPE2 *) src, 0); +} + +#if NCURSES_EXT_NUMBERS +NCURSES_EXPORT(void) +_nc_copy_termtype2(TERMTYPE2 *dst, const TERMTYPE2 *src) +{ + DEBUG(2, ("_nc_copy_termtype2...")); + copy_termtype(dst, src, srcINT | dstINT); +} + +/* + * 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, ("_nc_export_termtype2...")); + copy_termtype((TERMTYPE2 *) dst, src, srcINT); +} +#endif /* NCURSES_EXT_NUMBERS */ diff --git a/ncurses/tinfo/captoinfo.c b/ncurses/tinfo/captoinfo.c index e02e622..8b3b83d 100644 --- a/ncurses/tinfo/captoinfo.c +++ b/ncurses/tinfo/captoinfo.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -33,12 +34,16 @@ ****************************************************************************/ /* - * captoinfo.c --- conversion between termcap and terminfo formats + * 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 <esr@snark.thyrsus.com>. * - * There is just one entry point: + * It has just one entry point: * * char *_nc_captoinfo(n, s, parameterized) * @@ -93,7 +98,13 @@ #include <ctype.h> #include <tic.h> -MODULE_ID("$Id: captoinfo.c,v 1.77 2012/12/30 00:50:40 tom Exp $") +MODULE_ID("$Id: captoinfo.c,v 1.98 2020/02/02 23:34:34 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 */ @@ -181,7 +192,7 @@ cvtchar(register const char *sp) case '$': case '\\': case '%': - c = (unsigned char) (*sp); + c = UChar(*sp); len = 2; break; case '\0': @@ -194,29 +205,33 @@ cvtchar(register const char *sp) case '3': len = 1; while (isdigit(UChar(*sp))) { - c = (unsigned char) (8 * c + (*sp++ - '0')); + c = UChar(8 * c + (*sp++ - '0')); len++; } break; default: - c = (unsigned char) (*sp); - len = 2; + c = UChar(*sp); + len = (c != '\0') ? 2 : 1; break; } break; case '^': - c = (unsigned char) (*++sp & 0x1f); + c = UChar(*++sp); + if (c == '?') + c = 127; + else + c &= 0x1f; len = 2; break; default: - c = (unsigned char) (*sp); - len = 1; + 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 { + } else if (c != '\0') { dp = save_string(dp, "%{"); if (c > 99) dp = save_char(dp, c / 100 + '0'); @@ -232,6 +247,8 @@ 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; @@ -239,7 +256,7 @@ getparm(int parm, int n) parm = 1; } - while (n--) { + for (nn = 0; nn < n; ++nn) { dp = save_string(dp, "%p"); dp = save_char(dp, '0' + parm); } @@ -248,7 +265,7 @@ getparm(int parm, int n) if (n > 1) { _nc_warning("string may not be optimal"); dp = save_string(dp, "%Pa"); - while (n--) { + while (n-- > 0) { dp = save_string(dp, "%ga"); } } @@ -288,6 +305,8 @@ _nc_captoinfo(const char *cap, const char *s, int const parameterized) 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) */ @@ -295,7 +314,7 @@ _nc_captoinfo(const char *cap, const char *s, int const parameterized) if (s == 0) s = ""; if (parameterized >= 0 && isdigit(UChar(*s))) - for (capstart = s;; s++) + for (capstart = s; *s != '\0'; s++) if (!(isdigit(UChar(*s)) || *s == '*' || *s == '.')) break; @@ -309,7 +328,7 @@ _nc_captoinfo(const char *cap, const char *s, int const parameterized) } switch (*s++) { case '%': - dp = save_char(dp, '%'); + dp = save_string(dp, "%%"); break; case 'r': if (seenr++ == 1) { @@ -342,13 +361,18 @@ _nc_captoinfo(const char *cap, const char *s, int const parameterized) dp = save_string(dp, "%{2}%*%-"); break; case '>': - getparm(param, 2); /* %?%{x}%>%t%{y}%+%; */ - dp = save_string(dp, "%?"); - s += cvtchar(s); - dp = save_string(dp, "%>%t"); - s += cvtchar(s); - dp = save_string(dp, "%+%;"); + 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 == '-' @@ -429,12 +453,17 @@ _nc_captoinfo(const char *cap, const char *s, int const parameterized) pop(); break; case '0': /* not clear any of the historical termcaps did this */ - if (*s == '3') + if (*s == '3') { + ++s; goto see03; - else if (*s != '2') - goto invalid; - /* FALLTHRU */ + } + if (*s == '2') { + ++s; + goto see02; + } + goto invalid; case '2': + see02: getparm(param, 1); dp = save_string(dp, "%2d"); pop(); @@ -469,7 +498,8 @@ _nc_captoinfo(const char *cap, const char *s, int const parameterized) } break; default: - dp = save_char(dp, *s++); + if (*s != '\0') + dp = save_char(dp, *s++); break; } } @@ -480,7 +510,7 @@ _nc_captoinfo(const char *cap, const char *s, int const parameterized) */ if (capstart) { dp = save_string(dp, "$<"); - for (s = capstart;; s++) + for (s = capstart; *s != '\0'; s++) if (isdigit(UChar(*s)) || *s == '*' || *s == '.') dp = save_char(dp, *s); else @@ -489,6 +519,9 @@ _nc_captoinfo(const char *cap, const char *s, int const parameterized) } (void) save_char(dp, '\0'); + + DEBUG_THIS(("... _nc_captoinfo %s", NonNull(my_string))); + return (my_string); } @@ -525,13 +558,13 @@ bcd_expression(const char *str) static char * save_tc_char(char *bufptr, int c1) { - char temp[80]; - 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)); @@ -554,6 +587,8 @@ save_tc_inequality(char *bufptr, int c1, int c2) } /* + * info-to-cap --- conversion between terminfo and termcap formats + * * Here are the capabilities infotocap assumes it can translate to: * * %% output `%' @@ -571,6 +606,8 @@ save_tc_inequality(char *bufptr, int c1, int c2) * %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(). @@ -586,7 +623,15 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz 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 params %d, %s", parameterized, str)); /* we may have to move some trailing mandatory padding up front */ padding = str + strlen(str) - 1; @@ -603,7 +648,9 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz bufptr = save_char(bufptr, *padding++); } - for (; *str && ((trimmed == 0) || (str < trimmed)); str++) { + for (; !syntax_error && + *str && + ((trimmed == 0) || (str < trimmed)); str++) { int c1, c2; char *cp = 0; @@ -611,6 +658,14 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz 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); @@ -625,17 +680,20 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz } else if (str[1] == ',') { bufptr = save_char(bufptr, *++str); } else { - int xx1, xx2; + int xx1; bufptr = save_char(bufptr, *str++); xx1 = *str; if (_nc_strict_bsd) { - if (isdigit(UChar(xx1))) { + + if (isoctal(UChar(xx1))) { int pad = 0; + int xx2; + int fix = 0; - if (!isdigit(UChar(str[1]))) + if (!isoctal(UChar(str[1]))) pad = 2; - else if (str[1] && !isdigit(UChar(str[2]))) + else if (str[1] && !isoctal(UChar(str[2]))) pad = 1; /* @@ -650,10 +708,31 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz 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': @@ -689,6 +768,24 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz 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); } @@ -735,8 +832,9 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz } else if ((len = bcd_expression(str)) != 0) { str += len; bufptr = save_string(bufptr, "%B"); - } else if ((sscanf(str, "%%{%d}%%+%%c", &c1) == 1 - || sscanf(str, "%%'%c'%%+%%c", &ch1) == 1) + } 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, "%+"); @@ -779,26 +877,46 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz 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 (_nc_strict_bsd) { - if (ch1 > '3') - return 0; + 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') - return 0; - if (ch1 < '2') + if (ch2 != 0 && ch2 != '0') { + syntax_error = TRUE; + } else if (ch1 < '2') { ch1 = 'd'; + } bufptr = save_char(bufptr, ch1); } - if (strchr("doxX.", *str)) { - if (*str != 'd') /* termcap doesn't have octal, hex */ - return 0; + if (strchr("oxX.", *str)) { + syntax_error = TRUE; /* termcap doesn't have octal, hex */ } break; @@ -816,9 +934,11 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz * termcap notation. */ case 's': - if (_nc_strict_bsd) - return 0; - bufptr = save_string(bufptr, "%s"); + if (_nc_strict_bsd) { + syntax_error = TRUE; + } else { + bufptr = save_string(bufptr, "%s"); + } break; case 'p': @@ -830,8 +950,9 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz bufptr = save_string(bufptr, "%r"); seentwo++; } - } else if (*str >= '3') - return (0); + } else if (*str >= '3') { + syntax_error = TRUE; + } break; case 'i': @@ -855,6 +976,24 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz } /* 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 + ? "<ERR>" + : _nc_visbuf(my_string))); + return (syntax_error ? NULL : my_string); } diff --git a/ncurses/tinfo/comp_error.c b/ncurses/tinfo/comp_error.c index ff0acc7..48f4878 100644 --- a/ncurses/tinfo/comp_error.c +++ b/ncurses/tinfo/comp_error.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright 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 * @@ -41,7 +42,7 @@ #include <tic.h> -MODULE_ID("$Id: comp_error.c,v 1.36 2012/02/22 22:34:31 tom Exp $") +MODULE_ID("$Id: comp_error.c,v 1.40 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT_VAR(bool) _nc_suppress_warnings = FALSE; NCURSES_EXPORT_VAR(int) _nc_curr_line = 0; /* current line # in input */ @@ -66,12 +67,14 @@ _nc_set_source(const char *const 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, MAX_NAME_SIZE + 1); + TermType = typeMalloc(char, MY_SIZE + 1); if (TermType != 0) { TermType[0] = '\0'; - if (name) - strncat(TermType, name, (size_t) MAX_NAME_SIZE); + if (name) { + _nc_STRNCAT(TermType, name, MY_SIZE, MY_SIZE); + } } } @@ -103,7 +106,7 @@ where_is_problem(void) } NCURSES_EXPORT(void) -_nc_warning(const char *const fmt,...) +_nc_warning(const char *const fmt, ...) { va_list argp; @@ -118,7 +121,7 @@ _nc_warning(const char *const fmt,...) } NCURSES_EXPORT(void) -_nc_err_abort(const char *const fmt,...) +_nc_err_abort(const char *const fmt, ...) { va_list argp; @@ -131,7 +134,7 @@ _nc_err_abort(const char *const fmt,...) } NCURSES_EXPORT(void) -_nc_syserr_abort(const char *const fmt,...) +_nc_syserr_abort(const char *const fmt, ...) { va_list argp; @@ -141,16 +144,18 @@ _nc_syserr_abort(const char *const fmt,...) 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 defined(TRACE) || !defined(NDEBUG) - abort(); -#else +#ifndef USE_ROOT_ENVIRON + if (getuid() != ROOT_UID) +#endif + abort(); +#endif /* Dumping core in production code is not a good idea. */ exit(EXIT_FAILURE); -#endif } #if NO_LEAKS diff --git a/ncurses/tinfo/comp_expand.c b/ncurses/tinfo/comp_expand.c index 2ab06eb..02e38e6 100644 --- a/ncurses/tinfo/comp_expand.c +++ b/ncurses/tinfo/comp_expand.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * 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 * @@ -27,7 +28,7 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey <dickey@clark.net> 1998 * + * Author: Thomas E. Dickey 1998 * ****************************************************************************/ #include <curses.priv.h> @@ -35,7 +36,13 @@ #include <ctype.h> #include <tic.h> -MODULE_ID("$Id: comp_expand.c,v 1.25 2012/03/24 18:37:17 tom Exp $") +MODULE_ID("$Id: comp_expand.c,v 1.32 2020/02/02 23:34:34 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) @@ -46,10 +53,9 @@ trailing_spaces(const char *src) } /* this deals with differences over whether 0x7f and 0x80..0x9f are controls */ -#define REALCTL(s) (UChar(*(s)) < 127 && iscntrl(UChar(*(s)))) #define REALPRINT(s) (UChar(*(s)) < 127 && isprint(UChar(*(s)))) -#define P_LIMIT(p) (length - (size_t)(p)) +#define P_LIMIT(p) (length - (size_t)(p)) NCURSES_EXPORT(char *) _nc_tic_expand(const char *srcp, bool tic_format, int numbers) @@ -59,9 +65,13 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers) int bufp; const char *str = VALID_STRING(srcp) ? srcp : "\0\0"; - bool islong = (strlen(str) > 3); 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 @@ -77,6 +87,7 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers) return 0; } + DEBUG_THIS(("_nc_tic_expand %s", _nc_visbuf(srcp))); bufp = 0; while ((ch = UChar(*str)) != 0) { if (ch == '%' && REALPRINT(str + 1)) { @@ -133,6 +144,8 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers) } break; default: + if (*str == ',') /* minitel1 uses this */ + buffer[bufp++] = '\\'; buffer[bufp++] = *str; break; } @@ -158,34 +171,28 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers) && !(ch == '!' && !tic_format) && ch != '^')) buffer[bufp++] = (char) ch; -#if 0 /* FIXME: this would be more readable (in fact the whole 'islong' logic should be removed) */ - else if (ch == '\b') { - buffer[bufp++] = '\\'; - buffer[bufp++] = 'b'; - } else if (ch == '\f') { - buffer[bufp++] = '\\'; - buffer[bufp++] = 'f'; - } else if (ch == '\t' && islong) { - buffer[bufp++] = '\\'; - buffer[bufp++] = 't'; - } -#endif - else if (ch == '\r' && (islong || (strlen(srcp) > 2 && str[1] == '\0'))) { + else if (ch == '\r') { buffer[bufp++] = '\\'; buffer[bufp++] = 'r'; - } else if (ch == '\n' && islong) { + } else if (ch == '\n') { buffer[bufp++] = '\\'; buffer[bufp++] = 'n'; } #define UnCtl(c) ((c) + '@') - else if (REALCTL(str) && ch != '\\' - && (!islong || isdigit(UChar(str[1])))) { + 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; } @@ -193,5 +200,26 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers) } 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's + * more likely that the characters are just binary coding. + * + * If we're formatting termcap, just use the shorter format (up-arrows). + */ + if (octals != 0 && (!tic_format || (bufp - (4 * octals)) < MIN_TC_FIXUPS)) { + while (--octals >= 0) { + char *p = buffer + fixups[octals].offset; + *p++ = '^'; + *p++ = (char) ((fixups[octals].ch == 127) + ? '?' + : (fixups[octals].ch + (int) '@')); + while ((p[0] = p[2]) != 0) { + ++p; + } + } + } + DEBUG_THIS(("... %s", _nc_visbuf(buffer))); return (buffer); } diff --git a/ncurses/tinfo/comp_hash.c b/ncurses/tinfo/comp_hash.c index 959c6e1..80755f2 100644 --- a/ncurses/tinfo/comp_hash.c +++ b/ncurses/tinfo/comp_hash.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. * + * 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 * @@ -44,13 +45,13 @@ #include <tic.h> #include <hashsize.h> -MODULE_ID("$Id: comp_hash.c,v 1.48 2009/08/08 17:36:21 tom Exp $") +MODULE_ID("$Id: comp_hash.c,v 1.53 2020/02/02 23:34:34 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. */ -/* entrypoint used by tack (do not alter) */ +/* entrypoint used by tack 1.07 */ NCURSES_EXPORT(struct name_table_entry const *) _nc_find_entry(const char *string, const HashValue * hash_table) @@ -63,7 +64,9 @@ _nc_find_entry(const char *string, hashvalue = data->hash_of(string); - if (data->table_data[hashvalue] >= 0) { + 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]; @@ -96,7 +99,9 @@ _nc_find_type_entry(const char *string, const HashData *data = _nc_get_hash_info(termcap); int hashvalue = data->hash_of(string); - if (data->table_data[hashvalue] >= 0) { + if (hashvalue >= 0 + && (unsigned) hashvalue < data->table_size + && data->table_data[hashvalue] >= 0) { const struct name_table_entry *const table = _nc_get_table(termcap); ptr = table + data->table_data[hashvalue]; @@ -112,3 +117,34 @@ _nc_find_type_entry(const char *string, return ptr; } + +#if NCURSES_XNAMES +NCURSES_EXPORT(struct user_table_entry const *) +_nc_find_user_entry(const char *string) +{ + const HashData *data = _nc_get_hash_user(); + int hashvalue; + struct user_table_entry const *ptr = 0; + struct user_table_entry const *real_table; + + hashvalue = data->hash_of(string); + + if (hashvalue >= 0 + && (unsigned) hashvalue < data->table_size + && data->table_data[hashvalue] >= 0) { + + real_table = _nc_get_userdefs_table(); + ptr = real_table + data->table_data[hashvalue]; + while (!data->compare_names(ptr->ute_name, string)) { + if (ptr->ute_link < 0) { + ptr = 0; + break; + } + ptr = real_table + (ptr->ute_link + + data->table_data[data->table_size]); + } + } + + return (ptr); +} +#endif /* NCURSES_XNAMES */ diff --git a/ncurses/tinfo/comp_parse.c b/ncurses/tinfo/comp_parse.c index 82a61a5..ab25d5b 100644 --- a/ncurses/tinfo/comp_parse.c +++ b/ncurses/tinfo/comp_parse.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -47,16 +48,12 @@ #include <tic.h> -MODULE_ID("$Id: comp_parse.c,v 1.90 2013/08/31 15:22:31 tom Exp $") +MODULE_ID("$Id: comp_parse.c,v 1.109 2020/02/02 23:34:34 tom Exp $") -static void sanity_check2(TERMTYPE *, bool); -NCURSES_IMPEXP void NCURSES_API(*_nc_check_termtype2) (TERMTYPE *, bool) = sanity_check2; +static void sanity_check2(TERMTYPE2 *, bool); +NCURSES_IMPEXP void NCURSES_API(*_nc_check_termtype2) (TERMTYPE2 *, bool) = sanity_check2; -/* obsolete: 20040705 */ -static void sanity_check(TERMTYPE *); -NCURSES_IMPEXP void NCURSES_API(*_nc_check_termtype) (TERMTYPE *) = sanity_check; - -static void fixup_acsc(TERMTYPE *, int); +static void fixup_acsc(TERMTYPE2 *, int); static void enqueue(ENTRY * ep) @@ -75,6 +72,8 @@ enqueue(ENTRY * ep) newp->last->next = newp; } +#define NAMEBUFFER_SIZE (MAX_NAME_SIZE + 2) + static char * force_bar(char *dst, char *src) { @@ -82,8 +81,8 @@ force_bar(char *dst, char *src) size_t len = strlen(src); if (len > MAX_NAME_SIZE) len = MAX_NAME_SIZE; - (void) strncpy(dst, src, len); - _nc_STRCPY(dst + len, "|", MAX_NAME_SIZE); + _nc_STRNCPY(dst, src, MAX_NAME_SIZE); + _nc_STRCPY(dst + len, "|", NAMEBUFFER_SIZE - len); src = dst; } return src; @@ -107,8 +106,8 @@ static bool check_collisions(char *n1, char *n2, int counter) { char *pstart, *qstart, *pend, *qend; - char nc1[MAX_NAME_SIZE + 2]; - char nc2[MAX_NAME_SIZE + 2]; + char nc1[NAMEBUFFER_SIZE]; + char nc2[NAMEBUFFER_SIZE]; n1 = ForceBar(nc1, n1); n2 = ForceBar(nc2, n2); @@ -182,11 +181,11 @@ remove_collision(char *n1, char *n2) ++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); } - removed = TRUE; break; } } @@ -267,6 +266,126 @@ _nc_read_entry_source(FILE *fp, char *buf, _nc_suppress_warnings = oldsuppress; } +#if 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 = STRING; + } 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)) { + DEBUG(2, + ("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 { + DEBUG(2, ("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))); + } + _nc_warning("merge changes type of %s from %s to %s", + 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 */ @@ -319,6 +438,9 @@ _nc_resolve_uses2(bool fullresolve, bool literal) char *lookfor = qp->uses[i].name; long lookline = qp->uses[i].line; + if (lookfor == 0) + continue; + foundit = FALSE; _nc_set_type(child); @@ -337,11 +459,11 @@ _nc_resolve_uses2(bool fullresolve, bool literal) /* if that didn't work, try to merge in a compiled entry */ if (!foundit) { - TERMTYPE thisterm; + TERMTYPE2 thisterm; char filename[PATH_MAX]; memset(&thisterm, 0, sizeof(thisterm)); - if (_nc_read_entry(lookfor, filename, &thisterm) == 1) { + if (_nc_read_entry2(lookfor, filename, &thisterm) == 1) { DEBUG(2, ("%s: resolving use=%s (compiled)", child, lookfor)); @@ -382,7 +504,7 @@ _nc_resolve_uses2(bool fullresolve, bool literal) */ if (fullresolve) { do { - TERMTYPE merged; + ENTRY merged; keepgoing = FALSE; @@ -396,7 +518,8 @@ _nc_resolve_uses2(bool fullresolve, bool literal) * subsequent pass. */ for (i = 0; i < qp->nuses; i++) - if (qp->uses[i].link->nuses) { + 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; @@ -408,20 +531,24 @@ _nc_resolve_uses2(bool fullresolve, bool literal) * the merged entry the name field and string * table pointer. */ - _nc_copy_termtype(&merged, &(qp->tterm)); + _nc_copy_termtype2(&(merged.tterm), &(qp->tterm)); /* * Now merge in each use entry in the proper * (reverse) order. */ - for (; qp->nuses; qp->nuses--) + for (; qp->nuses; qp->nuses--) { + validate_merge(&merged, + qp->uses[qp->nuses - 1].link); _nc_merge_entry(&merged, - &qp->uses[qp->nuses - 1].link->tterm); + qp->uses[qp->nuses - 1].link); + } /* * Now merge in the original entry. */ - _nc_merge_entry(&merged, &qp->tterm); + validate_merge(&merged, qp); + _nc_merge_entry(&merged, qp); /* * Replace the original entry with the merged one. @@ -432,7 +559,7 @@ _nc_resolve_uses2(bool fullresolve, bool literal) #if NCURSES_XNAMES FreeIfNeeded(qp->tterm.ext_Names); #endif - qp->tterm = merged; + qp->tterm = merged.tterm; _nc_wrap_entry(qp, TRUE); /* @@ -459,54 +586,46 @@ _nc_resolve_uses2(bool fullresolve, bool literal) DEBUG(2, ("RESOLUTION FINISHED")); - if (fullresolve) - if (_nc_check_termtype != 0) { - _nc_curr_col = -1; - for_entry_list(qp) { - _nc_curr_line = (int) qp->startline; - _nc_set_type(_nc_first_name(qp->tterm.term_names)); + 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; + /* - * tic overrides this function pointer to provide more verbose - * checking. + * Setup so that tic can use ordinary terminfo interface to + * obtain capability information. */ - 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; - fake_tm.type = qp->tterm; - _nc_set_screen(&fake_sp); - set_curterm(&fake_tm); - - _nc_check_termtype2(&qp->tterm, literal); - - _nc_set_screen(save_SP); - set_curterm(save_tm); - } else { - fixup_acsc(&qp->tterm, literal); - } + 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); + + _nc_set_screen(save_SP); + set_curterm(save_tm); + } else { + fixup_acsc(&qp->tterm, literal); } - DEBUG(2, ("SANITY CHECK FINISHED")); } + DEBUG(2, ("SANITY CHECK FINISHED")); + } return (TRUE); } -/* obsolete: 20040705 */ -NCURSES_EXPORT(int) -_nc_resolve_uses(bool fullresolve) -{ - return _nc_resolve_uses2(fullresolve, FALSE); -} - /* * This bit of legerdemain turns all the terminfo variable names into * references to locations in the arrays Booleans, Numbers, and Strings --- @@ -517,18 +636,18 @@ _nc_resolve_uses(bool fullresolve) #define CUR tp-> static void -fixup_acsc(TERMTYPE *tp, int literal) +fixup_acsc(TERMTYPE2 *tp, int literal) { if (!literal) { - if (acs_chars == 0 - && enter_alt_charset_mode != 0 - && exit_alt_charset_mode != 0) + if (acs_chars == ABSENT_STRING + && PRESENT(enter_alt_charset_mode) + && PRESENT(exit_alt_charset_mode)) acs_chars = strdup(VT_ACSC); } } static void -sanity_check2(TERMTYPE *tp, bool literal) +sanity_check2(TERMTYPE2 *tp, bool literal) { if (!PRESENT(exit_attribute_mode)) { #ifdef __UNUSED__ /* this casts too wide a net */ @@ -547,7 +666,9 @@ sanity_check2(TERMTYPE *tp, bool literal) #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 @@ -578,23 +699,18 @@ sanity_check2(TERMTYPE *tp, bool literal) PAIRED(enter_xon_mode, exit_xon_mode); PAIRED(enter_am_mode, exit_am_mode); ANDMISSING(label_off, label_on); -#ifdef remove_clock +#if defined(display_clock) && defined(remove_clock) PAIRED(display_clock, remove_clock); #endif ANDMISSING(set_color_pair, initialize_pair); } -/* obsolete: 20040705 */ -static void -sanity_check(TERMTYPE *tp) -{ - sanity_check2(tp, FALSE); -} - #if NO_LEAKS NCURSES_EXPORT(void) _nc_leaks_tic(void) { + T((T_CALLED("_nc_free_tic()"))); + _nc_globals.leak_checking = TRUE; _nc_alloc_entry_leaks(); _nc_captoinfo_leaks(); _nc_comp_scan_leaks(); @@ -609,6 +725,6 @@ NCURSES_EXPORT(void) _nc_free_tic(int code) { _nc_leaks_tic(); - _nc_free_tinfo(code); + exit_terminfo(code); } #endif diff --git a/ncurses/tinfo/comp_scan.c b/ncurses/tinfo/comp_scan.c index fe6e8e7..87929d2 100644 --- a/ncurses/tinfo/comp_scan.c +++ b/ncurses/tinfo/comp_scan.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * + * 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 * @@ -50,7 +51,7 @@ #include <ctype.h> #include <tic.h> -MODULE_ID("$Id: comp_scan.c,v 1.102 2013/11/16 19:57:50 tom Exp $") +MODULE_ID("$Id: comp_scan.c,v 1.109 2020/02/02 23:34:34 tom Exp $") /* * Maximum length of string capability we'll accept before raising an error. @@ -168,6 +169,8 @@ next_char(void) if (result != 0) { FreeAndNull(result); FreeAndNull(pushname); + bufptr = 0; + bufstart = 0; allocated = 0; } /* @@ -189,12 +192,11 @@ next_char(void) * quite hard to get completely right. Try it and see. If you * succeed, don't forget to hack push_back() correspondingly. */ - size_t used; size_t len; do { + size_t used = 0; bufstart = 0; - used = 0; do { if (used + (LEXBUFSIZ / 4) >= allocated) { allocated += (allocated + LEXBUFSIZ); @@ -223,6 +225,8 @@ next_char(void) } 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; @@ -669,7 +673,15 @@ _nc_get_token(bool silent) if (numchk == numbuf) _nc_warning("no value given for `%s'", tok_buf); if ((*numchk != '\0') || (ch != separator)) - _nc_warning("Missing 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; @@ -810,8 +822,6 @@ _nc_trans_string(char *ptr, char *last) } if (c == '?' && (_nc_syntax != SYN_TERMCAP)) { *(ptr++) = '\177'; - if (_nc_tracing) - _nc_warning("Allow ^? as synonym for \\177"); } else { if ((c &= 037) == 0) c = 128; @@ -824,8 +834,6 @@ _nc_trans_string(char *ptr, char *last) if (c == EOF) _nc_err_abort(MSG_NO_INPUTS); -#define isoctal(c) ((c) >= '0' && (c) <= '7') - if (isoctal(c) || (strict_bsd && isdigit(c))) { number = c - '0'; for (i = 0; i < 2; i++) { @@ -990,10 +998,8 @@ _nc_push_token(int tokclass) NCURSES_EXPORT(void) _nc_panic_mode(char ch) { - int c; - for (;;) { - c = next_char(); + int c = next_char(); if (c == ch) return; if (c == EOF) diff --git a/ncurses/tinfo/db_iterator.c b/ncurses/tinfo/db_iterator.c index 94a4082..f072668 100644 --- a/ncurses/tinfo/db_iterator.c +++ b/ncurses/tinfo/db_iterator.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2006-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018,2020 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 * @@ -43,7 +44,7 @@ #include <hashed_db.h> #endif -MODULE_ID("$Id: db_iterator.c,v 1.39 2014/11/01 14:47:00 tom Exp $") +MODULE_ID("$Id: db_iterator.c,v 1.48 2020/02/02 23:34:34 tom Exp $") #define HaveTicDirectory _nc_globals.have_tic_directory #define KeepTicDirectory _nc_globals.keep_tic_directory @@ -72,15 +73,18 @@ check_existence(const char *name, struct stat *sb) { bool result = FALSE; - if (stat(name, sb) == 0 - && (S_ISDIR(sb->st_mode) || S_ISREG(sb->st_mode))) { + 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)) { + if (stat(temp, sb) == 0 && S_ISREG(sb->st_mode) && sb->st_size) { result = TRUE; } } @@ -89,6 +93,27 @@ check_existence(const char *name, struct stat *sb) } /* + * 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. */ @@ -99,19 +124,21 @@ update_getenv(const char *name, DBDIRS which) if (which < dbdLAST) { char *value; + char *cached_value = my_vars[which].value; + bool same_value; - if ((value = getenv(name)) == 0 || (value = strdup(value)) == 0) { - ; - } else if (my_vars[which].name == 0 || strcmp(my_vars[which].name, name)) { - FreeIfNeeded(my_vars[which].value); - my_vars[which].name = name; - my_vars[which].value = value; - result = TRUE; - } else if ((my_vars[which].value != 0) ^ (value != 0)) { - FreeIfNeeded(my_vars[which].value); - my_vars[which].value = value; - result = TRUE; - } else if (value != 0 && strcmp(value, my_vars[which].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; @@ -122,6 +149,7 @@ update_getenv(const char *name, DBDIRS which) return result; } +#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP static char * cache_getenv(const char *name, DBDIRS which) { @@ -133,6 +161,7 @@ cache_getenv(const char *name, DBDIRS which) } return result; } +#endif /* * The cache expires if at least a second has passed since the initial lookup, @@ -251,7 +280,7 @@ _nc_first_db(DBDIRS * state, int *offset) *state = dbdTIC; *offset = 0; - T(("_nc_first_db")); + T((T_CALLED("_nc_first_db"))); /* build a blob containing all of the strings we will use for a lookup * table. @@ -260,7 +289,7 @@ _nc_first_db(DBDIRS * state, int *offset) size_t blobsize = 0; const char *values[dbdLAST]; struct stat *my_stat; - int j, k; + int j; if (cache_has_expired) free_cache(); @@ -330,10 +359,12 @@ _nc_first_db(DBDIRS * state, int *offset) my_list = typeCalloc(char *, blobsize); my_stat = typeCalloc(struct stat, blobsize); if (my_list != 0 && my_stat != 0) { - k = 0; + int k = 0; my_list[k++] = my_blob; for (j = 0; my_blob[j] != '\0'; ++j) { - if (my_blob[j] == NCURSES_PATHSEP) { + 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]; } @@ -347,8 +378,10 @@ _nc_first_db(DBDIRS * state, int *offset) if (*my_list[j] == '\0') my_list[j] = strdup(TERMINFO); #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; @@ -377,6 +410,7 @@ _nc_first_db(DBDIRS * state, int *offset) } #endif if (!found) { + T(("not found %s", my_list[j])); k = j; while ((my_list[k] = my_list[k + 1]) != 0) { ++k; @@ -392,6 +426,7 @@ _nc_first_db(DBDIRS * state, int *offset) free(my_stat); } } + returnVoid; } #if NO_LEAKS diff --git a/ncurses/tinfo/doalloc.c b/ncurses/tinfo/doalloc.c index 7c502b0..f0c8141 100644 --- a/ncurses/tinfo/doalloc.c +++ b/ncurses/tinfo/doalloc.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2000,2012 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: doalloc.c,v 1.11 2012/11/03 19:27:41 tom Exp $") +MODULE_ID("$Id: doalloc.c,v 1.12 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(void *) _nc_doalloc(void *oldp, size_t amount) diff --git a/ncurses/tinfo/entries.c b/ncurses/tinfo/entries.c index e84033d..1c55bfe 100644 --- a/ncurses/tinfo/entries.c +++ b/ncurses/tinfo/entries.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2006-2011,2012 Free Software Foundation, Inc. * + * Copyright 2019,2020 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 * @@ -37,7 +38,7 @@ #include <tic.h> -MODULE_ID("$Id: entries.c,v 1.21 2012/05/05 20:33:44 tom Exp $") +MODULE_ID("$Id: entries.c,v 1.30 2020/02/02 23:34:34 tom Exp $") /**************************************************************************** * @@ -63,30 +64,8 @@ MODULE_ID("$Id: entries.c,v 1.21 2012/05/05 20:33:44 tom Exp $") NCURSES_EXPORT_VAR(ENTRY *) _nc_head = 0; NCURSES_EXPORT_VAR(ENTRY *) _nc_tail = 0; -NCURSES_EXPORT(void) -_nc_free_entry(ENTRY * headp, TERMTYPE *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_termtype(&(_nc_head->tterm)); - } -} - -NCURSES_EXPORT(ENTRY *) -_nc_delink_entry(ENTRY * headp, TERMTYPE *tterm) +static ENTRY * +_nc_delink_entry(ENTRY * headp, TERMTYPE2 *tterm) /* delink the allocated storage for the given list entry */ { ENTRY *ep, *last; @@ -112,6 +91,28 @@ _nc_delink_entry(ENTRY * headp, TERMTYPE *tterm) } 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 @@ -120,14 +121,17 @@ _nc_leaks_tinfo(void) T((T_CALLED("_nc_free_tinfo()"))); #if NO_LEAKS + _nc_globals.leak_checking = TRUE; _nc_free_tparm(); _nc_tgetent_leaks(); 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); @@ -144,7 +148,8 @@ _nc_leaks_tinfo(void) free(s); #ifdef TRACE - trace(0); + T((T_RETURN(""))); + curses_trace(0); _nc_trace_buf(-1, (size_t) 0); #endif @@ -160,3 +165,12 @@ _nc_free_tinfo(int code) exit(code); } #endif + +NCURSES_EXPORT(void) +exit_terminfo(int code) +{ +#if NO_LEAKS + _nc_leaks_tinfo(); +#endif + exit(code); +} diff --git a/ncurses/tinfo/free_ttype.c b/ncurses/tinfo/free_ttype.c index ad056ba..7f0fbcc 100644 --- a/ncurses/tinfo/free_ttype.c +++ b/ncurses/tinfo/free_ttype.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1999-2010,2011 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -42,25 +43,46 @@ #include <tic.h> -MODULE_ID("$Id: free_ttype.c,v 1.15 2011/02/06 01:08:31 tom Exp $") +MODULE_ID("$Id: free_ttype.c,v 1.19 2020/02/02 23:34:34 tom Exp $") -NCURSES_EXPORT(void) -_nc_free_termtype(TERMTYPE *ptr) +static void +really_free_termtype(TERMTYPE2 *ptr, bool freeStrings) { T(("_nc_free_termtype(%s)", ptr->term_names)); - FreeIfNeeded(ptr->str_table); + if (freeStrings) { + FreeIfNeeded(ptr->str_table); + } FreeIfNeeded(ptr->Booleans); FreeIfNeeded(ptr->Numbers); FreeIfNeeded(ptr->Strings); #if NCURSES_XNAMES - FreeIfNeeded(ptr->ext_str_table); + if (freeStrings) { + FreeIfNeeded(ptr->ext_str_table); + } FreeIfNeeded(ptr->ext_Names); #endif memset(ptr, 0, sizeof(TERMTYPE)); _nc_free_entry(_nc_head, ptr); } +/* + * This entrypoint is used by tack 1.07 + */ +NCURSES_EXPORT(void) +_nc_free_termtype(TERMTYPE *ptr) +{ + really_free_termtype((TERMTYPE2 *) ptr, !NCURSES_EXT_NUMBERS); +} + +#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; diff --git a/ncurses/tinfo/getenv_num.c b/ncurses/tinfo/getenv_num.c index d5e35cb..ca179d3 100644 --- a/ncurses/tinfo/getenv_num.c +++ b/ncurses/tinfo/getenv_num.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * + * 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 * @@ -36,7 +37,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: getenv_num.c,v 1.6 2013/09/28 20:25:08 tom Exp $") +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) @@ -68,6 +69,8 @@ _nc_setenv_num(const char *name, int value) _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%s=%d", name, value); if ((s = strdup(buffer)) != 0) putenv(s); +#else +#error expected setenv/putenv functions #endif } } diff --git a/ncurses/tinfo/hashed_db.c b/ncurses/tinfo/hashed_db.c index b594205..b78d98f 100644 --- a/ncurses/tinfo/hashed_db.c +++ b/ncurses/tinfo/hashed_db.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2006-2011,2013 Free Software Foundation, Inc. * + * 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 * @@ -36,7 +37,7 @@ #if USE_HASHED_DB -MODULE_ID("$Id: hashed_db.c,v 1.17 2013/12/15 00:33:01 tom Exp $") +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; @@ -273,7 +274,7 @@ _nc_db_next(DB * db, DBT * key, DBT * data) result = -1; } #else - result = db->seq(db, key, data, 0); + result = db->seq(db, key, data, R_NEXT); #endif return result; } diff --git a/ncurses/tinfo/home_terminfo.c b/ncurses/tinfo/home_terminfo.c index e77f71c..7e626df 100644 --- a/ncurses/tinfo/home_terminfo.c +++ b/ncurses/tinfo/home_terminfo.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2012 Free Software Foundation, Inc. * + * 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 * @@ -37,7 +38,7 @@ #include <curses.priv.h> #include <tic.h> -MODULE_ID("$Id: home_terminfo.c,v 1.15 2012/10/27 21:49:14 tom Exp $") +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 */ @@ -48,10 +49,11 @@ _nc_home_terminfo(void) { char *result = 0; #if USE_HOME_TERMINFO - char *home; - 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); diff --git a/ncurses/tinfo/init_keytry.c b/ncurses/tinfo/init_keytry.c index ea47b38..1669c64 100644 --- a/ncurses/tinfo/init_keytry.c +++ b/ncurses/tinfo/init_keytry.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1999-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -29,7 +30,7 @@ #include <curses.priv.h> #include <tic.h> /* struct tinfo_fkeys */ -MODULE_ID("$Id: init_keytry.c,v 1.17 2010/04/24 22:29:56 tom Exp $") +MODULE_ID("$Id: init_keytry.c,v 1.19 2020/02/02 23:34:34 tom Exp $") /* ** _nc_init_keytry() @@ -66,14 +67,14 @@ _nc_tinfo_fkeysf(void) NCURSES_EXPORT(void) _nc_init_keytry(SCREEN *sp) { - unsigned n; - /* The sp->_keytry value is initialized in newterm(), where the sp * structure is created, because we can not tell where keypad() or * mouse_activate() (which will call keyok()) are first called. */ 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), diff --git a/ncurses/tinfo/lib_acs.c b/ncurses/tinfo/lib_acs.c index 69a1851..4ede53f 100644 --- a/ncurses/tinfo/lib_acs.c +++ b/ncurses/tinfo/lib_acs.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -39,7 +40,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_acs.c,v 1.45 2014/03/08 20:32:59 tom Exp $") +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 @@ -171,7 +172,7 @@ NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_DCL0) if (ena_acs != NULL) { NCURSES_PUTP2("ena_acs", ena_acs); } -#if NCURSES_EXT_FUNCS +#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 @@ -205,8 +206,13 @@ NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_DCL0) 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; - if (SP != 0) + 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; } @@ -249,3 +255,72 @@ _nc_init_acs(void) NCURSES_SP_NAME(_nc_init_acs) (CURRENT_SCREEN); } #endif + +#if !NCURSES_WCWIDTH_GRAPHICS +NCURSES_EXPORT(int) +_nc_wacs_width(unsigned ch) +{ + int result; + switch (ch) { + case 0x00a3: /* FALLTHRU - ncurses pound-sterling symbol */ + case 0x00b0: /* FALLTHRU - VT100 degree symbol */ + case 0x00b1: /* FALLTHRU - VT100 plus/minus */ + case 0x00b7: /* FALLTHRU - VT100 bullet */ + case 0x03c0: /* FALLTHRU - ncurses greek pi */ + case 0x2190: /* FALLTHRU - Teletype arrow pointing left */ + case 0x2191: /* FALLTHRU - Teletype arrow pointing up */ + case 0x2192: /* FALLTHRU - Teletype arrow pointing right */ + case 0x2193: /* FALLTHRU - Teletype arrow pointing down */ + case 0x2260: /* FALLTHRU - ncurses not-equal */ + case 0x2264: /* FALLTHRU - ncurses less-than-or-equal-to */ + case 0x2265: /* FALLTHRU - ncurses greater-than-or-equal-to */ + case 0x23ba: /* FALLTHRU - VT100 scan line 1 */ + case 0x23bb: /* FALLTHRU - ncurses scan line 3 */ + case 0x23bc: /* FALLTHRU - ncurses scan line 7 */ + case 0x23bd: /* FALLTHRU - VT100 scan line 9 */ + case 0x2500: /* FALLTHRU - VT100 horizontal line */ + case 0x2501: /* FALLTHRU - thick horizontal line */ + case 0x2502: /* FALLTHRU - VT100 vertical line */ + case 0x2503: /* FALLTHRU - thick vertical line */ + case 0x250c: /* FALLTHRU - VT100 upper left corner */ + case 0x250f: /* FALLTHRU - thick upper left corner */ + case 0x2510: /* FALLTHRU - VT100 upper right corner */ + case 0x2513: /* FALLTHRU - thick upper right corner */ + case 0x2514: /* FALLTHRU - VT100 lower left corner */ + case 0x2517: /* FALLTHRU - thick lower left corner */ + case 0x2518: /* FALLTHRU - VT100 lower right corner */ + case 0x251b: /* FALLTHRU - thick lower right corner */ + case 0x251c: /* FALLTHRU - VT100 tee pointing left */ + case 0x2523: /* FALLTHRU - thick tee pointing left */ + case 0x2524: /* FALLTHRU - VT100 tee pointing right */ + case 0x252b: /* FALLTHRU - thick tee pointing right */ + case 0x252c: /* FALLTHRU - VT100 tee pointing down */ + case 0x2533: /* FALLTHRU - thick tee pointing down */ + case 0x2534: /* FALLTHRU - VT100 tee pointing up */ + case 0x253b: /* FALLTHRU - thick tee pointing up */ + case 0x253c: /* FALLTHRU - VT100 large plus or crossover */ + case 0x254b: /* FALLTHRU - thick large plus or crossover */ + case 0x2550: /* FALLTHRU - double horizontal line */ + case 0x2551: /* FALLTHRU - double vertical line */ + case 0x2554: /* FALLTHRU - double upper left corner */ + case 0x2557: /* FALLTHRU - double upper right corner */ + case 0x255a: /* FALLTHRU - double lower left corner */ + case 0x255d: /* FALLTHRU - double lower right corner */ + case 0x2560: /* FALLTHRU - double tee pointing right */ + case 0x2563: /* FALLTHRU - double tee pointing left */ + case 0x2566: /* FALLTHRU - double tee pointing down */ + case 0x2569: /* FALLTHRU - double tee pointing up */ + case 0x256c: /* FALLTHRU - double large plus or crossover */ + case 0x2592: /* FALLTHRU - VT100 checker board (stipple) */ + case 0x25ae: /* FALLTHRU - Teletype solid square block */ + case 0x25c6: /* FALLTHRU - VT100 diamond */ + case 0x2603: /* FALLTHRU - Teletype lantern symbol */ + result = 1; + break; + default: + result = wcwidth(ch); + break; + } + return result; +} +#endif /* !NCURSES_WCWIDTH_GRAPHICS */ diff --git a/ncurses/tinfo/lib_baudrate.c b/ncurses/tinfo/lib_baudrate.c index 1dee46c..4f72de5 100644 --- a/ncurses/tinfo/lib_baudrate.c +++ b/ncurses/tinfo/lib_baudrate.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> #include <termcap.h> /* ospeed */ -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined(__OpenBSD__) #include <sys/param.h> #endif @@ -49,7 +50,11 @@ * 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__)) +#if NCURSES_OSPEED_COMPAT && \ + ((defined(__FreeBSD__) && (__FreeBSD_version < 700000)) || \ + defined(__NetBSD__) || \ + ((defined(__OpenBSD__) && OpenBSD < 201510)) || \ + defined(__APPLE__)) #undef B0 #undef B50 #undef B75 @@ -79,7 +84,7 @@ #undef USE_OLD_TTY #endif /* USE_OLD_TTY */ -MODULE_ID("$Id: lib_baudrate.c,v 1.35 2014/04/26 18:48:19 juergen Exp $") +MODULE_ID("$Id: lib_baudrate.c,v 1.44 2020/02/02 23:34:34 tom Exp $") /* * int @@ -90,8 +95,8 @@ MODULE_ID("$Id: lib_baudrate.c,v 1.35 2014/04/26 18:48:19 juergen Exp $") */ struct speed { - NCURSES_OSPEED s; /* values for 'ospeed' */ - int sp; /* the actual speed */ + int given_speed; /* values for 'ospeed' */ + int actual_speed; /* the actual speed */ }; #define DATA(number) { B##number, number } @@ -117,6 +122,9 @@ static struct speed const speeds[] = #elif defined(EXTA) {EXTA, 19200}, #endif +#ifdef B28800 + DATA(28800), +#endif #ifdef B38400 DATA(38400), #elif defined(EXTB) @@ -127,18 +135,57 @@ static struct speed const speeds[] = #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 }; @@ -151,8 +198,11 @@ _nc_baudrate(int OSpeed) #endif int result = ERR; - unsigned i; + if (OSpeed < 0) + OSpeed = (NCURSES_OSPEED) OSpeed; + if (OSpeed < 0) + OSpeed = (unsigned short) OSpeed; #if !USE_REENTRANT if (OSpeed == last_OSpeed) { result = last_baudrate; @@ -160,9 +210,14 @@ _nc_baudrate(int OSpeed) #endif if (result == ERR) { if (OSpeed >= 0) { + unsigned i; + for (i = 0; i < SIZEOF(speeds); i++) { - if (speeds[i].s == OSpeed) { - result = speeds[i].sp; + if (speeds[i].given_speed > OSpeed) { + break; + } + if (speeds[i].given_speed == OSpeed) { + result = speeds[i].actual_speed; break; } } @@ -181,12 +236,13 @@ NCURSES_EXPORT(int) _nc_ospeed(int BaudRate) { int result = 1; - unsigned i; if (BaudRate >= 0) { + unsigned i; + for (i = 0; i < SIZEOF(speeds); i++) { - if (speeds[i].sp == BaudRate) { - result = speeds[i].s; + if (speeds[i].actual_speed == BaudRate) { + result = speeds[i].given_speed; break; } } @@ -208,7 +264,7 @@ NCURSES_SP_NAME(baudrate) (NCURSES_SP_DCL0) */ #ifdef TRACE if (IsValidTIScreen(SP_PARM) - && !NC_ISATTY(fileno(SP_PARM ? SP_PARM->_ofp : stdout)) + && !NC_ISATTY(fileno((SP_PARM && SP_PARM->_ofp) ? SP_PARM->_ofp : stdout)) && getenv("BAUDRATE") != 0) { int ret; if ((ret = _nc_getenv_num("BAUDRATE")) <= 0) diff --git a/ncurses/tinfo/lib_cur_term.c b/ncurses/tinfo/lib_cur_term.c index 9941d13..4a90335 100644 --- a/ncurses/tinfo/lib_cur_term.c +++ b/ncurses/tinfo/lib_cur_term.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -39,10 +40,10 @@ #include <curses.priv.h> #include <termcap.h> /* ospeed */ -MODULE_ID("$Id: lib_cur_term.c,v 1.33 2014/03/08 20:32:59 tom Exp $") +MODULE_ID("$Id: lib_cur_term.c,v 1.42 2020/02/02 23:34:34 tom Exp $") #undef CUR -#define CUR termp->type. +#define CUR TerminalType(termp). #if USE_REENTRANT @@ -76,7 +77,7 @@ NCURSES_EXPORT_VAR(TERMINAL *) cur_term = 0; #endif NCURSES_EXPORT(TERMINAL *) -NCURSES_SP_NAME(set_curterm) (NCURSES_SP_DCLx TERMINAL * termp) +NCURSES_SP_NAME(set_curterm) (NCURSES_SP_DCLx TERMINAL *termp) { TERMINAL *oldterm; @@ -95,16 +96,21 @@ NCURSES_SP_NAME(set_curterm) (NCURSES_SP_DCLx TERMINAL * termp) #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) termp; ospeed = (NCURSES_OSPEED) _nc_ospeed(termp->_baudrate); - if (TCB->drv->isTerminfo && termp->type.Strings) { + if (TCB->drv && + TCB->drv->isTerminfo && + TerminalType(termp).Strings) { PC = (char) ((pad_char != NULL) ? pad_char[0] : 0); } TCB->csp = SP_PARM; #else ospeed = (NCURSES_OSPEED) _nc_ospeed(termp->_baudrate); - if (termp->type.Strings) { + if (TerminalType(termp).Strings) { PC = (char) ((pad_char != NULL) ? pad_char[0] : 0); } #endif +#if !USE_REENTRANT + save_ttytype(termp); +#endif } _nc_unlock_global(curses); @@ -114,14 +120,14 @@ NCURSES_SP_NAME(set_curterm) (NCURSES_SP_DCLx TERMINAL * termp) #if NCURSES_SP_FUNCS NCURSES_EXPORT(TERMINAL *) -set_curterm(TERMINAL * termp) +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) +NCURSES_SP_NAME(del_curterm) (NCURSES_SP_DCLx TERMINAL *termp) { int rc = ERR; @@ -139,7 +145,10 @@ NCURSES_SP_NAME(del_curterm) (NCURSES_SP_DCLx TERMINAL * termp) #endif ); - _nc_free_termtype(&(termp->type)); +#if NCURSES_EXT_NUMBERS + _nc_free_termtype(&termp->type); +#endif + _nc_free_termtype2(&TerminalType(termp)); if (termp == cur) NCURSES_SP_NAME(set_curterm) (NCURSES_SP_ARGx 0); @@ -153,6 +162,10 @@ NCURSES_SP_NAME(del_curterm) (NCURSES_SP_DCLx TERMINAL * termp) 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 free(termp); rc = OK; @@ -162,9 +175,9 @@ NCURSES_SP_NAME(del_curterm) (NCURSES_SP_DCLx TERMINAL * termp) #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) -del_curterm(TERMINAL * termp) +del_curterm(TERMINAL *termp) { - int rc = ERR; + int rc; _nc_lock_global(curses); rc = NCURSES_SP_NAME(del_curterm) (CURRENT_SCREEN, termp); diff --git a/ncurses/tinfo/lib_data.c b/ncurses/tinfo/lib_data.c index 06b6f88..bf3e554 100644 --- a/ncurses/tinfo/lib_data.c +++ b/ncurses/tinfo/lib_data.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * + * 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_data.c,v 1.66 2013/08/24 17:28:24 tom Exp $") +MODULE_ID("$Id: lib_data.c,v 1.80 2020/02/02 23:34:34 tom Exp $") /* * OS/2's native linker complains if we don't initialize public data when @@ -94,7 +95,9 @@ _nc_screen(void) NCURSES_EXPORT(int) _nc_alloc_screen(void) { - return ((my_screen = _nc_alloc_screen_sp()) != 0); + my_screen = _nc_alloc_screen_sp(); + T(("_nc_alloc_screen_sp %p", my_screen)); + return (my_screen != 0); } NCURSES_EXPORT(void) @@ -137,6 +140,8 @@ NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = { 0, /* slk_format */ + 2048, /* getstr_limit */ + NULL, /* safeprint_buf */ 0, /* safeprint_used */ @@ -150,6 +155,10 @@ NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = { 0, /* dbd_time */ { { 0, 0 } }, /* dbd_vars */ +#ifdef USE_TERM_DRIVER + 0, /* term_driver */ +#endif + #ifndef USE_SP_WINDOWLIST 0, /* _nc_windowlist */ #endif @@ -163,15 +172,28 @@ NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = { 0, /* safeprint_rows */ #endif -#ifdef USE_TERM_DRIVER - 0, /* term_driver */ +#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, /* init_trace */ + FALSE, /* trace_opened */ CHARS_0s, /* trace_fname */ 0, /* trace_level */ NULL, /* trace_fp */ + -1, /* trace_fd */ NULL, /* tracearg_buf */ 0, /* tracearg_used */ @@ -194,15 +216,8 @@ NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = { 0, /* nested_tracef */ #endif #endif /* TRACE */ -#ifdef USE_PTHREADS - PTHREAD_MUTEX_INITIALIZER, /* mutex_curses */ - PTHREAD_MUTEX_INITIALIZER, /* mutex_tst_tracef */ - PTHREAD_MUTEX_INITIALIZER, /* mutex_tracef */ - 0, /* nested_tracef */ - 0, /* use_pthreads */ -#endif -#if USE_PTHREADS_EINTR - 0, /* read_thread */ +#if NO_LEAKS + FALSE, /* leak_checking */ #endif }; @@ -214,17 +229,11 @@ NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = { #define RIPOFF_0s { RIPOFF_0 } NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen = { + NULL, /* allocated */ TRUE, /* use_env */ FALSE, /* filter_mode */ A_NORMAL, /* previous_attr */ -#ifndef USE_SP_RIPOFF - RIPOFF_0s, /* ripoff */ - NULL, /* rsp */ -#endif { /* tparm_state */ -#ifdef TRACE - NULL, /* tname */ -#endif NULL, /* tparam_base */ STACK_FRAME_0s, /* stack */ @@ -239,12 +248,20 @@ NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen = { NUM_VARS_0s, /* dynamic_var */ 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 - 0, /* _outch */ #if BROKEN_LINKER || USE_REENTRANT NULL, /* real_acs_map */ 0, /* LINES */ @@ -252,12 +269,13 @@ NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen = { 8, /* TABSIZE */ 1000, /* ESCDELAY */ 0, /* cur_term */ +#endif #ifdef TRACE +#if BROKEN_LINKER || USE_REENTRANT 0L, /* _outchars */ NULL, /* _tputs_trace */ #endif #endif - FALSE, /* use_tioctl */ }; /* *INDENT-ON* */ @@ -287,6 +305,9 @@ init_global_mutexes(void) 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); } @@ -371,7 +392,7 @@ _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); + return (sigprocmask) (how, newmask, oldmask); } #endif #endif /* USE_PTHREADS */ diff --git a/ncurses/tinfo/lib_has_cap.c b/ncurses/tinfo/lib_has_cap.c index 17e59d5..cbf68b3 100644 --- a/ncurses/tinfo/lib_has_cap.c +++ b/ncurses/tinfo/lib_has_cap.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2013 Free Software Foundation, Inc. * + * 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 * @@ -46,7 +47,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_has_cap.c,v 1.10 2013/11/16 19:57:22 tom Exp $") +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) diff --git a/ncurses/tinfo/lib_kernel.c b/ncurses/tinfo/lib_kernel.c index 37f7084..482657a 100644 --- a/ncurses/tinfo/lib_kernel.c +++ b/ncurses/tinfo/lib_kernel.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -48,7 +49,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_kernel.c,v 1.31 2010/12/19 01:21:19 tom Exp $") +MODULE_ID("$Id: lib_kernel.c,v 1.32 2020/02/02 23:34:34 tom Exp $") static int _nc_vdisable(void) diff --git a/ncurses/tinfo/lib_longname.c b/ncurses/tinfo/lib_longname.c index 1490317..835d15c 100644 --- a/ncurses/tinfo/lib_longname.c +++ b/ncurses/tinfo/lib_longname.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -42,7 +43,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_longname.c,v 1.12 2010/12/20 00:31:26 tom Exp $") +MODULE_ID("$Id: lib_longname.c,v 1.14 2020/02/02 23:34:34 tom Exp $") #if USE_REENTRANT NCURSES_EXPORT(char *) @@ -74,6 +75,17 @@ longname(void) #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) { diff --git a/ncurses/tinfo/lib_napms.c b/ncurses/tinfo/lib_napms.c index df17363..99dacd7 100644 --- a/ncurses/tinfo/lib_napms.c +++ b/ncurses/tinfo/lib_napms.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2014 Free Software Foundation, Inc. * + * 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 * @@ -51,7 +52,7 @@ #endif #endif -MODULE_ID("$Id: lib_napms.c,v 1.24 2014/03/08 20:32:59 tom Exp $") +MODULE_ID("$Id: lib_napms.c,v 1.26 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) NCURSES_SP_NAME(napms) (NCURSES_SP_DCLx int ms) @@ -59,9 +60,7 @@ NCURSES_SP_NAME(napms) (NCURSES_SP_DCLx int ms) T((T_CALLED("napms(%d)"), ms)); #ifdef USE_TERM_DRIVER - if (HasTerminal(SP_PARM)) { - CallDriver_1(SP_PARM, td_nap, ms); - } + CallDriver_1(SP_PARM, td_nap, ms); #else /* !USE_TERM_DRIVER */ #if NCURSES_SP_FUNCS (void) sp; diff --git a/ncurses/tinfo/lib_options.c b/ncurses/tinfo/lib_options.c index b736d5f..784e06c 100644 --- a/ncurses/tinfo/lib_options.c +++ b/ncurses/tinfo/lib_options.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -46,7 +47,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_options.c,v 1.78 2014/09/27 21:55:24 tom Exp $") +MODULE_ID("$Id: lib_options.c,v 1.81 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) idlok(WINDOW *win, bool flag) @@ -87,7 +88,7 @@ NCURSES_SP_NAME(halfdelay) (NCURSES_SP_DCLx int t) { T((T_CALLED("halfdelay(%p,%d)"), (void *) SP_PARM, t)); - if (t < 1 || t > 255 || !IsValidTIScreen(SP_PARM)) + if (t < 1 || t > 255 || !SP_PARM || !IsValidTIScreen(SP_PARM)) returnCode(ERR); NCURSES_SP_NAME(cbreak) (NCURSES_SP_ARG); @@ -202,7 +203,7 @@ NCURSES_SP_NAME(curs_set) (NCURSES_SP_DCLx int vis) #ifdef USE_TERM_DRIVER code = CallDriver_1(SP_PARM, td_cursorSet, vis); #else - if (IsTermInfo(SP_PARM)) { + if (IsValidTIScreen(SP_PARM)) { switch (vis) { case 2: code = NCURSES_PUTP2_FLUSH("cursor_visible", @@ -241,7 +242,7 @@ NCURSES_EXPORT(int) NCURSES_SP_NAME(typeahead) (NCURSES_SP_DCLx int fd) { T((T_CALLED("typeahead(%p, %d)"), (void *) SP_PARM, fd)); - if (IsValidTIScreen(SP_PARM)) { + if (SP_PARM && IsValidTIScreen(SP_PARM)) { SP_PARM->_checkfd = fd; returnCode(OK); } else { diff --git a/ncurses/tinfo/lib_print.c b/ncurses/tinfo/lib_print.c index 0dab4d4..eb92149 100644 --- a/ncurses/tinfo/lib_print.c +++ b/ncurses/tinfo/lib_print.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright 2018,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 * @@ -39,7 +40,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_print.c,v 1.23 2012/02/22 22:34:31 tom Exp $") +MODULE_ID("$Id: lib_print.c,v 1.25 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) NCURSES_SP_NAME(mcprint) (NCURSES_SP_DCLx char *data, int len) @@ -95,7 +96,7 @@ NCURSES_SP_NAME(mcprint) (NCURSES_SP_DCLx char *data, int len) * kernel will ship the contiguous clist items from the last write * immediately. */ -#ifndef __MINGW32__ +#ifndef _WIN32 (void) sleep(0); #endif free(mybuf); diff --git a/ncurses/tinfo/lib_raw.c b/ncurses/tinfo/lib_raw.c index 928692b..a691a26 100644 --- a/ncurses/tinfo/lib_raw.c +++ b/ncurses/tinfo/lib_raw.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * 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 * @@ -49,7 +50,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_raw.c,v 1.21 2012/01/21 19:21:29 KO.Myung-Hun Exp $") +MODULE_ID("$Id: lib_raw.c,v 1.24 2020/02/02 23:34:34 tom Exp $") #if HAVE_SYS_TERMIO_H #include <sys/termio.h> /* needed for ISC */ @@ -112,8 +113,10 @@ NCURSES_SP_NAME(raw) (NCURSES_SP_DCL0) kbdinfo.fsMask |= KEYBOARD_BINARY_MODE; KbdSetStatus(&kbdinfo, 0); #endif - SP_PARM->_raw = TRUE; - SP_PARM->_cbreak = 1; + if (SP_PARM) { + SP_PARM->_raw = TRUE; + SP_PARM->_cbreak = 1; + } termp->Nttyb = buf; } AFTER("raw"); @@ -154,7 +157,9 @@ NCURSES_SP_NAME(cbreak) (NCURSES_SP_DCL0) #endif result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); if (result == OK) { - SP_PARM->_cbreak = 1; + if (SP_PARM) { + SP_PARM->_cbreak = 1; + } termp->Nttyb = buf; } AFTER("cbreak"); @@ -177,12 +182,12 @@ cbreak(void) NCURSES_EXPORT(void) NCURSES_SP_NAME(qiflush) (NCURSES_SP_DCL0) { - int result = ERR; 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; @@ -190,6 +195,7 @@ NCURSES_SP_NAME(qiflush) (NCURSES_SP_DCL0) 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) @@ -241,8 +247,10 @@ NCURSES_SP_NAME(noraw) (NCURSES_SP_DCL0) kbdinfo.fsMask |= KEYBOARD_ASCII_MODE; KbdSetStatus(&kbdinfo, 0); #endif - SP_PARM->_raw = FALSE; - SP_PARM->_cbreak = 0; + if (SP_PARM) { + SP_PARM->_raw = FALSE; + SP_PARM->_cbreak = 0; + } termp->Nttyb = buf; } AFTER("noraw"); @@ -280,7 +288,9 @@ NCURSES_SP_NAME(nocbreak) (NCURSES_SP_DCL0) #endif result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); if (result == OK) { - SP_PARM->_cbreak = 0; + if (SP_PARM) { + SP_PARM->_cbreak = 0; + } termp->Nttyb = buf; } AFTER("nocbreak"); @@ -299,12 +309,12 @@ nocbreak(void) NCURSES_EXPORT(void) NCURSES_SP_NAME(noqiflush) (NCURSES_SP_DCL0) { - int result = ERR; 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; @@ -313,6 +323,7 @@ NCURSES_SP_NAME(noqiflush) (NCURSES_SP_DCL0) result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); #else /* FIXME */ + result = ERR; #endif if (result == OK) termp->Nttyb = buf; diff --git a/ncurses/tinfo/lib_setup.c b/ncurses/tinfo/lib_setup.c index 0b81a5e..a6527bf 100644 --- a/ncurses/tinfo/lib_setup.c +++ b/ncurses/tinfo/lib_setup.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -48,7 +49,7 @@ #include <locale.h> #endif -MODULE_ID("$Id: lib_setup.c,v 1.161 2014/11/01 12:33:16 tom Exp $") +MODULE_ID("$Id: lib_setup.c,v 1.207 2020/02/02 23:34:34 tom Exp $") /**************************************************************************** * @@ -98,7 +99,7 @@ MODULE_ID("$Id: lib_setup.c,v 1.161 2014/11/01 12:33:16 tom Exp $") * Reduce explicit use of "cur_term" global variable. */ #undef CUR -#define CUR termp->type. +#define CUR TerminalType(termp). /* * Wrap global variables in this module. @@ -115,12 +116,12 @@ NCURSES_PUBLIC_VAR(ttytype) (void) if (CURRENT_SCREEN) { TERMINAL *termp = TerminalOf(CURRENT_SCREEN); if (termp != 0) { - result = termp->type.term_names; + result = TerminalType(termp).term_names; } } #else if (cur_term != 0) { - result = cur_term->type.term_names; + result = TerminalType(cur_term).term_names; } #endif return result; @@ -173,16 +174,20 @@ NCURSES_EXPORT(int) NCURSES_SP_NAME(set_tabsize) (NCURSES_SP_DCLx int value) { int code = OK; -#if USE_REENTRANT - if (SP_PARM) { - SP_PARM->_TABSIZE = value; - } else { + 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; + (void) SP_PARM; + TABSIZE = value; #endif + } return code; } @@ -220,9 +225,9 @@ _nc_handle_sigwinch(SCREEN *sp) 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 - START_TRACE(); if (IsPreScreen(SP_PARM)) { SP_PARM->_use_env = f; } @@ -235,11 +240,11 @@ NCURSES_SP_NAME(use_env) (NCURSES_SP_DCLx bool f) 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 - START_TRACE(); if (IsPreScreen(SP_PARM)) { - SP_PARM->_use_tioctl = f; + SP_PARM->use_tioctl = f; } #else _nc_prescreen.use_tioctl = f; @@ -251,8 +256,8 @@ NCURSES_SP_NAME(use_tioctl) (NCURSES_SP_DCLx bool f) NCURSES_EXPORT(void) use_env(bool f) { - T((T_CALLED("use_env(%d)"), (int) f)); START_TRACE(); + T((T_CALLED("use_env(%d)"), (int) f)); _nc_prescreen.use_env = f; returnVoid; } @@ -260,8 +265,8 @@ use_env(bool f) NCURSES_EXPORT(void) use_tioctl(bool f) { - T((T_CALLED("use_tioctl(%d)"), (int) f)); START_TRACE(); + T((T_CALLED("use_tioctl(%d)"), (int) f)); _nc_prescreen.use_tioctl = f; returnVoid; } @@ -270,7 +275,7 @@ use_tioctl(bool f) NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *sp, #ifdef USE_TERM_DRIVER - TERMINAL * termp, + TERMINAL *termp, #endif int *linep, int *colp) /* Obtain lines/columns values from the environment and/or terminfo entry */ @@ -297,6 +302,8 @@ _nc_get_screensize(SCREEN *sp, #else /* !USE_TERM_DRIVER */ TERMINAL *termp = cur_term; int my_tabsize; + bool useEnv = _nc_prescreen.use_env; + bool useTioctl = _nc_prescreen.use_tioctl; /* figure out the size of the screen */ T(("screen size: terminfo lines = %d columns = %d", lines, columns)); @@ -304,9 +311,14 @@ _nc_get_screensize(SCREEN *sp, *linep = (int) lines; *colp = (int) columns; - if (_nc_prescreen.use_env || _nc_prescreen.use_tioctl) { - int value; +#if NCURSES_SP_FUNCS + if (sp) { + useEnv = sp->_use_env; + useTioctl = sp->use_tioctl; + } +#endif + if (useEnv || useTioctl) { #ifdef __EMX__ { int screendata[2]; @@ -340,8 +352,10 @@ _nc_get_screensize(SCREEN *sp, } #endif /* HAVE_SIZECHANGE */ - if (_nc_prescreen.use_env) { - if (_nc_prescreen.use_tioctl) { + if (useEnv) { + int value; + + if (useTioctl) { /* * If environment variables are used, update them. */ @@ -389,8 +403,14 @@ _nc_get_screensize(SCREEN *sp, * 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); + 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 } T(("screen size is %dx%d", *linep, *colp)); @@ -431,23 +451,24 @@ _nc_update_screensize(SCREEN *sp) int old_cols = columns; #endif - 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 != 0 && 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 */ + 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; } - sp->_sig_winch = FALSE; } } -#endif +#endif /* USE_SIZECHANGE */ /**************************************************************************** * @@ -461,10 +482,10 @@ _nc_update_screensize(SCREEN *sp) * just like tgetent(). */ int -_nc_setup_tinfo(const char *const tn, TERMTYPE *const tp) +_nc_setup_tinfo(const char *const tn, TERMTYPE2 *const tp) { char filename[PATH_MAX]; - int status = _nc_read_entry(tn, filename, tp); + int status = _nc_read_entry2(tn, filename, tp); /* * If we have an entry, force all of the cancelled strings to null @@ -492,10 +513,8 @@ _nc_setup_tinfo(const char *const tn, TERMTYPE *const tp) ** and substitute it in for the prototype given in 'command_character'. */ void -_nc_tinfo_cmdch(TERMINAL * termp, int proto) +_nc_tinfo_cmdch(TERMINAL *termp, int proto) { - unsigned i; - char CC; char *tmp; /* @@ -504,7 +523,9 @@ _nc_tinfo_cmdch(TERMINAL * termp, int proto) * name as an environment variable - using the same symbol. */ if ((tmp = getenv("CC")) != 0 && strlen(tmp) == 1) { - CC = *tmp; + unsigned i; + char CC = *tmp; + for_each_string(i, &(termp->type)) { for (tmp = termp->type.Strings[i]; tmp && *tmp; tmp++) { if (UChar(*tmp) == proto) @@ -528,9 +549,9 @@ _nc_get_locale(void) */ env = setlocale(LC_CTYPE, 0); #else - if (((env = getenv("LC_ALL")) != 0 && *env != '\0') + if (((env = getenv("LANG")) != 0 && *env != '\0') || ((env = getenv("LC_CTYPE")) != 0 && *env != '\0') - || ((env = getenv("LANG")) != 0 && *env != '\0')) { + || ((env = getenv("LC_ALL")) != 0 && *env != '\0')) { ; } #endif @@ -545,7 +566,7 @@ NCURSES_EXPORT(int) _nc_unicode_locale(void) { int result = 0; -#if defined(__MINGW32__) && USE_WIDEC_SUPPORT +#if defined(_WIN32) && USE_WIDEC_SUPPORT result = 1; #elif HAVE_LANGINFO_CODESET char *env = nl_langinfo(CODESET); @@ -571,13 +592,14 @@ _nc_unicode_locale(void) * character set. */ NCURSES_EXPORT(int) -_nc_locale_breaks_acs(TERMINAL * termp) +_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) { @@ -597,23 +619,22 @@ _nc_locale_breaks_acs(TERMINAL * termp) } } } - return result; + returnCode(result); } NCURSES_EXPORT(int) -TINFO_SETUP_TERM(TERMINAL ** tp, - NCURSES_CONST char *tname, +TINFO_SETUP_TERM(TERMINAL **tp, + const char *tname, int Filedes, int *errret, int reuse) { #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *TCB = 0; -#else - int status; #endif TERMINAL *termp; SCREEN *sp = 0; + char *myname; int code = ERR; START_TRACE(); @@ -642,14 +663,16 @@ TINFO_SETUP_TERM(TERMINAL ** tp, #endif } } + myname = strdup(tname); - if (strlen(tname) > MAX_NAME_SIZE) { + if (strlen(myname) > MAX_NAME_SIZE) { ret_error(TGETENT_ERR, "TERM environment must be <= %d characters.\n", - MAX_NAME_SIZE); + MAX_NAME_SIZE, + free(myname)); } - T(("your terminal name is %s", tname)); + T(("your terminal name is %s", myname)); /* * Allow output redirection. This is what SVr3 does. If stdout is @@ -678,8 +701,8 @@ TINFO_SETUP_TERM(TERMINAL ** tp, && (termp != 0) && termp->Filedes == Filedes && termp->_termname != 0 - && !strcmp(termp->_termname, tname) - && _nc_name_match(termp->type.term_names, tname, "|")) { + && !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 @@ -688,39 +711,65 @@ TINFO_SETUP_TERM(TERMINAL ** tp, } else { #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *my_tcb; - my_tcb = typeCalloc(TERMINAL_CONTROL_BLOCK, 1); - termp = &(my_tcb->term); + 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_error0(TGETENT_ERR, - "Not enough memory to create terminal structure.\n"); + ret_error1(TGETENT_ERR, + "Not enough memory to create terminal structure.\n", + myname, free(myname)); } +#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(); TCB = (TERMINAL_CONTROL_BLOCK *) termp; - code = _nc_globals.term_driver(TCB, tname, errret); + code = _nc_globals.term_driver(TCB, myname, errret); if (code == OK) { termp->Filedes = (short) Filedes; - termp->_termname = strdup(tname); + termp->_termname = strdup(myname); } else { - ret_error0(TGETENT_ERR, - "Could not find any driver to handle this terminal.\n"); + 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(tname, &termp->type); + 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 TERMTYPE *fallback = _nc_fallback(tname); + const TERMTYPE2 *fallback = _nc_fallback2(myname); if (fallback) { - _nc_copy_termtype(&(termp->type), fallback); + T(("found fallback entry")); + _nc_copy_termtype2(&(TerminalType(termp)), fallback); status = TGETENT_YES; } } @@ -728,18 +777,24 @@ TINFO_SETUP_TERM(TERMINAL ** tp, 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", tname); + ret_error1(status, "unknown terminal type.\n", + myname, free(myname)); + } else { + ret_error0(status, "unexpected return-code\n"); } } +#if NCURSES_EXT_NUMBERS + _nc_export_termtype2(&termp->type, &TerminalType(termp)); +#endif #if !USE_REENTRANT - strncpy(ttytype, termp->type.term_names, (size_t) (NAMESIZE - 1)); - ttytype[NAMESIZE - 1] = '\0'; + save_ttytype(termp); #endif termp->Filedes = (short) Filedes; - termp->_termname = strdup(tname); + termp->_termname = strdup(myname); set_curterm(termp); @@ -750,10 +805,11 @@ TINFO_SETUP_TERM(TERMINAL ** tp, * 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. + * baudrate. Also get the shell-mode so that erasechar() works. */ if (NC_ISATTY(Filedes)) { - def_prog_mode(); + NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG); + NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG); baudrate(); } code = OK; @@ -785,36 +841,97 @@ TINFO_SETUP_TERM(TERMINAL ** tp, 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", tname); + 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", tname); + 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", tname); + 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(); + 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; + } + } +} +#endif /* USE_PTHREADS */ + #if NCURSES_SP_FUNCS /* * In case of handling multiple screens, we need to have a screen before - * initialization in 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. + * 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) { - static SCREEN *sp; + SCREEN *sp; START_TRACE(); T((T_CALLED("new_prescr()"))); - if (sp == 0) { + _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; @@ -830,7 +947,10 @@ new_prescr(void) sp->_ESCDELAY = _nc_prescreen._ESCDELAY; #endif } + } else { + T(("_nc_alloc_screen_sp %p (reuse)", (void *) sp)); } + _nc_unlock_global(screen); returnSP(sp); } #endif @@ -841,17 +961,24 @@ new_prescr(void) * the same TERMINAL data (see comment). */ NCURSES_EXPORT(int) -_nc_setupterm(NCURSES_CONST char *tname, +_nc_setupterm(const char *tname, int Filedes, int *errret, int reuse) { - int res; + int rc = ERR; TERMINAL *termp = 0; - res = TINFO_SETUP_TERM(&termp, tname, Filedes, errret, reuse); - if (ERR != res) - NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN_PRE, termp); - return res; + + _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 @@ -862,7 +989,8 @@ _nc_setupterm(NCURSES_CONST char *tname, * Make cur_term point to the structure. */ NCURSES_EXPORT(int) -setupterm(NCURSES_CONST char *tname, int Filedes, int *errret) +setupterm(const char *tname, int Filedes, int *errret) { + START_TRACE(); return _nc_setupterm(tname, Filedes, errret, FALSE); } diff --git a/ncurses/tinfo/lib_termcap.c b/ncurses/tinfo/lib_termcap.c index fdfc494..5ce43a3 100644 --- a/ncurses/tinfo/lib_termcap.c +++ b/ncurses/tinfo/lib_termcap.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * + * 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 * @@ -48,7 +49,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_termcap.c,v 1.80 2013/06/08 16:48:47 tom Exp $") +MODULE_ID("$Id: lib_termcap.c,v 1.88 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT_VAR(char *) UP = 0; NCURSES_EXPORT_VAR(char *) BC = 0; @@ -100,8 +101,7 @@ NCURSES_SP_NAME(tgetent) (NCURSES_SP_DCLx char *bufp, const char *name) START_TRACE(); T((T_CALLED("tgetent()"))); - TINFO_SETUP_TERM(&termp, (NCURSES_CONST char *) name, - STDOUT_FILENO, &rc, TRUE); + TINFO_SETUP_TERM(&termp, name, STDOUT_FILENO, &rc, TRUE); #ifdef USE_TERM_DRIVER if (termp == 0 || @@ -153,8 +153,12 @@ NCURSES_SP_NAME(tgetent) (NCURSES_SP_DCLx char *bufp, const char *name) } CacheInx = best; } - LAST_TRM = TerminalOf(SP_PARM); - LAST_SEQ = ++CacheSeq; + if (rc == 1) { + LAST_TRM = TerminalOf(SP_PARM); + LAST_SEQ = ++CacheSeq; + } else { + LAST_TRM = 0; + } PC = 0; UP = 0; @@ -175,7 +179,8 @@ NCURSES_SP_NAME(tgetent) (NCURSES_SP_DCLx char *bufp, const char *name) if (backspace_if_not_bs != NULL) BC = backspace_if_not_bs; - if ((FIX_SGR0 = _nc_trim_sgr0(&(TerminalOf(SP_PARM)->type))) != 0) { + 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); @@ -230,15 +235,15 @@ same_tcname(const char *a, const char *b) ***************************************************************************/ NCURSES_EXPORT(int) -NCURSES_SP_NAME(tgetflag) (NCURSES_SP_DCLx NCURSES_CONST char *id) +NCURSES_SP_NAME(tgetflag) (NCURSES_SP_DCLx const char *id) { int result = 0; /* Solaris returns zero for missing flag */ - int j = -1; T((T_CALLED("tgetflag(%p, %s)"), (void *) SP_PARM, id)); if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) { - TERMTYPE *tp = &(TerminalOf(SP_PARM)->type); + 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) { @@ -266,7 +271,7 @@ NCURSES_SP_NAME(tgetflag) (NCURSES_SP_DCLx NCURSES_CONST char *id) #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) -tgetflag(NCURSES_CONST char *id) +tgetflag(const char *id) { return NCURSES_SP_NAME(tgetflag) (CURRENT_SCREEN, id); } @@ -282,15 +287,15 @@ tgetflag(NCURSES_CONST char *id) ***************************************************************************/ NCURSES_EXPORT(int) -NCURSES_SP_NAME(tgetnum) (NCURSES_SP_DCLx NCURSES_CONST char *id) +NCURSES_SP_NAME(tgetnum) (NCURSES_SP_DCLx const char *id) { int result = ABSENT_NUMERIC; - int j = -1; T((T_CALLED("tgetnum(%p, %s)"), (void *) SP_PARM, id)); if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) { - TERMTYPE *tp = &(TerminalOf(SP_PARM)->type); + 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) { @@ -318,7 +323,7 @@ NCURSES_SP_NAME(tgetnum) (NCURSES_SP_DCLx NCURSES_CONST char *id) #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) -tgetnum(NCURSES_CONST char *id) +tgetnum(const char *id) { return NCURSES_SP_NAME(tgetnum) (CURRENT_SCREEN, id); } @@ -334,15 +339,15 @@ tgetnum(NCURSES_CONST char *id) ***************************************************************************/ NCURSES_EXPORT(char *) -NCURSES_SP_NAME(tgetstr) (NCURSES_SP_DCLx NCURSES_CONST char *id, char **area) +NCURSES_SP_NAME(tgetstr) (NCURSES_SP_DCLx const char *id, char **area) { char *result = NULL; - int j = -1; T((T_CALLED("tgetstr(%s,%p)"), id, (void *) area)); if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) { - TERMTYPE *tp = &(TerminalOf(SP_PARM)->type); + 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) { @@ -384,20 +389,41 @@ NCURSES_SP_NAME(tgetstr) (NCURSES_SP_DCLx NCURSES_CONST char *id, char **area) #if NCURSES_SP_FUNCS NCURSES_EXPORT(char *) -tgetstr(NCURSES_CONST char *id, char **area) +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(TERMINAL *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) { - FreeIfNeeded(FIX_SGR0); - if (LAST_TRM != 0) + if (LAST_TRM != 0) { del_curterm(LAST_TRM); + _nc_tgetent_leak(LAST_TRM); + } } } #endif diff --git a/ncurses/tinfo/lib_termname.c b/ncurses/tinfo/lib_termname.c index e3f6827..2d80bb3 100644 --- a/ncurses/tinfo/lib_termname.c +++ b/ncurses/tinfo/lib_termname.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2003,2009 Free Software Foundation, Inc. * + * 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 * @@ -28,7 +29,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_termname.c,v 1.12 2009/10/24 21:56:58 tom Exp $") +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) diff --git a/ncurses/tinfo/lib_tgoto.c b/ncurses/tinfo/lib_tgoto.c index 31daf44..8e24085 100644 --- a/ncurses/tinfo/lib_tgoto.c +++ b/ncurses/tinfo/lib_tgoto.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2000-2008,2012 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -35,7 +36,7 @@ #include <ctype.h> #include <termcap.h> -MODULE_ID("$Id: lib_tgoto.c,v 1.16 2012/02/24 02:08:08 tom Exp $") +MODULE_ID("$Id: lib_tgoto.c,v 1.19 2020/02/02 23:34:34 tom Exp $") #if !PURE_TERMINFO static bool @@ -125,7 +126,14 @@ tgoto_internal(const char *string, int x, int y) *value += 1; need_BC = TRUE; } else { - *value = 0200; /* tputs will treat this as \0 */ + /* 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++; @@ -199,6 +207,6 @@ tgoto(const char *string, int x, int y) result = tgoto_internal(string, x, y); else #endif - result = TPARM_2((NCURSES_CONST char *) string, y, x); + result = TPARM_2(string, y, x); returnPtr(result); } diff --git a/ncurses/tinfo/lib_ti.c b/ncurses/tinfo/lib_ti.c index e9ae746..5cb77b8 100644 --- a/ncurses/tinfo/lib_ti.c +++ b/ncurses/tinfo/lib_ti.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2013 Free Software Foundation, Inc. * + * 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 * @@ -36,7 +37,7 @@ #include <tic.h> -MODULE_ID("$Id: lib_ti.c,v 1.30 2013/06/08 16:55:05 tom Exp $") +MODULE_ID("$Id: lib_ti.c,v 1.34 2020/02/02 23:34:34 tom Exp $") #if 0 static bool @@ -50,16 +51,16 @@ same_name(const char *a, const char *b) #endif NCURSES_EXPORT(int) -NCURSES_SP_NAME(tigetflag) (NCURSES_SP_DCLx NCURSES_CONST char *str) +NCURSES_SP_NAME(tigetflag) (NCURSES_SP_DCLx const char *str) { int result = ABSENT_BOOLEAN; - int j = -1; T((T_CALLED("tigetflag(%p, %s)"), (void *) SP_PARM, str)); if (HasTInfoTerminal(SP_PARM)) { - TERMTYPE *tp = &(TerminalOf(SP_PARM)->type); + 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) { @@ -88,23 +89,23 @@ NCURSES_SP_NAME(tigetflag) (NCURSES_SP_DCLx NCURSES_CONST char *str) #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) -tigetflag(NCURSES_CONST char *str) +tigetflag(const char *str) { return NCURSES_SP_NAME(tigetflag) (CURRENT_SCREEN, str); } #endif NCURSES_EXPORT(int) -NCURSES_SP_NAME(tigetnum) (NCURSES_SP_DCLx NCURSES_CONST char *str) +NCURSES_SP_NAME(tigetnum) (NCURSES_SP_DCLx const char *str) { - int j = -1; int result = CANCELLED_NUMERIC; /* Solaris returns a -1 on error */ T((T_CALLED("tigetnum(%p, %s)"), (void *) SP_PARM, str)); if (HasTInfoTerminal(SP_PARM)) { - TERMTYPE *tp = &(TerminalOf(SP_PARM)->type); + 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) { @@ -135,23 +136,23 @@ NCURSES_SP_NAME(tigetnum) (NCURSES_SP_DCLx NCURSES_CONST char *str) #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) -tigetnum(NCURSES_CONST char *str) +tigetnum(const char *str) { return NCURSES_SP_NAME(tigetnum) (CURRENT_SCREEN, str); } #endif NCURSES_EXPORT(char *) -NCURSES_SP_NAME(tigetstr) (NCURSES_SP_DCLx NCURSES_CONST char *str) +NCURSES_SP_NAME(tigetstr) (NCURSES_SP_DCLx const char *str) { char *result = CANCELLED_STRING; - int j = -1; T((T_CALLED("tigetstr(%p, %s)"), (void *) SP_PARM, str)); if (HasTInfoTerminal(SP_PARM)) { - TERMTYPE *tp = &(TerminalOf(SP_PARM)->type); + 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) { @@ -180,7 +181,7 @@ NCURSES_SP_NAME(tigetstr) (NCURSES_SP_DCLx NCURSES_CONST char *str) #if NCURSES_SP_FUNCS NCURSES_EXPORT(char *) -tigetstr(NCURSES_CONST char *str) +tigetstr(const char *str) { return NCURSES_SP_NAME(tigetstr) (CURRENT_SCREEN, str); } diff --git a/ncurses/tinfo/lib_tparm.c b/ncurses/tinfo/lib_tparm.c index 44a2061..400cd31 100644 --- a/ncurses/tinfo/lib_tparm.c +++ b/ncurses/tinfo/lib_tparm.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -42,7 +43,7 @@ #include <ctype.h> #include <tic.h> -MODULE_ID("$Id: lib_tparm.c,v 1.93 2014/10/11 03:04:31 tom Exp $") +MODULE_ID("$Id: lib_tparm.c,v 1.108 2020/02/02 23:34:34 tom Exp $") /* * char * @@ -326,6 +327,7 @@ parse_format(const char *s, char *format, int *len) #define isUPPER(c) ((c) >= 'A' && (c) <= 'Z') #define isLOWER(c) ((c) >= 'a' && (c) <= 'z') +#define tc_BUMP() if (level < 0 && number < 2) number++ /* * Analyze the string to see how many parameters we need from the varargs list, @@ -346,14 +348,15 @@ _nc_tparm_analyze(const char *string, char *p_is_s[NUM_PARM], int *popcount) int lastpop = -1; int len; int number = 0; + int level = -1; const char *cp = string; static char dummy[] = ""; if (cp == 0) return 0; - if ((len2 = strlen(cp)) > TPS(fmt_size)) { - TPS(fmt_size) = len2 + TPS(fmt_size) + 2; + 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; @@ -378,22 +381,27 @@ _nc_tparm_analyze(const char *string, char *p_is_s[NUM_PARM], int *popcount) #ifdef EXP_XTERM_1005 case 'u': #endif - if (lastpop <= 0) - number++; + if (lastpop <= 0) { + tc_BUMP(); + } + level -= 1; lastpop = -1; break; case 'l': case 's': - if (lastpop > 0) + if (lastpop > 0) { + level -= 1; p_is_s[lastpop - 1] = dummy; - ++number; + } + tc_BUMP(); break; case 'p': cp++; i = (UChar(*cp) - '0'); if (i >= 0 && i <= NUM_PARM) { + ++level; lastpop = i; if (lastpop > *popcount) *popcount = lastpop; @@ -401,20 +409,22 @@ _nc_tparm_analyze(const char *string, char *p_is_s[NUM_PARM], int *popcount) break; case 'P': - ++number; ++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++; @@ -434,14 +444,15 @@ _nc_tparm_analyze(const char *string, char *p_is_s[NUM_PARM], int *popcount) case '=': case '<': case '>': + tc_BUMP(); + level -= 1; /* pop 2, operate, push 1 */ lastpop = -1; - number += 2; break; case '!': case '~': + tc_BUMP(); lastpop = -1; - ++number; break; case 'i': @@ -475,8 +486,10 @@ tparam_internal(int use_TPARM_ARG, const char *string, va_list ap) bool termcap_hack; bool incremented_two; - if (cp == NULL) + if (cp == NULL) { + TR(TRACE_CALLS, ("%s: format is null", TPS(tname))); return NULL; + } TPS(out_used) = 0; len2 = strlen(cp); @@ -487,8 +500,10 @@ tparam_internal(int use_TPARM_ARG, const char *string, va_list ap) * variable-length argument list. */ number = _nc_tparm_analyze(cp, p_is_s, &popcount); - if (TPS(fmt_buff) == 0) + if (TPS(fmt_buff) == 0) { + TR(TRACE_CALLS, ("%s: error in analysis", TPS(tname))); return NULL; + } incremented_two = FALSE; @@ -527,7 +542,6 @@ tparam_internal(int use_TPARM_ARG, const char *string, va_list ap) termcap_hack = FALSE; if (popcount == 0) { termcap_hack = TRUE; - popcount = number; for (i = number - 1; i >= 0; i--) { if (p_is_s[i]) spush(p_is_s[i]); @@ -538,10 +552,16 @@ tparam_internal(int use_TPARM_ARG, const char *string, va_list ap) #ifdef TRACE if (USE_TRACEF(TRACE_CALLS)) { for (i = 0; i < num_args; i++) { - if (p_is_s[i] != 0) + if (p_is_s[i] != 0) { save_text(", %s", _nc_visbuf(p_is_s[i]), 0); - else + } else if ((long) param[i] > MAX_OF_TYPE(NCURSES_INT2) || + (long) param[i] < 0) { + _tracef("BUG: problem with tparm parameter #%d of %d", + i + 1, num_args); + break; + } else { save_number(", %d", (int) param[i], 0); + } } _tracef(T_CALLED("%s(%s%s)"), TPS(tname), _nc_visbuf(cp), TPS(out_buff)); TPS(out_used) = 0; @@ -672,11 +692,15 @@ tparam_internal(int use_TPARM_ARG, const char *string, va_list ap) break; case 'A': - npush(npop() && npop()); + y = npop(); + x = npop(); + npush(y && x); break; case 'O': - npush(npop() || npop()); + y = npop(); + x = npop(); + npush(y || x); break; case '&': @@ -817,7 +841,7 @@ tparam_internal(int use_TPARM_ARG, const char *string, va_list ap) #endif NCURSES_EXPORT(char *) -tparm_varargs(NCURSES_CONST char *string,...) +tparm_varargs(const char *string, ...) { va_list ap; char *result; @@ -834,7 +858,7 @@ tparm_varargs(NCURSES_CONST char *string,...) #if !NCURSES_TPARM_VARARGS NCURSES_EXPORT(char *) -tparm_proto(NCURSES_CONST char *string, +tparm_proto(const char *string, TPARM_ARG a1, TPARM_ARG a2, TPARM_ARG a3, @@ -850,7 +874,7 @@ tparm_proto(NCURSES_CONST char *string, #endif /* NCURSES_TPARM_VARARGS */ NCURSES_EXPORT(char *) -tiparm(const char *string,...) +tiparm(const char *string, ...) { va_list ap; char *result; diff --git a/ncurses/tinfo/lib_tputs.c b/ncurses/tinfo/lib_tputs.c index 09cbbc2..bfde26e 100644 --- a/ncurses/tinfo/lib_tputs.c +++ b/ncurses/tinfo/lib_tputs.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2015 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -51,7 +52,7 @@ #include <termcap.h> /* ospeed */ #include <tic.h> -MODULE_ID("$Id: lib_tputs.c,v 1.96 2015/01/03 23:51:23 tom Exp $") +MODULE_ID("$Id: lib_tputs.c,v 1.103 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT_VAR(char) PC = 0; /* used by termcap library */ NCURSES_EXPORT_VAR(NCURSES_OSPEED) ospeed = 0; /* used by termcap library */ @@ -123,11 +124,11 @@ NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_DCL0) if (SP_PARM->out_inuse) { char *buf = SP_PARM->out_buffer; size_t amount = SP->out_inuse; - ssize_t res; SP->out_inuse = 0; + TR(TRACE_CHARPUT, ("flushing %ld bytes", (unsigned long) amount)); while (amount) { - res = write(SP_PARM->_ofd, buf, amount); + ssize_t res = write(SP_PARM->_ofd, buf, amount); if (res > 0) { /* if the write was incomplete, try again */ @@ -142,6 +143,8 @@ NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_DCL0) } } } + } else { + fflush(stdout); } } @@ -271,13 +274,16 @@ NCURSES_SP_NAME(tputs) (NCURSES_SP_DCLx #endif /* BSD_TPUTS */ #ifdef TRACE - char addrbuf[32]; - if (USE_TRACEF(TRACE_TPUTS)) { - if (outc == NCURSES_SP_NAME(_nc_outch)) + 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)) "%p", outc); + } 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); @@ -425,7 +431,7 @@ NCURSES_EXPORT(int) _nc_outc_wrapper(SCREEN *sp, int c) { if (0 == sp) { - return (ERR); + return fputc(c, stdout); } else { return sp->jump(c); } diff --git a/ncurses/tinfo/lib_ttyflags.c b/ncurses/tinfo/lib_ttyflags.c index 43bed35..bfcd64a 100644 --- a/ncurses/tinfo/lib_ttyflags.c +++ b/ncurses/tinfo/lib_ttyflags.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2014 Free Software Foundation, Inc. * + * 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 * @@ -41,42 +42,42 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_ttyflags.c,v 1.30 2014/04/26 18:47:20 juergen Exp $") +MODULE_ID("$Id: lib_ttyflags.c,v 1.34 2020/02/02 23:34:34 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 || SP_PARM == 0) { + if (buf == 0 || termp == 0) { result = ERR; } else { - TERMINAL *termp = TerminalOf(SP_PARM); - if (0 == termp) { - 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; + for (;;) { + if (GET_TTY(termp->Filedes, buf) != 0) { + if (errno == EINTR) + continue; + result = ERR; } -#endif + break; } - - if (result == ERR) - memset(buf, 0, sizeof(*buf)); +#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); } @@ -141,7 +142,8 @@ NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_DCL0) int rc = ERR; TERMINAL *termp = TerminalOf(SP_PARM); - T((T_CALLED("def_shell_mode(%p)"), (void *) SP_PARM)); + T((T_CALLED("def_shell_mode(%p) ->term %p"), + (void *) SP_PARM, (void *) termp)); if (termp != 0) { #ifdef USE_TERM_DRIVER @@ -179,7 +181,7 @@ NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_DCL0) int rc = ERR; TERMINAL *termp = TerminalOf(SP_PARM); - T((T_CALLED("def_prog_mode(%p)"), (void *) SP_PARM)); + T((T_CALLED("def_prog_mode(%p) ->term %p"), (void *) SP_PARM, (void *) termp)); if (termp != 0) { #ifdef USE_TERM_DRIVER @@ -215,7 +217,7 @@ NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_DCL0) int rc = ERR; TERMINAL *termp = TerminalOf(SP_PARM); - T((T_CALLED("reset_prog_mode(%p)"), (void *) SP_PARM)); + T((T_CALLED("reset_prog_mode(%p) ->term %p"), (void *) SP_PARM, (void *) termp)); if (termp != 0) { #ifdef USE_TERM_DRIVER @@ -247,7 +249,8 @@ NCURSES_SP_NAME(reset_shell_mode) (NCURSES_SP_DCL0) int rc = ERR; TERMINAL *termp = TerminalOf(SP_PARM); - T((T_CALLED("reset_shell_mode(%p)"), (void *) SP_PARM)); + T((T_CALLED("reset_shell_mode(%p) ->term %p"), + (void *) SP_PARM, (void *) termp)); if (termp != 0) { #ifdef USE_TERM_DRIVER diff --git a/ncurses/tinfo/make_hash.c b/ncurses/tinfo/make_hash.c index 37ac765..9980279 100644 --- a/ncurses/tinfo/make_hash.c +++ b/ncurses/tinfo/make_hash.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * + * 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 * @@ -34,7 +35,6 @@ /* * make_hash.c --- build-time program for constructing comp_captab.c - * */ #include <build.priv.h> @@ -44,14 +44,14 @@ #include <ctype.h> -MODULE_ID("$Id: make_hash.c,v 1.13 2013/09/28 20:55:47 tom Exp $") +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 table[] and HASHTABSIZE - * slots in hash_table[]. + * by name. There are CAPTABSIZE entries in the predefined table[] + * and HASHTABSIZE slots in hash_table[]. * */ @@ -59,6 +59,14 @@ MODULE_ID("$Id: make_hash.c,v 1.13 2013/09/28 20:55:47 tom Exp $") #define MODULE_ID(id) /*nothing */ #include <tinfo/doalloc.c> +#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) { @@ -82,7 +90,7 @@ strmalloc(char *s) * * Computes the hashing function on the given string. * - * The current hash function is the sum of each consectutive pair + * The current hash function is the sum of each consecutive pair * of characters, taken as two-byte integers, mod HASHTABSIZE. * */ @@ -93,36 +101,40 @@ hash_function(const char *string) long sum = 0; while (*string) { - sum += (long) (*string + (*(string + 1) << 8)); + sum += (long) (UChar(*string) + (UChar(*(string + 1)) << 8)); string++; } return (int) (sum % HASHTABSIZE); } +#define UNUSED -1 + static void -_nc_make_hash_table(struct name_table_entry *table, - HashValue * hash_table) +_nc_make_hash_table(struct user_table_entry *table, + HashValue * hash_table, + unsigned tablesize) { - short i; + unsigned i; int hashvalue; int collisions = 0; for (i = 0; i < HASHTABSIZE; i++) { - hash_table[i] = -1; + hash_table[i] = UNUSED; } - for (i = 0; i < CAPTABSIZE; i++) { - hashvalue = hash_function(table[i].nte_name); + for (i = 0; i < tablesize; i++) { + hashvalue = hash_function(table[i].ute_name); if (hash_table[hashvalue] >= 0) collisions++; - if (hash_table[hashvalue] != 0) - table[i].nte_link = hash_table[hashvalue]; - hash_table[hashvalue] = i; + 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, CAPTABSIZE); + printf("/* %d collisions out of %d entries */\n", collisions, tablesize); } /* @@ -156,10 +168,18 @@ parse_columns(char *buffer) int col = 0; - if (list == 0 && (list = typeCalloc(char *, (MAX_COLUMNS + 1))) == 0) - return (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++) @@ -188,21 +208,58 @@ parse_columns(char *buffer) 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) { - struct name_table_entry *name_table = typeCalloc(struct - name_table_entry, CAPTABSIZE); + 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; - int n; + unsigned n; + unsigned nn; + unsigned tableused = 0; + bool is_user; + const char *table_name; char buffer[BUFSIZ]; - static const char *typenames[] = - {"BOOLEAN", "NUMBER", "STRING"}; - short BoolCount = 0; short NumCount = 0; short StrCount = 0; @@ -220,42 +277,80 @@ main(int argc, char **argv) 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 < CAPTABSIZE) && fgets(buffer, BUFSIZ, stdin);) { - char **list, *nlp = strchr(buffer, '\n'); + 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 (column > count_columns(list)) { + 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); } - name_table[n].nte_link = -1; /* end-of-hash */ - name_table[n].nte_name = strmalloc(list[column]); + 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")) { - name_table[n].nte_type = BOOLEAN; - name_table[n].nte_index = BoolCount++; + SetType(nn, BOOLEAN); + name_table[nn].ute_index = BoolCount++; } else if (!strcmp(list[2], "num")) { - name_table[n].nte_type = NUMBER; - name_table[n].nte_index = NumCount++; + SetType(nn, NUMBER); + name_table[nn].ute_index = NumCount++; } else if (!strcmp(list[2], "str")) { - name_table[n].nte_type = STRING; - name_table[n].nte_index = StrCount++; + 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++; } - _nc_make_hash_table(name_table, hash_table); + if (tablesize > tableused) + tablesize = tableused; + _nc_make_hash_table(name_table, hash_table, tablesize); /* * Write the compiled tables to standard output @@ -265,66 +360,86 @@ main(int argc, char **argv) int nxt; printf("static const char %s_names_text[] = \\\n", root_name); - for (n = 0; n < CAPTABSIZE; n++) { - nxt = (int) strlen(name_table[n].nte_name) + 5; + 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].nte_name); + printf("\"%s\\0\" ", name_table[n].ute_name); len += nxt; } printf(";\n\n"); len = 0; - printf("static name_table_data const %s_names_data[] =\n", + printf("static %s_table_data const %s_names_data[] =\n", + table_name, root_name); - printf("{\n"); - for (n = 0; n < CAPTABSIZE; n++) { - printf("\t{ %15d,\t%10s,\t%3d, %3d }%c\n", - len, - typenames[name_table[n].nte_type], - name_table[n].nte_index, - name_table[n].nte_link, - n < CAPTABSIZE - 1 ? ',' : ' '); - len += (int) strlen(name_table[n].nte_name) + 1; + 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("};\n\n"); - printf("static struct name_table_entry *_nc_%s_table = 0;\n\n", root_name); + 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 name_table_entry const _nc_%s_table[] =\n", + printf("static struct %s_table_entry const _nc_%s_table[] =\n", + table_name, root_name); - printf("{\n"); - for (n = 0; n < CAPTABSIZE; n++) { + printf("%s\n", L_BRACE); + for (n = 0; n < tablesize; n++) { _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "\"%s\"", - name_table[n].nte_name); - printf("\t{ %15s,\t%10s,\t%3d, %3d }%c\n", - buffer, - typenames[name_table[n].nte_type], - name_table[n].nte_index, - name_table[n].nte_link, - n < CAPTABSIZE - 1 ? ',' : ' '); + 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("};\n\n"); + printf("%s;\n\n", R_BRACE); } printf("static const HashValue _nc_%s_hash_table[%d] =\n", root_name, HASHTABSIZE + 1); - printf("{\n"); + 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("};\n\n"); - - printf("#if (BOOLCOUNT!=%d)||(NUMCOUNT!=%d)||(STRCOUNT!=%d)\n", - BoolCount, NumCount, StrCount); - printf("#error\t--> term.h and comp_captab.c disagree about the <--\n"); - printf("#error\t--> numbers of booleans, numbers and/or strings <--\n"); - printf("#endif\n\n"); + printf("%s;\n\n", R_BRACE); + + if (!is_user) { + printf("#if (BOOLCOUNT!=%d)||(NUMCOUNT!=%d)||(STRCOUNT!=%d)\n", + BoolCount, NumCount, StrCount); + printf("#error\t--> term.h and comp_captab.c disagree about the <--\n"); + printf("#error\t--> numbers of booleans, numbers and/or strings <--\n"); + printf("#endif\n\n"); + } free(hash_table); + for (n = 0; (n < tablesize); ++n) { + free((void *) name_table[n].ute_name); + } + free(name_table); + parse_columns(0); + return EXIT_SUCCESS; } diff --git a/ncurses/tinfo/make_keys.c b/ncurses/tinfo/make_keys.c index f44f7c7..80bbf63 100644 --- a/ncurses/tinfo/make_keys.c +++ b/ncurses/tinfo/make_keys.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -39,11 +40,26 @@ #define USE_TERMLIB 1 #include <build.priv.h> -MODULE_ID("$Id: make_keys.c,v 1.20 2011/10/22 16:34:50 tom Exp $") +MODULE_ID("$Id: make_keys.c,v 1.22 2020/02/02 23:34:34 tom Exp $") #include <names.c> -#define UNKNOWN (unsigned) (SIZEOF(strnames) + SIZEOF(strfnames)) +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) @@ -64,7 +80,7 @@ lookup(const char *name) } } } - return found ? n : UNKNOWN; + return found ? n : unknown(); } static void @@ -73,6 +89,7 @@ make_keys(FILE *ifp, FILE *ofp) char buffer[BUFSIZ]; char from[256]; char to[256]; + unsigned ignore = unknown(); unsigned maxlen = 16; int scanned; @@ -86,7 +103,7 @@ make_keys(FILE *ifp, FILE *ofp) scanned = sscanf(buffer, "%255s %255s", to, from); if (scanned == 2) { unsigned code = lookup(from); - if (code == UNKNOWN) + if (code == ignore) continue; if (strlen(from) > maxlen) maxlen = (unsigned) strlen(from); diff --git a/ncurses/tinfo/name_match.c b/ncurses/tinfo/name_match.c index c648535..71e584d 100644 --- a/ncurses/tinfo/name_match.c +++ b/ncurses/tinfo/name_match.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1999-2012,2013 Free Software Foundation, Inc. * + * 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 * @@ -33,7 +34,7 @@ #include <curses.priv.h> #include <tic.h> -MODULE_ID("$Id: name_match.c,v 1.23 2013/05/25 20:20:08 tom Exp $") +MODULE_ID("$Id: name_match.c,v 1.25 2020/02/02 23:34:34 tom Exp $") #define FirstName _nc_globals.first_name @@ -58,8 +59,6 @@ skip_index(const char *name) NCURSES_EXPORT(char *) _nc_first_name(const char *const sp) { - unsigned n; - #if NO_LEAKS if (sp == 0) { if (FirstName != 0) { @@ -72,6 +71,7 @@ _nc_first_name(const char *const sp) 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); @@ -93,11 +93,13 @@ _nc_first_name(const char *const sp) NCURSES_EXPORT(int) _nc_name_match(const char *const namelst, const char *const name, const char *const delim) { - const char *s, *d, *t; - int code, found; + 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; diff --git a/ncurses/tinfo/obsolete.c b/ncurses/tinfo/obsolete.c index 63476dc..972a9a1 100644 --- a/ncurses/tinfo/obsolete.c +++ b/ncurses/tinfo/obsolete.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2013,2014 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -36,10 +37,10 @@ #include <curses.priv.h> -MODULE_ID("$Id: obsolete.c,v 1.3 2014/10/11 02:39:35 tom Exp $") +MODULE_ID("$Id: obsolete.c,v 1.6 2020/02/02 23:34:34 tom Exp $") /* - * Obsolete entrypoint retained for binary compatbility. + * Obsolete entrypoint retained for binary compatibility. */ NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_set_buffer) (NCURSES_SP_DCLx FILE *ofp, int buffered) @@ -68,7 +69,7 @@ _nc_strdup(const char *s) size_t need = strlen(s); result = malloc(need + 1); if (result != 0) { - strcpy(result, s); + _nc_STRCPY(result, s, need); } } return result; diff --git a/ncurses/tinfo/parse_entry.c b/ncurses/tinfo/parse_entry.c index 2936a64..23574b6 100644 --- a/ncurses/tinfo/parse_entry.c +++ b/ncurses/tinfo/parse_entry.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -47,7 +48,7 @@ #include <ctype.h> #include <tic.h> -MODULE_ID("$Id: parse_entry.c,v 1.79 2012/10/27 21:43:45 tom Exp $") +MODULE_ID("$Id: parse_entry.c,v 1.99 2020/02/02 23:34:34 tom Exp $") #ifdef LINT static short const parametrized[] = @@ -56,17 +57,17 @@ static short const parametrized[] = #include <parametrized.h> #endif -static void postprocess_termcap(TERMTYPE *, bool); -static void postprocess_terminfo(TERMTYPE *); +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, char *name, int token_type) +_nc_extend_names(ENTRY * entryp, const char *name, int token_type) { static struct name_table_entry temp; - TERMTYPE *tp = &(entryp->tterm); + TERMTYPE2 *tp = &(entryp->tterm); unsigned offset = 0; unsigned actual; unsigned tindex; @@ -152,7 +153,7 @@ _nc_extend_names(ENTRY * entryp, char *name, int token_type) case NUMBER: tp->ext_Numbers++; tp->num_Numbers++; - TYPE_REALLOC(short, tp->num_Numbers, tp->Numbers); + TYPE_REALLOC(NCURSES_INT2, tp->num_Numbers, tp->Numbers); for_each_value(tp->num_Numbers) tp->Numbers[last] = tp->Numbers[last - 1]; break; @@ -178,8 +179,55 @@ _nc_extend_names(ENTRY * entryp, char *name, int token_type) 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 */ +static bool +valid_entryname(const char *name) +{ + bool result = TRUE; + int ch; + while ((ch = UChar(*name++)) != '\0') { + if (ch <= ' ' || ch > '~' || ch == '/') { + result = FALSE; + break; + } + } + return result; +} + /* * int * _nc_parse_entry(entry, literal, silent) @@ -203,14 +251,15 @@ _nc_extend_names(ENTRY * entryp, char *name, int token_type) { bad_tc_usage = TRUE; \ _nc_warning("Legacy termcap allows only a trailing tc= clause"); } -#define MAX_NUMBER 0x7fff /* positive shorts only */ +#define MAX_NUMBER MAX_OF_TYPE(NCURSES_INT2) NCURSES_EXPORT(int) -_nc_parse_entry(struct entry *entryp, int literal, bool silent) +_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; token_type = _nc_get_token(silent); @@ -220,7 +269,7 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent) if (token_type != NAMES) _nc_err_abort("Entry does not start with terminal names in column one"); - _nc_init_entry(&entryp->tterm); + _nc_init_entry(entryp); entryp->cstart = _nc_comment_start; entryp->cend = _nc_comment_end; @@ -236,13 +285,14 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent) * 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 (ptr[2] == '|') { + if (ok_TC2(ptr[0]) && ok_TC2(ptr[1]) && (ptr[2] == '|')) { ptr += 3; _nc_curr_token.tk_name[2] = '\0'; } @@ -260,7 +310,12 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent) * results in the terminal type getting prematurely set to correspond * to that of the next entry. */ - _nc_set_type(_nc_first_name(entryp->tterm.term_names)); + 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; @@ -282,6 +337,19 @@ _nc_parse_entry(struct entry *entryp, int literal, bool 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) { + 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; + } entryp->uses[entryp->nuses].name = _nc_save_str(_nc_curr_token.tk_valstring); entryp->uses[entryp->nuses].line = _nc_curr_line; entryp->nuses++; @@ -351,12 +419,20 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent) * define a name based on its context. */ if (entry_ptr == NOTFOUND - && _nc_user_definable - && (entry_ptr = _nc_extend_names(entryp, - _nc_curr_token.tk_name, - token_type)) != 0) { - if (_nc_tracing >= DEBUG_LEVEL(1)) - _nc_warning("extended capability '%s'", _nc_curr_token.tk_name); + && _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 */ @@ -369,7 +445,16 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent) } /* deal with bad type/value combinations. */ - if (token_type != CANCEL && entry_ptr->nte_type != token_type) { + 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 @@ -446,11 +531,14 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent) 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 { + } else +#endif + { entryp->tterm.Numbers[entry_ptr->nte_index] = - (short) _nc_curr_token.tk_valnumber; + (NCURSES_INT2) _nc_curr_token.tk_valnumber; } break; @@ -486,23 +574,26 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent) if (!literal) { if (_nc_syntax == SYN_TERMCAP) { bool has_base_entry = FALSE; - unsigned i; /* * Don't insert defaults if this is a `+' entry meant only * for inclusion in other entries (not sure termcap ever * had these, actually). */ - if (strchr(entryp->tterm.term_names, '+')) + if (strchr(entryp->tterm.term_names, '+')) { has_base_entry = TRUE; - else + } 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 (!strchr((char *) entryp->uses[i].name, '+')) + 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 @@ -517,52 +608,59 @@ NCURSES_EXPORT(int) _nc_capcmp(const char *s, const char *t) /* compare two string capabilities, stripping out padding */ { - if (!VALID_STRING(s) && !VALID_STRING(t)) - return (0); - else if (!VALID_STRING(s) || !VALID_STRING(t)) - return (1); - - for (;;) { - if (s[0] == '$' && s[1] == '<') { - for (s += 2;; s++) - if (!(isdigit(UChar(*s)) - || *s == '.' - || *s == '*' - || *s == '/' - || *s == '>')) - break; - } + 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; - } + 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 were pointing at */ + /* we've now pushed s and t past any padding they pointed at */ - if (*s == '\0' && *t == '\0') - return (0); + if (*s == '\0' && *t == '\0') + return (0); - if (*s != *t) - return (*t - *s); + if (*s != *t) + return (*t - *s); - /* else *s == *t but one is not NUL, so continue */ - s++, t++; + /* 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, int src) +append_acs0(string_desc * dst, int code, char *src, size_t off) { - if (src != 0) { + if (src != 0 && off < strlen(src)) { char temp[3]; temp[0] = (char) code; - temp[1] = (char) src; + temp[1] = src[off]; temp[2] = 0; _nc_safe_strcat(dst, temp); } @@ -571,8 +669,8 @@ append_acs0(string_desc * dst, int code, int src) static void append_acs(string_desc * dst, int code, char *src) { - if (src != 0 && strlen(src) == 1) { - append_acs0(dst, code, *src); + if (VALID_STRING(src) && strlen(src) == 1) { + append_acs0(dst, code, src, 0); } } @@ -581,32 +679,32 @@ append_acs(string_desc * dst, int code, char *src) * 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; - const char *to; + const char from[3]; + const char to[6]; } assoc; static assoc const ko_xlate[] = { - {"al", "kil1"}, /* insert line key -> KEY_IL */ - {"bt", "kcbt"}, /* back tab -> KEY_BTAB */ - {"cd", "ked"}, /* clear-to-eos key -> KEY_EOL */ - {"ce", "kel"}, /* clear-to-eol key -> KEY_EOS */ - {"cl", "kclr"}, /* clear key -> KEY_CLEAR */ - {"ct", "tbc"}, /* clear all tabs -> KEY_CATAB */ - {"dc", "kdch1"}, /* delete char -> KEY_DC */ - {"dl", "kdl1"}, /* delete line -> KEY_DL */ - {"do", "kcud1"}, /* down key -> KEY_DOWN */ - {"ei", "krmir"}, /* exit insert key -> KEY_EIC */ - {"ho", "khome"}, /* home key -> KEY_HOME */ - {"ic", "kich1"}, /* insert char key -> KEY_IC */ - {"im", "kIC"}, /* insert-mode key -> KEY_SIC */ - {"le", "kcub1"}, /* le key -> KEY_LEFT */ - {"nd", "kcuf1"}, /* nd key -> KEY_RIGHT */ - {"nl", "kent"}, /* new line key -> KEY_ENTER */ - {"st", "khts"}, /* set-tab key -> KEY_STAB */ - {"ta", CANCELLED_STRING}, - {"up", "kcuu1"}, /* up-arrow key -> KEY_UP */ - {(char *) 0, (char *) 0}, + 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 */ }; /* @@ -621,13 +719,6 @@ static const char C_BS[] = "\b"; static const char C_HT[] = "\t"; /* - * Note that WANTED and PRESENT are not simple inverses! If a capability - * has been explicitly cancelled, it's not considered WANTED. - */ -#define WANTED(s) ((s) == ABSENT_STRING) -#define PRESENT(s) (((s) != ABSENT_STRING) && ((s) != CANCELLED_STRING)) - -/* * This bit of legerdemain turns all the terminfo variable names into * references to locations in the arrays Booleans, Numbers, and Strings --- * precisely what's needed. @@ -637,7 +728,7 @@ static const char C_HT[] = "\t"; #define CUR tp-> static void -postprocess_termcap(TERMTYPE *tp, bool has_base) +postprocess_termcap(TERMTYPE2 *tp, bool has_base) { char buf[MAX_LINE * 2 + 2]; string_desc result; @@ -652,10 +743,10 @@ postprocess_termcap(TERMTYPE *tp, bool has_base) /* if there was a tc entry, assume we picked up defaults via that */ if (!has_base) { - if (WANTED(init_3string) && termcap_init2) + if (WANTED(init_3string) && PRESENT(termcap_init2)) init_3string = _nc_save_str(termcap_init2); - if (WANTED(reset_2string) && termcap_reset) + if (WANTED(reset_2string) && PRESENT(termcap_reset)) reset_2string = _nc_save_str(termcap_reset); if (WANTED(carriage_return)) { @@ -770,7 +861,7 @@ postprocess_termcap(TERMTYPE *tp, bool has_base) if (init_tabs != 8 && init_tabs != ABSENT_NUMERIC) _nc_warning("hardware tabs with a width other than 8: %d", init_tabs); else { - if (tab && _nc_capcmp(tab, C_HT)) + if (PRESENT(tab) && _nc_capcmp(tab, C_HT)) _nc_warning("hardware tabs with a non-^I tab string %s", _nc_visbuf(tab)); else { @@ -789,7 +880,6 @@ postprocess_termcap(TERMTYPE *tp, bool has_base) char *bp, *cp, *dp; struct name_table_entry const *from_ptr; struct name_table_entry const *to_ptr; - assoc const *ap; char buf2[MAX_TERMINFO_LENGTH]; bool foundim; @@ -802,17 +892,21 @@ postprocess_termcap(TERMTYPE *tp, bool has_base) (cp = strchr(base, ',')) != 0; base = cp + 1) { size_t len = (unsigned) (cp - base); + size_t n; + assoc const *ap = 0; - for (ap = ko_xlate; ap->from; ap++) { - if (len == strlen(ap->from) - && strncmp(ap->from, base, len) == 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->from && ap->to)) { + if (ap == 0) { _nc_warning("unknown capability `%.*s' in ko string", (int) len, base); continue; - } else if (ap->to == CANCELLED_STRING) /* ignore it */ + } else if (ap->to[0] == '\0') /* ignore it */ continue; /* now we know we found a match in ko_table, so... */ @@ -829,15 +923,14 @@ postprocess_termcap(TERMTYPE *tp, bool has_base) } 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's the same * string; that's just an inefficiency. */ - if (strcmp( - tp->Strings[from_ptr->nte_index], - tp->Strings[to_ptr->nte_index]) != 0) + 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, - _nc_visbuf(tp->Strings[to_ptr->nte_index])); + ap->to, ap->from, t); continue; } @@ -845,17 +938,22 @@ postprocess_termcap(TERMTYPE *tp, bool has_base) * The magic moment -- copy the mapped key string over, * stripping out padding. */ - for (dp = buf2, bp = tp->Strings[from_ptr->nte_index]; *bp; bp++) { - if (bp[0] == '$' && bp[1] == '<') { - while (*bp && *bp != '>') { - ++bp; - } - } else - *dp++ = *bp; - } - *dp = '\0'; + 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); + tp->Strings[to_ptr->nte_index] = _nc_save_str(buf2); + } else { + tp->Strings[to_ptr->nte_index] = bp; + } } /* @@ -864,7 +962,7 @@ postprocess_termcap(TERMTYPE *tp, bool has_base) * got mapped to kich1 and im to kIC to avoid a collision. * If the description has im but not ic, hack kIC back to kich1. */ - if (foundim && WANTED(key_ic) && key_sic) { + if (foundim && WANTED(key_ic) && PRESENT(key_sic)) { key_ic = key_sic; key_sic = ABSENT_STRING; } @@ -916,15 +1014,15 @@ postprocess_termcap(TERMTYPE *tp, bool has_base) acs_chars = _nc_save_str(buf2); _nc_warning("acsc string synthesized from XENIX capabilities"); } - } else if (acs_chars == 0 - && enter_alt_charset_mode != 0 - && exit_alt_charset_mode != 0) { + } else if (acs_chars == ABSENT_STRING + && PRESENT(enter_alt_charset_mode) + && PRESENT(exit_alt_charset_mode)) { acs_chars = _nc_save_str(VT_ACSC); } } static void -postprocess_terminfo(TERMTYPE *tp) +postprocess_terminfo(TERMTYPE2 *tp) { /* * TERMINFO-TO-TERMINFO MAPPINGS FOR SOURCE TRANSLATION @@ -941,17 +1039,17 @@ postprocess_terminfo(TERMTYPE *tp) _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 */ + 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); diff --git a/ncurses/tinfo/read_entry.c b/ncurses/tinfo/read_entry.c index e5c26b5..5b570b0 100644 --- a/ncurses/tinfo/read_entry.c +++ b/ncurses/tinfo/read_entry.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -41,15 +42,89 @@ #include <tic.h> -MODULE_ID("$Id: read_entry.c,v 1.128 2014/06/14 22:30:41 tom Exp $") +MODULE_ID("$Id: read_entry.c,v 1.157 2020/02/02 23:34:34 tom Exp $") #define TYPE_CALLOC(type,elts) typeCalloc(type, (unsigned)(elts)) #define MyNumber(n) (short) LOW_MSB(n) +#define SIZEOF_32BITS 4 + #if NCURSES_USE_DATABASE -static void -convert_shorts(char *buf, short *Numbers, int count) +#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++) { @@ -61,7 +136,9 @@ convert_shorts(char *buf, short *Numbers, int count) Numbers[i] = MyNumber(buf + 2 * i); TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i])); } + return SIZEOF_SHORT; } +#endif static void convert_strings(char *buf, char **Strings, int count, int size, char *table) @@ -112,14 +189,17 @@ fake_read(char *src, int *offset, int limit, char *dst, unsigned want) #define Read(buf, count) fake_read(buffer, &offset, limit, (char *) buf, (unsigned) count) #define read_shorts(buf, count) \ - (Read(buf, (count)*2) == (int) (count)*2) + (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(TERMTYPE *const tp) +_nc_init_termtype(TERMTYPE2 *const tp) { unsigned i; @@ -134,7 +214,7 @@ _nc_init_termtype(TERMTYPE *const tp) if (tp->Booleans == 0) TYPE_MALLOC(NCURSES_SBOOL, BOOLCOUNT, tp->Booleans); if (tp->Numbers == 0) - TYPE_MALLOC(short, NUMCOUNT, tp->Numbers); + TYPE_MALLOC(NCURSES_INT2, NUMCOUNT, tp->Numbers); if (tp->Strings == 0) TYPE_MALLOC(char *, STRCOUNT, tp->Strings); @@ -169,7 +249,7 @@ valid_shorts(char *buffer, int limit) * Return TGETENT_YES if read, TGETENT_NO if not found or garbled. */ NCURSES_EXPORT(int) -_nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) +_nc_read_termtype(TERMTYPE2 *ptr, char *buffer, int limit) { int offset = 0; int name_size, bool_count, num_count, str_count, str_size; @@ -177,6 +257,14 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) char buf[MAX_ENTRY_SIZE + 2]; char *string_table; unsigned want, have; + bool need_ints; + 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)); @@ -185,14 +273,33 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) /* grab the header */ if (!read_shorts(buf, 6) || !IS_TIC_MAGIC(buf)) { - return (TGETENT_NO); + returnDB(TGETENT_NO); + } +#if NCURSES_EXT_NUMBERS + if ((need_ints = (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 ((need_ints = (LOW_MSB(buf) == MAGIC2))) { + convert_numbers = convert_32bits; + size_of_numbers = SIZEOF_32BITS; + } else { + convert_numbers = convert_16bits; + size_of_numbers = SIZEOF_INT2; + } +#endif - name_size = MyNumber(buf + 2); + /* *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); + 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)", @@ -203,21 +310,14 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) || num_count < 0 || str_count < 0 || str_size < 0) { - return (TGETENT_NO); + returnDB(TGETENT_NO); } want = (unsigned) (str_size + name_size + 1); - if (str_size) { - /* try to allocate space for the string table */ - if (str_count * 2 >= MAX_ENTRY_SIZE - || (string_table = typeMalloc(char, want)) == 0) { - return (TGETENT_NO); - } - } else { - str_count = 0; - if ((string_table = typeMalloc(char, want)) == 0) { - return (TGETENT_NO); - } + /* 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) */ @@ -237,7 +337,7 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) if ((ptr->Booleans = TYPE_CALLOC(NCURSES_SBOOL, max(BOOLCOUNT, bool_count))) == 0 || Read(ptr->Booleans, (unsigned) bool_count) < bool_count) { - return (TGETENT_NO); + returnDB(TGETENT_NO); } /* @@ -249,24 +349,24 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) even_boundary(name_size + bool_count); /* grab the numbers */ - if ((ptr->Numbers = TYPE_CALLOC(short, max(NUMCOUNT, num_count))) == 0 - || !read_shorts(buf, num_count)) { - return (TGETENT_NO); + if (!(ptr->Numbers = TYPE_CALLOC(NCURSES_INT2, max(NUMCOUNT, num_count))) + || !read_numbers(buf, num_count)) { + returnDB(TGETENT_NO); } - convert_shorts(buf, ptr->Numbers, num_count); + convert_numbers(buf, ptr->Numbers, num_count); if ((ptr->Strings = TYPE_CALLOC(char *, max(STRCOUNT, str_count))) == 0) { - return (TGETENT_NO); + returnDB(TGETENT_NO); } if (str_count) { /* grab the string offsets */ if (!read_shorts(buf, str_count)) { - return (TGETENT_NO); + returnDB(TGETENT_NO); } /* finally, grab the string table itself */ if (Read(string_table, (unsigned) str_size) != str_size) { - return (TGETENT_NO); + returnDB(TGETENT_NO); } convert_strings(buf, ptr->Strings, str_count, str_size, string_table); } @@ -285,20 +385,20 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) int ext_bool_count = MyNumber(buf + 0); int ext_num_count = MyNumber(buf + 2); int ext_str_count = MyNumber(buf + 4); - int ext_str_size = MyNumber(buf + 6); + 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 (need >= (MAX_ENTRY_SIZE / 2) - || ext_str_size >= MAX_ENTRY_SIZE - || ext_str_limit >= MAX_ENTRY_SIZE + 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_size < 0 + || ext_str_usage < 0 || ext_str_limit < 0) { - return (TGETENT_NO); + returnDB(TGETENT_NO); } ptr->num_Booleans = UShort(BOOLCOUNT + ext_bool_count); @@ -306,19 +406,25 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) ptr->num_Strings = UShort(STRCOUNT + ext_str_count); TYPE_REALLOC(NCURSES_SBOOL, ptr->num_Booleans, ptr->Booleans); - TYPE_REALLOC(short, ptr->num_Numbers, ptr->Numbers); + TYPE_REALLOC(NCURSES_INT2, ptr->num_Numbers, ptr->Numbers); TYPE_REALLOC(char *, ptr->num_Strings, ptr->Strings); - TR(TRACE_DATABASE, ("extended header is %d/%d/%d(%d:%d)", - ext_bool_count, ext_num_count, ext_str_count, - ext_str_size, ext_str_limit)); + 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) { - return (TGETENT_NO); + returnDB(TGETENT_NO); } } even_boundary(ext_bool_count); @@ -326,20 +432,20 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) TR(TRACE_DATABASE, ("READ %d extended-numbers @%d", ext_num_count, offset)); if ((ptr->ext_Numbers = UShort(ext_num_count)) != 0) { - if (!read_shorts(buf, ext_num_count)) { - return (TGETENT_NO); + if (!read_numbers(buf, ext_num_count)) { + returnDB(TGETENT_NO); } TR(TRACE_DATABASE, ("Before converting extended-numbers")); - convert_shorts(buf, ptr->Numbers + NUMCOUNT, ext_num_count); + convert_numbers(buf, ptr->Numbers + NUMCOUNT, ext_num_count); } TR(TRACE_DATABASE, ("READ extended-offsets @%d", offset)); - if ((unsigned) (ext_str_count + (int) need) >= (MAX_ENTRY_SIZE / 2)) { - return (TGETENT_NO); + 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)) { - return (TGETENT_NO); + returnDB(TGETENT_NO); } TR(TRACE_DATABASE, ("READ %d bytes of extended-strings @%d", @@ -348,17 +454,20 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) if (ext_str_limit) { ptr->ext_str_table = typeMalloc(char, (size_t) ext_str_limit); if (ptr->ext_str_table == 0) { - return (TGETENT_NO); + returnDB(TGETENT_NO); } if (Read(ptr->ext_str_table, (unsigned) ext_str_limit) != ext_str_limit) { - return (TGETENT_NO); + 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", + ("Before computing extended-string capabilities " + "str_count=%d, ext_str_count=%d", str_count, ext_str_count)); convert_strings(buf, ptr->Strings + str_count, ext_str_count, ext_str_limit, ptr->ext_str_table); @@ -367,20 +476,30 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) 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])) + 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)) { - return (TGETENT_NO); + if (ext_str_count >= (max_entry_size / 2)) { + returnDB(TGETENT_NO); } if ((ptr->ext_Names = TYPE_CALLOC(char *, need)) == 0) { - return (TGETENT_NO); + returnDB(TGETENT_NO); } TR(TRACE_DATABASE, ("ext_NAMES starting @%d in extended_strings, first = %s", @@ -415,7 +534,7 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) for (i = str_count; i < STRCOUNT; i++) ptr->Strings[i] = ABSENT_STRING; - return (TGETENT_YES); + returnDB(TGETENT_YES); } /* @@ -427,25 +546,26 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit) * table. */ NCURSES_EXPORT(int) -_nc_read_file_entry(const char *const filename, TERMTYPE *ptr) +_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; - int limit; - char buffer[MAX_ENTRY_SIZE + 1]; if (_nc_access(filename, R_OK) < 0 - || (fp = fopen(filename, "rb")) == 0) { + || (fp = 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]; + if ((limit = (int) fread(buffer, sizeof(char), sizeof(buffer), fp)) > 0) { TR(TRACE_DATABASE, ("read terminfo %s", filename)); if ((code = _nc_read_termtype(ptr, buffer, limit)) == TGETENT_NO) { - _nc_free_termtype(ptr); + _nc_free_termtype2(ptr); } } else { code = TGETENT_NO; @@ -508,6 +628,106 @@ make_dir_filename(char *filename, 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; + int ch; + + for (nibble = 0; nibble < 2; ++nibble) { + result <<= 4; + ch = UChar(**source); + *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. @@ -517,15 +737,31 @@ _nc_read_tic_entry(char *filename, unsigned limit, const char *const path, const char *name, - TERMTYPE *const tp) + 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)); - if (make_db_filename(filename, limit, path) - && (capdbp = _nc_db_open(filename, FALSE)) != 0) { + 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; @@ -551,15 +787,15 @@ _nc_read_tic_entry(char *filename, * (source/binary) by checking the lengths. */ while (_nc_db_get(capdbp, &key, &data) == 0) { - int used = (int) data.size - 1; 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_termtype(tp); + _nc_free_termtype2(tp); } } break; @@ -586,30 +822,29 @@ _nc_read_tic_entry(char *filename, code = _nc_read_file_entry(filename, tp); } #if NCURSES_USE_TERMCAP - else if (code != TGETENT_YES) { + 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; + returnDB(code); } #endif /* NCURSES_USE_DATABASE */ /* - * _nc_read_entry(char *name, char *filename, TERMTYPE *tp) - * - * Find and read the compiled entry for a given terminal type, - * if it exists. We take pains here to make sure no combination - * of environment variables and terminal type name can be used to - * overrun the file buffer. + * 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_entry(const char *const name, char *const filename, TERMTYPE *const tp) +_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); @@ -626,8 +861,8 @@ _nc_read_entry(const char *const name, char *const filename, TERMTYPE *const tp) const char *path; _nc_first_db(&state, &offset); + code = TGETENT_ERR; while ((path = _nc_next_db(&state, &offset)) != 0) { - TR(TRACE_DATABASE, ("_nc_read_tic_entry path=%s, name=%s", path, name)); code = _nc_read_tic_entry(filename, PATH_MAX, path, name, tp); if (code == TGETENT_YES) { _nc_last_db(); @@ -644,3 +879,19 @@ _nc_read_entry(const char *const name, char *const filename, TERMTYPE *const tp) } return code; } + +#if NCURSES_EXT_NUMBERS +/* + * This entrypoint is used by tack 1.07 + */ +NCURSES_EXPORT(int) +_nc_read_entry(const char *const name, char *const filename, TERMTYPE *const tp) +{ + TERMTYPE2 dummy; + int rc; + rc = _nc_read_entry2(name, filename, &dummy); + if (rc == TGETENT_YES) + _nc_export_termtype2(tp, &dummy); + return rc; +} +#endif diff --git a/ncurses/tinfo/read_termcap.c b/ncurses/tinfo/read_termcap.c index 6bfb23c..fcb43a4 100644 --- a/ncurses/tinfo/read_termcap.c +++ b/ncurses/tinfo/read_termcap.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -56,7 +57,7 @@ #include <sys/types.h> #include <tic.h> -MODULE_ID("$Id: read_termcap.c,v 1.89 2013/12/15 00:32:43 tom Exp $") +MODULE_ID("$Id: read_termcap.c,v 1.98 2020/02/02 23:34:34 tom Exp $") #if !PURE_TERMINFO @@ -66,10 +67,10 @@ MODULE_ID("$Id: read_termcap.c,v 1.89 2013/12/15 00:32:43 tom Exp $") #define TC_REF_LOOP -3 #define TC_UNRESOLVED -4 /* this is not returned by BSD cgetent */ -static NCURSES_CONST char * +static const char * get_termpath(void) { - NCURSES_CONST char *result; + const char *result; if (!use_terminfo_vars() || (result = getenv("TERMPATH")) == 0) result = TERMPATH; @@ -364,7 +365,7 @@ _nc_getent( if (bp >= b_end) { int n; - n = read(fd, buf, sizeof(buf)); + n = (int) read(fd, buf, sizeof(buf)); if (n <= 0) { if (myfd) (void) close(fd); @@ -393,7 +394,7 @@ _nc_getent( || *(rp - 1) != '\\') break; } - *rp++ = c; + *rp++ = (char) c; /* * Enforce loop invariant: if no room @@ -404,8 +405,8 @@ _nc_getent( unsigned pos; size_t newsize; - pos = rp - record; - newsize = r_end - record + BFRAG; + pos = (unsigned) (rp - record); + newsize = (size_t) (r_end - record + BFRAG); record = DOALLOC(newsize); if (record == 0) { if (myfd) @@ -492,14 +493,14 @@ _nc_getent( } } tcstart = tc - 3; - tclen = s - tcstart; + 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 = ilen; + newilen = (int) ilen; if (iret != TC_SUCCESS) { /* an error */ if (iret < TC_NOT_FOUND) { @@ -523,7 +524,7 @@ _nc_getent( /* not interested in name field of tc'ed record */ s = newicap; while (*s != '\0' && *s++ != ':') ; - newilen -= s - newicap; + newilen -= (int) (s - newicap); newicap = s; /* make sure interpolated record is `:'-terminated */ @@ -542,10 +543,10 @@ _nc_getent( unsigned pos, tcpos, tcposend; size_t newsize; - pos = rp - record; - newsize = r_end - record + diff + BFRAG; - tcpos = tcstart - record; - tcposend = tcend - record; + 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) @@ -583,7 +584,7 @@ _nc_getent( */ if (myfd) (void) close(fd); - *len = rp - record - 1; /* don't count NUL */ + *len = (unsigned) (rp - record - 1); /* don't count NUL */ if (r_end > rp) { if ((record = DOALLOC((size_t) (rp - record))) == 0) { errno = ENOMEM; @@ -791,7 +792,7 @@ _nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name) int i; char pathbuf[PBUFSIZ]; /* holds raw path of filenames */ CGETENT_CONST char *pathvec[PVECSIZ]; /* point to names in pathbuf */ - NCURSES_CONST char *termpath; + const char *termpath; string_desc desc; *lineno = 1; @@ -956,7 +957,7 @@ add_tc(char *termpaths[], char *path, int count) #endif /* !USE_GETCAP */ NCURSES_EXPORT(int) -_nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) +_nc_read_termcap_entry(const char *const tn, TERMTYPE2 *const tp) { int found = TGETENT_NO; ENTRY *ep; @@ -965,6 +966,8 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) #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; @@ -982,8 +985,7 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) if (use_terminfo_vars() && (p = getenv("TERMCAP")) != 0 && !_nc_is_abs_path(p) && _nc_name_match(p, tn, "|:")) { /* TERMCAP holds a termcap entry */ - strncpy(tc, p, sizeof(tc) - 1); - tc[sizeof(tc) - 1] = '\0'; + tc_buf = strdup(p); _nc_set_source("TERMCAP"); } else { /* we're using getcap(3) */ @@ -992,8 +994,13 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) _nc_curr_line = lineno; _nc_set_source(source); + tc_buf = tc; } - _nc_read_entry_source((FILE *) 0, tc, FALSE, TRUE, NULLHOOK); + 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: @@ -1027,7 +1034,7 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) int j, k; bool use_buffer = FALSE; bool normal = TRUE; - char tc_buf[1024]; + char *tc_buf = 0; char pathbuf[PATH_MAX]; char *copied = 0; char *cp; @@ -1039,10 +1046,8 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) ADD_TC(tc, 0); normal = FALSE; } else if (_nc_name_match(tc, tn, "|:")) { /* treat as a capability file */ - use_buffer = TRUE; - _nc_SPRINTF(tc_buf, - _nc_SLIMIT(sizeof(tc_buf)) - "%.*s\n", (int) sizeof(tc_buf) - 2, tc); + tc_buf = strdup(tc); + use_buffer = (tc_buf != 0); normal = FALSE; } } @@ -1111,6 +1116,7 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) * that since it's just a single entry, they won't be a pain. */ _nc_read_entry_source((FILE *) 0, tc_buf, FALSE, FALSE, NULLHOOK); + free(tc_buf); } else { int i; @@ -1140,7 +1146,8 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) return (TGETENT_ERR); /* resolve all use references */ - _nc_resolve_uses2(TRUE, FALSE); + if (_nc_resolve_uses2(TRUE, FALSE) != TRUE) + return (TGETENT_ERR); /* find a terminal matching tn, if we can */ #if USE_GETCAP_CACHE diff --git a/ncurses/tinfo/strings.c b/ncurses/tinfo/strings.c index 393d8e7..a1d8beb 100644 --- a/ncurses/tinfo/strings.c +++ b/ncurses/tinfo/strings.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2000-2007,2012 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -35,8 +36,9 @@ **/ #include <curses.priv.h> +#include <tic.h> -MODULE_ID("$Id: strings.c,v 1.8 2012/02/22 22:34:31 tom Exp $") +MODULE_ID("$Id: strings.c,v 1.10 2020/02/02 23:34:34 tom Exp $") /**************************************************************************** * Useful string functions (especially for mvcur) @@ -105,7 +107,7 @@ _nc_str_copy(string_desc * dst, string_desc * src) NCURSES_EXPORT(bool) _nc_safe_strcat(string_desc * dst, const char *src) { - if (src != 0) { + if (PRESENT(src)) { size_t len = strlen(src); if (len < dst->s_size) { @@ -126,7 +128,7 @@ _nc_safe_strcat(string_desc * dst, const char *src) NCURSES_EXPORT(bool) _nc_safe_strcpy(string_desc * dst, const char *src) { - if (src != 0) { + if (PRESENT(src)) { size_t len = strlen(src); if (len < dst->s_size) { diff --git a/ncurses/tinfo/tinfo_driver.c b/ncurses/tinfo/tinfo_driver.c index a17accd..7919a9b 100644 --- a/ncurses/tinfo/tinfo_driver.c +++ b/ncurses/tinfo/tinfo_driver.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2008-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -28,12 +29,13 @@ /**************************************************************************** * Author: Juergen Pfeifer * - * * + * and: Thomas E. Dickey * ****************************************************************************/ #include <curses.priv.h> -#define CUR ((TERMINAL*)TCB)->type. +#define CUR TerminalType((TERMINAL*)TCB). #include <tic.h> +#include <termcap.h> /* ospeed */ #if HAVE_NANOSLEEP #include <time.h> @@ -50,7 +52,7 @@ # endif #endif -MODULE_ID("$Id: tinfo_driver.c,v 1.39 2014/09/27 21:58:57 tom Exp $") +MODULE_ID("$Id: tinfo_driver.c,v 1.67 2020/02/02 23:34:34 tom Exp $") /* * SCO defines TIOCGSIZE and the corresponding struct. Other systems (SunOS, @@ -113,6 +115,38 @@ drv_Name(TERMINAL_CONTROL_BLOCK * 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); +#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)); +#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) { @@ -121,7 +155,8 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret) TERMINAL *termp; SCREEN *sp; - T((T_CALLED("tinfo::drv_CanHandle(%p)"), TCB)); + START_TRACE(); + T((T_CALLED("tinfo::drv_CanHandle(%p)"), (void *) TCB)); assert(TCB != 0 && tname != 0); termp = (TERMINAL *) TCB; @@ -129,17 +164,20 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret) TCB->magic = TCBMAGIC; #if (NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP) - status = _nc_setup_tinfo(tname, &termp->type); + 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 TERMTYPE *fallback = _nc_fallback(tname); + const TERMTYPE2 *fallback = _nc_fallback2(tname); if (fallback) { - termp->type = *fallback; + T(("found fallback entry")); + TerminalType(termp) = *fallback; status = TGETENT_YES; } } @@ -149,18 +187,41 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret) 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); + 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 - strncpy(ttytype, termp->type.term_names, (size_t) NAMESIZE - 1); - ttytype[NAMESIZE - 1] = '\0'; + save_ttytype(termp); #endif if (command_character) _nc_tinfo_cmdch(termp, *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 @@ -169,13 +230,19 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret) 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", tname); + cleanup_termtype(); + ret_error1(TGETENT_YES, "terminal is not really generic.\n", + tname, NO_COPY); } else { - ret_error1(TGETENT_NO, "I need something more specific.\n", tname); + cleanup_termtype(); + ret_error1(TGETENT_NO, "I need something more specific.\n", + tname, NO_COPY); } } if (hard_copy) { - ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n", tname); + cleanup_termtype(); + ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n", + tname, NO_COPY); } returnBool(result); @@ -257,8 +324,8 @@ drv_defaultcolors(TERMINAL_CONTROL_BLOCK * TCB, int fg, int bg) sp->_has_sgr_39_49 = (NCURSES_SP_NAME(tigetflag) (NCURSES_SP_ARGx "AX") == TRUE); - sp->_default_fg = isDefaultColor(fg) ? COLOR_DEFAULT : (fg & C_MASK); - sp->_default_bg = isDefaultColor(bg) ? COLOR_DEFAULT : (bg & C_MASK); + 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; @@ -354,7 +421,7 @@ drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp) if (sp) { useEnv = sp->_use_env; - useTioctl = sp->_use_tioctl; + useTioctl = sp->use_tioctl; } else { useEnv = _nc_prescreen.use_env; useTioctl = _nc_prescreen.use_tioctl; @@ -745,9 +812,9 @@ drv_do_color(TERMINAL_CONTROL_BLOCK * TCB, NCURSES_SP_OUTC outc) { SCREEN *sp = TCB->csp; - NCURSES_COLOR_T fg = COLOR_DEFAULT; - NCURSES_COLOR_T bg = COLOR_DEFAULT; - NCURSES_COLOR_T old_fg, old_bg; + int fg = COLOR_DEFAULT; + int bg = COLOR_DEFAULT; + int old_fg, old_bg; AssertTCB(); if (sp == 0) @@ -762,19 +829,13 @@ drv_do_color(TERMINAL_CONTROL_BLOCK * TCB, TPARM_1(set_color_pair, pair), 1, outc); return; } else if (sp != 0) { - NCURSES_SP_NAME(pair_content) (NCURSES_SP_ARGx - (short) pair, - &fg, - &bg); + _nc_pair_content(SP_PARM, pair, &fg, &bg); } } if (old_pair >= 0 && sp != 0 - && NCURSES_SP_NAME(pair_content) (NCURSES_SP_ARGx - (short) old_pair, - &old_fg, - &old_bg) !=ERR) { + && _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 @@ -803,13 +864,13 @@ drv_do_color(TERMINAL_CONTROL_BLOCK * TCB, #if NCURSES_EXT_FUNCS if (isDefaultColor(fg)) - fg = (NCURSES_COLOR_T) default_fg(sp); + fg = default_fg(sp); if (isDefaultColor(bg)) - bg = (NCURSES_COLOR_T) default_bg(sp); + bg = default_bg(sp); #endif if (reverse) { - NCURSES_COLOR_T xx = fg; + int xx = fg; fg = bg; bg = xx; } @@ -845,12 +906,9 @@ drv_initmouse(TERMINAL_CONTROL_BLOCK * TCB) /* we know how to recognize mouse events under "xterm" */ if (sp != 0) { - if (key_mouse != 0) { - if (!strcmp(key_mouse, xterm_kmous) - || strstr(TerminalOf(sp)->type.term_names, "xterm") != 0) { - init_xterm_mouse(sp); - } - } else if (strstr(TerminalOf(sp)->type.term_names, "xterm") != 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); } @@ -975,12 +1033,18 @@ drv_setfilter(TERMINAL_CONTROL_BLOCK * TCB) { AssertTCB(); - clear_screen = 0; - cursor_down = parm_down_cursor = 0; - cursor_address = 0; - cursor_up = parm_up_cursor = 0; - row_address = 0; - cursor_home = carriage_return; + /* *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 @@ -1027,8 +1091,13 @@ drv_initacs(TERMINAL_CONTROL_BLOCK * TCB, chtype *real_map, chtype *fake_map) 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; - if (sp != 0) + 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; } @@ -1058,7 +1127,6 @@ drv_initacs(TERMINAL_CONTROL_BLOCK * TCB, chtype *real_map, chtype *fake_map) ? "DIFF" : "SAME"), _nc_visbuf(show)); - _nc_unlock_global(tracef); } #endif /* TRACE */ @@ -1186,7 +1254,7 @@ drv_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf) if ((pthread_self) && (pthread_kill) && (pthread_equal)) _nc_globals.read_thread = pthread_self(); # endif - n = read(sp->_ifd, &c2, (size_t) 1); + n = (int) read(sp->_ifd, &c2, (size_t) 1); #if USE_PTHREADS_EINTR _nc_globals.read_thread = 0; #endif @@ -1275,23 +1343,29 @@ drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, int flag) unsigned ch = (unsigned) c; if (flag) { while ((s = _nc_expand_try(sp->_key_ok, - ch, &count, (size_t) 0)) != 0 - && _nc_remove_key(&(sp->_key_ok), ch)) { - code = _nc_add_to_try(&(sp->_keytry), s, ch); - free(s); - count = 0; - if (code != OK) - break; + 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 - && _nc_remove_key(&(sp->_keytry), ch)) { - code = _nc_add_to_try(&(sp->_key_ok), s, ch); - free(s); - count = 0; - if (code != OK) - break; + 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); + } } } } diff --git a/ncurses/tinfo/trim_sgr0.c b/ncurses/tinfo/trim_sgr0.c index ec5e2b7..4d10529 100644 --- a/ncurses/tinfo/trim_sgr0.c +++ b/ncurses/tinfo/trim_sgr0.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2005-2010,2012 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -36,7 +37,7 @@ #include <tic.h> -MODULE_ID("$Id: trim_sgr0.c,v 1.15 2012/12/15 20:57:17 tom Exp $") +MODULE_ID("$Id: trim_sgr0.c,v 1.18 2020/02/02 23:34:34 tom Exp $") #undef CUR #define CUR tp-> @@ -46,7 +47,7 @@ MODULE_ID("$Id: trim_sgr0.c,v 1.15 2012/12/15 20:57:17 tom Exp $") #define L_BRACK '[' static char * -set_attribute_9(TERMTYPE *tp, int flag) +set_attribute_9(TERMTYPE2 *tp, int flag) { const char *value; char *result; @@ -232,7 +233,7 @@ compare_part(const char *part, const char *full) * an error occurs, or the original sgr0 if no change is needed. */ NCURSES_EXPORT(char *) -_nc_trim_sgr0(TERMTYPE *tp) +_nc_trim_sgr0(TERMTYPE2 *tp) { char *result = exit_attribute_mode; @@ -263,7 +264,7 @@ _nc_trim_sgr0(TERMTYPE *tp) /* * If rmacs is a substring of sgr(0), remove that chunk. */ - if (exit_alt_charset_mode != 0) { + 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); diff --git a/ncurses/tinfo/use_screen.c b/ncurses/tinfo/use_screen.c index 6a0297c..a4bf932 100644 --- a/ncurses/tinfo/use_screen.c +++ b/ncurses/tinfo/use_screen.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2007-2008,2009 Free Software Foundation, Inc. * + * 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 * @@ -32,15 +33,19 @@ #include <curses.priv.h> -MODULE_ID("$Id: use_screen.c,v 1.8 2009/10/24 22:40:20 tom Exp $") +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,%p,%p)"), (void *) screen, func, (void *) data)); + 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 diff --git a/ncurses/tinfo/write_entry.c b/ncurses/tinfo/write_entry.c index b2edd5d..1385176 100644 --- a/ncurses/tinfo/write_entry.c +++ b/ncurses/tinfo/write_entry.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -43,38 +44,62 @@ #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 -MODULE_ID("$Id: write_entry.c,v 1.92 2014/11/01 14:47:00 tom Exp $") +MODULE_ID("$Id: write_entry.c,v 1.115 2020/02/02 23:34:34 tom Exp $") static int total_written; +static int total_parts; +static int total_size; static int make_db_root(const char *); -static int write_object(TERMTYPE *, char *, unsigned *, unsigned); #if !USE_HASHED_DB static void -write_file(char *filename, TERMTYPE *tp) +write_file(char *filename, TERMTYPE2 *tp) { char buffer[MAX_ENTRY_SIZE]; unsigned limit = sizeof(buffer); unsigned offset = 0; - FILE *fp = (_nc_access(filename, W_OK) == 0) ? fopen(filename, "wb") : 0; - if (fp == 0) { - perror(filename); - _nc_syserr_abort("can't open %s/%s", _nc_tic_dir(0), filename); - } - DEBUG(1, ("Created %s", filename)); + if (_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) + ? fopen(filename, BIN_W) + : 0); + size_t actual; + + if (fp == 0) { + perror(filename); + _nc_syserr_abort("can't open %s/%s", _nc_tic_dir(0), filename); + } - if (write_object(tp, buffer, &offset, limit) == ERR - || fwrite(buffer, sizeof(char), (size_t) offset, fp) != offset) { - _nc_syserr_abort("error writing %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(0), + filename, + strerror(myerr)); + } else { + _nc_syserr_abort("error writing %s/%s: %u bytes vs actual %lu", + _nc_tic_dir(0), + filename, + offset, + (unsigned long) actual); + } + } else { + fclose(fp); + DEBUG(1, ("Created %s", filename)); + } } - - fclose(fp); } /* @@ -167,7 +192,7 @@ make_db_root(const char *path) if ((rc = stat(path, &statbuf)) < 0) { rc = mkdir(path -#if !defined(__MINGW32__) +#if !defined(_WIN32) ,0777 #endif ); @@ -247,7 +272,7 @@ _nc_set_writedir(const char *dir) */ NCURSES_EXPORT(void) -_nc_write_entry(TERMTYPE *const tp) +_nc_write_entry(TERMTYPE2 *const tp) { #if USE_HASHED_DB @@ -268,6 +293,9 @@ _nc_write_entry(TERMTYPE *const tp) #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 */ @@ -316,7 +344,7 @@ _nc_write_entry(TERMTYPE *const tp) _nc_set_type(first_name); #if USE_HASHED_DB - if (write_object(tp, buffer + 1, &offset, limit - 1) != ERR) { + if (_nc_write_object(tp, buffer + 1, &offset, limit - 1) != ERR) { DB *capdb = _nc_db_open(_nc_tic_dir(0), TRUE); DBT key, data; @@ -343,6 +371,8 @@ _nc_write_entry(TERMTYPE *const tp) sizeof(buffer) - 1); data.size = name_size + 1; + total_size += data.size; + total_parts++; _nc_db_put(capdb, &key, &data); while (*other_names != '\0') { @@ -357,6 +387,8 @@ _nc_write_entry(TERMTYPE *const tp) key.data = ptr; key.size = strlen(ptr); + total_size += data.size; + total_parts++; _nc_db_put(capdb, &key, &data); } } @@ -366,11 +398,19 @@ _nc_write_entry(TERMTYPE *const tp) start_time = 0; } - if (strlen(first_name) >= sizeof(filename) - (2 + LEAF_LEN)) + 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", first_name[0], first_name); + 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 @@ -427,7 +467,8 @@ _nc_write_entry(TERMTYPE *const tp) check_writeable(ptr[0]); _nc_SPRINTF(linkname, _nc_SLIMIT(sizeof(linkname)) - LEAF_FMT "/%s", ptr[0], ptr); + LEAF_FMT "/%.*s", ptr[0], + (int) sizeof(linkname) - (2 + LEAF_LEN), ptr); if (strcmp(filename, linkname) == 0) { _nc_warning("self-synonym ignored"); @@ -439,13 +480,14 @@ _nc_write_entry(TERMTYPE *const tp) { int code; #if USE_SYMLINKS - if (first_name[0] == linkname[0]) - strncpy(symlinkname, first_name, sizeof(symlinkname) - 1); - else { - _nc_STRCPY(symlinkname, "../", sizeof(suymlinkname)); - strncat(symlinkname, filename, sizeof(symlinkname) - 4); +#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[sizeof(symlinkname) - 1] = '\0'; + symlinkname[MY_SIZE] = '\0'; #endif /* USE_SYMLINKS */ #if HAVE_REMOVE code = remove(linkname); @@ -542,7 +584,7 @@ compute_offsets(char **Strings, size_t strmax, short *offsets) return nextfree; } -static void +static size_t convert_shorts(unsigned char *buf, short *Numbers, size_t count) { size_t i; @@ -557,14 +599,49 @@ convert_shorts(unsigned char *buf, short *Numbers, size_t count) 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(TERMTYPE *tp) +extended_Booleans(TERMTYPE2 *tp) { unsigned result = 0; unsigned i; @@ -577,7 +654,7 @@ extended_Booleans(TERMTYPE *tp) } static unsigned -extended_Numbers(TERMTYPE *tp) +extended_Numbers(TERMTYPE2 *tp) { unsigned result = 0; unsigned i; @@ -590,7 +667,7 @@ extended_Numbers(TERMTYPE *tp) } static unsigned -extended_Strings(TERMTYPE *tp) +extended_Strings(TERMTYPE2 *tp) { unsigned short result = 0; unsigned short i; @@ -607,7 +684,7 @@ extended_Strings(TERMTYPE *tp) * clause - discard the unneeded data. */ static bool -extended_object(TERMTYPE *tp) +extended_object(TERMTYPE2 *tp) { bool result = FALSE; @@ -620,11 +697,11 @@ extended_object(TERMTYPE *tp) } #endif -static int -write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit) +NCURSES_EXPORT(int) +_nc_write_object(TERMTYPE2 *tp, char *buffer, unsigned *offset, unsigned limit) { char *namelist; - size_t namelen, boolmax, nummax, strmax; + size_t namelen, boolmax, nummax, strmax, numlen; char zero = '\0'; size_t i; int nextfree; @@ -633,6 +710,12 @@ write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit) 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) = convert_32bit; +#else +#define convert_numbers convert_shorts +#endif #if NCURSES_XNAMES /* @@ -653,14 +736,21 @@ write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit) boolmax = 0; for (i = 0; i < last_bool; i++) { - if (tp->Booleans[i] == TRUE) + if (tp->Booleans[i] == TRUE) { boolmax = i + 1; + } } nummax = 0; for (i = 0; i < last_num; i++) { - if (tp->Numbers[i] != ABSENT_NUMERIC) + 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; @@ -672,7 +762,17 @@ write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit) 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 LITTLE_ENDIAN(buf + 2, min(namelen, MAX_NAME_SIZE + 1)); LITTLE_ENDIAN(buf + 4, boolmax); LITTLE_ENDIAN(buf + 6, nummax); @@ -682,62 +782,81 @@ write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit) /* 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); + || Write(namelist, sizeof(char), namelen) != namelen) { + return (ERR); + } - for (i = 0; i < boolmax; i++) - if (tp->Booleans[i] == TRUE) + for (i = 0; i < boolmax; i++) { + if (tp->Booleans[i] == TRUE) { buf[i] = TRUE; - else + } else { buf[i] = FALSE; - if (Write(buf, sizeof(char), boolmax) != boolmax) - return (ERR); + } + } + if (Write(buf, sizeof(char), boolmax) != boolmax) { + return (ERR); + } - if (even_boundary(namelen + boolmax)) + if (even_boundary(namelen + boolmax)) { return (ERR); + } TRACE_OUT(("Numerics begin at %04x", *offset)); /* the numerics */ - convert_shorts(buf, tp->Numbers, nummax); - if (Write(buf, 2, nummax) != nummax) + 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, 2, strmax) != 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])) + 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 extcnt = (unsigned) NUM_EXT_NAMES(tp); + unsigned ext_total = (unsigned) NUM_EXT_NAMES(tp); + unsigned ext_usage = ext_total; - if (even_boundary(nextfree)) + 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)) + if (tp->ext_Strings >= SIZEOF(offsets)) { return (ERR); + } nextfree += compute_offsets(tp->ext_Names, - (size_t) extcnt, + (size_t) ext_total, offsets + tp->ext_Strings); TRACE_OUT(("after extended capnames, nextfree=%d", nextfree)); - strmax = tp->ext_Strings + extcnt; + 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 @@ -745,26 +864,30 @@ write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit) LITTLE_ENDIAN(buf + 0, tp->ext_Booleans); LITTLE_ENDIAN(buf + 2, tp->ext_Numbers); LITTLE_ENDIAN(buf + 4, tp->ext_Strings); - LITTLE_ENDIAN(buf + 6, strmax); + LITTLE_ENDIAN(buf + 6, ext_usage); LITTLE_ENDIAN(buf + 8, nextfree); TRACE_OUT(("WRITE extended-header @%d", *offset)); - if (Write(buf, 10, 1) != 1) + 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); + tp->ext_Booleans) != tp->ext_Booleans) { + return (ERR); + } - if (even_boundary(tp->ext_Booleans)) + if (even_boundary(tp->ext_Booleans)) { return (ERR); + } TRACE_OUT(("WRITE %d numbers @%d", tp->ext_Numbers, *offset)); if (tp->ext_Numbers) { - convert_shorts(buf, tp->Numbers + NUMCOUNT, (size_t) tp->ext_Numbers); - if (Write(buf, 2, tp->ext_Numbers) != 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); + } } /* @@ -773,8 +896,9 @@ write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit) */ convert_shorts(buf, offsets, strmax); TRACE_OUT(("WRITE offsets @%d", *offset)); - if (Write(buf, 2, strmax) != strmax) + if (Write(buf, SIZEOF_SHORT, strmax) != strmax) { return (ERR); + } /* * Write the string table after the offset tables so we do not @@ -784,24 +908,28 @@ write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit) 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])) + if (!WRITE_STRING(tp->Strings[i + STRCOUNT])) { return (ERR); + } } } /* * Write the extended names */ - for (i = 0; i < extcnt; i++) { + 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])) + 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); } @@ -811,5 +939,7 @@ write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit) NCURSES_EXPORT(int) _nc_tic_written(void) { + TR(TRACE_DATABASE, ("_nc_tic_written %d entries, %d parts, %d size", + total_written, total_parts, total_size)); return total_written; } diff --git a/ncurses/trace/README b/ncurses/trace/README index e658fec..0a33300 100644 --- a/ncurses/trace/README +++ b/ncurses/trace/README @@ -1,5 +1,6 @@ ------------------------------------------------------------------------------- --- Copyright (c) 1998,2006 Free Software Foundation, Inc. -- +-- 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 -- @@ -25,7 +26,7 @@ -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------- --- $Id: README,v 1.2 2006/04/22 22:19:37 tom Exp $ +-- $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 diff --git a/ncurses/trace/lib_trace.c b/ncurses/trace/lib_trace.c index cec01de..2c10b51 100644 --- a/ncurses/trace/lib_trace.c +++ b/ncurses/trace/lib_trace.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -47,7 +48,7 @@ #include <ctype.h> -MODULE_ID("$Id: lib_trace.c,v 1.82 2013/07/06 19:42:09 tom Exp $") +MODULE_ID("$Id: lib_trace.c,v 1.95 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT_VAR(unsigned) _nc_tracing = 0; /* always define this */ @@ -85,60 +86,83 @@ NCURSES_EXPORT_VAR(const char *) _nc_tputs_trace = ""; NCURSES_EXPORT_VAR(long) _nc_outchars = 0; #endif -#define TraceFP _nc_globals.trace_fp -#define TracePath _nc_globals.trace_fname -#define TraceLevel _nc_globals.trace_level +#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 */ -NCURSES_EXPORT(void) -trace(const unsigned int tracelevel) +NCURSES_EXPORT(unsigned) +curses_trace(unsigned tracelevel) { - if ((TraceFP == 0) && tracelevel) { - const char *mode = _nc_globals.init_trace ? "ab" : "wb"; - - if (TracePath[0] == '\0') { - size_t size = sizeof(TracePath) - 12; - if (getcwd(TracePath, size) == 0) { - perror("curses: Can't get working directory"); - exit(EXIT_FAILURE); + unsigned result; +#if defined(TRACE) + 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)); + } } - TracePath[size] = '\0'; - assert(strlen(TracePath) <= size); - _nc_STRCAT(TracePath, "/trace", sizeof(TracePath)); - if (_nc_is_dir_path(TracePath)) { - _nc_STRCAT(TracePath, ".log", sizeof(TracePath)); + if (_nc_access(MyPath, W_OK) < 0 + || (MyFD = open(MyPath, O_CREAT | O_EXCL | O_RDWR, 0600)) < 0 + || (MyFP = fdopen(MyFD, BIN_W)) == 0) { + ; /* EMPTY */ } } - - _nc_globals.init_trace = TRUE; _nc_tracing = tracelevel; - if (_nc_access(TracePath, W_OK) < 0 - || (TraceFP = fopen(TracePath, mode)) == 0) { - perror("curses: Can't open 'trace' file"); - exit(EXIT_FAILURE); - } /* Try to set line-buffered mode, or (failing that) unbuffered, * so that the trace-output gets flushed automatically at the * end of each line. This is useful in case the program dies. */ + if (MyFP != 0) { #if HAVE_SETVBUF /* ANSI */ - (void) setvbuf(TraceFP, (char *) 0, _IOLBF, (size_t) 0); + (void) setvbuf(MyFP, (char *) 0, _IOLBF, (size_t) 0); #elif HAVE_SETBUF /* POSIX */ - (void) setbuffer(TraceFP, (char *) 0); + (void) setbuffer(MyFP, (char *) 0); #endif + } _tracef("TRACING NCURSES version %s.%d (tracelevel=%#x)", NCURSES_VERSION, NCURSES_VERSION_PATCH, tracelevel); } else if (tracelevel == 0) { - if (TraceFP != 0) { - fclose(TraceFP); - TraceFP = 0; + if (MyFP != 0) { + MyFD = dup(MyFD); /* allow reopen of same file */ + fclose(MyFP); + MyFP = 0; } _nc_tracing = tracelevel; } else if (_nc_tracing != tracelevel) { _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 @@ -151,16 +175,23 @@ _nc_va_tracef(const char *fmt, va_list ap) 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; - TraceLevel++; + MyLevel++; } else if (!strncmp(fmt, Return, sizeof(Return) - 1)) { after = TRUE; } if (before || after) { - if ((TraceLevel <= 1) + if ((MyLevel <= 1) || (doit & TRACE_ICALLS) != 0) doit &= (TRACE_CALLS | TRACE_CCALLS); else @@ -168,9 +199,7 @@ _nc_va_tracef(const char *fmt, va_list ap) } } - if (doit != 0) { - if (TraceFP == 0) - TraceFP = stderr; + if (doit != 0 && fp != 0) { #ifdef USE_PTHREADS /* * TRACE_ICALLS is "really" needed to show normal use with threaded @@ -184,30 +213,30 @@ _nc_va_tracef(const char *fmt, va_list ap) # if USE_WEAK_SYMBOLS if ((pthread_self)) # endif -#ifdef __MINGW32__ - fprintf(TraceFP, "%#lx:", (long) (intptr_t) pthread_self().p); +#ifdef _WIN32 + fprintf(fp, "%#lx:", (long) (intptr_t) pthread_self().p); #else - fprintf(TraceFP, "%#lx:", (long) (intptr_t) pthread_self()); + fprintf(fp, "%#lx:", (long) (intptr_t) pthread_self()); #endif #endif if (before || after) { int n; - for (n = 1; n < TraceLevel; n++) - fputs("+ ", TraceFP); + for (n = 1; n < MyLevel; n++) + fputs("+ ", fp); } - vfprintf(TraceFP, fmt, ap); - fputc('\n', TraceFP); - fflush(TraceFP); + vfprintf(fp, fmt, ap); + fputc('\n', fp); + fflush(fp); } - if (after && TraceLevel) - TraceLevel--; + if (after && MyLevel) + MyLevel--; errno = save_err; } NCURSES_EXPORT(void) -_tracef(const char *fmt,...) +_tracef(const char *fmt, ...) { va_list ap; @@ -296,6 +325,39 @@ _nc_retrace_win(WINDOW *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 - (dst - target)) + "%02x", ch & 0xff); + dst += 2; + } + } + *dst = '\0'; + return target; +} + #if USE_REENTRANT /* * Check if the given trace-mask is enabled. @@ -310,13 +372,13 @@ _nc_use_tracef(unsigned mask) bool result = FALSE; _nc_lock_global(tst_tracef); - if (!_nc_globals.nested_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() */ - _nc_globals.nested_tracef = 0; + MyNested = 0; } } else { /* we may call _nc_locked_tracef(), but with nested_tracef > 0 */ @@ -331,7 +393,7 @@ _nc_use_tracef(unsigned mask) * the tracef mutex. */ NCURSES_EXPORT(void) -_nc_locked_tracef(const char *fmt,...) +_nc_locked_tracef(const char *fmt, ...) { va_list ap; @@ -339,7 +401,7 @@ _nc_locked_tracef(const char *fmt,...) _nc_va_tracef(fmt, ap); va_end(ap); - if (--(_nc_globals.nested_tracef) == 0) { + if (--(MyNested) == 0) { _nc_unlock_global(tracef); } } diff --git a/ncurses/trace/lib_traceatr.c b/ncurses/trace/lib_traceatr.c index 5fb0df9..9402627 100644 --- a/ncurses/trace/lib_traceatr.c +++ b/ncurses/trace/lib_traceatr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -43,7 +44,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_traceatr.c,v 1.81 2014/02/01 22:09:27 tom Exp $") +MODULE_ID("$Id: lib_traceatr.c,v 1.94 2020/02/02 23:34:34 tom Exp $") #define COLOR_OF(c) ((c < 0) ? "default" : (c > 7 ? color_of(c) : colors[c].name)) @@ -67,7 +68,7 @@ color_of(int c) if (c != my_cached) { my_cached = c; my_select = !my_select; - if (c == COLOR_DEFAULT) + if (isDefaultColor(c)) _nc_STRCPY(my_buffer[my_select], "default", COLOR_BUF_SIZE(my_select)); else @@ -85,53 +86,48 @@ color_of(int c) NCURSES_EXPORT(char *) _traceattr2(int bufnum, chtype newmode) { +#define DATA(name) { name, { #name } } static const struct { unsigned int val; - const char *name; + const char name[14]; } names[] = { - /* *INDENT-OFF* */ - { A_STANDOUT, "A_STANDOUT" }, - { A_UNDERLINE, "A_UNDERLINE" }, - { A_REVERSE, "A_REVERSE" }, - { A_BLINK, "A_BLINK" }, - { A_DIM, "A_DIM" }, - { A_BOLD, "A_BOLD" }, - { A_ALTCHARSET, "A_ALTCHARSET" }, - { A_INVIS, "A_INVIS" }, - { A_PROTECT, "A_PROTECT" }, - { A_CHARTEXT, "A_CHARTEXT" }, - { A_NORMAL, "A_NORMAL" }, - { A_COLOR, "A_COLOR" }, + 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 - { A_ITALIC, "A_ITALIC" }, + DATA(A_ITALIC), #endif - /* *INDENT-ON* */ - } #ifndef USE_TERMLIB , colors[] = { - /* *INDENT-OFF* */ - { COLOR_BLACK, "COLOR_BLACK" }, - { COLOR_RED, "COLOR_RED" }, - { COLOR_GREEN, "COLOR_GREEN" }, - { COLOR_YELLOW, "COLOR_YELLOW" }, - { COLOR_BLUE, "COLOR_BLUE" }, - { COLOR_MAGENTA, "COLOR_MAGENTA" }, - { COLOR_CYAN, "COLOR_CYAN" }, - { COLOR_WHITE, "COLOR_WHITE" }, - /* *INDENT-ON* */ - + 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 */ ; - size_t n; - char temp[80]; +#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; @@ -139,12 +135,14 @@ _traceattr2(int bufnum, chtype newmode) _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 */ @@ -205,49 +203,50 @@ _nc_retrace_attr_t(attr_t 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; + const char name[13]; } ALT_NAMES; #if NCURSES_SP_FUNCS SCREEN *sp = CURRENT_SCREEN; #endif static const ALT_NAMES names[] = { - {'l', "ACS_ULCORNER"}, /* upper left corner */ - {'m', "ACS_LLCORNER"}, /* lower left corner */ - {'k', "ACS_URCORNER"}, /* upper right corner */ - {'j', "ACS_LRCORNER"}, /* lower right corner */ - {'t', "ACS_LTEE"}, /* tee pointing right */ - {'u', "ACS_RTEE"}, /* tee pointing left */ - {'v', "ACS_BTEE"}, /* tee pointing up */ - {'w', "ACS_TTEE"}, /* tee pointing down */ - {'q', "ACS_HLINE"}, /* horizontal line */ - {'x', "ACS_VLINE"}, /* vertical line */ - {'n', "ACS_PLUS"}, /* large plus or crossover */ - {'o', "ACS_S1"}, /* scan line 1 */ - {'s', "ACS_S9"}, /* scan line 9 */ - {'`', "ACS_DIAMOND"}, /* diamond */ - {'a', "ACS_CKBOARD"}, /* checker board (stipple) */ - {'f', "ACS_DEGREE"}, /* degree symbol */ - {'g', "ACS_PLMINUS"}, /* plus/minus */ - {'~', "ACS_BULLET"}, /* bullet */ - {',', "ACS_LARROW"}, /* arrow pointing left */ - {'+', "ACS_RARROW"}, /* arrow pointing right */ - {'.', "ACS_DARROW"}, /* arrow pointing down */ - {'-', "ACS_UARROW"}, /* arrow pointing up */ - {'h', "ACS_BOARD"}, /* board of squares */ - {'i', "ACS_LANTERN"}, /* lantern symbol */ - {'0', "ACS_BLOCK"}, /* solid square block */ - {'p', "ACS_S3"}, /* scan line 3 */ - {'r', "ACS_S7"}, /* scan line 7 */ - {'y', "ACS_LEQUAL"}, /* less/equal */ - {'z', "ACS_GEQUAL"}, /* greater/equal */ - {'{', "ACS_PI"}, /* Pi */ - {'|', "ACS_NEQUAL"}, /* not equal */ - {'}', "ACS_STERLING"}, /* UK pound sign */ - {'\0', (char *) 0} + 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; @@ -257,7 +256,6 @@ _nc_altcharset_name(attr_t attr, chtype ch) if (SP_PARM != 0 && (attr & A_ALTCHARSET) && (acs_chars != 0)) { char *cp; char *found = 0; - const ALT_NAMES *strp; for (cp = acs_chars; cp[0] && cp[1]; cp += 2) { if (ChCharOf(UChar(cp[1])) == ChCharOf(ch)) { @@ -267,12 +265,15 @@ _nc_altcharset_name(attr_t attr, chtype ch) } if (found != 0) { + size_t n; + ch = ChCharOf(UChar(*found)); - for (strp = names; strp->val; strp++) - if (strp->val == ch) { - result = strp->name; + for (n = 0; n < SIZEOF(names); ++n) { + if (names[n].val == ch) { + result = names[n].name; break; } + } } } return result; @@ -281,22 +282,25 @@ _nc_altcharset_name(attr_t attr, chtype ch) NCURSES_EXPORT(char *) _tracechtype2(int bufnum, chtype ch) { - const char *found; 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(ChAttrOf(ch), ch)) != 0) { + 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 (ChAttrOf(ch) != A_NORMAL) { + if (attr != A_NORMAL) { (void) _nc_trace_bufcat(bufnum, " | "); (void) _nc_trace_bufcat(bufnum, - _traceattr2(bufnum + 20, ChAttrOf(ch))); + _traceattr2(bufnum + 20, attr)); } result = _nc_trace_bufcat(bufnum, r_brace); @@ -323,13 +327,13 @@ NCURSES_EXPORT(char *) _tracecchar_t2(int bufnum, const cchar_t *ch) { char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ); - attr_t attr; - const char *found; if (result != 0) { _nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum)); if (ch != 0) { - attr = AttrOfD(ch); + 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; @@ -340,7 +344,6 @@ _tracecchar_t2(int bufnum, const cchar_t *ch) PUTC_DATA; int n; - PUTC_INIT; (void) _nc_trace_bufcat(bufnum, "{ "); for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) { PUTC_ch = ch->chars[PUTC_i]; @@ -349,6 +352,7 @@ _tracecchar_t2(int bufnum, const cchar_t *ch) (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') { @@ -358,6 +362,14 @@ _tracecchar_t2(int bufnum, const cchar_t *ch) 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); + break; } for (n = 0; n < PUTC_n; n++) { if (n) @@ -373,6 +385,18 @@ _tracecchar_t2(int bufnum, const cchar_t *ch) (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); diff --git a/ncurses/trace/lib_tracebits.c b/ncurses/trace/lib_tracebits.c index 7d8325a..14e5d90 100644 --- a/ncurses/trace/lib_tracebits.c +++ b/ncurses/trace/lib_tracebits.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * 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 * @@ -34,7 +35,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_tracebits.c,v 1.23 2012/06/09 19:55:46 tom Exp $") +MODULE_ID("$Id: lib_tracebits.c,v 1.28 2020/02/02 23:34:34 tom Exp $") #if HAVE_SYS_TERMIO_H #include <sys/termio.h> /* needed for ISC */ @@ -73,7 +74,7 @@ MODULE_ID("$Id: lib_tracebits.c,v 1.23 2012/06/09 19:55:46 tom Exp $") typedef struct { unsigned int val; - const char *name; + const char name[8]; } BITNAMES; #define TRACE_BUF_SIZE(num) (_nc_globals.tracebuf_ptr[num].size) @@ -85,7 +86,7 @@ lookup_bits(char *buf, const BITNAMES * table, const char *label, unsigned int v _nc_STRCAT(buf, label, TRACE_BUF_SIZE(0)); _nc_STRCAT(buf, ": {", TRACE_BUF_SIZE(0)); - for (sp = table; sp->name; sp++) + 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)); @@ -103,56 +104,59 @@ _nc_trace_ttymode(TTY * tty) char *buf; #ifdef TERMIOS +#define DATA(name) { name, { #name } } +#define DATA2(name,name2) { name, { #name2 } } +#define DATAX() { 0, { "" } } static const BITNAMES iflags[] = { - {BRKINT, "BRKINT"}, - {IGNBRK, "IGNBRK"}, - {IGNPAR, "IGNPAR"}, - {PARMRK, "PARMRK"}, - {INPCK, "INPCK"}, - {ISTRIP, "ISTRIP"}, - {INLCR, "INLCR"}, - {IGNCR, "IGNC"}, - {ICRNL, "ICRNL"}, - {IXON, "IXON"}, - {IXOFF, "IXOFF"}, - {0, NULL} + 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[] = { - {OPOST, "OPOST"}, - {OFLAGS_TABS, "XTABS"}, - {ONLCR, "ONLCR"}, - {OCRNL, "OCRNL"}, - {ONOCR, "ONOCR"}, - {ONLRET, "ONLRET"}, - {0, NULL} -#define ALLOUT (OPOST|OFLAGS_TABS|ONLCR|OCRNL|ONOCR|ONLRET) + 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[] = { - {CLOCAL, "CLOCAL"}, - {CREAD, "CREAD"}, - {CSTOPB, "CSTOPB"}, + DATA(CLOCAL), + DATA(CREAD), + DATA(CSTOPB), #if !defined(CS5) || !defined(CS8) - {CSIZE, "CSIZE"}, + DATA(CSIZE), #endif - {HUPCL, "HUPCL"}, - {PARENB, "PARENB"}, - {PARODD | PARENB, "PARODD"}, /* concession to readability */ - {0, NULL} + DATA(HUPCL), + DATA(PARENB), + DATA2(PARODD | PARENB, PARODD), + DATAX() #define ALLCTRL (CLOCAL|CREAD|CSIZE|CSTOPB|HUPCL|PARENB|PARODD) }, lflags[] = { - {ECHO, "ECHO"}, - {ECHOE | ECHO, "ECHOE"}, /* concession to readability */ - {ECHOK | ECHO, "ECHOK"}, /* concession to readability */ - {ECHONL, "ECHONL"}, - {ICANON, "ICANON"}, - {ISIG, "ISIG"}, - {NOFLSH, "NOFLSH"}, - {TOSTOP, "TOSTOP"}, - {IEXTEN, "IEXTEN"}, - {0, NULL} + 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) }; @@ -175,11 +179,11 @@ _nc_trace_ttymode(TTY * tty) #if defined(CS5) && defined(CS8) { - static struct { + static const struct { int value; - const char *name; + const char name[5]; } csizes[] = { -#define CS_DATA(name) { name, #name " " } +#define CS_DATA(name) { name, { #name " " } } CS_DATA(CS5), #ifdef CS6 CS_DATA(CS6), @@ -228,17 +232,17 @@ _nc_trace_ttymode(TTY * tty) static const BITNAMES cflags[] = { - {CBREAK, "CBREAK"}, - {CRMOD, "CRMOD"}, - {ECHO, "ECHO"}, - {EVENP, "EVENP"}, - {LCASE, "LCASE"}, - {LLITOUT, "LLITOUT"}, - {ODDP, "ODDP"}, - {RAW, "RAW"}, - {TANDEM, "TANDEM"}, - {XTABS, "XTABS"}, - {0, NULL} + 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) }; diff --git a/ncurses/trace/lib_tracechr.c b/ncurses/trace/lib_tracechr.c index 8977f75..36158d6 100644 --- a/ncurses/trace/lib_tracechr.c +++ b/ncurses/trace/lib_tracechr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2012 Free Software Foundation, Inc. * + * 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 * @@ -39,7 +40,7 @@ #include <ctype.h> -MODULE_ID("$Id: lib_tracechr.c,v 1.22 2012/02/22 22:40:24 tom Exp $") +MODULE_ID("$Id: lib_tracechr.c,v 1.23 2020/02/02 23:34:34 tom Exp $") #ifdef TRACE diff --git a/ncurses/trace/lib_tracedmp.c b/ncurses/trace/lib_tracedmp.c index 0fda15b..3b7ea07 100644 --- a/ncurses/trace/lib_tracedmp.c +++ b/ncurses/trace/lib_tracedmp.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2012 Free Software Foundation, Inc. * + * 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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> #include <ctype.h> -MODULE_ID("$Id: lib_tracedmp.c,v 1.34 2012/10/27 20:54:42 tom Exp $") +MODULE_ID("$Id: lib_tracedmp.c,v 1.36 2020/02/02 23:34:34 tom Exp $") #ifdef TRACE @@ -76,7 +77,7 @@ _tracedump(const char *name, WINDOW *win) for (n = 0; n <= win->_maxy; ++n) { char *ep = my_buffer; - bool haveattrs, havecolors; + bool havecolors; /* * Dump A_CHARTEXT part. It is more important to make the grid line up @@ -156,8 +157,8 @@ _tracedump(const char *name, WINDOW *win) for (i = 0; i < 4; ++i) { const char *hex = " 123456789ABCDEF"; attr_t mask = (attr_t) (0xf << ((i + 4) * 4)); + bool haveattrs = FALSE; - haveattrs = FALSE; for (j = 0; j < width; ++j) if (AttrOf(win->_line[n].text[j]) & mask) { haveattrs = TRUE; diff --git a/ncurses/trace/lib_tracemse.c b/ncurses/trace/lib_tracemse.c index c62b71a..33d4d3d 100644 --- a/ncurses/trace/lib_tracemse.c +++ b/ncurses/trace/lib_tracemse.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2012,2014 Free Software Foundation, Inc. * + * 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 * @@ -38,7 +39,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_tracemse.c,v 1.22 2014/10/10 09:06:26 tom Exp $") +MODULE_ID("$Id: lib_tracemse.c,v 1.23 2020/02/02 23:34:34 tom Exp $") #ifdef TRACE diff --git a/ncurses/trace/trace_buf.c b/ncurses/trace/trace_buf.c index 84a7a0c..7e6384b 100644 --- a/ncurses/trace/trace_buf.c +++ b/ncurses/trace/trace_buf.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * 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 * @@ -35,7 +36,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: trace_buf.c,v 1.20 2012/02/22 22:34:31 tom Exp $") +MODULE_ID("$Id: trace_buf.c,v 1.21 2020/02/02 23:34:34 tom Exp $") #ifdef TRACE diff --git a/ncurses/trace/trace_tries.c b/ncurses/trace/trace_tries.c index 50ba016..14f704b 100644 --- a/ncurses/trace/trace_tries.c +++ b/ncurses/trace/trace_tries.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1999-2011,2012 Free Software Foundation, Inc. * + * 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 * @@ -35,7 +36,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: trace_tries.c,v 1.17 2012/10/27 20:50:50 tom Exp $") +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 diff --git a/ncurses/trace/trace_xnames.c b/ncurses/trace/trace_xnames.c index 38a4873..2d74336 100644 --- a/ncurses/trace/trace_xnames.c +++ b/ncurses/trace/trace_xnames.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1999-2000,2010 Free Software Foundation, Inc. * + * 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 * @@ -35,7 +36,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: trace_xnames.c,v 1.6 2010/01/23 17:59:27 tom Exp $") +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) @@ -43,8 +44,9 @@ _nc_trace_xnames(TERMTYPE *tp GCC_UNUSED) #ifdef TRACE #if NCURSES_XNAMES int limit = tp->ext_Booleans + tp->ext_Numbers + tp->ext_Strings; - int n, m; + if (limit) { + int n; int begin_num = tp->ext_Booleans; int begin_str = tp->ext_Booleans + tp->ext_Numbers; @@ -53,7 +55,10 @@ _nc_trace_xnames(TERMTYPE *tp GCC_UNUSED) 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], diff --git a/ncurses/trace/varargs.c b/ncurses/trace/varargs.c index 66252d8..9be5fc2 100644 --- a/ncurses/trace/varargs.c +++ b/ncurses/trace/varargs.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2001-2008,2012 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -34,7 +35,7 @@ #include <ctype.h> -MODULE_ID("$Id: varargs.c,v 1.11 2012/10/27 21:03:28 tom Exp $") +MODULE_ID("$Id: varargs.c,v 1.12 2020/02/02 23:34:34 tom Exp $") #ifdef TRACE diff --git a/ncurses/trace/visbuf.c b/ncurses/trace/visbuf.c index fec0643..5f95a6b 100644 --- a/ncurses/trace/visbuf.c +++ b/ncurses/trace/visbuf.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2001-2012,2014 Free Software Foundation, Inc. * + * Copyright 2019,2020 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 * @@ -42,7 +43,7 @@ #include <tic.h> #include <ctype.h> -MODULE_ID("$Id: visbuf.c,v 1.44 2014/09/25 08:51:13 tom Exp $") +MODULE_ID("$Id: visbuf.c,v 1.52 2020/02/02 23:34:34 tom Exp $") #define NUM_VISBUFS 4 @@ -80,6 +81,9 @@ _nc_vischar(char *tp, unsigned c LIMIT_ARG) } else if (c == '\b') { *tp++ = '\\'; *tp++ = 'b'; + } else if (c == '\t') { + *tp++ = '\\'; + *tp++ = 't'; } else if (c == '\033') { *tp++ = '\\'; *tp++ = 'e'; @@ -105,7 +109,6 @@ _nc_visbuf2n(int bufnum, const char *buf, int len) { const char *vbuf = 0; char *tp; - int c; int count; if (buf == 0) @@ -122,6 +125,8 @@ _nc_visbuf2n(int bufnum, const char *buf, int len) #else { static char *mybuf[NUM_VISBUFS]; + int c; + if (bufnum < 0) { for (c = 0; c < NUM_VISBUFS; ++c) { FreeAndNull(mybuf[c]); @@ -134,6 +139,8 @@ _nc_visbuf2n(int bufnum, const char *buf, int len) } #endif if (tp != 0) { + int c; + *tp++ = D_QUOTE; while ((--count >= 0) && (c = *buf++) != '\0') { tp = VisChar(tp, UChar(c), NormalLen(len)); @@ -185,7 +192,6 @@ _nc_viswbuf2n(int bufnum, const wchar_t *buf, int len) { const char *vbuf; char *tp; - wchar_t c; int count; if (buf == 0) @@ -205,6 +211,8 @@ _nc_viswbuf2n(int bufnum, const wchar_t *buf, int len) } #endif if (tp != 0) { + wchar_t c; + *tp++ = D_QUOTE; while ((--count >= 0) && (c = *buf++) != '\0') { char temp[CCHARW_MAX + 80]; @@ -278,10 +286,10 @@ NCURSES_EXPORT(const char *) _nc_viscbuf2(int bufnum, const NCURSES_CH_T * buf, int len) { char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ); - int first; - const char *found; if (result != 0) { + int first = 0; + #if USE_WIDEC_SUPPORT if (len < 0) len = _nc_wchstrlen(buf); @@ -290,7 +298,6 @@ _nc_viscbuf2(int bufnum, const NCURSES_CH_T * buf, int len) /* * Display one or more strings followed by attributes. */ - first = 0; while (first < len) { attr_t attr = AttrOf(buf[first]); int last = len - 1; @@ -306,7 +313,8 @@ _nc_viscbuf2(int bufnum, const NCURSES_CH_T * buf, int len) (void) _nc_trace_bufcat(bufnum, l_brace); (void) _nc_trace_bufcat(bufnum, d_quote); for (j = first; j <= last; ++j) { - found = _nc_altcharset_name(attr, (chtype) CharOf(buf[j])); + const char *found = _nc_altcharset_name(attr, (chtype) + CharOf(buf[j])); if (found != 0) { (void) _nc_trace_bufcat(bufnum, found); attr &= ~A_ALTCHARSET; @@ -315,9 +323,9 @@ _nc_viscbuf2(int bufnum, const NCURSES_CH_T * buf, int len) if (!isWidecExt(buf[j])) { PUTC_DATA; - PUTC_INIT; 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') { @@ -325,12 +333,18 @@ _nc_viscbuf2(int bufnum, const NCURSES_CH_T * buf, int len) (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) + 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++) { - char temp[80]; VisChar(temp, UChar(PUTC_buf[k]), sizeof(temp)); (void) _nc_trace_bufcat(bufnum, temp); } diff --git a/ncurses/tty/MKexpanded.sh b/ncurses/tty/MKexpanded.sh index 7a5f599..65c6b93 100755 --- a/ncurses/tty/MKexpanded.sh +++ b/ncurses/tty/MKexpanded.sh @@ -1,6 +1,7 @@ #! /bin/sh ############################################################################## -# Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. # +# Copyright 2019,2020 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"), # @@ -29,7 +30,7 @@ # # Author: Thomas E. Dickey, 1997-on # -# $Id: MKexpanded.sh,v 1.17 2010/01/23 17:57:43 tom Exp $ +# $Id: MKexpanded.sh,v 1.22 2020/02/02 23:34:34 tom Exp $ # # Script to generate 'expanded.c', a dummy source that contains functions # corresponding to complex macros used in this library. By making functions, @@ -48,7 +49,7 @@ else fi TMP=gen$$.c -trap "rm -f $TMP" 0 1 2 5 15 +trap "rm -f $TMP" EXIT INT QUIT TERM HUP cat <<EOF /* generated by MKexpanded.sh */ @@ -125,7 +126,7 @@ _nc_UpdateAttrs (CARG_CH_T c) EOF $preprocessor $TMP 2>/dev/null | \ - sed -e '1,/^IGNORE$/d' -e 's/^@/#/' -e 's/^#if_/#if /' + sed -e '1,/^IGNORE$/d' -e 's/^@/#/' -e 's/^#[ ]*if_/#if /' -e "s,$TMP,expanded.c," cat <<EOF #else /* ! NCURSES_EXPANDED */ diff --git a/ncurses/tty/hardscroll.c b/ncurses/tty/hardscroll.c index 4ec168a..abb21cf 100644 --- a/ncurses/tty/hardscroll.c +++ b/ncurses/tty/hardscroll.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2012 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -147,7 +148,7 @@ AUTHOR #include <curses.priv.h> -MODULE_ID("$Id: hardscroll.c,v 1.51 2012/10/17 09:01:10 tom Exp $") +MODULE_ID("$Id: hardscroll.c,v 1.54 2020/02/02 23:34:34 tom Exp $") #if defined(SCROLLDEBUG) || defined(HASHDEBUG) @@ -300,11 +301,12 @@ NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_linedump) (NCURSES_SP_DCL0) /* dump the state of the real and virtual oldnum fields */ { - int n; 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++) @@ -339,7 +341,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) for (;;) { int n; - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) oldnums[n] = _NEWINDEX; /* grab the test vector */ diff --git a/ncurses/tty/hashmap.c b/ncurses/tty/hashmap.c index 9282276..9d1e482 100644 --- a/ncurses/tty/hashmap.c +++ b/ncurses/tty/hashmap.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2014 Free Software Foundation, Inc. * + * Copyright 2019,2020 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 * @@ -73,19 +74,23 @@ AUTHOR #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: hashmap.c,v 1.64 2014/04/26 18:48:44 juergen Exp $") +MODULE_ID("$Id: hashmap.c,v 1.68 2020/02/02 23:34:34 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 MAXLINES -# define TEXTWIDTH 1 +# define screen_lines(sp) MAXLINES +# define TEXTWIDTH(sp) 1 int oldnums[MAXLINES], reallines[MAXLINES]; -static NCURSES_CH_T oldtext[MAXLINES][TEXTWIDTH]; -static NCURSES_CH_T newtext[MAXLINES][TEXTWIDTH]; +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] @@ -115,11 +120,13 @@ static NCURSES_CH_T newtext[MAXLINES][TEXTWIDTH]; static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT); static NCURSES_INLINE unsigned long -hash(SCREEN *sp, NCURSES_CH_T * text) +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); @@ -129,10 +136,11 @@ hash(SCREEN *sp, NCURSES_CH_T * text) /* approximate update cost */ static int -update_cost(SCREEN *sp, NCURSES_CH_T * from, NCURSES_CH_T * to) +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))) @@ -142,11 +150,12 @@ update_cost(SCREEN *sp, NCURSES_CH_T * from, NCURSES_CH_T * to) } static int -update_cost_from_blank(SCREEN *sp, NCURSES_CH_T * to) +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)); @@ -190,9 +199,8 @@ cost_effective(SCREEN *sp, const int from, const int to, const int blank) static void grow_hunks(SCREEN *sp) { - int start, end, shift; - int back_limit, forward_limit; /* limits for cells to fill */ - int back_ref_limit, forward_ref_limit; /* limits for refrences */ + int back_limit; /* limits for cells to fill */ + int back_ref_limit; /* limit for references */ int i; int next_hunk; @@ -207,8 +215,11 @@ grow_hunks(SCREEN *sp) while (i < screen_lines(sp) && OLDNUM(sp, i) == _NEWINDEX) i++; for (; i < screen_lines(sp); i = next_hunk) { - start = i; - shift = OLDNUM(sp, i) - i; + int forward_limit; + int forward_ref_limit; + int end; + int start = i; + int shift = OLDNUM(sp, i) - i; /* get forward limit */ i = start + 1; @@ -277,7 +288,6 @@ NCURSES_SP_NAME(_nc_hash_map) (NCURSES_SP_DCL0) { HASHMAP *hsp; register int i; - int start, shift, size; if (screen_lines(SP_PARM) > lines_alloc(SP_PARM)) { if (hashtab(SP_PARM)) @@ -379,6 +389,8 @@ NCURSES_SP_NAME(_nc_hash_map) (NCURSES_SP_DCL0) * 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)) @@ -486,7 +498,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) return EXIT_FAILURE; (void) _nc_alloc_screen(); - for (n = 0; n < screen_lines; n++) { + for (n = 0; n < screen_lines(sp); n++) { reallines[n] = n; oldnums[n] = _NEWINDEX; CharOf(oldtext[n][0]) = CharOf(newtext[n][0]) = '.'; @@ -509,7 +521,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) break; case 'l': /* get initial line number vector */ - for (n = 0; n < screen_lines; n++) { + for (n = 0; n < screen_lines(sp); n++) { reallines[n] = n; oldnums[n] = _NEWINDEX; } @@ -522,9 +534,9 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) break; case 'n': /* use following letters as text of new lines */ - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) CharOf(newtext[n][0]) = '.'; - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) if (line[n + 1] == '\n') break; else @@ -532,9 +544,9 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) break; case 'o': /* use following letters as text of old lines */ - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) CharOf(oldtext[n][0]) = '.'; - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) if (line[n + 1] == '\n') break; else @@ -546,12 +558,12 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) _nc_linedump(); #endif (void) fputs("Old lines: [", stdout); - for (n = 0; n < screen_lines; n++) + 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; n++) + for (n = 0; n < screen_lines(sp); n++) putchar(CharOf(newtext[n][0])); putchar(']'); putchar('\n'); @@ -572,11 +584,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) break; } } -#if NO_LEAKS - _nc_free_and_exit(EXIT_SUCCESS); -#else - return EXIT_SUCCESS; -#endif + exit_curses(EXIT_SUCCESS); } #endif /* HASHDEBUG */ diff --git a/ncurses/tty/lib_mvcur.c b/ncurses/tty/lib_mvcur.c index e172736..5382b3b 100644 --- a/ncurses/tty/lib_mvcur.c +++ b/ncurses/tty/lib_mvcur.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -159,7 +160,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_mvcur.c,v 1.135 2014/04/26 18:47:20 juergen Exp $") +MODULE_ID("$Id: lib_mvcur.c,v 1.151 2020/02/02 23:34:34 tom Exp $") #define WANT_CHAR(sp, y, x) NewScreen(sp)->_line[y].text[x] /* desired state */ @@ -344,7 +345,9 @@ NCURSES_SP_NAME(_nc_mvcur_init) (NCURSES_SP_DCL0) 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) { + 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 { @@ -450,8 +453,8 @@ NCURSES_SP_NAME(_nc_mvcur_init) (NCURSES_SP_DCL0) /* * A different, possibly better way to arrange this would be to set the - * SCREEN's _endwin to TRUE at window initialization time and let this be - * called by doupdate's return-from-shellout code. + * 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); } @@ -935,6 +938,7 @@ onscreen_mvcur(NCURSES_SP_DCLx #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); @@ -988,14 +992,14 @@ _nc_real_mvcur(NCURSES_SP_DCLx TR(TRACE_CHARPUT, ("turning off (%#lx) %s before move", (unsigned long) AttrOf(oldattr), _traceattr(AttrOf(oldattr)))); - (void) VIDATTR(SP_PARM, A_NORMAL, 0); + VIDPUTS(SP_PARM, A_NORMAL, 0); } if (xold >= screen_columns(SP_PARM)) { - int l; if (SP_PARM->_nl) { - l = (xold + 1) / 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); @@ -1042,7 +1046,7 @@ _nc_real_mvcur(NCURSES_SP_DCLx TR(TRACE_CHARPUT, ("turning on (%#lx) %s after move", (unsigned long) AttrOf(oldattr), _traceattr(AttrOf(oldattr)))); - (void) VIDATTR(SP_PARM, AttrOf(oldattr), GetPair(oldattr)); + VIDPUTS(SP_PARM, AttrOf(oldattr), GetPair(oldattr)); } } returnCode(code); @@ -1056,9 +1060,18 @@ NCURSES_SP_NAME(_nc_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_outch), - TRUE); + 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 @@ -1077,11 +1090,16 @@ _nc_mvcur(int yold, int xold, NCURSES_EXPORT(int) TINFO_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_outch), - TRUE); + 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 */ @@ -1181,7 +1199,7 @@ roll(int n) int main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) { - strcpy(tname, getenv("TERM")); + _nc_STRCPY(tname, getenv("TERM"), sizeof(tname)); load_term(); _nc_setupscreen(lines, columns, stdout, FALSE, 0); baudrate(); @@ -1197,27 +1215,26 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) int fy, fx, ty, tx, n, i; char buf[BUFSIZ], capname[BUFSIZ]; - (void) fputs("> ", stdout); - (void) fgets(buf, sizeof(buf), stdin); + 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] == '?') { - (void) puts("? -- display this help message"); - (void) - puts("fy fx ty tx -- (4 numbers) display (fy,fx)->(ty,tx) move"); - (void) puts("s[croll] n t b m -- display scrolling sequence"); - (void) - printf("r[eload] -- reload terminal info for %s\n", - termname()); - (void) - puts("l[oad] <term> -- load terminal info for type <term>"); - (void) puts("d[elete] <cap> -- delete named capability"); - (void) puts("i[nspect] -- display terminal capabilities"); - (void) - puts("c[ost] -- dump cursor-optimization cost table"); - (void) puts("o[optimize] -- toggle movement optimization"); - (void) - puts("t[orture] <num> -- torture-test with <num> random moves"); - (void) puts("q[uit] -- quit the program"); + 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] <term> -- load terminal info for type <term>"); + PUTS("d[elete] <cap> -- 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] <num> -- torture-test with <num> 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; @@ -1245,7 +1262,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) before.tv_sec) * 1000000)); } else if (buf[0] == 'r') { - (void) strcpy(tname, termname()); + _nc_STRCPY(tname, termname(), sizeof(tname)); load_term(); } else if (sscanf(buf, "l %s", tname) == 1) { load_term(); @@ -1278,8 +1295,9 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) } } } else if (buf[0] == 'i') { - dump_init((char *) NULL, F_TERMINFO, S_TERMINFO, 70, 0, FALSE); - dump_entry(&cur_term->type, FALSE, TRUE, 0, 0); + 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) { diff --git a/ncurses/tty/lib_tstp.c b/ncurses/tty/lib_tstp.c index 8624b76..43a58e6 100644 --- a/ncurses/tty/lib_tstp.c +++ b/ncurses/tty/lib_tstp.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -42,7 +43,7 @@ #include <SigAction.h> -MODULE_ID("$Id: lib_tstp.c,v 1.48 2014/04/26 18:47:35 juergen Exp $") +MODULE_ID("$Id: lib_tstp.c,v 1.50 2020/02/02 23:34:34 tom Exp $") #if defined(SIGTSTP) && (HAVE_SIGACTION || HAVE_SIGVEC) #define USE_SIGTSTP 1 @@ -155,8 +156,10 @@ handle_SIGTSTP(int dummy GCC_UNUSED) * 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) /* 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 @@ -273,7 +276,7 @@ handle_SIGINT(int sig) set_term(scan); NCURSES_SP_NAME(endwin) (NCURSES_SP_ARG); if (sp) - sp->_endwin = FALSE; /* in case of reuse */ + sp->_endwin = ewInitial; /* in case of reuse */ } } } diff --git a/ncurses/tty/lib_twait.c b/ncurses/tty/lib_twait.c index 59942f7..3ab168d 100644 --- a/ncurses/tty/lib_twait.c +++ b/ncurses/tty/lib_twait.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018,2020 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 * @@ -70,12 +71,12 @@ # include <sys/select.h> # endif #endif -#ifdef __MINGW32__ +#ifdef _WIN32 # include <sys/time.h> #endif #undef CUR -MODULE_ID("$Id: lib_twait.c,v 1.68 2014/03/08 20:32:59 tom Exp $") +MODULE_ID("$Id: lib_twait.c,v 1.74 2020/02/02 23:34:34 tom Exp $") static long _nc_gettime(TimeType * t0, int first) @@ -113,15 +114,15 @@ NCURSES_EXPORT(int) _nc_eventlist_timeout(_nc_eventlist * evl) { int event_delay = -1; - int n; 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 = ev->data.timeout_msec; + event_delay = (int) ev->data.timeout_msec; if (event_delay < 0) event_delay = INT_MAX; /* FIXME Is this defined? */ } @@ -197,6 +198,10 @@ _nc_timed_wait(SCREEN *sp MAYBE_UNUSED, long starttime, returntime; +#ifdef NCURSES_WGETCH_EVENTS + (void) timeout_is_event; +#endif + TR(TRACE_IEVENT, ("start twait: %d milliseconds, mode: %d", milliseconds, mode)); @@ -230,7 +235,8 @@ _nc_timed_wait(SCREEN *sp MAYBE_UNUSED, #ifdef NCURSES_WGETCH_EVENTS if ((mode & TW_EVENT) && evl) { - fds = typeMalloc(struct pollfd, MIN_FDS + evl->count); + if (fds == fd_list) + fds = typeMalloc(struct pollfd, MIN_FDS + evl->count); if (fds == 0) return TW_NONE; } diff --git a/ncurses/tty/lib_vidattr.c b/ncurses/tty/lib_vidattr.c index 184d9b9..c752919 100644 --- a/ncurses/tty/lib_vidattr.c +++ b/ncurses/tty/lib_vidattr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -69,17 +70,24 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_vidattr.c,v 1.71 2014/09/04 22:01:27 tom Exp $") +MODULE_ID("$Id: lib_vidattr.c,v 1.76 2020/02/02 23:34: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) { doPut(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) { doPut(mode); turn_off &= ~mask; } + 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) \ @@ -117,7 +125,7 @@ NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx T((T_CALLED("vidputs(%p,%s)"), (void *) SP_PARM, _traceattr(newmode))); - if (!IsTermInfo(SP_PARM)) + if (!IsValidTIScreen(SP_PARM)) returnCode(ERR); /* this allows us to go on whether or not newterm() has been called */ @@ -145,7 +153,11 @@ NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx }; 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; /* @@ -308,7 +320,7 @@ NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx #if USE_ITALIC TurnOn(A_ITALIC, enter_italics_mode); #endif -#if USE_WIDEC_SUPPORT +#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); @@ -317,7 +329,6 @@ NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx TurnOn(A_VERTICAL, enter_vertical_hl_mode); #endif /* *INDENT-ON* */ - } if (reverse) diff --git a/ncurses/tty/tty_update.c b/ncurses/tty/tty_update.c index e66f716..8626c79 100644 --- a/ncurses/tty/tty_update.c +++ b/ncurses/tty/tty_update.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-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 * @@ -43,6 +44,8 @@ * *-----------------------------------------------------------------*/ +#define NEW_PAIR_INTERNAL 1 + #include <curses.priv.h> #ifndef CUR @@ -82,7 +85,7 @@ #include <ctype.h> -MODULE_ID("$Id: tty_update.c,v 1.280 2014/08/23 19:25:18 tom Exp $") +MODULE_ID("$Id: tty_update.c,v 1.305 2020/02/02 23:34:34 tom Exp $") /* * This define controls the line-breakout optimization. Every once in a @@ -207,6 +210,10 @@ GoTo(NCURSES_SP_DCLx int const row, int const col) 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) { @@ -233,7 +240,7 @@ PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) * Determine the number of character cells which the 'ch' value will use * on the screen. It should be at least one. */ - if ((chlen = wcwidth(CharOf(CHDEREF(ch)))) <= 0) { + if ((chlen = _nc_wacs_width(CharOf(CHDEREF(ch)))) <= 0) { static const NCURSES_CH_T blank = NewChar(BLANK_TEXT); /* @@ -268,8 +275,14 @@ PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) if ((AttrOf(attr) & A_ALTCHARSET) && SP_PARM->_acs_map != 0 - && CharOfD(ch) < ACS_LEN) { + && ((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 @@ -277,17 +290,39 @@ PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) * character, and uses the wide-character mapping when we expect the * normal one to be broken (by mis-design ;-). */ - if (SP_PARM->_screen_acs_fix - && SP_PARM->_screen_acs_map[CharOf(my_ch)]) { - RemAttr(attr, A_ALTCHARSET); - my_ch = _nc_wacs[CharOf(my_ch)]; - } else if (SP_PARM->_screen_unicode - && !SP_PARM->_screen_acs_map[CharOf(my_ch)] - && _nc_wacs[CharOf(my_ch)].chars[0]) { - RemAttr(attr, A_ALTCHARSET); - my_ch = _nc_wacs[CharOf(my_ch)]; - } + 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 @@ -307,6 +342,11 @@ PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) } 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); @@ -448,7 +488,7 @@ wrap_cursor(NCURSES_SP_DCL0) TR(TRACE_CHARPUT, ("turning off (%#lx) %s before wrapping", (unsigned long) AttrOf(SCREEN_ATTRS(SP_PARM)), _traceattr(AttrOf(SCREEN_ATTRS(SP_PARM))))); - (void) VIDATTR(SP_PARM, A_NORMAL, 0); + VIDPUTS(SP_PARM, A_NORMAL, 0); } } else { SP_PARM->_curscol--; @@ -493,14 +533,15 @@ can_clear_with(NCURSES_SP_DCLx ARG_CH_T ch) if (!SP_PARM->_default_color) return FALSE; - if (SP_PARM->_default_fg != C_MASK || SP_PARM->_default_bg != C_MASK) + 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 - || (fg != C_MASK || bg != C_MASK)) { + || !(isDefaultColor(fg) && isDefaultColor(bg))) { return FALSE; } } @@ -578,7 +619,15 @@ EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T * ntext, int num) } else { return 1; /* cursor stays in the middle */ } - } else if (repeat_char && runcount > SP_PARM->_rep_cost) { + } else if (repeat_char != 0 && +#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; @@ -587,11 +636,19 @@ EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T * ntext, int num) 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 TPARM_2(repeat_char, - CharOf(ntext0), + CharOf(temp), rep_count), - rep_count, + 1, NCURSES_SP_NAME(_nc_outch)); SP_PARM->_curscol += rep_count; @@ -627,7 +684,6 @@ PutRange(NCURSES_SP_DCLx int row, int first, int last) { - int i, j, same; int rc; TR(TRACE_CHARPUT, ("PutRange(%p, %p, %p, %d, %d, %d)", @@ -638,6 +694,8 @@ PutRange(NCURSES_SP_DCLx 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; @@ -680,9 +738,12 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) T((T_CALLED("_nc_tinfo:doupdate(%p)"), (void *) SP_PARM)); - if (SP_PARM == 0) - returnCode(ERR); + _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 @@ -703,9 +764,10 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) if (CurScreen(SP_PARM) == 0 || NewScreen(SP_PARM) == 0 - || StdScreen(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) @@ -723,7 +785,8 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) SP_PARM->_fifohold--; #if USE_SIZECHANGE - if (SP_PARM->_endwin || _nc_handle_sigwinch(SP_PARM)) { + 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. @@ -736,7 +799,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) } #endif - if (SP_PARM->_endwin) { + if (SP_PARM->_endwin == ewSuspend) { T(("coming back from shell mode")); NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG); @@ -745,7 +808,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG); SP_PARM->_mouse_resume(SP_PARM); - SP_PARM->_endwin = FALSE; + SP_PARM->_endwin = ewRunning; } #if USE_TRACE_TIMES /* zero the metering machinery */ @@ -1013,6 +1076,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) _nc_signal_handler(TRUE); + _nc_unlock_global(update); returnCode(OK); } @@ -1084,10 +1148,10 @@ ClrUpdate(NCURSES_SP_DCL0) static void ClrToEOL(NCURSES_SP_DCLx NCURSES_CH_T blank, int needclear) { - int j; - 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 = @@ -1158,16 +1222,17 @@ ClrToEOS(NCURSES_SP_DCLx NCURSES_CH_T blank) static int ClrBottom(NCURSES_SP_DCLx int total) { - int row; - int col; 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]; - bool ok; 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)); } @@ -1258,8 +1323,8 @@ TransformLine(NCURSES_SP_DCLx int const lineno) && unColor(oldLine[n]) == unColor(newLine[n])) { if (oldPair < SP_PARM->_pair_limit && newPair < SP_PARM->_pair_limit - && (SP_PARM->_color_pairs[oldPair] == - SP_PARM->_color_pairs[newPair])) { + && (isSamePair(SP_PARM->_color_pairs[oldPair], + SP_PARM->_color_pairs[newPair]))) { SetPair(oldLine[n], GetPair(newLine[n])); } } @@ -1649,16 +1714,16 @@ InsStr(NCURSES_SP_DCLx NCURSES_CH_T * line, int count) TPUTS_TRACE("parm_ich"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TPARM_1(parm_ich, count), - count, + 1, NCURSES_SP_NAME(_nc_outch)); - while (count) { + 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) { + while (count > 0) { PutAttrChar(NCURSES_SP_ARGx CHREF(*line)); if (insert_padding) { NCURSES_PUTP2("insert_padding", insert_padding); @@ -1668,7 +1733,7 @@ InsStr(NCURSES_SP_DCLx NCURSES_CH_T * line, int count) } NCURSES_PUTP2("exit_insert_mode", exit_insert_mode); } else { - while (count) { + while (count > 0) { NCURSES_PUTP2("insert_character", insert_character); PutAttrChar(NCURSES_SP_ARGx CHREF(*line)); if (insert_padding) { @@ -1693,8 +1758,6 @@ InsStr(NCURSES_SP_DCLx NCURSES_CH_T * line, int count) static void DelChar(NCURSES_SP_DCLx int count) { - int n; - TR(TRACE_UPDATE, ("DelChar(%p, %d) called, position = (%ld,%ld)", (void *) SP_PARM, count, (long) NewScreen(SP_PARM)->_cury, @@ -1704,9 +1767,11 @@ DelChar(NCURSES_SP_DCLx int count) TPUTS_TRACE("parm_dch"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TPARM_1(parm_dch, count), - count, + 1, NCURSES_SP_NAME(_nc_outch)); } else { + int n; + for (n = 0; n < count; n++) { NCURSES_PUTP2("delete_character", delete_character); } @@ -2085,16 +2150,16 @@ NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_DCL0) NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_ARG); /* restore user-defined colors, if any */ - if (SP_PARM->_color_defs < 0) { + 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) { - NCURSES_SP_NAME(init_color) (NCURSES_SP_ARGx - (short) n, - SP_PARM->_color_table[n].r, - SP_PARM->_color_table[n].g, - SP_PARM->_color_table[n].b); + _nc_init_color(SP_PARM, + n, + SP_PARM->_color_table[n].r, + SP_PARM->_color_table[n].g, + SP_PARM->_color_table[n].b); } } } diff --git a/ncurses/widechar/charable.c b/ncurses/widechar/charable.c index 91ceb32..55d4890 100644 --- a/ncurses/widechar/charable.c +++ b/ncurses/widechar/charable.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2003-2005,2008 Free Software Foundation, Inc. * + * 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 * @@ -32,7 +33,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: charable.c,v 1.5 2008/07/05 20:51:41 tom Exp $") +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) { @@ -57,6 +58,8 @@ NCURSES_EXPORT(int) _nc_to_char(wint_t ch) result = UChar(temp[0]); else result = -1; +#else +#error expected either wctob/wctomb #endif return result; } @@ -75,6 +78,8 @@ NCURSES_EXPORT(wint_t) _nc_to_widechar(int ch) result = convert; else result = WEOF; +#else +#error expected either btowc/mbtowc #endif return result; } diff --git a/ncurses/widechar/lib_add_wch.c b/ncurses/widechar/lib_add_wch.c index 38d3130..5d6d554 100644 --- a/ncurses/widechar/lib_add_wch.c +++ b/ncurses/widechar/lib_add_wch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2004-2010,2011 Free Software Foundation, Inc. * + * Copyright 2019,2020 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 * @@ -39,7 +40,7 @@ #include <wctype.h> #endif -MODULE_ID("$Id: lib_add_wch.c,v 1.12 2011/03/22 09:31:15 Petr.Pavlu Exp $") +MODULE_ID("$Id: lib_add_wch.c,v 1.16 2020/02/02 23:34:34 tom Exp $") /* clone/adapt lib_addch.c */ static const cchar_t blankchar = NewChar(BLANK_TEXT); @@ -55,7 +56,7 @@ static const cchar_t blankchar = NewChar(BLANK_TEXT); */ /* 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)) +#define COLOR_MASK(ch) (~(attr_t)(((ch) & A_COLOR) ? A_COLOR : 0)) static NCURSES_INLINE cchar_t render_char(WINDOW *win, cchar_t ch) @@ -114,7 +115,7 @@ render_char(WINDOW *win, cchar_t ch) #endif static bool -newline_forces_scroll(WINDOW *win, NCURSES_SIZE_T * ypos) +newline_forces_scroll(WINDOW *win, NCURSES_SIZE_T *ypos) { bool result = FALSE; @@ -195,7 +196,7 @@ wadd_wch_literal(WINDOW *win, cchar_t ch) * adjustments. */ { - int len = wcwidth(CharOf(ch)); + int len = _nc_wacs_width(CharOf(ch)); int i; int j; wchar_t *chars; diff --git a/ncurses/widechar/lib_box_set.c b/ncurses/widechar/lib_box_set.c index f9e701f..ef2e1a7 100644 --- a/ncurses/widechar/lib_box_set.c +++ b/ncurses/widechar/lib_box_set.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2009,2011 Free Software Foundation, Inc. * + * 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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_box_set.c,v 1.6 2011/06/25 19:02:07 Vassili.Courzakis Exp $") +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, diff --git a/ncurses/widechar/lib_cchar.c b/ncurses/widechar/lib_cchar.c index 654bebb..ed1d236 100644 --- a/ncurses/widechar/lib_cchar.c +++ b/ncurses/widechar/lib_cchar.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2001-2012,2014 Free Software Foundation, Inc. * + * Copyright 2019,2020 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 * @@ -35,7 +36,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_cchar.c,v 1.27 2014/02/01 22:10:42 tom Exp $") +MODULE_ID("$Id: lib_cchar.c,v 1.33 2020/02/02 23:34:34 tom Exp $") /* * The SuSv2 description leaves some room for interpretation. We'll assume wch @@ -47,22 +48,25 @@ NCURSES_EXPORT(int) setcchar(cchar_t *wcval, const wchar_t *wch, const attr_t attrs, - NCURSES_PAIRS_T color_pair, + NCURSES_PAIRS_T pair_arg, const void *opts) { - unsigned i; - unsigned len; int code = OK; + int color_pair = pair_arg; + unsigned len; TR(TRACE_CCALLS, (T_CALLED("setcchar(%p,%s,%lu,%d,%p)"), (void *) wcval, _nc_viswbuf(wch), - (unsigned long) attrs, (int) color_pair, opts)); + (unsigned long) attrs, color_pair, opts)); - if (opts != NULL - || wch == NULL - || ((len = (unsigned) wcslen(wch)) > 1 && wcwidth(wch[0]) < 0)) { + 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; @@ -71,7 +75,7 @@ setcchar(cchar_t *wcval, * are only interested in adding non-spacing characters. */ for (i = 1; i < len; ++i) { - if (wcwidth(wch[i]) != 0) { + if (_nc_wacs_width(wch[i]) != 0) { len = i; break; } @@ -96,21 +100,23 @@ NCURSES_EXPORT(int) getcchar(const cchar_t *wcval, wchar_t *wch, attr_t *attrs, - NCURSES_PAIRS_T *color_pair, + NCURSES_PAIRS_T *pair_arg, void *opts) { - wchar_t *wp; - int len; int code = ERR; + int color_pair; TR(TRACE_CCALLS, (T_CALLED("getcchar(%p,%p,%p,%p,%p)"), (const void *) wcval, (void *) wch, (void *) attrs, - (void *) color_pair, + (void *) pair_arg, opts)); if (opts == NULL && wcval != NULL) { + wchar_t *wp; + int len; + len = ((wp = wmemchr(wcval->chars, L'\0', (size_t) CCHARW_MAX)) ? (int) (wp - wcval->chars) : CCHARW_MAX); @@ -121,14 +127,17 @@ getcchar(const cchar_t *wcval, * 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 || color_pair == 0) { + } else if (attrs == 0 || pair_arg == 0) { code = ERR; } else if (len >= 0) { *attrs = AttrOf(*wcval) & A_ATTRIBUTES; - *color_pair = (NCURSES_PAIRS_T) GetPair(*wcval); + 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'; - code = OK; + if (*pair_arg >= 0) + code = OK; } } diff --git a/ncurses/widechar/lib_erasewchar.c b/ncurses/widechar/lib_erasewchar.c index ddce27a..f49d641 100644 --- a/ncurses/widechar/lib_erasewchar.c +++ b/ncurses/widechar/lib_erasewchar.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2010,2014 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -32,7 +33,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_erasewchar.c,v 1.3 2014/02/23 01:21:08 tom Exp $") +MODULE_ID("$Id: lib_erasewchar.c,v 1.4 2020/02/02 23:34:34 tom Exp $") /* * erasewchar() diff --git a/ncurses/widechar/lib_get_wch.c b/ncurses/widechar/lib_get_wch.c index 71d5603..2bd4918 100644 --- a/ncurses/widechar/lib_get_wch.c +++ b/ncurses/widechar/lib_get_wch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2010,2011 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -40,16 +41,13 @@ #include <curses.priv.h> #include <ctype.h> -MODULE_ID("$Id: lib_get_wch.c,v 1.23 2011/05/28 23:00:29 tom Exp $") +MODULE_ID("$Id: lib_get_wch.c,v 1.25 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) wget_wch(WINDOW *win, wint_t *result) { SCREEN *sp; int code; - char buffer[(MB_LEN_MAX * 9) + 1]; /* allow some redundant shifts */ - int status; - size_t count = 0; int value = 0; wchar_t wch; #ifndef state_unused @@ -64,8 +62,13 @@ wget_wch(WINDOW *win, wint_t *result) */ _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)); @@ -89,6 +92,8 @@ wget_wch(WINDOW *win, wint_t *result) code = ERR; break; } else { + int status; + buffer[count++] = (char) UChar(value); reset_mbytes(state); status = count_mbytes(buffer, count, state); diff --git a/ncurses/widechar/lib_get_wstr.c b/ncurses/widechar/lib_get_wstr.c index 27cdae0..695b526 100644 --- a/ncurses/widechar/lib_get_wstr.c +++ b/ncurses/widechar/lib_get_wstr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2009,2011 Free Software Foundation, Inc. * + * Copyright 2018,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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_get_wstr.c,v 1.13 2011/10/22 16:31:35 tom Exp $") +MODULE_ID("$Id: lib_get_wstr.c,v 1.16 2020/02/02 23:34:34 tom Exp $") static int wadd_wint(WINDOW *win, wint_t *src) @@ -100,6 +101,8 @@ wgetn_wstr(WINDOW *win, wint_t *str, int maxlen) if (!win) returnCode(ERR); + maxlen = _nc_getstr_limit(maxlen); + _nc_get_tty_mode(&buf); oldnl = sp->_nl; @@ -164,7 +167,7 @@ wgetn_wstr(WINDOW *win, wint_t *str, int maxlen) } else { beep(); } - } else if (maxlen >= 0 && tmpstr - oldstr >= maxlen) { + } else if (tmpstr - oldstr >= maxlen) { beep(); } else { *tmpstr++ = ch; diff --git a/ncurses/widechar/lib_hline_set.c b/ncurses/widechar/lib_hline_set.c index da92b83..8d5e026 100644 --- a/ncurses/widechar/lib_hline_set.c +++ b/ncurses/widechar/lib_hline_set.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -39,23 +40,21 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_hline_set.c,v 1.4 2010/12/19 01:45:03 tom Exp $") +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; - int start; - int end; 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; - start = win->_curx; - end = start + n - 1; if (end > win->_maxx) end = win->_maxx; diff --git a/ncurses/widechar/lib_in_wch.c b/ncurses/widechar/lib_in_wch.c index b239650..1d27332 100644 --- a/ncurses/widechar/lib_in_wch.c +++ b/ncurses/widechar/lib_in_wch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2006,2009 Free Software Foundation, Inc. * + * 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 * @@ -39,17 +40,19 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_in_wch.c,v 1.5 2009/10/24 22:37:55 tom Exp $") +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 row, col; 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]; diff --git a/ncurses/widechar/lib_in_wchnstr.c b/ncurses/widechar/lib_in_wchnstr.c index 57cc2ca..40a2bb6 100644 --- a/ncurses/widechar/lib_in_wchnstr.c +++ b/ncurses/widechar/lib_in_wchnstr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2007,2009 Free Software Foundation, Inc. * + * 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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_in_wchnstr.c,v 1.8 2009/10/24 22:37:48 tom Exp $") +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) diff --git a/ncurses/widechar/lib_ins_wch.c b/ncurses/widechar/lib_ins_wch.c index 2aa71a5..a744f5b 100644 --- a/ncurses/widechar/lib_ins_wch.c +++ b/ncurses/widechar/lib_ins_wch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2010,2011 Free Software Foundation, Inc. * + * Copyright 2019,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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_ins_wch.c,v 1.17 2011/10/22 16:34:50 tom Exp $") +MODULE_ID("$Id: lib_ins_wch.c,v 1.24 2020/02/02 23:34:34 tom Exp $") /* * Insert the given character, updating the current location to simplify @@ -48,8 +49,7 @@ MODULE_ID("$Id: lib_ins_wch.c,v 1.17 2011/10/22 16:34:50 tom Exp $") NCURSES_EXPORT(int) _nc_insert_wch(WINDOW *win, const cchar_t *wch) { - int cells = wcwidth(CharOf(CHDEREF(wch))); - int cell; + int cells = _nc_wacs_width(CharOf(CHDEREF(wch))); int code = OK; if (cells < 0) { @@ -59,6 +59,7 @@ _nc_insert_wch(WINDOW *win, const cchar_t *wch) 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]); @@ -73,7 +74,7 @@ _nc_insert_wch(WINDOW *win, const cchar_t *wch) SetWidecExt(temp1[cell], cell); } - win->_curx++; + win->_curx = (NCURSES_SIZE_T) (win->_curx + cells); } } return code; @@ -82,15 +83,13 @@ _nc_insert_wch(WINDOW *win, const cchar_t *wch) NCURSES_EXPORT(int) wins_wch(WINDOW *win, const cchar_t *wch) { - NCURSES_SIZE_T oy; - NCURSES_SIZE_T ox; int code = ERR; T((T_CALLED("wins_wch(%p, %s)"), (void *) win, _tracecchar_t(wch))); if (win != 0) { - oy = win->_cury; - ox = win->_curx; + NCURSES_SIZE_T oy = win->_cury; + NCURSES_SIZE_T ox = win->_curx; code = _nc_insert_wch(win, wch); @@ -105,9 +104,6 @@ NCURSES_EXPORT(int) wins_nwstr(WINDOW *win, const wchar_t *wstr, int n) { int code = ERR; - NCURSES_SIZE_T oy; - NCURSES_SIZE_T ox; - const wchar_t *cp; T((T_CALLED("wins_nwstr(%p,%s,%d)"), (void *) win, _nc_viswbufn(wstr, n), n)); @@ -117,13 +113,15 @@ wins_nwstr(WINDOW *win, const wchar_t *wstr, int n) if (n < 1) n = (int) wcslen(wstr); 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; - oy = win->_cury; - ox = win->_curx; - for (cp = wstr; *cp && ((cp - wstr) < n); cp++) { - int len = wcwidth(*cp); + for (cp = wstr; ((cp - wstr) < n) && *cp; cp++) { + int len = _nc_wacs_width(*cp); if ((len >= 0 && len != 1) || !is7bits(*cp)) { cchar_t tmp_cchar; diff --git a/ncurses/widechar/lib_inwstr.c b/ncurses/widechar/lib_inwstr.c index a4f5b8e..b2fdaea 100644 --- a/ncurses/widechar/lib_inwstr.c +++ b/ncurses/widechar/lib_inwstr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2009,2011 Free Software Foundation, Inc. * + * 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 * @@ -39,31 +40,39 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_inwstr.c,v 1.6 2011/05/28 22:49:49 tom Exp $") +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 row, col, inx; int count = 0; - int last = 0; cchar_t *text; - wchar_t wch; 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 && count != ERR) { + 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) { - if ((count = last) == 0) { + done = TRUE; + if (last == 0) { count = ERR; /* error if we store nothing */ + } else { + count = last; /* only store complete chars */ } break; } diff --git a/ncurses/widechar/lib_key_name.c b/ncurses/widechar/lib_key_name.c index da65f21..8acfe7a 100644 --- a/ncurses/widechar/lib_key_name.c +++ b/ncurses/widechar/lib_key_name.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2007 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -35,7 +36,9 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_key_name.c,v 1.3 2008/10/11 20:15:14 tom Exp $") +MODULE_ID("$Id: lib_key_name.c,v 1.5 2020/02/02 23:34:34 tom Exp $") + +#define MyData _nc_globals.key_name NCURSES_EXPORT(NCURSES_CONST char *) key_name(wchar_t c) @@ -44,19 +47,16 @@ key_name(wchar_t c) wchar_t *my_wchars; size_t len; - /* FIXME: move to _nc_globals */ - static char result[MB_LEN_MAX + 1]; - memset(&my_cchar, 0, sizeof(my_cchar)); my_cchar.chars[0] = c; my_cchar.chars[1] = L'\0'; my_wchars = wunctrl(&my_cchar); - len = wcstombs(result, my_wchars, sizeof(result) - 1); + len = wcstombs(MyData, my_wchars, sizeof(MyData) - 1); if (isEILSEQ(len) || (len == 0)) { return 0; } - result[len] = '\0'; - return result; + MyData[len] = '\0'; + return MyData; } diff --git a/ncurses/widechar/lib_pecho_wchar.c b/ncurses/widechar/lib_pecho_wchar.c index b6da7a8..82b49b6 100644 --- a/ncurses/widechar/lib_pecho_wchar.c +++ b/ncurses/widechar/lib_pecho_wchar.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2004,2009 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -32,7 +33,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_pecho_wchar.c,v 1.2 2009/10/24 22:43:32 tom Exp $") +MODULE_ID("$Id: lib_pecho_wchar.c,v 1.3 2020/02/02 23:34:34 tom Exp $") NCURSES_EXPORT(int) pecho_wchar(WINDOW *pad, const cchar_t *wch) diff --git a/ncurses/widechar/lib_slk_wset.c b/ncurses/widechar/lib_slk_wset.c index 8927556..5aa75ff 100644 --- a/ncurses/widechar/lib_slk_wset.c +++ b/ncurses/widechar/lib_slk_wset.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2003-2002,2011 Free Software Foundation, Inc. * + * 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 * @@ -40,23 +41,26 @@ #include <wctype.h> #endif -MODULE_ID("$Id: lib_slk_wset.c,v 1.13 2011/10/22 15:52:20 tom Exp $") +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; - size_t arglen; const wchar_t *str; - char *mystr; 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) { diff --git a/ncurses/widechar/lib_unget_wch.c b/ncurses/widechar/lib_unget_wch.c index d5ae608..4ea26b6 100644 --- a/ncurses/widechar/lib_unget_wch.c +++ b/ncurses/widechar/lib_unget_wch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2010,2011 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -39,7 +40,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_unget_wch.c,v 1.15 2011/10/22 16:34:50 tom Exp $") +MODULE_ID("$Id: lib_unget_wch.c,v 1.17 2020/02/02 23:34:34 tom Exp $") /* * Wrapper for wcrtomb() which obtains the length needed for the given @@ -70,7 +71,6 @@ NCURSES_SP_NAME(unget_wch) (NCURSES_SP_DCLx const wchar_t wch) int result = OK; mbstate_t state; size_t length; - int n; T((T_CALLED("unget_wch(%p, %#lx)"), (void *) SP_PARM, (unsigned long) wch)); @@ -82,6 +82,8 @@ NCURSES_SP_NAME(unget_wch) (NCURSES_SP_DCLx const wchar_t wch) 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)); diff --git a/ncurses/widechar/lib_vid_attr.c b/ncurses/widechar/lib_vid_attr.c index 80c1ea4..e167beb 100644 --- a/ncurses/widechar/lib_vid_attr.c +++ b/ncurses/widechar/lib_vid_attr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 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 * @@ -36,27 +37,34 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_vid_attr.c,v 1.23 2014/06/07 22:13:46 tom Exp $") +MODULE_ID("$Id: lib_vid_attr.c,v 1.28 2020/02/02 23:34: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) { doPut(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) { doPut(mode); turn_off &= ~mask; } + 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, pair)); \ - if ((pair != old_pair) \ - || (fix_pair0 && (pair == 0)) \ + 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, pair, \ + old_pair, color_pair, \ reverse, outc); \ } \ } @@ -68,10 +76,11 @@ MODULE_ID("$Id: lib_vid_attr.c,v 1.23 2014/06/07 22:13:46 tom Exp $") NCURSES_EXPORT(int) NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx attr_t newmode, - NCURSES_PAIRS_T pair, - void *opts GCC_UNUSED, + 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; @@ -85,8 +94,12 @@ NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx #define fix_pair0 FALSE #endif + if (!IsValidTIScreen(SP_PARM)) + returnCode(ERR); + newmode &= A_ATTRIBUTES; - T((T_CALLED("vid_puts(%s,%d)"), _traceattr(newmode), pair)); + 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) { @@ -107,7 +120,7 @@ NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx * If we have a terminal that cannot combine color with video * attributes, use the colors in preference. */ - if ((pair != 0 + if ((color_pair != 0 || fix_pair0) && (no_color_video > 0)) { /* @@ -136,7 +149,7 @@ NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx } if (newmode == previous_attr - && pair == previous_pair) + && color_pair == previous_pair) returnCode(OK); if (reverse) { @@ -146,7 +159,7 @@ NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx turn_off = (~newmode & previous_attr) & ALL_BUT_COLOR; turn_on = (newmode & ~(previous_attr & TPARM_ATTR)) & ALL_BUT_COLOR; - SetColorsIf(((pair == 0) && !fix_pair0), previous_attr, previous_pair); + SetColorsIf(((color_pair == 0) && !fix_pair0), previous_attr, previous_pair); if (newmode == A_NORMAL) { if ((previous_attr & A_ALTCHARSET) && exit_alt_charset_mode) { @@ -173,7 +186,7 @@ NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx previous_pair = 0; } - SetColorsIf((pair != 0) || fix_pair0, previous_attr, previous_pair); + SetColorsIf((color_pair != 0) || fix_pair0, previous_attr, previous_pair); } else if (set_attributes) { if (turn_on || turn_off) { TPUTS_TRACE("set_attributes"); @@ -201,7 +214,7 @@ NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx } } #endif - SetColorsIf((pair != 0) || fix_pair0, previous_attr, previous_pair); + SetColorsIf((color_pair != 0) || fix_pair0, previous_attr, previous_pair); } else { TR(TRACE_ATTRS, ("turning %s off", _traceattr(turn_off))); @@ -226,7 +239,7 @@ NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx previous_attr &= ALL_BUT_COLOR; previous_pair = 0; } - SetColorsIf((pair != 0) || fix_pair0, previous_attr, previous_pair); + SetColorsIf((color_pair != 0) || fix_pair0, previous_attr, previous_pair); TR(TRACE_ATTRS, ("turning %s on", _traceattr(turn_on))); /* *INDENT-OFF* */ @@ -242,7 +255,7 @@ NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx #if USE_ITALIC TurnOn(A_ITALIC, enter_italics_mode); #endif -#if USE_WIDEC_SUPPORT +#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); @@ -259,16 +272,17 @@ NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx if (SP_PARM) { SetAttr(SCREEN_ATTRS(SP_PARM), newmode); - SetPair(SCREEN_ATTRS(SP_PARM), pair); + SetPair(SCREEN_ATTRS(SP_PARM), color_pair); } else { previous_attr = newmode; - previous_pair = pair; + previous_pair = color_pair; } returnCode(OK); #else - T((T_CALLED("vid_puts(%s,%d)"), _traceattr(newmode), (int) pair)); - set_color(newmode, pair); + 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 } @@ -276,14 +290,14 @@ NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) vid_puts(attr_t newmode, - NCURSES_PAIRS_T pair, + NCURSES_PAIRS_T pair_arg, void *opts GCC_UNUSED, NCURSES_OUTC outc) { SetSafeOutcWrapper(outc); return NCURSES_SP_NAME(vid_puts) (CURRENT_SCREEN, newmode, - pair, + pair_arg, opts, _nc_outc_wrapper); } @@ -293,22 +307,22 @@ vid_puts(attr_t newmode, NCURSES_EXPORT(int) NCURSES_SP_NAME(vid_attr) (NCURSES_SP_DCLx attr_t newmode, - NCURSES_PAIRS_T pair, + NCURSES_PAIRS_T pair_arg, void *opts) { - T((T_CALLED("vid_attr(%s,%d)"), _traceattr(newmode), (int) pair)); + T((T_CALLED("vid_attr(%s,%d)"), _traceattr(newmode), (int) pair_arg)); returnCode(NCURSES_SP_NAME(vid_puts) (NCURSES_SP_ARGx newmode, - pair, + pair_arg, opts, NCURSES_SP_NAME(_nc_putchar))); } #if NCURSES_SP_FUNCS NCURSES_EXPORT(int) -vid_attr(attr_t newmode, NCURSES_PAIRS_T pair, void *opts) +vid_attr(attr_t newmode, NCURSES_PAIRS_T pair_arg, void *opts) { - return NCURSES_SP_NAME(vid_attr) (CURRENT_SCREEN, newmode, pair, opts); + return NCURSES_SP_NAME(vid_attr) (CURRENT_SCREEN, newmode, pair_arg, opts); } #endif @@ -325,6 +339,7 @@ NCURSES_SP_NAME(term_attrs) (NCURSES_SP_DCL0) 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; @@ -338,6 +353,7 @@ NCURSES_SP_NAME(term_attrs) (NCURSES_SP_DCL0) attrs |= WA_TOP; if (enter_vertical_hl_mode) attrs |= WA_VERTICAL; +#endif } returnAttr(attrs); diff --git a/ncurses/widechar/lib_vline_set.c b/ncurses/widechar/lib_vline_set.c index 917caac..f7bb581 100644 --- a/ncurses/widechar/lib_vline_set.c +++ b/ncurses/widechar/lib_vline_set.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2009,2010 Free Software Foundation, Inc. * + * 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 * @@ -39,22 +40,21 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_vline_set.c,v 1.4 2010/12/19 01:50:50 tom Exp $") +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; - int row, col; - int end; T((T_CALLED("wvline(%p,%s,%d)"), (void *) win, _tracecchar_t(ch), n)); if (win) { NCURSES_CH_T wch; - row = win->_cury; - col = win->_curx; - end = row + n - 1; + int row = win->_cury; + int col = win->_curx; + int end = row + n - 1; + if (end > win->_maxy) end = win->_maxy; diff --git a/ncurses/widechar/lib_wacs.c b/ncurses/widechar/lib_wacs.c index dc3af21..5b6f6da 100644 --- a/ncurses/widechar/lib_wacs.c +++ b/ncurses/widechar/lib_wacs.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2002-2013,2014 Free Software Foundation, Inc. * + * 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 * @@ -32,7 +33,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_wacs.c,v 1.14 2014/02/23 01:21:08 tom Exp $") +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; @@ -106,7 +107,6 @@ _nc_init_wacs(void) }; /* *INDENT-ON* */ - unsigned n, m; int active = _nc_unicode_locale(); /* @@ -120,9 +120,15 @@ _nc_init_wacs(void) 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)) { @@ -133,9 +139,9 @@ _nc_init_wacs(void) SetChar(_nc_wacs[m], table[n].value[0], A_NORMAL); } - T(("#%d, SetChar(%c, %#04x) = %s", - n, m, - table[n].value[active], + T(("#%d, width:%d SetChar(%c, %s) = %s", + n, wide, m, + _tracechar(table[n].value[active]), _tracecchar_t(&_nc_wacs[m]))); } } diff --git a/ncurses/widechar/lib_wunctrl.c b/ncurses/widechar/lib_wunctrl.c index 45d4952..155da22 100644 --- a/ncurses/widechar/lib_wunctrl.c +++ b/ncurses/widechar/lib_wunctrl.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2001-2011,2012 Free Software Foundation, Inc. * + * 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 * @@ -35,7 +36,7 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_wunctrl.c,v 1.16 2012/12/15 20:53:42 tom Exp $") +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) diff --git a/ncurses/widechar/widechars.c b/ncurses/widechar/widechars.c index 6951e28..3577479 100644 --- a/ncurses/widechar/widechars.c +++ b/ncurses/widechar/widechars.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2012,2013 Free Software Foundation, Inc. * + * 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 * @@ -30,9 +31,9 @@ #if USE_WIDEC_SUPPORT -MODULE_ID("$Id: widechars.c,v 1.5 2013/03/02 18:55:51 tom Exp $") +MODULE_ID("$Id: widechars.c,v 1.7 2020/02/02 23:34:34 tom Exp $") -#if defined(__MINGW32__) +#if defined(_WIN32) /* * MinGW has wide-character functions, but they do not work correctly. */ @@ -147,6 +148,6 @@ _nc_wctomb(char *s, wchar_t wc) return result; } -#endif /* __MINGW32__ */ +#endif /* _WIN32 */ #endif /* USE_WIDEC_SUPPORT */ diff --git a/ncurses/win32con/gettimeofday.c b/ncurses/win32con/gettimeofday.c index 867041f..8fad9a6 100644 --- a/ncurses/win32con/gettimeofday.c +++ b/ncurses/win32con/gettimeofday.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2008-2010,2014 Free Software Foundation, Inc. * + * Copyright 2020 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 * @@ -35,7 +36,7 @@ #include <windows.h> -MODULE_ID("$Id: gettimeofday.c,v 1.3 2014/04/26 19:41:34 juergen Exp $") +MODULE_ID("$Id: gettimeofday.c,v 1.4 2020/02/02 23:34:34 tom Exp $") #define JAN1970 116444736000000000LL /* the value for 01/01/1970 00:00 */ diff --git a/ncurses/win32con/wcwidth.c b/ncurses/win32con/wcwidth.c index cdef64a..17ebaa6 100644 --- a/ncurses/win32con/wcwidth.c +++ b/ncurses/win32con/wcwidth.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2010 Free Software Foundation, Inc. * + * 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 * @@ -27,7 +28,7 @@ ****************************************************************************/ #include <curses.priv.h> -MODULE_ID("$Id: wcwidth.c,v 1.2 2010/08/07 20:52:43 tom Exp $") +MODULE_ID("$Id: wcwidth.c,v 1.3 2020/02/02 23:34:34 tom Exp $") #if USE_WIDEC_SUPPORT #define mk_wcwidth(ucs) _nc_wcwidth(ucs) diff --git a/ncurses/win32con/win_driver.c b/ncurses/win32con/win_driver.c index 7478ace..280aa6d 100644 --- a/ncurses/win32con/win_driver.c +++ b/ncurses/win32con/win_driver.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2014,2015 Free Software Foundation, Inc. * + * Copyright 2018,2020 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 * @@ -40,7 +41,7 @@ #include <curses.priv.h> -#ifdef __MINGW32__ +#ifdef _WIN32 #include <tchar.h> #else #include <windows.h> @@ -52,9 +53,9 @@ #define PSAPI_VERSION 2 #include <psapi.h> -#define CUR my_term.type. +#define CUR TerminalType(my_term). -MODULE_ID("$Id: win_driver.c,v 1.54 2015/01/10 23:13:24 tom Exp $") +MODULE_ID("$Id: win_driver.c,v 1.63 2020/02/02 23:34:34 tom Exp $") #ifndef __GNUC__ # error We need GCC to compile for MinGW @@ -66,7 +67,8 @@ MODULE_ID("$Id: win_driver.c,v 1.54 2015/01/10 23:13:24 tom Exp $") #define array_length(a) (sizeof(a)/sizeof(a[0])) -#define okConsoleHandle(TCB) (TCB != 0 && CON.hdl != INVALID_HANDLE_VALUE) +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 @@ -480,11 +482,9 @@ wcon_doupdate(TERMINAL_CONTROL_BLOCK * TCB) int y, nonempty, n, x0, x1, Width, Height; SCREEN *sp; - AssertTCB(); - SetSP(); - T((T_CALLED("win32con::wcon_doupdate(%p)"), TCB)); if (okConsoleHandle(TCB)) { + SetSP(); Width = screen_columns(sp); Height = screen_lines(sp); @@ -495,7 +495,7 @@ wcon_doupdate(TERMINAL_CONTROL_BLOCK * TCB) CurScreen(sp)->_clear, NewScreen(sp)->_clear)); - if (SP_PARM->_endwin) { + if (SP_PARM->_endwin == ewSuspend) { T(("coming back from shell mode")); NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG); @@ -504,7 +504,7 @@ wcon_doupdate(TERMINAL_CONTROL_BLOCK * TCB) NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG); SP_PARM->_mouse_resume(SP_PARM); - SP_PARM->_endwin = FALSE; + SP_PARM->_endwin = ewRunning; } if ((CurScreen(sp)->_clear || NewScreen(sp)->_clear)) { @@ -649,8 +649,11 @@ wcon_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, * This is intentional, to avoid unnecessary breakage of applications * using <term.h> symbols. */ - if (code && (TCB->term.type.Booleans == 0)) { - _nc_init_termtype(&(TCB->term.type)); + 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) { @@ -665,7 +668,7 @@ wcon_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, int beepFlag) { SCREEN *sp; - int res = OK; + 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); @@ -678,40 +681,40 @@ wcon_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, SMALL_RECT this_region; COORD bufferCoord; - AssertTCB(); - - 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; + 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)) { - bufferCoord.X = this_region.Left; - bufferCoord.Y = this_region.Top; + memcpy(that_screen, this_screen, sizeof(that_screen)); - if (!beepFlag && - read_screen(CON.hdl, - this_screen, - this_size, - bufferCoord, - &this_region)) { + for (i = 0; i < max_cells; i++) { + that_screen[i].Attributes = RevAttr(that_screen[i].Attributes); + } - memcpy(that_screen, this_screen, sizeof(that_screen)); + write_screen(CON.hdl, that_screen, this_size, bufferCoord, &this_region); + Sleep(200); + write_screen(CON.hdl, this_screen, this_size, bufferCoord, &this_region); - for (i = 0; i < max_cells; i++) { - that_screen[i].Attributes = RevAttr(that_screen[i].Attributes); + } else { + MessageBeep(MB_ICONWARNING); /* MB_OK might be better */ } - - 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; } @@ -783,8 +786,6 @@ wcon_setcolor(TERMINAL_CONTROL_BLOCK * TCB, int color, int (*outc) (SCREEN *, int) GCC_UNUSED) { - AssertTCB(); - if (okConsoleHandle(TCB)) { WORD a = MapColor(fore, color); a |= (WORD) ((CON.SBI.wAttributes) & (fore ? 0xfff8 : 0xff8f)); @@ -798,7 +799,6 @@ wcon_rescol(TERMINAL_CONTROL_BLOCK * TCB) { bool res = FALSE; - AssertTCB(); if (okConsoleHandle(TCB)) { WORD a = FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN; SetConsoleTextAttribute(CON.hdl, a); @@ -825,8 +825,6 @@ wcon_size(TERMINAL_CONTROL_BLOCK * TCB, int *Lines, int *Cols) { int result = ERR; - AssertTCB(); - T((T_CALLED("win32con::wcon_size(%p)"), TCB)); if (okConsoleHandle(TCB) && @@ -861,65 +859,65 @@ wcon_sgmode(TERMINAL_CONTROL_BLOCK * TCB, int setFlag, TTY * buf) DWORD dwFlag = 0; tcflag_t iflag; tcflag_t lflag; + int result = ERR; - AssertTCB(); - - if (TCB == 0 || buf == NULL) - return ERR; + if (buf != NULL && okConsoleHandle(TCB)) { - if (setFlag) { - iflag = buf->c_iflag; - lflag = buf->c_lflag; + if (setFlag) { + iflag = buf->c_iflag; + lflag = buf->c_lflag; - GetConsoleMode(CON.inp, &dwFlag); + GetConsoleMode(CON.inp, &dwFlag); - if (lflag & ICANON) - dwFlag |= ENABLE_LINE_INPUT; - else - dwFlag &= (DWORD) (~ENABLE_LINE_INPUT); + 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 (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); + if (iflag & BRKINT) + dwFlag |= ENABLE_PROCESSED_INPUT; + else + dwFlag &= (DWORD) (~ENABLE_PROCESSED_INPUT); - dwFlag |= ENABLE_MOUSE_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); + 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_LINE_INPUT) + lflag |= ICANON; + else + lflag &= (tcflag_t) (~ICANON); - if (dwFlag & ENABLE_ECHO_INPUT) - lflag |= ECHO; - else - lflag &= (tcflag_t) (~ECHO); + if (dwFlag & ENABLE_ECHO_INPUT) + lflag |= ECHO; + else + lflag &= (tcflag_t) (~ECHO); - if (dwFlag & ENABLE_PROCESSED_INPUT) - iflag |= BRKINT; - else - iflag &= (tcflag_t) (~BRKINT); + if (dwFlag & ENABLE_PROCESSED_INPUT) + iflag |= BRKINT; + else + iflag &= (tcflag_t) (~BRKINT); - TCB->term.Nttyb.c_iflag = iflag; - TCB->term.Nttyb.c_lflag = lflag; + TCB->term.Nttyb.c_iflag = iflag; + TCB->term.Nttyb.c_lflag = lflag; - *buf = TCB->term.Nttyb; + *buf = TCB->term.Nttyb; + } + result = OK; } - return OK; + return result; } #define MIN_WIDE 80 @@ -1007,56 +1005,59 @@ wcon_mode(TERMINAL_CONTROL_BLOCK * TCB, int progFlag, int defFlag) TERMINAL *_term = (TERMINAL *) TCB; int code = ERR; - AssertTCB(); - 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; + 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; + } } - } else { - /* reset_prog_mode */ - if (wcon_sgmode(TCB, TRUE, &(_term->Nttyb)) == 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) { - if (sp->_keypad_on) - _nc_keypad(sp, TRUE); + _nc_keypad(sp, FALSE); + NCURSES_SP_NAME(_nc_flush) (sp); } + code = wcon_sgmode(TCB, TRUE, &(_term->Ottyb)); if (!CON.buffered) { - set_scrollback(FALSE, &CON.SBI); + set_scrollback(TRUE, &CON.save_SBI); + if (!restore_original_screen()) + code = ERR; } - code = OK; + SetConsoleCursorInfo(CON.hdl, &CON.save_CI); } } - 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); } @@ -1234,7 +1235,7 @@ wcon_init(TERMINAL_CONTROL_BLOCK * TCB) AssertTCB(); if (TCB) { - if (CON.hdl == INVALID_HANDLE_VALUE) { + if (!InitConsole()) { returnVoid; } @@ -1266,12 +1267,13 @@ wcon_initpair(TERMINAL_CONTROL_BLOCK * TCB, { SCREEN *sp; - AssertTCB(); - SetSP(); + 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); + if ((pair > 0) && (pair < NUMPAIRS) && (f >= 0) && (f < 8) + && (b >= 0) && (b < 8)) { + CON.pairs[pair] = MapColor(true, f) | MapColor(false, b); + } } } @@ -1307,29 +1309,33 @@ wcon_initmouse(TERMINAL_CONTROL_BLOCK * TCB) { SCREEN *sp; - AssertTCB(); - SetSP(); + if (okConsoleHandle(TCB)) { + SetSP(); - sp->_mouse_type = M_TERM_DRIVER; + sp->_mouse_type = M_TERM_DRIVER; + } } static int -wcon_testmouse(TERMINAL_CONTROL_BLOCK * TCB, int delay) +wcon_testmouse(TERMINAL_CONTROL_BLOCK * TCB, + int delay + EVENTLIST_2nd(_nc_eventlist * evl)) { int rc = 0; SCREEN *sp; - AssertTCB(); - SetSP(); + 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)); + 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; @@ -1426,13 +1432,14 @@ wcon_initacs(TERMINAL_CONTROL_BLOCK * TCB, unsigned n; SCREEN *sp; - AssertTCB(); - SetSP(); + 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; + 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; + } } } @@ -1524,6 +1531,10 @@ console_twait( 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); @@ -1622,16 +1633,17 @@ wcon_twait(TERMINAL_CONTROL_BLOCK * TCB, EVENTLIST_2nd(_nc_eventlist * evl)) { SCREEN *sp; - int code; + int code = 0; - AssertTCB(); - SetSP(); + if (okConsoleHandle(TCB)) { + SetSP(); - code = console_twait(sp, - CON.inp, - mode, - milliseconds, - timeleft EVENTLIST_2nd(_nc_eventlist * evl)); + code = console_twait(sp, + CON.inp, + mode, + milliseconds, + timeleft EVENTLIST_2nd(evl)); + } return code; } @@ -1682,14 +1694,16 @@ static int wcon_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf) { SCREEN *sp; - int n; + int n = -1; + + T((T_CALLED("win32con::wcon_read(%p)"), TCB)); - AssertTCB(); assert(buf); - SetSP(); + if (okConsoleHandle(TCB)) { + SetSP(); - T((T_CALLED("win32con::wcon_read(%p)"), TCB)); - n = _nc_mingw_console_read(sp, CON.inp, buf); + n = _nc_mingw_console_read(sp, CON.inp, buf); + } returnCode(n); } @@ -1705,19 +1719,22 @@ static int wcon_cursorSet(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int mode) { int res = -1; - CONSOLE_CURSOR_INFO this_CI = CON.save_CI; + T((T_CALLED("win32con:wcon_cursorSet(%d)"), mode)); - switch (mode) { - case 0: - this_CI.bVisible = FALSE; - break; - case 1: - break; - case 2: - this_CI.dwSize = 100; - break; + 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); } - SetConsoleCursorInfo(CON.hdl, &this_CI); returnCode(res); } @@ -1750,12 +1767,14 @@ wcon_kpad(TERMINAL_CONTROL_BLOCK * TCB, int flag GCC_UNUSED) SCREEN *sp; int code = ERR; - AssertTCB(); - SetSP(); - T((T_CALLED("win32con::wcon_kpad(%p, %d)"), TCB, flag)); - if (sp) { - code = OK; + + if (okConsoleHandle(TCB)) { + SetSP(); + + if (sp) { + code = OK; + } } returnCode(code); } @@ -1774,22 +1793,23 @@ wcon_keyok(TERMINAL_CONTROL_BLOCK * TCB, T((T_CALLED("win32con::wcon_keyok(%p, %d, %d)"), TCB, keycode, flag)); - AssertTCB(); - 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); + 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); @@ -1954,7 +1974,7 @@ _nc_mingw_isatty(int fd) /* This is used when running in terminfo mode to discover, whether or not the "terminal" is actually a Windows - Console. It's the responsibilty of the console to deal + Console. It's the responsibility of the console to deal with the terminal escape sequences that are sent by terminfo. */ @@ -2056,7 +2076,8 @@ int _nc_mingw_testmouse( SCREEN *sp, HANDLE fd, - int delay) + int delay + EVENTLIST_2nd(_nc_eventlist * evl)) { int rc = 0; @@ -2081,7 +2102,7 @@ _nc_mingw_console_read( HANDLE fd, int *buf) { - int n = 1; + int rc = -1; INPUT_RECORD inp_rec; BOOL b; DWORD nRead; @@ -2096,6 +2117,9 @@ _nc_mingw_console_read( 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; @@ -2133,13 +2157,13 @@ _nc_mingw_console_read( continue; } } - returnCode(n); + returnCode(rc); } -static -__attribute__((constructor)) - void _enter_console(void) +static bool +InitConsole(void) { + /* initialize once, or not at all */ if (!console_initialized) { int i; DWORD num_buttons; @@ -2226,4 +2250,26 @@ __attribute__((constructor)) 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 |