blob: a2555ce5427376ac657b982c02289c57a760162b [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 }
259
260 return 1;
261}
262
263
264
265static void
266seterror(iarg, msg, levels, fname, message)
267 int iarg;
268 char *msg;
269 int *levels;
270 char *fname;
271 char *message;
272{
273 char buf[256];
274 int i;
275 char *p = buf;
276
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000278 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000279 if (iarg == 0 && message == NULL)
280 message = msg;
281 else if (message == NULL) {
282 if (fname != NULL) {
283 sprintf(p, "%s, ", fname);
284 p += strlen(p);
285 }
286 sprintf(p, "argument %d", iarg);
287 i = 0;
288 p += strlen(p);
289 while (levels[i] > 0) {
290 sprintf(p, ", item %d", levels[i]-1);
291 p += strlen(p);
292 i++;
293 }
294 sprintf(p, ": expected %s found", msg);
295 message = buf;
296 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000298}
299
300
301/* Convert a tuple argument.
302 On entry, *p_format points to the character _after_ the opening '('.
303 On successful exit, *p_format points to the closing ')'.
304 If successful:
305 *p_format and *p_va are updated,
306 *levels and *msgbuf are untouched,
307 and NULL is returned.
308 If the argument is invalid:
309 *p_format is unchanged,
310 *p_va is undefined,
311 *levels is a 0-terminated list of item numbers,
312 *msgbuf contains an error message, whose format is:
313 "<typename1>, <typename2>", where:
314 <typename1> is the name of the expected type, and
315 <typename2> is the name of the actual type,
316 (so you can surround it by "expected ... found"),
317 and msgbuf is returned.
318*/
319
320static char *
321converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000322 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000323 char **p_format;
324 va_list *p_va;
325 int *levels;
326 char *msgbuf;
327 int toplevel;
328{
329 int level = 0;
330 int n = 0;
331 char *format = *p_format;
332 int i;
333
334 for (;;) {
335 int c = *format++;
336 if (c == '(') {
337 if (level == 0)
338 n++;
339 level++;
340 }
341 else if (c == ')') {
342 if (level == 0)
343 break;
344 level--;
345 }
346 else if (c == ':' || c == ';' || c == '\0')
347 break;
348 else if (level == 0 && isalpha(c))
349 n++;
350 }
351
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 if (!PyTuple_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000353 levels[0] = 0;
354 sprintf(msgbuf,
355 toplevel ? "%d arguments, %s" : "%d-tuple, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000357 return msgbuf;
358 }
359
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360 if ((i = PyTuple_Size(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000361 levels[0] = 0;
362 sprintf(msgbuf,
363 toplevel ? "%d arguments, %d" : "%d-tuple, %d-tuple",
364 n, i);
365 return msgbuf;
366 }
367
368 format = *p_format;
369 for (i = 0; i < n; i++) {
370 char *msg;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 msg = convertitem(PyTuple_GetItem(arg, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000372 levels+1, msgbuf);
373 if (msg != NULL) {
374 levels[0] = i+1;
375 return msg;
376 }
377 }
378
379 *p_format = format;
380 return NULL;
381}
382
383
384/* Convert a single item. */
385
386static char *
387convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000388 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000389 char **p_format;
390 va_list *p_va;
391 int *levels;
392 char *msgbuf;
393{
394 char *msg;
395 char *format = *p_format;
396
397 if (*format == '(' /* ')' */) {
398 format++;
399 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
400 if (msg == NULL)
401 format++;
402 }
403 else {
404 msg = convertsimple(arg, &format, p_va, msgbuf);
405 if (msg != NULL)
406 levels[0] = 0;
407 }
408 if (msg == NULL)
409 *p_format = format;
410 return msg;
411}
412
413
414/* Convert a non-tuple argument. Adds to convertsimple1 functionality
415 by appending ", <actual argument type>" to error message. */
416
417static char *
418convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000420 char **p_format;
421 va_list *p_va;
422 char *msgbuf;
423{
424 char *msg = convertsimple1(arg, p_format, p_va);
425 if (msg != NULL) {
426 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000428 msg = msgbuf;
429 }
430 return msg;
431}
432
433
434/* Convert a non-tuple argument. Return NULL if conversion went OK,
435 or a string representing the expected type if the conversion failed.
436 When failing, an exception may or may not have been raised.
437 Don't call if a tuple is expected. */
438
439static char *
440convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000442 char **p_format;
443 va_list *p_va;
444{
445 char *format = *p_format;
446 char c = *format++;
447
448 switch (c) {
449
450 case 'b': /* byte -- very short int */
451 {
452 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 long ival = PyInt_AsLong(arg);
454 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000455 return "integer<b>";
456 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000457 *p = (char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000458 break;
459 }
460
461 case 'h': /* short int */
462 {
463 short *p = va_arg(*p_va, short *);
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<h>";
467 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000468 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000469 break;
470 }
471
472 case 'i': /* int */
473 {
474 int *p = va_arg(*p_va, int *);
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<i>";
478 else
479 *p = ival;
480 break;
481 }
482
483 case 'l': /* long int */
484 {
485 long *p = va_arg(*p_va, long *);
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<l>";
489 else
490 *p = ival;
491 break;
492 }
493
494 case 'f': /* float */
495 {
496 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000497 double dval = PyFloat_AsDouble(arg);
498 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000499 return "float<f>";
500 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000501 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000502 break;
503 }
504
505 case 'd': /* double */
506 {
507 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508 double dval = PyFloat_AsDouble(arg);
509 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000510 return "float<d>";
511 else
512 *p = dval;
513 break;
514 }
515
Guido van Rossum530956d1996-07-21 02:27:43 +0000516#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000517 case 'D': /* complex double */
518 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000519 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000520 Py_complex cval;
521 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000523 return "complex<D>";
524 else
525 *p = cval;
526 break;
527 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000528#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000529
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000530 case 'c': /* char */
531 {
532 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 if (PyString_Check(arg) && PyString_Size(arg) == 1)
534 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000535 else
536 return "char";
537 break;
538 }
539
540 case 's': /* string */
541 {
542 char **p = va_arg(*p_va, char **);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 if (PyString_Check(arg))
544 *p = PyString_AsString(arg);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000545 else
546 return "string";
547 if (*format == '#') {
548 int *q = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 *q = PyString_Size(arg);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000550 format++;
551 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 else if ((int)strlen(*p) != PyString_Size(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000553 return "string without null bytes";
554 break;
555 }
556
557 case 'z': /* string, may be NULL (None) */
558 {
559 char **p = va_arg(*p_va, char **);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 if (arg == Py_None)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000561 *p = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000562 else if (PyString_Check(arg))
563 *p = PyString_AsString(arg);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000564 else
565 return "None or string";
566 if (*format == '#') {
567 int *q = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 if (arg == Py_None)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000569 *q = 0;
570 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 *q = PyString_Size(arg);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000572 format++;
573 }
Guido van Rossumaa354651996-08-19 19:32:04 +0000574 else if (*p != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 (int)strlen(*p) != PyString_Size(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000576 return "None or string without null bytes";
577 break;
578 }
579
580 case 'S': /* string object */
581 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000582 PyObject **p = va_arg(*p_va, PyObject **);
583 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000584 *p = arg;
585 else
586 return "string";
587 break;
588 }
589
590 case 'O': /* object */
591 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 PyTypeObject *type;
593 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000594 if (*format == '!') {
595 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000597 if (arg->ob_type != type)
598 return type->tp_name;
599 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000601 *p = arg;
602 }
603 }
604 else if (*format == '?') {
605 inquiry pred = va_arg(*p_va, inquiry);
606 format++;
607 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000609 *p = arg;
610 }
611 }
612 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000613 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000615 converter convert = va_arg(*p_va, converter);
616 void *addr = va_arg(*p_va, void *);
617 format++;
618 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000619 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000620 }
621 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000622 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000623 *p = arg;
624 }
625 break;
626 }
627
628 default:
629 return "impossible<bad format char>";
630
631 }
632
633 *p_format = format;
634 return NULL;
635}
Guido van Rossumaa354651996-08-19 19:32:04 +0000636
637
638/* Support for keyword arguments donated by
639 Geoff Philbrick <philbric@delphi.hks.com> */
640
641#ifdef HAVE_STDARG_PROTOTYPES
642/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643int PyArg_ParseTupleAndKeywords(PyObject *args,
644 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000645 char *format,
646 char **kwlist, ...)
647#else
648/* VARARGS */
649int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
650#endif
651{
652 int retval;
653 va_list va;
654#ifdef HAVE_STDARG_PROTOTYPES
655
656 va_start(va, kwlist);
657#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 PyObject *args;
659 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000660 char *format;
661 char **kwlist;
662
663 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 args = va_arg(va, PyObject *);
665 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000666 format = va_arg(va, char *);
667 kwlist = va_arg(va, char **);
668#endif
669 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
670 va_end(va);
671 return retval;
672}
673
674
675static int
676vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 PyObject *args;
678 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000679 char *format;
680 char **kwlist;
681 va_list *p_va;
682{
683 char msgbuf[256];
684 int levels[32];
685 char *fname = NULL;
686 char *message = NULL;
687 int min = -1;
688 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000689 char *formatsave = format;
690 int i, len, tplen, kwlen;
691 char *msg, *ks, **p;
692 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000694
695 /* nested tuples cannot be parsed when using keyword arguments */
696
697 for (;;) {
698 int c = *format++;
699 if (c == '(') {
700 PyErr_SetString(PyExc_SystemError,
701 "tuple found in format when using keyword arguments");
702 return 0;
703 }
704 else if (c == '\0')
705 break;
706 else if (c == ':') {
707 fname = format;
708 break;
709 }
710 else if (c == ';') {
711 message = format;
712 break;
713 }
714 else if (isalpha(c))
715 max++;
716 else if (c == '|')
717 min = max;
718 }
719
720 if (min < 0)
721 min = max;
722
723 format = formatsave;
724
725 if (!PyTuple_Check(args)) {
726 PyErr_SetString(PyExc_SystemError,
727 "new style getargs format but argument is not a tuple");
728 return 0;
729 }
730
731 tplen = PyTuple_Size(args);
732
733 /* do a cursory check of the keywords just to see how many we got */
734
735 if (keywords) {
736 if (!PyDict_Check(keywords)) {
737 PyErr_SetString(PyExc_SystemError,
738 "non-dictionary object received when keyword dictionary expected");
739 return 0;
740 }
741 kwlen = PyDict_Size(keywords);
742 }
743 else {
744 kwlen = 0;
745 }
746
747 /* make sure there are no duplicate values for an argument;
748 its not clear when to use the term "keyword argument vs.
749 keyword parameter in messages */
750
751 if (keywords) {
752 for (i = 0; i < tplen; i++) {
753 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
754 sprintf(msgbuf,
755 "keyword parameter %s redefined",
756 kwlist[i]);
757 PyErr_SetString(PyExc_TypeError, msgbuf);
758 return 0;
759 }
760 }
761 }
762 PyErr_Clear(); /* I'm not which Py functions set the error string */
763
764 /* required arguments missing from args can be supplied by keyword
765 arguments */
766
767 len = tplen;
768 if (keywords && tplen < min) {
769 for (i = tplen; i < min; i++) {
770 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
771 len++;
772 }
773 }
774 }
775 PyErr_Clear();
776
777 /* make sure we got an acceptable number of arguments; the message
778 is a little confusing with keywords since keyword arguments
779 which are supplied, but don't match the required arguments
780 are not included in the "%d given" part of the message */
781
782 if (len < min || max < len) {
783 if (message == NULL) {
784 sprintf(msgbuf,
785 "%s requires %s %d argument%s; %d given",
786 fname==NULL ? "function" : fname,
787 min==max ? "exactly"
788 : len < min ? "at least" : "at most",
789 len < min ? min : max,
790 (len < min ? min : max) == 1 ? "" : "s",
791 len);
792 message = msgbuf;
793 }
794 PyErr_SetString(PyExc_TypeError, message);
795 return 0;
796 }
797
798 for (i = 0; i < tplen; i++) {
799 if (*format == '|')
800 format++;
801 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
802 levels, msgbuf);
803 if (msg) {
804 seterror(i+1, msg, levels, fname, message);
805 return 0;
806 }
807 }
808
809 /* handle no keyword parameters in call */
810
811 if (!keywords) return 1;
812
813 /* make sure the number of keywords in the keyword list matches the
814 number of items in the format string */
815
816 nkwds = 0;
817 p = kwlist;
818 for (;;) {
819 if (!*(p++)) break;
820 nkwds++;
821 }
822
823 if (nkwds != max) {
824 PyErr_SetString(PyExc_SystemError,
825 "number of items in format string and keyword list do not match");
826 return 0;
827 }
828
829 /* convert the keyword arguments; this uses the format
830 string where it was left after processing args */
831
832 converted = 0;
833 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +0000835 if (*format == '|')
836 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000837 item = PyMapping_GetItemString(keywords, kwlist[i]);
838 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +0000839 msg = convertitem(item, &format, p_va, levels, msgbuf);
840 if (msg) {
841 seterror(i+1, msg, levels, fname, message);
842 return 0;
843 }
844 converted++;
845 }
846 else {
847 PyErr_Clear();
848 msg = skipitem(&format, p_va);
849 if (msg) {
850 seterror(i+1, msg, levels, fname, message);
851 return 0;
852 }
853 }
854 }
855
856 /* make sure there are no extraneous keyword arguments */
857
858 pos = 0;
859 if (converted < kwlen) {
860 while (PyDict_Next(keywords, &pos, &key, &value)) {
861 match = 0;
862 ks = PyString_AsString(key);
863 for (i = 0; i < nkwds; i++) {
864 if (!strcmp(ks, kwlist[i])) {
865 match = 1;
866 break;
867 }
868 }
869 if (!match) {
870 sprintf(msgbuf,
871 "%s is an invalid keyword argument for this function",
872 ks);
873 PyErr_SetString(PyExc_TypeError, msgbuf);
874 return 0;
875 }
876 }
877 }
878
879 return 1;
880}
881
882
883static char *
884skipitem(p_format, p_va)
885 char **p_format;
886 va_list *p_va;
887{
888 char *format = *p_format;
889 char c = *format++;
890
891 switch (c) {
892
893 case 'b': /* byte -- very short int */
894 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000895 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000896 break;
897 }
898
899 case 'h': /* short int */
900 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000901 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000902 break;
903 }
904
905 case 'i': /* int */
906 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000907 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000908 break;
909 }
910
911 case 'l': /* long int */
912 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000913 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000914 break;
915 }
916
917 case 'f': /* float */
918 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000919 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000920 break;
921 }
922
923 case 'd': /* double */
924 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000925 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000926 break;
927 }
928
929#ifndef WITHOUT_COMPLEX
930 case 'D': /* complex double */
931 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000932 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000933 break;
934 }
935#endif /* WITHOUT_COMPLEX */
936
937 case 'c': /* char */
938 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000939 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000940 break;
941 }
942
943 case 's': /* string */
944 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000945 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +0000946 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000947 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000948 format++;
949 }
950 break;
951 }
952
953 case 'z': /* string */
954 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000955 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +0000956 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000957 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000958 format++;
959 }
960 break;
961 }
962
963 case 'S': /* string object */
964 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000965 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +0000966 break;
967 }
968
969 case 'O': /* object */
970 {
Guido van Rossumaa354651996-08-19 19:32:04 +0000971 if (*format == '!') {
972 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 (void) va_arg(*p_va, PyTypeObject*);
974 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +0000975 }
976#if 0
977/* I don't know what this is for */
978 else if (*format == '?') {
979 inquiry pred = va_arg(*p_va, inquiry);
980 format++;
981 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +0000983 }
984 }
985#endif
986 else if (*format == '&') {
987 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000988 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +0000989 (void) va_arg(*p_va, converter);
990 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000991 format++;
992 }
993 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000994 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +0000995 }
996 break;
997 }
998
999 default:
1000 return "impossible<bad format char>";
1001
1002 }
1003
1004 *p_format = format;
1005 return NULL;
1006}