[Python-Dev] Adding support to curses library
Ulrich Berning
ulrich.berning at denviso.de
Wed Feb 25 09:48:18 CET 2009
Heracles wrote:
>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?
>
>
>
>
As long as Python is written in C, please don't use C++ comments, some C
compilers don't like them.
Ulli
More information about the Python-Dev
mailing list