Export C API from this module.

Remove several macros and #includes; py_curses.h contains them now.
This commit is contained in:
Andrew M. Kuchling 2000-12-22 21:52:27 +00:00
parent 0c7a0bdf4a
commit 3255268777
1 changed files with 47 additions and 99 deletions

View File

@ -95,23 +95,19 @@ Form extension (ncurses and probably SYSV):
/* Release Number */ /* Release Number */
char *PyCursesVersion = "1.6"; char *PyCursesVersion = "2.1";
/* Includes */ /* Includes */
#include "Python.h" #include "Python.h"
#define CURSES_MODULE
#include "py_curses.h"
#ifdef __osf__ #ifdef __osf__
#define _XOPEN_SOURCE_EXTENDED /* Define macro for OSF/1 */ #define _XOPEN_SOURCE_EXTENDED /* Define macro for OSF/1 */
#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */ #define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
#endif #endif
#ifdef HAVE_NCURSES_H
#include <ncurses.h>
#else
#include <curses.h>
#endif
/* These prototypes are in <term.h>, but including this header /* These prototypes are in <term.h>, but including this header
#defines many common symbols (such as "lines") which breaks the #defines many common symbols (such as "lines") which breaks the
curses module in other ways. So the code will just specify curses module in other ways. So the code will just specify
@ -130,46 +126,40 @@ typedef chtype attr_t; /* No attr_t type is available */
static PyObject *PyCursesError; static PyObject *PyCursesError;
/* general error messages */
static char *catchall_ERR = "curses function returned ERR";
static char *catchall_NULL = "curses function returned NULL";
/* Tells whether setupterm() has been called to initialise terminfo. */ /* Tells whether setupterm() has been called to initialise terminfo. */
static int initialised_setupterm = FALSE; static int initialised_setupterm = FALSE;
/* Tells whether initscr() has been called to initialise curses. */ /* Tells whether initscr() has been called to initialise curses. */
static int initialised = FALSE; static int initialised = FALSE;
/* Tells whether start_color() has been called to initialise colorusage. */ /* Tells whether start_color() has been called to initialise color usage. */
static int initialisedcolors = FALSE; static int initialisedcolors = FALSE;
/* Utility Macros */ /* Utility Macros */
#define ARG_COUNT(X) \
(((X) == NULL) ? 0 : (PyTuple_Check(X) ? PyTuple_Size(X) : 1))
#define PyCursesSetupTermCalled \ #define PyCursesSetupTermCalled \
if (initialised_setupterm != TRUE) { \ if (initialised_setupterm != TRUE) { \
PyErr_SetString(PyCursesError, \ PyErr_SetString(PyCursesError, \
"must call (at least) setupterm() first"); \ "must call (at least) setupterm() first"); \
return NULL; } return 0; }
#define PyCursesInitialised \ #define PyCursesInitialised \
if (initialised != TRUE) { \ if (initialised != TRUE) { \
PyErr_SetString(PyCursesError, \ PyErr_SetString(PyCursesError, \
"must call initscr() first"); \ "must call initscr() first"); \
return NULL; } return 0; }
#define PyCursesInitialisedColor \ #define PyCursesInitialisedColor \
if (initialisedcolors != TRUE) { \ if (initialisedcolors != TRUE) { \
PyErr_SetString(PyCursesError, \ PyErr_SetString(PyCursesError, \
"must call start_color() first"); \ "must call start_color() first"); \
return NULL; } return 0; }
/* Utility Functions */ /* Utility Functions */
/* /*
* Check the return code from a curses function and return None * Check the return code from a curses function and return None
* or raise an exception as appropriate. * or raise an exception as appropriate. These are exported using the
* CObject API.
*/ */
static PyObject * static PyObject *
@ -202,22 +192,36 @@ PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
return 1; return 1;
} }
/* Function versions of the 3 functions for tested whether curses has been
initialised or not. */
static int func_PyCursesSetupTermCalled(void)
{
PyCursesSetupTermCalled;
return 1;
}
static int func_PyCursesInitialised(void)
{
PyCursesInitialised;
return 1;
}
static int func_PyCursesInitialisedColor(void)
{
PyCursesInitialisedColor;
return 1;
}
/***************************************************************************** /*****************************************************************************
The Window Object The Window Object
******************************************************************************/ ******************************************************************************/
/* Definition of the window object and window type */ /* Definition of the window type */
typedef struct {
PyObject_HEAD
WINDOW *win;
} PyCursesWindowObject;
PyTypeObject PyCursesWindow_Type; PyTypeObject PyCursesWindow_Type;
#define PyCursesWindow_Check(v) ((v)->ob_type == &PyCursesWindow_Type) /* Function prototype macros for Window object
/* Function Prototype Macros - They are ugly but very, very useful. ;-)
X - function name X - function name
TYPE - parameter Type TYPE - parameter Type
@ -1458,75 +1462,6 @@ PyTypeObject PyCursesWindow_Type = {
Global Functions Global Functions
**********************************************************************/ **********************************************************************/
static PyObject *ModDict;
/* Function Prototype Macros - They are ugly but very, very useful. ;-)
X - function name
TYPE - parameter Type
ERGSTR - format string for construction of the return value
PARSESTR - format string for argument parsing
*/
#define NoArgNoReturnFunction(X) \
static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
{ \
PyCursesInitialised \
if (!PyArg_NoArgs(args)) return NULL; \
return PyCursesCheckERR(X(), # X); }
#define NoArgOrFlagNoReturnFunction(X) \
static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
{ \
int flag = 0; \
PyCursesInitialised \
switch(ARG_COUNT(args)) { \
case 0: \
return PyCursesCheckERR(X(), # X); \
case 1: \
if (!PyArg_Parse(args, "i;True(1) or False(0)", &flag)) return NULL; \
if (flag) return PyCursesCheckERR(X(), # X); \
else return PyCursesCheckERR(no ## X (), # X); \
default: \
PyErr_SetString(PyExc_TypeError, # X " requires 0 or 1 arguments"); \
return NULL; } }
#define NoArgReturnIntFunction(X) \
static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
{ \
PyCursesInitialised \
if (!PyArg_NoArgs(args)) return NULL; \
return PyInt_FromLong((long) X()); }
#define NoArgReturnStringFunction(X) \
static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
{ \
PyCursesInitialised \
if (!PyArg_NoArgs(args)) return NULL; \
return PyString_FromString(X()); }
#define NoArgTrueFalseFunction(X) \
static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
{ \
PyCursesInitialised \
if (!PyArg_NoArgs(args)) return NULL; \
if (X () == FALSE) { \
Py_INCREF(Py_False); \
return Py_False; \
} \
Py_INCREF(Py_True); \
return Py_True; }
#define NoArgNoReturnVoidFunction(X) \
static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \
{ \
PyCursesInitialised \
if (!PyArg_NoArgs(args)) return NULL; \
X(); \
Py_INCREF(Py_None); \
return Py_None; }
NoArgNoReturnFunction(beep) NoArgNoReturnFunction(beep)
NoArgNoReturnFunction(def_prog_mode) NoArgNoReturnFunction(def_prog_mode)
NoArgNoReturnFunction(def_shell_mode) NoArgNoReturnFunction(def_shell_mode)
@ -1805,6 +1740,8 @@ PyCurses_Init_Pair(PyObject *self, PyObject *args)
return PyCursesCheckERR(init_pair(pair, f, b), "init_pair"); return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
} }
static PyObject *ModDict;
static PyObject * static PyObject *
PyCurses_InitScr(PyObject *self, PyObject *args) PyCurses_InitScr(PyObject *self, PyObject *args)
{ {
@ -2497,14 +2434,25 @@ static PyMethodDef PyCurses_methods[] = {
void void
init_curses(void) init_curses(void)
{ {
PyObject *m, *d, *v; PyObject *m, *d, *v, *c_api_object;
static void *PyCurses_API[PyCurses_API_pointers];
/* Initialize the C API pointer array */
PyCurses_API[0] = (void *)&PyCursesWindow_Type;
PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
PyCurses_API[2] = (void *)func_PyCursesInitialised;
PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
/* Create the module and add the functions */ /* Create the module and add the functions */
m = Py_InitModule("_curses", PyCurses_methods); m = Py_InitModule("_curses", PyCurses_methods);
/* Add some symbolic constants to the module */ /* Add some symbolic constants to the module */
d = PyModule_GetDict(m); d = PyModule_GetDict(m);
ModDict = d; /* For PyCurses_InitScr */ ModDict = d; /* For PyCurses_InitScr to use later */
/* Add a CObject for the C API */
c_api_object = PyCObject_FromVoidPtr((void *)PyCurses_API, NULL);
PyDict_SetItemString(d, "_C_API", c_api_object);
/* For exception curses.error */ /* For exception curses.error */
PyCursesError = PyErr_NewException("_curses.error", NULL, NULL); PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);