[Python-Dev] Adding support to curses library (original) (raw)

Heracles steve at integrityintegrators.net
Tue Feb 24 23🔞10 CET 2009


Hello,

I am working on a patch to add to the _cursesmodule.c file of the Python core libraries. I figured I would take on one of the implemented functions to try to get my feet wet contributing to the project. At any rate, I have the following function defined in the 2.7.a version updated from SVN this morning:

------------- Snippet --------------------------- // Insert new method color_set Steve Owens 2/24/2009 // The curses library color_set function has the following signature: // int color_set(short color_pair_number, void* opts); static PyObject * PyCurses_color_set(PyObject *self, PyObject *args) { short color_pair_number; void * opts; int erg;

// These macros ought to be documented in the API docs // but they aren't yet. PyCursesInitialised PyCursesInitialisedColor

// Per ncurses Man Page: // The routine color_set sets the current color of the given window to // the foreground/background combination described by the color_pair_number. // The parameter opts is reserved for future use, applications must supply a // null pointer. switch(PyTuple_Size(args)) { case 1: // Dont make them pass a useless null pointer. if (!PyArg_ParseTuple(args, "h", &color_pair_number)) return NULL; break; case 2: // Allow them to pass the opts pointer so that when ncurses is later updated. // This method will still work. if (!PyArg_ParseTuple(args, "hO&", &color_pair_number, &opts)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "color_set requires 1 or 2 arguments (color_pair_number[, opts]?)"); return NULL; }

erg = color_set(color_pair_number, opts); // Debating on forcing null here.

if (erg == ERR) return PyCursesCheckERR(erg, "color_set"); else PyInt_FromLong((long) 1L); } -------------End Snippet ---------------------------

I also have the following added in (see last line of the snippet):

------------- Snippet --------------------------- static PyMethodDef PyCurses_methods[] = { {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS}, {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS}, {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS}, {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS}, {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS}, {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS}, {"color_set", (PyCFunction)PyCurses_color_set, METH_VARARGS}, -------------End Snippet ---------------------------

The code compiles and installs fine, but when I run the following unit test, I get a segmentation fault:

------------- Snippet --------------------------- import unittest, curses from test import test_support

def testCursesColorSet(stdscrn): curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE); i = curses.color_set(1, NULL); stdscrn.addstr("RED/BLACK (%0)\n".format(i)) i = curses.color_set(2, NULL); stdscrn.print("WHITE/BLUE (%0)\n".format(i)) i = curses.color_set(0, NULL); stdscrn.print("Default (%0)\n".format(i))

def test_main(stdscrn): curses.savetty() if curses.has_color(): testCursesColorSet(stdscrn) else stdscr.addstr( "Test Aborted: Color not supported on this terminal.")

if name == 'main': curses.wrapper(test_main) -------------End Snippet ---------------------------

It turns out that by commenting out this line in the _cursesmodule.c code, allows the unit test to run obviously reporting the error as expected:

------------- Snippet --------------------------- //erg = color_set(color_pair_number, opts); // Debating on forcing null here. -------------End Snippet ---------------------------

At any rate I am stuck. I am still trying to build just a plain C file which will test the color_set function outside of python, but that is another task.

Any suggestions?

-- View this message in context: http://www.nabble.com/Adding-support-to-curses-library-tp22191916p22191916.html Sent from the Python - python-dev mailing list archive at Nabble.com.



More information about the Python-Dev mailing list