1991-02-19 08:39:46 -04:00
|
|
|
|
1990-10-14 09:07:46 -03:00
|
|
|
/* Module support implementation */
|
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
#include "Python.h"
|
1990-10-14 09:07:46 -03:00
|
|
|
|
1994-08-30 05:27:36 -03:00
|
|
|
typedef double va_double;
|
|
|
|
|
1997-11-19 14:53:33 -04:00
|
|
|
/* Package context -- the full module name for package imports */
|
|
|
|
char *_Py_PackageContext = NULL;
|
|
|
|
|
1997-08-02 00:07:46 -03:00
|
|
|
/* Py_InitModule4() parameters:
|
1995-01-09 13:47:20 -04:00
|
|
|
- name is the module name
|
|
|
|
- methods is the list of top-level functions
|
|
|
|
- doc is the documentation string
|
|
|
|
- passthrough is passed as self to functions defined in the module
|
|
|
|
- api_version is the value of PYTHON_API_VERSION at the time the
|
|
|
|
module was compiled
|
1997-08-02 00:07:46 -03:00
|
|
|
|
|
|
|
Return value is a borrowed reference to the module object; or NULL
|
|
|
|
if an error occurred (in Python 1.4 and before, errors were fatal).
|
|
|
|
Errors may still leak memory.
|
1995-01-07 08:43:18 -04:00
|
|
|
*/
|
1994-08-30 05:27:36 -03:00
|
|
|
|
1995-01-09 13:47:20 -04:00
|
|
|
static char api_version_warning[] =
|
2001-07-31 10:24:44 -03:00
|
|
|
"Python C API version mismatch for module %.100s:\
|
|
|
|
This Python has API version %d, module %.100s has version %d.";
|
1995-01-09 13:47:20 -04:00
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *
|
2000-07-22 15:47:25 -03:00
|
|
|
Py_InitModule4(char *name, PyMethodDef *methods, char *doc,
|
|
|
|
PyObject *passthrough, int module_api_version)
|
1990-10-14 09:07:46 -03:00
|
|
|
{
|
2003-01-31 14:33:18 -04:00
|
|
|
PyObject *m, *d, *v, *n;
|
1997-04-29 17:08:16 -03:00
|
|
|
PyMethodDef *ml;
|
2000-08-04 11:00:14 -03:00
|
|
|
if (!Py_IsInitialized())
|
|
|
|
Py_FatalError("Interpreter not initialized (version mismatch?)");
|
2001-07-31 10:24:44 -03:00
|
|
|
if (module_api_version != PYTHON_API_VERSION) {
|
|
|
|
char message[512];
|
|
|
|
PyOS_snprintf(message, sizeof(message),
|
|
|
|
api_version_warning, name,
|
|
|
|
PYTHON_API_VERSION, name,
|
|
|
|
module_api_version);
|
|
|
|
if (PyErr_Warn(PyExc_RuntimeWarning, message))
|
|
|
|
return NULL;
|
|
|
|
}
|
2003-01-31 14:33:18 -04:00
|
|
|
/* Make sure name is fully qualified.
|
|
|
|
|
|
|
|
This is a bit of a hack: when the shared library is loaded,
|
|
|
|
the module name is "package.module", but the module calls
|
|
|
|
Py_InitModule*() with just "module" for the name. The shared
|
|
|
|
library loader squirrels away the true name of the module in
|
|
|
|
_Py_PackageContext, and Py_InitModule*() will substitute this
|
|
|
|
(if the name actually matches).
|
|
|
|
*/
|
1997-11-19 14:53:33 -04:00
|
|
|
if (_Py_PackageContext != NULL) {
|
|
|
|
char *p = strrchr(_Py_PackageContext, '.');
|
|
|
|
if (p != NULL && strcmp(name, p+1) == 0) {
|
|
|
|
name = _Py_PackageContext;
|
|
|
|
_Py_PackageContext = NULL;
|
|
|
|
}
|
|
|
|
}
|
1997-08-02 00:07:46 -03:00
|
|
|
if ((m = PyImport_AddModule(name)) == NULL)
|
|
|
|
return NULL;
|
1997-04-29 17:08:16 -03:00
|
|
|
d = PyModule_GetDict(m);
|
2002-08-14 17:57:56 -03:00
|
|
|
if (methods != NULL) {
|
2003-01-31 14:33:18 -04:00
|
|
|
n = PyString_FromString(name);
|
|
|
|
if (n == NULL)
|
|
|
|
return NULL;
|
2002-08-14 17:57:56 -03:00
|
|
|
for (ml = methods; ml->ml_name != NULL; ml++) {
|
|
|
|
if ((ml->ml_flags & METH_CLASS) ||
|
|
|
|
(ml->ml_flags & METH_STATIC)) {
|
|
|
|
PyErr_SetString(PyExc_ValueError,
|
|
|
|
"module functions cannot set"
|
|
|
|
" METH_CLASS or METH_STATIC");
|
|
|
|
return NULL;
|
|
|
|
}
|
2003-01-31 14:33:18 -04:00
|
|
|
v = PyCFunction_NewEx(ml, passthrough, n);
|
2002-08-14 17:57:56 -03:00
|
|
|
if (v == NULL)
|
|
|
|
return NULL;
|
|
|
|
if (PyDict_SetItemString(d, ml->ml_name, v) != 0) {
|
|
|
|
Py_DECREF(v);
|
|
|
|
return NULL;
|
|
|
|
}
|
2001-08-04 00:11:25 -03:00
|
|
|
Py_DECREF(v);
|
|
|
|
}
|
1990-10-14 09:07:46 -03:00
|
|
|
}
|
1995-01-07 08:43:18 -04:00
|
|
|
if (doc != NULL) {
|
1997-04-29 17:08:16 -03:00
|
|
|
v = PyString_FromString(doc);
|
2001-08-04 00:11:25 -03:00
|
|
|
if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) {
|
2002-12-15 09:45:32 -04:00
|
|
|
Py_XDECREF(v);
|
1997-08-02 00:07:46 -03:00
|
|
|
return NULL;
|
2001-08-04 00:11:25 -03:00
|
|
|
}
|
1997-04-29 17:08:16 -03:00
|
|
|
Py_DECREF(v);
|
1995-01-07 08:43:18 -04:00
|
|
|
}
|
1990-12-20 11:06:42 -04:00
|
|
|
return m;
|
1990-10-14 09:07:46 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1993-02-08 11:49:17 -04:00
|
|
|
/* Helper for mkvalue() to scan the length of a format */
|
1992-04-13 12:53:41 -03:00
|
|
|
|
2003-01-30 11:08:25 -04:00
|
|
|
static int
|
|
|
|
countformat(char *format, int endchar)
|
1992-04-13 12:53:41 -03:00
|
|
|
{
|
|
|
|
int count = 0;
|
|
|
|
int level = 0;
|
|
|
|
while (level > 0 || *format != endchar) {
|
1995-01-02 15:04:15 -04:00
|
|
|
switch (*format) {
|
|
|
|
case '\0':
|
1992-04-13 12:53:41 -03:00
|
|
|
/* Premature end */
|
1997-04-29 17:08:16 -03:00
|
|
|
PyErr_SetString(PyExc_SystemError,
|
|
|
|
"unmatched paren in format");
|
1992-04-13 12:53:41 -03:00
|
|
|
return -1;
|
1995-01-02 15:04:15 -04:00
|
|
|
case '(':
|
|
|
|
case '[':
|
|
|
|
case '{':
|
1992-04-13 12:53:41 -03:00
|
|
|
if (level == 0)
|
|
|
|
count++;
|
|
|
|
level++;
|
1995-01-02 15:04:15 -04:00
|
|
|
break;
|
|
|
|
case ')':
|
|
|
|
case ']':
|
|
|
|
case '}':
|
1992-04-13 12:53:41 -03:00
|
|
|
level--;
|
1995-01-02 15:04:15 -04:00
|
|
|
break;
|
|
|
|
case '#':
|
1995-01-20 12:56:02 -04:00
|
|
|
case '&':
|
1995-01-02 15:04:15 -04:00
|
|
|
case ',':
|
|
|
|
case ':':
|
|
|
|
case ' ':
|
|
|
|
case '\t':
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (level == 0)
|
|
|
|
count++;
|
|
|
|
}
|
1992-04-13 12:53:41 -03:00
|
|
|
format++;
|
|
|
|
}
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Generic function to create a value -- the inverse of getargs() */
|
|
|
|
/* After an original idea and first implementation by Steven Miale */
|
|
|
|
|
2000-07-09 00:09:57 -03:00
|
|
|
static PyObject *do_mktuple(char**, va_list *, int, int);
|
|
|
|
static PyObject *do_mklist(char**, va_list *, int, int);
|
|
|
|
static PyObject *do_mkdict(char**, va_list *, int, int);
|
|
|
|
static PyObject *do_mkvalue(char**, va_list *);
|
1992-04-13 12:53:41 -03:00
|
|
|
|
1995-01-02 15:04:15 -04:00
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
static PyObject *
|
2000-07-22 15:47:25 -03:00
|
|
|
do_mkdict(char **p_format, va_list *p_va, int endchar, int n)
|
1995-01-02 15:04:15 -04:00
|
|
|
{
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *d;
|
1995-01-02 15:04:15 -04:00
|
|
|
int i;
|
2004-07-14 08:28:06 -03:00
|
|
|
int itemfailed = 0;
|
1995-01-02 15:04:15 -04:00
|
|
|
if (n < 0)
|
|
|
|
return NULL;
|
1997-04-29 17:08:16 -03:00
|
|
|
if ((d = PyDict_New()) == NULL)
|
1995-01-02 15:04:15 -04:00
|
|
|
return NULL;
|
2004-07-14 08:28:06 -03:00
|
|
|
/* Note that we can't bail immediately on error as this will leak
|
|
|
|
refcounts on any 'N' arguments. */
|
1995-01-02 15:04:15 -04:00
|
|
|
for (i = 0; i < n; i+= 2) {
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *k, *v;
|
1997-11-20 16:35:45 -04:00
|
|
|
int err;
|
1995-01-02 15:04:15 -04:00
|
|
|
k = do_mkvalue(p_format, p_va);
|
|
|
|
if (k == NULL) {
|
2004-07-14 08:28:06 -03:00
|
|
|
itemfailed = 1;
|
|
|
|
Py_INCREF(Py_None);
|
|
|
|
k = Py_None;
|
1995-01-02 15:04:15 -04:00
|
|
|
}
|
|
|
|
v = do_mkvalue(p_format, p_va);
|
|
|
|
if (v == NULL) {
|
2004-07-14 08:28:06 -03:00
|
|
|
itemfailed = 1;
|
|
|
|
Py_INCREF(Py_None);
|
|
|
|
v = Py_None;
|
1995-01-02 15:04:15 -04:00
|
|
|
}
|
1997-11-20 16:35:45 -04:00
|
|
|
err = PyDict_SetItem(d, k, v);
|
|
|
|
Py_DECREF(k);
|
|
|
|
Py_DECREF(v);
|
2004-07-14 08:28:06 -03:00
|
|
|
if (err < 0 || itemfailed) {
|
1997-04-29 17:08:16 -03:00
|
|
|
Py_DECREF(d);
|
1995-01-02 15:04:15 -04:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (d != NULL && **p_format != endchar) {
|
1997-04-29 17:08:16 -03:00
|
|
|
Py_DECREF(d);
|
1995-01-02 15:04:15 -04:00
|
|
|
d = NULL;
|
1997-04-29 17:08:16 -03:00
|
|
|
PyErr_SetString(PyExc_SystemError,
|
|
|
|
"Unmatched paren in format");
|
1995-01-02 15:04:15 -04:00
|
|
|
}
|
|
|
|
else if (endchar)
|
|
|
|
++*p_format;
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
static PyObject *
|
2000-07-22 15:47:25 -03:00
|
|
|
do_mklist(char **p_format, va_list *p_va, int endchar, int n)
|
1995-01-02 15:04:15 -04:00
|
|
|
{
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *v;
|
1995-01-02 15:04:15 -04:00
|
|
|
int i;
|
2004-07-14 08:28:06 -03:00
|
|
|
int itemfailed = 0;
|
1995-01-02 15:04:15 -04:00
|
|
|
if (n < 0)
|
|
|
|
return NULL;
|
1997-04-29 17:08:16 -03:00
|
|
|
if ((v = PyList_New(n)) == NULL)
|
1995-01-02 15:04:15 -04:00
|
|
|
return NULL;
|
2004-07-14 08:28:06 -03:00
|
|
|
/* Note that we can't bail immediately on error as this will leak
|
|
|
|
refcounts on any 'N' arguments. */
|
1995-01-02 15:04:15 -04:00
|
|
|
for (i = 0; i < n; i++) {
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *w = do_mkvalue(p_format, p_va);
|
1995-01-02 15:04:15 -04:00
|
|
|
if (w == NULL) {
|
2004-07-14 08:28:06 -03:00
|
|
|
itemfailed = 1;
|
|
|
|
Py_INCREF(Py_None);
|
|
|
|
w = Py_None;
|
1995-01-02 15:04:15 -04:00
|
|
|
}
|
1997-04-29 17:08:16 -03:00
|
|
|
PyList_SetItem(v, i, w);
|
1995-01-02 15:04:15 -04:00
|
|
|
}
|
|
|
|
if (v != NULL && **p_format != endchar) {
|
1997-04-29 17:08:16 -03:00
|
|
|
Py_DECREF(v);
|
1995-01-02 15:04:15 -04:00
|
|
|
v = NULL;
|
1997-04-29 17:08:16 -03:00
|
|
|
PyErr_SetString(PyExc_SystemError,
|
|
|
|
"Unmatched paren in format");
|
1995-01-02 15:04:15 -04:00
|
|
|
}
|
|
|
|
else if (endchar)
|
|
|
|
++*p_format;
|
2004-07-14 08:28:06 -03:00
|
|
|
if (itemfailed) {
|
|
|
|
Py_DECREF(v);
|
|
|
|
v = NULL;
|
|
|
|
}
|
1995-01-02 15:04:15 -04:00
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
2001-08-17 15:39:25 -03:00
|
|
|
#ifdef Py_USING_UNICODE
|
2000-04-28 11:42:37 -03:00
|
|
|
static int
|
|
|
|
_ustrlen(Py_UNICODE *u)
|
|
|
|
{
|
|
|
|
int i = 0;
|
|
|
|
Py_UNICODE *v = u;
|
|
|
|
while (*v != 0) { i++; v++; }
|
|
|
|
return i;
|
|
|
|
}
|
2001-08-17 15:39:25 -03:00
|
|
|
#endif
|
2000-04-28 11:42:37 -03:00
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
static PyObject *
|
2000-07-22 15:47:25 -03:00
|
|
|
do_mktuple(char **p_format, va_list *p_va, int endchar, int n)
|
1992-04-13 12:53:41 -03:00
|
|
|
{
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *v;
|
1992-04-13 12:53:41 -03:00
|
|
|
int i;
|
2004-07-14 08:28:06 -03:00
|
|
|
int itemfailed = 0;
|
1992-04-13 12:53:41 -03:00
|
|
|
if (n < 0)
|
|
|
|
return NULL;
|
1997-04-29 17:08:16 -03:00
|
|
|
if ((v = PyTuple_New(n)) == NULL)
|
1992-04-13 12:53:41 -03:00
|
|
|
return NULL;
|
2004-07-14 08:28:06 -03:00
|
|
|
/* Note that we can't bail immediately on error as this will leak
|
|
|
|
refcounts on any 'N' arguments. */
|
1992-04-13 12:53:41 -03:00
|
|
|
for (i = 0; i < n; i++) {
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *w = do_mkvalue(p_format, p_va);
|
1992-04-13 12:53:41 -03:00
|
|
|
if (w == NULL) {
|
2004-07-14 08:28:06 -03:00
|
|
|
itemfailed = 1;
|
|
|
|
Py_INCREF(Py_None);
|
|
|
|
w = Py_None;
|
1992-04-13 12:53:41 -03:00
|
|
|
}
|
1997-04-29 17:08:16 -03:00
|
|
|
PyTuple_SetItem(v, i, w);
|
1992-04-13 12:53:41 -03:00
|
|
|
}
|
|
|
|
if (v != NULL && **p_format != endchar) {
|
1997-04-29 17:08:16 -03:00
|
|
|
Py_DECREF(v);
|
1992-04-13 12:53:41 -03:00
|
|
|
v = NULL;
|
1997-04-29 17:08:16 -03:00
|
|
|
PyErr_SetString(PyExc_SystemError,
|
|
|
|
"Unmatched paren in format");
|
1992-04-13 12:53:41 -03:00
|
|
|
}
|
|
|
|
else if (endchar)
|
|
|
|
++*p_format;
|
2004-07-14 08:28:06 -03:00
|
|
|
if (itemfailed) {
|
|
|
|
Py_DECREF(v);
|
|
|
|
v = NULL;
|
|
|
|
}
|
1992-04-13 12:53:41 -03:00
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
static PyObject *
|
2000-07-22 15:47:25 -03:00
|
|
|
do_mkvalue(char **p_format, va_list *p_va)
|
1992-05-15 08:04:59 -03:00
|
|
|
{
|
1995-01-02 15:04:15 -04:00
|
|
|
for (;;) {
|
|
|
|
switch (*(*p_format)++) {
|
|
|
|
case '(':
|
|
|
|
return do_mktuple(p_format, p_va, ')',
|
|
|
|
countformat(*p_format, ')'));
|
|
|
|
|
|
|
|
case '[':
|
|
|
|
return do_mklist(p_format, p_va, ']',
|
|
|
|
countformat(*p_format, ']'));
|
|
|
|
|
|
|
|
case '{':
|
|
|
|
return do_mkdict(p_format, p_va, '}',
|
|
|
|
countformat(*p_format, '}'));
|
|
|
|
|
|
|
|
case 'b':
|
2000-09-15 09:51:01 -03:00
|
|
|
case 'B':
|
1995-01-02 15:04:15 -04:00
|
|
|
case 'h':
|
|
|
|
case 'i':
|
1997-04-29 17:08:16 -03:00
|
|
|
return PyInt_FromLong((long)va_arg(*p_va, int));
|
2000-07-06 09:22:00 -03:00
|
|
|
|
|
|
|
case 'H':
|
|
|
|
return PyInt_FromLong((long)va_arg(*p_va, unsigned int));
|
1995-01-02 15:04:15 -04:00
|
|
|
|
|
|
|
case 'l':
|
1997-04-29 17:08:16 -03:00
|
|
|
return PyInt_FromLong((long)va_arg(*p_va, long));
|
1995-01-02 15:04:15 -04:00
|
|
|
|
2003-04-17 19:01:10 -03:00
|
|
|
case 'k':
|
|
|
|
return PyInt_FromLong((long)va_arg(*p_va, unsigned long));
|
|
|
|
|
1999-01-25 17:48:56 -04:00
|
|
|
#ifdef HAVE_LONG_LONG
|
1998-08-04 19:46:29 -03:00
|
|
|
case 'L':
|
2003-03-29 06:06:18 -04:00
|
|
|
return PyLong_FromLongLong((PY_LONG_LONG)va_arg(*p_va, PY_LONG_LONG));
|
2003-04-17 19:01:10 -03:00
|
|
|
|
|
|
|
case 'K':
|
|
|
|
return PyLong_FromLongLong((PY_LONG_LONG)va_arg(*p_va, unsigned PY_LONG_LONG));
|
1998-08-04 19:46:29 -03:00
|
|
|
#endif
|
2001-08-17 15:39:25 -03:00
|
|
|
#ifdef Py_USING_UNICODE
|
2000-04-28 11:42:37 -03:00
|
|
|
case 'u':
|
|
|
|
{
|
|
|
|
PyObject *v;
|
|
|
|
Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
|
|
|
|
int n;
|
|
|
|
if (**p_format == '#') {
|
|
|
|
++*p_format;
|
|
|
|
n = va_arg(*p_va, int);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
n = -1;
|
|
|
|
if (u == NULL) {
|
|
|
|
v = Py_None;
|
|
|
|
Py_INCREF(v);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (n < 0)
|
|
|
|
n = _ustrlen(u);
|
|
|
|
v = PyUnicode_FromUnicode(u, n);
|
|
|
|
}
|
|
|
|
return v;
|
|
|
|
}
|
2001-08-17 15:39:25 -03:00
|
|
|
#endif
|
1995-01-02 15:04:15 -04:00
|
|
|
case 'f':
|
|
|
|
case 'd':
|
1997-04-29 17:08:16 -03:00
|
|
|
return PyFloat_FromDouble(
|
|
|
|
(double)va_arg(*p_va, va_double));
|
1995-01-02 15:04:15 -04:00
|
|
|
|
2001-03-12 17:03:26 -04:00
|
|
|
#ifndef WITHOUT_COMPLEX
|
|
|
|
case 'D':
|
|
|
|
return PyComplex_FromCComplex(
|
|
|
|
*((Py_complex *)va_arg(*p_va, Py_complex *)));
|
|
|
|
#endif /* WITHOUT_COMPLEX */
|
|
|
|
|
1995-01-02 15:04:15 -04:00
|
|
|
case 'c':
|
1992-04-13 12:53:41 -03:00
|
|
|
{
|
|
|
|
char p[1];
|
|
|
|
p[0] = va_arg(*p_va, int);
|
1997-04-29 17:08:16 -03:00
|
|
|
return PyString_FromStringAndSize(p, 1);
|
1992-04-13 12:53:41 -03:00
|
|
|
}
|
1995-01-02 15:04:15 -04:00
|
|
|
|
|
|
|
case 's':
|
|
|
|
case 'z':
|
1992-04-13 07:48:55 -03:00
|
|
|
{
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *v;
|
1992-04-13 07:48:55 -03:00
|
|
|
char *str = va_arg(*p_va, char *);
|
|
|
|
int n;
|
|
|
|
if (**p_format == '#') {
|
|
|
|
++*p_format;
|
|
|
|
n = va_arg(*p_va, int);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
n = -1;
|
|
|
|
if (str == NULL) {
|
1997-04-29 17:08:16 -03:00
|
|
|
v = Py_None;
|
|
|
|
Py_INCREF(v);
|
1992-04-13 07:48:55 -03:00
|
|
|
}
|
|
|
|
else {
|
2000-06-28 19:07:35 -03:00
|
|
|
if (n < 0) {
|
|
|
|
size_t m = strlen(str);
|
|
|
|
if (m > INT_MAX) {
|
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
|
|
|
"string too long for Python string");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
n = (int)m;
|
|
|
|
}
|
1997-04-29 17:08:16 -03:00
|
|
|
v = PyString_FromStringAndSize(str, n);
|
1992-04-13 07:48:55 -03:00
|
|
|
}
|
1992-04-13 12:53:41 -03:00
|
|
|
return v;
|
1992-04-13 07:48:55 -03:00
|
|
|
}
|
1995-01-02 15:04:15 -04:00
|
|
|
|
1998-12-23 01:01:38 -04:00
|
|
|
case 'N':
|
1995-01-02 15:04:15 -04:00
|
|
|
case 'S':
|
|
|
|
case 'O':
|
1995-01-20 12:56:02 -04:00
|
|
|
if (**p_format == '&') {
|
2000-07-09 00:09:57 -03:00
|
|
|
typedef PyObject *(*converter)(void *);
|
1995-01-20 12:56:02 -04:00
|
|
|
converter func = va_arg(*p_va, converter);
|
|
|
|
void *arg = va_arg(*p_va, void *);
|
|
|
|
++*p_format;
|
|
|
|
return (*func)(arg);
|
|
|
|
}
|
|
|
|
else {
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *v;
|
|
|
|
v = va_arg(*p_va, PyObject *);
|
1998-12-23 15:53:45 -04:00
|
|
|
if (v != NULL) {
|
1998-12-23 01:01:38 -04:00
|
|
|
if (*(*p_format - 1) != 'N')
|
|
|
|
Py_INCREF(v);
|
1998-12-23 15:53:45 -04:00
|
|
|
}
|
1997-04-29 17:08:16 -03:00
|
|
|
else if (!PyErr_Occurred())
|
1995-01-02 15:04:15 -04:00
|
|
|
/* If a NULL was passed
|
|
|
|
* because a call that should
|
|
|
|
* have constructed a value
|
|
|
|
* failed, that's OK, and we
|
|
|
|
* pass the error on; but if
|
|
|
|
* no error occurred it's not
|
|
|
|
* clear that the caller knew
|
|
|
|
* what she was doing. */
|
1997-04-29 17:08:16 -03:00
|
|
|
PyErr_SetString(PyExc_SystemError,
|
1998-07-07 19:32:19 -03:00
|
|
|
"NULL object passed to Py_BuildValue");
|
1992-04-13 12:53:41 -03:00
|
|
|
return v;
|
1992-04-13 07:48:55 -03:00
|
|
|
}
|
1995-01-02 15:04:15 -04:00
|
|
|
|
|
|
|
case ':':
|
|
|
|
case ',':
|
|
|
|
case ' ':
|
|
|
|
case '\t':
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
1997-04-29 17:08:16 -03:00
|
|
|
PyErr_SetString(PyExc_SystemError,
|
1998-07-07 19:32:19 -03:00
|
|
|
"bad format char passed to Py_BuildValue");
|
1995-01-02 15:04:15 -04:00
|
|
|
return NULL;
|
|
|
|
|
|
|
|
}
|
1992-04-13 07:48:55 -03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1995-01-02 15:04:15 -04:00
|
|
|
|
2003-01-30 11:08:25 -04:00
|
|
|
PyObject *
|
|
|
|
Py_BuildValue(char *format, ...)
|
1992-04-13 07:48:55 -03:00
|
|
|
{
|
1992-04-13 12:53:41 -03:00
|
|
|
va_list va;
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject* retval;
|
1992-04-13 12:53:41 -03:00
|
|
|
va_start(va, format);
|
1997-04-29 17:08:16 -03:00
|
|
|
retval = Py_VaBuildValue(format, va);
|
1992-04-13 12:53:41 -03:00
|
|
|
va_end(va);
|
|
|
|
return retval;
|
1992-04-13 07:48:55 -03:00
|
|
|
}
|
1993-03-16 08:15:04 -04:00
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *
|
2000-07-22 15:47:25 -03:00
|
|
|
Py_VaBuildValue(char *format, va_list va)
|
1993-03-16 08:15:04 -04:00
|
|
|
{
|
|
|
|
char *f = format;
|
|
|
|
int n = countformat(f, '\0');
|
1995-01-02 15:04:15 -04:00
|
|
|
va_list lva;
|
|
|
|
|
|
|
|
#ifdef VA_LIST_IS_ARRAY
|
|
|
|
memcpy(lva, va, sizeof(va_list));
|
2002-07-28 07:23:27 -03:00
|
|
|
#else
|
|
|
|
#ifdef __va_copy
|
|
|
|
__va_copy(lva, va);
|
1995-01-02 15:04:15 -04:00
|
|
|
#else
|
|
|
|
lva = va;
|
2002-07-28 07:23:27 -03:00
|
|
|
#endif
|
1995-01-02 15:04:15 -04:00
|
|
|
#endif
|
|
|
|
|
1993-03-16 08:15:04 -04:00
|
|
|
if (n < 0)
|
|
|
|
return NULL;
|
|
|
|
if (n == 0) {
|
1997-04-29 17:08:16 -03:00
|
|
|
Py_INCREF(Py_None);
|
|
|
|
return Py_None;
|
1993-03-16 08:15:04 -04:00
|
|
|
}
|
|
|
|
if (n == 1)
|
1995-01-02 15:04:15 -04:00
|
|
|
return do_mkvalue(&f, &lva);
|
|
|
|
return do_mktuple(&f, &lva, '\0', n);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *
|
|
|
|
PyEval_CallFunction(PyObject *obj, char *format, ...)
|
1995-01-02 15:04:15 -04:00
|
|
|
{
|
|
|
|
va_list vargs;
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *args;
|
|
|
|
PyObject *res;
|
1995-01-02 15:04:15 -04:00
|
|
|
|
|
|
|
va_start(vargs, format);
|
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
args = Py_VaBuildValue(format, vargs);
|
1995-01-02 15:04:15 -04:00
|
|
|
va_end(vargs);
|
|
|
|
|
|
|
|
if (args == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
res = PyEval_CallObject(obj, args);
|
|
|
|
Py_DECREF(args);
|
1995-01-02 15:04:15 -04:00
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *
|
1998-08-08 17:51:26 -03:00
|
|
|
PyEval_CallMethod(PyObject *obj, char *methodname, char *format, ...)
|
1995-01-02 15:04:15 -04:00
|
|
|
{
|
|
|
|
va_list vargs;
|
1997-04-29 17:08:16 -03:00
|
|
|
PyObject *meth;
|
|
|
|
PyObject *args;
|
|
|
|
PyObject *res;
|
1995-01-02 15:04:15 -04:00
|
|
|
|
1998-08-08 17:51:26 -03:00
|
|
|
meth = PyObject_GetAttrString(obj, methodname);
|
1995-01-02 15:04:15 -04:00
|
|
|
if (meth == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
va_start(vargs, format);
|
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
args = Py_VaBuildValue(format, vargs);
|
1995-01-02 15:04:15 -04:00
|
|
|
va_end(vargs);
|
|
|
|
|
|
|
|
if (args == NULL) {
|
1997-04-29 17:08:16 -03:00
|
|
|
Py_DECREF(meth);
|
1995-01-02 15:04:15 -04:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
1997-04-29 17:08:16 -03:00
|
|
|
res = PyEval_CallObject(meth, args);
|
|
|
|
Py_DECREF(meth);
|
|
|
|
Py_DECREF(args);
|
1995-01-02 15:04:15 -04:00
|
|
|
|
|
|
|
return res;
|
1993-03-16 08:15:04 -04:00
|
|
|
}
|
2000-09-23 00:24:27 -03:00
|
|
|
|
|
|
|
int
|
|
|
|
PyModule_AddObject(PyObject *m, char *name, PyObject *o)
|
|
|
|
{
|
|
|
|
PyObject *dict;
|
2003-06-21 18:35:25 -03:00
|
|
|
if (!PyModule_Check(m)) {
|
2002-06-17 14:16:57 -03:00
|
|
|
PyErr_SetString(PyExc_TypeError,
|
|
|
|
"PyModule_AddObject() needs module as first arg");
|
|
|
|
return -1;
|
|
|
|
}
|
2003-06-21 18:35:25 -03:00
|
|
|
if (!o) {
|
2003-10-24 17:05:32 -03:00
|
|
|
if (!PyErr_Occurred())
|
|
|
|
PyErr_SetString(PyExc_TypeError,
|
|
|
|
"PyModule_AddObject() needs non-NULL value");
|
2003-06-21 18:35:25 -03:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2000-09-23 00:24:27 -03:00
|
|
|
dict = PyModule_GetDict(m);
|
2002-06-17 14:16:57 -03:00
|
|
|
if (dict == NULL) {
|
|
|
|
/* Internal error -- modules must have a dict! */
|
|
|
|
PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
|
|
|
|
PyModule_GetName(m));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (PyDict_SetItemString(dict, name, o))
|
2000-09-23 00:24:27 -03:00
|
|
|
return -1;
|
2002-06-17 14:16:57 -03:00
|
|
|
Py_DECREF(o);
|
|
|
|
return 0;
|
2000-09-23 00:24:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
PyModule_AddIntConstant(PyObject *m, char *name, long value)
|
|
|
|
{
|
|
|
|
return PyModule_AddObject(m, name, PyInt_FromLong(value));
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
PyModule_AddStringConstant(PyObject *m, char *name, char *value)
|
|
|
|
{
|
|
|
|
return PyModule_AddObject(m, name, PyString_FromString(value));
|
|
|
|
}
|