blob: b88c1edff287fae2a7642e5d4d71778c041a19b1 [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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006#define FLAG_SIZE_T 1
Guido van Rossum1d5735e1994-08-30 08:27:36 +00007typedef double va_double;
Guido van Rossum1d5735e1994-08-30 08:27:36 +00008
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00009static PyObject *va_build_value(const char *, va_list, int);
10
Guido van Rossum2e58ff31997-11-19 18:53:33 +000011/* Package context -- the full module name for package imports */
12char *_Py_PackageContext = NULL;
13
Guido van Rossumbf80e541993-02-08 15:49:17 +000014/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000015
Fred Drakeceead6d2003-01-30 15:08:25 +000016static int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +000017countformat(const char *format, int endchar)
Guido van Rossumfc61adb1992-04-13 15:53:41 +000018{
19 int count = 0;
20 int level = 0;
21 while (level > 0 || *format != endchar) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +000022 switch (*format) {
23 case '\0':
Guido van Rossumfc61adb1992-04-13 15:53:41 +000024 /* Premature end */
Guido van Rossum79f25d91997-04-29 20:08:16 +000025 PyErr_SetString(PyExc_SystemError,
26 "unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +000027 return -1;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000028 case '(':
29 case '[':
30 case '{':
Guido van Rossumfc61adb1992-04-13 15:53:41 +000031 if (level == 0)
32 count++;
33 level++;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000034 break;
35 case ')':
36 case ']':
37 case '}':
Guido van Rossumfc61adb1992-04-13 15:53:41 +000038 level--;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039 break;
40 case '#':
Guido van Rossumd1b93931995-01-20 16:56:02 +000041 case '&':
Guido van Rossum1ae940a1995-01-02 19:04:15 +000042 case ',':
43 case ':':
44 case ' ':
45 case '\t':
46 break;
47 default:
48 if (level == 0)
49 count++;
50 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +000051 format++;
52 }
53 return count;
54}
55
56
Guido van Rossumfc61adb1992-04-13 15:53:41 +000057/* Generic function to create a value -- the inverse of getargs() */
58/* After an original idea and first implementation by Steven Miale */
59
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000060static PyObject *do_mktuple(const char**, va_list *, int, int, int);
61static PyObject *do_mklist(const char**, va_list *, int, int, int);
62static PyObject *do_mkdict(const char**, va_list *, int, int, int);
63static PyObject *do_mkvalue(const char**, va_list *, int);
Guido van Rossumfc61adb1992-04-13 15:53:41 +000064
Guido van Rossum1ae940a1995-01-02 19:04:15 +000065
Guido van Rossum79f25d91997-04-29 20:08:16 +000066static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000067do_mkdict(const char **p_format, va_list *p_va, int endchar, int n, int flags)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068{
Guido van Rossum79f25d91997-04-29 20:08:16 +000069 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070 int i;
Michael W. Hudsonc849e632004-07-14 11:28:06 +000071 int itemfailed = 0;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000072 if (n < 0)
73 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000074 if ((d = PyDict_New()) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000075 return NULL;
Michael W. Hudsonc849e632004-07-14 11:28:06 +000076 /* Note that we can't bail immediately on error as this will leak
77 refcounts on any 'N' arguments. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000078 for (i = 0; i < n; i+= 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000079 PyObject *k, *v;
Guido van Rossumdb847bd1997-11-20 20:35:45 +000080 int err;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000081 k = do_mkvalue(p_format, p_va, flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000082 if (k == NULL) {
Michael W. Hudsonc849e632004-07-14 11:28:06 +000083 itemfailed = 1;
84 Py_INCREF(Py_None);
85 k = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000086 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000087 v = do_mkvalue(p_format, p_va, flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000088 if (v == NULL) {
Michael W. Hudsonc849e632004-07-14 11:28:06 +000089 itemfailed = 1;
90 Py_INCREF(Py_None);
91 v = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000092 }
Guido van Rossumdb847bd1997-11-20 20:35:45 +000093 err = PyDict_SetItem(d, k, v);
94 Py_DECREF(k);
95 Py_DECREF(v);
Michael W. Hudsonc849e632004-07-14 11:28:06 +000096 if (err < 0 || itemfailed) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000098 return NULL;
99 }
100 }
101 if (d != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000102 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000103 d = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000104 PyErr_SetString(PyExc_SystemError,
105 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000106 }
107 else if (endchar)
108 ++*p_format;
109 return d;
110}
111
Guido van Rossum79f25d91997-04-29 20:08:16 +0000112static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000113do_mklist(const char **p_format, va_list *p_va, int endchar, int n, int flags)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000114{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000116 int i;
Michael W. Hudsonc849e632004-07-14 11:28:06 +0000117 int itemfailed = 0;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000118 if (n < 0)
119 return NULL;
Neal Norwitz3e90fa52006-03-06 23:07:34 +0000120 v = PyList_New(n);
121 if (v == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000122 return NULL;
Michael W. Hudsonc849e632004-07-14 11:28:06 +0000123 /* Note that we can't bail immediately on error as this will leak
124 refcounts on any 'N' arguments. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000125 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000126 PyObject *w = do_mkvalue(p_format, p_va, flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000127 if (w == NULL) {
Michael W. Hudsonc849e632004-07-14 11:28:06 +0000128 itemfailed = 1;
129 Py_INCREF(Py_None);
130 w = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000131 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000132 PyList_SET_ITEM(v, i, w);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000133 }
Neal Norwitz3e90fa52006-03-06 23:07:34 +0000134
135 if (itemfailed) {
136 /* do_mkvalue() should have already set an error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000137 Py_DECREF(v);
Neal Norwitz3e90fa52006-03-06 23:07:34 +0000138 return NULL;
139 }
140 if (**p_format != endchar) {
141 Py_DECREF(v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 PyErr_SetString(PyExc_SystemError,
143 "Unmatched paren in format");
Neal Norwitz3e90fa52006-03-06 23:07:34 +0000144 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000145 }
Neal Norwitz3e90fa52006-03-06 23:07:34 +0000146 if (endchar)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000147 ++*p_format;
148 return v;
149}
150
Fred Drake25d34472000-04-28 14:42:37 +0000151static int
152_ustrlen(Py_UNICODE *u)
153{
154 int i = 0;
155 Py_UNICODE *v = u;
156 while (*v != 0) { i++; v++; }
157 return i;
158}
159
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000161do_mktuple(const char **p_format, va_list *p_va, int endchar, int n, int flags)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000162{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 PyObject *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000164 int i;
Michael W. Hudsonc849e632004-07-14 11:28:06 +0000165 int itemfailed = 0;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000166 if (n < 0)
167 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 if ((v = PyTuple_New(n)) == NULL)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000169 return NULL;
Michael W. Hudsonc849e632004-07-14 11:28:06 +0000170 /* Note that we can't bail immediately on error as this will leak
171 refcounts on any 'N' arguments. */
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000172 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000173 PyObject *w = do_mkvalue(p_format, p_va, flags);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000174 if (w == NULL) {
Michael W. Hudsonc849e632004-07-14 11:28:06 +0000175 itemfailed = 1;
176 Py_INCREF(Py_None);
177 w = Py_None;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000178 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000179 PyTuple_SET_ITEM(v, i, w);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000180 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000181 if (itemfailed) {
182 /* do_mkvalue() should have already set an error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 Py_DECREF(v);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000184 return NULL;
185 }
186 if (**p_format != endchar) {
187 Py_DECREF(v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 PyErr_SetString(PyExc_SystemError,
189 "Unmatched paren in format");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000190 return NULL;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000191 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000192 if (endchar)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000193 ++*p_format;
194 return v;
195}
196
Guido van Rossum79f25d91997-04-29 20:08:16 +0000197static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000198do_mkvalue(const char **p_format, va_list *p_va, int flags)
Guido van Rossum899dcf31992-05-15 11:04:59 +0000199{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000200 for (;;) {
201 switch (*(*p_format)++) {
202 case '(':
203 return do_mktuple(p_format, p_va, ')',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000204 countformat(*p_format, ')'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000205
206 case '[':
207 return do_mklist(p_format, p_va, ']',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000208 countformat(*p_format, ']'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000209
210 case '{':
211 return do_mkdict(p_format, p_va, '}',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000212 countformat(*p_format, '}'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000213
214 case 'b':
Jack Jansenb763b9d2000-09-15 12:51:01 +0000215 case 'B':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000216 case 'h':
217 case 'i':
Christian Heimes217cfd12007-12-02 14:31:20 +0000218 return PyLong_FromLong((long)va_arg(*p_va, int));
Jack Jansend50338f2000-07-06 12:22:00 +0000219
220 case 'H':
Christian Heimes217cfd12007-12-02 14:31:20 +0000221 return PyLong_FromLong((long)va_arg(*p_va, unsigned int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000222
Georg Brandlf06e30a2005-11-24 15:37:42 +0000223 case 'I':
224 {
225 unsigned int n;
226 n = va_arg(*p_va, unsigned int);
Martin v. Löwis327858e2007-12-04 22:18:27 +0000227 return PyLong_FromUnsignedLong(n);
Georg Brandlf06e30a2005-11-24 15:37:42 +0000228 }
229
Martin v. Löwis18e16552006-02-15 17:27:45 +0000230 case 'n':
231#if SIZEOF_SIZE_T!=SIZEOF_LONG
Christian Heimes217cfd12007-12-02 14:31:20 +0000232 return PyLong_FromSsize_t(va_arg(*p_va, Py_ssize_t));
Martin v. Löwis18e16552006-02-15 17:27:45 +0000233#endif
234 /* Fall through from 'n' to 'l' if Py_ssize_t is long */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000235 case 'l':
Christian Heimes217cfd12007-12-02 14:31:20 +0000236 return PyLong_FromLong(va_arg(*p_va, long));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000237
Jack Jansendbd65032003-04-17 22:01:10 +0000238 case 'k':
Georg Brandlf06e30a2005-11-24 15:37:42 +0000239 {
240 unsigned long n;
241 n = va_arg(*p_va, unsigned long);
Martin v. Löwis327858e2007-12-04 22:18:27 +0000242 return PyLong_FromUnsignedLong(n);
Georg Brandlf06e30a2005-11-24 15:37:42 +0000243 }
Jack Jansendbd65032003-04-17 22:01:10 +0000244
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000245#ifdef HAVE_LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000246 case 'L':
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000247 return PyLong_FromLongLong((PY_LONG_LONG)va_arg(*p_va, PY_LONG_LONG));
Jack Jansendbd65032003-04-17 22:01:10 +0000248
249 case 'K':
Georg Brandlf06e30a2005-11-24 15:37:42 +0000250 return PyLong_FromUnsignedLongLong((PY_LONG_LONG)va_arg(*p_va, unsigned PY_LONG_LONG));
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000251#endif
Fred Drake25d34472000-04-28 14:42:37 +0000252 case 'u':
253 {
254 PyObject *v;
255 Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000256 Py_ssize_t n;
Fred Drake25d34472000-04-28 14:42:37 +0000257 if (**p_format == '#') {
258 ++*p_format;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000259 if (flags & FLAG_SIZE_T)
260 n = va_arg(*p_va, Py_ssize_t);
261 else
262 n = va_arg(*p_va, int);
Fred Drake25d34472000-04-28 14:42:37 +0000263 }
264 else
265 n = -1;
266 if (u == NULL) {
267 v = Py_None;
268 Py_INCREF(v);
269 }
270 else {
271 if (n < 0)
272 n = _ustrlen(u);
273 v = PyUnicode_FromUnicode(u, n);
274 }
275 return v;
276 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000277 case 'f':
278 case 'd':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 return PyFloat_FromDouble(
280 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000281
Fred Drakeaec79242001-03-12 21:03:26 +0000282#ifndef WITHOUT_COMPLEX
283 case 'D':
284 return PyComplex_FromCComplex(
285 *((Py_complex *)va_arg(*p_va, Py_complex *)));
286#endif /* WITHOUT_COMPLEX */
287
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000288 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000289 {
Walter Dörwaldd0941302007-07-01 21:58:22 +0000290 char p[1];
291 p[0] = (char)va_arg(*p_va, int);
Martin v. Löwis10a60b32007-07-18 02:28:27 +0000292 return PyUnicode_FromStringAndSize(p, 1);
Walter Dörwaldd0941302007-07-01 21:58:22 +0000293 }
294 case 'C':
295 {
Walter Dörwaldbc1f8862007-06-20 11:02:38 +0000296 int i = va_arg(*p_va, int);
297 Py_UNICODE c;
298 if (i < 0 || i > PyUnicode_GetMax()) {
299#ifdef Py_UNICODE_WIDE
300 PyErr_SetString(PyExc_OverflowError,
301 "%c arg not in range(0x110000) "
302 "(wide Python build)");
303#else
304 PyErr_SetString(PyExc_OverflowError,
305 "%c arg not in range(0x10000) "
306 "(narrow Python build)");
307#endif
308 return NULL;
309 }
310 c = i;
311 return PyUnicode_FromUnicode(&c, 1);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000312 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000313
314 case 's':
315 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000316 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 PyObject *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000318 char *str = va_arg(*p_va, char *);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000319 Py_ssize_t n;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000320 if (**p_format == '#') {
321 ++*p_format;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000322 if (flags & FLAG_SIZE_T)
323 n = va_arg(*p_va, Py_ssize_t);
324 else
325 n = va_arg(*p_va, int);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000326 }
327 else
328 n = -1;
329 if (str == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000330 v = Py_None;
331 Py_INCREF(v);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000332 }
333 else {
Guido van Rossum582acec2000-06-28 22:07:35 +0000334 if (n < 0) {
335 size_t m = strlen(str);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000336 if (m > PY_SSIZE_T_MAX) {
Guido van Rossum582acec2000-06-28 22:07:35 +0000337 PyErr_SetString(PyExc_OverflowError,
338 "string too long for Python string");
339 return NULL;
340 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000341 n = (Py_ssize_t)m;
Guido van Rossum582acec2000-06-28 22:07:35 +0000342 }
Martin v. Löwis10a60b32007-07-18 02:28:27 +0000343 v = PyUnicode_FromStringAndSize(str, n);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000344 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000345 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000346 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000347
Walter Dörwaldd2034312007-05-18 16:29:38 +0000348 case 'U':
349 {
350 PyObject *v;
351 char *str = va_arg(*p_va, char *);
352 Py_ssize_t n;
353 if (**p_format == '#') {
354 ++*p_format;
355 if (flags & FLAG_SIZE_T)
356 n = va_arg(*p_va, Py_ssize_t);
357 else
358 n = va_arg(*p_va, int);
359 }
360 else
361 n = -1;
362 if (str == NULL) {
363 v = Py_None;
364 Py_INCREF(v);
365 }
366 else {
367 if (n < 0) {
368 size_t m = strlen(str);
369 if (m > PY_SSIZE_T_MAX) {
370 PyErr_SetString(PyExc_OverflowError,
371 "string too long for Python string");
372 return NULL;
373 }
374 n = (Py_ssize_t)m;
375 }
376 v = PyUnicode_FromStringAndSize(str, n);
377 }
378 return v;
379 }
380
Walter Dörwald612344f2007-05-04 19:28:21 +0000381 case 'y':
382 {
383 PyObject *v;
384 char *str = va_arg(*p_va, char *);
385 Py_ssize_t n;
386 if (**p_format == '#') {
387 ++*p_format;
388 if (flags & FLAG_SIZE_T)
389 n = va_arg(*p_va, Py_ssize_t);
390 else
391 n = va_arg(*p_va, int);
392 }
393 else
394 n = -1;
395 if (str == NULL) {
396 v = Py_None;
397 Py_INCREF(v);
398 }
399 else {
400 if (n < 0) {
401 size_t m = strlen(str);
402 if (m > PY_SSIZE_T_MAX) {
403 PyErr_SetString(PyExc_OverflowError,
404 "string too long for Python bytes");
405 return NULL;
406 }
407 n = (Py_ssize_t)m;
408 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000409 v = PyBytes_FromStringAndSize(str, n);
Walter Dörwald612344f2007-05-04 19:28:21 +0000410 }
411 return v;
412 }
413
Guido van Rossumd3415001998-12-23 05:01:38 +0000414 case 'N':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415 case 'S':
416 case 'O':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000417 if (**p_format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +0000418 typedef PyObject *(*converter)(void *);
Guido van Rossumd1b93931995-01-20 16:56:02 +0000419 converter func = va_arg(*p_va, converter);
420 void *arg = va_arg(*p_va, void *);
421 ++*p_format;
422 return (*func)(arg);
423 }
424 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000425 PyObject *v;
426 v = va_arg(*p_va, PyObject *);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000427 if (v != NULL) {
Guido van Rossumd3415001998-12-23 05:01:38 +0000428 if (*(*p_format - 1) != 'N')
429 Py_INCREF(v);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000430 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 else if (!PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432 /* If a NULL was passed
433 * because a call that should
434 * have constructed a value
435 * failed, that's OK, and we
436 * pass the error on; but if
437 * no error occurred it's not
438 * clear that the caller knew
439 * what she was doing. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000441 "NULL object passed to Py_BuildValue");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000442 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000443 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444
445 case ':':
446 case ',':
447 case ' ':
448 case '\t':
449 break;
450
451 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000453 "bad format char passed to Py_BuildValue");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454 return NULL;
455
456 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000457 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000458}
459
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000460
Fred Drakeceead6d2003-01-30 15:08:25 +0000461PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000462Py_BuildValue(const char *format, ...)
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000463{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000464 va_list va;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000465 PyObject* retval;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000466 va_start(va, format);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000467 retval = va_build_value(format, va, 0);
468 va_end(va);
469 return retval;
470}
471
472PyObject *
473_Py_BuildValue_SizeT(const char *format, ...)
474{
475 va_list va;
476 PyObject* retval;
477 va_start(va, format);
478 retval = va_build_value(format, va, FLAG_SIZE_T);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000479 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000480 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000481}
Guido van Rossume5372401993-03-16 12:15:04 +0000482
Guido van Rossum79f25d91997-04-29 20:08:16 +0000483PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000484Py_VaBuildValue(const char *format, va_list va)
Guido van Rossume5372401993-03-16 12:15:04 +0000485{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000486 return va_build_value(format, va, 0);
487}
488
489PyObject *
490_Py_VaBuildValue_SizeT(const char *format, va_list va)
491{
492 return va_build_value(format, va, FLAG_SIZE_T);
493}
494
495static PyObject *
496va_build_value(const char *format, va_list va, int flags)
497{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000498 const char *f = format;
Guido van Rossume5372401993-03-16 12:15:04 +0000499 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500 va_list lva;
501
502#ifdef VA_LIST_IS_ARRAY
503 memcpy(lva, va, sizeof(va_list));
504#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +0000505#ifdef __va_copy
506 __va_copy(lva, va);
507#else
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000508 lva = va;
509#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +0000510#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000511
Guido van Rossume5372401993-03-16 12:15:04 +0000512 if (n < 0)
513 return NULL;
514 if (n == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 Py_INCREF(Py_None);
516 return Py_None;
Guido van Rossume5372401993-03-16 12:15:04 +0000517 }
518 if (n == 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000519 return do_mkvalue(&f, &lva, flags);
520 return do_mktuple(&f, &lva, '\0', n, flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000521}
522
523
Guido van Rossum79f25d91997-04-29 20:08:16 +0000524PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000525PyEval_CallFunction(PyObject *obj, const char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526{
527 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000528 PyObject *args;
529 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 va_start(vargs, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000532
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 va_end(vargs);
535
536 if (args == NULL)
537 return NULL;
538
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 res = PyEval_CallObject(obj, args);
540 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000541
542 return res;
543}
544
545
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000547PyEval_CallMethod(PyObject *obj, const char *methodname, const char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000548{
549 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 PyObject *meth;
551 PyObject *args;
552 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553
Guido van Rossumc4099e61998-08-08 20:51:26 +0000554 meth = PyObject_GetAttrString(obj, methodname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000555 if (meth == NULL)
556 return NULL;
557
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000558 va_start(vargs, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561 va_end(vargs);
562
563 if (args == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 Py_DECREF(meth);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000565 return NULL;
566 }
567
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 res = PyEval_CallObject(meth, args);
569 Py_DECREF(meth);
570 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571
572 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000573}
Fred Drake9e285152000-09-23 03:24:27 +0000574
575int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000576PyModule_AddObject(PyObject *m, const char *name, PyObject *o)
Fred Drake9e285152000-09-23 03:24:27 +0000577{
578 PyObject *dict;
Jeremy Hyltonc44dbc42003-06-21 21:35:25 +0000579 if (!PyModule_Check(m)) {
Fred Drake83115182002-06-17 17:16:57 +0000580 PyErr_SetString(PyExc_TypeError,
581 "PyModule_AddObject() needs module as first arg");
Fred Drake9e285152000-09-23 03:24:27 +0000582 return -1;
Fred Drake83115182002-06-17 17:16:57 +0000583 }
Jeremy Hyltonc44dbc42003-06-21 21:35:25 +0000584 if (!o) {
Martin v. Löwisf8d59d22003-10-24 20:05:32 +0000585 if (!PyErr_Occurred())
586 PyErr_SetString(PyExc_TypeError,
587 "PyModule_AddObject() needs non-NULL value");
Jeremy Hyltonc44dbc42003-06-21 21:35:25 +0000588 return -1;
589 }
590
Fred Drake83115182002-06-17 17:16:57 +0000591 dict = PyModule_GetDict(m);
592 if (dict == NULL) {
593 /* Internal error -- modules must have a dict! */
594 PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
595 PyModule_GetName(m));
596 return -1;
597 }
598 if (PyDict_SetItemString(dict, name, o))
599 return -1;
600 Py_DECREF(o);
601 return 0;
Fred Drake9e285152000-09-23 03:24:27 +0000602}
603
604int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000605PyModule_AddIntConstant(PyObject *m, const char *name, long value)
Fred Drake9e285152000-09-23 03:24:27 +0000606{
Georg Brandlfceab5a2008-01-19 20:08:23 +0000607 PyObject *o = PyLong_FromLong(value);
608 if (!o)
609 return -1;
610 if (PyModule_AddObject(m, name, o) == 0)
611 return 0;
612 Py_DECREF(o);
613 return -1;
Fred Drake9e285152000-09-23 03:24:27 +0000614}
615
616int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000617PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
Fred Drake9e285152000-09-23 03:24:27 +0000618{
Georg Brandlfceab5a2008-01-19 20:08:23 +0000619 PyObject *o = PyUnicode_FromString(value);
620 if (!o)
621 return -1;
622 if (PyModule_AddObject(m, name, o) == 0)
623 return 0;
624 Py_DECREF(o);
625 return -1;
Fred Drake9e285152000-09-23 03:24:27 +0000626}