Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Lib/test/test_curses.py
Original file line number Diff line number Diff line change
Expand Up @@ -2967,6 +2967,11 @@ def test_has_extended_color_support(self):
r = curses.has_extended_color_support()
self.assertIsInstance(r, bool)

def test_err_and_ok(self):
# ERR is negative; it is not a chtype constant.
self.assertEqual(curses.ERR, -1)
self.assertEqual(curses.OK, 0)

def test_type_names(self):
# The curses types report their public module rather than the
# underscore extension that implements them.
Expand Down
29 changes: 22 additions & 7 deletions Modules/_cursesmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -6657,11 +6657,10 @@ curses_init_dict(PyObject *module)
}
/* This was moved from initcurses() because it core dumped on SGI,
where they're not defined until you've called initscr() */
/* Use long long, not long: a chtype constant (the A_* attributes, ACS_*
and key codes) can set bits beyond a 32-bit long, which is what long is
on LLP64 platforms such as Windows -- A_DIM (0x80000000) would otherwise
be sign-extended to a negative number. long long is at least 64 bits
everywhere and still represents the negative ERR (-1). */
/* Use unsigned long long, not long: a chtype constant (the A_* attributes,
ACS_* and key codes) can set bits beyond a 32-bit long, which is what
long is on LLP64 platforms such as Windows -- A_DIM (0x80000000) would
otherwise be sign-extended to a negative number. */
#define SetDictInt(NAME, VALUE) \
do { \
PyObject *value = PyLong_FromUnsignedLongLong((unsigned long long)(VALUE)); \
Expand Down Expand Up @@ -9419,8 +9418,24 @@ cursesmodule_exec(PyObject *module)
} \
} while (0)

SetDictInt("ERR", ERR);
SetDictInt("OK", OK);
/* ERR is -1, so it needs a signed conversion, unlike the chtype
constants below. */
#define SetDictSignedInt(NAME, VALUE) \
do { \
PyObject *value = PyLong_FromLongLong((long long)(VALUE)); \
if (value == NULL) { \
return -1; \
} \
int rc = PyDict_SetItemString(module_dict, (NAME), value); \
Py_DECREF(value); \
if (rc < 0) { \
return -1; \
} \
} while (0)

SetDictSignedInt("ERR", ERR);
SetDictSignedInt("OK", OK);
#undef SetDictSignedInt

/* Here are some attributes you can add to chars to print */

Expand Down
Loading