From 135d37072755704b8d018e5de74e62ff3f28c930 Mon Sep 17 00:00:00 2001
From: Thomas E. Dickey <dickey@invisible-island.net>
Date: Sun, 5 Nov 2023 05:54:54 +0530
Subject: [PATCH] Updating reset code - ncurses 6.4 - patch 20231104

+ modify reset command to avoid altering clocal if the terminal uses a
  modem (prompted by discussion with Werner Fink, Michal Suchanek,
  OpenSUSE #1201384, Debian #60377).
+ build-fixes for --with-caps variations.
+ correct a couple of section-references in INSTALL.

Signed-off-by: Thomas E. Dickey <dickey@invisible-island.net>

Upstream-Status: Backport [https://ncurses.scripts.mit.edu/?p=ncurses.git;a=commitdiff;h=135d37072755704b8d018e5de74e62ff3f28c930]

Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com>
---
 INSTALL                   |   8 +-
 include/curses.events     |   2 +-
 ncurses/tinfo/lib_tparm.c |   2 +
 progs/reset_cmd.c         | 281 +++++++++++++++++++++-----------------
 progs/tabs.c              |  10 +-
 progs/tic.c               |   4 +
 6 files changed, 176 insertions(+), 131 deletions(-)

diff --git a/INSTALL b/INSTALL
index d9c1dd12..d0a39af0 100644
--- a/INSTALL
+++ b/INSTALL
@@ -47,7 +47,7 @@ If you are converting from BSD curses and do not have root access, be sure
 to read the BSD CONVERSION NOTES section below.

 If you are trying to build applications using gpm with ncurses,
-read the USING NCURSES WITH GPM section below.
+read the USING GPM section below.

 If you are cross-compiling, see the note below on BUILDING WITH A CROSS-COMPILER.

@@ -79,7 +79,7 @@ INSTALLATION PROCEDURE:
     The --prefix option to configure changes the root directory for installing
     ncurses.  The default is normally in subdirectories of /usr/local, except
     for systems where ncurses is normally installed as a system library (see
-    "IF YOU ARE A SYSTEM INTEGRATOR").  Use --prefix=/usr to replace your
+    "FOR SYSTEM INTEGRATORS").  Use --prefix=/usr to replace your
     default curses distribution.

     The package gets installed beneath the --prefix directory as follows:
@@ -176,7 +176,7 @@ INSTALLATION PROCEDURE:
     You can make curses and terminfo fall back to an existing file of termcap
     definitions by configuring with --enable-termcap.  If you do this, the
     library will search /etc/termcap before the terminfo database, and will
-    also interpret the contents of the TERM environment variable.  See the
+    also interpret the contents of the $TERM environment variable.  See the
     section BSD CONVERSION NOTES below.

 3.  Type `make'.  Ignore any warnings, no error messages should be produced.
@@ -1231,7 +1231,7 @@ CONFIGURE OPTIONS:
	Specify a search-list of terminfo directories which will be compiled
	into the ncurses library (default: DATADIR/terminfo)

-	This is a colon-separated list, like the TERMINFO_DIRS environment
+	This is a colon-separated list, like the $TERMINFO_DIRS environment
	variable.

     --with-termlib[=XXX]
diff --git a/include/curses.events b/include/curses.events
index 25a2583f..468bde18 100644
--- a/include/curses.events
+++ b/include/curses.events
@@ -50,6 +50,6 @@ typedef struct
 extern NCURSES_EXPORT(int) wgetch_events (WINDOW *, _nc_eventlist *) GCC_DEPRECATED(experimental option); /* experimental */
 extern NCURSES_EXPORT(int) wgetnstr_events (WINDOW *,char *,int,_nc_eventlist *) GCC_DEPRECATED(experimental option); /* experimental */

-#define KEY_EVENT	0633		/* We were interrupted by an event */
+#define KEY_EVENT	0634		/* We were interrupted by an event */

 #endif /* NCURSES_WGETCH_EVENTS */
diff --git a/ncurses/tinfo/lib_tparm.c b/ncurses/tinfo/lib_tparm.c
index a10a3877..cd972c0f 100644
--- a/ncurses/tinfo/lib_tparm.c
+++ b/ncurses/tinfo/lib_tparm.c
@@ -1113,8 +1113,10 @@ check_string_caps(TPARM_DATA *data, const char *string)
	    want_type = 2;	/* function key #1, transmit string #2 */
	else if (CHECK_CAP(plab_norm))
	    want_type = 2;	/* label #1, show string #2 */
+#ifdef pkey_plab
	else if (CHECK_CAP(pkey_plab))
	    want_type = 6;	/* function key #1, type string #2, show string #3 */
+#endif
 #if NCURSES_XNAMES
	else {
	    char *check;
diff --git a/progs/reset_cmd.c b/progs/reset_cmd.c
index eff3af72..aec4b077 100644
--- a/progs/reset_cmd.c
+++ b/progs/reset_cmd.c
@@ -75,6 +75,9 @@ MODULE_ID("$Id: reset_cmd.c,v 1.28 2021/10/02 18:08:44 tom Exp $")
 # endif
 #endif

+#define set_flags(target, mask)    target |= mask
+#define clear_flags(target, mask)  target &= ~((unsigned)(mask))
+
 static FILE *my_file;

 static bool use_reset = FALSE;	/* invoked as reset */
@@ -188,6 +191,79 @@ out_char(int c)
 #define reset_char(item, value) \
     tty_settings->c_cc[item] = CHK(tty_settings->c_cc[item], value)

+/*
+ * Simplify ifdefs
+ */
+#ifndef BSDLY
+#define BSDLY 0
+#endif
+#ifndef CRDLY
+#define CRDLY 0
+#endif
+#ifndef ECHOCTL
+#define ECHOCTL 0
+#endif
+#ifndef ECHOKE
+#define ECHOKE 0
+#endif
+#ifndef ECHOPRT
+#define ECHOPRT 0
+#endif
+#ifndef FFDLY
+#define FFDLY 0
+#endif
+#ifndef IMAXBEL
+#define IMAXBEL 0
+#endif
+#ifndef IUCLC
+#define IUCLC 0
+#endif
+#ifndef IXANY
+#define IXANY 0
+#endif
+#ifndef NLDLY
+#define NLDLY 0
+#endif
+#ifndef OCRNL
+#define OCRNL 0
+#endif
+#ifndef OFDEL
+#define OFDEL 0
+#endif
+#ifndef OFILL
+#define OFILL 0
+#endif
+#ifndef OLCUC
+#define OLCUC 0
+#endif
+#ifndef ONLCR
+#define ONLCR 0
+#endif
+#ifndef ONLRET
+#define ONLRET 0
+#endif
+#ifndef ONOCR
+#define ONOCR 0
+#endif
+#ifndef OXTABS
+#define OXTABS 0
+#endif
+#ifndef TAB3
+#define TAB3 0
+#endif
+#ifndef TABDLY
+#define TABDLY 0
+#endif
+#ifndef TOSTOP
+#define TOSTOP 0
+#endif
+#ifndef VTDLY
+#define VTDLY 0
+#endif
+#ifndef XCASE
+#define XCASE 0
+#endif
+
 /*
  * Reset the terminal mode bits to a sensible state.  Very useful after
  * a child program dies in raw mode.
@@ -195,6 +271,10 @@ out_char(int c)
 void
 reset_tty_settings(int fd, TTY * tty_settings, int noset)
 {
+    unsigned mask;
+#ifdef TIOCMGET
+    int modem_bits;
+#endif
     GET_TTY(fd, tty_settings);

 #ifdef TERMIOS
@@ -228,106 +308,65 @@ reset_tty_settings(int fd, TTY * tty_settings, int noset)
     reset_char(VWERASE, CWERASE);
 #endif

-    tty_settings->c_iflag &= ~((unsigned) (IGNBRK
-					   | PARMRK
-					   | INPCK
-					   | ISTRIP
-					   | INLCR
-					   | IGNCR
-#ifdef IUCLC
-					   | IUCLC
-#endif
-#ifdef IXANY
-					   | IXANY
-#endif
-					   | IXOFF));
-
-    tty_settings->c_iflag |= (BRKINT
-			      | IGNPAR
-			      | ICRNL
-			      | IXON
-#ifdef IMAXBEL
-			      | IMAXBEL
-#endif
-	);
-
-    tty_settings->c_oflag &= ~((unsigned) (0
-#ifdef OLCUC
-					   | OLCUC
-#endif
-#ifdef OCRNL
-					   | OCRNL
-#endif
-#ifdef ONOCR
-					   | ONOCR
-#endif
-#ifdef ONLRET
-					   | ONLRET
-#endif
-#ifdef OFILL
-					   | OFILL
-#endif
-#ifdef OFDEL
-					   | OFDEL
-#endif
-#ifdef NLDLY
-					   | NLDLY
-#endif
-#ifdef CRDLY
-					   | CRDLY
-#endif
-#ifdef TABDLY
-					   | TABDLY
-#endif
-#ifdef BSDLY
-					   | BSDLY
-#endif
-#ifdef VTDLY
-					   | VTDLY
-#endif
-#ifdef FFDLY
-					   | FFDLY
-#endif
-			       ));
-
-    tty_settings->c_oflag |= (OPOST
-#ifdef ONLCR
-			      | ONLCR
-#endif
-	);
-
-    tty_settings->c_cflag &= ~((unsigned) (CSIZE
-					   | CSTOPB
-					   | PARENB
-					   | PARODD
-					   | CLOCAL));
-    tty_settings->c_cflag |= (CS8 | CREAD);
-    tty_settings->c_lflag &= ~((unsigned) (ECHONL
-					   | NOFLSH
-#ifdef TOSTOP
-					   | TOSTOP
-#endif
-#ifdef ECHOPTR
-					   | ECHOPRT
-#endif
-#ifdef XCASE
-					   | XCASE
-#endif
-			       ));
-
-    tty_settings->c_lflag |= (ISIG
-			      | ICANON
-			      | ECHO
-			      | ECHOE
-			      | ECHOK
-#ifdef ECHOCTL
-			      | ECHOCTL
-#endif
-#ifdef ECHOKE
-			      | ECHOKE
-#endif
-	);
-#endif
+    clear_flags(tty_settings->c_iflag, (IGNBRK
+                                       | PARMRK
+                                       | INPCK
+                                       | ISTRIP
+                                       | INLCR
+                                       | IGNCR
+                                       | IUCLC
+                                       | IXANY
+                                       | IXOFF));
+
+    set_flags(tty_settings->c_iflag, (BRKINT
+                                     | IGNPAR
+                                     | ICRNL
+                                     | IXON
+                                     | IMAXBEL));
+
+    clear_flags(tty_settings->c_oflag, (0
+                                       | OLCUC
+                                       | OCRNL
+                                       | ONOCR
+                                       | ONLRET
+                                       | OFILL
+                                       | OFDEL
+                                       | NLDLY
+                                       | CRDLY
+                                       | TABDLY
+                                       | BSDLY
+                                       | VTDLY
+                                       | FFDLY));
+
+    set_flags(tty_settings->c_oflag, (OPOST
+                                     | ONLCR));
+
+    mask = (CSIZE | CSTOPB | PARENB | PARODD);
+#ifdef TIOCMGET
+    /* leave clocal alone if this appears to use a modem */
+    if (ioctl(fd, TIOCMGET, &modem_bits) == -1)
+       mask |= CLOCAL;
+#else
+    /* cannot check - use the behavior from tset */
+    mask |= CLOCAL;
+#endif
+    clear_flags(tty_settings->c_cflag, mask);
+
+    set_flags(tty_settings->c_cflag, (CS8 | CREAD));
+    clear_flags(tty_settings->c_lflag, (ECHONL
+                                       | NOFLSH
+                                       | TOSTOP
+                                       | ECHOPRT
+                                       | XCASE));
+
+    set_flags(tty_settings->c_lflag, (ISIG
+                                     | ICANON
+                                     | ECHO
+                                     | ECHOE
+                                     | ECHOK
+                                     | ECHOCTL
+                                     | ECHOKE));
+#endif /* TERMIOS */

     if (!noset) {
	SET_TTY(fd, tty_settings);
@@ -402,29 +441,23 @@ set_conversions(TTY * tty_settings)
 #if defined(EXP_WIN32_DRIVER)
     /* FIXME */
 #else
-#ifdef ONLCR
-    tty_settings->c_oflag |= ONLCR;
-#endif
-    tty_settings->c_iflag |= ICRNL;
-    tty_settings->c_lflag |= ECHO;
-#ifdef OXTABS
-    tty_settings->c_oflag |= OXTABS;
-#endif /* OXTABS */
+    set_flags(tty_settings->c_oflag, ONLCR);
+    set_flags(tty_settings->c_iflag, ICRNL);
+    set_flags(tty_settings->c_lflag, ECHO);
+    set_flags(tty_settings->c_oflag, OXTABS);

     /* test used to be tgetflag("NL") */
     if (VALID_STRING(newline) && newline[0] == '\n' && !newline[1]) {
	/* Newline, not linefeed. */
-#ifdef ONLCR
-	tty_settings->c_oflag &= ~((unsigned) ONLCR);
-#endif
-	tty_settings->c_iflag &= ~((unsigned) ICRNL);
+        clear_flags(tty_settings->c_oflag, ONLCR);
+        clear_flags(tty_settings->c_iflag, ICRNL);
     }
-#ifdef OXTABS
+#if OXTABS
     /* test used to be tgetflag("pt") */
     if (VALID_STRING(set_tab) && VALID_STRING(clear_all_tabs))
-	tty_settings->c_oflag &= ~OXTABS;
+	clear_flags(tty_settings->c_oflag, OXTABS);
 #endif /* OXTABS */
-    tty_settings->c_lflag |= (ECHOE | ECHOK);
+    set_flags(tty_settings->c_lflag, (ECHOE | ECHOK));
 #endif
 }

@@ -490,7 +523,7 @@ send_init_strings(int fd GCC_UNUSED, TTY * old_settings)
     bool need_flush = FALSE;

     (void) old_settings;
-#ifdef TAB3
+#if TAB3
     if (old_settings != 0 &&
	old_settings->c_oflag & (TAB3 | ONLCR | OCRNL | ONLRET)) {
	old_settings->c_oflag &= (TAB3 | ONLCR | OCRNL | ONLRET);
@@ -512,22 +545,22 @@ send_init_strings(int fd GCC_UNUSED, TTY * old_settings)

	if (VALID_STRING(clear_margins)) {
	    need_flush |= sent_string(clear_margins);
-	} else
+	}
 #if defined(set_lr_margin)
-	if (VALID_STRING(set_lr_margin)) {
+	else if (VALID_STRING(set_lr_margin)) {
	    need_flush |= sent_string(TIPARM_2(set_lr_margin, 0, columns - 1));
-	} else
+	}
 #endif
 #if defined(set_left_margin_parm) && defined(set_right_margin_parm)
-	    if (VALID_STRING(set_left_margin_parm)
-		&& VALID_STRING(set_right_margin_parm)) {
+	else if (VALID_STRING(set_left_margin_parm)
+	  	 && VALID_STRING(set_right_margin_parm)) {
	    need_flush |= sent_string(TIPARM_1(set_left_margin_parm, 0));
	    need_flush |= sent_string(TIPARM_1(set_right_margin_parm,
					       columns - 1));
-	} else
+	}
 #endif
-	    if (VALID_STRING(set_left_margin)
-		&& VALID_STRING(set_right_margin)) {
+	else if (VALID_STRING(set_left_margin)
+		 && VALID_STRING(set_right_margin)) {
	    need_flush |= to_left_margin();
	    need_flush |= sent_string(set_left_margin);
	    if (VALID_STRING(parm_right_cursor)) {
diff --git a/progs/tabs.c b/progs/tabs.c
index 7378d116..d904330b 100644
--- a/progs/tabs.c
+++ b/progs/tabs.c
@@ -370,7 +370,9 @@ do_set_margin(int margin, bool no_op)
	    }
	    tputs(set_left_margin, 1, putch);
	}
-    } else if (VALID_STRING(set_left_margin_parm)) {
+    }
+#if defined(set_left_margin_parm) && defined(set_right_margin_parm)
+    else if (VALID_STRING(set_left_margin_parm)) {
	result = TRUE;
	if (!no_op) {
	    if (VALID_STRING(set_right_margin_parm)) {
@@ -379,12 +381,16 @@ do_set_margin(int margin, bool no_op)
		tputs(TIPARM_2(set_left_margin_parm, margin, max_cols), 1, putch);
	    }
	}
-    } else if (VALID_STRING(set_lr_margin)) {
+    }
+#endif
+#if defined(set_lr_margin)
+    else if (VALID_STRING(set_lr_margin)) {
	result = TRUE;
	if (!no_op) {
	    tputs(TIPARM_2(set_lr_margin, margin, max_cols), 1, putch);
	}
     }
+#endif
     return result;
 }

diff --git a/progs/tic.c b/progs/tic.c
index 888927e2..78b568fa 100644
--- a/progs/tic.c
+++ b/progs/tic.c
@@ -3142,6 +3142,7 @@ guess_ANSI_VTxx(TERMTYPE2 *tp)
  * In particular, any ECMA-48 terminal should support these, though the details
  * for u9 are implementation dependent.
  */
+#if defined(user6) && defined(user7) && defined(user8) && defined(user9)
 static void
 check_user_6789(TERMTYPE2 *tp)
 {
@@ -3177,6 +3178,9 @@ check_user_6789(TERMTYPE2 *tp)
	break;
     }
 }
+#else
+#define check_user_6789(tp)    /* nothing */
+#endif

 /* other sanity-checks (things that we don't want in the normal
  * logic that reads a terminfo entry)
--
2.40.0
