blob: 4a206a13344af9bc8f937178722ac6a24a5a9c05 [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"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014
Guido van Rossum1d5735e1994-08-30 08:27:36 +000015#ifdef MPW /* MPW pushes 'extended' for float and double types with varargs */
16typedef extended va_double;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000017#else
Guido van Rossum1d5735e1994-08-30 08:27:36 +000018typedef double va_double;
19#endif
20
Guido van Rossum2e58ff31997-11-19 18:53:33 +000021/* Package context -- the full module name for package imports */
22char *_Py_PackageContext = NULL;
23
Guido van Rossum40b33c61997-08-02 03:07:46 +000024/* Py_InitModule4() parameters:
Guido van Rossum970a0a21995-01-09 17:47:20 +000025 - name is the module name
26 - methods is the list of top-level functions
27 - doc is the documentation string
28 - passthrough is passed as self to functions defined in the module
29 - api_version is the value of PYTHON_API_VERSION at the time the
30 module was compiled
Guido van Rossum40b33c61997-08-02 03:07:46 +000031
32 Return value is a borrowed reference to the module object; or NULL
33 if an error occurred (in Python 1.4 and before, errors were fatal).
34 Errors may still leak memory.
Guido van Rossum50620fa1995-01-07 12:43:18 +000035*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +000036
Guido van Rossum970a0a21995-01-09 17:47:20 +000037static char api_version_warning[] =
38"WARNING: Python C API version mismatch for module %s:\n\
Sjoerd Mullender996e6dc1996-01-23 16:07:29 +000039 This Python has API version %d, module %s has version %d.\n";
Guido van Rossum970a0a21995-01-09 17:47:20 +000040
Guido van Rossum79f25d91997-04-29 20:08:16 +000041PyObject *
42Py_InitModule4(name, methods, doc, passthrough, module_api_version)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000044 PyMethodDef *methods;
Guido van Rossum50620fa1995-01-07 12:43:18 +000045 char *doc;
Guido van Rossum79f25d91997-04-29 20:08:16 +000046 PyObject *passthrough;
Guido van Rossum970a0a21995-01-09 17:47:20 +000047 int module_api_version;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048{
Guido van Rossum79f25d91997-04-29 20:08:16 +000049 PyObject *m, *d, *v;
50 PyMethodDef *ml;
Guido van Rossum970a0a21995-01-09 17:47:20 +000051 if (module_api_version != PYTHON_API_VERSION)
52 fprintf(stderr, api_version_warning,
53 name, PYTHON_API_VERSION, name, module_api_version);
Guido van Rossum2e58ff31997-11-19 18:53:33 +000054 if (_Py_PackageContext != NULL) {
55 char *p = strrchr(_Py_PackageContext, '.');
56 if (p != NULL && strcmp(name, p+1) == 0) {
57 name = _Py_PackageContext;
58 _Py_PackageContext = NULL;
59 }
60 }
Guido van Rossum40b33c61997-08-02 03:07:46 +000061 if ((m = PyImport_AddModule(name)) == NULL)
62 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000063 d = PyModule_GetDict(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 for (ml = methods; ml->ml_name != NULL; ml++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000065 v = PyCFunction_New(ml, passthrough);
Guido van Rossum40b33c61997-08-02 03:07:46 +000066 if (v == NULL)
67 return NULL;
68 if (PyDict_SetItemString(d, ml->ml_name, v) != 0)
69 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000070 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071 }
Guido van Rossum50620fa1995-01-07 12:43:18 +000072 if (doc != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000073 v = PyString_FromString(doc);
74 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0)
Guido van Rossum40b33c61997-08-02 03:07:46 +000075 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000076 Py_DECREF(v);
Guido van Rossum50620fa1995-01-07 12:43:18 +000077 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000078 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000079}
80
81
Guido van Rossumbf80e541993-02-08 15:49:17 +000082/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000083
Guido van Rossum79f25d91997-04-29 20:08:16 +000084static int countformat Py_PROTO((char *format, int endchar));
Guido van Rossumfc61adb1992-04-13 15:53:41 +000085static int countformat(format, endchar)
86 char *format;
87 int endchar;
88{
89 int count = 0;
90 int level = 0;
91 while (level > 0 || *format != endchar) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +000092 switch (*format) {
93 case '\0':
Guido van Rossumfc61adb1992-04-13 15:53:41 +000094 /* Premature end */
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 PyErr_SetString(PyExc_SystemError,
96 "unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +000097 return -1;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000098 case '(':
99 case '[':
100 case '{':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000101 if (level == 0)
102 count++;
103 level++;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000104 break;
105 case ')':
106 case ']':
107 case '}':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000108 level--;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000109 break;
110 case '#':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000111 case '&':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000112 case ',':
113 case ':':
114 case ' ':
115 case '\t':
116 break;
117 default:
118 if (level == 0)
119 count++;
120 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000121 format++;
122 }
123 return count;
124}
125
126
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000127/* Generic function to create a value -- the inverse of getargs() */
128/* After an original idea and first implementation by Steven Miale */
129
Guido van Rossum79f25d91997-04-29 20:08:16 +0000130static PyObject *do_mktuple Py_PROTO((char**, va_list *, int, int));
131static PyObject *do_mklist Py_PROTO((char**, va_list *, int, int));
132static PyObject *do_mkdict Py_PROTO((char**, va_list *, int, int));
133static PyObject *do_mkvalue Py_PROTO((char**, va_list *));
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000134
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000135
Guido van Rossum79f25d91997-04-29 20:08:16 +0000136static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000137do_mkdict(p_format, p_va, endchar, n)
138 char **p_format;
139 va_list *p_va;
140 int endchar;
141 int n;
142{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000143 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000144 int i;
145 if (n < 0)
146 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147 if ((d = PyDict_New()) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000148 return NULL;
149 for (i = 0; i < n; i+= 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 PyObject *k, *v;
Guido van Rossumdb847bd1997-11-20 20:35:45 +0000151 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000152 k = do_mkvalue(p_format, p_va);
153 if (k == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000154 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000155 return NULL;
156 }
157 v = do_mkvalue(p_format, p_va);
158 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000159 Py_DECREF(k);
160 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000161 return NULL;
162 }
Guido van Rossumdb847bd1997-11-20 20:35:45 +0000163 err = PyDict_SetItem(d, k, v);
164 Py_DECREF(k);
165 Py_DECREF(v);
166 if (err < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000168 return NULL;
169 }
170 }
171 if (d != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000173 d = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174 PyErr_SetString(PyExc_SystemError,
175 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000176 }
177 else if (endchar)
178 ++*p_format;
179 return d;
180}
181
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000183do_mklist(p_format, p_va, endchar, n)
184 char **p_format;
185 va_list *p_va;
186 int endchar;
187 int n;
188{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000190 int i;
191 if (n < 0)
192 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000193 if ((v = PyList_New(n)) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000194 return NULL;
195 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000196 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000197 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000198 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000199 return NULL;
200 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000201 PyList_SetItem(v, i, w);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000202 }
203 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000204 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000205 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 PyErr_SetString(PyExc_SystemError,
207 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000208 }
209 else if (endchar)
210 ++*p_format;
211 return v;
212}
213
Fred Drake25d34472000-04-28 14:42:37 +0000214static int
215_ustrlen(Py_UNICODE *u)
216{
217 int i = 0;
218 Py_UNICODE *v = u;
219 while (*v != 0) { i++; v++; }
220 return i;
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
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000282#ifdef HAVE_LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000283 case 'L':
Guido van Rossum3293b071998-08-25 16:07:15 +0000284 return PyLong_FromLongLong((LONG_LONG)va_arg(*p_va, LONG_LONG));
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000285#endif
Fred Drake25d34472000-04-28 14:42:37 +0000286 case 'u':
287 {
288 PyObject *v;
289 Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
290 int n;
291 if (**p_format == '#') {
292 ++*p_format;
293 n = va_arg(*p_va, int);
294 }
295 else
296 n = -1;
297 if (u == NULL) {
298 v = Py_None;
299 Py_INCREF(v);
300 }
301 else {
302 if (n < 0)
303 n = _ustrlen(u);
304 v = PyUnicode_FromUnicode(u, n);
305 }
306 return v;
307 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000308 case 'f':
309 case 'd':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 return PyFloat_FromDouble(
311 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000312
313 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000314 {
315 char p[1];
316 p[0] = va_arg(*p_va, int);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 return PyString_FromStringAndSize(p, 1);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000318 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000319
320 case 's':
321 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000322 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 PyObject *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000324 char *str = va_arg(*p_va, char *);
325 int n;
326 if (**p_format == '#') {
327 ++*p_format;
328 n = va_arg(*p_va, int);
329 }
330 else
331 n = -1;
332 if (str == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 v = Py_None;
334 Py_INCREF(v);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000335 }
336 else {
Guido van Rossum582acec2000-06-28 22:07:35 +0000337 if (n < 0) {
338 size_t m = strlen(str);
339 if (m > INT_MAX) {
340 PyErr_SetString(PyExc_OverflowError,
341 "string too long for Python string");
342 return NULL;
343 }
344 n = (int)m;
345 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000346 v = PyString_FromStringAndSize(str, n);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000347 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000348 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000349 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000350
Guido van Rossumd3415001998-12-23 05:01:38 +0000351 case 'N':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000352 case 'S':
353 case 'O':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000354 if (**p_format == '&') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 typedef PyObject *(*converter) Py_PROTO((void *));
Guido van Rossumd1b93931995-01-20 16:56:02 +0000356 converter func = va_arg(*p_va, converter);
357 void *arg = va_arg(*p_va, void *);
358 ++*p_format;
359 return (*func)(arg);
360 }
361 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000362 PyObject *v;
363 v = va_arg(*p_va, PyObject *);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000364 if (v != NULL) {
Guido van Rossumd3415001998-12-23 05:01:38 +0000365 if (*(*p_format - 1) != 'N')
366 Py_INCREF(v);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000367 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000368 else if (!PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369 /* If a NULL was passed
370 * because a call that should
371 * have constructed a value
372 * failed, that's OK, and we
373 * pass the error on; but if
374 * no error occurred it's not
375 * clear that the caller knew
376 * what she was doing. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000377 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000378 "NULL object passed to Py_BuildValue");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000379 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000380 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000381
382 case ':':
383 case ',':
384 case ' ':
385 case '\t':
386 break;
387
388 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000390 "bad format char passed to Py_BuildValue");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000391 return NULL;
392
393 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000394 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000395}
396
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000398#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000399/* VARARGS 2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000400PyObject *Py_BuildValue(char *format, ...)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000401#else
402/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403PyObject *Py_BuildValue(va_alist) va_dcl
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000404#endif
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000405{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000406 va_list va;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000407 PyObject* retval;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000408#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000409 va_start(va, format);
410#else
411 char *format;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000412 va_start(va);
413 format = va_arg(va, char *);
414#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 retval = Py_VaBuildValue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000416 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000417 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000418}
Guido van Rossume5372401993-03-16 12:15:04 +0000419
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420PyObject *
421Py_VaBuildValue(format, va)
Guido van Rossume5372401993-03-16 12:15:04 +0000422 char *format;
423 va_list va;
424{
425 char *f = format;
426 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000427 va_list lva;
428
429#ifdef VA_LIST_IS_ARRAY
430 memcpy(lva, va, sizeof(va_list));
431#else
432 lva = va;
433#endif
434
Guido van Rossume5372401993-03-16 12:15:04 +0000435 if (n < 0)
436 return NULL;
437 if (n == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 Py_INCREF(Py_None);
439 return Py_None;
Guido van Rossume5372401993-03-16 12:15:04 +0000440 }
441 if (n == 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 return do_mkvalue(&f, &lva);
443 return do_mktuple(&f, &lva, '\0', n);
444}
445
446
447#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448PyObject *
449PyEval_CallFunction(PyObject *obj, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000452PyEval_CallFunction(obj, format, va_alist)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 PyObject *obj;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454 char *format;
455 va_dcl
456#endif
457{
458 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyObject *args;
460 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461
462#ifdef HAVE_STDARG_PROTOTYPES
463 va_start(vargs, format);
464#else
465 va_start(vargs);
466#endif
467
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000469 va_end(vargs);
470
471 if (args == NULL)
472 return NULL;
473
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 res = PyEval_CallObject(obj, args);
475 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000476
477 return res;
478}
479
480
481#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482PyObject *
Guido van Rossumc4099e61998-08-08 20:51:26 +0000483PyEval_CallMethod(PyObject *obj, char *methodname, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000484#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000485PyObject *
Guido van Rossumc4099e61998-08-08 20:51:26 +0000486PyEval_CallMethod(obj, methodname, format, va_alist)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000487 PyObject *obj;
Guido van Rossumc4099e61998-08-08 20:51:26 +0000488 char *methodname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000489 char *format;
490 va_dcl
491#endif
492{
493 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000494 PyObject *meth;
495 PyObject *args;
496 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000497
Guido van Rossumc4099e61998-08-08 20:51:26 +0000498 meth = PyObject_GetAttrString(obj, methodname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000499 if (meth == NULL)
500 return NULL;
501
502#ifdef HAVE_STDARG_PROTOTYPES
503 va_start(vargs, format);
504#else
505 va_start(vargs);
506#endif
507
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509 va_end(vargs);
510
511 if (args == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 Py_DECREF(meth);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513 return NULL;
514 }
515
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 res = PyEval_CallObject(meth, args);
517 Py_DECREF(meth);
518 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519
520 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000521}