blob: 797e9df77d65a19f2edfb4632818a5a22416b3be [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001
2/* New getargs implementation */
3
4/* XXX There are several unchecked sprintf or strcat calls in this file.
5 XXX The only way these can become a danger is if some C code in the
6 XXX Python source (or in an extension) uses ridiculously long names
Thomas Wouters7e474022000-07-16 12:04:32 +00007 XXX or ridiculously deep nesting in format strings. */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00008
Guido van Rossum79f25d91997-04-29 20:08:16 +00009#include "Python.h"
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000010
Guido van Rossumc1d50531996-08-21 23:38:24 +000011#include <ctype.h>
Guido van Rossumdb677392000-07-01 01:09:43 +000012#ifdef HAVE_LIMITS_H
13#include <limits.h>
14#endif
Guido van Rossumc1d50531996-08-21 23:38:24 +000015
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000016
Tim Petersdbd9ba62000-07-09 03:09:57 +000017int PyArg_Parse(PyObject *, char *, ...);
18int PyArg_ParseTuple(PyObject *, char *, ...);
19int PyArg_VaParse(PyObject *, char *, va_list);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000020
Tim Petersdbd9ba62000-07-09 03:09:57 +000021int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
22 char *, char **, ...);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000023
24/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000025static int vgetargs1(PyObject *, char *, va_list *, int);
26static void seterror(int, char *, int *, char *, char *);
27static char *convertitem(PyObject *, char **, va_list *, int *, char *);
28static char *converttuple(PyObject *, char **, va_list *,
29 int *, char *, int);
30static char *convertsimple(PyObject *, char **, va_list *, char *);
31static char *convertsimple1(PyObject *, char **, va_list *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000032
Tim Petersdbd9ba62000-07-09 03:09:57 +000033static int vgetargskeywords(PyObject *, PyObject *,
34 char *, char **, va_list *);
35static char *skipitem(char **, va_list *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000036
Guido van Rossum79f25d91997-04-29 20:08:16 +000037int PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000038{
39 int retval;
40 va_list va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000041
42 va_start(va, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000044 va_end(va);
45 return retval;
46}
47
48
Guido van Rossum79f25d91997-04-29 20:08:16 +000049int PyArg_ParseTuple(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000050{
51 int retval;
52 va_list va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000053
54 va_start(va, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000055 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000056 va_end(va);
57 return retval;
58}
59
60
61int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000062PyArg_VaParse(PyObject *args, char *format, va_list va)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000063{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064 va_list lva;
65
66#ifdef VA_LIST_IS_ARRAY
67 memcpy(lva, va, sizeof(va_list));
68#else
69 lva = va;
70#endif
71
72 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000073}
74
75
76static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000077vgetargs1(PyObject *args, char *format, va_list *p_va, int compat)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000078{
79 char msgbuf[256];
80 int levels[32];
81 char *fname = NULL;
82 char *message = NULL;
83 int min = -1;
84 int max = 0;
85 int level = 0;
86 char *formatsave = format;
87 int i, len;
88 char *msg;
89
90 for (;;) {
91 int c = *format++;
92 if (c == '(' /* ')' */) {
93 if (level == 0)
94 max++;
95 level++;
96 }
97 else if (/* '(' */ c == ')') {
98 if (level == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +000099 Py_FatalError(/* '(' */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000100 "excess ')' in getargs format");
101 else
102 level--;
103 }
104 else if (c == '\0')
105 break;
106 else if (c == ':') {
107 fname = format;
108 break;
109 }
110 else if (c == ';') {
111 message = format;
112 break;
113 }
114 else if (level != 0)
115 ; /* Pass */
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000116 else if (c == 'e')
117 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000118 else if (isalpha(c))
119 max++;
120 else if (c == '|')
121 min = max;
122 }
123
124 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000126
127 if (min < 0)
128 min = max;
129
130 format = formatsave;
131
132 if (compat) {
133 if (max == 0) {
134 if (args == NULL)
135 return 1;
136 sprintf(msgbuf, "%s requires no arguments",
137 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000138 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000139 return 0;
140 }
141 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000142 if (args == NULL) {
143 sprintf(msgbuf,
144 "%s requires at least one argument",
145 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000147 return 0;
148 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000149 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000150 if (msg == NULL)
151 return 1;
152 seterror(levels[0], msg, levels+1, fname, message);
153 return 0;
154 }
155 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000156 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000157 "old style getargs format uses new features");
158 return 0;
159 }
160 }
161
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 if (!PyTuple_Check(args)) {
163 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000164 "new style getargs format but argument is not a tuple");
165 return 0;
166 }
167
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000169
170 if (len < min || max < len) {
171 if (message == NULL) {
172 sprintf(msgbuf,
173 "%s requires %s %d argument%s; %d given",
174 fname==NULL ? "function" : fname,
175 min==max ? "exactly"
176 : len < min ? "at least" : "at most",
177 len < min ? min : max,
178 (len < min ? min : max) == 1 ? "" : "s",
179 len);
180 message = msgbuf;
181 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000183 return 0;
184 }
185
186 for (i = 0; i < len; i++) {
187 if (*format == '|')
188 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000190 levels, msgbuf);
191 if (msg) {
192 seterror(i+1, msg, levels, fname, message);
193 return 0;
194 }
195 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000196
Guido van Rossum730806d1998-04-10 22:27:42 +0000197 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000198 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000199 *format != '|' && *format != ':' && *format != ';') {
200 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000201 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000202 return 0;
203 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000204
205 return 1;
206}
207
208
209
210static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000211seterror(int iarg, char *msg, int *levels, char *fname, char *message)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000212{
213 char buf[256];
214 int i;
215 char *p = buf;
216
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000218 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000219 if (iarg == 0 && message == NULL)
220 message = msg;
221 else if (message == NULL) {
222 if (fname != NULL) {
223 sprintf(p, "%s, ", fname);
224 p += strlen(p);
225 }
226 sprintf(p, "argument %d", iarg);
227 i = 0;
228 p += strlen(p);
229 while (levels[i] > 0) {
230 sprintf(p, ", item %d", levels[i]-1);
231 p += strlen(p);
232 i++;
233 }
234 sprintf(p, ": expected %s found", msg);
235 message = buf;
236 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000237 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000238}
239
240
241/* Convert a tuple argument.
242 On entry, *p_format points to the character _after_ the opening '('.
243 On successful exit, *p_format points to the closing ')'.
244 If successful:
245 *p_format and *p_va are updated,
246 *levels and *msgbuf are untouched,
247 and NULL is returned.
248 If the argument is invalid:
249 *p_format is unchanged,
250 *p_va is undefined,
251 *levels is a 0-terminated list of item numbers,
252 *msgbuf contains an error message, whose format is:
253 "<typename1>, <typename2>", where:
254 <typename1> is the name of the expected type, and
255 <typename2> is the name of the actual type,
256 (so you can surround it by "expected ... found"),
257 and msgbuf is returned.
258*/
259
260static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000261converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
262 char *msgbuf, int toplevel)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000263{
264 int level = 0;
265 int n = 0;
266 char *format = *p_format;
267 int i;
268
269 for (;;) {
270 int c = *format++;
271 if (c == '(') {
272 if (level == 0)
273 n++;
274 level++;
275 }
276 else if (c == ')') {
277 if (level == 0)
278 break;
279 level--;
280 }
281 else if (c == ':' || c == ';' || c == '\0')
282 break;
283 else if (level == 0 && isalpha(c))
284 n++;
285 }
286
Guido van Rossum66368cc1999-02-17 23:16:43 +0000287 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000288 levels[0] = 0;
289 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000290 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000292 return msgbuf;
293 }
294
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000295 if ((i = PySequence_Size(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000296 levels[0] = 0;
297 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000298 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
299 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000300 return msgbuf;
301 }
302
303 format = *p_format;
304 for (i = 0; i < n; i++) {
305 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000306 PyObject *item;
307 item = PySequence_GetItem(arg, i);
308 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
309 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
310 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000311 if (msg != NULL) {
312 levels[0] = i+1;
313 return msg;
314 }
315 }
316
317 *p_format = format;
318 return NULL;
319}
320
321
322/* Convert a single item. */
323
324static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000325convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels,
326 char *msgbuf)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000327{
328 char *msg;
329 char *format = *p_format;
330
331 if (*format == '(' /* ')' */) {
332 format++;
333 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
334 if (msg == NULL)
335 format++;
336 }
337 else {
338 msg = convertsimple(arg, &format, p_va, msgbuf);
339 if (msg != NULL)
340 levels[0] = 0;
341 }
342 if (msg == NULL)
343 *p_format = format;
344 return msg;
345}
346
347
348/* Convert a non-tuple argument. Adds to convertsimple1 functionality
349 by appending ", <actual argument type>" to error message. */
350
351static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000352convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000353{
354 char *msg = convertsimple1(arg, p_format, p_va);
355 if (msg != NULL) {
356 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000358 msg = msgbuf;
359 }
360 return msg;
361}
362
363
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000364/* Internal API needed by convertsimple1(): */
365extern
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000366PyObject *_PyUnicode_AsDefaultEncodedString(PyObject *unicode,
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000367 const char *errors);
368
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000369/* Convert a non-tuple argument. Return NULL if conversion went OK,
370 or a string representing the expected type if the conversion failed.
371 When failing, an exception may or may not have been raised.
372 Don't call if a tuple is expected. */
373
374static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000375convertsimple1(PyObject *arg, char **p_format, va_list *p_va)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000376{
377 char *format = *p_format;
378 char c = *format++;
379
380 switch (c) {
381
Fred Drake230cae72000-05-09 21:50:00 +0000382 case 'b': /* unsigned byte -- very short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000383 {
384 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000385 long ival = PyInt_AsLong(arg);
386 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000387 return "integer<b>";
Fred Drake230cae72000-05-09 21:50:00 +0000388 else if (ival < 0) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000389 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000390 "unsigned byte integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000391 return "integer<b>";
392 }
Fred Drake230cae72000-05-09 21:50:00 +0000393 else if (ival > UCHAR_MAX) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000394 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000395 "unsigned byte integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000396 return "integer<b>";
397 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000398 else
Fred Drake230cae72000-05-09 21:50:00 +0000399 *p = (unsigned char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000400 break;
401 }
402
Jack Jansencc22fbe2000-08-05 21:29:58 +0000403 case 'B': /* byte sized bitfield - both signed and unsigned values allowed */
404 {
405 char *p = va_arg(*p_va, char *);
406 long ival = PyInt_AsLong(arg);
407 if (ival == -1 && PyErr_Occurred())
408 return "integer<b>";
409 else if (ival < SCHAR_MIN) {
410 PyErr_SetString(PyExc_OverflowError,
411 "byte-sized integer bitfield is less than minimum");
412 return "integer<B>";
413 }
Jack Jansena454ebd2000-09-15 12:52:19 +0000414 else if (ival > (int)UCHAR_MAX) {
Jack Jansencc22fbe2000-08-05 21:29:58 +0000415 PyErr_SetString(PyExc_OverflowError,
416 "byte-sized integer bitfield is greater than maximum");
417 return "integer<B>";
418 }
419 else
420 *p = (unsigned char) ival;
421 break;
422 }
423
Fred Drake230cae72000-05-09 21:50:00 +0000424 case 'h': /* signed short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000425 {
426 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 long ival = PyInt_AsLong(arg);
428 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000429 return "integer<h>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000430 else if (ival < SHRT_MIN) {
431 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000432 "signed short integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000433 return "integer<h>";
434 }
435 else if (ival > SHRT_MAX) {
436 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000437 "signed short integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000438 return "integer<h>";
439 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000440 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000441 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000442 break;
443 }
444
Jack Jansencc22fbe2000-08-05 21:29:58 +0000445 case 'H': /* short int sized bitfield, both signed and unsigned allowed */
Jack Jansend50338f2000-07-06 12:22:00 +0000446 {
447 unsigned short *p = va_arg(*p_va, unsigned short *);
448 long ival = PyInt_AsLong(arg);
449 if (ival == -1 && PyErr_Occurred())
450 return "integer<H>";
Jack Jansencc22fbe2000-08-05 21:29:58 +0000451 else if (ival < SHRT_MIN) {
Jack Jansend50338f2000-07-06 12:22:00 +0000452 PyErr_SetString(PyExc_OverflowError,
Jack Jansencc22fbe2000-08-05 21:29:58 +0000453 "short integer bitfield is less than minimum");
Jack Jansend50338f2000-07-06 12:22:00 +0000454 return "integer<H>";
455 }
456 else if (ival > USHRT_MAX) {
457 PyErr_SetString(PyExc_OverflowError,
Jack Jansencc22fbe2000-08-05 21:29:58 +0000458 "short integer bitfield is greater than maximum");
Jack Jansend50338f2000-07-06 12:22:00 +0000459 return "integer<H>";
460 }
461 else
462 *p = (unsigned short) ival;
463 break;
464 }
465
Fred Drake230cae72000-05-09 21:50:00 +0000466 case 'i': /* signed int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000467 {
468 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 long ival = PyInt_AsLong(arg);
470 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000471 return "integer<i>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000472 else if (ival > INT_MAX) {
473 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000474 "signed integer is greater than maximum");
475 return "integer<i>";
476 }
477 else if (ival < INT_MIN) {
478 PyErr_SetString(PyExc_OverflowError,
479 "signed integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000480 return "integer<i>";
481 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000482 else
483 *p = ival;
484 break;
485 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000486 case 'l': /* long int */
487 {
488 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000489 long ival = PyInt_AsLong(arg);
490 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000491 return "integer<l>";
492 else
493 *p = ival;
494 break;
495 }
496
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000497#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000498 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000499 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000500 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
501 LONG_LONG ival = PyLong_AsLongLong( arg );
502 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000503 return "long<L>";
504 } else {
505 *p = ival;
506 }
507 break;
508 }
509#endif
510
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000511 case 'f': /* float */
512 {
513 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 double dval = PyFloat_AsDouble(arg);
515 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000516 return "float<f>";
517 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000518 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000519 break;
520 }
521
522 case 'd': /* double */
523 {
524 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000525 double dval = PyFloat_AsDouble(arg);
526 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000527 return "float<d>";
528 else
529 *p = dval;
530 break;
531 }
532
Guido van Rossum530956d1996-07-21 02:27:43 +0000533#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000534 case 'D': /* complex double */
535 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000536 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000537 Py_complex cval;
538 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000540 return "complex<D>";
541 else
542 *p = cval;
543 break;
544 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000545#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000546
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000547 case 'c': /* char */
548 {
549 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 if (PyString_Check(arg) && PyString_Size(arg) == 1)
551 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000552 else
553 return "char";
554 break;
555 }
556
557 case 's': /* string */
558 {
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000559 if (*format == '#') {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000560 void **p = (void **)va_arg(*p_va, char **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000561 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000562
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000563 if (PyString_Check(arg)) {
564 *p = PyString_AS_STRING(arg);
565 *q = PyString_GET_SIZE(arg);
566 }
567 else if (PyUnicode_Check(arg)) {
568 arg = _PyUnicode_AsDefaultEncodedString(
569 arg, NULL);
570 if (arg == NULL)
571 return "unicode conversion error";
572 *p = PyString_AS_STRING(arg);
573 *q = PyString_GET_SIZE(arg);
574 }
575 else { /* any buffer-like object */
576 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
577 int count;
578 if ( pb == NULL ||
579 pb->bf_getreadbuffer == NULL ||
580 pb->bf_getsegcount == NULL )
581 return "read-only buffer";
582 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
583 return "single-segment read-only buffer";
584 if ( (count =
585 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
586 return "(unspecified)";
587 *q = count;
588 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000589 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000590 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000591 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000592
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000593 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000594 *p = PyString_AS_STRING(arg);
595 else if (PyUnicode_Check(arg)) {
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000596 arg = _PyUnicode_AsDefaultEncodedString(
597 arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000598 if (arg == NULL)
599 return "unicode conversion error";
600 *p = PyString_AS_STRING(arg);
601 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000602 else
603 return "string";
604 if ((int)strlen(*p) != PyString_Size(arg))
605 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000606 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000607 break;
608 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000609
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000610 case 'z': /* string, may be NULL (None) */
611 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000612 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000613 void **p = (void **)va_arg(*p_va, char **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000614 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000615
616 if (arg == Py_None) {
617 *p = 0;
618 *q = 0;
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000619 }
620 else if (PyString_Check(arg)) {
621 *p = PyString_AS_STRING(arg);
622 *q = PyString_GET_SIZE(arg);
623 }
624 else if (PyUnicode_Check(arg)) {
625 arg = _PyUnicode_AsDefaultEncodedString(
626 arg, NULL);
627 if (arg == NULL)
628 return "unicode conversion error";
629 *p = PyString_AS_STRING(arg);
630 *q = PyString_GET_SIZE(arg);
631 }
632 else { /* any buffer-like object */
633 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
634 int count;
635 if ( pb == NULL ||
636 pb->bf_getreadbuffer == NULL ||
637 pb->bf_getsegcount == NULL )
638 return "read-only buffer";
639 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
640 return "single-segment read-only buffer";
641 if ( (count =
642 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
643 return "(unspecified)";
644 *q = count;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000645 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000646 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000647 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000648 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000649
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000650 if (arg == Py_None)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000651 *p = 0;
652 else if (PyString_Check(arg))
653 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000654 else if (PyUnicode_Check(arg)) {
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000655 arg = _PyUnicode_AsDefaultEncodedString(
656 arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000657 if (arg == NULL)
658 return "unicode conversion error";
659 *p = PyString_AS_STRING(arg);
660 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000661 else
662 return "None or string";
663 if (*format == '#') {
664 int *q = va_arg(*p_va, int *);
665 if (arg == Py_None)
666 *q = 0;
667 else
668 *q = PyString_Size(arg);
669 format++;
670 }
671 else if (*p != NULL &&
672 (int)strlen(*p) != PyString_Size(arg))
673 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000674 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000675 break;
676 }
677
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000678 case 'e': /* encoded string */
679 {
680 char **buffer;
681 const char *encoding;
682 PyObject *u, *s;
683 int size;
684
685 /* Get 'e' parameter: the encoding name */
686 encoding = (const char *)va_arg(*p_va, const char *);
687 if (encoding == NULL)
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000688 encoding = PyUnicode_GetDefaultEncoding();
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000689
690 /* Get 's' parameter: the output buffer to use */
691 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000692 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000693 buffer = (char **)va_arg(*p_va, char **);
694 format++;
695 if (buffer == NULL)
696 return "(buffer is NULL)";
697
698 /* Convert object to Unicode */
699 u = PyUnicode_FromObject(arg);
700 if (u == NULL)
701 return "string, unicode or text buffer";
702
703 /* Encode object; use default error handling */
704 s = PyUnicode_AsEncodedString(u,
705 encoding,
706 NULL);
707 Py_DECREF(u);
708 if (s == NULL)
709 return "(encoding failed)";
710 if (!PyString_Check(s)) {
711 Py_DECREF(s);
712 return "(encoder failed to return a string)";
713 }
714 size = PyString_GET_SIZE(s);
715
716 /* Write output; output is guaranteed to be
717 0-terminated */
718 if (*format == '#') {
719 /* Using buffer length parameter '#':
720
721 - if *buffer is NULL, a new buffer
722 of the needed size is allocated and
723 the data copied into it; *buffer is
724 updated to point to the new buffer;
725 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000726 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000727
728 - if *buffer is not NULL, the data
729 is copied to *buffer; *buffer_len
730 has to be set to the size of the
731 buffer on input; buffer overflow is
732 signalled with an error; buffer has
733 to provide enough room for the
734 encoded string plus the trailing
735 0-byte
736
737 - in both cases, *buffer_len is
738 updated to the size of the buffer
739 /excluding/ the trailing 0-byte
740
741 */
742 int *buffer_len = va_arg(*p_va, int *);
743
744 format++;
745 if (buffer_len == NULL)
746 return "(buffer_len is NULL)";
747 if (*buffer == NULL) {
748 *buffer = PyMem_NEW(char, size + 1);
749 if (*buffer == NULL) {
750 Py_DECREF(s);
751 return "(memory error)";
752 }
753 } else {
754 if (size + 1 > *buffer_len) {
755 Py_DECREF(s);
756 return "(buffer overflow)";
757 }
758 }
759 memcpy(*buffer,
760 PyString_AS_STRING(s),
761 size + 1);
762 *buffer_len = size;
763 } else {
764 /* Using a 0-terminated buffer:
765
766 - the encoded string has to be
767 0-terminated for this variant to
768 work; if it is not, an error raised
769
770 - a new buffer of the needed size
771 is allocated and the data copied
772 into it; *buffer is updated to
773 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000774 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000775 after usage
776
777 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000778 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000779 return "(encoded string without "\
780 "NULL bytes)";
781 *buffer = PyMem_NEW(char, size + 1);
782 if (*buffer == NULL) {
783 Py_DECREF(s);
784 return "(memory error)";
785 }
786 memcpy(*buffer,
787 PyString_AS_STRING(s),
788 size + 1);
789 }
790 Py_DECREF(s);
791 break;
792 }
793
Fred Drake25871c02000-05-03 15:17:02 +0000794 case 'u': /* raw unicode buffer (Py_UNICODE *) */
795 {
796 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000797 void **p = (void **)va_arg(*p_va, char **);
798 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Fred Drake25871c02000-05-03 15:17:02 +0000799 int *q = va_arg(*p_va, int *);
800 int count;
801
802 if ( pb == NULL ||
803 pb->bf_getreadbuffer == NULL ||
804 pb->bf_getsegcount == NULL )
805 return "read-only buffer";
806 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
807 return "single-segment read-only buffer";
808 if ( (count =
809 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
810 return "(unspecified)";
811 /* buffer interface returns bytes, we want
812 length in characters */
813 *q = count/(sizeof(Py_UNICODE));
814 format++;
815 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000816 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
Fred Drake25871c02000-05-03 15:17:02 +0000817
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000818 if (PyUnicode_Check(arg))
Fred Drake25871c02000-05-03 15:17:02 +0000819 *p = PyUnicode_AS_UNICODE(arg);
820 else
821 return "unicode";
822 }
823 break;
824 }
825
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000826 case 'S': /* string object */
827 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 PyObject **p = va_arg(*p_va, PyObject **);
829 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000830 *p = arg;
831 else
832 return "string";
833 break;
834 }
835
Guido van Rossume826ef02000-03-10 23:02:17 +0000836 case 'U': /* Unicode object */
837 {
838 PyObject **p = va_arg(*p_va, PyObject **);
839 if (PyUnicode_Check(arg))
840 *p = arg;
841 else
842 return "unicode";
843 break;
844 }
845
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000846 case 'O': /* object */
847 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 PyTypeObject *type;
849 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000850 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000852 p = va_arg(*p_va, PyObject **);
853 format++;
854 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000855 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000856 else
857 return type->tp_name;
858
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000859 }
860 else if (*format == '?') {
861 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000862 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000863 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000864 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000865 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000866 else
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000867 return "(unspecified)";
Guido van Rossumfccfe891998-05-15 22:04:07 +0000868
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000869 }
870 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +0000871 typedef int (*converter)(PyObject *, void *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000872 converter convert = va_arg(*p_va, converter);
873 void *addr = va_arg(*p_va, void *);
874 format++;
875 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000876 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000877 }
878 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000880 *p = arg;
881 }
882 break;
883 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000884
885
886 case 'w': /* memory buffer, read-write access */
887 {
888 void **p = va_arg(*p_va, void **);
889 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
890 int count;
891
892 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
893 pb->bf_getsegcount == NULL )
894 return "read-write buffer";
895 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
896 return "single-segment read-write buffer";
897 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
898 return "(unspecified)";
899 if (*format == '#') {
900 int *q = va_arg(*p_va, int *);
901
902 *q = count;
903 format++;
904 }
905 break;
906 }
907
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000908 case 't': /* 8-bit character buffer, read-only access */
909 {
910 const char **p = va_arg(*p_va, const char **);
911 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
912 int count;
913
914 if ( *format++ != '#' )
915 return "invalid use of 't' format character";
916 if ( !PyType_HasFeature(
917 arg->ob_type,
918 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
919 pb == NULL ||
920 pb->bf_getcharbuffer == NULL ||
921 pb->bf_getsegcount == NULL )
922 return "read-only character buffer";
923 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
924 return "single-segment read-only buffer";
925 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
926 return "(unspecified)";
927
928 *va_arg(*p_va, int *) = count;
929
930 break;
931 }
932
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000933
934 default:
935 return "impossible<bad format char>";
936
937 }
938
939 *p_format = format;
940 return NULL;
941}
Guido van Rossumaa354651996-08-19 19:32:04 +0000942
943
944/* Support for keyword arguments donated by
945 Geoff Philbrick <philbric@delphi.hks.com> */
946
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947int PyArg_ParseTupleAndKeywords(PyObject *args,
948 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000949 char *format,
950 char **kwlist, ...)
Guido van Rossumaa354651996-08-19 19:32:04 +0000951{
952 int retval;
953 va_list va;
Guido van Rossumaa354651996-08-19 19:32:04 +0000954
955 va_start(va, kwlist);
Guido van Rossumaa354651996-08-19 19:32:04 +0000956 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
957 va_end(va);
958 return retval;
959}
960
961
962static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000963vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
964 char **kwlist, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +0000965{
966 char msgbuf[256];
967 int levels[32];
968 char *fname = NULL;
969 char *message = NULL;
970 int min = -1;
971 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000972 char *formatsave = format;
973 int i, len, tplen, kwlen;
974 char *msg, *ks, **p;
975 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000977
978 /* nested tuples cannot be parsed when using keyword arguments */
979
980 for (;;) {
981 int c = *format++;
982 if (c == '(') {
983 PyErr_SetString(PyExc_SystemError,
984 "tuple found in format when using keyword arguments");
985 return 0;
986 }
987 else if (c == '\0')
988 break;
989 else if (c == ':') {
990 fname = format;
991 break;
992 }
993 else if (c == ';') {
994 message = format;
995 break;
996 }
Marc-André Lemburgbbcf2a72000-09-08 11:49:37 +0000997 else if (c == 'e')
998 ; /* Pass */
Guido van Rossumaa354651996-08-19 19:32:04 +0000999 else if (isalpha(c))
1000 max++;
1001 else if (c == '|')
1002 min = max;
1003 }
1004
1005 if (min < 0)
1006 min = max;
1007
1008 format = formatsave;
1009
1010 if (!PyTuple_Check(args)) {
1011 PyErr_SetString(PyExc_SystemError,
1012 "new style getargs format but argument is not a tuple");
1013 return 0;
1014 }
1015
1016 tplen = PyTuple_Size(args);
1017
1018 /* do a cursory check of the keywords just to see how many we got */
1019
1020 if (keywords) {
1021 if (!PyDict_Check(keywords)) {
1022 PyErr_SetString(PyExc_SystemError,
1023 "non-dictionary object received when keyword dictionary expected");
1024 return 0;
1025 }
1026 kwlen = PyDict_Size(keywords);
1027 }
1028 else {
1029 kwlen = 0;
1030 }
1031
1032 /* make sure there are no duplicate values for an argument;
1033 its not clear when to use the term "keyword argument vs.
1034 keyword parameter in messages */
1035
1036 if (keywords) {
1037 for (i = 0; i < tplen; i++) {
1038 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1039 sprintf(msgbuf,
1040 "keyword parameter %s redefined",
1041 kwlist[i]);
1042 PyErr_SetString(PyExc_TypeError, msgbuf);
1043 return 0;
1044 }
1045 }
1046 }
1047 PyErr_Clear(); /* I'm not which Py functions set the error string */
1048
1049 /* required arguments missing from args can be supplied by keyword
1050 arguments */
1051
1052 len = tplen;
1053 if (keywords && tplen < min) {
1054 for (i = tplen; i < min; i++) {
1055 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1056 len++;
1057 }
1058 }
1059 }
1060 PyErr_Clear();
1061
1062 /* make sure we got an acceptable number of arguments; the message
1063 is a little confusing with keywords since keyword arguments
1064 which are supplied, but don't match the required arguments
1065 are not included in the "%d given" part of the message */
1066
1067 if (len < min || max < len) {
1068 if (message == NULL) {
1069 sprintf(msgbuf,
1070 "%s requires %s %d argument%s; %d given",
1071 fname==NULL ? "function" : fname,
1072 min==max ? "exactly"
1073 : len < min ? "at least" : "at most",
1074 len < min ? min : max,
1075 (len < min ? min : max) == 1 ? "" : "s",
1076 len);
1077 message = msgbuf;
1078 }
1079 PyErr_SetString(PyExc_TypeError, message);
1080 return 0;
1081 }
1082
1083 for (i = 0; i < tplen; i++) {
1084 if (*format == '|')
1085 format++;
1086 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1087 levels, msgbuf);
1088 if (msg) {
1089 seterror(i+1, msg, levels, fname, message);
1090 return 0;
1091 }
1092 }
1093
1094 /* handle no keyword parameters in call */
1095
1096 if (!keywords) return 1;
1097
1098 /* make sure the number of keywords in the keyword list matches the
1099 number of items in the format string */
1100
1101 nkwds = 0;
1102 p = kwlist;
1103 for (;;) {
1104 if (!*(p++)) break;
1105 nkwds++;
1106 }
1107
1108 if (nkwds != max) {
1109 PyErr_SetString(PyExc_SystemError,
1110 "number of items in format string and keyword list do not match");
1111 return 0;
1112 }
1113
1114 /* convert the keyword arguments; this uses the format
1115 string where it was left after processing args */
1116
1117 converted = 0;
1118 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001120 if (*format == '|')
1121 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001122 item = PyMapping_GetItemString(keywords, kwlist[i]);
1123 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001124 msg = convertitem(item, &format, p_va, levels, msgbuf);
1125 if (msg) {
1126 seterror(i+1, msg, levels, fname, message);
1127 return 0;
1128 }
1129 converted++;
1130 }
1131 else {
1132 PyErr_Clear();
1133 msg = skipitem(&format, p_va);
1134 if (msg) {
1135 seterror(i+1, msg, levels, fname, message);
1136 return 0;
1137 }
1138 }
1139 }
1140
1141 /* make sure there are no extraneous keyword arguments */
1142
1143 pos = 0;
1144 if (converted < kwlen) {
1145 while (PyDict_Next(keywords, &pos, &key, &value)) {
1146 match = 0;
1147 ks = PyString_AsString(key);
1148 for (i = 0; i < nkwds; i++) {
1149 if (!strcmp(ks, kwlist[i])) {
1150 match = 1;
1151 break;
1152 }
1153 }
1154 if (!match) {
1155 sprintf(msgbuf,
Guido van Rossum80dc16b2000-05-08 14:02:41 +00001156 "%s is an invalid keyword argument for this function",
Guido van Rossumaa354651996-08-19 19:32:04 +00001157 ks);
1158 PyErr_SetString(PyExc_TypeError, msgbuf);
1159 return 0;
1160 }
1161 }
1162 }
1163
1164 return 1;
1165}
1166
1167
1168static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001169skipitem(char **p_format, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +00001170{
1171 char *format = *p_format;
1172 char c = *format++;
1173
1174 switch (c) {
1175
1176 case 'b': /* byte -- very short int */
Jack Jansencc22fbe2000-08-05 21:29:58 +00001177 case 'B': /* byte as bitfield */
Guido van Rossumaa354651996-08-19 19:32:04 +00001178 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001179 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001180 break;
1181 }
1182
1183 case 'h': /* short int */
1184 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001185 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001186 break;
1187 }
1188
Jack Jansencc22fbe2000-08-05 21:29:58 +00001189 case 'H': /* short int as bitfield */
Jack Jansend50338f2000-07-06 12:22:00 +00001190 {
1191 (void) va_arg(*p_va, unsigned short *);
1192 break;
1193 }
1194
Guido van Rossumaa354651996-08-19 19:32:04 +00001195 case 'i': /* int */
1196 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001197 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001198 break;
1199 }
1200
1201 case 'l': /* long int */
1202 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001203 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001204 break;
1205 }
1206
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001207#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001208 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001209 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001210 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001211 break;
1212 }
1213#endif
1214
Guido van Rossumaa354651996-08-19 19:32:04 +00001215 case 'f': /* float */
1216 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001217 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001218 break;
1219 }
1220
1221 case 'd': /* double */
1222 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001223 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001224 break;
1225 }
1226
1227#ifndef WITHOUT_COMPLEX
1228 case 'D': /* complex double */
1229 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001230 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001231 break;
1232 }
1233#endif /* WITHOUT_COMPLEX */
1234
1235 case 'c': /* char */
1236 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001237 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001238 break;
1239 }
1240
1241 case 's': /* string */
1242 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001243 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001244 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001245 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001246 format++;
1247 }
1248 break;
1249 }
1250
1251 case 'z': /* string */
1252 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001253 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001254 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001255 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001256 format++;
1257 }
1258 break;
1259 }
1260
1261 case 'S': /* string object */
1262 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001264 break;
1265 }
1266
1267 case 'O': /* object */
1268 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001269 if (*format == '!') {
1270 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001271 (void) va_arg(*p_va, PyTypeObject*);
1272 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001273 }
1274#if 0
1275/* I don't know what this is for */
1276 else if (*format == '?') {
1277 inquiry pred = va_arg(*p_va, inquiry);
1278 format++;
1279 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001281 }
1282 }
1283#endif
1284 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +00001285 typedef int (*converter)(PyObject *, void *);
Guido van Rossum80bb9651996-12-05 23:27:02 +00001286 (void) va_arg(*p_va, converter);
1287 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001288 format++;
1289 }
1290 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001292 }
1293 break;
1294 }
1295
1296 default:
1297 return "impossible<bad format char>";
1298
1299 }
1300
1301 *p_format = format;
1302 return NULL;
1303}