diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2018-10-30 11:22:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-30 11:22:42 (GMT) |
commit | b232df9197a19e78d0e2a751e56e0e62547354ec (patch) | |
tree | 851cc39c2b33019a4c88cf828349eccdcb892b7f /Modules | |
parent | 3e429dcc242e48fa4cbb1a91cf7c416c37b97b4e (diff) | |
download | cpython-b232df9197a19e78d0e2a751e56e0e62547354ec.zip cpython-b232df9197a19e78d0e2a751e56e0e62547354ec.tar.gz cpython-b232df9197a19e78d0e2a751e56e0e62547354ec.tar.bz2 |
bpo-31680: Add curses.ncurses_version. (GH-4217)
Use curses.ncurses_version for conditionally skipping a test.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_cursesmodule.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index a728a24..c8f564a 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -4289,6 +4289,59 @@ _curses_use_default_colors_impl(PyObject *module) } #endif /* STRICT_SYSV_CURSES */ + +#ifdef NCURSES_VERSION + +PyDoc_STRVAR(ncurses_version__doc__, +"curses.ncurses_version\n\ +\n\ +Ncurses version information as a named tuple."); + +static PyTypeObject NcursesVersionType; + +static PyStructSequence_Field ncurses_version_fields[] = { + {"major", "Major release number"}, + {"minor", "Minor release number"}, + {"patch", "Patch release number"}, + {0} +}; + +static PyStructSequence_Desc ncurses_version_desc = { + "curses.ncurses_version", /* name */ + ncurses_version__doc__, /* doc */ + ncurses_version_fields, /* fields */ + 3 +}; + +static PyObject * +make_ncurses_version(void) +{ + PyObject *ncurses_version; + int pos = 0; + + ncurses_version = PyStructSequence_New(&NcursesVersionType); + if (ncurses_version == NULL) { + return NULL; + } + +#define SetIntItem(flag) \ + PyStructSequence_SET_ITEM(ncurses_version, pos++, PyLong_FromLong(flag)); \ + if (PyErr_Occurred()) { \ + Py_CLEAR(ncurses_version); \ + return NULL; \ + } + + SetIntItem(NCURSES_VERSION_MAJOR) + SetIntItem(NCURSES_VERSION_MINOR) + SetIntItem(NCURSES_VERSION_PATCH) +#undef SetIntItem + + return ncurses_version; +} + +#endif /* NCURSES_VERSION */ + + /* List of functions defined in the module */ static PyMethodDef PyCurses_methods[] = { @@ -4426,6 +4479,30 @@ PyInit__curses(void) PyDict_SetItemString(d, "__version__", v); Py_DECREF(v); +#ifdef NCURSES_VERSION + /* ncurses_version */ + if (NcursesVersionType.tp_name == NULL) { + if (PyStructSequence_InitType2(&NcursesVersionType, + &ncurses_version_desc) < 0) + return NULL; + } + v = make_ncurses_version(); + if (v == NULL) { + return NULL; + } + PyDict_SetItemString(d, "ncurses_version", v); + Py_DECREF(v); + + /* prevent user from creating new instances */ + NcursesVersionType.tp_init = NULL; + NcursesVersionType.tp_new = NULL; + if (PyDict_DelItemString(NcursesVersionType.tp_dict, "__new__") < 0 && + PyErr_ExceptionMatches(PyExc_KeyError)) + { + PyErr_Clear(); + } +#endif /* NCURSES_VERSION */ + SetDictInt("ERR", ERR); SetDictInt("OK", OK); |