blob: f1835ba6e2ad8e7d54c2480902bec6ee70acb1ab [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
375PyObject *_PyUnicode_AsUTF8String(PyObject *unicode,
376 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)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000570 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000571 if (arg == NULL)
572 return "unicode conversion error";
573 *p = PyString_AS_STRING(arg);
574 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000575 else
576 return "string";
577 if ((int)strlen(*p) != PyString_Size(arg))
578 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000579 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000580 break;
581 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000582
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000583 case 'z': /* string, may be NULL (None) */
584 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000585 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000586 void **p = (void **)va_arg(*p_va, char **);
587 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000588 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000589 int count;
590
591 if (arg == Py_None) {
592 *p = 0;
593 *q = 0;
594 } else {
595 if ( pb == NULL ||
596 pb->bf_getreadbuffer == NULL ||
597 pb->bf_getsegcount == NULL )
598 return "read-only buffer";
599 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
600 return "single-segment read-only buffer";
601 if ( (count = (*pb->bf_getreadbuffer)
602 (arg, 0, p)) < 0 )
603 return "(unspecified)";
604 *q = count;
605 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000606 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000607 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000608 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000609
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000610 if (arg == Py_None)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000611 *p = 0;
612 else if (PyString_Check(arg))
613 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000614 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000615 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000616 if (arg == NULL)
617 return "unicode conversion error";
618 *p = PyString_AS_STRING(arg);
619 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000620 else
621 return "None or string";
622 if (*format == '#') {
623 int *q = va_arg(*p_va, int *);
624 if (arg == Py_None)
625 *q = 0;
626 else
627 *q = PyString_Size(arg);
628 format++;
629 }
630 else if (*p != NULL &&
631 (int)strlen(*p) != PyString_Size(arg))
632 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000633 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000634 break;
635 }
636
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000637 case 'e': /* encoded string */
638 {
639 char **buffer;
640 const char *encoding;
641 PyObject *u, *s;
642 int size;
643
644 /* Get 'e' parameter: the encoding name */
645 encoding = (const char *)va_arg(*p_va, const char *);
646 if (encoding == NULL)
647 return "(encoding is NULL)";
648
649 /* Get 's' parameter: the output buffer to use */
650 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000651 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000652 buffer = (char **)va_arg(*p_va, char **);
653 format++;
654 if (buffer == NULL)
655 return "(buffer is NULL)";
656
657 /* Convert object to Unicode */
658 u = PyUnicode_FromObject(arg);
659 if (u == NULL)
660 return "string, unicode or text buffer";
661
662 /* Encode object; use default error handling */
663 s = PyUnicode_AsEncodedString(u,
664 encoding,
665 NULL);
666 Py_DECREF(u);
667 if (s == NULL)
668 return "(encoding failed)";
669 if (!PyString_Check(s)) {
670 Py_DECREF(s);
671 return "(encoder failed to return a string)";
672 }
673 size = PyString_GET_SIZE(s);
674
675 /* Write output; output is guaranteed to be
676 0-terminated */
677 if (*format == '#') {
678 /* Using buffer length parameter '#':
679
680 - if *buffer is NULL, a new buffer
681 of the needed size is allocated and
682 the data copied into it; *buffer is
683 updated to point to the new buffer;
684 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000685 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000686
687 - if *buffer is not NULL, the data
688 is copied to *buffer; *buffer_len
689 has to be set to the size of the
690 buffer on input; buffer overflow is
691 signalled with an error; buffer has
692 to provide enough room for the
693 encoded string plus the trailing
694 0-byte
695
696 - in both cases, *buffer_len is
697 updated to the size of the buffer
698 /excluding/ the trailing 0-byte
699
700 */
701 int *buffer_len = va_arg(*p_va, int *);
702
703 format++;
704 if (buffer_len == NULL)
705 return "(buffer_len is NULL)";
706 if (*buffer == NULL) {
707 *buffer = PyMem_NEW(char, size + 1);
708 if (*buffer == NULL) {
709 Py_DECREF(s);
710 return "(memory error)";
711 }
712 } else {
713 if (size + 1 > *buffer_len) {
714 Py_DECREF(s);
715 return "(buffer overflow)";
716 }
717 }
718 memcpy(*buffer,
719 PyString_AS_STRING(s),
720 size + 1);
721 *buffer_len = size;
722 } else {
723 /* Using a 0-terminated buffer:
724
725 - the encoded string has to be
726 0-terminated for this variant to
727 work; if it is not, an error raised
728
729 - a new buffer of the needed size
730 is allocated and the data copied
731 into it; *buffer is updated to
732 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000733 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000734 after usage
735
736 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000737 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000738 return "(encoded string without "\
739 "NULL bytes)";
740 *buffer = PyMem_NEW(char, size + 1);
741 if (*buffer == NULL) {
742 Py_DECREF(s);
743 return "(memory error)";
744 }
745 memcpy(*buffer,
746 PyString_AS_STRING(s),
747 size + 1);
748 }
749 Py_DECREF(s);
750 break;
751 }
752
Fred Drake25871c02000-05-03 15:17:02 +0000753 case 'u': /* raw unicode buffer (Py_UNICODE *) */
754 {
755 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000756 void **p = (void **)va_arg(*p_va, char **);
757 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Fred Drake25871c02000-05-03 15:17:02 +0000758 int *q = va_arg(*p_va, int *);
759 int count;
760
761 if ( pb == NULL ||
762 pb->bf_getreadbuffer == NULL ||
763 pb->bf_getsegcount == NULL )
764 return "read-only buffer";
765 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
766 return "single-segment read-only buffer";
767 if ( (count =
768 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
769 return "(unspecified)";
770 /* buffer interface returns bytes, we want
771 length in characters */
772 *q = count/(sizeof(Py_UNICODE));
773 format++;
774 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000775 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
Fred Drake25871c02000-05-03 15:17:02 +0000776
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000777 if (PyUnicode_Check(arg))
Fred Drake25871c02000-05-03 15:17:02 +0000778 *p = PyUnicode_AS_UNICODE(arg);
779 else
780 return "unicode";
781 }
782 break;
783 }
784
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000785 case 'S': /* string object */
786 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 PyObject **p = va_arg(*p_va, PyObject **);
788 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000789 *p = arg;
790 else
791 return "string";
792 break;
793 }
794
Guido van Rossume826ef02000-03-10 23:02:17 +0000795 case 'U': /* Unicode object */
796 {
797 PyObject **p = va_arg(*p_va, PyObject **);
798 if (PyUnicode_Check(arg))
799 *p = arg;
800 else
801 return "unicode";
802 break;
803 }
804
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000805 case 'O': /* object */
806 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 PyTypeObject *type;
808 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000809 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000811 p = va_arg(*p_va, PyObject **);
812 format++;
813 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000814 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000815 else
816 return type->tp_name;
817
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000818 }
819 else if (*format == '?') {
820 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000821 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000822 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000823 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000824 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000825 else
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000826 return "(unspecified)";
Guido van Rossumfccfe891998-05-15 22:04:07 +0000827
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000828 }
829 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +0000830 typedef int (*converter)(PyObject *, void *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000831 converter convert = va_arg(*p_va, converter);
832 void *addr = va_arg(*p_va, void *);
833 format++;
834 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000835 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000836 }
837 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000839 *p = arg;
840 }
841 break;
842 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000843
844
845 case 'w': /* memory buffer, read-write access */
846 {
847 void **p = va_arg(*p_va, void **);
848 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
849 int count;
850
851 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
852 pb->bf_getsegcount == NULL )
853 return "read-write buffer";
854 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
855 return "single-segment read-write buffer";
856 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
857 return "(unspecified)";
858 if (*format == '#') {
859 int *q = va_arg(*p_va, int *);
860
861 *q = count;
862 format++;
863 }
864 break;
865 }
866
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000867 case 't': /* 8-bit character buffer, read-only access */
868 {
869 const char **p = va_arg(*p_va, const char **);
870 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
871 int count;
872
873 if ( *format++ != '#' )
874 return "invalid use of 't' format character";
875 if ( !PyType_HasFeature(
876 arg->ob_type,
877 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
878 pb == NULL ||
879 pb->bf_getcharbuffer == NULL ||
880 pb->bf_getsegcount == NULL )
881 return "read-only character buffer";
882 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
883 return "single-segment read-only buffer";
884 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
885 return "(unspecified)";
886
887 *va_arg(*p_va, int *) = count;
888
889 break;
890 }
891
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000892
893 default:
894 return "impossible<bad format char>";
895
896 }
897
898 *p_format = format;
899 return NULL;
900}
Guido van Rossumaa354651996-08-19 19:32:04 +0000901
902
903/* Support for keyword arguments donated by
904 Geoff Philbrick <philbric@delphi.hks.com> */
905
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906int PyArg_ParseTupleAndKeywords(PyObject *args,
907 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000908 char *format,
909 char **kwlist, ...)
Guido van Rossumaa354651996-08-19 19:32:04 +0000910{
911 int retval;
912 va_list va;
Guido van Rossumaa354651996-08-19 19:32:04 +0000913
914 va_start(va, kwlist);
Guido van Rossumaa354651996-08-19 19:32:04 +0000915 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
916 va_end(va);
917 return retval;
918}
919
920
921static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000922vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
923 char **kwlist, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +0000924{
925 char msgbuf[256];
926 int levels[32];
927 char *fname = NULL;
928 char *message = NULL;
929 int min = -1;
930 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000931 char *formatsave = format;
932 int i, len, tplen, kwlen;
933 char *msg, *ks, **p;
934 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000936
937 /* nested tuples cannot be parsed when using keyword arguments */
938
939 for (;;) {
940 int c = *format++;
941 if (c == '(') {
942 PyErr_SetString(PyExc_SystemError,
943 "tuple found in format when using keyword arguments");
944 return 0;
945 }
946 else if (c == '\0')
947 break;
948 else if (c == ':') {
949 fname = format;
950 break;
951 }
952 else if (c == ';') {
953 message = format;
954 break;
955 }
956 else if (isalpha(c))
957 max++;
958 else if (c == '|')
959 min = max;
960 }
961
962 if (min < 0)
963 min = max;
964
965 format = formatsave;
966
967 if (!PyTuple_Check(args)) {
968 PyErr_SetString(PyExc_SystemError,
969 "new style getargs format but argument is not a tuple");
970 return 0;
971 }
972
973 tplen = PyTuple_Size(args);
974
975 /* do a cursory check of the keywords just to see how many we got */
976
977 if (keywords) {
978 if (!PyDict_Check(keywords)) {
979 PyErr_SetString(PyExc_SystemError,
980 "non-dictionary object received when keyword dictionary expected");
981 return 0;
982 }
983 kwlen = PyDict_Size(keywords);
984 }
985 else {
986 kwlen = 0;
987 }
988
989 /* make sure there are no duplicate values for an argument;
990 its not clear when to use the term "keyword argument vs.
991 keyword parameter in messages */
992
993 if (keywords) {
994 for (i = 0; i < tplen; i++) {
995 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
996 sprintf(msgbuf,
997 "keyword parameter %s redefined",
998 kwlist[i]);
999 PyErr_SetString(PyExc_TypeError, msgbuf);
1000 return 0;
1001 }
1002 }
1003 }
1004 PyErr_Clear(); /* I'm not which Py functions set the error string */
1005
1006 /* required arguments missing from args can be supplied by keyword
1007 arguments */
1008
1009 len = tplen;
1010 if (keywords && tplen < min) {
1011 for (i = tplen; i < min; i++) {
1012 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1013 len++;
1014 }
1015 }
1016 }
1017 PyErr_Clear();
1018
1019 /* make sure we got an acceptable number of arguments; the message
1020 is a little confusing with keywords since keyword arguments
1021 which are supplied, but don't match the required arguments
1022 are not included in the "%d given" part of the message */
1023
1024 if (len < min || max < len) {
1025 if (message == NULL) {
1026 sprintf(msgbuf,
1027 "%s requires %s %d argument%s; %d given",
1028 fname==NULL ? "function" : fname,
1029 min==max ? "exactly"
1030 : len < min ? "at least" : "at most",
1031 len < min ? min : max,
1032 (len < min ? min : max) == 1 ? "" : "s",
1033 len);
1034 message = msgbuf;
1035 }
1036 PyErr_SetString(PyExc_TypeError, message);
1037 return 0;
1038 }
1039
1040 for (i = 0; i < tplen; i++) {
1041 if (*format == '|')
1042 format++;
1043 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1044 levels, msgbuf);
1045 if (msg) {
1046 seterror(i+1, msg, levels, fname, message);
1047 return 0;
1048 }
1049 }
1050
1051 /* handle no keyword parameters in call */
1052
1053 if (!keywords) return 1;
1054
1055 /* make sure the number of keywords in the keyword list matches the
1056 number of items in the format string */
1057
1058 nkwds = 0;
1059 p = kwlist;
1060 for (;;) {
1061 if (!*(p++)) break;
1062 nkwds++;
1063 }
1064
1065 if (nkwds != max) {
1066 PyErr_SetString(PyExc_SystemError,
1067 "number of items in format string and keyword list do not match");
1068 return 0;
1069 }
1070
1071 /* convert the keyword arguments; this uses the format
1072 string where it was left after processing args */
1073
1074 converted = 0;
1075 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001076 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001077 if (*format == '|')
1078 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001079 item = PyMapping_GetItemString(keywords, kwlist[i]);
1080 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001081 msg = convertitem(item, &format, p_va, levels, msgbuf);
1082 if (msg) {
1083 seterror(i+1, msg, levels, fname, message);
1084 return 0;
1085 }
1086 converted++;
1087 }
1088 else {
1089 PyErr_Clear();
1090 msg = skipitem(&format, p_va);
1091 if (msg) {
1092 seterror(i+1, msg, levels, fname, message);
1093 return 0;
1094 }
1095 }
1096 }
1097
1098 /* make sure there are no extraneous keyword arguments */
1099
1100 pos = 0;
1101 if (converted < kwlen) {
1102 while (PyDict_Next(keywords, &pos, &key, &value)) {
1103 match = 0;
1104 ks = PyString_AsString(key);
1105 for (i = 0; i < nkwds; i++) {
1106 if (!strcmp(ks, kwlist[i])) {
1107 match = 1;
1108 break;
1109 }
1110 }
1111 if (!match) {
1112 sprintf(msgbuf,
Guido van Rossum80dc16b2000-05-08 14:02:41 +00001113 "%s is an invalid keyword argument for this function",
Guido van Rossumaa354651996-08-19 19:32:04 +00001114 ks);
1115 PyErr_SetString(PyExc_TypeError, msgbuf);
1116 return 0;
1117 }
1118 }
1119 }
1120
1121 return 1;
1122}
1123
1124
1125static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001126skipitem(char **p_format, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +00001127{
1128 char *format = *p_format;
1129 char c = *format++;
1130
1131 switch (c) {
1132
1133 case 'b': /* byte -- very short int */
1134 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001135 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001136 break;
1137 }
1138
1139 case 'h': /* short int */
1140 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001141 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001142 break;
1143 }
1144
Jack Jansend50338f2000-07-06 12:22:00 +00001145 case 'H': /* unsigned short int */
1146 {
1147 (void) va_arg(*p_va, unsigned short *);
1148 break;
1149 }
1150
Guido van Rossumaa354651996-08-19 19:32:04 +00001151 case 'i': /* int */
1152 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001153 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001154 break;
1155 }
1156
1157 case 'l': /* long int */
1158 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001159 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001160 break;
1161 }
1162
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001163#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001164 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001165 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001166 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001167 break;
1168 }
1169#endif
1170
Guido van Rossumaa354651996-08-19 19:32:04 +00001171 case 'f': /* float */
1172 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001173 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001174 break;
1175 }
1176
1177 case 'd': /* double */
1178 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001179 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001180 break;
1181 }
1182
1183#ifndef WITHOUT_COMPLEX
1184 case 'D': /* complex double */
1185 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001186 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001187 break;
1188 }
1189#endif /* WITHOUT_COMPLEX */
1190
1191 case 'c': /* char */
1192 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001193 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001194 break;
1195 }
1196
1197 case 's': /* string */
1198 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001199 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001200 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001201 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001202 format++;
1203 }
1204 break;
1205 }
1206
1207 case 'z': /* string */
1208 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001209 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001210 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001211 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001212 format++;
1213 }
1214 break;
1215 }
1216
1217 case 'S': /* string object */
1218 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001220 break;
1221 }
1222
1223 case 'O': /* object */
1224 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001225 if (*format == '!') {
1226 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227 (void) va_arg(*p_va, PyTypeObject*);
1228 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001229 }
1230#if 0
1231/* I don't know what this is for */
1232 else if (*format == '?') {
1233 inquiry pred = va_arg(*p_va, inquiry);
1234 format++;
1235 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001237 }
1238 }
1239#endif
1240 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +00001241 typedef int (*converter)(PyObject *, void *);
Guido van Rossum80bb9651996-12-05 23:27:02 +00001242 (void) va_arg(*p_va, converter);
1243 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001244 format++;
1245 }
1246 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001248 }
1249 break;
1250 }
1251
1252 default:
1253 return "impossible<bad format char>";
1254
1255 }
1256
1257 *p_format = format;
1258 return NULL;
1259}