blob: 7931b33cf96924d2ecb8ed38e68e5600e35ec7a4 [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
260 if (*format != '\0' && !isalpha(*format) &&
261 *format != '|' && *format != ':' && *format != ';') {
262 PyErr_Format(PyExc_SystemError,
263 "bad format string: %s", formatsave);
264 return 0;
265 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000266
267 return 1;
268}
269
270
271
272static void
273seterror(iarg, msg, levels, fname, message)
274 int iarg;
275 char *msg;
276 int *levels;
277 char *fname;
278 char *message;
279{
280 char buf[256];
281 int i;
282 char *p = buf;
283
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000285 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000286 if (iarg == 0 && message == NULL)
287 message = msg;
288 else if (message == NULL) {
289 if (fname != NULL) {
290 sprintf(p, "%s, ", fname);
291 p += strlen(p);
292 }
293 sprintf(p, "argument %d", iarg);
294 i = 0;
295 p += strlen(p);
296 while (levels[i] > 0) {
297 sprintf(p, ", item %d", levels[i]-1);
298 p += strlen(p);
299 i++;
300 }
301 sprintf(p, ": expected %s found", msg);
302 message = buf;
303 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000305}
306
307
308/* Convert a tuple argument.
309 On entry, *p_format points to the character _after_ the opening '('.
310 On successful exit, *p_format points to the closing ')'.
311 If successful:
312 *p_format and *p_va are updated,
313 *levels and *msgbuf are untouched,
314 and NULL is returned.
315 If the argument is invalid:
316 *p_format is unchanged,
317 *p_va is undefined,
318 *levels is a 0-terminated list of item numbers,
319 *msgbuf contains an error message, whose format is:
320 "<typename1>, <typename2>", where:
321 <typename1> is the name of the expected type, and
322 <typename2> is the name of the actual type,
323 (so you can surround it by "expected ... found"),
324 and msgbuf is returned.
325*/
326
327static char *
328converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000329 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000330 char **p_format;
331 va_list *p_va;
332 int *levels;
333 char *msgbuf;
334 int toplevel;
335{
336 int level = 0;
337 int n = 0;
338 char *format = *p_format;
339 int i;
340
341 for (;;) {
342 int c = *format++;
343 if (c == '(') {
344 if (level == 0)
345 n++;
346 level++;
347 }
348 else if (c == ')') {
349 if (level == 0)
350 break;
351 level--;
352 }
353 else if (c == ':' || c == ';' || c == '\0')
354 break;
355 else if (level == 0 && isalpha(c))
356 n++;
357 }
358
Guido van Rossum79f25d91997-04-29 20:08:16 +0000359 if (!PyTuple_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000360 levels[0] = 0;
361 sprintf(msgbuf,
362 toplevel ? "%d arguments, %s" : "%d-tuple, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000364 return msgbuf;
365 }
366
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 if ((i = PyTuple_Size(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000368 levels[0] = 0;
369 sprintf(msgbuf,
370 toplevel ? "%d arguments, %d" : "%d-tuple, %d-tuple",
371 n, i);
372 return msgbuf;
373 }
374
375 format = *p_format;
376 for (i = 0; i < n; i++) {
377 char *msg;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000378 msg = convertitem(PyTuple_GetItem(arg, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000379 levels+1, msgbuf);
380 if (msg != NULL) {
381 levels[0] = i+1;
382 return msg;
383 }
384 }
385
386 *p_format = format;
387 return NULL;
388}
389
390
391/* Convert a single item. */
392
393static char *
394convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000395 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000396 char **p_format;
397 va_list *p_va;
398 int *levels;
399 char *msgbuf;
400{
401 char *msg;
402 char *format = *p_format;
403
404 if (*format == '(' /* ')' */) {
405 format++;
406 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
407 if (msg == NULL)
408 format++;
409 }
410 else {
411 msg = convertsimple(arg, &format, p_va, msgbuf);
412 if (msg != NULL)
413 levels[0] = 0;
414 }
415 if (msg == NULL)
416 *p_format = format;
417 return msg;
418}
419
420
421/* Convert a non-tuple argument. Adds to convertsimple1 functionality
422 by appending ", <actual argument type>" to error message. */
423
424static char *
425convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000427 char **p_format;
428 va_list *p_va;
429 char *msgbuf;
430{
431 char *msg = convertsimple1(arg, p_format, p_va);
432 if (msg != NULL) {
433 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000435 msg = msgbuf;
436 }
437 return msg;
438}
439
440
441/* Convert a non-tuple argument. Return NULL if conversion went OK,
442 or a string representing the expected type if the conversion failed.
443 When failing, an exception may or may not have been raised.
444 Don't call if a tuple is expected. */
445
446static char *
447convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000449 char **p_format;
450 va_list *p_va;
451{
452 char *format = *p_format;
453 char c = *format++;
454
455 switch (c) {
456
457 case 'b': /* byte -- very short int */
458 {
459 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 long ival = PyInt_AsLong(arg);
461 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000462 return "integer<b>";
463 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000464 *p = (char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000465 break;
466 }
467
468 case 'h': /* short int */
469 {
470 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 long ival = PyInt_AsLong(arg);
472 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000473 return "integer<h>";
474 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000475 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000476 break;
477 }
478
479 case 'i': /* int */
480 {
481 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482 long ival = PyInt_AsLong(arg);
483 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000484 return "integer<i>";
485 else
486 *p = ival;
487 break;
488 }
489
490 case 'l': /* long int */
491 {
492 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 long ival = PyInt_AsLong(arg);
494 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000495 return "integer<l>";
496 else
497 *p = ival;
498 break;
499 }
500
501 case 'f': /* float */
502 {
503 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504 double dval = PyFloat_AsDouble(arg);
505 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000506 return "float<f>";
507 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000508 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000509 break;
510 }
511
512 case 'd': /* double */
513 {
514 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 double dval = PyFloat_AsDouble(arg);
516 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000517 return "float<d>";
518 else
519 *p = dval;
520 break;
521 }
522
Guido van Rossum530956d1996-07-21 02:27:43 +0000523#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000524 case 'D': /* complex double */
525 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000526 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000527 Py_complex cval;
528 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000530 return "complex<D>";
531 else
532 *p = cval;
533 break;
534 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000535#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000536
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000537 case 'c': /* char */
538 {
539 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 if (PyString_Check(arg) && PyString_Size(arg) == 1)
541 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000542 else
543 return "char";
544 break;
545 }
546
547 case 's': /* string */
548 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000549 if (*format == '#') { /* any buffer-like object */
550 void **p = (void **)va_arg(*p_va, char **);
551 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000552 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000553 int count;
554
555 if ( pb == NULL ||
556 pb->bf_getreadbuffer == NULL ||
557 pb->bf_getsegcount == NULL )
558 return "read-only buffer";
559 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
560 return "single-segment read-only buffer";
561 if ( (count =
562 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
563 return "(unspecified)";
564 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000565 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000566 } else {
567 char **p = va_arg(*p_va, char **);
568
569 if (PyString_Check(arg))
570 *p = PyString_AsString(arg);
571 else
572 return "string";
573 if ((int)strlen(*p) != PyString_Size(arg))
574 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000575 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000576 break;
577 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000578
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000579 case 'z': /* string, may be NULL (None) */
580 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000581 if (*format == '#') { /* any buffer-like object */
582 void **p = (void **)va_arg(*p_va, char **);
583 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000584 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000585 int count;
586
587 if (arg == Py_None) {
588 *p = 0;
589 *q = 0;
590 } else {
591 if ( pb == NULL ||
592 pb->bf_getreadbuffer == NULL ||
593 pb->bf_getsegcount == NULL )
594 return "read-only buffer";
595 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
596 return "single-segment read-only buffer";
597 if ( (count = (*pb->bf_getreadbuffer)
598 (arg, 0, p)) < 0 )
599 return "(unspecified)";
600 *q = count;
601 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000602 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000603 } else {
604 char **p = va_arg(*p_va, char **);
605
606 if (arg == Py_None)
607 *p = 0;
608 else if (PyString_Check(arg))
609 *p = PyString_AsString(arg);
610 else
611 return "None or string";
612 if (*format == '#') {
613 int *q = va_arg(*p_va, int *);
614 if (arg == Py_None)
615 *q = 0;
616 else
617 *q = PyString_Size(arg);
618 format++;
619 }
620 else if (*p != NULL &&
621 (int)strlen(*p) != PyString_Size(arg))
622 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000623 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000624 break;
625 }
626
627 case 'S': /* string object */
628 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 PyObject **p = va_arg(*p_va, PyObject **);
630 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000631 *p = arg;
632 else
633 return "string";
634 break;
635 }
636
637 case 'O': /* object */
638 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 PyTypeObject *type;
640 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000641 if (*format == '!') {
642 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000644 if (arg->ob_type != type)
645 return type->tp_name;
646 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000648 *p = arg;
649 }
650 }
651 else if (*format == '?') {
652 inquiry pred = va_arg(*p_va, inquiry);
653 format++;
654 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000656 *p = arg;
657 }
658 }
659 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000660 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000662 converter convert = va_arg(*p_va, converter);
663 void *addr = va_arg(*p_va, void *);
664 format++;
665 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000666 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000667 }
668 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000670 *p = arg;
671 }
672 break;
673 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000674
675
676 case 'w': /* memory buffer, read-write access */
677 {
678 void **p = va_arg(*p_va, void **);
679 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
680 int count;
681
682 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
683 pb->bf_getsegcount == NULL )
684 return "read-write buffer";
685 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
686 return "single-segment read-write buffer";
687 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
688 return "(unspecified)";
689 if (*format == '#') {
690 int *q = va_arg(*p_va, int *);
691
692 *q = count;
693 format++;
694 }
695 break;
696 }
697
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000698
699 default:
700 return "impossible<bad format char>";
701
702 }
703
704 *p_format = format;
705 return NULL;
706}
Guido van Rossumaa354651996-08-19 19:32:04 +0000707
708
709/* Support for keyword arguments donated by
710 Geoff Philbrick <philbric@delphi.hks.com> */
711
712#ifdef HAVE_STDARG_PROTOTYPES
713/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714int PyArg_ParseTupleAndKeywords(PyObject *args,
715 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000716 char *format,
717 char **kwlist, ...)
718#else
719/* VARARGS */
720int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
721#endif
722{
723 int retval;
724 va_list va;
725#ifdef HAVE_STDARG_PROTOTYPES
726
727 va_start(va, kwlist);
728#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000729 PyObject *args;
730 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000731 char *format;
732 char **kwlist;
733
734 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000735 args = va_arg(va, PyObject *);
736 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000737 format = va_arg(va, char *);
738 kwlist = va_arg(va, char **);
739#endif
740 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
741 va_end(va);
742 return retval;
743}
744
745
746static int
747vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000748 PyObject *args;
749 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000750 char *format;
751 char **kwlist;
752 va_list *p_va;
753{
754 char msgbuf[256];
755 int levels[32];
756 char *fname = NULL;
757 char *message = NULL;
758 int min = -1;
759 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000760 char *formatsave = format;
761 int i, len, tplen, kwlen;
762 char *msg, *ks, **p;
763 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000765
766 /* nested tuples cannot be parsed when using keyword arguments */
767
768 for (;;) {
769 int c = *format++;
770 if (c == '(') {
771 PyErr_SetString(PyExc_SystemError,
772 "tuple found in format when using keyword arguments");
773 return 0;
774 }
775 else if (c == '\0')
776 break;
777 else if (c == ':') {
778 fname = format;
779 break;
780 }
781 else if (c == ';') {
782 message = format;
783 break;
784 }
785 else if (isalpha(c))
786 max++;
787 else if (c == '|')
788 min = max;
789 }
790
791 if (min < 0)
792 min = max;
793
794 format = formatsave;
795
796 if (!PyTuple_Check(args)) {
797 PyErr_SetString(PyExc_SystemError,
798 "new style getargs format but argument is not a tuple");
799 return 0;
800 }
801
802 tplen = PyTuple_Size(args);
803
804 /* do a cursory check of the keywords just to see how many we got */
805
806 if (keywords) {
807 if (!PyDict_Check(keywords)) {
808 PyErr_SetString(PyExc_SystemError,
809 "non-dictionary object received when keyword dictionary expected");
810 return 0;
811 }
812 kwlen = PyDict_Size(keywords);
813 }
814 else {
815 kwlen = 0;
816 }
817
818 /* make sure there are no duplicate values for an argument;
819 its not clear when to use the term "keyword argument vs.
820 keyword parameter in messages */
821
822 if (keywords) {
823 for (i = 0; i < tplen; i++) {
824 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
825 sprintf(msgbuf,
826 "keyword parameter %s redefined",
827 kwlist[i]);
828 PyErr_SetString(PyExc_TypeError, msgbuf);
829 return 0;
830 }
831 }
832 }
833 PyErr_Clear(); /* I'm not which Py functions set the error string */
834
835 /* required arguments missing from args can be supplied by keyword
836 arguments */
837
838 len = tplen;
839 if (keywords && tplen < min) {
840 for (i = tplen; i < min; i++) {
841 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
842 len++;
843 }
844 }
845 }
846 PyErr_Clear();
847
848 /* make sure we got an acceptable number of arguments; the message
849 is a little confusing with keywords since keyword arguments
850 which are supplied, but don't match the required arguments
851 are not included in the "%d given" part of the message */
852
853 if (len < min || max < len) {
854 if (message == NULL) {
855 sprintf(msgbuf,
856 "%s requires %s %d argument%s; %d given",
857 fname==NULL ? "function" : fname,
858 min==max ? "exactly"
859 : len < min ? "at least" : "at most",
860 len < min ? min : max,
861 (len < min ? min : max) == 1 ? "" : "s",
862 len);
863 message = msgbuf;
864 }
865 PyErr_SetString(PyExc_TypeError, message);
866 return 0;
867 }
868
869 for (i = 0; i < tplen; i++) {
870 if (*format == '|')
871 format++;
872 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
873 levels, msgbuf);
874 if (msg) {
875 seterror(i+1, msg, levels, fname, message);
876 return 0;
877 }
878 }
879
880 /* handle no keyword parameters in call */
881
882 if (!keywords) return 1;
883
884 /* make sure the number of keywords in the keyword list matches the
885 number of items in the format string */
886
887 nkwds = 0;
888 p = kwlist;
889 for (;;) {
890 if (!*(p++)) break;
891 nkwds++;
892 }
893
894 if (nkwds != max) {
895 PyErr_SetString(PyExc_SystemError,
896 "number of items in format string and keyword list do not match");
897 return 0;
898 }
899
900 /* convert the keyword arguments; this uses the format
901 string where it was left after processing args */
902
903 converted = 0;
904 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +0000906 if (*format == '|')
907 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000908 item = PyMapping_GetItemString(keywords, kwlist[i]);
909 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +0000910 msg = convertitem(item, &format, p_va, levels, msgbuf);
911 if (msg) {
912 seterror(i+1, msg, levels, fname, message);
913 return 0;
914 }
915 converted++;
916 }
917 else {
918 PyErr_Clear();
919 msg = skipitem(&format, p_va);
920 if (msg) {
921 seterror(i+1, msg, levels, fname, message);
922 return 0;
923 }
924 }
925 }
926
927 /* make sure there are no extraneous keyword arguments */
928
929 pos = 0;
930 if (converted < kwlen) {
931 while (PyDict_Next(keywords, &pos, &key, &value)) {
932 match = 0;
933 ks = PyString_AsString(key);
934 for (i = 0; i < nkwds; i++) {
935 if (!strcmp(ks, kwlist[i])) {
936 match = 1;
937 break;
938 }
939 }
940 if (!match) {
941 sprintf(msgbuf,
942 "%s is an invalid keyword argument for this function",
943 ks);
944 PyErr_SetString(PyExc_TypeError, msgbuf);
945 return 0;
946 }
947 }
948 }
949
950 return 1;
951}
952
953
954static char *
955skipitem(p_format, p_va)
956 char **p_format;
957 va_list *p_va;
958{
959 char *format = *p_format;
960 char c = *format++;
961
962 switch (c) {
963
964 case 'b': /* byte -- very short int */
965 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000966 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000967 break;
968 }
969
970 case 'h': /* short int */
971 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000972 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000973 break;
974 }
975
976 case 'i': /* int */
977 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000978 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000979 break;
980 }
981
982 case 'l': /* long int */
983 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000984 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000985 break;
986 }
987
988 case 'f': /* float */
989 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000990 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000991 break;
992 }
993
994 case 'd': /* double */
995 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000996 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000997 break;
998 }
999
1000#ifndef WITHOUT_COMPLEX
1001 case 'D': /* complex double */
1002 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001003 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001004 break;
1005 }
1006#endif /* WITHOUT_COMPLEX */
1007
1008 case 'c': /* char */
1009 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001010 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001011 break;
1012 }
1013
1014 case 's': /* string */
1015 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001016 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001017 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001018 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001019 format++;
1020 }
1021 break;
1022 }
1023
1024 case 'z': /* string */
1025 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001026 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001027 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001028 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001029 format++;
1030 }
1031 break;
1032 }
1033
1034 case 'S': /* string object */
1035 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001037 break;
1038 }
1039
1040 case 'O': /* object */
1041 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001042 if (*format == '!') {
1043 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 (void) va_arg(*p_va, PyTypeObject*);
1045 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001046 }
1047#if 0
1048/* I don't know what this is for */
1049 else if (*format == '?') {
1050 inquiry pred = va_arg(*p_va, inquiry);
1051 format++;
1052 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001053 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001054 }
1055 }
1056#endif
1057 else if (*format == '&') {
1058 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +00001060 (void) va_arg(*p_va, converter);
1061 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001062 format++;
1063 }
1064 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001065 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001066 }
1067 break;
1068 }
1069
1070 default:
1071 return "impossible<bad format char>";
1072
1073 }
1074
1075 *p_format = format;
1076 return NULL;
1077}