blob: 13737f13ee826873302e6a96f258d145d1ee2ca7 [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 Rossumdb847bd1997-11-20 20:35:45 +0000172 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000173 k = do_mkvalue(p_format, p_va);
174 if (k == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000175 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000176 return NULL;
177 }
178 v = do_mkvalue(p_format, p_va);
179 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180 Py_DECREF(k);
181 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000182 return NULL;
183 }
Guido van Rossumdb847bd1997-11-20 20:35:45 +0000184 err = PyDict_SetItem(d, k, v);
185 Py_DECREF(k);
186 Py_DECREF(v);
187 if (err < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000189 return NULL;
190 }
191 }
192 if (d != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000193 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000194 d = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000195 PyErr_SetString(PyExc_SystemError,
196 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000197 }
198 else if (endchar)
199 ++*p_format;
200 return d;
201}
202
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000204do_mklist(p_format, p_va, endchar, n)
205 char **p_format;
206 va_list *p_va;
207 int endchar;
208 int n;
209{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000211 int i;
212 if (n < 0)
213 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000214 if ((v = PyList_New(n)) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000215 return NULL;
216 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000218 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000219 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000220 return NULL;
221 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000222 PyList_SetItem(v, i, w);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000223 }
224 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000225 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000226 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 PyErr_SetString(PyExc_SystemError,
228 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000229 }
230 else if (endchar)
231 ++*p_format;
232 return v;
233}
234
Fred Drake25d34472000-04-28 14:42:37 +0000235static int
236_ustrlen(Py_UNICODE *u)
237{
238 int i = 0;
239 Py_UNICODE *v = u;
240 while (*v != 0) { i++; v++; }
241 return i;
242}
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244static PyObject *
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000245do_mktuple(p_format, p_va, endchar, n)
246 char **p_format;
247 va_list *p_va;
248 int endchar;
249 int n;
250{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 PyObject *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000252 int i;
253 if (n < 0)
254 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 if ((v = PyTuple_New(n)) == NULL)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000256 return NULL;
257 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000259 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000261 return NULL;
262 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263 PyTuple_SetItem(v, i, w);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000264 }
265 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000267 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 PyErr_SetString(PyExc_SystemError,
269 "Unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000270 }
271 else if (endchar)
272 ++*p_format;
273 return v;
274}
275
Guido van Rossum79f25d91997-04-29 20:08:16 +0000276static PyObject *
Guido van Rossum899dcf31992-05-15 11:04:59 +0000277do_mkvalue(p_format, p_va)
278 char **p_format;
279 va_list *p_va;
280{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000281 for (;;) {
282 switch (*(*p_format)++) {
283 case '(':
284 return do_mktuple(p_format, p_va, ')',
285 countformat(*p_format, ')'));
286
287 case '[':
288 return do_mklist(p_format, p_va, ']',
289 countformat(*p_format, ']'));
290
291 case '{':
292 return do_mkdict(p_format, p_va, '}',
293 countformat(*p_format, '}'));
294
295 case 'b':
296 case 'h':
297 case 'i':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 return PyInt_FromLong((long)va_arg(*p_va, int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000299
300 case 'l':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 return PyInt_FromLong((long)va_arg(*p_va, long));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000302
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000303#ifdef HAVE_LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000304 case 'L':
Guido van Rossum3293b071998-08-25 16:07:15 +0000305 return PyLong_FromLongLong((LONG_LONG)va_arg(*p_va, LONG_LONG));
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000306#endif
Fred Drake25d34472000-04-28 14:42:37 +0000307 case 'u':
308 {
309 PyObject *v;
310 Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
311 int n;
312 if (**p_format == '#') {
313 ++*p_format;
314 n = va_arg(*p_va, int);
315 }
316 else
317 n = -1;
318 if (u == NULL) {
319 v = Py_None;
320 Py_INCREF(v);
321 }
322 else {
323 if (n < 0)
324 n = _ustrlen(u);
325 v = PyUnicode_FromUnicode(u, n);
326 }
327 return v;
328 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000329 case 'f':
330 case 'd':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000331 return PyFloat_FromDouble(
332 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000333
334 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000335 {
336 char p[1];
337 p[0] = va_arg(*p_va, int);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 return PyString_FromStringAndSize(p, 1);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000339 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000340
341 case 's':
342 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000343 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000344 PyObject *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000345 char *str = va_arg(*p_va, char *);
346 int n;
347 if (**p_format == '#') {
348 ++*p_format;
349 n = va_arg(*p_va, int);
350 }
351 else
352 n = -1;
353 if (str == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000354 v = Py_None;
355 Py_INCREF(v);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000356 }
357 else {
Guido van Rossum582acec2000-06-28 22:07:35 +0000358 if (n < 0) {
359 size_t m = strlen(str);
360 if (m > INT_MAX) {
361 PyErr_SetString(PyExc_OverflowError,
362 "string too long for Python string");
363 return NULL;
364 }
365 n = (int)m;
366 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 v = PyString_FromStringAndSize(str, n);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000368 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000369 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000370 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371
Guido van Rossumd3415001998-12-23 05:01:38 +0000372 case 'N':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000373 case 'S':
374 case 'O':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000375 if (**p_format == '&') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376 typedef PyObject *(*converter) Py_PROTO((void *));
Guido van Rossumd1b93931995-01-20 16:56:02 +0000377 converter func = va_arg(*p_va, converter);
378 void *arg = va_arg(*p_va, void *);
379 ++*p_format;
380 return (*func)(arg);
381 }
382 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 PyObject *v;
384 v = va_arg(*p_va, PyObject *);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000385 if (v != NULL) {
Guido van Rossumd3415001998-12-23 05:01:38 +0000386 if (*(*p_format - 1) != 'N')
387 Py_INCREF(v);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000388 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 else if (!PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000390 /* If a NULL was passed
391 * because a call that should
392 * have constructed a value
393 * failed, that's OK, and we
394 * pass the error on; but if
395 * no error occurred it's not
396 * clear that the caller knew
397 * what she was doing. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000398 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000399 "NULL object passed to Py_BuildValue");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000400 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000401 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000402
403 case ':':
404 case ',':
405 case ' ':
406 case '\t':
407 break;
408
409 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000411 "bad format char passed to Py_BuildValue");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000412 return NULL;
413
414 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000415 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000416}
417
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000418
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000419#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000420/* VARARGS 2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000421PyObject *Py_BuildValue(char *format, ...)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000422#else
423/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424PyObject *Py_BuildValue(va_alist) va_dcl
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000425#endif
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000426{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000427 va_list va;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000428 PyObject* retval;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000429#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000430 va_start(va, format);
431#else
432 char *format;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000433 va_start(va);
434 format = va_arg(va, char *);
435#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 retval = Py_VaBuildValue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000437 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000438 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000439}
Guido van Rossume5372401993-03-16 12:15:04 +0000440
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441PyObject *
442Py_VaBuildValue(format, va)
Guido van Rossume5372401993-03-16 12:15:04 +0000443 char *format;
444 va_list va;
445{
446 char *f = format;
447 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448 va_list lva;
449
450#ifdef VA_LIST_IS_ARRAY
451 memcpy(lva, va, sizeof(va_list));
452#else
453 lva = va;
454#endif
455
Guido van Rossume5372401993-03-16 12:15:04 +0000456 if (n < 0)
457 return NULL;
458 if (n == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 Py_INCREF(Py_None);
460 return Py_None;
Guido van Rossume5372401993-03-16 12:15:04 +0000461 }
462 if (n == 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 return do_mkvalue(&f, &lva);
464 return do_mktuple(&f, &lva, '\0', n);
465}
466
467
468#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469PyObject *
470PyEval_CallFunction(PyObject *obj, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000473PyEval_CallFunction(obj, format, va_alist)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 PyObject *obj;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000475 char *format;
476 va_dcl
477#endif
478{
479 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 PyObject *args;
481 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000482
483#ifdef HAVE_STDARG_PROTOTYPES
484 va_start(vargs, format);
485#else
486 va_start(vargs);
487#endif
488
Guido van Rossum79f25d91997-04-29 20:08:16 +0000489 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490 va_end(vargs);
491
492 if (args == NULL)
493 return NULL;
494
Guido van Rossum79f25d91997-04-29 20:08:16 +0000495 res = PyEval_CallObject(obj, args);
496 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000497
498 return res;
499}
500
501
502#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum79f25d91997-04-29 20:08:16 +0000503PyObject *
Guido van Rossumc4099e61998-08-08 20:51:26 +0000504PyEval_CallMethod(PyObject *obj, char *methodname, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506PyObject *
Guido van Rossumc4099e61998-08-08 20:51:26 +0000507PyEval_CallMethod(obj, methodname, format, va_alist)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508 PyObject *obj;
Guido van Rossumc4099e61998-08-08 20:51:26 +0000509 char *methodname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000510 char *format;
511 va_dcl
512#endif
513{
514 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 PyObject *meth;
516 PyObject *args;
517 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000518
Guido van Rossumc4099e61998-08-08 20:51:26 +0000519 meth = PyObject_GetAttrString(obj, methodname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000520 if (meth == NULL)
521 return NULL;
522
523#ifdef HAVE_STDARG_PROTOTYPES
524 va_start(vargs, format);
525#else
526 va_start(vargs);
527#endif
528
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530 va_end(vargs);
531
532 if (args == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 Py_DECREF(meth);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 return NULL;
535 }
536
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 res = PyEval_CallObject(meth, args);
538 Py_DECREF(meth);
539 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540
541 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000542}