blob: 5cd28709f159971a3055428b11cae77d6e4b7311 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Module support implementation */
12
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Jack Jansen41aa8e52000-07-03 21:39:47 +000014#ifdef HAVE_LIMITS_H
15#include <limits.h>
16#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017
Guido van Rossum1d5735e1994-08-30 08:27:36 +000018#ifdef MPW /* MPW pushes 'extended' for float and double types with varargs */
19typedef extended va_double;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000020#else
Guido van Rossum1d5735e1994-08-30 08:27:36 +000021typedef double va_double;
22#endif
23
Guido van Rossum2e58ff31997-11-19 18:53:33 +000024/* Package context -- the full module name for package imports */
25char *_Py_PackageContext = NULL;
26
Guido van Rossum40b33c61997-08-02 03:07:46 +000027/* Py_InitModule4() parameters:
Guido van Rossum970a0a21995-01-09 17:47:20 +000028 - name is the module name
29 - methods is the list of top-level functions
30 - doc is the documentation string
31 - passthrough is passed as self to functions defined in the module
32 - api_version is the value of PYTHON_API_VERSION at the time the
33 module was compiled
Guido van Rossum40b33c61997-08-02 03:07:46 +000034
35 Return value is a borrowed reference to the module object; or NULL
36 if an error occurred (in Python 1.4 and before, errors were fatal).
37 Errors may still leak memory.
Guido van Rossum50620fa1995-01-07 12:43:18 +000038*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +000039
Guido van Rossum970a0a21995-01-09 17:47:20 +000040static char api_version_warning[] =
41"WARNING: Python C API version mismatch for module %s:\n\
Sjoerd Mullender996e6dc1996-01-23 16:07:29 +000042 This Python has API version %d, module %s has version %d.\n";
Guido van Rossum970a0a21995-01-09 17:47:20 +000043
Guido van Rossum79f25d91997-04-29 20:08:16 +000044PyObject *
45Py_InitModule4(name, methods, doc, passthrough, module_api_version)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000047 PyMethodDef *methods;
Guido van Rossum50620fa1995-01-07 12:43:18 +000048 char *doc;
Guido van Rossum79f25d91997-04-29 20:08:16 +000049 PyObject *passthrough;
Guido van Rossum970a0a21995-01-09 17:47:20 +000050 int module_api_version;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051{
Guido van Rossum79f25d91997-04-29 20:08:16 +000052 PyObject *m, *d, *v;
53 PyMethodDef *ml;
Guido van Rossum970a0a21995-01-09 17:47:20 +000054 if (module_api_version != PYTHON_API_VERSION)
55 fprintf(stderr, api_version_warning,
56 name, PYTHON_API_VERSION, name, module_api_version);
Guido van Rossum2e58ff31997-11-19 18:53:33 +000057 if (_Py_PackageContext != NULL) {
58 char *p = strrchr(_Py_PackageContext, '.');
59 if (p != NULL && strcmp(name, p+1) == 0) {
60 name = _Py_PackageContext;
61 _Py_PackageContext = NULL;
62 }
63 }
Guido van Rossum40b33c61997-08-02 03:07:46 +000064 if ((m = PyImport_AddModule(name)) == NULL)
65 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000066 d = PyModule_GetDict(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067 for (ml = methods; ml->ml_name != NULL; ml++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000068 v = PyCFunction_New(ml, passthrough);
Guido van Rossum40b33c61997-08-02 03:07:46 +000069 if (v == NULL)
70 return NULL;
71 if (PyDict_SetItemString(d, ml->ml_name, v) != 0)
72 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000073 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074 }
Guido van Rossum50620fa1995-01-07 12:43:18 +000075 if (doc != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000076 v = PyString_FromString(doc);
77 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0)
Guido van Rossum40b33c61997-08-02 03:07:46 +000078 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000079 Py_DECREF(v);
Guido van Rossum50620fa1995-01-07 12:43:18 +000080 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000081 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082}
83
84
Guido van Rossumbf80e541993-02-08 15:49:17 +000085/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000086
Guido van Rossum79f25d91997-04-29 20:08:16 +000087static int countformat Py_PROTO((char *format, int endchar));
Guido van Rossumfc61adb1992-04-13 15:53:41 +000088static int countformat(format, endchar)
89 char *format;
90 int endchar;
91{
92 int count = 0;
93 int level = 0;
94 while (level > 0 || *format != endchar) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +000095 switch (*format) {
96 case '\0':
Guido van Rossumfc61adb1992-04-13 15:53:41 +000097 /* Premature end */
Guido van Rossum79f25d91997-04-29 20:08:16 +000098 PyErr_SetString(PyExc_SystemError,
99 "unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000100 return -1;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000101 case '(':
102 case '[':
103 case '{':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000104 if (level == 0)
105 count++;
106 level++;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000107 break;
108 case ')':
109 case ']':
110 case '}':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000111 level--;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000112 break;
113 case '#':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000114 case '&':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000115 case ',':
116 case ':':
117 case ' ':
118 case '\t':
119 break;
120 default:
121 if (level == 0)
122 count++;
123 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000124 format++;
125 }
126 return count;
127}
128
129
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000130/* Generic function to create a value -- the inverse of getargs() */
131/* After an original idea and first implementation by Steven Miale */
132
Guido van Rossum79f25d91997-04-29 20:08:16 +0000133static PyObject *do_mktuple Py_PROTO((char**, va_list *, int, int));
134static PyObject *do_mklist Py_PROTO((char**, va_list *, int, int));
135static PyObject *do_mkdict Py_PROTO((char**, va_list *, int, int));
136static PyObject *do_mkvalue Py_PROTO((char**, va_list *));
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000137
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000138
Guido van Rossum79f25d91997-04-29 20:08:16 +0000139static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000140do_mkdict(p_format, p_va, endchar, n)
141 char **p_format;
142 va_list *p_va;
143 int endchar;
144 int n;
145{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000147 int i;
148 if (n < 0)
149 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 if ((d = PyDict_New()) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000151 return NULL;
152 for (i = 0; i < n; i+= 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 PyObject *k, *v;
Guido van Rossumdb847bd1997-11-20 20:35:45 +0000154 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000155 k = do_mkvalue(p_format, p_va);
156 if (k == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000158 return NULL;
159 }
160 v = do_mkvalue(p_format, p_va);
161 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 Py_DECREF(k);
163 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000164 return NULL;
165 }
Guido van Rossumdb847bd1997-11-20 20:35:45 +0000166 err = PyDict_SetItem(d, k, v);
167 Py_DECREF(k);
168 Py_DECREF(v);
169 if (err < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000171 return NULL;
172 }
173 }
174 if (d != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000175 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000176 d = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000177 PyErr_SetString(PyExc_SystemError,
178 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000179 }
180 else if (endchar)
181 ++*p_format;
182 return d;
183}
184
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000186do_mklist(p_format, p_va, endchar, n)
187 char **p_format;
188 va_list *p_va;
189 int endchar;
190 int n;
191{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000192 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000193 int i;
194 if (n < 0)
195 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000196 if ((v = PyList_New(n)) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000197 return NULL;
198 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000199 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000200 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000201 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000202 return NULL;
203 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000204 PyList_SetItem(v, i, w);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000205 }
206 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000207 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000208 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 PyErr_SetString(PyExc_SystemError,
210 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000211 }
212 else if (endchar)
213 ++*p_format;
214 return v;
215}
216
Fred Drake25d34472000-04-28 14:42:37 +0000217static int
218_ustrlen(Py_UNICODE *u)
219{
220 int i = 0;
221 Py_UNICODE *v = u;
222 while (*v != 0) { i++; v++; }
223 return i;
224}
225
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226static PyObject *
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000227do_mktuple(p_format, p_va, endchar, n)
228 char **p_format;
229 va_list *p_va;
230 int endchar;
231 int n;
232{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233 PyObject *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000234 int i;
235 if (n < 0)
236 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000237 if ((v = PyTuple_New(n)) == NULL)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000238 return NULL;
239 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000241 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000243 return NULL;
244 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 PyTuple_SetItem(v, i, w);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000246 }
247 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000249 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 PyErr_SetString(PyExc_SystemError,
251 "Unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000252 }
253 else if (endchar)
254 ++*p_format;
255 return v;
256}
257
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258static PyObject *
Guido van Rossum899dcf31992-05-15 11:04:59 +0000259do_mkvalue(p_format, p_va)
260 char **p_format;
261 va_list *p_va;
262{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000263 for (;;) {
264 switch (*(*p_format)++) {
265 case '(':
266 return do_mktuple(p_format, p_va, ')',
267 countformat(*p_format, ')'));
268
269 case '[':
270 return do_mklist(p_format, p_va, ']',
271 countformat(*p_format, ']'));
272
273 case '{':
274 return do_mkdict(p_format, p_va, '}',
275 countformat(*p_format, '}'));
276
277 case 'b':
278 case 'h':
279 case 'i':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000280 return PyInt_FromLong((long)va_arg(*p_va, int));
Jack Jansend50338f2000-07-06 12:22:00 +0000281
282 case 'H':
283 return PyInt_FromLong((long)va_arg(*p_va, unsigned int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000284
285 case 'l':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 return PyInt_FromLong((long)va_arg(*p_va, long));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000287
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000288#ifdef HAVE_LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000289 case 'L':
Guido van Rossum3293b071998-08-25 16:07:15 +0000290 return PyLong_FromLongLong((LONG_LONG)va_arg(*p_va, LONG_LONG));
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000291#endif
Fred Drake25d34472000-04-28 14:42:37 +0000292 case 'u':
293 {
294 PyObject *v;
295 Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
296 int n;
297 if (**p_format == '#') {
298 ++*p_format;
299 n = va_arg(*p_va, int);
300 }
301 else
302 n = -1;
303 if (u == NULL) {
304 v = Py_None;
305 Py_INCREF(v);
306 }
307 else {
308 if (n < 0)
309 n = _ustrlen(u);
310 v = PyUnicode_FromUnicode(u, n);
311 }
312 return v;
313 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000314 case 'f':
315 case 'd':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316 return PyFloat_FromDouble(
317 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000318
319 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000320 {
321 char p[1];
322 p[0] = va_arg(*p_va, int);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 return PyString_FromStringAndSize(p, 1);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000324 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000325
326 case 's':
327 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000328 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000329 PyObject *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000330 char *str = va_arg(*p_va, char *);
331 int n;
332 if (**p_format == '#') {
333 ++*p_format;
334 n = va_arg(*p_va, int);
335 }
336 else
337 n = -1;
338 if (str == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 v = Py_None;
340 Py_INCREF(v);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000341 }
342 else {
Guido van Rossum582acec2000-06-28 22:07:35 +0000343 if (n < 0) {
344 size_t m = strlen(str);
345 if (m > INT_MAX) {
346 PyErr_SetString(PyExc_OverflowError,
347 "string too long for Python string");
348 return NULL;
349 }
350 n = (int)m;
351 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 v = PyString_FromStringAndSize(str, n);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000353 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000354 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000355 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000356
Guido van Rossumd3415001998-12-23 05:01:38 +0000357 case 'N':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000358 case 'S':
359 case 'O':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000360 if (**p_format == '&') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000361 typedef PyObject *(*converter) Py_PROTO((void *));
Guido van Rossumd1b93931995-01-20 16:56:02 +0000362 converter func = va_arg(*p_va, converter);
363 void *arg = va_arg(*p_va, void *);
364 ++*p_format;
365 return (*func)(arg);
366 }
367 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000368 PyObject *v;
369 v = va_arg(*p_va, PyObject *);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000370 if (v != NULL) {
Guido van Rossumd3415001998-12-23 05:01:38 +0000371 if (*(*p_format - 1) != 'N')
372 Py_INCREF(v);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000373 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000374 else if (!PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375 /* If a NULL was passed
376 * because a call that should
377 * have constructed a value
378 * failed, that's OK, and we
379 * pass the error on; but if
380 * no error occurred it's not
381 * clear that the caller knew
382 * what she was doing. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000384 "NULL object passed to Py_BuildValue");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000385 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000386 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387
388 case ':':
389 case ',':
390 case ' ':
391 case '\t':
392 break;
393
394 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000395 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000396 "bad format char passed to Py_BuildValue");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397 return NULL;
398
399 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000400 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000401}
402
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000403
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000404#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000405/* VARARGS 2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000406PyObject *Py_BuildValue(char *format, ...)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000407#else
408/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000409PyObject *Py_BuildValue(va_alist) va_dcl
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000410#endif
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000411{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000412 va_list va;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 PyObject* retval;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000414#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000415 va_start(va, format);
416#else
417 char *format;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000418 va_start(va);
419 format = va_arg(va, char *);
420#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +0000421 retval = Py_VaBuildValue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000422 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000423 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000424}
Guido van Rossume5372401993-03-16 12:15:04 +0000425
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426PyObject *
427Py_VaBuildValue(format, va)
Guido van Rossume5372401993-03-16 12:15:04 +0000428 char *format;
429 va_list va;
430{
431 char *f = format;
432 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000433 va_list lva;
434
435#ifdef VA_LIST_IS_ARRAY
436 memcpy(lva, va, sizeof(va_list));
437#else
438 lva = va;
439#endif
440
Guido van Rossume5372401993-03-16 12:15:04 +0000441 if (n < 0)
442 return NULL;
443 if (n == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 Py_INCREF(Py_None);
445 return Py_None;
Guido van Rossume5372401993-03-16 12:15:04 +0000446 }
447 if (n == 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448 return do_mkvalue(&f, &lva);
449 return do_mktuple(&f, &lva, '\0', n);
450}
451
452
453#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454PyObject *
455PyEval_CallFunction(PyObject *obj, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000456#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458PyEval_CallFunction(obj, format, va_alist)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyObject *obj;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000460 char *format;
461 va_dcl
462#endif
463{
464 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000465 PyObject *args;
466 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467
468#ifdef HAVE_STDARG_PROTOTYPES
469 va_start(vargs, format);
470#else
471 va_start(vargs);
472#endif
473
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000475 va_end(vargs);
476
477 if (args == NULL)
478 return NULL;
479
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 res = PyEval_CallObject(obj, args);
481 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000482
483 return res;
484}
485
486
487#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488PyObject *
Guido van Rossumc4099e61998-08-08 20:51:26 +0000489PyEval_CallMethod(PyObject *obj, char *methodname, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491PyObject *
Guido van Rossumc4099e61998-08-08 20:51:26 +0000492PyEval_CallMethod(obj, methodname, format, va_alist)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 PyObject *obj;
Guido van Rossumc4099e61998-08-08 20:51:26 +0000494 char *methodname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000495 char *format;
496 va_dcl
497#endif
498{
499 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500 PyObject *meth;
501 PyObject *args;
502 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503
Guido van Rossumc4099e61998-08-08 20:51:26 +0000504 meth = PyObject_GetAttrString(obj, methodname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505 if (meth == NULL)
506 return NULL;
507
508#ifdef HAVE_STDARG_PROTOTYPES
509 va_start(vargs, format);
510#else
511 va_start(vargs);
512#endif
513
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515 va_end(vargs);
516
517 if (args == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518 Py_DECREF(meth);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519 return NULL;
520 }
521
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 res = PyEval_CallObject(meth, args);
523 Py_DECREF(meth);
524 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000525
526 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000527}