]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Steve Clifts version
authorGuido van Rossum <guido@python.org>
Fri, 17 Feb 1995 13:50:17 +0000 (13:50 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 17 Feb 1995 13:50:17 +0000 (13:50 +0000)
Modules/_cursesmodule.c

index d3841b747195181247411c3f8b23bdbdc85bc63c..4b45403ecd9602ba77b969e4adf0514dac5759af 100644 (file)
@@ -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");
 }