more fixes by Steve Clift

This commit is contained in:
Guido van Rossum 1995-02-24 13:45:43 +00:00
parent 57836fe998
commit 585c6dcf88

View file

@ -105,8 +105,13 @@ None attroff(attr)
None attrset(sttr)
None standend()
None standout()
None border(ls,rs,ts,bs,tl,tr,bl,br) (accepts 0-8 INT args)
None box(vertch,horch) vertch and horch are INTS
box()
None hline(y,x,ch,n)
hline(ch,n)
None vline(y,x,ch,n)
vline(ch,n)
None erase()
None deleteln()
None insertln()
@ -173,6 +178,9 @@ static PyObject *PyCursesError; /* For exception curses.error */
static char *catchall_ERR = "curses function returned ERR";
static char *catchall_NULL = "curses function returned NULL";
/* Tells whether initscr() has been called to initialise curses */
static int initialised = FALSE;
#define ARG_COUNT(X) \
(((X) == NULL) ? 0 : (PyTuple_Check(X) ? PyTuple_Size(X) : 1))
@ -180,12 +188,13 @@ static char *catchall_NULL = "curses function returned NULL";
Change Log:
Version 1.2: 95/02/17 (Steve Clift)
Version 1.2: 95/02/23 (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.
Added keypad() to window method list.
Added border(), hline() and vline() window methods.
Version 1.1: 94/08/31:
Minor fixes given by Guido.
@ -231,6 +240,18 @@ PyCursesCheckERR(code, fname)
}
static int
PyCursesInitialised()
{
if (initialised == TRUE)
return 1;
else {
PyErr_SetString(PyCursesError, "must call initscr() first");
return 0;
}
}
/* ------------- SCREEN routines --------------- */
#ifdef NOT_YET
@ -621,19 +642,87 @@ PyCursesWindow_StandOut(self,arg)
return Py_None;
}
static PyObject *
PyCursesWindow_Border(self, args)
PyCursesWindowObject *self;
PyObject *args;
{
int ls, rs, ts, bs, tl, tr, bl, br;
ls = rs = ts = bs = tl = tr = bl = br = 0;
if (!PyArg_ParseTuple(args,"|iiiiiiii;ls,rs,ts,bs,tl,tr,bl,br",
&ls, &rs, &ts, &bs, &tl, &tr, &bl, &br))
return NULL;
wborder(self->win, ls, rs, ts, bs, tl, tr, bl, br);
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
PyCursesWindow_Box(self,arg)
PyCursesWindowObject *self;
PyObject * arg;
{
int ch1=0,ch2=0;
if (!PyArg_Parse(arg,"(ii);vertch,horch", &ch1, &ch2))
if (!PyArg_NoArgs(arg)) {
PyErr_Clear();
if (!PyArg_Parse(arg,"(ii);vertch,horch", &ch1, &ch2))
return NULL;
}
box(self->win,ch1,ch2);
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
PyCursesWindow_Hline(self, args)
PyCursesWindowObject *self;
PyObject *args;
{
int ch, n, x, y, code = OK;
switch (ARG_COUNT(args)) {
case 2:
if (!PyArg_Parse(args, "(ii);ch,n", &ch, &n))
return NULL;
break;
case 4:
if (!PyArg_Parse(args, "(iiii);y,x,ch,n", &y, &x, &ch, &n))
return NULL;
code = wmove(self->win, y, x);
break;
default:
PyErr_SetString(PyExc_TypeError, "hline requires 2 or 4 arguments");
return NULL;
}
if (code != ERR)
whline(self->win, ch, n);
return PyCursesCheckERR(code, "wmove");
}
static PyObject *
PyCursesWindow_Vline(self, args)
PyCursesWindowObject *self;
PyObject *args;
{
int ch, n, x, y, code = OK;
switch (ARG_COUNT(args)) {
case 2:
if (!PyArg_Parse(args, "(ii);ch,n", &ch, &n))
return NULL;
break;
case 4:
if (!PyArg_Parse(args, "(iiii);y,x,ch,n", &y, &x, &ch, &n))
return NULL;
code = wmove(self->win, y, x);
break;
default:
PyErr_SetString(PyExc_TypeError, "vline requires 2 or 4 arguments");
return NULL;
}
if (code != ERR)
wvline(self->win, ch, n);
return PyCursesCheckERR(code, "wmove");
}
static PyObject *
PyCursesWindow_Erase(self,arg)
PyCursesWindowObject *self;
@ -949,46 +1038,49 @@ PyCursesWindow_NoTimeout(self,arg)
}
static PyMethodDef PyCursesWindow_Methods[] = {
{"refresh", (PyCFunction)PyCursesWindow_Refresh},
{"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh},
{"mvwin", (PyCFunction)PyCursesWindow_MoveWin},
{"move", (PyCFunction)PyCursesWindow_Move},
{"subwin", (PyCFunction)PyCursesWindow_SubWin},
{"addch", (PyCFunction)PyCursesWindow_AddCh},
{"insch", (PyCFunction)PyCursesWindow_InsCh},
{"delch", (PyCFunction)PyCursesWindow_DelCh},
{"echochar", (PyCFunction)PyCursesWindow_EchoChar},
{"addstr", (PyCFunction)PyCursesWindow_AddStr},
{"attron", (PyCFunction)PyCursesWindow_AttrOn},
{"attroff", (PyCFunction)PyCursesWindow_AttrOff},
{"attrset", (PyCFunction)PyCursesWindow_AttrSet},
{"standend", (PyCFunction)PyCursesWindow_StandEnd},
{"standout", (PyCFunction)PyCursesWindow_StandOut},
{"box", (PyCFunction)PyCursesWindow_Box},
{"erase", (PyCFunction)PyCursesWindow_Erase},
{"deleteln", (PyCFunction)PyCursesWindow_DeleteLine},
{"insertln", (PyCFunction)PyCursesWindow_InsertLine},
{"getyx", (PyCFunction)PyCursesWindow_GetYX},
{"getbegyx", (PyCFunction)PyCursesWindow_GetBegYX},
{"getmaxyx", (PyCFunction)PyCursesWindow_GetMaxYX},
{"clear", (PyCFunction)PyCursesWindow_Clear},
{"clrtobot", (PyCFunction)PyCursesWindow_ClearToBottom},
{"clrtoeol", (PyCFunction)PyCursesWindow_ClearToEOL},
{"scroll", (PyCFunction)PyCursesWindow_Scroll},
{"touchwin", (PyCFunction)PyCursesWindow_TouchWin},
{"touchline", (PyCFunction)PyCursesWindow_TouchLine},
{"getch", (PyCFunction)PyCursesWindow_GetCh},
{"getstr", (PyCFunction)PyCursesWindow_GetStr},
{"inch", (PyCFunction)PyCursesWindow_InCh},
{"clearok", (PyCFunction)PyCursesWindow_ClearOk},
{"idlok", (PyCFunction)PyCursesWindow_IdlOk},
{"leaveok", (PyCFunction)PyCursesWindow_LeaveOk},
{"scrollok", (PyCFunction)PyCursesWindow_ScrollOk},
{"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion},
{"keypad", (PyCFunction)PyCursesWindow_KeyPad},
{"nodelay", (PyCFunction)PyCursesWindow_NoDelay},
{"notimeout", (PyCFunction)PyCursesWindow_NoTimeout},
{NULL, (PyCFunction)NULL} /* sentinel */
{"refresh", PyCursesWindow_Refresh},
{"nooutrefresh", PyCursesWindow_NoOutRefresh},
{"mvwin", PyCursesWindow_MoveWin},
{"move", PyCursesWindow_Move},
{"subwin", PyCursesWindow_SubWin},
{"addch", PyCursesWindow_AddCh},
{"insch", PyCursesWindow_InsCh},
{"delch", PyCursesWindow_DelCh},
{"echochar", PyCursesWindow_EchoChar},
{"addstr", PyCursesWindow_AddStr},
{"attron", PyCursesWindow_AttrOn},
{"attroff", PyCursesWindow_AttrOff},
{"attrset", PyCursesWindow_AttrSet},
{"standend", PyCursesWindow_StandEnd},
{"standout", PyCursesWindow_StandOut},
{"border", PyCursesWindow_Border, METH_VARARGS},
{"box", PyCursesWindow_Box},
{"hline", PyCursesWindow_Hline},
{"vline", PyCursesWindow_Vline},
{"erase", PyCursesWindow_Erase},
{"deleteln", PyCursesWindow_DeleteLine},
{"insertln", PyCursesWindow_InsertLine},
{"getyx", PyCursesWindow_GetYX},
{"getbegyx", PyCursesWindow_GetBegYX},
{"getmaxyx", PyCursesWindow_GetMaxYX},
{"clear", PyCursesWindow_Clear},
{"clrtobot", PyCursesWindow_ClearToBottom},
{"clrtoeol", PyCursesWindow_ClearToEOL},
{"scroll", PyCursesWindow_Scroll},
{"touchwin", PyCursesWindow_TouchWin},
{"touchline", PyCursesWindow_TouchLine},
{"getch", PyCursesWindow_GetCh},
{"getstr", PyCursesWindow_GetStr},
{"inch", PyCursesWindow_InCh},
{"clearok", PyCursesWindow_ClearOk},
{"idlok", PyCursesWindow_IdlOk},
{"leaveok", PyCursesWindow_LeaveOk},
{"scrollok", PyCursesWindow_ScrollOk},
{"setscrreg", PyCursesWindow_SetScrollRegion},
{"keypad", PyCursesWindow_KeyPad},
{"nodelay", PyCursesWindow_NoDelay},
{"notimeout", PyCursesWindow_NoTimeout},
{NULL, NULL} /* sentinel */
};
static PyObject *
@ -1086,11 +1178,10 @@ PyCurses_InitScr(self, args)
PyObject * self;
PyObject * args;
{
static int already_inited = FALSE;
WINDOW *win;
if (!PyArg_NoArgs(args))
return NULL;
if (already_inited == TRUE) {
if (initialised == TRUE) {
wrefresh(stdscr);
return (PyObject *)PyCursesWindow_New(stdscr);
}
@ -1101,7 +1192,7 @@ PyCurses_InitScr(self, args)
return NULL;
}
already_inited = TRUE;
initialised = TRUE;
/* This was moved from initcurses() because core dumped on SGI */
/* Also, they are probably not defined until you've called initscr() */
@ -1143,7 +1234,7 @@ PyCurses_EndWin(self, args)
PyObject * self;
PyObject * args;
{
if (!PyArg_NoArgs(args))
if (!PyArg_NoArgs(args) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(endwin(), "endwin");
}
@ -1168,7 +1259,7 @@ PyCurses_DoUpdate(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(doupdate(), "doupdate");
}
@ -1181,6 +1272,8 @@ PyCurses_NewWindow(self,arg)
WINDOW *win;
int nlines, ncols, begin_y, begin_x;
if (!PyCursesInitialised())
return NULL;
nlines = ncols = 0;
switch (ARG_COUNT(arg)) {
case 2:
@ -1211,7 +1304,7 @@ PyCurses_Beep(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
beep();
Py_INCREF(Py_None);
@ -1223,7 +1316,7 @@ PyCurses_Flash(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
flash();
Py_INCREF(Py_None);
@ -1236,7 +1329,7 @@ PyCurses_UngetCh(self,arg)
PyObject * arg;
{
int ch;
if (!PyArg_Parse(arg,"i;integer",&ch))
if (!PyArg_Parse(arg,"i;integer",&ch) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(ungetch(ch), "ungetch");
}
@ -1246,7 +1339,7 @@ PyCurses_FlushInp(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
flushinp();
Py_INCREF(Py_None);
@ -1258,7 +1351,7 @@ PyCurses_CBreak(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(cbreak(), "cbreak");
}
@ -1268,7 +1361,7 @@ PyCurses_NoCBreak(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(nocbreak(), "nocbreak");
}
@ -1278,7 +1371,7 @@ PyCurses_Echo(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(echo(), "echo");
}
@ -1288,7 +1381,7 @@ PyCurses_NoEcho(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(noecho(), "noecho");
}
@ -1298,7 +1391,7 @@ PyCurses_Nl(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(nl(), "nl");
}
@ -1308,7 +1401,7 @@ PyCurses_NoNl(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(nonl(), "nonl");
}
@ -1318,7 +1411,7 @@ PyCurses_Raw(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(raw(), "raw");
}
@ -1328,7 +1421,7 @@ PyCurses_NoRaw(self,arg)
PyObject * self;
PyObject * arg;
{
if (!PyArg_NoArgs(arg))
if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(noraw(), "noraw");
}
@ -1350,7 +1443,7 @@ PyCurses_Meta(self,arg)
PyObject * arg;
{
int ch;
if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch))
if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch) || !PyCursesInitialised())
return NULL;
return PyCursesCheckERR(meta(stdscr, ch), "meta");
}