Update to ncurses-6.0

Change-Id: I98ab2ea8a5e13cca9f8b7cf6277b9b14a4da4299
diff --git a/ncurses/base/lib_slk.c b/ncurses/base/lib_slk.c
index 662f7e4..84f17ae 100644
--- a/ncurses/base/lib_slk.c
+++ b/ncurses/base/lib_slk.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2005,2008 Free Software Foundation, Inc.              *
+ * Copyright (c) 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            *
@@ -41,26 +41,94 @@
  */
 
 #include <curses.priv.h>
-
 #include <ctype.h>
-#include <term.h>		/* num_labels, label_*, plab_norm */
 
-MODULE_ID("$Id: lib_slk.c,v 1.35 2008/09/27 14:07:33 juergen Exp $")
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_slk.c,v 1.48 2011/03/05 21:21:52 tom Exp $")
+
+#ifdef USE_TERM_DRIVER
+#define NumLabels    InfoOf(SP_PARM).numlabels
+#define NoColorVideo InfoOf(SP_PARM).nocolorvideo
+#define LabelWidth   InfoOf(SP_PARM).labelwidth
+#define LabelHeight  InfoOf(SP_PARM).labelheight
+#else
+#define NumLabels    num_labels
+#define NoColorVideo no_color_video
+#define LabelWidth   label_width
+#define LabelHeight  label_height
+#endif
 
 /*
  * Free any memory related to soft labels, return an error.
  */
 static int
-slk_failed(void)
+slk_failed(NCURSES_SP_DCL0)
 {
-    if (SP->_slk) {
-	FreeIfNeeded(SP->_slk->ent);
-	free(SP->_slk);
-	SP->_slk = (SLK *) 0;
+    if ((0 != SP_PARM) && SP_PARM->_slk) {
+	FreeIfNeeded(SP_PARM->_slk->ent);
+	free(SP_PARM->_slk);
+	SP_PARM->_slk = (SLK *) 0;
     }
     return ERR;
 }
 
+NCURSES_EXPORT(int)
+_nc_format_slks(NCURSES_SP_DCLx int cols)
+{
+    int gap, i, x;
+    int max_length;
+
+    if (!SP_PARM || !SP_PARM->_slk)
+	return ERR;
+
+    max_length = SP_PARM->_slk->maxlen;
+    if (SP_PARM->slk_format >= 3) {	/* PC style */
+	gap = (cols - 3 * (3 + 4 * max_length)) / 2;
+
+	if (gap < 1)
+	    gap = 1;
+
+	for (i = x = 0; i < SP_PARM->_slk->maxlab; i++) {
+	    SP_PARM->_slk->ent[i].ent_x = x;
+	    x += max_length;
+	    x += (i == 3 || i == 7) ? gap : 1;
+	}
+    } else {
+	if (SP_PARM->slk_format == 2) {		/* 4-4 */
+	    gap = cols - (int) (SP_PARM->_slk->maxlab * max_length) - 6;
+
+	    if (gap < 1)
+		gap = 1;
+	    for (i = x = 0; i < SP_PARM->_slk->maxlab; i++) {
+		SP_PARM->_slk->ent[i].ent_x = x;
+		x += max_length;
+		x += (i == 3) ? gap : 1;
+	    }
+	} else {
+	    if (SP_PARM->slk_format == 1) {	/* 1 -> 3-2-3 */
+		gap = (cols - (SP_PARM->_slk->maxlab * max_length) - 5)
+		    / 2;
+
+		if (gap < 1)
+		    gap = 1;
+		for (i = x = 0; i < SP_PARM->_slk->maxlab; i++) {
+		    SP_PARM->_slk->ent[i].ent_x = x;
+		    x += max_length;
+		    x += (i == 2 || i == 4) ? gap : 1;
+		}
+	    } else {
+		return slk_failed(NCURSES_SP_ARG);
+	    }
+	}
+    }
+    SP_PARM->_slk->dirty = TRUE;
+
+    return OK;
+}
+
 /*
  * Initialize soft labels.
  * Called from newterm()
@@ -68,108 +136,90 @@
 NCURSES_EXPORT(int)
 _nc_slk_initialize(WINDOW *stwin, int cols)
 {
-    int i, x;
+    int i;
     int res = OK;
-    unsigned max_length;
+    size_t max_length;
+    SCREEN *sp;
+    int numlab;
 
     T((T_CALLED("_nc_slk_initialize()")));
 
-    if (SP->_slk) {		/* we did this already, so simply return */
-	returnCode(OK);
-    } else if ((SP->_slk = typeCalloc(SLK, 1)) == 0)
+    assert(stwin);
+
+    sp = _nc_screen_of(stwin);
+    if (0 == sp)
 	returnCode(ERR);
 
-    SP->_slk->ent = NULL;
+    assert(TerminalOf(SP_PARM));
+
+    numlab = NumLabels;
+
+    if (SP_PARM->_slk) {	/* we did this already, so simply return */
+	returnCode(OK);
+    } else if ((SP_PARM->_slk = typeCalloc(SLK, 1)) == 0)
+	returnCode(ERR);
+
+    if (!SP_PARM->slk_format)
+	SP_PARM->slk_format = _nc_globals.slk_format;
 
     /*
      * If we use colors, vidputs() will suppress video attributes that conflict
      * with colors.  In that case, we're still guaranteed that "reverse" would
      * work.
      */
-    if ((no_color_video & 1) == 0)
-	SetAttr(SP->_slk->attr, A_STANDOUT);
+    if ((NoColorVideo & 1) == 0)
+	SetAttr(SP_PARM->_slk->attr, A_STANDOUT);
     else
-	SetAttr(SP->_slk->attr, A_REVERSE);
+	SetAttr(SP_PARM->_slk->attr, A_REVERSE);
 
-    SP->_slk->maxlab = ((num_labels > 0)
-			? num_labels
-			: MAX_SKEY(_nc_globals.slk_format));
-    SP->_slk->maxlen = ((num_labels > 0)
-			? label_width * label_height
-			: MAX_SKEY_LEN(_nc_globals.slk_format));
-    SP->_slk->labcnt = ((SP->_slk->maxlab < MAX_SKEY(_nc_globals.slk_format))
-			? MAX_SKEY(_nc_globals.slk_format)
-			: SP->_slk->maxlab);
+    SP_PARM->_slk->maxlab = (short) ((numlab > 0)
+				     ? numlab
+				     : MAX_SKEY(SP_PARM->slk_format));
+    SP_PARM->_slk->maxlen = (short) ((numlab > 0)
+				     ? LabelWidth * LabelHeight
+				     : MAX_SKEY_LEN(SP_PARM->slk_format));
+    SP_PARM->_slk->labcnt = (short) ((SP_PARM->_slk->maxlab < MAX_SKEY(SP_PARM->slk_format))
+				     ? MAX_SKEY(SP_PARM->slk_format)
+				     : SP_PARM->_slk->maxlab);
 
-    if (SP->_slk->maxlen <= 0
-	|| SP->_slk->labcnt <= 0
-	|| (SP->_slk->ent = typeCalloc(slk_ent,
-				       (unsigned) SP->_slk->labcnt)) == NULL)
-	returnCode(slk_failed());
+    if (SP_PARM->_slk->maxlen <= 0
+	|| SP_PARM->_slk->labcnt <= 0
+	|| (SP_PARM->_slk->ent = typeCalloc(slk_ent,
+					    (size_t) SP_PARM->_slk->labcnt))
+	== NULL)
+	returnCode(slk_failed(NCURSES_SP_ARG));
 
-    max_length = SP->_slk->maxlen;
-    for (i = 0; i < SP->_slk->labcnt; i++) {
+    max_length = (size_t) SP_PARM->_slk->maxlen;
+    for (i = 0; i < SP_PARM->_slk->labcnt; i++) {
 	size_t used = max_length + 1;
 
-	if ((SP->_slk->ent[i].ent_text = (char *) _nc_doalloc(0, used)) == 0)
-	    returnCode(slk_failed());
-	memset(SP->_slk->ent[i].ent_text, 0, used);
+	SP_PARM->_slk->ent[i].ent_text = (char *) _nc_doalloc(0, used);
+	if (SP_PARM->_slk->ent[i].ent_text == 0)
+	    returnCode(slk_failed(NCURSES_SP_ARG));
+	memset(SP_PARM->_slk->ent[i].ent_text, 0, used);
 
-	if ((SP->_slk->ent[i].form_text = (char *) _nc_doalloc(0, used)) == 0)
-	    returnCode(slk_failed());
-	memset(SP->_slk->ent[i].form_text, 0, used);
+	SP_PARM->_slk->ent[i].form_text = (char *) _nc_doalloc(0, used);
+	if (SP_PARM->_slk->ent[i].form_text == 0)
+	    returnCode(slk_failed(NCURSES_SP_ARG));
 
-	memset(SP->_slk->ent[i].form_text, ' ', max_length);
-	SP->_slk->ent[i].visible = (char) (i < SP->_slk->maxlab);
-    }
-    if (_nc_globals.slk_format >= 3) {	/* PC style */
-	int gap = (cols - 3 * (3 + 4 * max_length)) / 2;
-
-	if (gap < 1)
-	    gap = 1;
-
-	for (i = x = 0; i < SP->_slk->maxlab; i++) {
-	    SP->_slk->ent[i].ent_x = x;
-	    x += max_length;
-	    x += (i == 3 || i == 7) ? gap : 1;
+	if (used > 1) {
+	    memset(SP_PARM->_slk->ent[i].form_text, ' ', used - 1);
 	}
-    } else {
-	if (_nc_globals.slk_format == 2) {	/* 4-4 */
-	    int gap = cols - (SP->_slk->maxlab * max_length) - 6;
+	SP_PARM->_slk->ent[i].form_text[used - 1] = '\0';
 
-	    if (gap < 1)
-		gap = 1;
-	    for (i = x = 0; i < SP->_slk->maxlab; i++) {
-		SP->_slk->ent[i].ent_x = x;
-		x += max_length;
-		x += (i == 3) ? gap : 1;
-	    }
-	} else {
-	    if (_nc_globals.slk_format == 1) {	/* 1 -> 3-2-3 */
-		int gap = (cols - (SP->_slk->maxlab * max_length) - 5)
-		/ 2;
-
-		if (gap < 1)
-		    gap = 1;
-		for (i = x = 0; i < SP->_slk->maxlab; i++) {
-		    SP->_slk->ent[i].ent_x = x;
-		    x += max_length;
-		    x += (i == 2 || i == 4) ? gap : 1;
-		}
-	    } else
-		returnCode(slk_failed());
-	}
+	SP_PARM->_slk->ent[i].visible = (char) (i < SP_PARM->_slk->maxlab);
     }
-    SP->_slk->dirty = TRUE;
-    if ((SP->_slk->win = stwin) == NULL) {
-	returnCode(slk_failed());
+
+    res = _nc_format_slks(NCURSES_SP_ARGx cols);
+
+    if ((SP_PARM->_slk->win = stwin) == NULL) {
+	returnCode(slk_failed(NCURSES_SP_ARG));
     }
 
     /* We now reset the format so that the next newterm has again
      * per default no SLK keys and may call slk_init again to
      * define a new layout. (juergen 03-Mar-1999)
      */
-    SP->slk_format = _nc_globals.slk_format;
     _nc_globals.slk_format = 0;
     returnCode(res);
 }
@@ -178,14 +228,24 @@
  * Restore the soft labels on the screen.
  */
 NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_restore) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("slk_restore(%p)"), (void *) SP_PARM));
+
+    if (0 == SP_PARM)
+	returnCode(ERR);
+    if (SP_PARM->_slk == NULL)
+	returnCode(ERR);
+    SP_PARM->_slk->hidden = FALSE;
+    SP_PARM->_slk->dirty = TRUE;
+
+    returnCode(NCURSES_SP_NAME(slk_refresh) (NCURSES_SP_ARG));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
 slk_restore(void)
 {
-    T((T_CALLED("slk_restore()")));
-
-    if (SP->_slk == NULL)
-	return (ERR);
-    SP->_slk->hidden = FALSE;
-    SP->_slk->dirty = TRUE;
-
-    returnCode(slk_refresh());
+    return NCURSES_SP_NAME(slk_restore) (CURRENT_SCREEN);
 }
+#endif