blob: 4617d0515e4fcae5381989e0ce721357b3933445 [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 Rossum66368cc1999-02-17 23:16:43 +0000360 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000361 levels[0] = 0;
362 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000363 toplevel ? "%d arguments, %s" : "%d-sequence, %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 Rossum66368cc1999-02-17 23:16:43 +0000368 if ((i = PySequence_Length(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000369 levels[0] = 0;
370 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000371 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
372 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000373 return msgbuf;
374 }
375
376 format = *p_format;
377 for (i = 0; i < n; i++) {
378 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000379 PyObject *item;
380 item = PySequence_GetItem(arg, i);
381 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
382 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
383 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000384 if (msg != NULL) {
385 levels[0] = i+1;
386 return msg;
387 }
388 }
389
390 *p_format = format;
391 return NULL;
392}
393
394
395/* Convert a single item. */
396
397static char *
398convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000400 char **p_format;
401 va_list *p_va;
402 int *levels;
403 char *msgbuf;
404{
405 char *msg;
406 char *format = *p_format;
407
408 if (*format == '(' /* ')' */) {
409 format++;
410 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
411 if (msg == NULL)
412 format++;
413 }
414 else {
415 msg = convertsimple(arg, &format, p_va, msgbuf);
416 if (msg != NULL)
417 levels[0] = 0;
418 }
419 if (msg == NULL)
420 *p_format = format;
421 return msg;
422}
423
424
425/* Convert a non-tuple argument. Adds to convertsimple1 functionality
426 by appending ", <actual argument type>" to error message. */
427
428static char *
429convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000430 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000431 char **p_format;
432 va_list *p_va;
433 char *msgbuf;
434{
435 char *msg = convertsimple1(arg, p_format, p_va);
436 if (msg != NULL) {
437 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000439 msg = msgbuf;
440 }
441 return msg;
442}
443
444
445/* Convert a non-tuple argument. Return NULL if conversion went OK,
446 or a string representing the expected type if the conversion failed.
447 When failing, an exception may or may not have been raised.
448 Don't call if a tuple is expected. */
449
450static char *
451convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000453 char **p_format;
454 va_list *p_va;
455{
456 char *format = *p_format;
457 char c = *format++;
458
459 switch (c) {
460
461 case 'b': /* byte -- very short int */
462 {
463 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 long ival = PyInt_AsLong(arg);
465 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000466 return "integer<b>";
467 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000468 *p = (char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000469 break;
470 }
471
472 case 'h': /* short int */
473 {
474 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 long ival = PyInt_AsLong(arg);
476 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000477 return "integer<h>";
478 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000479 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000480 break;
481 }
482
483 case 'i': /* int */
484 {
485 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486 long ival = PyInt_AsLong(arg);
487 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000488 return "integer<i>";
489 else
490 *p = ival;
491 break;
492 }
493
494 case 'l': /* long int */
495 {
496 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000497 long ival = PyInt_AsLong(arg);
498 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000499 return "integer<l>";
500 else
501 *p = ival;
502 break;
503 }
504
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000505#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000506 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000507 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000508 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
509 LONG_LONG ival = PyLong_AsLongLong( arg );
510 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000511 return "long<L>";
512 } else {
513 *p = ival;
514 }
515 break;
516 }
517#endif
518
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000519 case 'f': /* float */
520 {
521 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 double dval = PyFloat_AsDouble(arg);
523 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000524 return "float<f>";
525 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000526 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000527 break;
528 }
529
530 case 'd': /* double */
531 {
532 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 double dval = PyFloat_AsDouble(arg);
534 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000535 return "float<d>";
536 else
537 *p = dval;
538 break;
539 }
540
Guido van Rossum530956d1996-07-21 02:27:43 +0000541#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000542 case 'D': /* complex double */
543 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000544 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000545 Py_complex cval;
546 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000548 return "complex<D>";
549 else
550 *p = cval;
551 break;
552 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000553#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000554
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000555 case 'c': /* char */
556 {
557 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000558 if (PyString_Check(arg) && PyString_Size(arg) == 1)
559 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000560 else
561 return "char";
562 break;
563 }
564
565 case 's': /* string */
566 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000567 if (*format == '#') { /* any buffer-like object */
568 void **p = (void **)va_arg(*p_va, char **);
569 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000570 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000571 int count;
572
573 if ( pb == NULL ||
574 pb->bf_getreadbuffer == NULL ||
575 pb->bf_getsegcount == NULL )
576 return "read-only buffer";
577 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
578 return "single-segment read-only buffer";
579 if ( (count =
580 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
581 return "(unspecified)";
582 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000583 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000584 } else {
585 char **p = va_arg(*p_va, char **);
586
587 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000588 *p = PyString_AS_STRING(arg);
589 else if (PyUnicode_Check(arg)) {
590 arg = PyUnicode_AsUTF8String(arg);
591 if (arg == NULL)
592 return "unicode conversion error";
593 *p = PyString_AS_STRING(arg);
594 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000595 else
596 return "string";
597 if ((int)strlen(*p) != PyString_Size(arg))
598 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000599 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000600 break;
601 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000602
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000603 case 'z': /* string, may be NULL (None) */
604 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000605 if (*format == '#') { /* any buffer-like object */
606 void **p = (void **)va_arg(*p_va, char **);
607 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000608 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000609 int count;
610
611 if (arg == Py_None) {
612 *p = 0;
613 *q = 0;
614 } else {
615 if ( pb == NULL ||
616 pb->bf_getreadbuffer == NULL ||
617 pb->bf_getsegcount == NULL )
618 return "read-only buffer";
619 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
620 return "single-segment read-only buffer";
621 if ( (count = (*pb->bf_getreadbuffer)
622 (arg, 0, p)) < 0 )
623 return "(unspecified)";
624 *q = count;
625 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000626 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000627 } else {
628 char **p = va_arg(*p_va, char **);
629
630 if (arg == Py_None)
631 *p = 0;
632 else if (PyString_Check(arg))
633 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000634 else if (PyUnicode_Check(arg)) {
635 arg = PyUnicode_AsUTF8String(arg);
636 if (arg == NULL)
637 return "unicode conversion error";
638 *p = PyString_AS_STRING(arg);
639 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000640 else
641 return "None or string";
642 if (*format == '#') {
643 int *q = va_arg(*p_va, int *);
644 if (arg == Py_None)
645 *q = 0;
646 else
647 *q = PyString_Size(arg);
648 format++;
649 }
650 else if (*p != NULL &&
651 (int)strlen(*p) != PyString_Size(arg))
652 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000653 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000654 break;
655 }
656
657 case 'S': /* string object */
658 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000659 PyObject **p = va_arg(*p_va, PyObject **);
660 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000661 *p = arg;
662 else
663 return "string";
664 break;
665 }
666
Guido van Rossume826ef02000-03-10 23:02:17 +0000667 case 'U': /* Unicode object */
668 {
669 PyObject **p = va_arg(*p_va, PyObject **);
670 if (PyUnicode_Check(arg))
671 *p = arg;
672 else
673 return "unicode";
674 break;
675 }
676
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000677 case 'O': /* object */
678 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 PyTypeObject *type;
680 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000681 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000682 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000683 p = va_arg(*p_va, PyObject **);
684 format++;
685 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000686 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000687 else
688 return type->tp_name;
689
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000690 }
691 else if (*format == '?') {
692 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000693 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000694 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000695 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000696 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000697 else
698 return "(unspecified)";
699
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000700 }
701 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000702 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000703 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000704 converter convert = va_arg(*p_va, converter);
705 void *addr = va_arg(*p_va, void *);
706 format++;
707 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000708 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000709 }
710 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000712 *p = arg;
713 }
714 break;
715 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000716
717
718 case 'w': /* memory buffer, read-write access */
719 {
720 void **p = va_arg(*p_va, void **);
721 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
722 int count;
723
724 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
725 pb->bf_getsegcount == NULL )
726 return "read-write buffer";
727 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
728 return "single-segment read-write buffer";
729 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
730 return "(unspecified)";
731 if (*format == '#') {
732 int *q = va_arg(*p_va, int *);
733
734 *q = count;
735 format++;
736 }
737 break;
738 }
739
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000740 case 't': /* 8-bit character buffer, read-only access */
741 {
742 const char **p = va_arg(*p_va, const char **);
743 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
744 int count;
745
746 if ( *format++ != '#' )
747 return "invalid use of 't' format character";
748 if ( !PyType_HasFeature(
749 arg->ob_type,
750 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
751 pb == NULL ||
752 pb->bf_getcharbuffer == NULL ||
753 pb->bf_getsegcount == NULL )
754 return "read-only character buffer";
755 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
756 return "single-segment read-only buffer";
757 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
758 return "(unspecified)";
759
760 *va_arg(*p_va, int *) = count;
761
762 break;
763 }
764
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000765
766 default:
767 return "impossible<bad format char>";
768
769 }
770
771 *p_format = format;
772 return NULL;
773}
Guido van Rossumaa354651996-08-19 19:32:04 +0000774
775
776/* Support for keyword arguments donated by
777 Geoff Philbrick <philbric@delphi.hks.com> */
778
779#ifdef HAVE_STDARG_PROTOTYPES
780/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781int PyArg_ParseTupleAndKeywords(PyObject *args,
782 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000783 char *format,
784 char **kwlist, ...)
785#else
786/* VARARGS */
787int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
788#endif
789{
790 int retval;
791 va_list va;
792#ifdef HAVE_STDARG_PROTOTYPES
793
794 va_start(va, kwlist);
795#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 PyObject *args;
797 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000798 char *format;
799 char **kwlist;
800
801 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 args = va_arg(va, PyObject *);
803 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000804 format = va_arg(va, char *);
805 kwlist = va_arg(va, char **);
806#endif
807 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
808 va_end(va);
809 return retval;
810}
811
812
813static int
814vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 PyObject *args;
816 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000817 char *format;
818 char **kwlist;
819 va_list *p_va;
820{
821 char msgbuf[256];
822 int levels[32];
823 char *fname = NULL;
824 char *message = NULL;
825 int min = -1;
826 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000827 char *formatsave = format;
828 int i, len, tplen, kwlen;
829 char *msg, *ks, **p;
830 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000831 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000832
833 /* nested tuples cannot be parsed when using keyword arguments */
834
835 for (;;) {
836 int c = *format++;
837 if (c == '(') {
838 PyErr_SetString(PyExc_SystemError,
839 "tuple found in format when using keyword arguments");
840 return 0;
841 }
842 else if (c == '\0')
843 break;
844 else if (c == ':') {
845 fname = format;
846 break;
847 }
848 else if (c == ';') {
849 message = format;
850 break;
851 }
852 else if (isalpha(c))
853 max++;
854 else if (c == '|')
855 min = max;
856 }
857
858 if (min < 0)
859 min = max;
860
861 format = formatsave;
862
863 if (!PyTuple_Check(args)) {
864 PyErr_SetString(PyExc_SystemError,
865 "new style getargs format but argument is not a tuple");
866 return 0;
867 }
868
869 tplen = PyTuple_Size(args);
870
871 /* do a cursory check of the keywords just to see how many we got */
872
873 if (keywords) {
874 if (!PyDict_Check(keywords)) {
875 PyErr_SetString(PyExc_SystemError,
876 "non-dictionary object received when keyword dictionary expected");
877 return 0;
878 }
879 kwlen = PyDict_Size(keywords);
880 }
881 else {
882 kwlen = 0;
883 }
884
885 /* make sure there are no duplicate values for an argument;
886 its not clear when to use the term "keyword argument vs.
887 keyword parameter in messages */
888
889 if (keywords) {
890 for (i = 0; i < tplen; i++) {
891 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
892 sprintf(msgbuf,
893 "keyword parameter %s redefined",
894 kwlist[i]);
895 PyErr_SetString(PyExc_TypeError, msgbuf);
896 return 0;
897 }
898 }
899 }
900 PyErr_Clear(); /* I'm not which Py functions set the error string */
901
902 /* required arguments missing from args can be supplied by keyword
903 arguments */
904
905 len = tplen;
906 if (keywords && tplen < min) {
907 for (i = tplen; i < min; i++) {
908 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
909 len++;
910 }
911 }
912 }
913 PyErr_Clear();
914
915 /* make sure we got an acceptable number of arguments; the message
916 is a little confusing with keywords since keyword arguments
917 which are supplied, but don't match the required arguments
918 are not included in the "%d given" part of the message */
919
920 if (len < min || max < len) {
921 if (message == NULL) {
922 sprintf(msgbuf,
923 "%s requires %s %d argument%s; %d given",
924 fname==NULL ? "function" : fname,
925 min==max ? "exactly"
926 : len < min ? "at least" : "at most",
927 len < min ? min : max,
928 (len < min ? min : max) == 1 ? "" : "s",
929 len);
930 message = msgbuf;
931 }
932 PyErr_SetString(PyExc_TypeError, message);
933 return 0;
934 }
935
936 for (i = 0; i < tplen; i++) {
937 if (*format == '|')
938 format++;
939 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
940 levels, msgbuf);
941 if (msg) {
942 seterror(i+1, msg, levels, fname, message);
943 return 0;
944 }
945 }
946
947 /* handle no keyword parameters in call */
948
949 if (!keywords) return 1;
950
951 /* make sure the number of keywords in the keyword list matches the
952 number of items in the format string */
953
954 nkwds = 0;
955 p = kwlist;
956 for (;;) {
957 if (!*(p++)) break;
958 nkwds++;
959 }
960
961 if (nkwds != max) {
962 PyErr_SetString(PyExc_SystemError,
963 "number of items in format string and keyword list do not match");
964 return 0;
965 }
966
967 /* convert the keyword arguments; this uses the format
968 string where it was left after processing args */
969
970 converted = 0;
971 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +0000973 if (*format == '|')
974 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000975 item = PyMapping_GetItemString(keywords, kwlist[i]);
976 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +0000977 msg = convertitem(item, &format, p_va, levels, msgbuf);
978 if (msg) {
979 seterror(i+1, msg, levels, fname, message);
980 return 0;
981 }
982 converted++;
983 }
984 else {
985 PyErr_Clear();
986 msg = skipitem(&format, p_va);
987 if (msg) {
988 seterror(i+1, msg, levels, fname, message);
989 return 0;
990 }
991 }
992 }
993
994 /* make sure there are no extraneous keyword arguments */
995
996 pos = 0;
997 if (converted < kwlen) {
998 while (PyDict_Next(keywords, &pos, &key, &value)) {
999 match = 0;
1000 ks = PyString_AsString(key);
1001 for (i = 0; i < nkwds; i++) {
1002 if (!strcmp(ks, kwlist[i])) {
1003 match = 1;
1004 break;
1005 }
1006 }
1007 if (!match) {
1008 sprintf(msgbuf,
1009 "%s is an invalid keyword argument for this function",
1010 ks);
1011 PyErr_SetString(PyExc_TypeError, msgbuf);
1012 return 0;
1013 }
1014 }
1015 }
1016
1017 return 1;
1018}
1019
1020
1021static char *
1022skipitem(p_format, p_va)
1023 char **p_format;
1024 va_list *p_va;
1025{
1026 char *format = *p_format;
1027 char c = *format++;
1028
1029 switch (c) {
1030
1031 case 'b': /* byte -- very short int */
1032 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001033 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001034 break;
1035 }
1036
1037 case 'h': /* short int */
1038 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001039 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001040 break;
1041 }
1042
1043 case 'i': /* int */
1044 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001045 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001046 break;
1047 }
1048
1049 case 'l': /* long int */
1050 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001051 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001052 break;
1053 }
1054
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001055#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001056 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001057 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001058 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001059 break;
1060 }
1061#endif
1062
Guido van Rossumaa354651996-08-19 19:32:04 +00001063 case 'f': /* float */
1064 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001065 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001066 break;
1067 }
1068
1069 case 'd': /* double */
1070 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001071 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001072 break;
1073 }
1074
1075#ifndef WITHOUT_COMPLEX
1076 case 'D': /* complex double */
1077 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001078 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001079 break;
1080 }
1081#endif /* WITHOUT_COMPLEX */
1082
1083 case 'c': /* char */
1084 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001085 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001086 break;
1087 }
1088
1089 case 's': /* string */
1090 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001091 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001092 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001093 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001094 format++;
1095 }
1096 break;
1097 }
1098
1099 case 'z': /* string */
1100 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001101 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001102 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001103 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001104 format++;
1105 }
1106 break;
1107 }
1108
1109 case 'S': /* string object */
1110 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001112 break;
1113 }
1114
1115 case 'O': /* object */
1116 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001117 if (*format == '!') {
1118 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 (void) va_arg(*p_va, PyTypeObject*);
1120 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001121 }
1122#if 0
1123/* I don't know what this is for */
1124 else if (*format == '?') {
1125 inquiry pred = va_arg(*p_va, inquiry);
1126 format++;
1127 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001128 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001129 }
1130 }
1131#endif
1132 else if (*format == '&') {
1133 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +00001135 (void) va_arg(*p_va, converter);
1136 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001137 format++;
1138 }
1139 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001140 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001141 }
1142 break;
1143 }
1144
1145 default:
1146 return "impossible<bad format char>";
1147
1148 }
1149
1150 *p_format = format;
1151 return NULL;
1152}