summaryrefslogtreecommitdiff
path: root/ncurses
diff options
context:
space:
mode:
Diffstat (limited to 'ncurses')
-rw-r--r--ncurses/Makefile.in75
-rw-r--r--ncurses/README5
-rw-r--r--ncurses/README.IZ7
-rw-r--r--ncurses/SigAction.h5
-rw-r--r--ncurses/base/MKkeyname.awk14
-rwxr-xr-xncurses/base/MKlib_gen.sh83
-rw-r--r--ncurses/base/MKunctrl.awk6
-rw-r--r--ncurses/base/README5
-rw-r--r--ncurses/base/define_key.c5
-rw-r--r--ncurses/base/key_defined.c5
-rw-r--r--ncurses/base/keybound.c5
-rw-r--r--ncurses/base/keyok.c6
-rw-r--r--ncurses/base/legacy_coding.c5
-rw-r--r--ncurses/base/lib_addch.c29
-rw-r--r--ncurses/base/lib_addstr.c11
-rw-r--r--ncurses/base/lib_beep.c5
-rw-r--r--ncurses/base/lib_bkgd.c96
-rw-r--r--ncurses/base/lib_box.c15
-rw-r--r--ncurses/base/lib_chgat.c24
-rw-r--r--ncurses/base/lib_clear.c5
-rw-r--r--ncurses/base/lib_clearok.c5
-rw-r--r--ncurses/base/lib_clrbot.c5
-rw-r--r--ncurses/base/lib_clreol.c5
-rw-r--r--ncurses/base/lib_color.c508
-rw-r--r--ncurses/base/lib_colorset.c20
-rw-r--r--ncurses/base/lib_delch.c5
-rw-r--r--ncurses/base/lib_delwin.c5
-rw-r--r--ncurses/base/lib_dft_fgbg.c36
-rw-r--r--ncurses/base/lib_driver.c7
-rw-r--r--ncurses/base/lib_echo.c5
-rw-r--r--ncurses/base/lib_endwin.c9
-rw-r--r--ncurses/base/lib_erase.c13
-rw-r--r--ncurses/base/lib_flash.c5
-rw-r--r--ncurses/base/lib_freeall.c45
-rw-r--r--ncurses/base/lib_getch.c74
-rw-r--r--ncurses/base/lib_getstr.c11
-rw-r--r--ncurses/base/lib_hline.c21
-rw-r--r--ncurses/base/lib_immedok.c5
-rw-r--r--ncurses/base/lib_inchstr.c24
-rw-r--r--ncurses/base/lib_initscr.c26
-rw-r--r--ncurses/base/lib_insch.c14
-rw-r--r--ncurses/base/lib_insdel.c5
-rw-r--r--ncurses/base/lib_insnstr.c51
-rw-r--r--ncurses/base/lib_instr.c38
-rw-r--r--ncurses/base/lib_isendwin.c7
-rw-r--r--ncurses/base/lib_leaveok.c5
-rw-r--r--ncurses/base/lib_mouse.c95
-rw-r--r--ncurses/base/lib_move.c5
-rw-r--r--ncurses/base/lib_mvwin.c5
-rw-r--r--ncurses/base/lib_newterm.c35
-rw-r--r--ncurses/base/lib_newwin.c23
-rw-r--r--ncurses/base/lib_nl.c5
-rw-r--r--ncurses/base/lib_overlay.c36
-rw-r--r--ncurses/base/lib_pad.c11
-rw-r--r--ncurses/base/lib_printw.c45
-rw-r--r--ncurses/base/lib_redrawln.c5
-rw-r--r--ncurses/base/lib_refresh.c5
-rw-r--r--ncurses/base/lib_restart.c7
-rw-r--r--ncurses/base/lib_scanw.c48
-rw-r--r--ncurses/base/lib_screen.c848
-rw-r--r--ncurses/base/lib_scroll.c15
-rw-r--r--ncurses/base/lib_scrollok.c5
-rw-r--r--ncurses/base/lib_scrreg.c5
-rw-r--r--ncurses/base/lib_set_term.c113
-rw-r--r--ncurses/base/lib_slk.c5
-rw-r--r--ncurses/base/lib_slkatr_set.c24
-rw-r--r--ncurses/base/lib_slkatrof.c5
-rw-r--r--ncurses/base/lib_slkatron.c5
-rw-r--r--ncurses/base/lib_slkatrset.c5
-rw-r--r--ncurses/base/lib_slkattr.c5
-rw-r--r--ncurses/base/lib_slkclear.c5
-rw-r--r--ncurses/base/lib_slkcolor.c51
-rw-r--r--ncurses/base/lib_slkinit.c12
-rw-r--r--ncurses/base/lib_slklab.c5
-rw-r--r--ncurses/base/lib_slkrefr.c5
-rw-r--r--ncurses/base/lib_slkset.c9
-rw-r--r--ncurses/base/lib_slktouch.c5
-rw-r--r--ncurses/base/lib_touch.c21
-rw-r--r--ncurses/base/lib_ungetch.c5
-rw-r--r--ncurses/base/lib_vline.c24
-rw-r--r--ncurses/base/lib_wattroff.c5
-rw-r--r--ncurses/base/lib_wattron.c5
-rw-r--r--ncurses/base/lib_winch.c5
-rw-r--r--ncurses/base/lib_window.c12
-rw-r--r--ncurses/base/nc_panel.c5
-rw-r--r--ncurses/base/new_pair.c386
-rw-r--r--ncurses/base/resizeterm.c18
-rw-r--r--ncurses/base/safe_sprintf.c19
-rw-r--r--ncurses/base/sigaction.c5
-rw-r--r--ncurses/base/tries.c5
-rw-r--r--ncurses/base/use_window.c12
-rw-r--r--ncurses/base/version.c5
-rw-r--r--ncurses/base/vsscanf.c5
-rw-r--r--ncurses/base/wresize.c43
-rw-r--r--ncurses/build.priv.h30
-rw-r--r--ncurses/curses.priv.h541
-rw-r--r--ncurses/fifo_defs.h7
-rw-r--r--ncurses/llib-lncurses313
-rw-r--r--ncurses/llib-lncursest384
-rw-r--r--ncurses/llib-lncursestw569
-rw-r--r--ncurses/llib-lncursesw548
-rw-r--r--ncurses/llib-ltic45
-rw-r--r--ncurses/llib-ltict45
-rw-r--r--ncurses/llib-ltictw45
-rw-r--r--ncurses/llib-lticw45
-rw-r--r--ncurses/llib-ltinfo172
-rw-r--r--ncurses/llib-ltinfot193
-rw-r--r--ncurses/llib-ltinfotw216
-rw-r--r--ncurses/llib-ltinfow195
-rw-r--r--ncurses/modules11
-rw-r--r--ncurses/new_pair.h131
-rw-r--r--ncurses/report_hashing.c73
-rw-r--r--ncurses/report_offsets.c229
-rw-r--r--ncurses/tinfo/MKcaptab.awk5
-rwxr-xr-xncurses/tinfo/MKcaptab.sh76
-rw-r--r--ncurses/tinfo/MKcodes.awk7
-rwxr-xr-xncurses/tinfo/MKfallback.sh53
-rwxr-xr-xncurses/tinfo/MKkeys_list.sh17
-rw-r--r--ncurses/tinfo/MKnames.awk7
-rwxr-xr-xncurses/tinfo/MKuserdefs.sh146
-rw-r--r--ncurses/tinfo/README5
-rw-r--r--ncurses/tinfo/access.c13
-rw-r--r--ncurses/tinfo/add_tries.c6
-rw-r--r--ncurses/tinfo/alloc_entry.c47
-rw-r--r--ncurses/tinfo/alloc_ttype.c204
-rw-r--r--ncurses/tinfo/captoinfo.c241
-rw-r--r--ncurses/tinfo/comp_error.c29
-rw-r--r--ncurses/tinfo/comp_expand.c72
-rw-r--r--ncurses/tinfo/comp_hash.c46
-rw-r--r--ncurses/tinfo/comp_parse.c270
-rw-r--r--ncurses/tinfo/comp_scan.c30
-rw-r--r--ncurses/tinfo/db_iterator.c77
-rw-r--r--ncurses/tinfo/doalloc.c5
-rw-r--r--ncurses/tinfo/entries.c68
-rw-r--r--ncurses/tinfo/free_ttype.c34
-rw-r--r--ncurses/tinfo/getenv_num.c7
-rw-r--r--ncurses/tinfo/hashed_db.c7
-rw-r--r--ncurses/tinfo/home_terminfo.c10
-rw-r--r--ncurses/tinfo/init_keytry.c9
-rw-r--r--ncurses/tinfo/lib_acs.c83
-rw-r--r--ncurses/tinfo/lib_baudrate.c82
-rw-r--r--ncurses/tinfo/lib_cur_term.c35
-rw-r--r--ncurses/tinfo/lib_data.c73
-rw-r--r--ncurses/tinfo/lib_has_cap.c5
-rw-r--r--ncurses/tinfo/lib_kernel.c5
-rw-r--r--ncurses/tinfo/lib_longname.c16
-rw-r--r--ncurses/tinfo/lib_napms.c9
-rw-r--r--ncurses/tinfo/lib_options.c11
-rw-r--r--ncurses/tinfo/lib_print.c7
-rw-r--r--ncurses/tinfo/lib_raw.c31
-rw-r--r--ncurses/tinfo/lib_setup.c308
-rw-r--r--ncurses/tinfo/lib_termcap.c68
-rw-r--r--ncurses/tinfo/lib_termname.c5
-rw-r--r--ncurses/tinfo/lib_tgoto.c16
-rw-r--r--ncurses/tinfo/lib_ti.c29
-rw-r--r--ncurses/tinfo/lib_tparm.c66
-rw-r--r--ncurses/tinfo/lib_tputs.c26
-rw-r--r--ncurses/tinfo/lib_ttyflags.c47
-rw-r--r--ncurses/tinfo/make_hash.c257
-rw-r--r--ncurses/tinfo/make_keys.c27
-rw-r--r--ncurses/tinfo/name_match.c14
-rw-r--r--ncurses/tinfo/obsolete.c9
-rw-r--r--ncurses/tinfo/parse_entry.c362
-rw-r--r--ncurses/tinfo/read_entry.c411
-rw-r--r--ncurses/tinfo/read_termcap.c61
-rw-r--r--ncurses/tinfo/strings.c10
-rw-r--r--ncurses/tinfo/tinfo_driver.c194
-rw-r--r--ncurses/tinfo/trim_sgr0.c11
-rw-r--r--ncurses/tinfo/use_screen.c11
-rw-r--r--ncurses/tinfo/write_entry.c264
-rw-r--r--ncurses/trace/README5
-rw-r--r--ncurses/trace/lib_trace.c166
-rw-r--r--ncurses/trace/lib_traceatr.c182
-rw-r--r--ncurses/trace/lib_tracebits.c116
-rw-r--r--ncurses/trace/lib_tracechr.c5
-rw-r--r--ncurses/trace/lib_tracedmp.c9
-rw-r--r--ncurses/trace/lib_tracemse.c5
-rw-r--r--ncurses/trace/trace_buf.c5
-rw-r--r--ncurses/trace/trace_tries.c5
-rw-r--r--ncurses/trace/trace_xnames.c11
-rw-r--r--ncurses/trace/varargs.c5
-rw-r--r--ncurses/trace/visbuf.c36
-rwxr-xr-xncurses/tty/MKexpanded.sh9
-rw-r--r--ncurses/tty/hardscroll.c10
-rw-r--r--ncurses/tty/hashmap.c64
-rw-r--r--ncurses/tty/lib_mvcur.c98
-rw-r--r--ncurses/tty/lib_tstp.c11
-rw-r--r--ncurses/tty/lib_twait.c18
-rw-r--r--ncurses/tty/lib_vidattr.c25
-rw-r--r--ncurses/tty/tty_update.c161
-rw-r--r--ncurses/widechar/charable.c9
-rw-r--r--ncurses/widechar/lib_add_wch.c11
-rw-r--r--ncurses/widechar/lib_box_set.c5
-rw-r--r--ncurses/widechar/lib_cchar.c43
-rw-r--r--ncurses/widechar/lib_erasewchar.c5
-rw-r--r--ncurses/widechar/lib_get_wch.c15
-rw-r--r--ncurses/widechar/lib_get_wstr.c9
-rw-r--r--ncurses/widechar/lib_hline_set.c11
-rw-r--r--ncurses/widechar/lib_in_wch.c9
-rw-r--r--ncurses/widechar/lib_in_wchnstr.c5
-rw-r--r--ncurses/widechar/lib_ins_wch.c30
-rw-r--r--ncurses/widechar/lib_inwstr.c23
-rw-r--r--ncurses/widechar/lib_key_name.c16
-rw-r--r--ncurses/widechar/lib_pecho_wchar.c5
-rw-r--r--ncurses/widechar/lib_slk_wset.c12
-rw-r--r--ncurses/widechar/lib_unget_wch.c8
-rw-r--r--ncurses/widechar/lib_vid_attr.c74
-rw-r--r--ncurses/widechar/lib_vline_set.c14
-rw-r--r--ncurses/widechar/lib_wacs.c18
-rw-r--r--ncurses/widechar/lib_wunctrl.c5
-rw-r--r--ncurses/widechar/widechars.c9
-rw-r--r--ncurses/win32con/gettimeofday.c5
-rw-r--r--ncurses/win32con/wcwidth.c5
-rw-r--r--ncurses/win32con/win_driver.c470
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(&copy, from);
+ from = &copy;
_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