summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2021-01-05 07:13:15 (GMT)
committerGitHub <noreply@github.com>2021-01-05 07:13:15 (GMT)
commit59f9b4e4509be67494f3d45489fa55523175ff69 (patch)
treee17a88dc4ef18c9ed56c2f26251d7993508f60cb /Modules
parent27f9dafc2ba51864a9bc2fe5d6293eb4fd887bce (diff)
downloadcpython-59f9b4e4509be67494f3d45489fa55523175ff69.zip
cpython-59f9b4e4509be67494f3d45489fa55523175ff69.tar.gz
cpython-59f9b4e4509be67494f3d45489fa55523175ff69.tar.bz2
bpo-42681: Fix test_curses failures related to color pairs (GH-24089)
On ncurses 6.1 pair numbers are limited by SHORT_MAX-1, even with extended color support. Improve error reporting and tests for color functions.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_cursesmodule.c60
1 files changed, 40 insertions, 20 deletions
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index 23f6d96..7175c72 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -135,29 +135,28 @@ typedef chtype attr_t; /* No attr_t type is available */
#define STRICT_SYSV_CURSES
#endif
-#if defined(NCURSES_EXT_COLORS) && defined(NCURSES_EXT_FUNCS)
+#if NCURSES_EXT_COLORS+0 && NCURSES_EXT_FUNCS+0
#define _NCURSES_EXTENDED_COLOR_FUNCS 1
#else
#define _NCURSES_EXTENDED_COLOR_FUNCS 0
#endif /* defined(NCURSES_EXT_COLORS) && defined(NCURSES_EXT_FUNCS) */
#if _NCURSES_EXTENDED_COLOR_FUNCS
-#define _NCURSES_COLOR_VAL_TYPE int
+#define _CURSES_COLOR_VAL_TYPE int
+#define _CURSES_COLOR_NUM_TYPE int
#define _CURSES_INIT_COLOR_FUNC init_extended_color
#define _CURSES_INIT_PAIR_FUNC init_extended_pair
#define _COLOR_CONTENT_FUNC extended_color_content
-#define _CURSES_PAIR_NUMBER_FUNC extended_pair_content
+#define _CURSES_PAIR_CONTENT_FUNC extended_pair_content
#else
-#define _NCURSES_COLOR_VAL_TYPE short
+#define _CURSES_COLOR_VAL_TYPE short
+#define _CURSES_COLOR_NUM_TYPE short
#define _CURSES_INIT_COLOR_FUNC init_color
#define _CURSES_INIT_PAIR_FUNC init_pair
#define _COLOR_CONTENT_FUNC color_content
-#define _CURSES_PAIR_NUMBER_FUNC pair_content
+#define _CURSES_PAIR_CONTENT_FUNC pair_content
#endif /* _NCURSES_EXTENDED_COLOR_FUNCS */
-#define _CURSES_INIT_COLOR_FUNC_NAME Py_STRINGIFY(_CURSES_INIT_COLOR_FUNC)
-#define _CURSES_INIT_PAIR_FUNC_NAME Py_STRINGIFY(_CURSES_INIT_PAIR_FUNC)
-
/*[clinic input]
module _curses
class _curses.window "PyCursesWindowObject *" "&PyCursesWindow_Type"
@@ -2737,18 +2736,18 @@ static PyObject *
_curses_color_content_impl(PyObject *module, int color_number)
/*[clinic end generated code: output=17b466df7054e0de input=03b5ed0472662aea]*/
{
- _NCURSES_COLOR_VAL_TYPE r,g,b;
+ _CURSES_COLOR_VAL_TYPE r,g,b;
PyCursesInitialised;
PyCursesInitialisedColor;
- if (_COLOR_CONTENT_FUNC(color_number, &r, &g, &b) != ERR)
- return Py_BuildValue("(iii)", r, g, b);
- else {
- PyErr_SetString(PyCursesError,
- "Argument 1 was out of range. Check value of COLORS.");
+ if (_COLOR_CONTENT_FUNC(color_number, &r, &g, &b) == ERR) {
+ PyErr_Format(PyCursesError, "%s() returned ERR",
+ Py_STRINGIFY(_COLOR_CONTENT_FUNC));
return NULL;
}
+
+ return Py_BuildValue("(iii)", r, g, b);
}
/*[clinic input]
@@ -3190,7 +3189,8 @@ _curses_init_color_impl(PyObject *module, int color_number, short r, short g,
PyCursesInitialised;
PyCursesInitialisedColor;
- return PyCursesCheckERR(_CURSES_INIT_COLOR_FUNC(color_number, r, g, b), _CURSES_INIT_COLOR_FUNC_NAME);
+ return PyCursesCheckERR(_CURSES_INIT_COLOR_FUNC(color_number, r, g, b),
+ Py_STRINGIFY(_CURSES_INIT_COLOR_FUNC));
}
/*[clinic input]
@@ -3217,7 +3217,20 @@ _curses_init_pair_impl(PyObject *module, int pair_number, int fg, int bg)
PyCursesInitialised;
PyCursesInitialisedColor;
- return PyCursesCheckERR(_CURSES_INIT_PAIR_FUNC(pair_number, fg, bg), _CURSES_INIT_PAIR_FUNC_NAME);
+ if (_CURSES_INIT_PAIR_FUNC(pair_number, fg, bg) == ERR) {
+ if (pair_number >= COLOR_PAIRS) {
+ PyErr_Format(PyExc_ValueError,
+ "Color pair is greater than COLOR_PAIRS-1 (%d).",
+ COLOR_PAIRS - 1);
+ }
+ else {
+ PyErr_Format(PyCursesError, "%s() returned ERR",
+ Py_STRINGIFY(_CURSES_INIT_PAIR_FUNC));
+ }
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
}
static PyObject *ModDict;
@@ -3845,14 +3858,21 @@ static PyObject *
_curses_pair_content_impl(PyObject *module, int pair_number)
/*[clinic end generated code: output=4a726dd0e6885f3f input=03970f840fc7b739]*/
{
- _NCURSES_COLOR_VAL_TYPE f, b;
+ _CURSES_COLOR_NUM_TYPE f, b;
PyCursesInitialised;
PyCursesInitialisedColor;
- if (_CURSES_PAIR_NUMBER_FUNC(pair_number, &f, &b)==ERR) {
- PyErr_SetString(PyCursesError,
- "Argument 1 was out of range. (0..COLOR_PAIRS-1)");
+ if (_CURSES_PAIR_CONTENT_FUNC(pair_number, &f, &b) == ERR) {
+ if (pair_number >= COLOR_PAIRS) {
+ PyErr_Format(PyExc_ValueError,
+ "Color pair is greater than COLOR_PAIRS-1 (%d).",
+ COLOR_PAIRS - 1);
+ }
+ else {
+ PyErr_Format(PyCursesError, "%s() returned ERR",
+ Py_STRINGIFY(_CURSES_PAIR_CONTENT_FUNC));
+ }
return NULL;
}