blob: 50f6034f5982416659defe039bbb2457d8e3cc41 [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001
2/* New getargs implementation */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00005
Guido van Rossumc1d50531996-08-21 23:38:24 +00006#include <ctype.h>
7
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00008
Tim Petersdbd9ba62000-07-09 03:09:57 +00009int PyArg_Parse(PyObject *, char *, ...);
10int PyArg_ParseTuple(PyObject *, char *, ...);
11int PyArg_VaParse(PyObject *, char *, va_list);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000012
Tim Petersdbd9ba62000-07-09 03:09:57 +000013int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
14 char *, char **, ...);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000015
16/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000017static int vgetargs1(PyObject *, char *, va_list *, int);
18static void seterror(int, char *, int *, char *, char *);
Jeremy Hyltonb048b262001-11-28 22:14:37 +000019static char *convertitem(PyObject *, char **, va_list *, int *, char *,
20 size_t);
Tim Petersdbd9ba62000-07-09 03:09:57 +000021static char *converttuple(PyObject *, char **, va_list *,
Jeremy Hyltonb048b262001-11-28 22:14:37 +000022 int *, char *, size_t, int);
23static char *convertsimple(PyObject *, char **, va_list *, char *, size_t);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +000024static int convertbuffer(PyObject *, void **p, char **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000025
Tim Petersdbd9ba62000-07-09 03:09:57 +000026static int vgetargskeywords(PyObject *, PyObject *,
27 char *, char **, va_list *);
28static char *skipitem(char **, va_list *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000029
Fred Drake563dfc22001-10-23 14:41:08 +000030int
31PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000032{
33 int retval;
34 va_list va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000035
36 va_start(va, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000037 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000038 va_end(va);
39 return retval;
40}
41
42
Fred Drake563dfc22001-10-23 14:41:08 +000043int
44PyArg_ParseTuple(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000045{
46 int retval;
47 va_list va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000048
49 va_start(va, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000051 va_end(va);
52 return retval;
53}
54
55
56int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000057PyArg_VaParse(PyObject *args, char *format, va_list va)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000058{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000059 va_list lva;
60
61#ifdef VA_LIST_IS_ARRAY
62 memcpy(lva, va, sizeof(va_list));
63#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +000064#ifdef __va_copy
65 __va_copy(lva, va);
66#else
Guido van Rossum1ae940a1995-01-02 19:04:15 +000067 lva = va;
68#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +000069#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070
71 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000072}
73
74
75static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000076vgetargs1(PyObject *args, char *format, va_list *p_va, int compat)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000077{
78 char msgbuf[256];
79 int levels[32];
80 char *fname = NULL;
81 char *message = NULL;
82 int min = -1;
83 int max = 0;
84 int level = 0;
Jeremy Hylton25916bd2001-05-29 17:46:19 +000085 int endfmt = 0;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000086 char *formatsave = format;
87 int i, len;
88 char *msg;
89
Tim Peters5c4d5bf2001-02-12 22:13:26 +000090 assert(compat || (args != (PyObject*)NULL));
91
Jeremy Hylton25916bd2001-05-29 17:46:19 +000092 while (endfmt == 0) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000093 int c = *format++;
Jeremy Hylton25916bd2001-05-29 17:46:19 +000094 switch (c) {
95 case '(':
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000096 if (level == 0)
97 max++;
98 level++;
Jeremy Hylton25916bd2001-05-29 17:46:19 +000099 break;
100 case ')':
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000101 if (level == 0)
Jeremy Hylton25916bd2001-05-29 17:46:19 +0000102 Py_FatalError("excess ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000103 else
104 level--;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000105 break;
Jeremy Hylton25916bd2001-05-29 17:46:19 +0000106 case '\0':
107 endfmt = 1;
108 break;
109 case ':':
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000110 fname = format;
Jeremy Hylton25916bd2001-05-29 17:46:19 +0000111 endfmt = 1;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000112 break;
Jeremy Hylton25916bd2001-05-29 17:46:19 +0000113 case ';':
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000114 message = format;
Jeremy Hylton25916bd2001-05-29 17:46:19 +0000115 endfmt = 1;
116 break;
117 default:
118 if (level == 0) {
119 if (c == 'O')
120 max++;
121 else if (isalpha(c)) {
122 if (c != 'e') /* skip encoded */
123 max++;
124 } else if (c == '|')
125 min = max;
126 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000127 break;
128 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000129 }
130
131 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000132 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000133
134 if (min < 0)
135 min = max;
136
137 format = formatsave;
138
139 if (compat) {
140 if (max == 0) {
141 if (args == NULL)
142 return 1;
Jeremy Hylton23ae9872001-11-28 20:29:22 +0000143 PyOS_snprintf(msgbuf, sizeof(msgbuf),
144 "%.200s%s takes no arguments",
145 fname==NULL ? "function" : fname,
146 fname==NULL ? "" : "()");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000148 return 0;
149 }
150 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000151 if (args == NULL) {
Jeremy Hylton23ae9872001-11-28 20:29:22 +0000152 PyOS_snprintf(msgbuf, sizeof(msgbuf),
153 "%.200s%s takes at least one argument",
154 fname==NULL ? "function" : fname,
155 fname==NULL ? "" : "()");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000156 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000157 return 0;
158 }
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000159 msg = convertitem(args, &format, p_va, levels, msgbuf,
160 sizeof(msgbuf));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000161 if (msg == NULL)
162 return 1;
163 seterror(levels[0], msg, levels+1, fname, message);
164 return 0;
165 }
166 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000168 "old style getargs format uses new features");
169 return 0;
170 }
171 }
172
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173 if (!PyTuple_Check(args)) {
174 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000175 "new style getargs format but argument is not a tuple");
176 return 0;
177 }
178
Jeremy Hylton0f8117f2001-05-18 20:57:38 +0000179 len = PyTuple_GET_SIZE(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000180
181 if (len < min || max < len) {
182 if (message == NULL) {
Jeremy Hylton23ae9872001-11-28 20:29:22 +0000183 PyOS_snprintf(msgbuf, sizeof(msgbuf),
184 "%.150s%s takes %s %d argument%s "
185 "(%d given)",
186 fname==NULL ? "function" : fname,
187 fname==NULL ? "" : "()",
188 min==max ? "exactly"
189 : len < min ? "at least" : "at most",
190 len < min ? min : max,
191 (len < min ? min : max) == 1 ? "" : "s",
192 len);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000193 message = msgbuf;
194 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000195 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000196 return 0;
197 }
198
199 for (i = 0; i < len; i++) {
200 if (*format == '|')
201 format++;
Jeremy Hylton0f8117f2001-05-18 20:57:38 +0000202 msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000203 levels, msgbuf, sizeof(msgbuf));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000204 if (msg) {
205 seterror(i+1, msg, levels, fname, message);
206 return 0;
207 }
208 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000209
Guido van Rossum730806d1998-04-10 22:27:42 +0000210 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000211 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000212 *format != '|' && *format != ':' && *format != ';') {
213 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000214 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000215 return 0;
216 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000217
218 return 1;
219}
220
221
222
223static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000224seterror(int iarg, char *msg, int *levels, char *fname, char *message)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000225{
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +0000226 char buf[512];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000227 int i;
228 char *p = buf;
229
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000231 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000232 else if (message == NULL) {
233 if (fname != NULL) {
Jeremy Hyltonf16e05e2001-11-28 21:46:59 +0000234 PyOS_snprintf(p, sizeof(buf), "%.200s() ", fname);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000235 p += strlen(p);
236 }
Ka-Ping Yee20579702001-01-15 22:14:16 +0000237 if (iarg != 0) {
Tim Petersfaad5ad2001-12-03 00:43:33 +0000238 PyOS_snprintf(p, sizeof(buf) - (p - buf),
Jeremy Hyltonf16e05e2001-11-28 21:46:59 +0000239 "argument %d", iarg);
Ka-Ping Yee20579702001-01-15 22:14:16 +0000240 i = 0;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000241 p += strlen(p);
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +0000242 while (levels[i] > 0 && (int)(p-buf) < 220) {
Jeremy Hyltonf16e05e2001-11-28 21:46:59 +0000243 PyOS_snprintf(p, sizeof(buf) - (buf - p),
244 ", item %d", levels[i]-1);
Ka-Ping Yee20579702001-01-15 22:14:16 +0000245 p += strlen(p);
246 i++;
247 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000248 }
Ka-Ping Yee20579702001-01-15 22:14:16 +0000249 else {
Tim Petersfaad5ad2001-12-03 00:43:33 +0000250 PyOS_snprintf(p, sizeof(buf) - (p - buf), "argument");
Ka-Ping Yee20579702001-01-15 22:14:16 +0000251 p += strlen(p);
252 }
Tim Petersfaad5ad2001-12-03 00:43:33 +0000253 PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000254 message = buf;
255 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000256 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000257}
258
259
260/* Convert a tuple argument.
261 On entry, *p_format points to the character _after_ the opening '('.
262 On successful exit, *p_format points to the closing ')'.
263 If successful:
264 *p_format and *p_va are updated,
265 *levels and *msgbuf are untouched,
266 and NULL is returned.
267 If the argument is invalid:
268 *p_format is unchanged,
269 *p_va is undefined,
270 *levels is a 0-terminated list of item numbers,
271 *msgbuf contains an error message, whose format is:
Ka-Ping Yee20579702001-01-15 22:14:16 +0000272 "must be <typename1>, not <typename2>", where:
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000273 <typename1> is the name of the expected type, and
274 <typename2> is the name of the actual type,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000275 and msgbuf is returned.
276*/
277
278static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000280 char *msgbuf, size_t bufsize, int toplevel)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000281{
282 int level = 0;
283 int n = 0;
284 char *format = *p_format;
285 int i;
286
287 for (;;) {
288 int c = *format++;
289 if (c == '(') {
290 if (level == 0)
291 n++;
292 level++;
293 }
294 else if (c == ')') {
295 if (level == 0)
296 break;
297 level--;
298 }
299 else if (c == ':' || c == ';' || c == '\0')
300 break;
301 else if (level == 0 && isalpha(c))
302 n++;
303 }
304
Ka-Ping Yee20579702001-01-15 22:14:16 +0000305 if (!PySequence_Check(arg) || PyString_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000306 levels[0] = 0;
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000307 PyOS_snprintf(msgbuf, bufsize,
Jeremy Hylton23ae9872001-11-28 20:29:22 +0000308 toplevel ? "expected %d arguments, not %.50s" :
309 "must be %d-item sequence, not %.50s",
310 n,
311 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000312 return msgbuf;
313 }
314
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000315 if ((i = PySequence_Size(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000316 levels[0] = 0;
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000317 PyOS_snprintf(msgbuf, bufsize,
Jeremy Hylton23ae9872001-11-28 20:29:22 +0000318 toplevel ? "expected %d arguments, not %d" :
319 "must be sequence of length %d, not %d",
320 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000321 return msgbuf;
322 }
Ka-Ping Yee20579702001-01-15 22:14:16 +0000323
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000324 format = *p_format;
325 for (i = 0; i < n; i++) {
326 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000327 PyObject *item;
328 item = PySequence_GetItem(arg, i);
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000329 msg = convertitem(item, &format, p_va, levels+1, msgbuf,
330 bufsize);
Guido van Rossum66368cc1999-02-17 23:16:43 +0000331 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
332 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000333 if (msg != NULL) {
334 levels[0] = i+1;
335 return msg;
336 }
337 }
Ka-Ping Yee20579702001-01-15 22:14:16 +0000338
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000339 *p_format = format;
340 return NULL;
341}
342
343
344/* Convert a single item. */
345
346static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000347convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels,
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000348 char *msgbuf, size_t bufsize)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000349{
350 char *msg;
351 char *format = *p_format;
352
353 if (*format == '(' /* ')' */) {
354 format++;
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000355 msg = converttuple(arg, &format, p_va, levels, msgbuf,
356 bufsize, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000357 if (msg == NULL)
358 format++;
359 }
360 else {
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000361 msg = convertsimple(arg, &format, p_va, msgbuf, bufsize);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000362 if (msg != NULL)
363 levels[0] = 0;
364 }
365 if (msg == NULL)
366 *p_format = format;
367 return msg;
368}
369
370
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000371
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000372#define UNICODE_DEFAULT_ENCODING(arg) \
373 _PyUnicode_AsDefaultEncodedString(arg, NULL)
374
375/* Format an error message generated by convertsimple(). */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000376
377static char *
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000378converterr(char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000379{
Jeremy Hylton77b8b672001-09-10 01:54:43 +0000380 assert(expected != NULL);
381 assert(arg != NULL);
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000382 PyOS_snprintf(msgbuf, bufsize,
383 "must be %.50s, not %.50s", expected,
384 arg == Py_None ? "None" : arg->ob_type->tp_name);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000385 return msgbuf;
386}
387
388#define CONV_UNICODE "(unicode conversion error)"
389
390/* Convert a non-tuple argument. Return NULL if conversion went OK,
391 or a string with a message describing the failure. The message is
392 formatted as "must be <desired type>, not <actual type>".
393 When failing, an exception may or may not have been raised.
394 Don't call if a tuple is expected.
395*/
396
397static char *
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000398convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
399 size_t bufsize)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000400{
401 char *format = *p_format;
402 char c = *format++;
Walter Dörwalddffda2e2002-11-21 20:23:11 +0000403#ifdef Py_USING_UNICODE
Jeremy Hylton77b8b672001-09-10 01:54:43 +0000404 PyObject *uarg;
Walter Dörwalddffda2e2002-11-21 20:23:11 +0000405#endif
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000406
407 switch (c) {
408
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000409 case 'b': { /* unsigned byte -- very short int */
410 char *p = va_arg(*p_va, char *);
Neil Schemenauerb808e992003-01-24 22:15:21 +0000411 long ival;
412 if (PyFloat_Check(arg))
413 return converterr("integer", arg, msgbuf, bufsize);
414 ival = PyInt_AsLong(arg);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000415 if (ival == -1 && PyErr_Occurred())
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000416 return converterr("integer<b>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000417 else if (ival < 0) {
418 PyErr_SetString(PyExc_OverflowError,
419 "unsigned byte integer is less than minimum");
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000420 return converterr("integer<b>", arg, msgbuf, bufsize);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000421 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000422 else if (ival > UCHAR_MAX) {
423 PyErr_SetString(PyExc_OverflowError,
424 "unsigned byte integer is greater than maximum");
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000425 return converterr("integer<b>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000426 }
427 else
428 *p = (unsigned char) ival;
429 break;
430 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000431
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000432 case 'B': {/* byte sized bitfield - both signed and unsigned
433 values allowed */
434 char *p = va_arg(*p_va, char *);
Neil Schemenauerb808e992003-01-24 22:15:21 +0000435 long ival;
436 if (PyFloat_Check(arg))
437 return converterr("integer", arg, msgbuf, bufsize);
438 ival = PyInt_AsLong(arg);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000439 if (ival == -1 && PyErr_Occurred())
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000440 return converterr("integer<b>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000441 else if (ival < SCHAR_MIN) {
442 PyErr_SetString(PyExc_OverflowError,
443 "byte-sized integer bitfield is less than minimum");
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000444 return converterr("integer<B>", arg, msgbuf, bufsize);
Jack Jansencc22fbe2000-08-05 21:29:58 +0000445 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000446 else if (ival > (int)UCHAR_MAX) {
447 PyErr_SetString(PyExc_OverflowError,
448 "byte-sized integer bitfield is greater than maximum");
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000449 return converterr("integer<B>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000450 }
451 else
452 *p = (unsigned char) ival;
453 break;
454 }
Jack Jansencc22fbe2000-08-05 21:29:58 +0000455
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000456 case 'h': {/* signed short int */
457 short *p = va_arg(*p_va, short *);
Neil Schemenauerb808e992003-01-24 22:15:21 +0000458 long ival;
459 if (PyFloat_Check(arg))
460 return converterr("integer", arg, msgbuf, bufsize);
461 ival = PyInt_AsLong(arg);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000462 if (ival == -1 && PyErr_Occurred())
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000463 return converterr("integer<h>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000464 else if (ival < SHRT_MIN) {
465 PyErr_SetString(PyExc_OverflowError,
466 "signed short integer is less than minimum");
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000467 return converterr("integer<h>", arg, msgbuf, bufsize);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000468 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000469 else if (ival > SHRT_MAX) {
470 PyErr_SetString(PyExc_OverflowError,
471 "signed short integer is greater than maximum");
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000472 return converterr("integer<h>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000473 }
474 else
475 *p = (short) ival;
476 break;
477 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000478
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000479 case 'H': { /* short int sized bitfield, both signed and
480 unsigned allowed */
481 unsigned short *p = va_arg(*p_va, unsigned short *);
Neil Schemenauerb808e992003-01-24 22:15:21 +0000482 long ival;
483 if (PyFloat_Check(arg))
484 return converterr("integer", arg, msgbuf, bufsize);
485 ival = PyInt_AsLong(arg);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000486 if (ival == -1 && PyErr_Occurred())
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000487 return converterr("integer<H>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000488 else if (ival < SHRT_MIN) {
489 PyErr_SetString(PyExc_OverflowError,
490 "short integer bitfield is less than minimum");
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000491 return converterr("integer<H>", arg, msgbuf, bufsize);
Jack Jansend50338f2000-07-06 12:22:00 +0000492 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000493 else if (ival > USHRT_MAX) {
494 PyErr_SetString(PyExc_OverflowError,
495 "short integer bitfield is greater than maximum");
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000496 return converterr("integer<H>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000497 }
498 else
499 *p = (unsigned short) ival;
500 break;
501 }
Jack Jansend50338f2000-07-06 12:22:00 +0000502
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000503 case 'i': {/* signed int */
504 int *p = va_arg(*p_va, int *);
Neil Schemenauerb808e992003-01-24 22:15:21 +0000505 long ival;
506 if (PyFloat_Check(arg))
507 return converterr("integer", arg, msgbuf, bufsize);
508 ival = PyInt_AsLong(arg);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000509 if (ival == -1 && PyErr_Occurred())
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000510 return converterr("integer<i>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000511 else if (ival > INT_MAX) {
512 PyErr_SetString(PyExc_OverflowError,
513 "signed integer is greater than maximum");
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000514 return converterr("integer<i>", arg, msgbuf, bufsize);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000515 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000516 else if (ival < INT_MIN) {
517 PyErr_SetString(PyExc_OverflowError,
518 "signed integer is less than minimum");
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000519 return converterr("integer<i>", arg, msgbuf, bufsize);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000520 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000521 else
522 *p = ival;
523 break;
524 }
525
526 case 'l': {/* long int */
527 long *p = va_arg(*p_va, long *);
Neil Schemenauerb808e992003-01-24 22:15:21 +0000528 long ival;
529 if (PyFloat_Check(arg))
530 return converterr("integer", arg, msgbuf, bufsize);
531 ival = PyInt_AsLong(arg);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000532 if (ival == -1 && PyErr_Occurred())
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000533 return converterr("integer<l>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000534 else
535 *p = ival;
536 break;
537 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000538
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000539#ifdef HAVE_LONG_LONG
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000540 case 'L': {/* LONG_LONG */
541 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
542 LONG_LONG ival = PyLong_AsLongLong( arg );
543 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000544 return converterr("long<L>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000545 } else {
546 *p = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000547 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000548 break;
549 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000550#endif
551
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000552 case 'f': {/* float */
553 float *p = va_arg(*p_va, float *);
554 double dval = PyFloat_AsDouble(arg);
555 if (PyErr_Occurred())
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000556 return converterr("float<f>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000557 else
558 *p = (float) dval;
559 break;
560 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000561
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000562 case 'd': {/* double */
563 double *p = va_arg(*p_va, double *);
564 double dval = PyFloat_AsDouble(arg);
565 if (PyErr_Occurred())
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000566 return converterr("float<d>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000567 else
568 *p = dval;
569 break;
570 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000571
Guido van Rossum530956d1996-07-21 02:27:43 +0000572#ifndef WITHOUT_COMPLEX
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000573 case 'D': {/* complex double */
574 Py_complex *p = va_arg(*p_va, Py_complex *);
575 Py_complex cval;
576 cval = PyComplex_AsCComplex(arg);
577 if (PyErr_Occurred())
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000578 return converterr("complex<D>", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000579 else
580 *p = cval;
581 break;
582 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000583#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000584
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000585 case 'c': {/* char */
586 char *p = va_arg(*p_va, char *);
587 if (PyString_Check(arg) && PyString_Size(arg) == 1)
Jeremy Hylton0407aea2001-10-10 02:51:57 +0000588 *p = PyString_AS_STRING(arg)[0];
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000589 else
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000590 return converterr("char", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000591 break;
592 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000593
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000594 case 's': {/* string */
595 if (*format == '#') {
596 void **p = (void **)va_arg(*p_va, char **);
597 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000598
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000599 if (PyString_Check(arg)) {
600 *p = PyString_AS_STRING(arg);
601 *q = PyString_GET_SIZE(arg);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000602 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000603#ifdef Py_USING_UNICODE
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000604 else if (PyUnicode_Check(arg)) {
Jeremy Hylton77b8b672001-09-10 01:54:43 +0000605 uarg = UNICODE_DEFAULT_ENCODING(arg);
606 if (uarg == NULL)
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000607 return converterr(CONV_UNICODE,
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000608 arg, msgbuf, bufsize);
Jeremy Hylton77b8b672001-09-10 01:54:43 +0000609 *p = PyString_AS_STRING(uarg);
610 *q = PyString_GET_SIZE(uarg);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000611 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000612#endif
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000613 else { /* any buffer-like object */
614 char *buf;
615 int count = convertbuffer(arg, p, &buf);
616 if (count < 0)
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000617 return converterr(buf, arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000618 *q = count;
619 }
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000620 format++;
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000621 } else {
622 char **p = va_arg(*p_va, char **);
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000623
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000624 if (PyString_Check(arg))
625 *p = PyString_AS_STRING(arg);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000626#ifdef Py_USING_UNICODE
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000627 else if (PyUnicode_Check(arg)) {
Jeremy Hylton77b8b672001-09-10 01:54:43 +0000628 uarg = UNICODE_DEFAULT_ENCODING(arg);
629 if (uarg == NULL)
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000630 return converterr(CONV_UNICODE,
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000631 arg, msgbuf, bufsize);
Jeremy Hylton77b8b672001-09-10 01:54:43 +0000632 *p = PyString_AS_STRING(uarg);
Marc-André Lemburg6f15e572001-05-02 17:16:16 +0000633 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000634#endif
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000635 else
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000636 return converterr("string", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000637 if ((int)strlen(*p) != PyString_Size(arg))
638 return converterr("string without null bytes",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000639 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000640 }
641 break;
642 }
643
644 case 'z': {/* string, may be NULL (None) */
645 if (*format == '#') { /* any buffer-like object */
646 void **p = (void **)va_arg(*p_va, char **);
647 int *q = va_arg(*p_va, int *);
648
649 if (arg == Py_None) {
650 *p = 0;
651 *q = 0;
652 }
653 else if (PyString_Check(arg)) {
654 *p = PyString_AS_STRING(arg);
655 *q = PyString_GET_SIZE(arg);
656 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000657#ifdef Py_USING_UNICODE
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000658 else if (PyUnicode_Check(arg)) {
Jeremy Hylton77b8b672001-09-10 01:54:43 +0000659 uarg = UNICODE_DEFAULT_ENCODING(arg);
660 if (uarg == NULL)
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000661 return converterr(CONV_UNICODE,
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000662 arg, msgbuf, bufsize);
Jeremy Hylton77b8b672001-09-10 01:54:43 +0000663 *p = PyString_AS_STRING(uarg);
664 *q = PyString_GET_SIZE(uarg);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000665 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000666#endif
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000667 else { /* any buffer-like object */
668 char *buf;
669 int count = convertbuffer(arg, p, &buf);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000670 if (count < 0)
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000671 return converterr(buf, arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000672 *q = count;
673 }
674 format++;
675 } else {
676 char **p = va_arg(*p_va, char **);
677
678 if (arg == Py_None)
679 *p = 0;
680 else if (PyString_Check(arg))
Jeremy Hyltona4c8cd72001-10-10 02:51:08 +0000681 *p = PyString_AS_STRING(arg);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000682#ifdef Py_USING_UNICODE
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000683 else if (PyUnicode_Check(arg)) {
Jeremy Hylton77b8b672001-09-10 01:54:43 +0000684 uarg = UNICODE_DEFAULT_ENCODING(arg);
685 if (uarg == NULL)
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000686 return converterr(CONV_UNICODE,
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000687 arg, msgbuf, bufsize);
Jeremy Hylton77b8b672001-09-10 01:54:43 +0000688 *p = PyString_AS_STRING(uarg);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000689 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000690#endif
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000691 else
692 return converterr("string or None",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000693 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000694 if (*format == '#') {
695 int *q = va_arg(*p_va, int *);
696 if (arg == Py_None)
697 *q = 0;
698 else
699 *q = PyString_Size(arg);
700 format++;
701 }
702 else if (*p != NULL &&
703 (int)strlen(*p) != PyString_Size(arg))
704 return converterr(
705 "string without null bytes or None",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000706 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000707 }
708 break;
709 }
710
711 case 'e': {/* encoded string */
712 char **buffer;
713 const char *encoding;
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000714 PyObject *s;
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000715 int size, recode_strings;
716
717 /* Get 'e' parameter: the encoding name */
718 encoding = (const char *)va_arg(*p_va, const char *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000719#ifdef Py_USING_UNICODE
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000720 if (encoding == NULL)
721 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000722#endif
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000723
724 /* Get output buffer parameter:
725 's' (recode all objects via Unicode) or
726 't' (only recode non-string objects)
727 */
728 if (*format == 's')
729 recode_strings = 1;
730 else if (*format == 't')
731 recode_strings = 0;
732 else
733 return converterr(
734 "(unknown parser marker combination)",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000735 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000736 buffer = (char **)va_arg(*p_va, char **);
737 format++;
738 if (buffer == NULL)
739 return converterr("(buffer is NULL)",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000740 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000741
742 /* Encode object */
743 if (!recode_strings && PyString_Check(arg)) {
744 s = arg;
745 Py_INCREF(s);
746 }
747 else {
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000748#ifdef Py_USING_UNICODE
749 PyObject *u;
750
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000751 /* Convert object to Unicode */
752 u = PyUnicode_FromObject(arg);
753 if (u == NULL)
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000754 return converterr(
755 "string or unicode or text buffer",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000756 arg, msgbuf, bufsize);
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000757
758 /* Encode object; use default error handling */
759 s = PyUnicode_AsEncodedString(u,
760 encoding,
761 NULL);
762 Py_DECREF(u);
763 if (s == NULL)
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000764 return converterr("(encoding failed)",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000765 arg, msgbuf, bufsize);
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000766 if (!PyString_Check(s)) {
767 Py_DECREF(s);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000768 return converterr(
769 "(encoder failed to return a string)",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000770 arg, msgbuf, bufsize);
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000771 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000772#else
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000773 return converterr("string<e>", arg, msgbuf, bufsize);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000774#endif
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000775 }
776 size = PyString_GET_SIZE(s);
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000777
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000778 /* Write output; output is guaranteed to be 0-terminated */
779 if (*format == '#') {
780 /* Using buffer length parameter '#':
781
782 - if *buffer is NULL, a new buffer of the
783 needed size is allocated and the data
784 copied into it; *buffer is updated to point
785 to the new buffer; the caller is
786 responsible for PyMem_Free()ing it after
787 usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000788
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000789 - if *buffer is not NULL, the data is
790 copied to *buffer; *buffer_len has to be
791 set to the size of the buffer on input;
792 buffer overflow is signalled with an error;
793 buffer has to provide enough room for the
794 encoded string plus the trailing 0-byte
795
796 - in both cases, *buffer_len is updated to
797 the size of the buffer /excluding/ the
798 trailing 0-byte
799
800 */
801 int *buffer_len = va_arg(*p_va, int *);
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000802
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000803 format++;
804 if (buffer_len == NULL)
805 return converterr(
806 "(buffer_len is NULL)",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000807 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000808 if (*buffer == NULL) {
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000809 *buffer = PyMem_NEW(char, size + 1);
810 if (*buffer == NULL) {
811 Py_DECREF(s);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000812 return converterr(
813 "(memory error)",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000814 arg, msgbuf, bufsize);
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000815 }
Fred Drake25871c02000-05-03 15:17:02 +0000816 } else {
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000817 if (size + 1 > *buffer_len) {
818 Py_DECREF(s);
819 return converterr(
820 "(buffer overflow)",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000821 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000822 }
Fred Drake25871c02000-05-03 15:17:02 +0000823 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000824 memcpy(*buffer,
825 PyString_AS_STRING(s),
826 size + 1);
827 *buffer_len = size;
828 } else {
829 /* Using a 0-terminated buffer:
830
831 - the encoded string has to be 0-terminated
832 for this variant to work; if it is not, an
833 error raised
Fred Drake25871c02000-05-03 15:17:02 +0000834
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000835 - a new buffer of the needed size is
836 allocated and the data copied into it;
837 *buffer is updated to point to the new
838 buffer; the caller is responsible for
839 PyMem_Free()ing it after usage
840
841 */
842 if ((int)strlen(PyString_AS_STRING(s)) != size)
843 return converterr(
844 "(encoded string without NULL bytes)",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000845 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000846 *buffer = PyMem_NEW(char, size + 1);
847 if (*buffer == NULL) {
848 Py_DECREF(s);
849 return converterr("(memory error)",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000850 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000851 }
852 memcpy(*buffer,
853 PyString_AS_STRING(s),
854 size + 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000855 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000856 Py_DECREF(s);
857 break;
858 }
859
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000860#ifdef Py_USING_UNICODE
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000861 case 'u': {/* raw unicode buffer (Py_UNICODE *) */
862 if (*format == '#') { /* any buffer-like object */
863 void **p = (void **)va_arg(*p_va, char **);
864 int *q = va_arg(*p_va, int *);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +0000865 if (PyUnicode_Check(arg)) {
866 *p = PyUnicode_AS_UNICODE(arg);
867 *q = PyUnicode_GET_SIZE(arg);
868 }
869 else {
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000870 char *buf;
871 int count = convertbuffer(arg, p, &buf);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000872 if (count < 0)
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000873 return converterr(buf, arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000874 *q = count/(sizeof(Py_UNICODE));
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +0000875 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000876 format++;
877 } else {
878 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
Guido van Rossume826ef02000-03-10 23:02:17 +0000879 if (PyUnicode_Check(arg))
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000880 *p = PyUnicode_AS_UNICODE(arg);
881 else
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000882 return converterr("unicode", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000883 }
884 break;
885 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000886#endif
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000887
888 case 'S': { /* string object */
889 PyObject **p = va_arg(*p_va, PyObject **);
890 if (PyString_Check(arg))
891 *p = arg;
892 else
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000893 return converterr("string", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000894 break;
895 }
896
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000897#ifdef Py_USING_UNICODE
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000898 case 'U': { /* Unicode object */
899 PyObject **p = va_arg(*p_va, PyObject **);
900 if (PyUnicode_Check(arg))
901 *p = arg;
902 else
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000903 return converterr("unicode", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000904 break;
905 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000906#endif
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000907
908 case 'O': { /* object */
909 PyTypeObject *type;
910 PyObject **p;
911 if (*format == '!') {
912 type = va_arg(*p_va, PyTypeObject*);
913 p = va_arg(*p_va, PyObject **);
914 format++;
Guido van Rossumcbfc8552001-08-28 16:37:51 +0000915 if (PyType_IsSubtype(arg->ob_type, type))
Guido van Rossume826ef02000-03-10 23:02:17 +0000916 *p = arg;
917 else
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000918 return converterr(type->tp_name, arg, msgbuf, bufsize);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000919
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000920 }
921 else if (*format == '?') {
922 inquiry pred = va_arg(*p_va, inquiry);
923 p = va_arg(*p_va, PyObject **);
924 format++;
925 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000926 *p = arg;
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000927 else
928 return converterr("(unspecified)",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000929 arg, msgbuf, bufsize);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000930
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000931 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000932 else if (*format == '&') {
933 typedef int (*converter)(PyObject *, void *);
934 converter convert = va_arg(*p_va, converter);
935 void *addr = va_arg(*p_va, void *);
936 format++;
937 if (! (*convert)(arg, addr))
938 return converterr("(unspecified)",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000939 arg, msgbuf, bufsize);
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000940 }
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000941 else {
942 p = va_arg(*p_va, PyObject **);
943 *p = arg;
944 }
945 break;
946 }
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000947
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000948
949 case 'w': { /* memory buffer, read-write access */
950 void **p = va_arg(*p_va, void **);
951 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
952 int count;
953
954 if (pb == NULL ||
955 pb->bf_getwritebuffer == NULL ||
956 pb->bf_getsegcount == NULL)
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000957 return converterr("read-write buffer", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000958 if ((*pb->bf_getsegcount)(arg, NULL) != 1)
959 return converterr("single-segment read-write buffer",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000960 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000961 if ((count = pb->bf_getwritebuffer(arg, 0, p)) < 0)
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000962 return converterr("(unspecified)", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000963 if (*format == '#') {
964 int *q = va_arg(*p_va, int *);
965
966 *q = count;
967 format++;
968 }
969 break;
970 }
971
972 case 't': { /* 8-bit character buffer, read-only access */
973 const char **p = va_arg(*p_va, const char **);
Jeremy Hylton4819e972001-10-11 14:40:37 +0000974 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000975 int count;
976
977 if (*format++ != '#')
978 return converterr(
979 "invalid use of 't' format character",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000980 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000981 if (!PyType_HasFeature(arg->ob_type,
Jeremy Hylton4819e972001-10-11 14:40:37 +0000982 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
983 pb == NULL || pb->bf_getcharbuffer == NULL ||
984 pb->bf_getsegcount == NULL)
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000985 return converterr(
986 "string or read-only character buffer",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000987 arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000988
Jeremy Hylton4819e972001-10-11 14:40:37 +0000989 if (pb->bf_getsegcount(arg, NULL) != 1)
990 return converterr(
991 "string or single-segment read-only buffer",
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000992 arg, msgbuf, bufsize);
Jeremy Hylton4819e972001-10-11 14:40:37 +0000993
994 count = pb->bf_getcharbuffer(arg, 0, p);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000995 if (count < 0)
Jeremy Hyltonb048b262001-11-28 22:14:37 +0000996 return converterr("(unspecified)", arg, msgbuf, bufsize);
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +0000997 *va_arg(*p_va, int *) = count;
998 break;
999 }
1000
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001001 default:
Jeremy Hyltonb048b262001-11-28 22:14:37 +00001002 return converterr("impossible<bad format char>", arg, msgbuf, bufsize);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001003
1004 }
1005
1006 *p_format = format;
1007 return NULL;
1008}
Guido van Rossumaa354651996-08-19 19:32:04 +00001009
Fred Drake563dfc22001-10-23 14:41:08 +00001010static int
1011convertbuffer(PyObject *arg, void **p, char **errmsg)
Jeremy Hylton1cb7aa32001-05-29 17:37:05 +00001012{
1013 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
1014 int count;
1015 if (pb == NULL ||
1016 pb->bf_getreadbuffer == NULL ||
1017 pb->bf_getsegcount == NULL) {
1018 *errmsg = "string or read-only buffer";
1019 return -1;
1020 }
1021 if ((*pb->bf_getsegcount)(arg, NULL) != 1) {
1022 *errmsg = "string or single-segment read-only buffer";
1023 return -1;
1024 }
1025 if ((count = (*pb->bf_getreadbuffer)(arg, 0, p)) < 0) {
1026 *errmsg = "(unspecified)";
1027 }
1028 return count;
1029}
Guido van Rossumaa354651996-08-19 19:32:04 +00001030
1031/* Support for keyword arguments donated by
1032 Geoff Philbrick <philbric@delphi.hks.com> */
1033
Tim Petersf8cd3e82001-10-27 04:26:57 +00001034/* Return false (0) for error, else true. */
Fred Drake563dfc22001-10-23 14:41:08 +00001035int
1036PyArg_ParseTupleAndKeywords(PyObject *args,
1037 PyObject *keywords,
1038 char *format,
1039 char **kwlist, ...)
Guido van Rossumaa354651996-08-19 19:32:04 +00001040{
1041 int retval;
1042 va_list va;
Tim Peters45772cd2001-10-27 03:58:40 +00001043
1044 if ((args == NULL || !PyTuple_Check(args)) ||
1045 (keywords != NULL && !PyDict_Check(keywords)) ||
1046 format == NULL ||
1047 kwlist == NULL)
1048 {
1049 PyErr_BadInternalCall();
Tim Petersf8cd3e82001-10-27 04:26:57 +00001050 return 0;
Tim Peters45772cd2001-10-27 03:58:40 +00001051 }
1052
Guido van Rossumaa354651996-08-19 19:32:04 +00001053 va_start(va, kwlist);
Guido van Rossumaa354651996-08-19 19:32:04 +00001054 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
1055 va_end(va);
1056 return retval;
1057}
1058
1059
1060static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001061vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
1062 char **kwlist, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +00001063{
Tim Petersdc5eff92001-10-27 06:53:00 +00001064 char msgbuf[512];
Guido van Rossumaa354651996-08-19 19:32:04 +00001065 int levels[32];
Tim Petersf8cd3e82001-10-27 04:26:57 +00001066 char *fname, *message;
1067 int min, max;
Tim Peters6fb26352001-10-27 04:38:11 +00001068 char *formatsave;
Tim Petersb639d492001-10-27 07:00:56 +00001069 int i, len, nargs, nkeywords;
Tim Petersc2f01122001-10-27 07:25:06 +00001070 char *msg, **p;
Tim Petersf4331c12001-10-27 00:17:34 +00001071
Tim Peters45772cd2001-10-27 03:58:40 +00001072 assert(args != NULL && PyTuple_Check(args));
1073 assert(keywords == NULL || PyDict_Check(keywords));
1074 assert(format != NULL);
1075 assert(kwlist != NULL);
1076 assert(p_va != NULL);
1077
Tim Petersf8cd3e82001-10-27 04:26:57 +00001078 /* Search the format:
1079 message <- error msg, if any (else NULL).
Tim Peterscffed4b2001-11-29 03:26:37 +00001080 fname <- routine name, if any (else NULL).
Tim Petersf8cd3e82001-10-27 04:26:57 +00001081 min <- # of required arguments, or -1 if all are required.
1082 max <- most arguments (required + optional).
Tim Peters62d48e12001-10-27 06:42:16 +00001083 Check that kwlist has a non-NULL entry for each arg.
Tim Petersf8cd3e82001-10-27 04:26:57 +00001084 Raise error if a tuple arg spec is found.
1085 */
1086 fname = message = NULL;
Tim Peters6fb26352001-10-27 04:38:11 +00001087 formatsave = format;
Tim Peters62d48e12001-10-27 06:42:16 +00001088 p = kwlist;
Tim Petersf8cd3e82001-10-27 04:26:57 +00001089 min = -1;
1090 max = 0;
1091 while ((i = *format++) != '\0') {
Tim Peters62d48e12001-10-27 06:42:16 +00001092 if (isalpha(i) && i != 'e') {
Tim Petersf8cd3e82001-10-27 04:26:57 +00001093 max++;
Tim Peters62d48e12001-10-27 06:42:16 +00001094 if (*p == NULL) {
Tim Peterscffed4b2001-11-29 03:26:37 +00001095 PyErr_SetString(PyExc_RuntimeError,
1096 "more argument specifiers than "
1097 "keyword list entries");
Tim Peters62d48e12001-10-27 06:42:16 +00001098 return 0;
1099 }
1100 p++;
1101 }
Tim Petersf8cd3e82001-10-27 04:26:57 +00001102 else if (i == '|')
1103 min = max;
1104 else if (i == ':') {
1105 fname = format;
1106 break;
1107 }
1108 else if (i == ';') {
1109 message = format;
1110 break;
1111 }
1112 else if (i == '(') {
Tim Peterscffed4b2001-11-29 03:26:37 +00001113 PyErr_SetString(PyExc_RuntimeError,
1114 "tuple found in format when using keyword "
1115 "arguments");
Guido van Rossumaa354651996-08-19 19:32:04 +00001116 return 0;
1117 }
Tim Peters62d48e12001-10-27 06:42:16 +00001118 }
1119 format = formatsave;
1120 if (*p != NULL) {
Tim Peterscffed4b2001-11-29 03:26:37 +00001121 PyErr_SetString(PyExc_RuntimeError,
1122 "more keyword list entries than "
1123 "argument specifiers");
Tim Peters62d48e12001-10-27 06:42:16 +00001124 return 0;
1125 }
Tim Petersf8cd3e82001-10-27 04:26:57 +00001126 if (min < 0) {
1127 /* All arguments are required. */
Guido van Rossumaa354651996-08-19 19:32:04 +00001128 min = max;
Tim Petersf8cd3e82001-10-27 04:26:57 +00001129 }
Tim Petersf8cd3e82001-10-27 04:26:57 +00001130
Tim Peters6fb26352001-10-27 04:38:11 +00001131 nargs = PyTuple_GET_SIZE(args);
Tim Petersb0872fc2001-10-27 04:45:34 +00001132 nkeywords = keywords == NULL ? 0 : PyDict_Size(keywords);
Tim Petersf8cd3e82001-10-27 04:26:57 +00001133
Guido van Rossumaa354651996-08-19 19:32:04 +00001134 /* make sure there are no duplicate values for an argument;
1135 its not clear when to use the term "keyword argument vs.
1136 keyword parameter in messages */
Tim Petersb054be42001-10-27 05:07:41 +00001137 if (nkeywords > 0) {
Tim Peters6fb26352001-10-27 04:38:11 +00001138 for (i = 0; i < nargs; i++) {
Tim Petersa9f47392001-10-27 00:46:09 +00001139 char *thiskw = kwlist[i];
1140 if (thiskw == NULL)
1141 break;
Tim Peters077f5742001-10-27 05:50:39 +00001142 if (PyDict_GetItemString(keywords, thiskw)) {
Tim Petersb054be42001-10-27 05:07:41 +00001143 PyErr_Format(PyExc_TypeError,
1144 "keyword parameter '%s' was given "
1145 "by position and by name",
Tim Petersa9f47392001-10-27 00:46:09 +00001146 thiskw);
Guido van Rossumaa354651996-08-19 19:32:04 +00001147 return 0;
1148 }
Tim Peters0af49162001-10-27 06:14:32 +00001149 else if (PyErr_Occurred())
1150 return 0;
Guido van Rossumaa354651996-08-19 19:32:04 +00001151 }
1152 }
Tim Peters61dde632001-10-27 05:30:17 +00001153
Guido van Rossumaa354651996-08-19 19:32:04 +00001154 /* required arguments missing from args can be supplied by keyword
Tim Peters62d48e12001-10-27 06:42:16 +00001155 arguments; set len to the number of posiitional arguments, and,
1156 if that's less than the minimum required, add in the number of
1157 required arguments that are supplied by keywords */
Tim Peters6fb26352001-10-27 04:38:11 +00001158 len = nargs;
Tim Peters62d48e12001-10-27 06:42:16 +00001159 if (nkeywords > 0 && nargs < min) {
Tim Peters6fb26352001-10-27 04:38:11 +00001160 for (i = nargs; i < min; i++) {
Tim Peters077f5742001-10-27 05:50:39 +00001161 if (PyDict_GetItemString(keywords, kwlist[i]))
Guido van Rossumaa354651996-08-19 19:32:04 +00001162 len++;
Tim Peters0af49162001-10-27 06:14:32 +00001163 else if (PyErr_Occurred())
1164 return 0;
Guido van Rossumaa354651996-08-19 19:32:04 +00001165 }
1166 }
Tim Peters0af49162001-10-27 06:14:32 +00001167
Guido van Rossumaa354651996-08-19 19:32:04 +00001168 /* make sure we got an acceptable number of arguments; the message
1169 is a little confusing with keywords since keyword arguments
1170 which are supplied, but don't match the required arguments
1171 are not included in the "%d given" part of the message */
Guido van Rossumaa354651996-08-19 19:32:04 +00001172 if (len < min || max < len) {
1173 if (message == NULL) {
Jeremy Hylton23ae9872001-11-28 20:29:22 +00001174 PyOS_snprintf(msgbuf, sizeof(msgbuf),
1175 "%.200s%s takes %s %d argument%s "
1176 "(%d given)",
1177 fname==NULL ? "function" : fname,
1178 fname==NULL ? "" : "()",
1179 min==max ? "exactly"
1180 : len < min ? "at least" : "at most",
1181 len < min ? min : max,
1182 (len < min ? min : max) == 1 ? "" : "s",
1183 len);
Guido van Rossumaa354651996-08-19 19:32:04 +00001184 message = msgbuf;
1185 }
1186 PyErr_SetString(PyExc_TypeError, message);
1187 return 0;
1188 }
Tim Petersc2f01122001-10-27 07:25:06 +00001189
1190 /* convert the positional arguments */
Tim Peters6fb26352001-10-27 04:38:11 +00001191 for (i = 0; i < nargs; i++) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001192 if (*format == '|')
1193 format++;
Jeremy Hylton0f8117f2001-05-18 20:57:38 +00001194 msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
Jeremy Hyltonb048b262001-11-28 22:14:37 +00001195 levels, msgbuf, sizeof(msgbuf));
Guido van Rossumaa354651996-08-19 19:32:04 +00001196 if (msg) {
1197 seterror(i+1, msg, levels, fname, message);
1198 return 0;
1199 }
1200 }
1201
Tim Petersc2f01122001-10-27 07:25:06 +00001202 /* handle no keyword parameters in call */
Tim Petersb054be42001-10-27 05:07:41 +00001203 if (nkeywords == 0)
Tim Peters28bf7a92001-10-27 04:33:41 +00001204 return 1;
Tim Petersb054be42001-10-27 05:07:41 +00001205
Guido van Rossumaa354651996-08-19 19:32:04 +00001206 /* convert the keyword arguments; this uses the format
1207 string where it was left after processing args */
Tim Petersb639d492001-10-27 07:00:56 +00001208 for (i = nargs; i < max; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001210 if (*format == '|')
1211 format++;
Tim Peters077f5742001-10-27 05:50:39 +00001212 item = PyDict_GetItemString(keywords, kwlist[i]);
Guido van Rossum80bb9651996-12-05 23:27:02 +00001213 if (item != NULL) {
Tim Peters077f5742001-10-27 05:50:39 +00001214 Py_INCREF(item);
Jeremy Hyltonb048b262001-11-28 22:14:37 +00001215 msg = convertitem(item, &format, p_va, levels, msgbuf,
1216 sizeof(msgbuf));
Tim Peters077f5742001-10-27 05:50:39 +00001217 Py_DECREF(item);
Guido van Rossumaa354651996-08-19 19:32:04 +00001218 if (msg) {
1219 seterror(i+1, msg, levels, fname, message);
1220 return 0;
1221 }
Tim Petersc2f01122001-10-27 07:25:06 +00001222 --nkeywords;
1223 if (nkeywords == 0)
1224 break;
Guido van Rossumaa354651996-08-19 19:32:04 +00001225 }
Tim Peters0af49162001-10-27 06:14:32 +00001226 else if (PyErr_Occurred())
1227 return 0;
Guido van Rossumaa354651996-08-19 19:32:04 +00001228 else {
Guido van Rossumaa354651996-08-19 19:32:04 +00001229 msg = skipitem(&format, p_va);
1230 if (msg) {
1231 seterror(i+1, msg, levels, fname, message);
1232 return 0;
1233 }
1234 }
1235 }
Tim Petersb054be42001-10-27 05:07:41 +00001236
Guido van Rossumaa354651996-08-19 19:32:04 +00001237 /* make sure there are no extraneous keyword arguments */
Tim Petersc2f01122001-10-27 07:25:06 +00001238 if (nkeywords > 0) {
1239 PyObject *key, *value;
1240 int pos = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +00001241 while (PyDict_Next(keywords, &pos, &key, &value)) {
Tim Petersc2f01122001-10-27 07:25:06 +00001242 int match = 0;
Guido van Rossum55474762002-04-04 16:22:30 +00001243 char *ks;
1244 if (!PyString_Check(key)) {
1245 PyErr_SetString(PyExc_TypeError,
1246 "keywords must be strings");
1247 return 0;
1248 }
1249 ks = PyString_AsString(key);
Tim Petersb639d492001-10-27 07:00:56 +00001250 for (i = 0; i < max; i++) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001251 if (!strcmp(ks, kwlist[i])) {
1252 match = 1;
1253 break;
1254 }
1255 }
1256 if (!match) {
Tim Petersc2f01122001-10-27 07:25:06 +00001257 PyErr_Format(PyExc_TypeError,
1258 "'%s' is an invalid keyword "
1259 "argument for this function",
1260 ks);
Guido van Rossumaa354651996-08-19 19:32:04 +00001261 return 0;
1262 }
1263 }
1264 }
Tim Petersc2f01122001-10-27 07:25:06 +00001265
Guido van Rossumaa354651996-08-19 19:32:04 +00001266 return 1;
1267}
1268
1269
1270static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001271skipitem(char **p_format, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +00001272{
1273 char *format = *p_format;
1274 char c = *format++;
1275
1276 switch (c) {
1277
1278 case 'b': /* byte -- very short int */
Jack Jansencc22fbe2000-08-05 21:29:58 +00001279 case 'B': /* byte as bitfield */
Guido van Rossumaa354651996-08-19 19:32:04 +00001280 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001281 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001282 break;
1283 }
1284
1285 case 'h': /* short int */
1286 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001287 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001288 break;
1289 }
1290
Jack Jansencc22fbe2000-08-05 21:29:58 +00001291 case 'H': /* short int as bitfield */
Jack Jansend50338f2000-07-06 12:22:00 +00001292 {
1293 (void) va_arg(*p_va, unsigned short *);
1294 break;
1295 }
1296
Guido van Rossumaa354651996-08-19 19:32:04 +00001297 case 'i': /* int */
1298 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001299 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001300 break;
1301 }
1302
1303 case 'l': /* long int */
1304 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001305 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001306 break;
1307 }
1308
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001309#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001310 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001311 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001312 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001313 break;
1314 }
1315#endif
1316
Guido van Rossumaa354651996-08-19 19:32:04 +00001317 case 'f': /* float */
1318 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001319 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001320 break;
1321 }
1322
1323 case 'd': /* double */
1324 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001325 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001326 break;
1327 }
1328
1329#ifndef WITHOUT_COMPLEX
1330 case 'D': /* complex double */
1331 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001332 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001333 break;
1334 }
1335#endif /* WITHOUT_COMPLEX */
1336
1337 case 'c': /* char */
1338 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001339 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001340 break;
1341 }
1342
1343 case 's': /* string */
1344 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001345 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001346 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001347 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001348 format++;
1349 }
1350 break;
1351 }
1352
1353 case 'z': /* string */
1354 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001355 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001356 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001357 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001358 format++;
1359 }
1360 break;
1361 }
1362
1363 case 'S': /* string object */
1364 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001366 break;
1367 }
1368
1369 case 'O': /* object */
1370 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001371 if (*format == '!') {
1372 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373 (void) va_arg(*p_va, PyTypeObject*);
1374 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001375 }
1376#if 0
1377/* I don't know what this is for */
1378 else if (*format == '?') {
1379 inquiry pred = va_arg(*p_va, inquiry);
1380 format++;
1381 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001383 }
1384 }
1385#endif
1386 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +00001387 typedef int (*converter)(PyObject *, void *);
Guido van Rossum80bb9651996-12-05 23:27:02 +00001388 (void) va_arg(*p_va, converter);
1389 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001390 format++;
1391 }
1392 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001393 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001394 }
1395 break;
1396 }
1397
1398 default:
1399 return "impossible<bad format char>";
1400
1401 }
1402
1403 *p_format = format;
1404 return NULL;
1405}
Fred Drakee4616e62001-10-23 21:09:29 +00001406
1407
1408int
1409PyArg_UnpackTuple(PyObject *args, char *name, int min, int max, ...)
1410{
1411 int i, l;
1412 PyObject **o;
1413 va_list vargs;
1414
1415#ifdef HAVE_STDARG_PROTOTYPES
1416 va_start(vargs, max);
1417#else
1418 va_start(vargs);
1419#endif
1420
1421 assert(min >= 0);
1422 assert(min <= max);
1423 if (!PyTuple_Check(args)) {
1424 PyErr_SetString(PyExc_SystemError,
1425 "PyArg_UnpackTuple() argument list is not a tuple");
1426 return 0;
1427 }
1428 l = PyTuple_GET_SIZE(args);
1429 if (l < min) {
1430 if (name != NULL)
1431 PyErr_Format(
1432 PyExc_TypeError,
1433 "%s expected %s%d arguments, got %d",
1434 name, (min == max ? "" : "at least "), min, l);
1435 else
1436 PyErr_Format(
1437 PyExc_TypeError,
1438 "unpacked tuple should have %s%d elements,"
1439 " but has %d",
1440 (min == max ? "" : "at least "), min, l);
1441 va_end(vargs);
1442 return 0;
1443 }
1444 if (l > max) {
1445 if (name != NULL)
1446 PyErr_Format(
1447 PyExc_TypeError,
1448 "%s expected %s%d arguments, got %d",
1449 name, (min == max ? "" : "at most "), max, l);
1450 else
1451 PyErr_Format(
1452 PyExc_TypeError,
1453 "unpacked tuple should have %s%d elements,"
1454 " but has %d",
1455 (min == max ? "" : "at most "), max, l);
1456 va_end(vargs);
1457 return 0;
1458 }
1459 for (i = 0; i < l; i++) {
1460 o = va_arg(vargs, PyObject **);
1461 *o = PyTuple_GET_ITEM(args, i);
1462 }
1463 va_end(vargs);
1464 return 1;
1465}