/***********************************************************
Copyright 1994 by Lance Ellinghouse,
Cathedral City, California Republic, United States of America.

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and its 
documentation for any purpose and without fee is hereby granted, 
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in 
supporting documentation, and that the name of Lance Ellinghouse
not be used in advertising or publicity pertaining to distribution 
of the software without specific, written prior permission.

LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE BE LIABLE FOR ANY SPECIAL, 
INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 
FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

******************************************************************/

/******************************************************************
This is a curses implementation. I have tried to be as complete
as possible. If there are functions you need that are not included,
please let me know and/or send me some diffs.

There are 3 basic types exported by this module:
   1) Screen - This is not currently used
   2) Window - This is the basic type. This is equivalent to "WINDOW *".
   3) Pad    - This is similar to Window, but works with Pads as defined
               in curses.

Most of the routines can be looked up using the curses man page.

Here is a list of the currently supported methods and attributes
in the curses module:

Return Value      Func/Attr            Description
--------------------------------------------------------------------------
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?
None              doupdate()           Updates screen
WindowObject      newwin(nlines,ncols,begin_y,begin_x)
                  newwin(begin_y,begin_x)
                                       newwin() creates and returns
                                       a new window.
None              beep()               Beep the screen if possible
None              flash()              Flash the screen if possible
None              ungetch(int)         Push the int back so next getch()
                                       will return it.
                                       Note: argument is an INT, not a CHAR
None              flushinp()           Flush all input buffers
None              cbreak()             Enter cbreak mode
None              nocbreak()           Leave cbreak mode
None              echo()               Enter echo mode
None              noecho()             Leave echo mode
None              nl()                 Enter nl mode
None              nonl()               Leave nl mode
None              raw()                Enter raw mode
None              noraw()              Leave raw mode
None              intrflush(int)       Set or reset interruptable flush
                                       mode, int=1 if set, 0 if notset.
None              meta(int)            Allow 8 bit or 7 bit chars.
                                       int=1 is 8 bit, int=0 is 7 bit
StringObject      keyname(int)         return the text representation
                                       of a KEY_ value. (see below)

Here is a list of the currently supported methods and attributes
in the WindowObject:

Return Value      Func/Attr            Description
--------------------------------------------------------------------------
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)
None              addch(y,x,ch,attr)
                  addch(y,x,ch)
                  addch(ch,attr)
                  addch(ch)
None              insch(y,x,ch,attr)
                  insch(y,x,ch)
                  insch(ch,attr)
                  insch(ch)
None              delch(y,x)
                  delch()
None              echochar(ch,attr)
                  echochar(ch)
None              addstr(y,x,str,attr)
                  addstr(y,x,str)
                  addstr(str,attr)
                  addstr(str)
None              attron(attr)
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()
(y,x)             getyx()
(y,x)             getbegyx()
(y,x)             getmaxyx()
None              clear()
None              clrtobot()
None              clrtoeol()
None              scroll()
                  scroll(nlines)
None              touchwin()
None              touchline(start,count)
IntObject         getch(y,x)
                  getch()
StringObject      getstr(y,x)
                  getstr()
IntObject         inch(y,x)
                  inch()
None              clearok(int)      int=0 or int=1
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
******************************************************************/


/* curses module */

#include "Python.h"

#ifdef HAVE_NCURSES_H
/* Now let's hope there aren't systems that have a broken ncurses.h */
#include <ncurses.h>
#else
#include <curses.h>
#endif

typedef struct {
	PyObject_HEAD
	SCREEN *scr;
} PyCursesScreenObject;

typedef struct {
	PyObject_HEAD
	WINDOW *win;
	WINDOW *parent;
} PyCursesWindowObject;

typedef struct {
	PyObject_HEAD
	WINDOW *pad;
} PyCursesPadObject;

#if 0
staticforward PyTypeObject PyCursesScreen_Type;
#endif
staticforward PyTypeObject PyCursesWindow_Type;
#if 0
staticforward PyTypeObject PyCursesPad_Type;
#endif

#define PyCursesScreen_Check(v)	 ((v)->ob_type == &PyCursesScreen_Type)
#define PyCursesWindow_Check(v)	 ((v)->ob_type == &PyCursesWindow_Type)
#define PyCursesPad_Check(v)	 ((v)->ob_type == &PyCursesPad_Type)

/* Defines */
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";

/* 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))

/******************************************************************

Change Log:

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.
    Added border(), hline() and vline() window methods.

Version 1.1: 94/08/31:
    Minor fixes given by Guido.
    Changed 'ncurses' to 'curses'
    Changed '__version__' to 'version'
    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

******************************************************************/

static char *PyCursesVersion = "1.2";

/*
 * 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;
  }
}


static int
PyCursesInitialised()
{
  if (initialised == TRUE)
    return 1;
  else {
    PyErr_SetString(PyCursesError, "must call initscr() first");
    return 0;
  }
}


/* ------------- SCREEN routines --------------- */

#ifdef NOT_YET
static PyObject *
PyCursesScreen_New(arg)
	PyObject * arg;
{
        char *term_type;
	PyFileObject *in_fo;
	PyFileObject *out_fo;
	PyCursesScreenObject *xp;
	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 = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
	if (wo == NULL)
		return NULL;
	wo->win = win;
	wo->parent = (WINDOW *)NULL;
	return (PyObject *)wo;
}

static void
PyCursesWindow_Dealloc(wo)
	PyCursesWindowObject *wo;
{
  if (wo->win != stdscr)
    delwin(wo->win);
  PyMem_DEL(wo);
}

static PyObject *
PyCursesWindow_Refresh(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg))
    return NULL;
  return PyCursesCheckERR(wrefresh(self->win), "wrefresh");
}

static PyObject *
PyCursesWindow_NoOutRefresh(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg))
    return NULL;
  return PyCursesCheckERR(wnoutrefresh(self->win), "wnoutrefresh");
}

static PyObject *
PyCursesWindow_MoveWin(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int x, y;
  if (!PyArg_Parse(arg,"(ii);y,x", &y, &x))
    return NULL;
  return PyCursesCheckERR(mvwin(self->win,y,x), "mvwin");
}

static PyObject *
PyCursesWindow_Move(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int x, y;
  if (!PyArg_Parse(arg,"(ii);y,x", &y, &x))
    return NULL;
  return PyCursesCheckERR(wmove(self->win,y,x), "wmove");
}

static PyObject *
PyCursesWindow_SubWin(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  WINDOW *win;
  PyCursesWindowObject *rtn_win;
  int nlines, ncols, begin_y, begin_x;

  nlines = 0;
  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))
      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) {
    PyErr_SetString(PyCursesError, catchall_NULL);
    return NULL;
  }
  rtn_win = (PyCursesWindowObject *)PyCursesWindow_New(win);
  rtn_win->parent = self->win;
  return (PyObject *)rtn_win;
}

static PyObject *
PyCursesWindow_AddCh(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int rtn;
  int x, y;
  int ch;
  int attr, attr_old = 0;
  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:
      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:
      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);
  }
  if (use_xy == TRUE)
    rtn = mvwaddch(self->win,y,x,ch);
  else
    rtn = waddch(self->win,ch);
  if (use_attr == TRUE)
    wattrset(self->win,attr_old);

  return PyCursesCheckERR(rtn, "[mv]waddch");
}

static PyObject *
PyCursesWindow_InsCh(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int rtn;
  int x, y;
  int ch;
  int attr, attr_old = 0;
  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:
      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:
      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);
  }
  if (use_xy == TRUE)
    rtn = mvwinsch(self->win,y,x,ch);
  else
    rtn = winsch(self->win,ch);
  if (use_attr == TRUE)
    wattrset(self->win,attr_old);

  return PyCursesCheckERR(rtn, "[mv]winsch");
}

static PyObject *
PyCursesWindow_DelCh(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int rtn;
  int x, y;

  switch (ARG_COUNT(arg)) {
  case 0:
    rtn = wdelch(self->win);
    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;
  }

  return PyCursesCheckERR(rtn, "[mv]wdelch");
}

static PyObject *
PyCursesWindow_EchoChar(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int rtn;
  int ch;
  int attr, attr_old;

  switch (ARG_COUNT(arg)) {
  case 1:
    if (!PyArg_Parse(arg,"i;ch", &ch))
      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);
    wattrset(self->win,attr_old);
    break;
  default:
    PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
    return NULL;
  }

  return PyCursesCheckERR(rtn, "wechochar");
}

static PyObject *
PyCursesWindow_AddStr(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int rtn;
  int x, y;
  char *str;
  int attr, attr_old = 0;
  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);
  }
  if (use_xy == TRUE)
    rtn = mvwaddstr(self->win,y,x,str);
  else
    rtn = waddstr(self->win,str);
  if (use_attr == TRUE)
    wattrset(self->win,attr_old);

  return PyCursesCheckERR(rtn, "[mv]waddstr");
}

static PyObject *
PyCursesWindow_AttrOn(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int ch;
  if (!PyArg_Parse(arg,"i;attr", &ch))
      return NULL;
  wattron(self->win,ch);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_AttrOff(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int ch;
  if (!PyArg_Parse(arg,"i;attr", &ch))
      return NULL;
  wattroff(self->win,ch);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_AttrSet(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int ch;
  if (!PyArg_Parse(arg,"i;attr", &ch))
      return NULL;
  wattrset(self->win,ch);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_StandEnd(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg))
      return NULL;
  wstandend(self->win);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_StandOut(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg))
      return NULL;
  wstandout(self->win);
  Py_INCREF(Py_None);
  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_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;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg))
      return NULL;
  werase(self->win);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_DeleteLine(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg))
      return NULL;
  return PyCursesCheckERR(wdeleteln(self->win), "wdeleteln");
}

static PyObject *
PyCursesWindow_InsertLine(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg))
      return NULL;
  return PyCursesCheckERR(winsertln(self->win), "winsertln");
}

static PyObject *
PyCursesWindow_GetYX(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int x, y;
  if (!PyArg_NoArgs(arg))
      return NULL;
  getyx(self->win,y,x);
  return Py_BuildValue("(ii)", y, x);
}

static PyObject *
PyCursesWindow_GetBegYX(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int x, y;
  if (!PyArg_NoArgs(arg))
      return NULL;
  getbegyx(self->win,y,x);
  return Py_BuildValue("(ii)", y, x);
}

static PyObject *
PyCursesWindow_GetMaxYX(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int x, y;
  if (!PyArg_NoArgs(arg))
      return NULL;
  getmaxyx(self->win,y,x);
  return Py_BuildValue("(ii)", y, x);
}

static PyObject *
PyCursesWindow_Clear(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg))
      return NULL;
  wclear(self->win);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_ClearToBottom(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg))
      return NULL;
  wclrtobot(self->win);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_ClearToEOL(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg))
      return NULL;
  wclrtoeol(self->win);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_Scroll(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int nlines;
  int use_nlines = FALSE;
  switch (ARG_COUNT(arg)) {
  case 0:
    break;
  case 1:
    if (!PyArg_Parse(arg, "i;nlines", &nlines))
      return NULL;
    use_nlines = TRUE;
    break;
  default:
    PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
    return NULL;
  }
  if (use_nlines)
    return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
  else
    return PyCursesCheckERR(scroll(self->win), "scroll");
}

static PyObject *
PyCursesWindow_TouchWin(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg))
      return NULL;
  return PyCursesCheckERR(touchwin(self->win), "touchwin");
}

static PyObject *
PyCursesWindow_TouchLine(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int st, cnt;
  if (!PyArg_Parse(arg,"(ii);start,count",&st,&cnt))
      return NULL;
  return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
}

static PyObject *
PyCursesWindow_GetCh(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int x, y;
  int rtn;

  switch (ARG_COUNT(arg)) {
  case 0:
    rtn = wgetch(self->win);
    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 *
PyCursesWindow_GetStr(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int x, y;
  char rtn[1024]; /* This should be big enough.. I hope */
  int rtn2;

  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 PyString_FromString(rtn);
}

static PyObject *
PyCursesWindow_InCh(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int x, y, rtn;

  switch (ARG_COUNT(arg)) {
  case 0:
    rtn = winch(self->win);
    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 *
PyCursesWindow_ClearOk(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int val;
  if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val))
    return NULL;
  clearok(self->win,val);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_IdlOk(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int val;
  if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val))
    return NULL;
  idlok(self->win,val);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_LeaveOk(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int val;
  if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val))
    return NULL;
  leaveok(self->win,val);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_ScrollOk(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int val;
  if (!PyArg_Parse(arg,"i;True(1) or False(0)",&val))
    return NULL;
  scrollok(self->win,val);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_SetScrollRegion(self,arg)
     PyCursesWindowObject *self;
     PyObject * arg;
{
  int x, y;
  if (!PyArg_Parse(arg,"(ii);top, bottom",&y,&x))
    return NULL;
  return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
}

static PyObject *
PyCursesWindow_KeyPad(self,arg)
     PyCursesWindowObject * self;
     PyObject * arg;
{
  int ch;
  if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch))
    return NULL;
  keypad(self->win,ch);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_NoDelay(self,arg)
     PyCursesWindowObject * self;
     PyObject * arg;
{
  int ch;
  if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch))
    return NULL;
  nodelay(self->win,ch);
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCursesWindow_NoTimeout(self,arg)
     PyCursesWindowObject * self;
     PyObject * arg;
{
  int ch;
  if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch))
    return NULL;
  notimeout(self->win,ch);
  Py_INCREF(Py_None);
  return Py_None;
}

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},
	{"border",          (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
	{"box",             (PyCFunction)PyCursesWindow_Box},
	{"hline",           (PyCFunction)PyCursesWindow_Hline},
	{"vline",           (PyCFunction)PyCursesWindow_Vline},
	{"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,		        NULL}   /* sentinel */
};

static PyObject *
PyCursesWindow_GetAttr(self, name)
	PyCursesWindowObject *self;
	char *name;
{
  return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
}


/* --------------- PAD routines ---------------- */

#ifdef NOT_YET
static PyObject *
PyCursesPad_New(pad)
	WINDOW *pad;
{
	PyCursesPadObject *po;
	po = PyObject_NEW(PyCursesPadObject, &PyCursesPad_Type);
	if (po == NULL)
		return NULL;
	po->pad = pad;
	return (PyObject *)po;
}
#endif


/* -------------------------------------------------------*/

#if 0
static PyTypeObject PyCursesScreen_Type = {
	PyObject_HEAD_INIT(&PyType_Type)
	0,			/*ob_size*/
	"curses screen",	/*tp_name*/
	sizeof(PyCursesScreenObject),	/*tp_basicsize*/
	0,			/*tp_itemsize*/
	/* methods */
	(destructor)0 /*PyCursesScreen_Dealloc*/, /*tp_dealloc*/
	0,			/*tp_print*/
	(getattrfunc)0, /*tp_getattr*/
	(setattrfunc)0, /*tp_setattr*/
	0,			/*tp_compare*/
	0,			/*tp_repr*/
	0,			/*tp_as_number*/
	0,			/*tp_as_sequence*/
	0,			/*tp_as_mapping*/
	0,			/*tp_hash*/
};
#endif

static PyTypeObject PyCursesWindow_Type = {
	PyObject_HEAD_INIT(&PyType_Type)
	0,			/*ob_size*/
	"curses window",	/*tp_name*/
	sizeof(PyCursesWindowObject),	/*tp_basicsize*/
	0,			/*tp_itemsize*/
	/* methods */
	(destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
	0,			/*tp_print*/
	(getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
	(setattrfunc)0, /*tp_setattr*/
	0,			/*tp_compare*/
	0,			/*tp_repr*/
	0,			/*tp_as_number*/
	0,			/*tp_as_sequence*/
	0,			/*tp_as_mapping*/
	0,			/*tp_hash*/
};

#if 0
static PyTypeObject PyCursesPad_Type = {
	PyObject_HEAD_INIT(&PyType_Type)
	0,			/*ob_size*/
	"curses pad",	/*tp_name*/
	sizeof(PyCursesPadObject),	/*tp_basicsize*/
	0,			/*tp_itemsize*/
	/* methods */
	(destructor)0 /*PyCursesPad_Dealloc*/, /*tp_dealloc*/
	0,			/*tp_print*/
	(getattrfunc)0, /*tp_getattr*/
	(setattrfunc)0, /*tp_setattr*/
	0,			/*tp_compare*/
	0,			/*tp_repr*/
	0,			/*tp_as_number*/
	0,			/*tp_as_sequence*/
	0,			/*tp_as_mapping*/
	0,			/*tp_hash*/
};
#endif


/* -------------------------------------------------------*/

static PyObject *ModDict;

static PyObject * 
PyCurses_InitScr(self, args)
     PyObject * self;
     PyObject * args;
{
  WINDOW *win;
  if (!PyArg_NoArgs(args))
    return NULL;
  if (initialised == TRUE) {
    wrefresh(stdscr);
    return (PyObject *)PyCursesWindow_New(stdscr);
  }

  win = initscr();
  if (win == NULL) {
    PyErr_SetString(PyCursesError, catchall_NULL);
    return NULL;
  }

  initialised = TRUE;

/* This was moved from initcurses() because core dumped on SGI */
/* 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 */
        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_LARROW));
	SetDictInt("ACS_RARROW",  (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);
}

static PyObject * 
PyCurses_EndWin(self, args)
     PyObject * self;
     PyObject * args;
{
  if (!PyArg_NoArgs(args) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(endwin(), "endwin");
}

static PyObject * 
PyCurses_IsEndWin(self, args)
     PyObject * self;
     PyObject * args;
{
  if (!PyArg_NoArgs(args))
    return NULL;
  if (isendwin() == FALSE) {
    Py_INCREF(Py_False);
    return Py_False;
  }
  Py_INCREF(Py_True);
  return Py_True;
}

static PyObject *
PyCurses_DoUpdate(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(doupdate(), "doupdate");
}

static PyObject *
PyCurses_NewWindow(self,arg)
     PyObject * self;
     PyObject * arg;
{
  WINDOW *win;
  int nlines, ncols, begin_y, begin_x;

  if (!PyCursesInitialised())
    return NULL;
  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))
      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) {
    PyErr_SetString(PyCursesError, catchall_NULL);
    return NULL;
  }

  return (PyObject *)PyCursesWindow_New(win);
}

static PyObject *
PyCurses_Beep(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  beep();
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCurses_Flash(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  flash();
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCurses_UngetCh(self,arg)
     PyObject * self;
     PyObject * arg;
{
  int ch;
  if (!PyArg_Parse(arg,"i;integer",&ch) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(ungetch(ch), "ungetch");
}

static PyObject *
PyCurses_FlushInp(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  flushinp();
  Py_INCREF(Py_None);
  return Py_None;
}

static PyObject *
PyCurses_CBreak(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(cbreak(), "cbreak");
}

static PyObject *
PyCurses_NoCBreak(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(nocbreak(), "nocbreak");
}

static PyObject *
PyCurses_Echo(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(echo(), "echo");
}

static PyObject *
PyCurses_NoEcho(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(noecho(), "noecho");
}

static PyObject *
PyCurses_Nl(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(nl(), "nl");
}

static PyObject *
PyCurses_NoNl(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(nonl(), "nonl");
}

static PyObject *
PyCurses_Raw(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(raw(), "raw");
}

static PyObject *
PyCurses_NoRaw(self,arg)
     PyObject * self;
     PyObject * arg;
{
  if (!PyArg_NoArgs(arg) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(noraw(), "noraw");
}

static PyObject *
PyCurses_IntrFlush(self,arg)
     PyObject * self;
     PyObject * arg;
{
  int ch;
  if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch))
    return NULL;
  return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
}

static PyObject *
PyCurses_Meta(self,arg)
     PyObject * self;
     PyObject * arg;
{
  int ch;
  if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch) || !PyCursesInitialised())
    return NULL;
  return PyCursesCheckERR(meta(stdscr, ch), "meta");
}

static PyObject *
PyCurses_KeyName(self,arg)
     PyObject * self;
     PyObject * arg;
{
  const char *knp;
  int ch;
  if (!PyArg_Parse(arg,"i",&ch))
    return NULL;
  knp = keyname(ch);
  return PyString_FromString((knp == NULL) ? "" : knp);
}

#ifdef NOT_YET
static PyObject * 
PyCurses_NewTerm(self, args)
     PyObject * self;
     PyObject * args;
{
}

static PyObject * 
PyCurses_SetTerm(self, args)
     PyObject * self;
     PyObject * args;
{
}
#endif

/* List of functions defined in the module */

static PyMethodDef PyCurses_methods[] = {
	{"initscr",             (PyCFunction)PyCurses_InitScr},
	{"endwin",              (PyCFunction)PyCurses_EndWin},
	{"isendwin",            (PyCFunction)PyCurses_IsEndWin},
	{"doupdate",            (PyCFunction)PyCurses_DoUpdate},
	{"newwin",              (PyCFunction)PyCurses_NewWindow},
	{"beep",                (PyCFunction)PyCurses_Beep},
	{"flash",               (PyCFunction)PyCurses_Flash},
	{"ungetch",             (PyCFunction)PyCurses_UngetCh},
	{"flushinp",            (PyCFunction)PyCurses_FlushInp},
	{"cbreak",              (PyCFunction)PyCurses_CBreak},
	{"nocbreak",            (PyCFunction)PyCurses_NoCBreak},
	{"echo",                (PyCFunction)PyCurses_Echo},
	{"noecho",              (PyCFunction)PyCurses_NoEcho},
	{"nl",                  (PyCFunction)PyCurses_Nl},
	{"nonl",                (PyCFunction)PyCurses_NoNl},
	{"raw",                 (PyCFunction)PyCurses_Raw},
	{"noraw",               (PyCFunction)PyCurses_NoRaw},
	{"intrflush",           (PyCFunction)PyCurses_IntrFlush},
	{"meta",                (PyCFunction)PyCurses_Meta},
	{"keyname",             (PyCFunction)PyCurses_KeyName},
#ifdef NOT_YET
	{"newterm",             (PyCFunction)PyCurses_NewTerm},
	{"set_term",            (PyCFunction)PyCurses_SetTerm},
#endif
	{NULL,		NULL}		/* sentinel */
};

/* Initialization function for the module */

DL_EXPORT(void)
initcurses()
{
	PyObject *m, *d, *v;

	/* Create the module and add the functions */
	m = Py_InitModule("curses", PyCurses_methods);

	/* Add some symbolic constants to the module */
	d = PyModule_GetDict(m);
	ModDict = d; /* For PyCurses_InitScr */

	/* For exception curses.error */
	PyCursesError = PyErr_NewException("curses.error", NULL, NULL);
	PyDict_SetItemString(d, "error", PyCursesError);

	/* Make the version available */
	v = PyString_FromString(PyCursesVersion);
	PyDict_SetItemString(d, "version", v);
	PyDict_SetItemString(d, "__version__", v);
	Py_DECREF(v);

	/* Here are some attributes you can add to chars to print */
	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 */
	{
	  int key;
	  char *key_n;
	  char *key_n2;
	  for (key=KEY_MIN;key < KEY_MAX; key++) {
	    key_n = (char *)keyname(key);
	    if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
	      continue;
	    if (strncmp(key_n,"KEY_F(",6)==0) {
	      char *p1, *p2;
	      key_n2 = malloc(strlen(key_n)+1);
	      p1 = key_n;
	      p2 = key_n2;
	      while (*p1) {
		if (*p1 != '(' && *p1 != ')') {
		  *p2 = *p1;
		  p2++;
		}
		p1++;
	      }
	      *p2 = (char)0;
	    } else
	      key_n2 = key_n;
	    PyDict_SetItemString(d,key_n2,PyInt_FromLong((long) key));
	    if (key_n2 != key_n)
	      free(key_n2);
	  }
	  SetDictInt("KEY_MIN", KEY_MIN);
	  SetDictInt("KEY_MAX", KEY_MAX);
	}
}
