blob: dc852ae9ea305a4cb13a633b1b31ac0da73f9c67 [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 */
181 else if (isalpha(c))
182 max++;
183 else if (c == '|')
184 min = max;
185 }
186
187 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000189
190 if (min < 0)
191 min = max;
192
193 format = formatsave;
194
195 if (compat) {
196 if (max == 0) {
197 if (args == NULL)
198 return 1;
199 sprintf(msgbuf, "%s requires no arguments",
200 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000201 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000202 return 0;
203 }
204 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000205 if (args == NULL) {
206 sprintf(msgbuf,
207 "%s requires at least one argument",
208 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000210 return 0;
211 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000212 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000213 if (msg == NULL)
214 return 1;
215 seterror(levels[0], msg, levels+1, fname, message);
216 return 0;
217 }
218 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000219 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000220 "old style getargs format uses new features");
221 return 0;
222 }
223 }
224
Guido van Rossum79f25d91997-04-29 20:08:16 +0000225 if (!PyTuple_Check(args)) {
226 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000227 "new style getargs format but argument is not a tuple");
228 return 0;
229 }
230
Guido van Rossum79f25d91997-04-29 20:08:16 +0000231 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000232
233 if (len < min || max < len) {
234 if (message == NULL) {
235 sprintf(msgbuf,
236 "%s requires %s %d argument%s; %d given",
237 fname==NULL ? "function" : fname,
238 min==max ? "exactly"
239 : len < min ? "at least" : "at most",
240 len < min ? min : max,
241 (len < min ? min : max) == 1 ? "" : "s",
242 len);
243 message = msgbuf;
244 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000246 return 0;
247 }
248
249 for (i = 0; i < len; i++) {
250 if (*format == '|')
251 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000253 levels, msgbuf);
254 if (msg) {
255 seterror(i+1, msg, levels, fname, message);
256 return 0;
257 }
258 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000259
Guido van Rossum730806d1998-04-10 22:27:42 +0000260 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000261 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000262 *format != '|' && *format != ':' && *format != ';') {
263 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000264 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000265 return 0;
266 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000267
268 return 1;
269}
270
271
272
273static void
274seterror(iarg, msg, levels, fname, message)
275 int iarg;
276 char *msg;
277 int *levels;
278 char *fname;
279 char *message;
280{
281 char buf[256];
282 int i;
283 char *p = buf;
284
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000286 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000287 if (iarg == 0 && message == NULL)
288 message = msg;
289 else if (message == NULL) {
290 if (fname != NULL) {
291 sprintf(p, "%s, ", fname);
292 p += strlen(p);
293 }
294 sprintf(p, "argument %d", iarg);
295 i = 0;
296 p += strlen(p);
297 while (levels[i] > 0) {
298 sprintf(p, ", item %d", levels[i]-1);
299 p += strlen(p);
300 i++;
301 }
302 sprintf(p, ": expected %s found", msg);
303 message = buf;
304 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000305 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000306}
307
308
309/* Convert a tuple argument.
310 On entry, *p_format points to the character _after_ the opening '('.
311 On successful exit, *p_format points to the closing ')'.
312 If successful:
313 *p_format and *p_va are updated,
314 *levels and *msgbuf are untouched,
315 and NULL is returned.
316 If the argument is invalid:
317 *p_format is unchanged,
318 *p_va is undefined,
319 *levels is a 0-terminated list of item numbers,
320 *msgbuf contains an error message, whose format is:
321 "<typename1>, <typename2>", where:
322 <typename1> is the name of the expected type, and
323 <typename2> is the name of the actual type,
324 (so you can surround it by "expected ... found"),
325 and msgbuf is returned.
326*/
327
328static char *
329converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000330 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000331 char **p_format;
332 va_list *p_va;
333 int *levels;
334 char *msgbuf;
335 int toplevel;
336{
337 int level = 0;
338 int n = 0;
339 char *format = *p_format;
340 int i;
341
342 for (;;) {
343 int c = *format++;
344 if (c == '(') {
345 if (level == 0)
346 n++;
347 level++;
348 }
349 else if (c == ')') {
350 if (level == 0)
351 break;
352 level--;
353 }
354 else if (c == ':' || c == ';' || c == '\0')
355 break;
356 else if (level == 0 && isalpha(c))
357 n++;
358 }
359
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360 if (!PyTuple_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000361 levels[0] = 0;
362 sprintf(msgbuf,
363 toplevel ? "%d arguments, %s" : "%d-tuple, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000365 return msgbuf;
366 }
367
Guido van Rossum79f25d91997-04-29 20:08:16 +0000368 if ((i = PyTuple_Size(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000369 levels[0] = 0;
370 sprintf(msgbuf,
371 toplevel ? "%d arguments, %d" : "%d-tuple, %d-tuple",
372 n, i);
373 return msgbuf;
374 }
375
376 format = *p_format;
377 for (i = 0; i < n; i++) {
378 char *msg;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000379 msg = convertitem(PyTuple_GetItem(arg, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000380 levels+1, msgbuf);
381 if (msg != NULL) {
382 levels[0] = i+1;
383 return msg;
384 }
385 }
386
387 *p_format = format;
388 return NULL;
389}
390
391
392/* Convert a single item. */
393
394static char *
395convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000397 char **p_format;
398 va_list *p_va;
399 int *levels;
400 char *msgbuf;
401{
402 char *msg;
403 char *format = *p_format;
404
405 if (*format == '(' /* ')' */) {
406 format++;
407 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
408 if (msg == NULL)
409 format++;
410 }
411 else {
412 msg = convertsimple(arg, &format, p_va, msgbuf);
413 if (msg != NULL)
414 levels[0] = 0;
415 }
416 if (msg == NULL)
417 *p_format = format;
418 return msg;
419}
420
421
422/* Convert a non-tuple argument. Adds to convertsimple1 functionality
423 by appending ", <actual argument type>" to error message. */
424
425static char *
426convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000428 char **p_format;
429 va_list *p_va;
430 char *msgbuf;
431{
432 char *msg = convertsimple1(arg, p_format, p_va);
433 if (msg != NULL) {
434 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000436 msg = msgbuf;
437 }
438 return msg;
439}
440
441
442/* Convert a non-tuple argument. Return NULL if conversion went OK,
443 or a string representing the expected type if the conversion failed.
444 When failing, an exception may or may not have been raised.
445 Don't call if a tuple is expected. */
446
447static char *
448convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000450 char **p_format;
451 va_list *p_va;
452{
453 char *format = *p_format;
454 char c = *format++;
455
456 switch (c) {
457
458 case 'b': /* byte -- very short int */
459 {
460 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461 long ival = PyInt_AsLong(arg);
462 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000463 return "integer<b>";
464 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000465 *p = (char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000466 break;
467 }
468
469 case 'h': /* short int */
470 {
471 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472 long ival = PyInt_AsLong(arg);
473 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000474 return "integer<h>";
475 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000476 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000477 break;
478 }
479
480 case 'i': /* int */
481 {
482 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000483 long ival = PyInt_AsLong(arg);
484 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000485 return "integer<i>";
486 else
487 *p = ival;
488 break;
489 }
490
491 case 'l': /* long int */
492 {
493 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000494 long ival = PyInt_AsLong(arg);
495 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000496 return "integer<l>";
497 else
498 *p = ival;
499 break;
500 }
501
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000502#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000503 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000504 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000505 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
506 LONG_LONG ival = PyLong_AsLongLong( arg );
507 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000508 return "long<L>";
509 } else {
510 *p = ival;
511 }
512 break;
513 }
514#endif
515
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000516 case 'f': /* float */
517 {
518 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 double dval = PyFloat_AsDouble(arg);
520 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000521 return "float<f>";
522 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000523 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000524 break;
525 }
526
527 case 'd': /* double */
528 {
529 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000530 double dval = PyFloat_AsDouble(arg);
531 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000532 return "float<d>";
533 else
534 *p = dval;
535 break;
536 }
537
Guido van Rossum530956d1996-07-21 02:27:43 +0000538#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000539 case 'D': /* complex double */
540 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000541 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000542 Py_complex cval;
543 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000545 return "complex<D>";
546 else
547 *p = cval;
548 break;
549 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000550#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000551
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000552 case 'c': /* char */
553 {
554 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 if (PyString_Check(arg) && PyString_Size(arg) == 1)
556 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000557 else
558 return "char";
559 break;
560 }
561
562 case 's': /* string */
563 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000564 if (*format == '#') { /* any buffer-like object */
565 void **p = (void **)va_arg(*p_va, char **);
566 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000567 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000568 int count;
569
570 if ( pb == NULL ||
571 pb->bf_getreadbuffer == NULL ||
572 pb->bf_getsegcount == NULL )
573 return "read-only buffer";
574 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
575 return "single-segment read-only buffer";
576 if ( (count =
577 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
578 return "(unspecified)";
579 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000580 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000581 } else {
582 char **p = va_arg(*p_va, char **);
583
584 if (PyString_Check(arg))
585 *p = PyString_AsString(arg);
586 else
587 return "string";
588 if ((int)strlen(*p) != PyString_Size(arg))
589 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000590 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000591 break;
592 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000593
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000594 case 'z': /* string, may be NULL (None) */
595 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000596 if (*format == '#') { /* any buffer-like object */
597 void **p = (void **)va_arg(*p_va, char **);
598 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000599 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000600 int count;
601
602 if (arg == Py_None) {
603 *p = 0;
604 *q = 0;
605 } else {
606 if ( pb == NULL ||
607 pb->bf_getreadbuffer == NULL ||
608 pb->bf_getsegcount == NULL )
609 return "read-only buffer";
610 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
611 return "single-segment read-only buffer";
612 if ( (count = (*pb->bf_getreadbuffer)
613 (arg, 0, p)) < 0 )
614 return "(unspecified)";
615 *q = count;
616 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000617 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000618 } else {
619 char **p = va_arg(*p_va, char **);
620
621 if (arg == Py_None)
622 *p = 0;
623 else if (PyString_Check(arg))
624 *p = PyString_AsString(arg);
625 else
626 return "None or string";
627 if (*format == '#') {
628 int *q = va_arg(*p_va, int *);
629 if (arg == Py_None)
630 *q = 0;
631 else
632 *q = PyString_Size(arg);
633 format++;
634 }
635 else if (*p != NULL &&
636 (int)strlen(*p) != PyString_Size(arg))
637 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000638 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000639 break;
640 }
641
642 case 'S': /* string object */
643 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 PyObject **p = va_arg(*p_va, PyObject **);
645 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000646 *p = arg;
647 else
648 return "string";
649 break;
650 }
651
652 case 'O': /* object */
653 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000654 PyTypeObject *type;
655 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000656 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000657 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000658 p = va_arg(*p_va, PyObject **);
659 format++;
660 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000661 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000662 else
663 return type->tp_name;
664
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000665 }
666 else if (*format == '?') {
667 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000668 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000669 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000670 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000671 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000672 else
673 return "(unspecified)";
674
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000675 }
676 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000677 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000679 converter convert = va_arg(*p_va, converter);
680 void *addr = va_arg(*p_va, void *);
681 format++;
682 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000683 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000684 }
685 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000687 *p = arg;
688 }
689 break;
690 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000691
692
693 case 'w': /* memory buffer, read-write access */
694 {
695 void **p = va_arg(*p_va, void **);
696 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
697 int count;
698
699 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
700 pb->bf_getsegcount == NULL )
701 return "read-write buffer";
702 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
703 return "single-segment read-write buffer";
704 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
705 return "(unspecified)";
706 if (*format == '#') {
707 int *q = va_arg(*p_va, int *);
708
709 *q = count;
710 format++;
711 }
712 break;
713 }
714
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000715 case 't': /* 8-bit character buffer, read-only access */
716 {
717 const char **p = va_arg(*p_va, const char **);
718 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
719 int count;
720
721 if ( *format++ != '#' )
722 return "invalid use of 't' format character";
723 if ( !PyType_HasFeature(
724 arg->ob_type,
725 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
726 pb == NULL ||
727 pb->bf_getcharbuffer == NULL ||
728 pb->bf_getsegcount == NULL )
729 return "read-only character buffer";
730 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
731 return "single-segment read-only buffer";
732 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
733 return "(unspecified)";
734
735 *va_arg(*p_va, int *) = count;
736
737 break;
738 }
739
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000740
741 default:
742 return "impossible<bad format char>";
743
744 }
745
746 *p_format = format;
747 return NULL;
748}
Guido van Rossumaa354651996-08-19 19:32:04 +0000749
750
751/* Support for keyword arguments donated by
752 Geoff Philbrick <philbric@delphi.hks.com> */
753
754#ifdef HAVE_STDARG_PROTOTYPES
755/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756int PyArg_ParseTupleAndKeywords(PyObject *args,
757 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000758 char *format,
759 char **kwlist, ...)
760#else
761/* VARARGS */
762int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
763#endif
764{
765 int retval;
766 va_list va;
767#ifdef HAVE_STDARG_PROTOTYPES
768
769 va_start(va, kwlist);
770#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000771 PyObject *args;
772 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000773 char *format;
774 char **kwlist;
775
776 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 args = va_arg(va, PyObject *);
778 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000779 format = va_arg(va, char *);
780 kwlist = va_arg(va, char **);
781#endif
782 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
783 va_end(va);
784 return retval;
785}
786
787
788static int
789vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 PyObject *args;
791 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000792 char *format;
793 char **kwlist;
794 va_list *p_va;
795{
796 char msgbuf[256];
797 int levels[32];
798 char *fname = NULL;
799 char *message = NULL;
800 int min = -1;
801 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000802 char *formatsave = format;
803 int i, len, tplen, kwlen;
804 char *msg, *ks, **p;
805 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000806 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000807
808 /* nested tuples cannot be parsed when using keyword arguments */
809
810 for (;;) {
811 int c = *format++;
812 if (c == '(') {
813 PyErr_SetString(PyExc_SystemError,
814 "tuple found in format when using keyword arguments");
815 return 0;
816 }
817 else if (c == '\0')
818 break;
819 else if (c == ':') {
820 fname = format;
821 break;
822 }
823 else if (c == ';') {
824 message = format;
825 break;
826 }
827 else if (isalpha(c))
828 max++;
829 else if (c == '|')
830 min = max;
831 }
832
833 if (min < 0)
834 min = max;
835
836 format = formatsave;
837
838 if (!PyTuple_Check(args)) {
839 PyErr_SetString(PyExc_SystemError,
840 "new style getargs format but argument is not a tuple");
841 return 0;
842 }
843
844 tplen = PyTuple_Size(args);
845
846 /* do a cursory check of the keywords just to see how many we got */
847
848 if (keywords) {
849 if (!PyDict_Check(keywords)) {
850 PyErr_SetString(PyExc_SystemError,
851 "non-dictionary object received when keyword dictionary expected");
852 return 0;
853 }
854 kwlen = PyDict_Size(keywords);
855 }
856 else {
857 kwlen = 0;
858 }
859
860 /* make sure there are no duplicate values for an argument;
861 its not clear when to use the term "keyword argument vs.
862 keyword parameter in messages */
863
864 if (keywords) {
865 for (i = 0; i < tplen; i++) {
866 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
867 sprintf(msgbuf,
868 "keyword parameter %s redefined",
869 kwlist[i]);
870 PyErr_SetString(PyExc_TypeError, msgbuf);
871 return 0;
872 }
873 }
874 }
875 PyErr_Clear(); /* I'm not which Py functions set the error string */
876
877 /* required arguments missing from args can be supplied by keyword
878 arguments */
879
880 len = tplen;
881 if (keywords && tplen < min) {
882 for (i = tplen; i < min; i++) {
883 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
884 len++;
885 }
886 }
887 }
888 PyErr_Clear();
889
890 /* make sure we got an acceptable number of arguments; the message
891 is a little confusing with keywords since keyword arguments
892 which are supplied, but don't match the required arguments
893 are not included in the "%d given" part of the message */
894
895 if (len < min || max < len) {
896 if (message == NULL) {
897 sprintf(msgbuf,
898 "%s requires %s %d argument%s; %d given",
899 fname==NULL ? "function" : fname,
900 min==max ? "exactly"
901 : len < min ? "at least" : "at most",
902 len < min ? min : max,
903 (len < min ? min : max) == 1 ? "" : "s",
904 len);
905 message = msgbuf;
906 }
907 PyErr_SetString(PyExc_TypeError, message);
908 return 0;
909 }
910
911 for (i = 0; i < tplen; i++) {
912 if (*format == '|')
913 format++;
914 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
915 levels, msgbuf);
916 if (msg) {
917 seterror(i+1, msg, levels, fname, message);
918 return 0;
919 }
920 }
921
922 /* handle no keyword parameters in call */
923
924 if (!keywords) return 1;
925
926 /* make sure the number of keywords in the keyword list matches the
927 number of items in the format string */
928
929 nkwds = 0;
930 p = kwlist;
931 for (;;) {
932 if (!*(p++)) break;
933 nkwds++;
934 }
935
936 if (nkwds != max) {
937 PyErr_SetString(PyExc_SystemError,
938 "number of items in format string and keyword list do not match");
939 return 0;
940 }
941
942 /* convert the keyword arguments; this uses the format
943 string where it was left after processing args */
944
945 converted = 0;
946 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +0000948 if (*format == '|')
949 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000950 item = PyMapping_GetItemString(keywords, kwlist[i]);
951 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +0000952 msg = convertitem(item, &format, p_va, levels, msgbuf);
953 if (msg) {
954 seterror(i+1, msg, levels, fname, message);
955 return 0;
956 }
957 converted++;
958 }
959 else {
960 PyErr_Clear();
961 msg = skipitem(&format, p_va);
962 if (msg) {
963 seterror(i+1, msg, levels, fname, message);
964 return 0;
965 }
966 }
967 }
968
969 /* make sure there are no extraneous keyword arguments */
970
971 pos = 0;
972 if (converted < kwlen) {
973 while (PyDict_Next(keywords, &pos, &key, &value)) {
974 match = 0;
975 ks = PyString_AsString(key);
976 for (i = 0; i < nkwds; i++) {
977 if (!strcmp(ks, kwlist[i])) {
978 match = 1;
979 break;
980 }
981 }
982 if (!match) {
983 sprintf(msgbuf,
984 "%s is an invalid keyword argument for this function",
985 ks);
986 PyErr_SetString(PyExc_TypeError, msgbuf);
987 return 0;
988 }
989 }
990 }
991
992 return 1;
993}
994
995
996static char *
997skipitem(p_format, p_va)
998 char **p_format;
999 va_list *p_va;
1000{
1001 char *format = *p_format;
1002 char c = *format++;
1003
1004 switch (c) {
1005
1006 case 'b': /* byte -- very short int */
1007 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001008 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001009 break;
1010 }
1011
1012 case 'h': /* short int */
1013 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001014 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001015 break;
1016 }
1017
1018 case 'i': /* int */
1019 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001020 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001021 break;
1022 }
1023
1024 case 'l': /* long int */
1025 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001026 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001027 break;
1028 }
1029
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001030#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001031 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001032 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001033 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001034 break;
1035 }
1036#endif
1037
Guido van Rossumaa354651996-08-19 19:32:04 +00001038 case 'f': /* float */
1039 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001040 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001041 break;
1042 }
1043
1044 case 'd': /* double */
1045 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001046 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001047 break;
1048 }
1049
1050#ifndef WITHOUT_COMPLEX
1051 case 'D': /* complex double */
1052 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001053 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001054 break;
1055 }
1056#endif /* WITHOUT_COMPLEX */
1057
1058 case 'c': /* char */
1059 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001060 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001061 break;
1062 }
1063
1064 case 's': /* string */
1065 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001066 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001067 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001068 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001069 format++;
1070 }
1071 break;
1072 }
1073
1074 case 'z': /* string */
1075 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001076 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001077 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001078 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001079 format++;
1080 }
1081 break;
1082 }
1083
1084 case 'S': /* string object */
1085 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001086 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001087 break;
1088 }
1089
1090 case 'O': /* object */
1091 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001092 if (*format == '!') {
1093 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001094 (void) va_arg(*p_va, PyTypeObject*);
1095 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001096 }
1097#if 0
1098/* I don't know what this is for */
1099 else if (*format == '?') {
1100 inquiry pred = va_arg(*p_va, inquiry);
1101 format++;
1102 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001104 }
1105 }
1106#endif
1107 else if (*format == '&') {
1108 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +00001110 (void) va_arg(*p_va, converter);
1111 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001112 format++;
1113 }
1114 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001116 }
1117 break;
1118 }
1119
1120 default:
1121 return "impossible<bad format char>";
1122
1123 }
1124
1125 *p_format = format;
1126 return NULL;
1127}