Update to ncurses-6.0

Change-Id: I98ab2ea8a5e13cca9f8b7cf6277b9b14a4da4299
diff --git a/ncurses/trace/lib_traceatr.c b/ncurses/trace/lib_traceatr.c
index 45a03ce..24772d8 100644
--- a/ncurses/trace/lib_traceatr.c
+++ b/ncurses/trace/lib_traceatr.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc.              *
+ * Copyright (c) 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            *
@@ -30,6 +30,7 @@
  *  Author: Thomas Dickey                           1996-on                 *
  *     and: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                                                 *
  ****************************************************************************/
 
 /*
@@ -37,12 +38,18 @@
  */
 
 #include <curses.priv.h>
-#include <term.h>		/* acs_chars */
 
-MODULE_ID("$Id: lib_traceatr.c,v 1.63 2008/08/03 16:24:53 tom Exp $")
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_traceatr.c,v 1.83 2015/04/04 13:41:37 tom Exp $")
 
 #define COLOR_OF(c) ((c < 0) ? "default" : (c > 7 ? color_of(c) : colors[c].name))
 
+#define TRACE_BUF_SIZE(num) (_nc_globals.tracebuf_ptr[num].size)
+#define COLOR_BUF_SIZE(num) (sizeof(my_buffer[num]))
+
 #ifdef TRACE
 
 static const char l_brace[] = StringOf(L_BRACE);
@@ -61,9 +68,12 @@
 	my_cached = c;
 	my_select = !my_select;
 	if (c == COLOR_DEFAULT)
-	    strcpy(my_buffer[my_select], "default");
+	    _nc_STRCPY(my_buffer[my_select], "default",
+		       COLOR_BUF_SIZE(my_select));
 	else
-	    sprintf(my_buffer[my_select], "color%d", c);
+	    _nc_SPRINTF(my_buffer[my_select],
+			_nc_SLIMIT(COLOR_BUF_SIZE(my_select))
+			"color%d", c);
     }
     return my_buffer[my_select];
 }
@@ -75,78 +85,79 @@
 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" },
-	/* *INDENT-ON* */
-
+	DATA(A_STANDOUT),
+	    DATA(A_UNDERLINE),
+	    DATA(A_REVERSE),
+	    DATA(A_BLINK),
+	    DATA(A_DIM),
+	    DATA(A_BOLD),
+	    DATA(A_ALTCHARSET),
+	    DATA(A_INVIS),
+	    DATA(A_PROTECT),
+	    DATA(A_CHARTEXT),
+	    DATA(A_NORMAL),
+	    DATA(A_COLOR),
+#if USE_ITALIC
+	    DATA(A_ITALIC),
+#endif
     }
 #ifndef USE_TERMLIB
     ,
 	colors[] =
     {
-	/* *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 */
     ;
+#undef DATA
     size_t n;
     char temp[80];
-    char *result = _nc_trace_buf(bufnum, BUFSIZ);
+    char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
 
     if (result != 0) {
 	unsigned save_nc_tracing = _nc_tracing;
 
 	_nc_tracing = 0;
 
-	strcpy(result, l_brace);
+	_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')
-		    result = _nc_trace_bufcat(bufnum, "|");
+		    (void) _nc_trace_bufcat(bufnum, "|");
 		result = _nc_trace_bufcat(bufnum, names[n].name);
 
 		if (names[n].val == A_COLOR) {
-		    short pairnum = PAIR_NUMBER(newmode);
+		    short pairnum = (short) PairNumber(newmode);
 #ifdef USE_TERMLIB
 		    /* pair_content lives in libncurses */
-		    (void) sprintf(temp, "{%d}", pairnum);
+		    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+				"{%d}", pairnum);
 #else
-		    short fg, bg;
+		    NCURSES_COLOR_T fg, bg;
 
 		    if (pair_content(pairnum, &fg, &bg) == OK) {
-			(void) sprintf(temp,
-				       "{%d = {%s, %s}}",
-				       pairnum,
-				       COLOR_OF(fg),
-				       COLOR_OF(bg));
+			_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+				    "{%d = {%s, %s}}",
+				    pairnum,
+				    COLOR_OF(fg),
+				    COLOR_OF(bg));
 		    } else {
-			(void) sprintf(temp, "{%d}", pairnum);
+			_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+				    "{%d}", pairnum);
 		    }
 #endif
 		    result = _nc_trace_bufcat(bufnum, temp);
@@ -172,6 +183,14 @@
 }
 
 /* Trace 'int' return-values */
+NCURSES_EXPORT(int)
+_nc_retrace_int_attr_t(attr_t code)
+{
+    T((T_RETURN("%s"), _traceattr(code)));
+    return (int) code;
+}
+
+/* Trace 'attr_t' return-values */
 NCURSES_EXPORT(attr_t)
 _nc_retrace_attr_t(attr_t code)
 {
@@ -182,68 +201,76 @@
 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;
 
-    if ((attr & A_ALTCHARSET) && (acs_chars != 0)) {
+#if NCURSES_SP_FUNCS
+    (void) sp;
+#endif
+    if (SP_PARM != 0 && (attr & A_ALTCHARSET) && (acs_chars != 0)) {
 	char *cp;
 	char *found = 0;
-	const ALT_NAMES *sp;
+	size_t n;
 
 	for (cp = acs_chars; cp[0] && cp[1]; cp += 2) {
-	    if (ChCharOf(cp[1]) == ChCharOf(ch)) {
+	    if (ChCharOf(UChar(cp[1])) == ChCharOf(ch)) {
 		found = cp;
 		/* don't exit from loop - there may be redefinitions */
 	    }
 	}
 
 	if (found != 0) {
-	    ch = ChCharOf(*found);
-	    for (sp = names; sp->val; sp++)
-		if (sp->val == ch) {
-		    result = sp->name;
+	    ch = ChCharOf(UChar(*found));
+	    for (n = 0; n < SIZEOF(names); ++n) {
+		if (names[n].val == ch) {
+		    result = names[n].name;
 		    break;
 		}
+	    }
 	}
     }
     return result;
@@ -253,14 +280,16 @@
 _tracechtype2(int bufnum, chtype ch)
 {
     const char *found;
-    char *result = _nc_trace_buf(bufnum, BUFSIZ);
+    char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
 
     if (result != 0) {
-	strcpy(result, l_brace);
+	_nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum));
 	if ((found = _nc_altcharset_name(ChAttrOf(ch), ch)) != 0) {
 	    (void) _nc_trace_bufcat(bufnum, found);
 	} else
-	    (void) _nc_trace_bufcat(bufnum, _nc_tracechar(SP, (int) ChCharOf(ch)));
+	    (void) _nc_trace_bufcat(bufnum,
+				    _nc_tracechar(CURRENT_SCREEN,
+						  (int) ChCharOf(ch)));
 
 	if (ChAttrOf(ch) != A_NORMAL) {
 	    (void) _nc_trace_bufcat(bufnum, " | ");
@@ -291,12 +320,12 @@
 NCURSES_EXPORT(char *)
 _tracecchar_t2(int bufnum, const cchar_t *ch)
 {
-    char *result = _nc_trace_buf(bufnum, BUFSIZ);
+    char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
     attr_t attr;
     const char *found;
 
     if (result != 0) {
-	strcpy(result, l_brace);
+	_nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum));
 	if (ch != 0) {
 	    attr = AttrOfD(ch);
 	    if ((found = _nc_altcharset_name(attr, (chtype) CharOfD(ch))) != 0) {
@@ -313,14 +342,17 @@
 		(void) _nc_trace_bufcat(bufnum, "{ ");
 		for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) {
 		    PUTC_ch = ch->chars[PUTC_i];
-		    if (PUTC_ch == L'\0')
+		    if (PUTC_ch == L'\0') {
+			if (PUTC_i == 0)
+			    (void) _nc_trace_bufcat(bufnum, "\\000");
 			break;
-		    PUTC_n = wcrtomb(PUTC_buf, ch->chars[PUTC_i], &PUT_st);
+		    }
+		    PUTC_n = (int) wcrtomb(PUTC_buf, ch->chars[PUTC_i], &PUT_st);
 		    if (PUTC_n <= 0) {
 			if (PUTC_ch != L'\0') {
 			    /* it could not be a multibyte sequence */
 			    (void) _nc_trace_bufcat(bufnum,
-						    _nc_tracechar(SP,
+						    _nc_tracechar(CURRENT_SCREEN,
 								  UChar(ch->chars[PUTC_i])));
 			}
 			break;
@@ -329,7 +361,7 @@
 			if (n)
 			    (void) _nc_trace_bufcat(bufnum, ", ");
 			(void) _nc_trace_bufcat(bufnum,
-						_nc_tracechar(SP,
+						_nc_tracechar(CURRENT_SCREEN,
 							      UChar(PUTC_buf[n])));
 		    }
 		}