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
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to