blob: df5ebfaf1b5741918a49644c2167258ad2b3e864 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Module support implementation */
33
Guido van Rossum79f25d91997-04-29 20:08:16 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum1d5735e1994-08-30 08:27:36 +000036#ifdef MPW /* MPW pushes 'extended' for float and double types with varargs */
37typedef extended va_double;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000038#else
Guido van Rossum1d5735e1994-08-30 08:27:36 +000039typedef double va_double;
40#endif
41
Guido van Rossum970a0a21995-01-09 17:47:20 +000042/* initmodule4() parameters:
43 - name is the module name
44 - methods is the list of top-level functions
45 - doc is the documentation string
46 - passthrough is passed as self to functions defined in the module
47 - api_version is the value of PYTHON_API_VERSION at the time the
48 module was compiled
Guido van Rossum50620fa1995-01-07 12:43:18 +000049*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +000050
Guido van Rossum970a0a21995-01-09 17:47:20 +000051static char api_version_warning[] =
52"WARNING: Python C API version mismatch for module %s:\n\
Sjoerd Mullender996e6dc1996-01-23 16:07:29 +000053 This Python has API version %d, module %s has version %d.\n";
Guido van Rossum970a0a21995-01-09 17:47:20 +000054
Guido van Rossum79f25d91997-04-29 20:08:16 +000055PyObject *
56Py_InitModule4(name, methods, doc, passthrough, module_api_version)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000058 PyMethodDef *methods;
Guido van Rossum50620fa1995-01-07 12:43:18 +000059 char *doc;
Guido van Rossum79f25d91997-04-29 20:08:16 +000060 PyObject *passthrough;
Guido van Rossum970a0a21995-01-09 17:47:20 +000061 int module_api_version;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062{
Guido van Rossum79f25d91997-04-29 20:08:16 +000063 PyObject *m, *d, *v;
64 PyMethodDef *ml;
Guido van Rossum970a0a21995-01-09 17:47:20 +000065 if (module_api_version != PYTHON_API_VERSION)
66 fprintf(stderr, api_version_warning,
67 name, PYTHON_API_VERSION, name, module_api_version);
Guido van Rossum79f25d91997-04-29 20:08:16 +000068 if ((m = PyImport_AddModule(name)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069 fprintf(stderr, "initializing module: %s\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +000070 Py_FatalError("can't create a module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000072 d = PyModule_GetDict(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 for (ml = methods; ml->ml_name != NULL; ml++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000074 v = PyCFunction_New(ml, passthrough);
75 if (v == NULL ||
76 PyDict_SetItemString(d, ml->ml_name, v) != 0)
77 {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000078 fprintf(stderr, "initializing module: %s\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +000079 Py_FatalError("can't initialize module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000081 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082 }
Guido van Rossum50620fa1995-01-07 12:43:18 +000083 if (doc != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000084 v = PyString_FromString(doc);
85 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0)
86 Py_FatalError("can't add doc string");
87 Py_DECREF(v);
Guido van Rossum50620fa1995-01-07 12:43:18 +000088 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000089 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090}
91
92
Guido van Rossumbf80e541993-02-08 15:49:17 +000093/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000094
Guido van Rossum79f25d91997-04-29 20:08:16 +000095static int countformat Py_PROTO((char *format, int endchar));
Guido van Rossumfc61adb1992-04-13 15:53:41 +000096static int countformat(format, endchar)
97 char *format;
98 int endchar;
99{
100 int count = 0;
101 int level = 0;
102 while (level > 0 || *format != endchar) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000103 switch (*format) {
104 case '\0':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000105 /* Premature end */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106 PyErr_SetString(PyExc_SystemError,
107 "unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000108 return -1;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000109 case '(':
110 case '[':
111 case '{':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000112 if (level == 0)
113 count++;
114 level++;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000115 break;
116 case ')':
117 case ']':
118 case '}':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000119 level--;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000120 break;
121 case '#':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000122 case '&':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000123 case ',':
124 case ':':
125 case ' ':
126 case '\t':
127 break;
128 default:
129 if (level == 0)
130 count++;
131 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000132 format++;
133 }
134 return count;
135}
136
137
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000138/* Generic function to create a value -- the inverse of getargs() */
139/* After an original idea and first implementation by Steven Miale */
140
Guido van Rossum79f25d91997-04-29 20:08:16 +0000141static PyObject *do_mktuple Py_PROTO((char**, va_list *, int, int));
142static PyObject *do_mklist Py_PROTO((char**, va_list *, int, int));
143static PyObject *do_mkdict Py_PROTO((char**, va_list *, int, int));
144static PyObject *do_mkvalue Py_PROTO((char**, va_list *));
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000145
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000146
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000148do_mkdict(p_format, p_va, endchar, n)
149 char **p_format;
150 va_list *p_va;
151 int endchar;
152 int n;
153{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000154 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000155 int i;
156 if (n < 0)
157 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158 if ((d = PyDict_New()) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000159 return NULL;
160 for (i = 0; i < n; i+= 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000161 PyObject *k, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000162 k = do_mkvalue(p_format, p_va);
163 if (k == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000164 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000165 return NULL;
166 }
167 v = do_mkvalue(p_format, p_va);
168 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000169 Py_DECREF(k);
170 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000171 return NULL;
172 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173 if (PyDict_SetItem(d, k, v) < 0) {
174 Py_DECREF(k);
175 Py_DECREF(v);
176 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000177 return NULL;
178 }
179 }
180 if (d != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000181 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000182 d = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 PyErr_SetString(PyExc_SystemError,
184 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000185 }
186 else if (endchar)
187 ++*p_format;
188 return d;
189}
190
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000192do_mklist(p_format, p_va, endchar, n)
193 char **p_format;
194 va_list *p_va;
195 int endchar;
196 int n;
197{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000198 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000199 int i;
200 if (n < 0)
201 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000202 if ((v = PyList_New(n)) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000203 return NULL;
204 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000206 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000207 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000208 return NULL;
209 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 PyList_SetItem(v, i, w);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000211 }
212 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000213 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000214 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000215 PyErr_SetString(PyExc_SystemError,
216 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000217 }
218 else if (endchar)
219 ++*p_format;
220 return v;
221}
222
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223static PyObject *
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000224do_mktuple(p_format, p_va, endchar, n)
225 char **p_format;
226 va_list *p_va;
227 int endchar;
228 int n;
229{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 PyObject *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000231 int i;
232 if (n < 0)
233 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234 if ((v = PyTuple_New(n)) == NULL)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000235 return NULL;
236 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000237 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000238 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000239 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000240 return NULL;
241 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 PyTuple_SetItem(v, i, w);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000243 }
244 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000246 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 PyErr_SetString(PyExc_SystemError,
248 "Unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000249 }
250 else if (endchar)
251 ++*p_format;
252 return v;
253}
254
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255static PyObject *
Guido van Rossum899dcf31992-05-15 11:04:59 +0000256do_mkvalue(p_format, p_va)
257 char **p_format;
258 va_list *p_va;
259{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000260 for (;;) {
261 switch (*(*p_format)++) {
262 case '(':
263 return do_mktuple(p_format, p_va, ')',
264 countformat(*p_format, ')'));
265
266 case '[':
267 return do_mklist(p_format, p_va, ']',
268 countformat(*p_format, ']'));
269
270 case '{':
271 return do_mkdict(p_format, p_va, '}',
272 countformat(*p_format, '}'));
273
274 case 'b':
275 case 'h':
276 case 'i':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 return PyInt_FromLong((long)va_arg(*p_va, int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000278
279 case 'l':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000280 return PyInt_FromLong((long)va_arg(*p_va, long));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000281
282 case 'f':
283 case 'd':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284 return PyFloat_FromDouble(
285 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000286
287 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000288 {
289 char p[1];
290 p[0] = va_arg(*p_va, int);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291 return PyString_FromStringAndSize(p, 1);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000292 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000293
294 case 's':
295 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000296 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 PyObject *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000298 char *str = va_arg(*p_va, char *);
299 int n;
300 if (**p_format == '#') {
301 ++*p_format;
302 n = va_arg(*p_va, int);
303 }
304 else
305 n = -1;
306 if (str == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 v = Py_None;
308 Py_INCREF(v);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000309 }
310 else {
311 if (n < 0)
312 n = strlen(str);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 v = PyString_FromStringAndSize(str, n);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000314 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000315 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000316 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000317
318 case 'S':
319 case 'O':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000320 if (**p_format == '&') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000321 typedef PyObject *(*converter) Py_PROTO((void *));
Guido van Rossumd1b93931995-01-20 16:56:02 +0000322 converter func = va_arg(*p_va, converter);
323 void *arg = va_arg(*p_va, void *);
324 ++*p_format;
325 return (*func)(arg);
326 }
327 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000328 PyObject *v;
329 v = va_arg(*p_va, PyObject *);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000330 if (v != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000331 Py_INCREF(v);
332 else if (!PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000333 /* If a NULL was passed
334 * because a call that should
335 * have constructed a value
336 * failed, that's OK, and we
337 * pass the error on; but if
338 * no error occurred it's not
339 * clear that the caller knew
340 * what she was doing. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000342 "NULL object passed to mkvalue");
343 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000344 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000345
346 case ':':
347 case ',':
348 case ' ':
349 case '\t':
350 break;
351
352 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000354 "bad format char passed to mkvalue");
355 return NULL;
356
357 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000358 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000359}
360
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000361
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000362#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000363/* VARARGS 2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364PyObject *Py_BuildValue(char *format, ...)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000365#else
366/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367PyObject *Py_BuildValue(va_alist) va_dcl
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000368#endif
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000369{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000370 va_list va;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 PyObject* retval;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000372#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000373 va_start(va, format);
374#else
375 char *format;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000376 va_start(va);
377 format = va_arg(va, char *);
378#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +0000379 retval = Py_VaBuildValue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000380 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000381 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000382}
Guido van Rossume5372401993-03-16 12:15:04 +0000383
Guido van Rossum79f25d91997-04-29 20:08:16 +0000384PyObject *
385Py_VaBuildValue(format, va)
Guido van Rossume5372401993-03-16 12:15:04 +0000386 char *format;
387 va_list va;
388{
389 char *f = format;
390 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000391 va_list lva;
392
393#ifdef VA_LIST_IS_ARRAY
394 memcpy(lva, va, sizeof(va_list));
395#else
396 lva = va;
397#endif
398
Guido van Rossume5372401993-03-16 12:15:04 +0000399 if (n < 0)
400 return NULL;
401 if (n == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000402 Py_INCREF(Py_None);
403 return Py_None;
Guido van Rossume5372401993-03-16 12:15:04 +0000404 }
405 if (n == 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000406 return do_mkvalue(&f, &lva);
407 return do_mktuple(&f, &lva, '\0', n);
408}
409
410
411#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum79f25d91997-04-29 20:08:16 +0000412PyObject *
413PyEval_CallFunction(PyObject *obj, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000414#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000416PyEval_CallFunction(obj, format, va_alist)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000417 PyObject *obj;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000418 char *format;
419 va_dcl
420#endif
421{
422 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000423 PyObject *args;
424 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425
426#ifdef HAVE_STDARG_PROTOTYPES
427 va_start(vargs, format);
428#else
429 va_start(vargs);
430#endif
431
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000433 va_end(vargs);
434
435 if (args == NULL)
436 return NULL;
437
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 res = PyEval_CallObject(obj, args);
439 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000440
441 return res;
442}
443
444
445#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446PyObject *
447PyEval_CallMethod(PyObject *obj, char *methonname, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449PyObject *
Guido van Rossum2ac3bc21995-01-17 16:31:01 +0000450PyEval_CallMethod(obj, methonname, format, va_alist)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 PyObject *obj;
Guido van Rossum2ac3bc21995-01-17 16:31:01 +0000452 char *methonname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453 char *format;
454 va_dcl
455#endif
456{
457 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 PyObject *meth;
459 PyObject *args;
460 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 meth = PyObject_GetAttrString(obj, methonname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 if (meth == NULL)
464 return NULL;
465
466#ifdef HAVE_STDARG_PROTOTYPES
467 va_start(vargs, format);
468#else
469 va_start(vargs);
470#endif
471
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000473 va_end(vargs);
474
475 if (args == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 Py_DECREF(meth);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000477 return NULL;
478 }
479
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 res = PyEval_CallObject(meth, args);
481 Py_DECREF(meth);
482 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483
484 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000485}