libncurses: Import https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.5.tar.gz changes

Change-Id: I3433d30ca01359fd2e3623ede96b531f0b39cbfa
Signed-off-by: micky387 <mickaelsaibi@free.fr>
diff --git a/ncurses/trace/lib_traceatr.c b/ncurses/trace/lib_traceatr.c
index 24772d8..b362862 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-2022,2024 Thomas E. Dickey                                *
+ * Copyright 1998-2017,2018 Free Software Foundation, Inc.                  *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -43,7 +44,7 @@
 #define CUR SP_TERMTYPE
 #endif
 
-MODULE_ID("$Id: lib_traceatr.c,v 1.83 2015/04/04 13:41:37 tom Exp $")
+MODULE_ID("$Id: lib_traceatr.c,v 1.96 2024/02/04 00:11:35 tom Exp $")
 
 #define COLOR_OF(c) ((c < 0) ? "default" : (c > 7 ? color_of(c) : colors[c].name))
 
@@ -67,7 +68,7 @@
     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
@@ -123,11 +124,10 @@
 #endif /* !USE_TERMLIB */
     ;
 #undef DATA
-    size_t n;
-    char temp[80];
     char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
 
     if (result != 0) {
+	size_t n;
 	unsigned save_nc_tracing = _nc_tracing;
 
 	_nc_tracing = 0;
@@ -135,12 +135,14 @@
 	_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 */
@@ -254,7 +256,6 @@
     if (SP_PARM != 0 && (attr & A_ALTCHARSET) && (acs_chars != 0)) {
 	char *cp;
 	char *found = 0;
-	size_t n;
 
 	for (cp = acs_chars; cp[0] && cp[1]; cp += 2) {
 	    if (ChCharOf(UChar(cp[1])) == ChCharOf(ch)) {
@@ -264,6 +265,8 @@
 	}
 
 	if (found != 0) {
+	    size_t n;
+
 	    ch = ChCharOf(UChar(*found));
 	    for (n = 0; n < SIZEOF(names); ++n) {
 		if (names[n].val == ch) {
@@ -279,22 +282,25 @@
 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);
@@ -321,13 +327,13 @@
 _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;
@@ -337,8 +343,8 @@
 	    } else {
 		PUTC_DATA;
 		int n;
+		int assume_unicode = _nc_unicode_locale()? 128 : 255;
 
-		PUTC_INIT;
 		(void) _nc_trace_bufcat(bufnum, "{ ");
 		for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) {
 		    PUTC_ch = ch->chars[PUTC_i];
@@ -347,6 +353,7 @@
 			    (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') {
@@ -356,13 +363,22 @@
 								  UChar(ch->chars[PUTC_i])));
 			}
 			break;
-		    }
-		    for (n = 0; n < PUTC_n; n++) {
-			if (n)
-			    (void) _nc_trace_bufcat(bufnum, ", ");
-			(void) _nc_trace_bufcat(bufnum,
-						_nc_tracechar(CURRENT_SCREEN,
-							      UChar(PUTC_buf[n])));
+		    } else if (ch->chars[PUTC_i] > assume_unicode) {
+			char temp[80];
+			_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+				    "{%d:\\u%04lx}",
+				    _nc_wacs_width(ch->chars[PUTC_i]),
+				    (unsigned long) ch->chars[PUTC_i]);
+			(void) _nc_trace_bufcat(bufnum, temp);
+			attr &= ~A_CHARTEXT;	/* ignore WidecExt(ch) */
+		    } else {
+			for (n = 0; n < PUTC_n; n++) {
+			    if (n)
+				(void) _nc_trace_bufcat(bufnum, ", ");
+			    (void) _nc_trace_bufcat(bufnum,
+						    _nc_tracechar(CURRENT_SCREEN,
+								  UChar(PUTC_buf[n])));
+			}
 		    }
 		}
 		(void) _nc_trace_bufcat(bufnum, " }");
@@ -371,6 +387,18 @@
 		(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);