blob: 1f8ef07d17139ac60c86865d9c8d1879899270e8 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Module support implementation */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Guido van Rossum1d5735e1994-08-30 08:27:36 +00006#ifdef MPW /* MPW pushes 'extended' for float and double types with varargs */
7typedef extended va_double;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00008#else
Guido van Rossum1d5735e1994-08-30 08:27:36 +00009typedef double va_double;
10#endif
11
Guido van Rossum2e58ff31997-11-19 18:53:33 +000012/* Package context -- the full module name for package imports */
13char *_Py_PackageContext = NULL;
14
Guido van Rossum40b33c61997-08-02 03:07:46 +000015/* Py_InitModule4() parameters:
Guido van Rossum970a0a21995-01-09 17:47:20 +000016 - name is the module name
17 - methods is the list of top-level functions
18 - doc is the documentation string
19 - passthrough is passed as self to functions defined in the module
20 - api_version is the value of PYTHON_API_VERSION at the time the
21 module was compiled
Guido van Rossum40b33c61997-08-02 03:07:46 +000022
23 Return value is a borrowed reference to the module object; or NULL
24 if an error occurred (in Python 1.4 and before, errors were fatal).
25 Errors may still leak memory.
Guido van Rossum50620fa1995-01-07 12:43:18 +000026*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +000027
Guido van Rossum970a0a21995-01-09 17:47:20 +000028static char api_version_warning[] =
Marc-André Lemburge5006eb2001-07-31 13:24:44 +000029"Python C API version mismatch for module %.100s:\
30 This Python has API version %d, module %.100s has version %d.";
Guido van Rossum970a0a21995-01-09 17:47:20 +000031
Guido van Rossum79f25d91997-04-29 20:08:16 +000032PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000033Py_InitModule4(char *name, PyMethodDef *methods, char *doc,
34 PyObject *passthrough, int module_api_version)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035{
Guido van Rossum79f25d91997-04-29 20:08:16 +000036 PyObject *m, *d, *v;
37 PyMethodDef *ml;
Guido van Rossum413407f2000-08-04 14:00:14 +000038 if (!Py_IsInitialized())
39 Py_FatalError("Interpreter not initialized (version mismatch?)");
Marc-André Lemburge5006eb2001-07-31 13:24:44 +000040 if (module_api_version != PYTHON_API_VERSION) {
41 char message[512];
42 PyOS_snprintf(message, sizeof(message),
43 api_version_warning, name,
44 PYTHON_API_VERSION, name,
45 module_api_version);
46 if (PyErr_Warn(PyExc_RuntimeWarning, message))
47 return NULL;
48 }
Guido van Rossum2e58ff31997-11-19 18:53:33 +000049 if (_Py_PackageContext != NULL) {
50 char *p = strrchr(_Py_PackageContext, '.');
51 if (p != NULL && strcmp(name, p+1) == 0) {
52 name = _Py_PackageContext;
53 _Py_PackageContext = NULL;
54 }
55 }
Guido van Rossum40b33c61997-08-02 03:07:46 +000056 if ((m = PyImport_AddModule(name)) == NULL)
57 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000058 d = PyModule_GetDict(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 for (ml = methods; ml->ml_name != NULL; ml++) {
Fred Drake7bf97152002-03-28 05:33:33 +000060 if ((ml->ml_flags & METH_CLASS) ||
61 (ml->ml_flags & METH_STATIC)) {
62 PyErr_SetString(PyExc_ValueError,
63 "module functions cannot set"
64 " METH_CLASS or METH_STATIC");
65 return NULL;
66 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000067 v = PyCFunction_New(ml, passthrough);
Guido van Rossum40b33c61997-08-02 03:07:46 +000068 if (v == NULL)
69 return NULL;
Fred Drake289898c2001-08-04 03:11:25 +000070 if (PyDict_SetItemString(d, ml->ml_name, v) != 0) {
71 Py_DECREF(v);
Guido van Rossum40b33c61997-08-02 03:07:46 +000072 return NULL;
Fred Drake289898c2001-08-04 03:11:25 +000073 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000074 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075 }
Guido van Rossum50620fa1995-01-07 12:43:18 +000076 if (doc != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000077 v = PyString_FromString(doc);
Fred Drake289898c2001-08-04 03:11:25 +000078 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) {
79 Py_DECREF(v);
Guido van Rossum40b33c61997-08-02 03:07:46 +000080 return NULL;
Fred Drake289898c2001-08-04 03:11:25 +000081 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000082 Py_DECREF(v);
Guido van Rossum50620fa1995-01-07 12:43:18 +000083 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000084 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085}
86
87
Guido van Rossumbf80e541993-02-08 15:49:17 +000088/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000089
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000090static int countformat(char *format, int endchar)
Guido van Rossumfc61adb1992-04-13 15:53:41 +000091{
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
Tim Petersdbd9ba62000-07-09 03:09:57 +0000133static PyObject *do_mktuple(char**, va_list *, int, int);
134static PyObject *do_mklist(char**, va_list *, int, int);
135static PyObject *do_mkdict(char**, va_list *, int, int);
136static PyObject *do_mkvalue(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 *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000140do_mkdict(char **p_format, va_list *p_va, int endchar, int n)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000141{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000143 int i;
144 if (n < 0)
145 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 if ((d = PyDict_New()) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000147 return NULL;
148 for (i = 0; i < n; i+= 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 PyObject *k, *v;
Guido van Rossumdb847bd1997-11-20 20:35:45 +0000150 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000151 k = do_mkvalue(p_format, p_va);
152 if (k == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000154 return NULL;
155 }
156 v = do_mkvalue(p_format, p_va);
157 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158 Py_DECREF(k);
159 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000160 return NULL;
161 }
Guido van Rossumdb847bd1997-11-20 20:35:45 +0000162 err = PyDict_SetItem(d, k, v);
163 Py_DECREF(k);
164 Py_DECREF(v);
165 if (err < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000167 return NULL;
168 }
169 }
170 if (d != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000172 d = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173 PyErr_SetString(PyExc_SystemError,
174 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000175 }
176 else if (endchar)
177 ++*p_format;
178 return d;
179}
180
Guido van Rossum79f25d91997-04-29 20:08:16 +0000181static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000182do_mklist(char **p_format, va_list *p_va, int endchar, int n)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000183{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000185 int i;
186 if (n < 0)
187 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 if ((v = PyList_New(n)) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000189 return NULL;
190 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000192 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000193 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000194 return NULL;
195 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000196 PyList_SetItem(v, i, w);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000197 }
198 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000199 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000200 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000201 PyErr_SetString(PyExc_SystemError,
202 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000203 }
204 else if (endchar)
205 ++*p_format;
206 return v;
207}
208
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000209#ifdef Py_USING_UNICODE
Fred Drake25d34472000-04-28 14:42:37 +0000210static int
211_ustrlen(Py_UNICODE *u)
212{
213 int i = 0;
214 Py_UNICODE *v = u;
215 while (*v != 0) { i++; v++; }
216 return i;
217}
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000218#endif
Fred Drake25d34472000-04-28 14:42:37 +0000219
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000221do_mktuple(char **p_format, va_list *p_va, int endchar, int n)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000222{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223 PyObject *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000224 int i;
225 if (n < 0)
226 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 if ((v = PyTuple_New(n)) == NULL)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000228 return NULL;
229 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000231 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000233 return NULL;
234 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000235 PyTuple_SetItem(v, i, w);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000236 }
237 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000238 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000239 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240 PyErr_SetString(PyExc_SystemError,
241 "Unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000242 }
243 else if (endchar)
244 ++*p_format;
245 return v;
246}
247
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000249do_mkvalue(char **p_format, va_list *p_va)
Guido van Rossum899dcf31992-05-15 11:04:59 +0000250{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000251 for (;;) {
252 switch (*(*p_format)++) {
253 case '(':
254 return do_mktuple(p_format, p_va, ')',
255 countformat(*p_format, ')'));
256
257 case '[':
258 return do_mklist(p_format, p_va, ']',
259 countformat(*p_format, ']'));
260
261 case '{':
262 return do_mkdict(p_format, p_va, '}',
263 countformat(*p_format, '}'));
264
265 case 'b':
Jack Jansenb763b9d2000-09-15 12:51:01 +0000266 case 'B':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000267 case 'h':
268 case 'i':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 return PyInt_FromLong((long)va_arg(*p_va, int));
Jack Jansend50338f2000-07-06 12:22:00 +0000270
271 case 'H':
272 return PyInt_FromLong((long)va_arg(*p_va, unsigned int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000273
274 case 'l':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 return PyInt_FromLong((long)va_arg(*p_va, long));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000276
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000277#ifdef HAVE_LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000278 case 'L':
Guido van Rossum3293b071998-08-25 16:07:15 +0000279 return PyLong_FromLongLong((LONG_LONG)va_arg(*p_va, LONG_LONG));
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000280#endif
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000281#ifdef Py_USING_UNICODE
Fred Drake25d34472000-04-28 14:42:37 +0000282 case 'u':
283 {
284 PyObject *v;
285 Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
286 int n;
287 if (**p_format == '#') {
288 ++*p_format;
289 n = va_arg(*p_va, int);
290 }
291 else
292 n = -1;
293 if (u == NULL) {
294 v = Py_None;
295 Py_INCREF(v);
296 }
297 else {
298 if (n < 0)
299 n = _ustrlen(u);
300 v = PyUnicode_FromUnicode(u, n);
301 }
302 return v;
303 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000304#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000305 case 'f':
306 case 'd':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 return PyFloat_FromDouble(
308 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000309
Fred Drakeaec79242001-03-12 21:03:26 +0000310#ifndef WITHOUT_COMPLEX
311 case 'D':
312 return PyComplex_FromCComplex(
313 *((Py_complex *)va_arg(*p_va, Py_complex *)));
314#endif /* WITHOUT_COMPLEX */
315
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000316 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000317 {
318 char p[1];
319 p[0] = va_arg(*p_va, int);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000320 return PyString_FromStringAndSize(p, 1);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000321 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000322
323 case 's':
324 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000325 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326 PyObject *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000327 char *str = va_arg(*p_va, char *);
328 int n;
329 if (**p_format == '#') {
330 ++*p_format;
331 n = va_arg(*p_va, int);
332 }
333 else
334 n = -1;
335 if (str == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 v = Py_None;
337 Py_INCREF(v);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000338 }
339 else {
Guido van Rossum582acec2000-06-28 22:07:35 +0000340 if (n < 0) {
341 size_t m = strlen(str);
342 if (m > INT_MAX) {
343 PyErr_SetString(PyExc_OverflowError,
344 "string too long for Python string");
345 return NULL;
346 }
347 n = (int)m;
348 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000349 v = PyString_FromStringAndSize(str, n);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000350 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000351 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000352 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000353
Guido van Rossumd3415001998-12-23 05:01:38 +0000354 case 'N':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355 case 'S':
356 case 'O':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000357 if (**p_format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +0000358 typedef PyObject *(*converter)(void *);
Guido van Rossumd1b93931995-01-20 16:56:02 +0000359 converter func = va_arg(*p_va, converter);
360 void *arg = va_arg(*p_va, void *);
361 ++*p_format;
362 return (*func)(arg);
363 }
364 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000365 PyObject *v;
366 v = va_arg(*p_va, PyObject *);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000367 if (v != NULL) {
Guido van Rossumd3415001998-12-23 05:01:38 +0000368 if (*(*p_format - 1) != 'N')
369 Py_INCREF(v);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000370 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 else if (!PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372 /* If a NULL was passed
373 * because a call that should
374 * have constructed a value
375 * failed, that's OK, and we
376 * pass the error on; but if
377 * no error occurred it's not
378 * clear that the caller knew
379 * what she was doing. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000380 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000381 "NULL object passed to Py_BuildValue");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000382 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000383 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000384
385 case ':':
386 case ',':
387 case ' ':
388 case '\t':
389 break;
390
391 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000393 "bad format char passed to Py_BuildValue");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000394 return NULL;
395
396 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000397 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000398}
399
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000400
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401PyObject *Py_BuildValue(char *format, ...)
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000402{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000403 va_list va;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000404 PyObject* retval;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000405 va_start(va, format);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000406 retval = Py_VaBuildValue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000407 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000408 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000409}
Guido van Rossume5372401993-03-16 12:15:04 +0000410
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000412Py_VaBuildValue(char *format, va_list va)
Guido van Rossume5372401993-03-16 12:15:04 +0000413{
414 char *f = format;
415 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000416 va_list lva;
417
418#ifdef VA_LIST_IS_ARRAY
419 memcpy(lva, va, sizeof(va_list));
420#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +0000421#ifdef __va_copy
422 __va_copy(lva, va);
423#else
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000424 lva = va;
425#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +0000426#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000427
Guido van Rossume5372401993-03-16 12:15:04 +0000428 if (n < 0)
429 return NULL;
430 if (n == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 Py_INCREF(Py_None);
432 return Py_None;
Guido van Rossume5372401993-03-16 12:15:04 +0000433 }
434 if (n == 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435 return do_mkvalue(&f, &lva);
436 return do_mktuple(&f, &lva, '\0', n);
437}
438
439
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440PyObject *
441PyEval_CallFunction(PyObject *obj, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442{
443 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 PyObject *args;
445 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000447 va_start(vargs, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450 va_end(vargs);
451
452 if (args == NULL)
453 return NULL;
454
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 res = PyEval_CallObject(obj, args);
456 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457
458 return res;
459}
460
461
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462PyObject *
Guido van Rossumc4099e61998-08-08 20:51:26 +0000463PyEval_CallMethod(PyObject *obj, char *methodname, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000464{
465 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 PyObject *meth;
467 PyObject *args;
468 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000469
Guido van Rossumc4099e61998-08-08 20:51:26 +0000470 meth = PyObject_GetAttrString(obj, methodname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471 if (meth == NULL)
472 return NULL;
473
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000474 va_start(vargs, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000475
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000477 va_end(vargs);
478
479 if (args == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 Py_DECREF(meth);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000481 return NULL;
482 }
483
Guido van Rossum79f25d91997-04-29 20:08:16 +0000484 res = PyEval_CallObject(meth, args);
485 Py_DECREF(meth);
486 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000487
488 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000489}
Fred Drake9e285152000-09-23 03:24:27 +0000490
491int
492PyModule_AddObject(PyObject *m, char *name, PyObject *o)
493{
494 PyObject *dict;
Fred Drake83115182002-06-17 17:16:57 +0000495 if (!PyModule_Check(m) || o == NULL) {
496 PyErr_SetString(PyExc_TypeError,
497 "PyModule_AddObject() needs module as first arg");
Fred Drake9e285152000-09-23 03:24:27 +0000498 return -1;
Fred Drake83115182002-06-17 17:16:57 +0000499 }
500 dict = PyModule_GetDict(m);
501 if (dict == NULL) {
502 /* Internal error -- modules must have a dict! */
503 PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
504 PyModule_GetName(m));
505 return -1;
506 }
507 if (PyDict_SetItemString(dict, name, o))
508 return -1;
509 Py_DECREF(o);
510 return 0;
Fred Drake9e285152000-09-23 03:24:27 +0000511}
512
513int
514PyModule_AddIntConstant(PyObject *m, char *name, long value)
515{
516 return PyModule_AddObject(m, name, PyInt_FromLong(value));
517}
518
519int
520PyModule_AddStringConstant(PyObject *m, char *name, char *value)
521{
522 return PyModule_AddObject(m, name, PyString_FromString(value));
523}