blob: 0579aff14dadc10c643328b65ff8a1948fa6a63f [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000029
30******************************************************************/
31
32/* New getargs implementation */
33
34/* XXX There are several unchecked sprintf or strcat calls in this file.
35 XXX The only way these can become a danger is if some C code in the
36 XXX Python source (or in an extension) uses ridiculously long names
37 XXX or riduculously deep nesting in format strings. */
38
Guido van Rossum79f25d91997-04-29 20:08:16 +000039#include "Python.h"
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000040
Guido van Rossumc1d50531996-08-21 23:38:24 +000041#include <ctype.h>
42
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000043
Guido van Rossum79f25d91997-04-29 20:08:16 +000044int PyArg_Parse Py_PROTO((PyObject *, char *, ...));
45int PyArg_ParseTuple Py_PROTO((PyObject *, char *, ...));
Guido van Rossum13454c31997-05-05 21:57:29 +000046int PyArg_VaParse Py_PROTO((PyObject *, char *, va_list));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000047
Guido van Rossum79f25d91997-04-29 20:08:16 +000048int PyArg_ParseTupleAndKeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000049 char *, char **, ...));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000050
51/* Forward */
Guido van Rossum79f25d91997-04-29 20:08:16 +000052static int vgetargs1 Py_PROTO((PyObject *, char *, va_list *, int));
53static void seterror Py_PROTO((int, char *, int *, char *, char *));
54static char *convertitem Py_PROTO((PyObject *, char **, va_list *,
55 int *, char *));
56static char *converttuple Py_PROTO((PyObject *, char **, va_list *,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000057 int *, char *, int));
Guido van Rossum79f25d91997-04-29 20:08:16 +000058static char *convertsimple Py_PROTO((PyObject *, char **, va_list *, char *));
59static char *convertsimple1 Py_PROTO((PyObject *, char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000060
Guido van Rossum79f25d91997-04-29 20:08:16 +000061static int vgetargskeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000062 char *, char **, va_list *));
Guido van Rossum79f25d91997-04-29 20:08:16 +000063static char *skipitem Py_PROTO((char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000064
65#ifdef HAVE_STDARG_PROTOTYPES
66/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000067int PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000068#else
69/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000070int PyArg_Parse(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000071#endif
72{
73 int retval;
74 va_list va;
75#ifdef HAVE_STDARG_PROTOTYPES
76
77 va_start(va, format);
78#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000079 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000080 char *format;
81
82 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +000083 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000084 format = va_arg(va, char *);
85#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000086 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000087 va_end(va);
88 return retval;
89}
90
91
92#ifdef HAVE_STDARG_PROTOTYPES
93/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000094int PyArg_ParseTuple(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000095#else
96/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000097int PyArg_ParseTuple(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000098#endif
99{
100 int retval;
101 va_list va;
102#ifdef HAVE_STDARG_PROTOTYPES
103
104 va_start(va, format);
105#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000107 char *format;
108
109 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000110 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000111 format = va_arg(va, char *);
112#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000113 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000114 va_end(va);
115 return retval;
116}
117
118
119int
Guido van Rossum13454c31997-05-05 21:57:29 +0000120PyArg_VaParse(args, format, va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000121 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000122 char *format;
123 va_list va;
124{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000125 va_list lva;
126
127#ifdef VA_LIST_IS_ARRAY
128 memcpy(lva, va, sizeof(va_list));
129#else
130 lva = va;
131#endif
132
133 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000134}
135
136
137static int
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000138vgetargs1(args, format, p_va, compat)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000139 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000140 char *format;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000141 va_list *p_va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000142 int compat;
143{
144 char msgbuf[256];
145 int levels[32];
146 char *fname = NULL;
147 char *message = NULL;
148 int min = -1;
149 int max = 0;
150 int level = 0;
151 char *formatsave = format;
152 int i, len;
153 char *msg;
154
155 for (;;) {
156 int c = *format++;
157 if (c == '(' /* ')' */) {
158 if (level == 0)
159 max++;
160 level++;
161 }
162 else if (/* '(' */ c == ')') {
163 if (level == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000164 Py_FatalError(/* '(' */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000165 "excess ')' in getargs format");
166 else
167 level--;
168 }
169 else if (c == '\0')
170 break;
171 else if (c == ':') {
172 fname = format;
173 break;
174 }
175 else if (c == ';') {
176 message = format;
177 break;
178 }
179 else if (level != 0)
180 ; /* Pass */
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000181 else if (c == 'e')
182 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000183 else if (isalpha(c))
184 max++;
185 else if (c == '|')
186 min = max;
187 }
188
189 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000191
192 if (min < 0)
193 min = max;
194
195 format = formatsave;
196
197 if (compat) {
198 if (max == 0) {
199 if (args == NULL)
200 return 1;
201 sprintf(msgbuf, "%s requires no arguments",
202 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000204 return 0;
205 }
206 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000207 if (args == NULL) {
208 sprintf(msgbuf,
209 "%s requires at least one argument",
210 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000212 return 0;
213 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000214 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000215 if (msg == NULL)
216 return 1;
217 seterror(levels[0], msg, levels+1, fname, message);
218 return 0;
219 }
220 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000221 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000222 "old style getargs format uses new features");
223 return 0;
224 }
225 }
226
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 if (!PyTuple_Check(args)) {
228 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000229 "new style getargs format but argument is not a tuple");
230 return 0;
231 }
232
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000234
235 if (len < min || max < len) {
236 if (message == NULL) {
237 sprintf(msgbuf,
238 "%s requires %s %d argument%s; %d given",
239 fname==NULL ? "function" : fname,
240 min==max ? "exactly"
241 : len < min ? "at least" : "at most",
242 len < min ? min : max,
243 (len < min ? min : max) == 1 ? "" : "s",
244 len);
245 message = msgbuf;
246 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000248 return 0;
249 }
250
251 for (i = 0; i < len; i++) {
252 if (*format == '|')
253 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000255 levels, msgbuf);
256 if (msg) {
257 seterror(i+1, msg, levels, fname, message);
258 return 0;
259 }
260 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000261
Guido van Rossum730806d1998-04-10 22:27:42 +0000262 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000263 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000264 *format != '|' && *format != ':' && *format != ';') {
265 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000266 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000267 return 0;
268 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000269
270 return 1;
271}
272
273
274
275static void
276seterror(iarg, msg, levels, fname, message)
277 int iarg;
278 char *msg;
279 int *levels;
280 char *fname;
281 char *message;
282{
283 char buf[256];
284 int i;
285 char *p = buf;
286
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000288 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000289 if (iarg == 0 && message == NULL)
290 message = msg;
291 else if (message == NULL) {
292 if (fname != NULL) {
293 sprintf(p, "%s, ", fname);
294 p += strlen(p);
295 }
296 sprintf(p, "argument %d", iarg);
297 i = 0;
298 p += strlen(p);
299 while (levels[i] > 0) {
300 sprintf(p, ", item %d", levels[i]-1);
301 p += strlen(p);
302 i++;
303 }
304 sprintf(p, ": expected %s found", msg);
305 message = buf;
306 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000308}
309
310
311/* Convert a tuple argument.
312 On entry, *p_format points to the character _after_ the opening '('.
313 On successful exit, *p_format points to the closing ')'.
314 If successful:
315 *p_format and *p_va are updated,
316 *levels and *msgbuf are untouched,
317 and NULL is returned.
318 If the argument is invalid:
319 *p_format is unchanged,
320 *p_va is undefined,
321 *levels is a 0-terminated list of item numbers,
322 *msgbuf contains an error message, whose format is:
323 "<typename1>, <typename2>", where:
324 <typename1> is the name of the expected type, and
325 <typename2> is the name of the actual type,
326 (so you can surround it by "expected ... found"),
327 and msgbuf is returned.
328*/
329
330static char *
331converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000332 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000333 char **p_format;
334 va_list *p_va;
335 int *levels;
336 char *msgbuf;
337 int toplevel;
338{
339 int level = 0;
340 int n = 0;
341 char *format = *p_format;
342 int i;
343
344 for (;;) {
345 int c = *format++;
346 if (c == '(') {
347 if (level == 0)
348 n++;
349 level++;
350 }
351 else if (c == ')') {
352 if (level == 0)
353 break;
354 level--;
355 }
356 else if (c == ':' || c == ';' || c == '\0')
357 break;
358 else if (level == 0 && isalpha(c))
359 n++;
360 }
361
Guido van Rossum66368cc1999-02-17 23:16:43 +0000362 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000363 levels[0] = 0;
364 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000365 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000367 return msgbuf;
368 }
369
Guido van Rossum66368cc1999-02-17 23:16:43 +0000370 if ((i = PySequence_Length(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000371 levels[0] = 0;
372 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000373 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
374 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000375 return msgbuf;
376 }
377
378 format = *p_format;
379 for (i = 0; i < n; i++) {
380 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000381 PyObject *item;
382 item = PySequence_GetItem(arg, i);
383 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
384 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
385 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000386 if (msg != NULL) {
387 levels[0] = i+1;
388 return msg;
389 }
390 }
391
392 *p_format = format;
393 return NULL;
394}
395
396
397/* Convert a single item. */
398
399static char *
400convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000402 char **p_format;
403 va_list *p_va;
404 int *levels;
405 char *msgbuf;
406{
407 char *msg;
408 char *format = *p_format;
409
410 if (*format == '(' /* ')' */) {
411 format++;
412 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
413 if (msg == NULL)
414 format++;
415 }
416 else {
417 msg = convertsimple(arg, &format, p_va, msgbuf);
418 if (msg != NULL)
419 levels[0] = 0;
420 }
421 if (msg == NULL)
422 *p_format = format;
423 return msg;
424}
425
426
427/* Convert a non-tuple argument. Adds to convertsimple1 functionality
428 by appending ", <actual argument type>" to error message. */
429
430static char *
431convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000433 char **p_format;
434 va_list *p_va;
435 char *msgbuf;
436{
437 char *msg = convertsimple1(arg, p_format, p_va);
438 if (msg != NULL) {
439 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000441 msg = msgbuf;
442 }
443 return msg;
444}
445
446
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000447/* Internal API needed by convertsimple1(): */
448extern
449PyObject *_PyUnicode_AsUTF8String(PyObject *unicode,
450 const char *errors);
451
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000452/* Convert a non-tuple argument. Return NULL if conversion went OK,
453 or a string representing the expected type if the conversion failed.
454 When failing, an exception may or may not have been raised.
455 Don't call if a tuple is expected. */
456
457static char *
458convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000460 char **p_format;
461 va_list *p_va;
462{
463 char *format = *p_format;
464 char c = *format++;
465
466 switch (c) {
467
468 case 'b': /* byte -- very short int */
469 {
470 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 long ival = PyInt_AsLong(arg);
472 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000473 return "integer<b>";
474 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000475 *p = (char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000476 break;
477 }
478
479 case 'h': /* short int */
480 {
481 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482 long ival = PyInt_AsLong(arg);
483 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000484 return "integer<h>";
485 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000486 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000487 break;
488 }
489
490 case 'i': /* int */
491 {
492 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 long ival = PyInt_AsLong(arg);
494 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000495 return "integer<i>";
496 else
497 *p = ival;
498 break;
499 }
500
501 case 'l': /* long int */
502 {
503 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504 long ival = PyInt_AsLong(arg);
505 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000506 return "integer<l>";
507 else
508 *p = ival;
509 break;
510 }
511
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000512#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000513 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000514 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000515 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
516 LONG_LONG ival = PyLong_AsLongLong( arg );
517 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000518 return "long<L>";
519 } else {
520 *p = ival;
521 }
522 break;
523 }
524#endif
525
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000526 case 'f': /* float */
527 {
528 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 double dval = PyFloat_AsDouble(arg);
530 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000531 return "float<f>";
532 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000533 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000534 break;
535 }
536
537 case 'd': /* double */
538 {
539 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 double dval = PyFloat_AsDouble(arg);
541 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000542 return "float<d>";
543 else
544 *p = dval;
545 break;
546 }
547
Guido van Rossum530956d1996-07-21 02:27:43 +0000548#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000549 case 'D': /* complex double */
550 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000551 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000552 Py_complex cval;
553 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000555 return "complex<D>";
556 else
557 *p = cval;
558 break;
559 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000560#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000561
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000562 case 'c': /* char */
563 {
564 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 if (PyString_Check(arg) && PyString_Size(arg) == 1)
566 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000567 else
568 return "char";
569 break;
570 }
571
572 case 's': /* string */
573 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000574 if (*format == '#') { /* any buffer-like object */
575 void **p = (void **)va_arg(*p_va, char **);
576 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000577 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000578 int count;
579
580 if ( pb == NULL ||
581 pb->bf_getreadbuffer == NULL ||
582 pb->bf_getsegcount == NULL )
583 return "read-only buffer";
584 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
585 return "single-segment read-only buffer";
586 if ( (count =
587 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
588 return "(unspecified)";
589 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000590 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000591 } else {
592 char **p = va_arg(*p_va, char **);
593
594 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000595 *p = PyString_AS_STRING(arg);
596 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000597 arg = _PyUnicode_AsUTF8String(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 */
613 void **p = (void **)va_arg(*p_va, char **);
614 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000615 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000616 int count;
617
618 if (arg == Py_None) {
619 *p = 0;
620 *q = 0;
621 } else {
622 if ( pb == NULL ||
623 pb->bf_getreadbuffer == NULL ||
624 pb->bf_getsegcount == NULL )
625 return "read-only buffer";
626 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
627 return "single-segment read-only buffer";
628 if ( (count = (*pb->bf_getreadbuffer)
629 (arg, 0, p)) < 0 )
630 return "(unspecified)";
631 *q = count;
632 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000633 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000634 } else {
635 char **p = va_arg(*p_va, char **);
636
637 if (arg == Py_None)
638 *p = 0;
639 else if (PyString_Check(arg))
640 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000641 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000642 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000643 if (arg == NULL)
644 return "unicode conversion error";
645 *p = PyString_AS_STRING(arg);
646 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000647 else
648 return "None or string";
649 if (*format == '#') {
650 int *q = va_arg(*p_va, int *);
651 if (arg == Py_None)
652 *q = 0;
653 else
654 *q = PyString_Size(arg);
655 format++;
656 }
657 else if (*p != NULL &&
658 (int)strlen(*p) != PyString_Size(arg))
659 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000660 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000661 break;
662 }
663
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000664 case 'e': /* encoded string */
665 {
666 char **buffer;
667 const char *encoding;
668 PyObject *u, *s;
669 int size;
670
671 /* Get 'e' parameter: the encoding name */
672 encoding = (const char *)va_arg(*p_va, const char *);
673 if (encoding == NULL)
674 return "(encoding is NULL)";
675
676 /* Get 's' parameter: the output buffer to use */
677 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000678 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000679 buffer = (char **)va_arg(*p_va, char **);
680 format++;
681 if (buffer == NULL)
682 return "(buffer is NULL)";
683
684 /* Convert object to Unicode */
685 u = PyUnicode_FromObject(arg);
686 if (u == NULL)
687 return "string, unicode or text buffer";
688
689 /* Encode object; use default error handling */
690 s = PyUnicode_AsEncodedString(u,
691 encoding,
692 NULL);
693 Py_DECREF(u);
694 if (s == NULL)
695 return "(encoding failed)";
696 if (!PyString_Check(s)) {
697 Py_DECREF(s);
698 return "(encoder failed to return a string)";
699 }
700 size = PyString_GET_SIZE(s);
701
702 /* Write output; output is guaranteed to be
703 0-terminated */
704 if (*format == '#') {
705 /* Using buffer length parameter '#':
706
707 - if *buffer is NULL, a new buffer
708 of the needed size is allocated and
709 the data copied into it; *buffer is
710 updated to point to the new buffer;
711 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000712 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000713
714 - if *buffer is not NULL, the data
715 is copied to *buffer; *buffer_len
716 has to be set to the size of the
717 buffer on input; buffer overflow is
718 signalled with an error; buffer has
719 to provide enough room for the
720 encoded string plus the trailing
721 0-byte
722
723 - in both cases, *buffer_len is
724 updated to the size of the buffer
725 /excluding/ the trailing 0-byte
726
727 */
728 int *buffer_len = va_arg(*p_va, int *);
729
730 format++;
731 if (buffer_len == NULL)
732 return "(buffer_len is NULL)";
733 if (*buffer == NULL) {
734 *buffer = PyMem_NEW(char, size + 1);
735 if (*buffer == NULL) {
736 Py_DECREF(s);
737 return "(memory error)";
738 }
739 } else {
740 if (size + 1 > *buffer_len) {
741 Py_DECREF(s);
742 return "(buffer overflow)";
743 }
744 }
745 memcpy(*buffer,
746 PyString_AS_STRING(s),
747 size + 1);
748 *buffer_len = size;
749 } else {
750 /* Using a 0-terminated buffer:
751
752 - the encoded string has to be
753 0-terminated for this variant to
754 work; if it is not, an error raised
755
756 - a new buffer of the needed size
757 is allocated and the data copied
758 into it; *buffer is updated to
759 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000760 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000761 after usage
762
763 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000764 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000765 return "(encoded string without "\
766 "NULL bytes)";
767 *buffer = PyMem_NEW(char, size + 1);
768 if (*buffer == NULL) {
769 Py_DECREF(s);
770 return "(memory error)";
771 }
772 memcpy(*buffer,
773 PyString_AS_STRING(s),
774 size + 1);
775 }
776 Py_DECREF(s);
777 break;
778 }
779
Fred Drake25871c02000-05-03 15:17:02 +0000780 case 'u': /* raw unicode buffer (Py_UNICODE *) */
781 {
782 if (*format == '#') { /* any buffer-like object */
783 void **p = (void **)va_arg(*p_va, char **);
784 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
785 int *q = va_arg(*p_va, int *);
786 int count;
787
788 if ( pb == NULL ||
789 pb->bf_getreadbuffer == NULL ||
790 pb->bf_getsegcount == NULL )
791 return "read-only buffer";
792 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
793 return "single-segment read-only buffer";
794 if ( (count =
795 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
796 return "(unspecified)";
797 /* buffer interface returns bytes, we want
798 length in characters */
799 *q = count/(sizeof(Py_UNICODE));
800 format++;
801 } else {
802 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
803
804 if (PyUnicode_Check(arg))
805 *p = PyUnicode_AS_UNICODE(arg);
806 else
807 return "unicode";
808 }
809 break;
810 }
811
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000812 case 'S': /* string object */
813 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814 PyObject **p = va_arg(*p_va, PyObject **);
815 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000816 *p = arg;
817 else
818 return "string";
819 break;
820 }
821
Guido van Rossume826ef02000-03-10 23:02:17 +0000822 case 'U': /* Unicode object */
823 {
824 PyObject **p = va_arg(*p_va, PyObject **);
825 if (PyUnicode_Check(arg))
826 *p = arg;
827 else
828 return "unicode";
829 break;
830 }
831
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000832 case 'O': /* object */
833 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 PyTypeObject *type;
835 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000836 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000838 p = va_arg(*p_va, PyObject **);
839 format++;
840 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000841 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000842 else
843 return type->tp_name;
844
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000845 }
846 else if (*format == '?') {
847 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000848 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000849 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000850 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000851 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000852 else
853 return "(unspecified)";
854
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000855 }
856 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000857 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000858 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000859 converter convert = va_arg(*p_va, converter);
860 void *addr = va_arg(*p_va, void *);
861 format++;
862 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000863 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000864 }
865 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000867 *p = arg;
868 }
869 break;
870 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000871
872
873 case 'w': /* memory buffer, read-write access */
874 {
875 void **p = va_arg(*p_va, void **);
876 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
877 int count;
878
879 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
880 pb->bf_getsegcount == NULL )
881 return "read-write buffer";
882 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
883 return "single-segment read-write buffer";
884 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
885 return "(unspecified)";
886 if (*format == '#') {
887 int *q = va_arg(*p_va, int *);
888
889 *q = count;
890 format++;
891 }
892 break;
893 }
894
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000895 case 't': /* 8-bit character buffer, read-only access */
896 {
897 const char **p = va_arg(*p_va, const char **);
898 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
899 int count;
900
901 if ( *format++ != '#' )
902 return "invalid use of 't' format character";
903 if ( !PyType_HasFeature(
904 arg->ob_type,
905 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
906 pb == NULL ||
907 pb->bf_getcharbuffer == NULL ||
908 pb->bf_getsegcount == NULL )
909 return "read-only character buffer";
910 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
911 return "single-segment read-only buffer";
912 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
913 return "(unspecified)";
914
915 *va_arg(*p_va, int *) = count;
916
917 break;
918 }
919
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000920
921 default:
922 return "impossible<bad format char>";
923
924 }
925
926 *p_format = format;
927 return NULL;
928}
Guido van Rossumaa354651996-08-19 19:32:04 +0000929
930
931/* Support for keyword arguments donated by
932 Geoff Philbrick <philbric@delphi.hks.com> */
933
934#ifdef HAVE_STDARG_PROTOTYPES
935/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936int PyArg_ParseTupleAndKeywords(PyObject *args,
937 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000938 char *format,
939 char **kwlist, ...)
940#else
941/* VARARGS */
942int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
943#endif
944{
945 int retval;
946 va_list va;
947#ifdef HAVE_STDARG_PROTOTYPES
948
949 va_start(va, kwlist);
950#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951 PyObject *args;
952 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000953 char *format;
954 char **kwlist;
955
956 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 args = va_arg(va, PyObject *);
958 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000959 format = va_arg(va, char *);
960 kwlist = va_arg(va, char **);
961#endif
962 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
963 va_end(va);
964 return retval;
965}
966
967
968static int
969vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 PyObject *args;
971 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000972 char *format;
973 char **kwlist;
974 va_list *p_va;
975{
976 char msgbuf[256];
977 int levels[32];
978 char *fname = NULL;
979 char *message = NULL;
980 int min = -1;
981 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000982 char *formatsave = format;
983 int i, len, tplen, kwlen;
984 char *msg, *ks, **p;
985 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000986 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000987
988 /* nested tuples cannot be parsed when using keyword arguments */
989
990 for (;;) {
991 int c = *format++;
992 if (c == '(') {
993 PyErr_SetString(PyExc_SystemError,
994 "tuple found in format when using keyword arguments");
995 return 0;
996 }
997 else if (c == '\0')
998 break;
999 else if (c == ':') {
1000 fname = format;
1001 break;
1002 }
1003 else if (c == ';') {
1004 message = format;
1005 break;
1006 }
1007 else if (isalpha(c))
1008 max++;
1009 else if (c == '|')
1010 min = max;
1011 }
1012
1013 if (min < 0)
1014 min = max;
1015
1016 format = formatsave;
1017
1018 if (!PyTuple_Check(args)) {
1019 PyErr_SetString(PyExc_SystemError,
1020 "new style getargs format but argument is not a tuple");
1021 return 0;
1022 }
1023
1024 tplen = PyTuple_Size(args);
1025
1026 /* do a cursory check of the keywords just to see how many we got */
1027
1028 if (keywords) {
1029 if (!PyDict_Check(keywords)) {
1030 PyErr_SetString(PyExc_SystemError,
1031 "non-dictionary object received when keyword dictionary expected");
1032 return 0;
1033 }
1034 kwlen = PyDict_Size(keywords);
1035 }
1036 else {
1037 kwlen = 0;
1038 }
1039
1040 /* make sure there are no duplicate values for an argument;
1041 its not clear when to use the term "keyword argument vs.
1042 keyword parameter in messages */
1043
1044 if (keywords) {
1045 for (i = 0; i < tplen; i++) {
1046 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1047 sprintf(msgbuf,
1048 "keyword parameter %s redefined",
1049 kwlist[i]);
1050 PyErr_SetString(PyExc_TypeError, msgbuf);
1051 return 0;
1052 }
1053 }
1054 }
1055 PyErr_Clear(); /* I'm not which Py functions set the error string */
1056
1057 /* required arguments missing from args can be supplied by keyword
1058 arguments */
1059
1060 len = tplen;
1061 if (keywords && tplen < min) {
1062 for (i = tplen; i < min; i++) {
1063 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1064 len++;
1065 }
1066 }
1067 }
1068 PyErr_Clear();
1069
1070 /* make sure we got an acceptable number of arguments; the message
1071 is a little confusing with keywords since keyword arguments
1072 which are supplied, but don't match the required arguments
1073 are not included in the "%d given" part of the message */
1074
1075 if (len < min || max < len) {
1076 if (message == NULL) {
1077 sprintf(msgbuf,
1078 "%s requires %s %d argument%s; %d given",
1079 fname==NULL ? "function" : fname,
1080 min==max ? "exactly"
1081 : len < min ? "at least" : "at most",
1082 len < min ? min : max,
1083 (len < min ? min : max) == 1 ? "" : "s",
1084 len);
1085 message = msgbuf;
1086 }
1087 PyErr_SetString(PyExc_TypeError, message);
1088 return 0;
1089 }
1090
1091 for (i = 0; i < tplen; i++) {
1092 if (*format == '|')
1093 format++;
1094 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1095 levels, msgbuf);
1096 if (msg) {
1097 seterror(i+1, msg, levels, fname, message);
1098 return 0;
1099 }
1100 }
1101
1102 /* handle no keyword parameters in call */
1103
1104 if (!keywords) return 1;
1105
1106 /* make sure the number of keywords in the keyword list matches the
1107 number of items in the format string */
1108
1109 nkwds = 0;
1110 p = kwlist;
1111 for (;;) {
1112 if (!*(p++)) break;
1113 nkwds++;
1114 }
1115
1116 if (nkwds != max) {
1117 PyErr_SetString(PyExc_SystemError,
1118 "number of items in format string and keyword list do not match");
1119 return 0;
1120 }
1121
1122 /* convert the keyword arguments; this uses the format
1123 string where it was left after processing args */
1124
1125 converted = 0;
1126 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001128 if (*format == '|')
1129 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001130 item = PyMapping_GetItemString(keywords, kwlist[i]);
1131 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001132 msg = convertitem(item, &format, p_va, levels, msgbuf);
1133 if (msg) {
1134 seterror(i+1, msg, levels, fname, message);
1135 return 0;
1136 }
1137 converted++;
1138 }
1139 else {
1140 PyErr_Clear();
1141 msg = skipitem(&format, p_va);
1142 if (msg) {
1143 seterror(i+1, msg, levels, fname, message);
1144 return 0;
1145 }
1146 }
1147 }
1148
1149 /* make sure there are no extraneous keyword arguments */
1150
1151 pos = 0;
1152 if (converted < kwlen) {
1153 while (PyDict_Next(keywords, &pos, &key, &value)) {
1154 match = 0;
1155 ks = PyString_AsString(key);
1156 for (i = 0; i < nkwds; i++) {
1157 if (!strcmp(ks, kwlist[i])) {
1158 match = 1;
1159 break;
1160 }
1161 }
1162 if (!match) {
1163 sprintf(msgbuf,
1164 "%s is an invalid keyword argument for this function",
1165 ks);
1166 PyErr_SetString(PyExc_TypeError, msgbuf);
1167 return 0;
1168 }
1169 }
1170 }
1171
1172 return 1;
1173}
1174
1175
1176static char *
1177skipitem(p_format, p_va)
1178 char **p_format;
1179 va_list *p_va;
1180{
1181 char *format = *p_format;
1182 char c = *format++;
1183
1184 switch (c) {
1185
1186 case 'b': /* byte -- very short int */
1187 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001188 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001189 break;
1190 }
1191
1192 case 'h': /* short int */
1193 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001194 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001195 break;
1196 }
1197
1198 case 'i': /* int */
1199 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001200 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001201 break;
1202 }
1203
1204 case 'l': /* long int */
1205 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001206 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001207 break;
1208 }
1209
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001210#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001211 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001212 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001213 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001214 break;
1215 }
1216#endif
1217
Guido van Rossumaa354651996-08-19 19:32:04 +00001218 case 'f': /* float */
1219 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001220 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001221 break;
1222 }
1223
1224 case 'd': /* double */
1225 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001226 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001227 break;
1228 }
1229
1230#ifndef WITHOUT_COMPLEX
1231 case 'D': /* complex double */
1232 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001233 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001234 break;
1235 }
1236#endif /* WITHOUT_COMPLEX */
1237
1238 case 'c': /* char */
1239 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001240 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001241 break;
1242 }
1243
1244 case 's': /* string */
1245 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001246 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001247 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001248 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001249 format++;
1250 }
1251 break;
1252 }
1253
1254 case 'z': /* string */
1255 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001256 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001257 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001258 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001259 format++;
1260 }
1261 break;
1262 }
1263
1264 case 'S': /* string object */
1265 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001266 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001267 break;
1268 }
1269
1270 case 'O': /* object */
1271 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001272 if (*format == '!') {
1273 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001274 (void) va_arg(*p_va, PyTypeObject*);
1275 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001276 }
1277#if 0
1278/* I don't know what this is for */
1279 else if (*format == '?') {
1280 inquiry pred = va_arg(*p_va, inquiry);
1281 format++;
1282 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001283 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001284 }
1285 }
1286#endif
1287 else if (*format == '&') {
1288 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +00001290 (void) va_arg(*p_va, converter);
1291 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001292 format++;
1293 }
1294 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001295 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001296 }
1297 break;
1298 }
1299
1300 default:
1301 return "impossible<bad format char>";
1302
1303 }
1304
1305 *p_format = format;
1306 return NULL;
1307}