From 8573847a4d938721162a5782d31b1204680439b8 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 17 Feb 1995 13:50:17 +0000 Subject: [PATCH] Steve Clifts version --- Modules/_cursesmodule.c | 840 +++++++++++++++++++++------------------- 1 file changed, 434 insertions(+), 406 deletions(-) diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index d3841b74719..4b45403ecd9 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -40,15 +40,14 @@ in the curses module: Return Value Func/Attr Description -------------------------------------------------------------------------- -StringObject __version__ This returns a string representing - the current version of this module +StringObject version A string representing the current + version of this module. WindowObject initscr() This initializes the screen for use None endwin() Closes down the screen and returns things as they were before calling initscr() True/FalseObject isendwin() Has endwin() been called? -IntObject doupdate() Updates screen and returns number - of bytes written to screen +None doupdate() Updates screen WindowObject newwin(nlines,ncols,begin_y,begin_x) newwin(begin_y,begin_x) newwin() creates and returns @@ -79,34 +78,34 @@ in the WindowObject: Return Value Func/Attr Description -------------------------------------------------------------------------- -IntObject refresh() Do refresh -IntObject nooutrefresh() Mark for refresh but wait -True/False mvwin(new_y,new_x) Move Window -True/False move(new_y,new_x) Move Cursor +None refresh() Do refresh +None nooutrefresh() Mark for refresh but wait +None mvwin(new_y,new_x) Move Window +None move(new_y,new_x) Move Cursor WindowObject subwin(nlines,ncols,begin_y,begin_x) subwin(begin_y,begin_x) -True/False addch(y,x,ch,attr) +None addch(y,x,ch,attr) addch(y,x,ch) addch(ch,attr) addch(ch) -True/False insch(y,x,ch,attr) +None insch(y,x,ch,attr) insch(y,x,ch) insch(ch,attr) insch(ch) -True/False delch(y,x) +None delch(y,x) delch() -True/False echochar(ch,attr) +None echochar(ch,attr) echochar(ch) -True/False addstr(y,x,str,attr) +None addstr(y,x,str,attr) addstr(y,x,str) addstr(str,attr) addstr(str) -True/False attron(attr) -True/False attroff(attr) -True/False attrset(sttr) -True/False standend() -True/False standout() -True/False box(vertch,horch) vertch and horch are INTS +None attron(attr) +None attroff(attr) +None attrset(sttr) +None standend() +None standout() +None box(vertch,horch) vertch and horch are INTS box() None erase() None deleteln() @@ -131,6 +130,7 @@ None idlok(int) int=0 or int=1 None leaveok(int) int=0 or int=1 None scrollok(int) int=0 or int=1 None setscrreg(top,bottom) +None keypad(int) int=0 or int=1 None nodelay(int) int=0 or int=1 None notimeout(int) int=0 or int=1 ******************************************************************/ @@ -167,13 +167,26 @@ staticforward PyTypeObject PyCursesPad_Type; #define PyCursesPad_Check(v) ((v)->ob_type == &PyCursesPad_Type) /* Defines */ -PyObject *PyCurses_OK; -PyObject *PyCurses_ERR; +static PyObject *PyCursesError; /* For exception curses.error */ + +/* Catch-all error messages */ +static char *catchall_ERR = "curses function returned ERR"; +static char *catchall_NULL = "curses function returned NULL"; + +#define ARG_COUNT(X) \ + (((X) == NULL) ? 0 : (PyTuple_Check(X) ? PyTuple_Size(X) : 1)) /****************************************************************** Change Log: +Version 1.2: 95/02/17 (Steve Clift) + Fixed several potential core-dumping bugs. + Reworked arg parsing where variable arg lists are used. + Generate exceptions when ERR or NULL is returned by curses functions. + Changed return types to match SysV Curses manual descriptions. + Added keypad() to window method list doco above. + Version 1.1: 94/08/31: Minor fixes given by Guido. Changed 'ncurses' to 'curses' @@ -181,14 +194,45 @@ Version 1.1: 94/08/31: Added PyErr_Clear() where needed Moved ACS_* attribute initialization to PyCurses_InitScr() to fix crash on SGI + Version 1.0: 94/08/30: This is the first release of this software. Released to the Internet via python-list@cwi.nl ******************************************************************/ + char *PyCursesVersion = "1.1"; +/* + * Check the return code from a curses function and return None + * or raise an exception as appropriate. + */ + +static PyObject * +PyCursesCheckERR(code, fname) + int code; + char *fname; +{ + char buf[100]; + + if (code != ERR) { + Py_INCREF(Py_None); + return Py_None; + } else { + if (fname == NULL) { + PyErr_SetString(PyCursesError, catchall_ERR); + } else { + strcpy(buf, fname); + strcat(buf, "() returned ERR"); + PyErr_SetString(PyCursesError, buf); + } + return NULL; + } +} + + /* ------------- SCREEN routines --------------- */ + #ifdef NOT_YET static PyObject * PyCursesScreen_New(arg) @@ -198,19 +242,23 @@ PyCursesScreen_New(arg) PyFileObject *in_fo; PyFileObject *out_fo; PyCursesScreenObject *xp; - xp = (PyObject *)PyObject_NEW(PyCursesScreenObject, &PyCursesScreen_Type); + xp = PyObject_NEW(PyCursesScreenObject, &PyCursesScreen_Type); if (xp == NULL) return NULL; return (PyObject *)xp; } #endif + + /* ------------- WINDOW routines --------------- */ + static PyObject * PyCursesWindow_New(win) WINDOW *win; { PyCursesWindowObject *wo; - wo = (PyCursesWindowObject *)PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type); + + wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type); if (wo == NULL) return NULL; wo->win = win; @@ -233,8 +281,8 @@ PyCursesWindow_Refresh(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - return (PyObject *)PyInt_FromLong(wrefresh(self->win)); + return NULL; + return PyCursesCheckERR(wrefresh(self->win), "wrefresh"); } static PyObject * @@ -243,8 +291,8 @@ PyCursesWindow_NoOutRefresh(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - return (PyObject *)PyInt_FromLong(wnoutrefresh(self->win)); + return NULL; + return PyCursesCheckERR(wnoutrefresh(self->win), "wnoutrefresh"); } static PyObject * @@ -252,17 +300,10 @@ PyCursesWindow_MoveWin(self,arg) PyCursesWindowObject *self; PyObject * arg; { - int rtn; int x, y; - if (!PyArg_Parse(arg,"(ii)", &y, &x)) - return (PyObject *)NULL; - rtn = mvwin(self->win,y,x); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; - } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + if (!PyArg_Parse(arg,"(ii);y,x", &y, &x)) + return NULL; + return PyCursesCheckERR(mvwin(self->win,y,x), "mvwin"); } static PyObject * @@ -270,17 +311,10 @@ PyCursesWindow_Move(self,arg) PyCursesWindowObject *self; PyObject * arg; { - int rtn; int x, y; - if (!PyArg_Parse(arg,"(ii)", &y, &x)) - return (PyObject *)NULL; - rtn = wmove(self->win,y,x); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; - } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + if (!PyArg_Parse(arg,"(ii);y,x", &y, &x)) + return NULL; + return PyCursesCheckERR(wmove(self->win,y,x), "wmove"); } static PyObject * @@ -291,18 +325,27 @@ PyCursesWindow_SubWin(self,arg) WINDOW *win; PyCursesWindowObject *rtn_win; int nlines, ncols, begin_y, begin_x; + nlines = 0; ncols = 0; - if (!PyArg_Parse(arg, - "(iiii);nlines,ncols,begin_y,begin_x", + switch (ARG_COUNT(arg)) { + case 2: + if (!PyArg_Parse(arg,"(ii);begin_y,begin_x",&begin_y,&begin_x)) + return NULL; + break; + case 4: + if (!PyArg_Parse(arg, "(iiii);nlines,ncols,begin_y,begin_x", &nlines,&ncols,&begin_y,&begin_x)) - PyErr_Clear(); - if (!PyArg_Parse(arg,"(ii)",&begin_y,&begin_x)) - return (PyObject *)NULL; + return NULL; + break; + default: + PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments"); + return NULL; + } win = subwin(self->win,nlines,ncols,begin_y,begin_x); if (win == NULL) { - Py_INCREF(Py_None); - return (PyObject *)Py_None; + PyErr_SetString(PyCursesError, catchall_NULL); + return NULL; } rtn_win = (PyCursesWindowObject *)PyCursesWindow_New(win); rtn_win->parent = self->win; @@ -317,29 +360,34 @@ PyCursesWindow_AddCh(self,arg) int rtn; int x, y; int ch; - int attr; - int attr_old; - int use_xy = TRUE; - int use_attr = TRUE; - switch (PyTuple_Size(arg)) { + int attr, attr_old; + int use_xy = FALSE, use_attr = FALSE; + + switch (ARG_COUNT(arg)) { + case 1: + if (!PyArg_Parse(arg, "i;ch", &ch)) + return NULL; + break; case 2: - case 4: + if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr)) + return NULL; use_attr = TRUE; break; + case 3: + if (!PyArg_Parse(arg,"(iii);y,x,ch", &y, &x, &ch)) + return NULL; + use_xy = TRUE; + break; + case 4: + if (!PyArg_Parse(arg,"(iiii);y,x,ch,attr", &y, &x, &ch, &attr)) + return NULL; + use_xy = use_attr = TRUE; + break; default: - use_attr = FALSE; - } - if (!PyArg_Parse(arg,"(iiii);y,x,ch,attr", &y, &x, &ch, &attr)) { - PyErr_Clear(); - if (!PyArg_Parse(arg,"(iii);y,x,ch", &y, &x, &ch)) { - PyErr_Clear(); - use_xy = FALSE; - if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr)) - PyErr_Clear(); - if (!PyArg_Parse(arg,"i;ch", &ch)) - return (PyObject *)NULL; - } + PyErr_SetString(PyExc_TypeError, "addch requires 1 to 4 arguments"); + return NULL; } + if (use_attr == TRUE) { attr_old = getattrs(self->win); wattrset(self->win,attr); @@ -350,12 +398,8 @@ PyCursesWindow_AddCh(self,arg) rtn = waddch(self->win,ch); if (use_attr == TRUE) wattrset(self->win,attr_old); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; - } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + + return PyCursesCheckERR(rtn, "[mv]waddch"); } static PyObject * @@ -366,27 +410,34 @@ PyCursesWindow_InsCh(self,arg) int rtn; int x, y; int ch; - int use_xy = TRUE; - int attr, attr_old, use_attr = FALSE; - switch (PyTuple_Size(arg)) { + int attr, attr_old; + int use_xy = TRUE, use_attr = FALSE; + + switch (ARG_COUNT(arg)) { + case 1: + if (!PyArg_Parse(arg, "i;ch", &ch)) + return NULL; + break; case 2: - case 4: + if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr)) + return NULL; use_attr = TRUE; break; + case 3: + if (!PyArg_Parse(arg,"(iii);y,x,ch", &y, &x, &ch)) + return NULL; + use_xy = TRUE; + break; + case 4: + if (!PyArg_Parse(arg,"(iiii);y,x,ch,attr", &y, &x, &ch, &attr)) + return NULL; + use_xy = use_attr = TRUE; + break; default: - use_attr = FALSE; - } - if (!PyArg_Parse(arg,"(iiii);y,x,ch,attr", &y, &x, &ch, &attr)) { - PyErr_Clear(); - if (!PyArg_Parse(arg,"(iii);y,x,ch", &y, &x, &ch)) { - PyErr_Clear(); - use_xy = FALSE; - if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr)) - PyErr_Clear(); - if (!PyArg_Parse(arg,"i;ch", &ch)) - return (PyObject *)NULL; - } + PyErr_SetString(PyExc_TypeError, "insch requires 1 to 4 arguments"); + return NULL; } + if (use_attr == TRUE) { attr_old = getattrs(self->win); wattrset(self->win,attr); @@ -397,12 +448,8 @@ PyCursesWindow_InsCh(self,arg) rtn = winsch(self->win,ch); if (use_attr == TRUE) wattrset(self->win,attr_old); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; - } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + + return PyCursesCheckERR(rtn, "[mv]winsch"); } static PyObject * @@ -412,20 +459,22 @@ PyCursesWindow_DelCh(self,arg) { int rtn; int x, y; - int use_xy = TRUE; - if (!PyArg_Parse(arg,"(ii);y,x", &y, &x)) - use_xy = FALSE; - PyErr_Clear(); - if (use_xy == TRUE) - rtn = mvwdelch(self->win,y,x); - else + + switch (ARG_COUNT(arg)) { + case 0: rtn = wdelch(self->win); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; + break; + case 2: + if (!PyArg_Parse(arg,"(ii);y,x", &y, &x)) + return NULL; + rtn = mvwdelch(self->win,y,x); + break; + default: + PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments"); + return NULL; } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + + return PyCursesCheckERR(rtn, "[mv]wdelch"); } static PyObject * @@ -435,26 +484,28 @@ PyCursesWindow_EchoChar(self,arg) { int rtn; int ch; - int attr, attr_old, use_attr = TRUE; - if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr)) { - PyErr_Clear(); - use_attr = FALSE; + int attr, attr_old; + + switch (ARG_COUNT(arg)) { + case 1: if (!PyArg_Parse(arg,"i;ch", &ch)) - return (PyObject *)NULL; - } - if (use_attr == TRUE) { + return NULL; + rtn = wechochar(self->win,ch); + break; + case 2: + if (!PyArg_Parse(arg,"(ii);ch,attr", &ch, &attr)) + return NULL; attr_old = getattrs(self->win); wattrset(self->win,attr); - } - rtn = wechochar(self->win,ch); - if (use_attr == TRUE) + rtn = wechochar(self->win,ch); wattrset(self->win,attr_old); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; + break; + default: + PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments"); + return NULL; } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + + return PyCursesCheckERR(rtn, "wechochar"); } static PyObject * @@ -465,27 +516,34 @@ PyCursesWindow_AddStr(self,arg) int rtn; int x, y; char *str; - int use_xy = TRUE; - int attr, attr_old, use_attr = TRUE; - switch (PyTuple_Size(arg)) { - case 2: - case 4: - use_attr = TRUE; - break; - default: - use_attr = FALSE; - } - if (!PyArg_Parse(arg,"(iisi);y,x,str,attr", &y, &x, &str, &attr)) { - PyErr_Clear(); - if (!PyArg_Parse(arg,"(iis);y,x,str", &y, &x, &str)) { - PyErr_Clear(); - use_xy = FALSE; - if (!PyArg_Parse(arg,"(si);str,attr", &str, &attr)) - PyErr_Clear(); - if (!PyArg_Parse(arg,"s;str", &str)) - return (PyObject *)NULL; - } + int attr, attr_old; + int use_xy = FALSE, use_attr = FALSE; + + switch (ARG_COUNT(arg)) { + case 1: + if (!PyArg_Parse(arg,"s;str", &str)) + return NULL; + break; + case 2: + if (!PyArg_Parse(arg,"(si);str,attr", &str, &attr)) + return NULL; + use_attr = TRUE; + break; + case 3: + if (!PyArg_Parse(arg,"(iis);y,x,str", &y, &x, &str)) + return NULL; + use_xy = TRUE; + break; + case 4: + if (!PyArg_Parse(arg,"(iisi);y,x,str,attr", &y, &x, &str, &attr)) + return NULL; + use_xy = use_attr = TRUE; + break; + default: + PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments"); + return NULL; } + if (use_attr == TRUE) { attr_old = getattrs(self->win); wattrset(self->win,attr); @@ -496,12 +554,8 @@ PyCursesWindow_AddStr(self,arg) rtn = waddstr(self->win,str); if (use_attr == TRUE) wattrset(self->win,attr_old); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; - } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + + return PyCursesCheckERR(rtn, "[mv]waddstr"); } static PyObject * @@ -509,17 +563,12 @@ PyCursesWindow_AttrOn(self,arg) PyCursesWindowObject *self; PyObject * arg; { - int rtn; int ch; if (!PyArg_Parse(arg,"i;attr", &ch)) - return (PyObject *)NULL; - rtn = wattron(self->win,ch); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; - } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + return NULL; + wattron(self->win,ch); + Py_INCREF(Py_None); + return Py_None; } static PyObject * @@ -527,17 +576,12 @@ PyCursesWindow_AttrOff(self,arg) PyCursesWindowObject *self; PyObject * arg; { - int rtn; int ch; if (!PyArg_Parse(arg,"i;attr", &ch)) - return (PyObject *)NULL; - rtn = wattroff(self->win,ch); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; - } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + return NULL; + wattroff(self->win,ch); + Py_INCREF(Py_None); + return Py_None; } static PyObject * @@ -545,17 +589,12 @@ PyCursesWindow_AttrSet(self,arg) PyCursesWindowObject *self; PyObject * arg; { - int rtn; int ch; if (!PyArg_Parse(arg,"i;attr", &ch)) - return (PyObject *)NULL; - rtn = wattrset(self->win,ch); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; - } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + return NULL; + wattrset(self->win,ch); + Py_INCREF(Py_None); + return Py_None; } static PyObject * @@ -563,16 +602,11 @@ PyCursesWindow_StandEnd(self,arg) PyCursesWindowObject *self; PyObject * arg; { - int rtn; if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - rtn = wstandend(self->win); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; - } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + return NULL; + wstandend(self->win); + Py_INCREF(Py_None); + return Py_None; } static PyObject * @@ -580,16 +614,11 @@ PyCursesWindow_StandOut(self,arg) PyCursesWindowObject *self; PyObject * arg; { - int rtn; if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - rtn = wstandout(self->win); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; - } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + return NULL; + wstandout(self->win); + Py_INCREF(Py_None); + return Py_None; } static PyObject * @@ -597,17 +626,12 @@ PyCursesWindow_Box(self,arg) PyCursesWindowObject *self; PyObject * arg; { - int rtn; int ch1=0,ch2=0; if (!PyArg_Parse(arg,"(ii);vertch,horch", &ch1, &ch2)) PyErr_Clear(); - rtn = box(self->win,ch1,ch2); - if (rtn == OK) { - Py_INCREF(PyCurses_OK); - return (PyObject *)PyCurses_OK; - } - Py_INCREF(PyCurses_ERR); - return (PyObject *)PyCurses_ERR; + box(self->win,ch1,ch2); + Py_INCREF(Py_None); + return Py_None; } static PyObject * @@ -616,10 +640,10 @@ PyCursesWindow_Erase(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; + return NULL; werase(self->win); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -628,10 +652,8 @@ PyCursesWindow_DeleteLine(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - wdeleteln(self->win); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(wdeleteln(self->win), "wdeleteln"); } static PyObject * @@ -640,10 +662,8 @@ PyCursesWindow_InsertLine(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - winsertln(self->win); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(winsertln(self->win), "winsertln"); } static PyObject * @@ -653,9 +673,9 @@ PyCursesWindow_GetYX(self,arg) { int x, y; if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; + return NULL; getyx(self->win,y,x); - return (PyObject *)Py_BuildValue("(ii)", y, x); + return Py_BuildValue("(ii)", y, x); } static PyObject * @@ -665,9 +685,9 @@ PyCursesWindow_GetBegYX(self,arg) { int x, y; if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; + return NULL; getbegyx(self->win,y,x); - return (PyObject *)Py_BuildValue("(ii)", y, x); + return Py_BuildValue("(ii)", y, x); } static PyObject * @@ -677,9 +697,9 @@ PyCursesWindow_GetMaxYX(self,arg) { int x, y; if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; + return NULL; getmaxyx(self->win,y,x); - return (PyObject *)Py_BuildValue("(ii)", y, x); + return Py_BuildValue("(ii)", y, x); } static PyObject * @@ -688,10 +708,10 @@ PyCursesWindow_Clear(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; + return NULL; wclear(self->win); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -700,10 +720,10 @@ PyCursesWindow_ClearToBottom(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; + return NULL; wclrtobot(self->win); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -712,10 +732,10 @@ PyCursesWindow_ClearToEOL(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; + return NULL; wclrtoeol(self->win); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -724,10 +744,8 @@ PyCursesWindow_Scroll(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - scroll(self->win); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(scroll(self->win), "scroll"); } static PyObject * @@ -736,10 +754,8 @@ PyCursesWindow_TouchWin(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - touchwin(self->win); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(touchwin(self->win), "touchwin"); } static PyObject * @@ -748,11 +764,9 @@ PyCursesWindow_TouchLine(self,arg) PyObject * arg; { int st, cnt; - if (!PyArg_Parse(arg,"(ii);start, count",&st,&cnt)) - return (PyObject *)NULL; - touchline(self->win,st,cnt); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + if (!PyArg_Parse(arg,"(ii);start,count",&st,&cnt)) + return NULL; + return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline"); } static PyObject * @@ -761,16 +775,23 @@ PyCursesWindow_GetCh(self,arg) PyObject * arg; { int x, y; - int use_xy = TRUE; int rtn; - if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) - use_xy = FALSE; - PyErr_Clear(); - if (use_xy == TRUE) - rtn = mvwgetch(self->win,y,x); - else + + switch (ARG_COUNT(arg)) { + case 0: rtn = wgetch(self->win); - return (PyObject *)PyInt_FromLong(rtn); + break; + case 2: + if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) + return NULL; + rtn = mvwgetch(self->win,y,x); + break; + default: + PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments"); + return NULL; + } + + return PyInt_FromLong((long) rtn); } static PyObject * @@ -779,19 +800,26 @@ PyCursesWindow_GetStr(self,arg) PyObject * arg; { int x, y; - int use_xy = TRUE; char rtn[1024]; /* This should be big enough.. I hope */ int rtn2; - if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) - use_xy = FALSE; - PyErr_Clear(); - if (use_xy == TRUE) - rtn2 = mvwgetstr(self->win,y,x,rtn); - else + + switch (ARG_COUNT(arg)) { + case 0: rtn2 = wgetstr(self->win,rtn); + break; + case 2: + if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) + return NULL; + rtn2 = mvwgetstr(self->win,y,x,rtn); + break; + default: + PyErr_SetString(PyExc_TypeError, "getstr requires 0 or 2 arguments"); + return NULL; + } + if (rtn2 == ERR) rtn[0] = 0; - return (PyObject *)PyString_FromString(rtn); + return PyString_FromString(rtn); } static PyObject * @@ -799,17 +827,23 @@ PyCursesWindow_InCh(self,arg) PyCursesWindowObject *self; PyObject * arg; { - int x, y; - int use_xy = TRUE; - int rtn; - if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) - use_xy = FALSE; - PyErr_Clear(); - if (use_xy == TRUE) - rtn = mvwinch(self->win,y,x); - else + int x, y, rtn; + + switch (ARG_COUNT(arg)) { + case 0: rtn = winch(self->win); - return (PyObject *)PyInt_FromLong(rtn); + break; + case 2: + if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) + return NULL; + rtn = mvwinch(self->win,y,x); + break; + default: + PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments"); + return NULL; + } + + return PyInt_FromLong((long) rtn); } static PyObject * @@ -819,10 +853,10 @@ PyCursesWindow_ClearOk(self,arg) { int val; if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val)) - return (PyObject *)NULL; + return NULL; clearok(self->win,val); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -832,10 +866,10 @@ PyCursesWindow_IdlOk(self,arg) { int val; if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val)) - return (PyObject *)NULL; + return NULL; idlok(self->win,val); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -845,10 +879,10 @@ PyCursesWindow_LeaveOk(self,arg) { int val; if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val)) - return (PyObject *)NULL; + return NULL; leaveok(self->win,val); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -858,10 +892,10 @@ PyCursesWindow_ScrollOk(self,arg) { int val; if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val)) - return (PyObject *)NULL; + return NULL; scrollok(self->win,val); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -871,10 +905,8 @@ PyCursesWindow_SetScrollRegion(self,arg) { int x, y; if (!PyArg_Parse(arg,"(ii);top, bottom",&y,&x)) - return (PyObject *)NULL; - wsetscrreg(self->win,y,x); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg"); } static PyObject * @@ -884,10 +916,10 @@ PyCursesWindow_KeyPad(self,arg) { int ch; if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) - return (PyObject *)NULL; + return NULL; keypad(self->win,ch); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -897,10 +929,10 @@ PyCursesWindow_NoDelay(self,arg) { int ch; if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) - return (PyObject *)NULL; + return NULL; nodelay(self->win,ch); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -910,10 +942,10 @@ PyCursesWindow_NoTimeout(self,arg) { int ch; if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) - return (PyObject *)NULL; + return NULL; notimeout(self->win,ch); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyMethodDef PyCursesWindow_Methods[] = { @@ -967,20 +999,26 @@ PyCursesWindow_GetAttr(self, name) return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name); } + /* --------------- PAD routines ---------------- */ + +#ifdef NOT_YET static PyObject * PyCursesPad_New(pad) WINDOW *pad; { PyCursesPadObject *po; - po = (PyCursesPadObject *)PyObject_NEW(PyCursesPadObject, &PyCursesPad_Type); + po = PyObject_NEW(PyCursesPadObject, &PyCursesPad_Type); if (po == NULL) return NULL; po->pad = pad; return (PyObject *)po; } +#endif + /* -------------------------------------------------------*/ + static PyTypeObject PyCursesScreen_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ @@ -1038,6 +1076,7 @@ static PyTypeObject PyCursesPad_Type = { 0, /*tp_hash*/ }; + /* -------------------------------------------------------*/ static PyObject *ModDict; @@ -1050,45 +1089,51 @@ PyCurses_InitScr(self, args) static int already_inited = FALSE; WINDOW *win; if (!PyArg_NoArgs(args)) - return (PyObject *)NULL; + return NULL; if (already_inited == TRUE) { wrefresh(stdscr); return (PyObject *)PyCursesWindow_New(stdscr); } - already_inited = TRUE; win = initscr(); + if (win == NULL) { + PyErr_SetString(PyCursesError, catchall_NULL); + return NULL; + } + + already_inited = TRUE; /* This was moved from initcurses() because core dumped on SGI */ -#define SetDictChar(string,ch) \ - PyDict_SetItemString(ModDict,string,PyInt_FromLong(ch)); +/* Also, they are probably not defined until you've called initscr() */ +#define SetDictInt(string,ch) \ + PyDict_SetItemString(ModDict,string,PyInt_FromLong((long) (ch))); /* Here are some graphic symbols you can use */ - SetDictChar("ACS_ULCORNER",(ACS_ULCORNER)); - SetDictChar("ACS_ULCORNER",(ACS_ULCORNER)); - SetDictChar("ACS_LLCORNER",(ACS_LLCORNER)); - SetDictChar("ACS_URCORNER",(ACS_URCORNER)); - SetDictChar("ACS_LRCORNER",(ACS_LRCORNER)); - SetDictChar("ACS_RTEE", (ACS_RTEE)); - SetDictChar("ACS_LTEE", (ACS_LTEE)); - SetDictChar("ACS_BTEE", (ACS_BTEE)); - SetDictChar("ACS_TTEE", (ACS_TTEE)); - SetDictChar("ACS_HLINE", (ACS_HLINE)); - SetDictChar("ACS_VLINE", (ACS_VLINE)); - SetDictChar("ACS_PLUS", (ACS_PLUS)); - SetDictChar("ACS_S1", (ACS_S1)); - SetDictChar("ACS_S9", (ACS_S9)); - SetDictChar("ACS_DIAMOND", (ACS_DIAMOND)); - SetDictChar("ACS_CKBOARD", (ACS_CKBOARD)); - SetDictChar("ACS_DEGREE", (ACS_DEGREE)); - SetDictChar("ACS_PLMINUS", (ACS_PLMINUS)); - SetDictChar("ACS_BULLET", (ACS_BULLET)); - SetDictChar("ACS_LARROW", (ACS_RARROW)); - SetDictChar("ACS_DARROW", (ACS_DARROW)); - SetDictChar("ACS_UARROW", (ACS_UARROW)); - SetDictChar("ACS_BOARD", (ACS_BOARD)); - SetDictChar("ACS_LANTERN", (ACS_LANTERN)); - SetDictChar("ACS_BLOCK", (ACS_BLOCK)); + SetDictInt("ACS_ULCORNER",(ACS_ULCORNER)); + SetDictInt("ACS_ULCORNER",(ACS_ULCORNER)); + SetDictInt("ACS_LLCORNER",(ACS_LLCORNER)); + SetDictInt("ACS_URCORNER",(ACS_URCORNER)); + SetDictInt("ACS_LRCORNER",(ACS_LRCORNER)); + SetDictInt("ACS_RTEE", (ACS_RTEE)); + SetDictInt("ACS_LTEE", (ACS_LTEE)); + SetDictInt("ACS_BTEE", (ACS_BTEE)); + SetDictInt("ACS_TTEE", (ACS_TTEE)); + SetDictInt("ACS_HLINE", (ACS_HLINE)); + SetDictInt("ACS_VLINE", (ACS_VLINE)); + SetDictInt("ACS_PLUS", (ACS_PLUS)); + SetDictInt("ACS_S1", (ACS_S1)); + SetDictInt("ACS_S9", (ACS_S9)); + SetDictInt("ACS_DIAMOND", (ACS_DIAMOND)); + SetDictInt("ACS_CKBOARD", (ACS_CKBOARD)); + SetDictInt("ACS_DEGREE", (ACS_DEGREE)); + SetDictInt("ACS_PLMINUS", (ACS_PLMINUS)); + SetDictInt("ACS_BULLET", (ACS_BULLET)); + SetDictInt("ACS_LARROW", (ACS_RARROW)); + SetDictInt("ACS_DARROW", (ACS_DARROW)); + SetDictInt("ACS_UARROW", (ACS_UARROW)); + SetDictInt("ACS_BOARD", (ACS_BOARD)); + SetDictInt("ACS_LANTERN", (ACS_LANTERN)); + SetDictInt("ACS_BLOCK", (ACS_BLOCK)); return (PyObject *)PyCursesWindow_New(win); } @@ -1099,10 +1144,8 @@ PyCurses_EndWin(self, args) PyObject * args; { if (!PyArg_NoArgs(args)) - return (PyObject *)NULL; - endwin(); - Py_INCREF(Py_None); - return Py_None; + return NULL; + return PyCursesCheckERR(endwin(), "endwin"); } static PyObject * @@ -1111,7 +1154,7 @@ PyCurses_IsEndWin(self, args) PyObject * args; { if (!PyArg_NoArgs(args)) - return (PyObject *)NULL; + return NULL; if (isendwin() == FALSE) { Py_INCREF(Py_False); return Py_False; @@ -1126,8 +1169,8 @@ PyCurses_DoUpdate(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - return (PyObject *)PyInt_FromLong(doupdate()); + return NULL; + return PyCursesCheckERR(doupdate(), "doupdate"); } static PyObject * @@ -1137,19 +1180,29 @@ PyCurses_NewWindow(self,arg) { WINDOW *win; int nlines, ncols, begin_y, begin_x; - nlines = 0; - ncols = 0; - if (!PyArg_Parse(arg, - "(iiii);nlines,ncols,begin_y,begin_x", + + nlines = ncols = 0; + switch (ARG_COUNT(arg)) { + case 2: + if (!PyArg_Parse(arg,"(ii);begin)_y,begin_x",&begin_y,&begin_x)) + return NULL; + break; + case 4: + if (!PyArg_Parse(arg, "(iiii);nlines,ncols,begin_y,begin_x", &nlines,&ncols,&begin_y,&begin_x)) - PyErr_Clear(); - if (!PyArg_Parse(arg,"(ii)",&begin_y,&begin_x)) - return (PyObject *)NULL; + return NULL; + break; + default: + PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments"); + return NULL; + } + win = newwin(nlines,ncols,begin_y,begin_x); if (win == NULL) { - Py_INCREF(Py_None); - return (PyObject *)Py_None; + PyErr_SetString(PyCursesError, catchall_NULL); + return NULL; } + return (PyObject *)PyCursesWindow_New(win); } @@ -1159,10 +1212,10 @@ PyCurses_Beep(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; + return NULL; beep(); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -1171,10 +1224,10 @@ PyCurses_Flash(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; + return NULL; flash(); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -1184,10 +1237,8 @@ PyCurses_UngetCh(self,arg) { int ch; if (!PyArg_Parse(arg,"i;integer",&ch)) - return (PyObject *)NULL; - ungetch(ch); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(ungetch(ch), "ungetch"); } static PyObject * @@ -1196,10 +1247,10 @@ PyCurses_FlushInp(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; + return NULL; flushinp(); Py_INCREF(Py_None); - return (PyObject *)Py_None; + return Py_None; } static PyObject * @@ -1208,10 +1259,8 @@ PyCurses_CBreak(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - cbreak(); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(cbreak(), "cbreak"); } static PyObject * @@ -1220,10 +1269,8 @@ PyCurses_NoCBreak(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - nocbreak(); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(nocbreak(), "nocbreak"); } static PyObject * @@ -1232,10 +1279,8 @@ PyCurses_Echo(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - echo(); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(echo(), "echo"); } static PyObject * @@ -1244,10 +1289,8 @@ PyCurses_NoEcho(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - noecho(); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(noecho(), "noecho"); } static PyObject * @@ -1256,10 +1299,8 @@ PyCurses_Nl(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - nl(); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(nl(), "nl"); } static PyObject * @@ -1268,10 +1309,8 @@ PyCurses_NoNl(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - nonl(); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(nonl(), "nonl"); } static PyObject * @@ -1280,10 +1319,8 @@ PyCurses_Raw(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - raw(); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(raw(), "raw"); } static PyObject * @@ -1292,10 +1329,8 @@ PyCurses_NoRaw(self,arg) PyObject * arg; { if (!PyArg_NoArgs(arg)) - return (PyObject *)NULL; - noraw(); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(noraw(), "noraw"); } static PyObject * @@ -1305,10 +1340,8 @@ PyCurses_IntrFlush(self,arg) { int ch; if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) - return (PyObject *)NULL; - intrflush(NULL,ch); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(intrflush(NULL,ch), "intrflush"); } static PyObject * @@ -1318,10 +1351,8 @@ PyCurses_Meta(self,arg) { int ch; if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) - return (PyObject *)NULL; - meta(NULL,ch); - Py_INCREF(Py_None); - return (PyObject *)Py_None; + return NULL; + return PyCursesCheckERR(meta(stdscr, ch), "meta"); } static PyObject * @@ -1329,10 +1360,12 @@ PyCurses_KeyName(self,arg) PyObject * self; PyObject * arg; { + char *knp; int ch; if (!PyArg_Parse(arg,"i",&ch)) - return (PyObject *)NULL; - return PyString_FromString((char *)keyname(ch)); + return NULL; + knp = keyname(ch); + return PyString_FromString((knp == NULL) ? "" : knp); } #ifdef NOT_YET @@ -1386,36 +1419,31 @@ static PyMethodDef PyCurses_methods[] = { void initcurses() { - PyObject *m, *d, *x; + PyObject *m, *d; /* Create the module and add the functions */ m = Py_InitModule("curses", PyCurses_methods); - PyCurses_OK = Py_True; - PyCurses_ERR = Py_False; - Py_INCREF(PyCurses_OK); - Py_INCREF(PyCurses_ERR); /* Add some symbolic constants to the module */ d = PyModule_GetDict(m); ModDict = d; /* For PyCurses_InitScr */ - /* Make the version available */ - PyDict_SetItemString(d,"version", - PyString_FromString(PyCursesVersion)); + /* For exception curses.error */ + PyCursesError = PyString_FromString("curses.error"); + PyDict_SetItemString(d, "error", PyCursesError); - /* Here are some defines */ - PyDict_SetItemString(d,"OK", PyCurses_OK); - PyDict_SetItemString(d,"ERR",PyCurses_ERR); + /* Make the version available */ + PyDict_SetItemString(d,"version", PyString_FromString(PyCursesVersion)); /* Here are some attributes you can add to chars to print */ - PyDict_SetItemString(d, "A_NORMAL", PyInt_FromLong(A_NORMAL)); - PyDict_SetItemString(d, "A_STANDOUT", PyInt_FromLong(A_STANDOUT)); - PyDict_SetItemString(d, "A_UNDERLINE", PyInt_FromLong(A_UNDERLINE)); - PyDict_SetItemString(d, "A_REVERSE", PyInt_FromLong(A_REVERSE)); - PyDict_SetItemString(d, "A_BLINK", PyInt_FromLong(A_BLINK)); - PyDict_SetItemString(d, "A_DIM", PyInt_FromLong(A_DIM)); - PyDict_SetItemString(d, "A_BOLD", PyInt_FromLong(A_BOLD)); - PyDict_SetItemString(d, "A_ALTCHARSET",PyInt_FromLong(A_ALTCHARSET)); + SetDictInt("A_NORMAL", A_NORMAL); + SetDictInt("A_STANDOUT", A_STANDOUT); + SetDictInt("A_UNDERLINE", A_UNDERLINE); + SetDictInt("A_REVERSE", A_REVERSE); + SetDictInt("A_BLINK", A_BLINK); + SetDictInt("A_DIM", A_DIM); + SetDictInt("A_BOLD", A_BOLD); + SetDictInt("A_ALTCHARSET", A_ALTCHARSET); /* Now set everything up for KEY_ variables */ { @@ -1441,15 +1469,15 @@ initcurses() *p2 = (char)0; } else key_n2 = key_n; - PyDict_SetItemString(d,key_n2,PyInt_FromLong(key)); + PyDict_SetItemString(d,key_n2,PyInt_FromLong((long) key)); if (key_n2 != key_n) free(key_n2); } - SetDictChar("KEY_MIN",KEY_MIN); - SetDictChar("KEY_MAX",KEY_MAX); + SetDictInt("KEY_MIN", KEY_MIN); + SetDictInt("KEY_MAX", KEY_MAX); } /* Check for errors */ if (PyErr_Occurred()) - Py_FatalError("can't initialize module syslog"); + Py_FatalError("can't initialize module curses"); }