blob: f166921cbf12e7a3ce274dfe5aeb73d7ceb008f4 [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 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000542 if (*format == '#') { /* any buffer-like object */
543 void **p = (void **)va_arg(*p_va, char **);
544 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000545 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000546 int count;
547
548 if ( pb == NULL ||
549 pb->bf_getreadbuffer == NULL ||
550 pb->bf_getsegcount == NULL )
551 return "read-only buffer";
552 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
553 return "single-segment read-only buffer";
554 if ( (count =
555 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
556 return "(unspecified)";
557 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000558 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000559 } else {
560 char **p = va_arg(*p_va, char **);
561
562 if (PyString_Check(arg))
563 *p = PyString_AsString(arg);
564 else
565 return "string";
566 if ((int)strlen(*p) != PyString_Size(arg))
567 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000568 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000569 break;
570 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000571
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000572 case 'z': /* string, may be NULL (None) */
573 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000574 if (*format == '#') { /* any buffer-like object */
575 void **p = (void **)va_arg(*p_va, char **);
576 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000577 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000578 int count;
579
580 if (arg == Py_None) {
581 *p = 0;
582 *q = 0;
583 } else {
584 if ( pb == NULL ||
585 pb->bf_getreadbuffer == NULL ||
586 pb->bf_getsegcount == NULL )
587 return "read-only buffer";
588 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
589 return "single-segment read-only buffer";
590 if ( (count = (*pb->bf_getreadbuffer)
591 (arg, 0, p)) < 0 )
592 return "(unspecified)";
593 *q = count;
594 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000595 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000596 } else {
597 char **p = va_arg(*p_va, char **);
598
599 if (arg == Py_None)
600 *p = 0;
601 else if (PyString_Check(arg))
602 *p = PyString_AsString(arg);
603 else
604 return "None or string";
605 if (*format == '#') {
606 int *q = va_arg(*p_va, int *);
607 if (arg == Py_None)
608 *q = 0;
609 else
610 *q = PyString_Size(arg);
611 format++;
612 }
613 else if (*p != NULL &&
614 (int)strlen(*p) != PyString_Size(arg))
615 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000616 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000617 break;
618 }
619
620 case 'S': /* string object */
621 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000622 PyObject **p = va_arg(*p_va, PyObject **);
623 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000624 *p = arg;
625 else
626 return "string";
627 break;
628 }
629
630 case 'O': /* object */
631 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632 PyTypeObject *type;
633 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000634 if (*format == '!') {
635 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000637 if (arg->ob_type != type)
638 return type->tp_name;
639 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000641 *p = arg;
642 }
643 }
644 else if (*format == '?') {
645 inquiry pred = va_arg(*p_va, inquiry);
646 format++;
647 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000649 *p = arg;
650 }
651 }
652 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000653 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000654 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000655 converter convert = va_arg(*p_va, converter);
656 void *addr = va_arg(*p_va, void *);
657 format++;
658 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000659 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000660 }
661 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000663 *p = arg;
664 }
665 break;
666 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000667
668
669 case 'w': /* memory buffer, read-write access */
670 {
671 void **p = va_arg(*p_va, void **);
672 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
673 int count;
674
675 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
676 pb->bf_getsegcount == NULL )
677 return "read-write buffer";
678 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
679 return "single-segment read-write buffer";
680 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
681 return "(unspecified)";
682 if (*format == '#') {
683 int *q = va_arg(*p_va, int *);
684
685 *q = count;
686 format++;
687 }
688 break;
689 }
690
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000691
692 default:
693 return "impossible<bad format char>";
694
695 }
696
697 *p_format = format;
698 return NULL;
699}
Guido van Rossumaa354651996-08-19 19:32:04 +0000700
701
702/* Support for keyword arguments donated by
703 Geoff Philbrick <philbric@delphi.hks.com> */
704
705#ifdef HAVE_STDARG_PROTOTYPES
706/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000707int PyArg_ParseTupleAndKeywords(PyObject *args,
708 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000709 char *format,
710 char **kwlist, ...)
711#else
712/* VARARGS */
713int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
714#endif
715{
716 int retval;
717 va_list va;
718#ifdef HAVE_STDARG_PROTOTYPES
719
720 va_start(va, kwlist);
721#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000722 PyObject *args;
723 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000724 char *format;
725 char **kwlist;
726
727 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000728 args = va_arg(va, PyObject *);
729 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000730 format = va_arg(va, char *);
731 kwlist = va_arg(va, char **);
732#endif
733 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
734 va_end(va);
735 return retval;
736}
737
738
739static int
740vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 PyObject *args;
742 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000743 char *format;
744 char **kwlist;
745 va_list *p_va;
746{
747 char msgbuf[256];
748 int levels[32];
749 char *fname = NULL;
750 char *message = NULL;
751 int min = -1;
752 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000753 char *formatsave = format;
754 int i, len, tplen, kwlen;
755 char *msg, *ks, **p;
756 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000758
759 /* nested tuples cannot be parsed when using keyword arguments */
760
761 for (;;) {
762 int c = *format++;
763 if (c == '(') {
764 PyErr_SetString(PyExc_SystemError,
765 "tuple found in format when using keyword arguments");
766 return 0;
767 }
768 else if (c == '\0')
769 break;
770 else if (c == ':') {
771 fname = format;
772 break;
773 }
774 else if (c == ';') {
775 message = format;
776 break;
777 }
778 else if (isalpha(c))
779 max++;
780 else if (c == '|')
781 min = max;
782 }
783
784 if (min < 0)
785 min = max;
786
787 format = formatsave;
788
789 if (!PyTuple_Check(args)) {
790 PyErr_SetString(PyExc_SystemError,
791 "new style getargs format but argument is not a tuple");
792 return 0;
793 }
794
795 tplen = PyTuple_Size(args);
796
797 /* do a cursory check of the keywords just to see how many we got */
798
799 if (keywords) {
800 if (!PyDict_Check(keywords)) {
801 PyErr_SetString(PyExc_SystemError,
802 "non-dictionary object received when keyword dictionary expected");
803 return 0;
804 }
805 kwlen = PyDict_Size(keywords);
806 }
807 else {
808 kwlen = 0;
809 }
810
811 /* make sure there are no duplicate values for an argument;
812 its not clear when to use the term "keyword argument vs.
813 keyword parameter in messages */
814
815 if (keywords) {
816 for (i = 0; i < tplen; i++) {
817 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
818 sprintf(msgbuf,
819 "keyword parameter %s redefined",
820 kwlist[i]);
821 PyErr_SetString(PyExc_TypeError, msgbuf);
822 return 0;
823 }
824 }
825 }
826 PyErr_Clear(); /* I'm not which Py functions set the error string */
827
828 /* required arguments missing from args can be supplied by keyword
829 arguments */
830
831 len = tplen;
832 if (keywords && tplen < min) {
833 for (i = tplen; i < min; i++) {
834 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
835 len++;
836 }
837 }
838 }
839 PyErr_Clear();
840
841 /* make sure we got an acceptable number of arguments; the message
842 is a little confusing with keywords since keyword arguments
843 which are supplied, but don't match the required arguments
844 are not included in the "%d given" part of the message */
845
846 if (len < min || max < len) {
847 if (message == NULL) {
848 sprintf(msgbuf,
849 "%s requires %s %d argument%s; %d given",
850 fname==NULL ? "function" : fname,
851 min==max ? "exactly"
852 : len < min ? "at least" : "at most",
853 len < min ? min : max,
854 (len < min ? min : max) == 1 ? "" : "s",
855 len);
856 message = msgbuf;
857 }
858 PyErr_SetString(PyExc_TypeError, message);
859 return 0;
860 }
861
862 for (i = 0; i < tplen; i++) {
863 if (*format == '|')
864 format++;
865 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
866 levels, msgbuf);
867 if (msg) {
868 seterror(i+1, msg, levels, fname, message);
869 return 0;
870 }
871 }
872
873 /* handle no keyword parameters in call */
874
875 if (!keywords) return 1;
876
877 /* make sure the number of keywords in the keyword list matches the
878 number of items in the format string */
879
880 nkwds = 0;
881 p = kwlist;
882 for (;;) {
883 if (!*(p++)) break;
884 nkwds++;
885 }
886
887 if (nkwds != max) {
888 PyErr_SetString(PyExc_SystemError,
889 "number of items in format string and keyword list do not match");
890 return 0;
891 }
892
893 /* convert the keyword arguments; this uses the format
894 string where it was left after processing args */
895
896 converted = 0;
897 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +0000899 if (*format == '|')
900 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000901 item = PyMapping_GetItemString(keywords, kwlist[i]);
902 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +0000903 msg = convertitem(item, &format, p_va, levels, msgbuf);
904 if (msg) {
905 seterror(i+1, msg, levels, fname, message);
906 return 0;
907 }
908 converted++;
909 }
910 else {
911 PyErr_Clear();
912 msg = skipitem(&format, p_va);
913 if (msg) {
914 seterror(i+1, msg, levels, fname, message);
915 return 0;
916 }
917 }
918 }
919
920 /* make sure there are no extraneous keyword arguments */
921
922 pos = 0;
923 if (converted < kwlen) {
924 while (PyDict_Next(keywords, &pos, &key, &value)) {
925 match = 0;
926 ks = PyString_AsString(key);
927 for (i = 0; i < nkwds; i++) {
928 if (!strcmp(ks, kwlist[i])) {
929 match = 1;
930 break;
931 }
932 }
933 if (!match) {
934 sprintf(msgbuf,
935 "%s is an invalid keyword argument for this function",
936 ks);
937 PyErr_SetString(PyExc_TypeError, msgbuf);
938 return 0;
939 }
940 }
941 }
942
943 return 1;
944}
945
946
947static char *
948skipitem(p_format, p_va)
949 char **p_format;
950 va_list *p_va;
951{
952 char *format = *p_format;
953 char c = *format++;
954
955 switch (c) {
956
957 case 'b': /* byte -- very short int */
958 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000959 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000960 break;
961 }
962
963 case 'h': /* short int */
964 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000965 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000966 break;
967 }
968
969 case 'i': /* int */
970 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000971 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000972 break;
973 }
974
975 case 'l': /* long int */
976 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000977 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000978 break;
979 }
980
981 case 'f': /* float */
982 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000983 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000984 break;
985 }
986
987 case 'd': /* double */
988 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000989 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000990 break;
991 }
992
993#ifndef WITHOUT_COMPLEX
994 case 'D': /* complex double */
995 {
Guido van Rossum80bb9651996-12-05 23:27:02 +0000996 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000997 break;
998 }
999#endif /* WITHOUT_COMPLEX */
1000
1001 case 'c': /* char */
1002 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001003 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001004 break;
1005 }
1006
1007 case 's': /* string */
1008 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001009 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001010 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001011 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001012 format++;
1013 }
1014 break;
1015 }
1016
1017 case 'z': /* string */
1018 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001019 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001020 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001021 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001022 format++;
1023 }
1024 break;
1025 }
1026
1027 case 'S': /* string object */
1028 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001029 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001030 break;
1031 }
1032
1033 case 'O': /* object */
1034 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001035 if (*format == '!') {
1036 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 (void) va_arg(*p_va, PyTypeObject*);
1038 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001039 }
1040#if 0
1041/* I don't know what this is for */
1042 else if (*format == '?') {
1043 inquiry pred = va_arg(*p_va, inquiry);
1044 format++;
1045 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001047 }
1048 }
1049#endif
1050 else if (*format == '&') {
1051 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001052 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +00001053 (void) va_arg(*p_va, converter);
1054 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001055 format++;
1056 }
1057 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001058 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001059 }
1060 break;
1061 }
1062
1063 default:
1064 return "impossible<bad format char>";
1065
1066 }
1067
1068 *p_format = format;
1069 return NULL;
1070}