blob: 12ecaf6b86b954256771849a8e94416b1a52af8d [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 Rossum2e58ff31997-11-19 18:53:33 +000042/* Package context -- the full module name for package imports */
43char *_Py_PackageContext = NULL;
44
Guido van Rossum40b33c61997-08-02 03:07:46 +000045/* Py_InitModule4() parameters:
Guido van Rossum970a0a21995-01-09 17:47:20 +000046 - name is the module name
47 - methods is the list of top-level functions
48 - doc is the documentation string
49 - passthrough is passed as self to functions defined in the module
50 - api_version is the value of PYTHON_API_VERSION at the time the
51 module was compiled
Guido van Rossum40b33c61997-08-02 03:07:46 +000052
53 Return value is a borrowed reference to the module object; or NULL
54 if an error occurred (in Python 1.4 and before, errors were fatal).
55 Errors may still leak memory.
Guido van Rossum50620fa1995-01-07 12:43:18 +000056*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +000057
Guido van Rossum970a0a21995-01-09 17:47:20 +000058static char api_version_warning[] =
59"WARNING: Python C API version mismatch for module %s:\n\
Sjoerd Mullender996e6dc1996-01-23 16:07:29 +000060 This Python has API version %d, module %s has version %d.\n";
Guido van Rossum970a0a21995-01-09 17:47:20 +000061
Guido van Rossum79f25d91997-04-29 20:08:16 +000062PyObject *
63Py_InitModule4(name, methods, doc, passthrough, module_api_version)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000065 PyMethodDef *methods;
Guido van Rossum50620fa1995-01-07 12:43:18 +000066 char *doc;
Guido van Rossum79f25d91997-04-29 20:08:16 +000067 PyObject *passthrough;
Guido van Rossum970a0a21995-01-09 17:47:20 +000068 int module_api_version;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069{
Guido van Rossum79f25d91997-04-29 20:08:16 +000070 PyObject *m, *d, *v;
71 PyMethodDef *ml;
Guido van Rossum970a0a21995-01-09 17:47:20 +000072 if (module_api_version != PYTHON_API_VERSION)
73 fprintf(stderr, api_version_warning,
74 name, PYTHON_API_VERSION, name, module_api_version);
Guido van Rossum2e58ff31997-11-19 18:53:33 +000075 if (_Py_PackageContext != NULL) {
76 char *p = strrchr(_Py_PackageContext, '.');
77 if (p != NULL && strcmp(name, p+1) == 0) {
78 name = _Py_PackageContext;
79 _Py_PackageContext = NULL;
80 }
81 }
Guido van Rossum40b33c61997-08-02 03:07:46 +000082 if ((m = PyImport_AddModule(name)) == NULL)
83 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000084 d = PyModule_GetDict(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085 for (ml = methods; ml->ml_name != NULL; ml++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000086 v = PyCFunction_New(ml, passthrough);
Guido van Rossum40b33c61997-08-02 03:07:46 +000087 if (v == NULL)
88 return NULL;
89 if (PyDict_SetItemString(d, ml->ml_name, v) != 0)
90 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000091 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092 }
Guido van Rossum50620fa1995-01-07 12:43:18 +000093 if (doc != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000094 v = PyString_FromString(doc);
95 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0)
Guido van Rossum40b33c61997-08-02 03:07:46 +000096 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 Py_DECREF(v);
Guido van Rossum50620fa1995-01-07 12:43:18 +000098 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000099 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100}
101
102
Guido van Rossumbf80e541993-02-08 15:49:17 +0000103/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000104
Guido van Rossum79f25d91997-04-29 20:08:16 +0000105static int countformat Py_PROTO((char *format, int endchar));
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000106static int countformat(format, endchar)
107 char *format;
108 int endchar;
109{
110 int count = 0;
111 int level = 0;
112 while (level > 0 || *format != endchar) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000113 switch (*format) {
114 case '\0':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000115 /* Premature end */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000116 PyErr_SetString(PyExc_SystemError,
117 "unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000118 return -1;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000119 case '(':
120 case '[':
121 case '{':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000122 if (level == 0)
123 count++;
124 level++;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000125 break;
126 case ')':
127 case ']':
128 case '}':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000129 level--;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000130 break;
131 case '#':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000132 case '&':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000133 case ',':
134 case ':':
135 case ' ':
136 case '\t':
137 break;
138 default:
139 if (level == 0)
140 count++;
141 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000142 format++;
143 }
144 return count;
145}
146
147
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000148/* Generic function to create a value -- the inverse of getargs() */
149/* After an original idea and first implementation by Steven Miale */
150
Guido van Rossum79f25d91997-04-29 20:08:16 +0000151static PyObject *do_mktuple Py_PROTO((char**, va_list *, int, int));
152static PyObject *do_mklist Py_PROTO((char**, va_list *, int, int));
153static PyObject *do_mkdict Py_PROTO((char**, va_list *, int, int));
154static PyObject *do_mkvalue Py_PROTO((char**, va_list *));
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000155
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000156
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000158do_mkdict(p_format, p_va, endchar, n)
159 char **p_format;
160 va_list *p_va;
161 int endchar;
162 int n;
163{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000164 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000165 int i;
166 if (n < 0)
167 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 if ((d = PyDict_New()) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000169 return NULL;
170 for (i = 0; i < n; i+= 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 PyObject *k, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000172 k = do_mkvalue(p_format, p_va);
173 if (k == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000175 return NULL;
176 }
177 v = do_mkvalue(p_format, p_va);
178 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179 Py_DECREF(k);
180 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000181 return NULL;
182 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 if (PyDict_SetItem(d, k, v) < 0) {
184 Py_DECREF(k);
185 Py_DECREF(v);
186 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000187 return NULL;
188 }
189 }
190 if (d != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000192 d = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000193 PyErr_SetString(PyExc_SystemError,
194 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000195 }
196 else if (endchar)
197 ++*p_format;
198 return d;
199}
200
Guido van Rossum79f25d91997-04-29 20:08:16 +0000201static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000202do_mklist(p_format, p_va, endchar, n)
203 char **p_format;
204 va_list *p_va;
205 int endchar;
206 int n;
207{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000209 int i;
210 if (n < 0)
211 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000212 if ((v = PyList_New(n)) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000213 return NULL;
214 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000215 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000216 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000218 return NULL;
219 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 PyList_SetItem(v, i, w);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000221 }
222 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000224 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000225 PyErr_SetString(PyExc_SystemError,
226 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000227 }
228 else if (endchar)
229 ++*p_format;
230 return v;
231}
232
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233static PyObject *
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000234do_mktuple(p_format, p_va, endchar, n)
235 char **p_format;
236 va_list *p_va;
237 int endchar;
238 int n;
239{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240 PyObject *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000241 int i;
242 if (n < 0)
243 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if ((v = PyTuple_New(n)) == NULL)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000245 return NULL;
246 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000248 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000250 return NULL;
251 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 PyTuple_SetItem(v, i, w);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000253 }
254 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000256 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 PyErr_SetString(PyExc_SystemError,
258 "Unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000259 }
260 else if (endchar)
261 ++*p_format;
262 return v;
263}
264
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265static PyObject *
Guido van Rossum899dcf31992-05-15 11:04:59 +0000266do_mkvalue(p_format, p_va)
267 char **p_format;
268 va_list *p_va;
269{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000270 for (;;) {
271 switch (*(*p_format)++) {
272 case '(':
273 return do_mktuple(p_format, p_va, ')',
274 countformat(*p_format, ')'));
275
276 case '[':
277 return do_mklist(p_format, p_va, ']',
278 countformat(*p_format, ']'));
279
280 case '{':
281 return do_mkdict(p_format, p_va, '}',
282 countformat(*p_format, '}'));
283
284 case 'b':
285 case 'h':
286 case 'i':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 return PyInt_FromLong((long)va_arg(*p_va, int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000288
289 case 'l':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 return PyInt_FromLong((long)va_arg(*p_va, long));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000291
292 case 'f':
293 case 'd':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000294 return PyFloat_FromDouble(
295 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000296
297 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000298 {
299 char p[1];
300 p[0] = va_arg(*p_va, int);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 return PyString_FromStringAndSize(p, 1);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000302 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000303
304 case 's':
305 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000306 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 PyObject *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000308 char *str = va_arg(*p_va, char *);
309 int n;
310 if (**p_format == '#') {
311 ++*p_format;
312 n = va_arg(*p_va, int);
313 }
314 else
315 n = -1;
316 if (str == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 v = Py_None;
318 Py_INCREF(v);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000319 }
320 else {
321 if (n < 0)
322 n = strlen(str);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 v = PyString_FromStringAndSize(str, n);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000324 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000325 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000326 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000327
328 case 'S':
329 case 'O':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000330 if (**p_format == '&') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000331 typedef PyObject *(*converter) Py_PROTO((void *));
Guido van Rossumd1b93931995-01-20 16:56:02 +0000332 converter func = va_arg(*p_va, converter);
333 void *arg = va_arg(*p_va, void *);
334 ++*p_format;
335 return (*func)(arg);
336 }
337 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 PyObject *v;
339 v = va_arg(*p_va, PyObject *);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000340 if (v != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 Py_INCREF(v);
342 else if (!PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000343 /* If a NULL was passed
344 * because a call that should
345 * have constructed a value
346 * failed, that's OK, and we
347 * pass the error on; but if
348 * no error occurred it's not
349 * clear that the caller knew
350 * what she was doing. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000352 "NULL object passed to mkvalue");
353 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000354 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355
356 case ':':
357 case ',':
358 case ' ':
359 case '\t':
360 break;
361
362 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000364 "bad format char passed to mkvalue");
365 return NULL;
366
367 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000368 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000369}
370
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000372#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000373/* VARARGS 2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000374PyObject *Py_BuildValue(char *format, ...)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000375#else
376/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000377PyObject *Py_BuildValue(va_alist) va_dcl
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000378#endif
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000379{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000380 va_list va;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381 PyObject* retval;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000382#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000383 va_start(va, format);
384#else
385 char *format;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000386 va_start(va);
387 format = va_arg(va, char *);
388#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 retval = Py_VaBuildValue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000390 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000391 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000392}
Guido van Rossume5372401993-03-16 12:15:04 +0000393
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394PyObject *
395Py_VaBuildValue(format, va)
Guido van Rossume5372401993-03-16 12:15:04 +0000396 char *format;
397 va_list va;
398{
399 char *f = format;
400 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000401 va_list lva;
402
403#ifdef VA_LIST_IS_ARRAY
404 memcpy(lva, va, sizeof(va_list));
405#else
406 lva = va;
407#endif
408
Guido van Rossume5372401993-03-16 12:15:04 +0000409 if (n < 0)
410 return NULL;
411 if (n == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000412 Py_INCREF(Py_None);
413 return Py_None;
Guido van Rossume5372401993-03-16 12:15:04 +0000414 }
415 if (n == 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000416 return do_mkvalue(&f, &lva);
417 return do_mktuple(&f, &lva, '\0', n);
418}
419
420
421#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422PyObject *
423PyEval_CallFunction(PyObject *obj, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000424#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000425PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000426PyEval_CallFunction(obj, format, va_alist)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 PyObject *obj;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428 char *format;
429 va_dcl
430#endif
431{
432 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 PyObject *args;
434 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435
436#ifdef HAVE_STDARG_PROTOTYPES
437 va_start(vargs, format);
438#else
439 va_start(vargs);
440#endif
441
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000443 va_end(vargs);
444
445 if (args == NULL)
446 return NULL;
447
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 res = PyEval_CallObject(obj, args);
449 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450
451 return res;
452}
453
454
455#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456PyObject *
457PyEval_CallMethod(PyObject *obj, char *methonname, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459PyObject *
Guido van Rossum2ac3bc21995-01-17 16:31:01 +0000460PyEval_CallMethod(obj, methonname, format, va_alist)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461 PyObject *obj;
Guido van Rossum2ac3bc21995-01-17 16:31:01 +0000462 char *methonname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 char *format;
464 va_dcl
465#endif
466{
467 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 PyObject *meth;
469 PyObject *args;
470 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472 meth = PyObject_GetAttrString(obj, methonname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000473 if (meth == NULL)
474 return NULL;
475
476#ifdef HAVE_STDARG_PROTOTYPES
477 va_start(vargs, format);
478#else
479 va_start(vargs);
480#endif
481
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483 va_end(vargs);
484
485 if (args == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486 Py_DECREF(meth);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000487 return NULL;
488 }
489
Guido van Rossum79f25d91997-04-29 20:08:16 +0000490 res = PyEval_CallObject(meth, args);
491 Py_DECREF(meth);
492 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000493
494 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000495}