blob: ceaf6cb8ac45fd2d6c22374a95b594e42a3ec61b [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00009******************************************************************/
10
11/* New getargs implementation */
12
13/* XXX There are several unchecked sprintf or strcat calls in this file.
14 XXX The only way these can become a danger is if some C code in the
15 XXX Python source (or in an extension) uses ridiculously long names
Thomas Wouters7e474022000-07-16 12:04:32 +000016 XXX or ridiculously deep nesting in format strings. */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000017
Guido van Rossum79f25d91997-04-29 20:08:16 +000018#include "Python.h"
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000019
Guido van Rossumc1d50531996-08-21 23:38:24 +000020#include <ctype.h>
Guido van Rossumdb677392000-07-01 01:09:43 +000021#ifdef HAVE_LIMITS_H
22#include <limits.h>
23#endif
Guido van Rossumc1d50531996-08-21 23:38:24 +000024
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000025
Tim Petersdbd9ba62000-07-09 03:09:57 +000026int PyArg_Parse(PyObject *, char *, ...);
27int PyArg_ParseTuple(PyObject *, char *, ...);
28int PyArg_VaParse(PyObject *, char *, va_list);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000029
Tim Petersdbd9ba62000-07-09 03:09:57 +000030int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
31 char *, char **, ...);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000032
33/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000034static int vgetargs1(PyObject *, char *, va_list *, int);
35static void seterror(int, char *, int *, char *, char *);
36static char *convertitem(PyObject *, char **, va_list *, int *, char *);
37static char *converttuple(PyObject *, char **, va_list *,
38 int *, char *, int);
39static char *convertsimple(PyObject *, char **, va_list *, char *);
40static char *convertsimple1(PyObject *, char **, va_list *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000041
Tim Petersdbd9ba62000-07-09 03:09:57 +000042static int vgetargskeywords(PyObject *, PyObject *,
43 char *, char **, va_list *);
44static char *skipitem(char **, va_list *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000045
Guido van Rossum79f25d91997-04-29 20:08:16 +000046int PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000047{
48 int retval;
49 va_list va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000050
51 va_start(va, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000052 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000053 va_end(va);
54 return retval;
55}
56
57
Guido van Rossum79f25d91997-04-29 20:08:16 +000058int PyArg_ParseTuple(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000059{
60 int retval;
61 va_list va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000062
63 va_start(va, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000065 va_end(va);
66 return retval;
67}
68
69
70int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000071PyArg_VaParse(PyObject *args, char *format, va_list va)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000072{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000073 va_list lva;
74
75#ifdef VA_LIST_IS_ARRAY
76 memcpy(lva, va, sizeof(va_list));
77#else
78 lva = va;
79#endif
80
81 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000082}
83
84
85static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000086vgetargs1(PyObject *args, char *format, va_list *p_va, int compat)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000087{
88 char msgbuf[256];
89 int levels[32];
90 char *fname = NULL;
91 char *message = NULL;
92 int min = -1;
93 int max = 0;
94 int level = 0;
95 char *formatsave = format;
96 int i, len;
97 char *msg;
98
99 for (;;) {
100 int c = *format++;
101 if (c == '(' /* ')' */) {
102 if (level == 0)
103 max++;
104 level++;
105 }
106 else if (/* '(' */ c == ')') {
107 if (level == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 Py_FatalError(/* '(' */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000109 "excess ')' in getargs format");
110 else
111 level--;
112 }
113 else if (c == '\0')
114 break;
115 else if (c == ':') {
116 fname = format;
117 break;
118 }
119 else if (c == ';') {
120 message = format;
121 break;
122 }
123 else if (level != 0)
124 ; /* Pass */
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000125 else if (c == 'e')
126 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000127 else if (isalpha(c))
128 max++;
129 else if (c == '|')
130 min = max;
131 }
132
133 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000135
136 if (min < 0)
137 min = max;
138
139 format = formatsave;
140
141 if (compat) {
142 if (max == 0) {
143 if (args == NULL)
144 return 1;
145 sprintf(msgbuf, "%s requires no arguments",
146 fname==NULL ? "function" : fname);
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) {
152 sprintf(msgbuf,
153 "%s requires at least one argument",
154 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000156 return 0;
157 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000158 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000159 if (msg == NULL)
160 return 1;
161 seterror(levels[0], msg, levels+1, fname, message);
162 return 0;
163 }
164 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000166 "old style getargs format uses new features");
167 return 0;
168 }
169 }
170
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 if (!PyTuple_Check(args)) {
172 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000173 "new style getargs format but argument is not a tuple");
174 return 0;
175 }
176
Guido van Rossum79f25d91997-04-29 20:08:16 +0000177 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000178
179 if (len < min || max < len) {
180 if (message == NULL) {
181 sprintf(msgbuf,
182 "%s requires %s %d argument%s; %d given",
183 fname==NULL ? "function" : fname,
184 min==max ? "exactly"
185 : len < min ? "at least" : "at most",
186 len < min ? min : max,
187 (len < min ? min : max) == 1 ? "" : "s",
188 len);
189 message = msgbuf;
190 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000192 return 0;
193 }
194
195 for (i = 0; i < len; i++) {
196 if (*format == '|')
197 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000198 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000199 levels, msgbuf);
200 if (msg) {
201 seterror(i+1, msg, levels, fname, message);
202 return 0;
203 }
204 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000205
Guido van Rossum730806d1998-04-10 22:27:42 +0000206 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000207 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000208 *format != '|' && *format != ':' && *format != ';') {
209 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000210 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000211 return 0;
212 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000213
214 return 1;
215}
216
217
218
219static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000220seterror(int iarg, char *msg, int *levels, char *fname, char *message)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000221{
222 char buf[256];
223 int i;
224 char *p = buf;
225
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000227 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000228 if (iarg == 0 && message == NULL)
229 message = msg;
230 else if (message == NULL) {
231 if (fname != NULL) {
232 sprintf(p, "%s, ", fname);
233 p += strlen(p);
234 }
235 sprintf(p, "argument %d", iarg);
236 i = 0;
237 p += strlen(p);
238 while (levels[i] > 0) {
239 sprintf(p, ", item %d", levels[i]-1);
240 p += strlen(p);
241 i++;
242 }
243 sprintf(p, ": expected %s found", msg);
244 message = buf;
245 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000247}
248
249
250/* Convert a tuple argument.
251 On entry, *p_format points to the character _after_ the opening '('.
252 On successful exit, *p_format points to the closing ')'.
253 If successful:
254 *p_format and *p_va are updated,
255 *levels and *msgbuf are untouched,
256 and NULL is returned.
257 If the argument is invalid:
258 *p_format is unchanged,
259 *p_va is undefined,
260 *levels is a 0-terminated list of item numbers,
261 *msgbuf contains an error message, whose format is:
262 "<typename1>, <typename2>", where:
263 <typename1> is the name of the expected type, and
264 <typename2> is the name of the actual type,
265 (so you can surround it by "expected ... found"),
266 and msgbuf is returned.
267*/
268
269static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000270converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
271 char *msgbuf, int toplevel)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000272{
273 int level = 0;
274 int n = 0;
275 char *format = *p_format;
276 int i;
277
278 for (;;) {
279 int c = *format++;
280 if (c == '(') {
281 if (level == 0)
282 n++;
283 level++;
284 }
285 else if (c == ')') {
286 if (level == 0)
287 break;
288 level--;
289 }
290 else if (c == ':' || c == ';' || c == '\0')
291 break;
292 else if (level == 0 && isalpha(c))
293 n++;
294 }
295
Guido van Rossum66368cc1999-02-17 23:16:43 +0000296 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000297 levels[0] = 0;
298 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000299 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000301 return msgbuf;
302 }
303
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000304 if ((i = PySequence_Size(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000305 levels[0] = 0;
306 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000307 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
308 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000309 return msgbuf;
310 }
311
312 format = *p_format;
313 for (i = 0; i < n; i++) {
314 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000315 PyObject *item;
316 item = PySequence_GetItem(arg, i);
317 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
318 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
319 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000320 if (msg != NULL) {
321 levels[0] = i+1;
322 return msg;
323 }
324 }
325
326 *p_format = format;
327 return NULL;
328}
329
330
331/* Convert a single item. */
332
333static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels,
335 char *msgbuf)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000336{
337 char *msg;
338 char *format = *p_format;
339
340 if (*format == '(' /* ')' */) {
341 format++;
342 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
343 if (msg == NULL)
344 format++;
345 }
346 else {
347 msg = convertsimple(arg, &format, p_va, msgbuf);
348 if (msg != NULL)
349 levels[0] = 0;
350 }
351 if (msg == NULL)
352 *p_format = format;
353 return msg;
354}
355
356
357/* Convert a non-tuple argument. Adds to convertsimple1 functionality
358 by appending ", <actual argument type>" to error message. */
359
360static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000361convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000362{
363 char *msg = convertsimple1(arg, p_format, p_va);
364 if (msg != NULL) {
365 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000367 msg = msgbuf;
368 }
369 return msg;
370}
371
372
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000373/* Internal API needed by convertsimple1(): */
374extern
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000375PyObject *_PyUnicode_AsDefaultEncodedString(PyObject *unicode,
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000376 const char *errors);
377
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000378/* Convert a non-tuple argument. Return NULL if conversion went OK,
379 or a string representing the expected type if the conversion failed.
380 When failing, an exception may or may not have been raised.
381 Don't call if a tuple is expected. */
382
383static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000384convertsimple1(PyObject *arg, char **p_format, va_list *p_va)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000385{
386 char *format = *p_format;
387 char c = *format++;
388
389 switch (c) {
390
Fred Drake230cae72000-05-09 21:50:00 +0000391 case 'b': /* unsigned byte -- very short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000392 {
393 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394 long ival = PyInt_AsLong(arg);
395 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000396 return "integer<b>";
Fred Drake230cae72000-05-09 21:50:00 +0000397 else if (ival < 0) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000398 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000399 "unsigned byte integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000400 return "integer<b>";
401 }
Fred Drake230cae72000-05-09 21:50:00 +0000402 else if (ival > UCHAR_MAX) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000403 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000404 "unsigned byte integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000405 return "integer<b>";
406 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000407 else
Fred Drake230cae72000-05-09 21:50:00 +0000408 *p = (unsigned char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000409 break;
410 }
411
Fred Drake230cae72000-05-09 21:50:00 +0000412 case 'h': /* signed short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000413 {
414 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 long ival = PyInt_AsLong(arg);
416 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000417 return "integer<h>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000418 else if (ival < SHRT_MIN) {
419 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000420 "signed short integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000421 return "integer<h>";
422 }
423 else if (ival > SHRT_MAX) {
424 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000425 "signed short integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000426 return "integer<h>";
427 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000428 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000429 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000430 break;
431 }
432
Jack Jansend50338f2000-07-06 12:22:00 +0000433 case 'H': /* unsigned short int */
434 {
435 unsigned short *p = va_arg(*p_va, unsigned short *);
436 long ival = PyInt_AsLong(arg);
437 if (ival == -1 && PyErr_Occurred())
438 return "integer<H>";
439 else if (ival < 0) {
440 PyErr_SetString(PyExc_OverflowError,
441 "unsigned short integer is less than minimum");
442 return "integer<H>";
443 }
444 else if (ival > USHRT_MAX) {
445 PyErr_SetString(PyExc_OverflowError,
446 "unsigned short integer is greater than maximum");
447 return "integer<H>";
448 }
449 else
450 *p = (unsigned short) ival;
451 break;
452 }
453
Fred Drake230cae72000-05-09 21:50:00 +0000454 case 'i': /* signed int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000455 {
456 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 long ival = PyInt_AsLong(arg);
458 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000459 return "integer<i>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000460 else if (ival > INT_MAX) {
461 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000462 "signed integer is greater than maximum");
463 return "integer<i>";
464 }
465 else if (ival < INT_MIN) {
466 PyErr_SetString(PyExc_OverflowError,
467 "signed integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000468 return "integer<i>";
469 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000470 else
471 *p = ival;
472 break;
473 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000474 case 'l': /* long int */
475 {
476 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000477 long ival = PyInt_AsLong(arg);
478 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000479 return "integer<l>";
480 else
481 *p = ival;
482 break;
483 }
484
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000485#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000486 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000487 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000488 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
489 LONG_LONG ival = PyLong_AsLongLong( arg );
490 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000491 return "long<L>";
492 } else {
493 *p = ival;
494 }
495 break;
496 }
497#endif
498
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000499 case 'f': /* float */
500 {
501 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000502 double dval = PyFloat_AsDouble(arg);
503 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000504 return "float<f>";
505 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000506 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000507 break;
508 }
509
510 case 'd': /* double */
511 {
512 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000513 double dval = PyFloat_AsDouble(arg);
514 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000515 return "float<d>";
516 else
517 *p = dval;
518 break;
519 }
520
Guido van Rossum530956d1996-07-21 02:27:43 +0000521#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000522 case 'D': /* complex double */
523 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000524 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000525 Py_complex cval;
526 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000527 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000528 return "complex<D>";
529 else
530 *p = cval;
531 break;
532 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000533#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000534
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000535 case 'c': /* char */
536 {
537 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 if (PyString_Check(arg) && PyString_Size(arg) == 1)
539 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000540 else
541 return "char";
542 break;
543 }
544
545 case 's': /* string */
546 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000547 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000548 void **p = (void **)va_arg(*p_va, char **);
549 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000550 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000551 int count;
552
553 if ( pb == NULL ||
554 pb->bf_getreadbuffer == NULL ||
555 pb->bf_getsegcount == NULL )
556 return "read-only buffer";
557 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
558 return "single-segment read-only buffer";
559 if ( (count =
560 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
561 return "(unspecified)";
562 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000563 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000564 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000565 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000566
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000567 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000568 *p = PyString_AS_STRING(arg);
569 else if (PyUnicode_Check(arg)) {
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000570 arg = _PyUnicode_AsDefaultEncodedString(
571 arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000572 if (arg == NULL)
573 return "unicode conversion error";
574 *p = PyString_AS_STRING(arg);
575 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000576 else
577 return "string";
578 if ((int)strlen(*p) != PyString_Size(arg))
579 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000580 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000581 break;
582 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000583
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000584 case 'z': /* string, may be NULL (None) */
585 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000586 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000587 void **p = (void **)va_arg(*p_va, char **);
588 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000589 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000590 int count;
591
592 if (arg == Py_None) {
593 *p = 0;
594 *q = 0;
595 } else {
596 if ( pb == NULL ||
597 pb->bf_getreadbuffer == NULL ||
598 pb->bf_getsegcount == NULL )
599 return "read-only buffer";
600 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
601 return "single-segment read-only buffer";
602 if ( (count = (*pb->bf_getreadbuffer)
603 (arg, 0, p)) < 0 )
604 return "(unspecified)";
605 *q = count;
606 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000607 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000608 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000609 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000610
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000611 if (arg == Py_None)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000612 *p = 0;
613 else if (PyString_Check(arg))
614 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000615 else if (PyUnicode_Check(arg)) {
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000616 arg = _PyUnicode_AsDefaultEncodedString(
617 arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000618 if (arg == NULL)
619 return "unicode conversion error";
620 *p = PyString_AS_STRING(arg);
621 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000622 else
623 return "None or string";
624 if (*format == '#') {
625 int *q = va_arg(*p_va, int *);
626 if (arg == Py_None)
627 *q = 0;
628 else
629 *q = PyString_Size(arg);
630 format++;
631 }
632 else if (*p != NULL &&
633 (int)strlen(*p) != PyString_Size(arg))
634 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000635 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000636 break;
637 }
638
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000639 case 'e': /* encoded string */
640 {
641 char **buffer;
642 const char *encoding;
643 PyObject *u, *s;
644 int size;
645
646 /* Get 'e' parameter: the encoding name */
647 encoding = (const char *)va_arg(*p_va, const char *);
648 if (encoding == NULL)
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000649 encoding = PyUnicode_GetDefaultEncoding();
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000650
651 /* Get 's' parameter: the output buffer to use */
652 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000653 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000654 buffer = (char **)va_arg(*p_va, char **);
655 format++;
656 if (buffer == NULL)
657 return "(buffer is NULL)";
658
659 /* Convert object to Unicode */
660 u = PyUnicode_FromObject(arg);
661 if (u == NULL)
662 return "string, unicode or text buffer";
663
664 /* Encode object; use default error handling */
665 s = PyUnicode_AsEncodedString(u,
666 encoding,
667 NULL);
668 Py_DECREF(u);
669 if (s == NULL)
670 return "(encoding failed)";
671 if (!PyString_Check(s)) {
672 Py_DECREF(s);
673 return "(encoder failed to return a string)";
674 }
675 size = PyString_GET_SIZE(s);
676
677 /* Write output; output is guaranteed to be
678 0-terminated */
679 if (*format == '#') {
680 /* Using buffer length parameter '#':
681
682 - if *buffer is NULL, a new buffer
683 of the needed size is allocated and
684 the data copied into it; *buffer is
685 updated to point to the new buffer;
686 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000687 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000688
689 - if *buffer is not NULL, the data
690 is copied to *buffer; *buffer_len
691 has to be set to the size of the
692 buffer on input; buffer overflow is
693 signalled with an error; buffer has
694 to provide enough room for the
695 encoded string plus the trailing
696 0-byte
697
698 - in both cases, *buffer_len is
699 updated to the size of the buffer
700 /excluding/ the trailing 0-byte
701
702 */
703 int *buffer_len = va_arg(*p_va, int *);
704
705 format++;
706 if (buffer_len == NULL)
707 return "(buffer_len is NULL)";
708 if (*buffer == NULL) {
709 *buffer = PyMem_NEW(char, size + 1);
710 if (*buffer == NULL) {
711 Py_DECREF(s);
712 return "(memory error)";
713 }
714 } else {
715 if (size + 1 > *buffer_len) {
716 Py_DECREF(s);
717 return "(buffer overflow)";
718 }
719 }
720 memcpy(*buffer,
721 PyString_AS_STRING(s),
722 size + 1);
723 *buffer_len = size;
724 } else {
725 /* Using a 0-terminated buffer:
726
727 - the encoded string has to be
728 0-terminated for this variant to
729 work; if it is not, an error raised
730
731 - a new buffer of the needed size
732 is allocated and the data copied
733 into it; *buffer is updated to
734 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000735 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000736 after usage
737
738 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000739 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000740 return "(encoded string without "\
741 "NULL bytes)";
742 *buffer = PyMem_NEW(char, size + 1);
743 if (*buffer == NULL) {
744 Py_DECREF(s);
745 return "(memory error)";
746 }
747 memcpy(*buffer,
748 PyString_AS_STRING(s),
749 size + 1);
750 }
751 Py_DECREF(s);
752 break;
753 }
754
Fred Drake25871c02000-05-03 15:17:02 +0000755 case 'u': /* raw unicode buffer (Py_UNICODE *) */
756 {
757 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000758 void **p = (void **)va_arg(*p_va, char **);
759 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Fred Drake25871c02000-05-03 15:17:02 +0000760 int *q = va_arg(*p_va, int *);
761 int count;
762
763 if ( pb == NULL ||
764 pb->bf_getreadbuffer == NULL ||
765 pb->bf_getsegcount == NULL )
766 return "read-only buffer";
767 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
768 return "single-segment read-only buffer";
769 if ( (count =
770 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
771 return "(unspecified)";
772 /* buffer interface returns bytes, we want
773 length in characters */
774 *q = count/(sizeof(Py_UNICODE));
775 format++;
776 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000777 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
Fred Drake25871c02000-05-03 15:17:02 +0000778
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000779 if (PyUnicode_Check(arg))
Fred Drake25871c02000-05-03 15:17:02 +0000780 *p = PyUnicode_AS_UNICODE(arg);
781 else
782 return "unicode";
783 }
784 break;
785 }
786
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000787 case 'S': /* string object */
788 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 PyObject **p = va_arg(*p_va, PyObject **);
790 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000791 *p = arg;
792 else
793 return "string";
794 break;
795 }
796
Guido van Rossume826ef02000-03-10 23:02:17 +0000797 case 'U': /* Unicode object */
798 {
799 PyObject **p = va_arg(*p_va, PyObject **);
800 if (PyUnicode_Check(arg))
801 *p = arg;
802 else
803 return "unicode";
804 break;
805 }
806
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000807 case 'O': /* object */
808 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 PyTypeObject *type;
810 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000811 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000813 p = va_arg(*p_va, PyObject **);
814 format++;
815 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000816 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000817 else
818 return type->tp_name;
819
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000820 }
821 else if (*format == '?') {
822 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000823 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000824 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000825 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000826 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000827 else
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000828 return "(unspecified)";
Guido van Rossumfccfe891998-05-15 22:04:07 +0000829
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000830 }
831 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +0000832 typedef int (*converter)(PyObject *, void *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000833 converter convert = va_arg(*p_va, converter);
834 void *addr = va_arg(*p_va, void *);
835 format++;
836 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000837 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000838 }
839 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000841 *p = arg;
842 }
843 break;
844 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000845
846
847 case 'w': /* memory buffer, read-write access */
848 {
849 void **p = va_arg(*p_va, void **);
850 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
851 int count;
852
853 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
854 pb->bf_getsegcount == NULL )
855 return "read-write buffer";
856 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
857 return "single-segment read-write buffer";
858 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
859 return "(unspecified)";
860 if (*format == '#') {
861 int *q = va_arg(*p_va, int *);
862
863 *q = count;
864 format++;
865 }
866 break;
867 }
868
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000869 case 't': /* 8-bit character buffer, read-only access */
870 {
871 const char **p = va_arg(*p_va, const char **);
872 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
873 int count;
874
875 if ( *format++ != '#' )
876 return "invalid use of 't' format character";
877 if ( !PyType_HasFeature(
878 arg->ob_type,
879 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
880 pb == NULL ||
881 pb->bf_getcharbuffer == NULL ||
882 pb->bf_getsegcount == NULL )
883 return "read-only character buffer";
884 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
885 return "single-segment read-only buffer";
886 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
887 return "(unspecified)";
888
889 *va_arg(*p_va, int *) = count;
890
891 break;
892 }
893
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000894
895 default:
896 return "impossible<bad format char>";
897
898 }
899
900 *p_format = format;
901 return NULL;
902}
Guido van Rossumaa354651996-08-19 19:32:04 +0000903
904
905/* Support for keyword arguments donated by
906 Geoff Philbrick <philbric@delphi.hks.com> */
907
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908int PyArg_ParseTupleAndKeywords(PyObject *args,
909 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000910 char *format,
911 char **kwlist, ...)
Guido van Rossumaa354651996-08-19 19:32:04 +0000912{
913 int retval;
914 va_list va;
Guido van Rossumaa354651996-08-19 19:32:04 +0000915
916 va_start(va, kwlist);
Guido van Rossumaa354651996-08-19 19:32:04 +0000917 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
918 va_end(va);
919 return retval;
920}
921
922
923static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000924vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
925 char **kwlist, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +0000926{
927 char msgbuf[256];
928 int levels[32];
929 char *fname = NULL;
930 char *message = NULL;
931 int min = -1;
932 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000933 char *formatsave = format;
934 int i, len, tplen, kwlen;
935 char *msg, *ks, **p;
936 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000938
939 /* nested tuples cannot be parsed when using keyword arguments */
940
941 for (;;) {
942 int c = *format++;
943 if (c == '(') {
944 PyErr_SetString(PyExc_SystemError,
945 "tuple found in format when using keyword arguments");
946 return 0;
947 }
948 else if (c == '\0')
949 break;
950 else if (c == ':') {
951 fname = format;
952 break;
953 }
954 else if (c == ';') {
955 message = format;
956 break;
957 }
958 else if (isalpha(c))
959 max++;
960 else if (c == '|')
961 min = max;
962 }
963
964 if (min < 0)
965 min = max;
966
967 format = formatsave;
968
969 if (!PyTuple_Check(args)) {
970 PyErr_SetString(PyExc_SystemError,
971 "new style getargs format but argument is not a tuple");
972 return 0;
973 }
974
975 tplen = PyTuple_Size(args);
976
977 /* do a cursory check of the keywords just to see how many we got */
978
979 if (keywords) {
980 if (!PyDict_Check(keywords)) {
981 PyErr_SetString(PyExc_SystemError,
982 "non-dictionary object received when keyword dictionary expected");
983 return 0;
984 }
985 kwlen = PyDict_Size(keywords);
986 }
987 else {
988 kwlen = 0;
989 }
990
991 /* make sure there are no duplicate values for an argument;
992 its not clear when to use the term "keyword argument vs.
993 keyword parameter in messages */
994
995 if (keywords) {
996 for (i = 0; i < tplen; i++) {
997 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
998 sprintf(msgbuf,
999 "keyword parameter %s redefined",
1000 kwlist[i]);
1001 PyErr_SetString(PyExc_TypeError, msgbuf);
1002 return 0;
1003 }
1004 }
1005 }
1006 PyErr_Clear(); /* I'm not which Py functions set the error string */
1007
1008 /* required arguments missing from args can be supplied by keyword
1009 arguments */
1010
1011 len = tplen;
1012 if (keywords && tplen < min) {
1013 for (i = tplen; i < min; i++) {
1014 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1015 len++;
1016 }
1017 }
1018 }
1019 PyErr_Clear();
1020
1021 /* make sure we got an acceptable number of arguments; the message
1022 is a little confusing with keywords since keyword arguments
1023 which are supplied, but don't match the required arguments
1024 are not included in the "%d given" part of the message */
1025
1026 if (len < min || max < len) {
1027 if (message == NULL) {
1028 sprintf(msgbuf,
1029 "%s requires %s %d argument%s; %d given",
1030 fname==NULL ? "function" : fname,
1031 min==max ? "exactly"
1032 : len < min ? "at least" : "at most",
1033 len < min ? min : max,
1034 (len < min ? min : max) == 1 ? "" : "s",
1035 len);
1036 message = msgbuf;
1037 }
1038 PyErr_SetString(PyExc_TypeError, message);
1039 return 0;
1040 }
1041
1042 for (i = 0; i < tplen; i++) {
1043 if (*format == '|')
1044 format++;
1045 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1046 levels, msgbuf);
1047 if (msg) {
1048 seterror(i+1, msg, levels, fname, message);
1049 return 0;
1050 }
1051 }
1052
1053 /* handle no keyword parameters in call */
1054
1055 if (!keywords) return 1;
1056
1057 /* make sure the number of keywords in the keyword list matches the
1058 number of items in the format string */
1059
1060 nkwds = 0;
1061 p = kwlist;
1062 for (;;) {
1063 if (!*(p++)) break;
1064 nkwds++;
1065 }
1066
1067 if (nkwds != max) {
1068 PyErr_SetString(PyExc_SystemError,
1069 "number of items in format string and keyword list do not match");
1070 return 0;
1071 }
1072
1073 /* convert the keyword arguments; this uses the format
1074 string where it was left after processing args */
1075
1076 converted = 0;
1077 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001078 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001079 if (*format == '|')
1080 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001081 item = PyMapping_GetItemString(keywords, kwlist[i]);
1082 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001083 msg = convertitem(item, &format, p_va, levels, msgbuf);
1084 if (msg) {
1085 seterror(i+1, msg, levels, fname, message);
1086 return 0;
1087 }
1088 converted++;
1089 }
1090 else {
1091 PyErr_Clear();
1092 msg = skipitem(&format, p_va);
1093 if (msg) {
1094 seterror(i+1, msg, levels, fname, message);
1095 return 0;
1096 }
1097 }
1098 }
1099
1100 /* make sure there are no extraneous keyword arguments */
1101
1102 pos = 0;
1103 if (converted < kwlen) {
1104 while (PyDict_Next(keywords, &pos, &key, &value)) {
1105 match = 0;
1106 ks = PyString_AsString(key);
1107 for (i = 0; i < nkwds; i++) {
1108 if (!strcmp(ks, kwlist[i])) {
1109 match = 1;
1110 break;
1111 }
1112 }
1113 if (!match) {
1114 sprintf(msgbuf,
Guido van Rossum80dc16b2000-05-08 14:02:41 +00001115 "%s is an invalid keyword argument for this function",
Guido van Rossumaa354651996-08-19 19:32:04 +00001116 ks);
1117 PyErr_SetString(PyExc_TypeError, msgbuf);
1118 return 0;
1119 }
1120 }
1121 }
1122
1123 return 1;
1124}
1125
1126
1127static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001128skipitem(char **p_format, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +00001129{
1130 char *format = *p_format;
1131 char c = *format++;
1132
1133 switch (c) {
1134
1135 case 'b': /* byte -- very short int */
1136 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001137 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001138 break;
1139 }
1140
1141 case 'h': /* short int */
1142 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001143 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001144 break;
1145 }
1146
Jack Jansend50338f2000-07-06 12:22:00 +00001147 case 'H': /* unsigned short int */
1148 {
1149 (void) va_arg(*p_va, unsigned short *);
1150 break;
1151 }
1152
Guido van Rossumaa354651996-08-19 19:32:04 +00001153 case 'i': /* int */
1154 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001155 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001156 break;
1157 }
1158
1159 case 'l': /* long int */
1160 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001161 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001162 break;
1163 }
1164
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001165#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001166 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001167 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001168 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001169 break;
1170 }
1171#endif
1172
Guido van Rossumaa354651996-08-19 19:32:04 +00001173 case 'f': /* float */
1174 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001175 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001176 break;
1177 }
1178
1179 case 'd': /* double */
1180 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001181 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001182 break;
1183 }
1184
1185#ifndef WITHOUT_COMPLEX
1186 case 'D': /* complex double */
1187 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001188 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001189 break;
1190 }
1191#endif /* WITHOUT_COMPLEX */
1192
1193 case 'c': /* char */
1194 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001195 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001196 break;
1197 }
1198
1199 case 's': /* string */
1200 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001201 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001202 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001203 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001204 format++;
1205 }
1206 break;
1207 }
1208
1209 case 'z': /* string */
1210 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001211 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001212 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001213 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001214 format++;
1215 }
1216 break;
1217 }
1218
1219 case 'S': /* string object */
1220 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001221 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001222 break;
1223 }
1224
1225 case 'O': /* object */
1226 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001227 if (*format == '!') {
1228 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001229 (void) va_arg(*p_va, PyTypeObject*);
1230 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001231 }
1232#if 0
1233/* I don't know what this is for */
1234 else if (*format == '?') {
1235 inquiry pred = va_arg(*p_va, inquiry);
1236 format++;
1237 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001238 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001239 }
1240 }
1241#endif
1242 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +00001243 typedef int (*converter)(PyObject *, void *);
Guido van Rossum80bb9651996-12-05 23:27:02 +00001244 (void) va_arg(*p_va, converter);
1245 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001246 format++;
1247 }
1248 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001249 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001250 }
1251 break;
1252 }
1253
1254 default:
1255 return "impossible<bad format char>";
1256
1257 }
1258
1259 *p_format = format;
1260 return NULL;
1261}