blob: 69ef16797ac424cd9ad36ff8f75be499a83dd9f6 [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 */
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000181 else if (c == 'e')
182 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000183 else if (isalpha(c))
184 max++;
185 else if (c == '|')
186 min = max;
187 }
188
189 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000191
192 if (min < 0)
193 min = max;
194
195 format = formatsave;
196
197 if (compat) {
198 if (max == 0) {
199 if (args == NULL)
200 return 1;
201 sprintf(msgbuf, "%s requires no arguments",
202 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000204 return 0;
205 }
206 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000207 if (args == NULL) {
208 sprintf(msgbuf,
209 "%s requires at least one argument",
210 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000212 return 0;
213 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000214 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000215 if (msg == NULL)
216 return 1;
217 seterror(levels[0], msg, levels+1, fname, message);
218 return 0;
219 }
220 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000221 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000222 "old style getargs format uses new features");
223 return 0;
224 }
225 }
226
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 if (!PyTuple_Check(args)) {
228 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000229 "new style getargs format but argument is not a tuple");
230 return 0;
231 }
232
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000234
235 if (len < min || max < len) {
236 if (message == NULL) {
237 sprintf(msgbuf,
238 "%s requires %s %d argument%s; %d given",
239 fname==NULL ? "function" : fname,
240 min==max ? "exactly"
241 : len < min ? "at least" : "at most",
242 len < min ? min : max,
243 (len < min ? min : max) == 1 ? "" : "s",
244 len);
245 message = msgbuf;
246 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000248 return 0;
249 }
250
251 for (i = 0; i < len; i++) {
252 if (*format == '|')
253 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000255 levels, msgbuf);
256 if (msg) {
257 seterror(i+1, msg, levels, fname, message);
258 return 0;
259 }
260 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000261
Guido van Rossum730806d1998-04-10 22:27:42 +0000262 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000263 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000264 *format != '|' && *format != ':' && *format != ';') {
265 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000266 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000267 return 0;
268 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000269
270 return 1;
271}
272
273
274
275static void
276seterror(iarg, msg, levels, fname, message)
277 int iarg;
278 char *msg;
279 int *levels;
280 char *fname;
281 char *message;
282{
283 char buf[256];
284 int i;
285 char *p = buf;
286
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000288 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000289 if (iarg == 0 && message == NULL)
290 message = msg;
291 else if (message == NULL) {
292 if (fname != NULL) {
293 sprintf(p, "%s, ", fname);
294 p += strlen(p);
295 }
296 sprintf(p, "argument %d", iarg);
297 i = 0;
298 p += strlen(p);
299 while (levels[i] > 0) {
300 sprintf(p, ", item %d", levels[i]-1);
301 p += strlen(p);
302 i++;
303 }
304 sprintf(p, ": expected %s found", msg);
305 message = buf;
306 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000308}
309
310
311/* Convert a tuple argument.
312 On entry, *p_format points to the character _after_ the opening '('.
313 On successful exit, *p_format points to the closing ')'.
314 If successful:
315 *p_format and *p_va are updated,
316 *levels and *msgbuf are untouched,
317 and NULL is returned.
318 If the argument is invalid:
319 *p_format is unchanged,
320 *p_va is undefined,
321 *levels is a 0-terminated list of item numbers,
322 *msgbuf contains an error message, whose format is:
323 "<typename1>, <typename2>", where:
324 <typename1> is the name of the expected type, and
325 <typename2> is the name of the actual type,
326 (so you can surround it by "expected ... found"),
327 and msgbuf is returned.
328*/
329
330static char *
331converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000332 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000333 char **p_format;
334 va_list *p_va;
335 int *levels;
336 char *msgbuf;
337 int toplevel;
338{
339 int level = 0;
340 int n = 0;
341 char *format = *p_format;
342 int i;
343
344 for (;;) {
345 int c = *format++;
346 if (c == '(') {
347 if (level == 0)
348 n++;
349 level++;
350 }
351 else if (c == ')') {
352 if (level == 0)
353 break;
354 level--;
355 }
356 else if (c == ':' || c == ';' || c == '\0')
357 break;
358 else if (level == 0 && isalpha(c))
359 n++;
360 }
361
Guido van Rossum66368cc1999-02-17 23:16:43 +0000362 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000363 levels[0] = 0;
364 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000365 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000367 return msgbuf;
368 }
369
Guido van Rossum66368cc1999-02-17 23:16:43 +0000370 if ((i = PySequence_Length(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000371 levels[0] = 0;
372 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000373 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
374 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000375 return msgbuf;
376 }
377
378 format = *p_format;
379 for (i = 0; i < n; i++) {
380 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000381 PyObject *item;
382 item = PySequence_GetItem(arg, i);
383 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
384 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
385 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000386 if (msg != NULL) {
387 levels[0] = i+1;
388 return msg;
389 }
390 }
391
392 *p_format = format;
393 return NULL;
394}
395
396
397/* Convert a single item. */
398
399static char *
400convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000402 char **p_format;
403 va_list *p_va;
404 int *levels;
405 char *msgbuf;
406{
407 char *msg;
408 char *format = *p_format;
409
410 if (*format == '(' /* ')' */) {
411 format++;
412 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
413 if (msg == NULL)
414 format++;
415 }
416 else {
417 msg = convertsimple(arg, &format, p_va, msgbuf);
418 if (msg != NULL)
419 levels[0] = 0;
420 }
421 if (msg == NULL)
422 *p_format = format;
423 return msg;
424}
425
426
427/* Convert a non-tuple argument. Adds to convertsimple1 functionality
428 by appending ", <actual argument type>" to error message. */
429
430static char *
431convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000433 char **p_format;
434 va_list *p_va;
435 char *msgbuf;
436{
437 char *msg = convertsimple1(arg, p_format, p_va);
438 if (msg != NULL) {
439 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000441 msg = msgbuf;
442 }
443 return msg;
444}
445
446
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000447/* Internal API needed by convertsimple1(): */
448extern
449PyObject *_PyUnicode_AsUTF8String(PyObject *unicode,
450 const char *errors);
451
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000452/* Convert a non-tuple argument. Return NULL if conversion went OK,
453 or a string representing the expected type if the conversion failed.
454 When failing, an exception may or may not have been raised.
455 Don't call if a tuple is expected. */
456
457static char *
458convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000460 char **p_format;
461 va_list *p_va;
462{
463 char *format = *p_format;
464 char c = *format++;
465
466 switch (c) {
467
Fred Drake230cae72000-05-09 21:50:00 +0000468 case 'b': /* unsigned byte -- very short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000469 {
470 char *p = va_arg(*p_va, char *);
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<b>";
Fred Drake230cae72000-05-09 21:50:00 +0000474 else if (ival < 0) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000475 PyErr_SetString(PyExc_OverflowError,
Fred Drake230cae72000-05-09 21:50:00 +0000476 "unsigned byte integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000477 return "integer<b>";
478 }
Fred Drake230cae72000-05-09 21:50:00 +0000479 else if (ival > UCHAR_MAX) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000480 PyErr_SetString(PyExc_OverflowError,
Fred Drake230cae72000-05-09 21:50:00 +0000481 "unsigned byte integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000482 return "integer<b>";
483 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000484 else
Fred Drake230cae72000-05-09 21:50:00 +0000485 *p = (unsigned char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000486 break;
487 }
488
Fred Drake230cae72000-05-09 21:50:00 +0000489 case 'h': /* signed short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000490 {
491 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 long ival = PyInt_AsLong(arg);
493 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000494 return "integer<h>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000495 else if (ival < SHRT_MIN) {
496 PyErr_SetString(PyExc_OverflowError,
Fred Drake230cae72000-05-09 21:50:00 +0000497 "signed short integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000498 return "integer<h>";
499 }
500 else if (ival > SHRT_MAX) {
501 PyErr_SetString(PyExc_OverflowError,
Fred Drake230cae72000-05-09 21:50:00 +0000502 "signed short integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000503 return "integer<h>";
504 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000505 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000506 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000507 break;
508 }
509
Fred Drake230cae72000-05-09 21:50:00 +0000510 case 'i': /* signed int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000511 {
512 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000513 long ival = PyInt_AsLong(arg);
514 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000515 return "integer<i>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000516 else if (ival < INT_MIN) {
517 PyErr_SetString(PyExc_OverflowError,
Fred Drake230cae72000-05-09 21:50:00 +0000518 "signed integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000519 return "integer<i>";
520 }
521 else if (ival > INT_MAX) {
522 PyErr_SetString(PyExc_OverflowError,
Fred Drake230cae72000-05-09 21:50:00 +0000523 "signed integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000524 return "integer<i>";
525 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000526 else
527 *p = ival;
528 break;
529 }
530
531 case 'l': /* long int */
532 {
533 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 long ival = PyInt_AsLong(arg);
535 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000536 return "integer<l>";
537 else
538 *p = ival;
539 break;
540 }
541
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000542#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000543 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000544 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000545 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
546 LONG_LONG ival = PyLong_AsLongLong( arg );
547 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000548 return "long<L>";
549 } else {
550 *p = ival;
551 }
552 break;
553 }
554#endif
555
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000556 case 'f': /* float */
557 {
558 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 double dval = PyFloat_AsDouble(arg);
560 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000561 return "float<f>";
562 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000563 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000564 break;
565 }
566
567 case 'd': /* double */
568 {
569 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 double dval = PyFloat_AsDouble(arg);
571 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000572 return "float<d>";
573 else
574 *p = dval;
575 break;
576 }
577
Guido van Rossum530956d1996-07-21 02:27:43 +0000578#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000579 case 'D': /* complex double */
580 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000581 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000582 Py_complex cval;
583 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000585 return "complex<D>";
586 else
587 *p = cval;
588 break;
589 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000590#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000591
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000592 case 'c': /* char */
593 {
594 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 if (PyString_Check(arg) && PyString_Size(arg) == 1)
596 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000597 else
598 return "char";
599 break;
600 }
601
602 case 's': /* string */
603 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000604 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000605 void **p = (void **)va_arg(*p_va, char **);
606 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000607 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000608 int count;
609
610 if ( pb == NULL ||
611 pb->bf_getreadbuffer == NULL ||
612 pb->bf_getsegcount == NULL )
613 return "read-only buffer";
614 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
615 return "single-segment read-only buffer";
616 if ( (count =
617 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
618 return "(unspecified)";
619 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000620 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000621 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000622 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000623
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000624 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000625 *p = PyString_AS_STRING(arg);
626 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000627 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000628 if (arg == NULL)
629 return "unicode conversion error";
630 *p = PyString_AS_STRING(arg);
631 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000632 else
633 return "string";
634 if ((int)strlen(*p) != PyString_Size(arg))
635 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000636 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000637 break;
638 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000639
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000640 case 'z': /* string, may be NULL (None) */
641 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000642 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000643 void **p = (void **)va_arg(*p_va, char **);
644 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000645 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000646 int count;
647
648 if (arg == Py_None) {
649 *p = 0;
650 *q = 0;
651 } else {
652 if ( pb == NULL ||
653 pb->bf_getreadbuffer == NULL ||
654 pb->bf_getsegcount == NULL )
655 return "read-only buffer";
656 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
657 return "single-segment read-only buffer";
658 if ( (count = (*pb->bf_getreadbuffer)
659 (arg, 0, p)) < 0 )
660 return "(unspecified)";
661 *q = count;
662 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000663 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000664 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000665 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000666
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000667 if (arg == Py_None)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000668 *p = 0;
669 else if (PyString_Check(arg))
670 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000671 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000672 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000673 if (arg == NULL)
674 return "unicode conversion error";
675 *p = PyString_AS_STRING(arg);
676 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000677 else
678 return "None or string";
679 if (*format == '#') {
680 int *q = va_arg(*p_va, int *);
681 if (arg == Py_None)
682 *q = 0;
683 else
684 *q = PyString_Size(arg);
685 format++;
686 }
687 else if (*p != NULL &&
688 (int)strlen(*p) != PyString_Size(arg))
689 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000690 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000691 break;
692 }
693
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000694 case 'e': /* encoded string */
695 {
696 char **buffer;
697 const char *encoding;
698 PyObject *u, *s;
699 int size;
700
701 /* Get 'e' parameter: the encoding name */
702 encoding = (const char *)va_arg(*p_va, const char *);
703 if (encoding == NULL)
704 return "(encoding is NULL)";
705
706 /* Get 's' parameter: the output buffer to use */
707 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000708 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000709 buffer = (char **)va_arg(*p_va, char **);
710 format++;
711 if (buffer == NULL)
712 return "(buffer is NULL)";
713
714 /* Convert object to Unicode */
715 u = PyUnicode_FromObject(arg);
716 if (u == NULL)
717 return "string, unicode or text buffer";
718
719 /* Encode object; use default error handling */
720 s = PyUnicode_AsEncodedString(u,
721 encoding,
722 NULL);
723 Py_DECREF(u);
724 if (s == NULL)
725 return "(encoding failed)";
726 if (!PyString_Check(s)) {
727 Py_DECREF(s);
728 return "(encoder failed to return a string)";
729 }
730 size = PyString_GET_SIZE(s);
731
732 /* Write output; output is guaranteed to be
733 0-terminated */
734 if (*format == '#') {
735 /* Using buffer length parameter '#':
736
737 - if *buffer is NULL, a new buffer
738 of the needed size is allocated and
739 the data copied into it; *buffer is
740 updated to point to the new buffer;
741 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000742 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000743
744 - if *buffer is not NULL, the data
745 is copied to *buffer; *buffer_len
746 has to be set to the size of the
747 buffer on input; buffer overflow is
748 signalled with an error; buffer has
749 to provide enough room for the
750 encoded string plus the trailing
751 0-byte
752
753 - in both cases, *buffer_len is
754 updated to the size of the buffer
755 /excluding/ the trailing 0-byte
756
757 */
758 int *buffer_len = va_arg(*p_va, int *);
759
760 format++;
761 if (buffer_len == NULL)
762 return "(buffer_len is NULL)";
763 if (*buffer == NULL) {
764 *buffer = PyMem_NEW(char, size + 1);
765 if (*buffer == NULL) {
766 Py_DECREF(s);
767 return "(memory error)";
768 }
769 } else {
770 if (size + 1 > *buffer_len) {
771 Py_DECREF(s);
772 return "(buffer overflow)";
773 }
774 }
775 memcpy(*buffer,
776 PyString_AS_STRING(s),
777 size + 1);
778 *buffer_len = size;
779 } else {
780 /* Using a 0-terminated buffer:
781
782 - the encoded string has to be
783 0-terminated for this variant to
784 work; if it is not, an error raised
785
786 - a new buffer of the needed size
787 is allocated and the data copied
788 into it; *buffer is updated to
789 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000790 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000791 after usage
792
793 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000794 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000795 return "(encoded string without "\
796 "NULL bytes)";
797 *buffer = PyMem_NEW(char, size + 1);
798 if (*buffer == NULL) {
799 Py_DECREF(s);
800 return "(memory error)";
801 }
802 memcpy(*buffer,
803 PyString_AS_STRING(s),
804 size + 1);
805 }
806 Py_DECREF(s);
807 break;
808 }
809
Fred Drake25871c02000-05-03 15:17:02 +0000810 case 'u': /* raw unicode buffer (Py_UNICODE *) */
811 {
812 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000813 void **p = (void **)va_arg(*p_va, char **);
814 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Fred Drake25871c02000-05-03 15:17:02 +0000815 int *q = va_arg(*p_va, int *);
816 int count;
817
818 if ( pb == NULL ||
819 pb->bf_getreadbuffer == NULL ||
820 pb->bf_getsegcount == NULL )
821 return "read-only buffer";
822 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
823 return "single-segment read-only buffer";
824 if ( (count =
825 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
826 return "(unspecified)";
827 /* buffer interface returns bytes, we want
828 length in characters */
829 *q = count/(sizeof(Py_UNICODE));
830 format++;
831 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000832 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
Fred Drake25871c02000-05-03 15:17:02 +0000833
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000834 if (PyUnicode_Check(arg))
Fred Drake25871c02000-05-03 15:17:02 +0000835 *p = PyUnicode_AS_UNICODE(arg);
836 else
837 return "unicode";
838 }
839 break;
840 }
841
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000842 case 'S': /* string object */
843 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844 PyObject **p = va_arg(*p_va, PyObject **);
845 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000846 *p = arg;
847 else
848 return "string";
849 break;
850 }
851
Guido van Rossume826ef02000-03-10 23:02:17 +0000852 case 'U': /* Unicode object */
853 {
854 PyObject **p = va_arg(*p_va, PyObject **);
855 if (PyUnicode_Check(arg))
856 *p = arg;
857 else
858 return "unicode";
859 break;
860 }
861
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000862 case 'O': /* object */
863 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 PyTypeObject *type;
865 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000866 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000867 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000868 p = va_arg(*p_va, PyObject **);
869 format++;
870 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000871 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000872 else
873 return type->tp_name;
874
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000875 }
876 else if (*format == '?') {
877 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000878 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000879 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000880 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000881 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000882 else
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000883 return "(unspecified)";
Guido van Rossumfccfe891998-05-15 22:04:07 +0000884
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000885 }
886 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000887 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000888 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000889 converter convert = va_arg(*p_va, converter);
890 void *addr = va_arg(*p_va, void *);
891 format++;
892 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000893 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000894 }
895 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000896 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000897 *p = arg;
898 }
899 break;
900 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000901
902
903 case 'w': /* memory buffer, read-write access */
904 {
905 void **p = va_arg(*p_va, void **);
906 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
907 int count;
908
909 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
910 pb->bf_getsegcount == NULL )
911 return "read-write buffer";
912 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
913 return "single-segment read-write buffer";
914 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
915 return "(unspecified)";
916 if (*format == '#') {
917 int *q = va_arg(*p_va, int *);
918
919 *q = count;
920 format++;
921 }
922 break;
923 }
924
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000925 case 't': /* 8-bit character buffer, read-only access */
926 {
927 const char **p = va_arg(*p_va, const char **);
928 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
929 int count;
930
931 if ( *format++ != '#' )
932 return "invalid use of 't' format character";
933 if ( !PyType_HasFeature(
934 arg->ob_type,
935 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
936 pb == NULL ||
937 pb->bf_getcharbuffer == NULL ||
938 pb->bf_getsegcount == NULL )
939 return "read-only character buffer";
940 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
941 return "single-segment read-only buffer";
942 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
943 return "(unspecified)";
944
945 *va_arg(*p_va, int *) = count;
946
947 break;
948 }
949
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000950
951 default:
952 return "impossible<bad format char>";
953
954 }
955
956 *p_format = format;
957 return NULL;
958}
Guido van Rossumaa354651996-08-19 19:32:04 +0000959
960
961/* Support for keyword arguments donated by
962 Geoff Philbrick <philbric@delphi.hks.com> */
963
964#ifdef HAVE_STDARG_PROTOTYPES
965/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000966int PyArg_ParseTupleAndKeywords(PyObject *args,
967 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000968 char *format,
969 char **kwlist, ...)
970#else
971/* VARARGS */
972int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
973#endif
974{
975 int retval;
976 va_list va;
977#ifdef HAVE_STDARG_PROTOTYPES
978
979 va_start(va, kwlist);
980#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000981 PyObject *args;
982 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000983 char *format;
984 char **kwlist;
985
986 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 args = va_arg(va, PyObject *);
988 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000989 format = va_arg(va, char *);
990 kwlist = va_arg(va, char **);
991#endif
992 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
993 va_end(va);
994 return retval;
995}
996
997
998static int
999vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001000 PyObject *args;
1001 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +00001002 char *format;
1003 char **kwlist;
1004 va_list *p_va;
1005{
1006 char msgbuf[256];
1007 int levels[32];
1008 char *fname = NULL;
1009 char *message = NULL;
1010 int min = -1;
1011 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +00001012 char *formatsave = format;
1013 int i, len, tplen, kwlen;
1014 char *msg, *ks, **p;
1015 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +00001017
1018 /* nested tuples cannot be parsed when using keyword arguments */
1019
1020 for (;;) {
1021 int c = *format++;
1022 if (c == '(') {
1023 PyErr_SetString(PyExc_SystemError,
1024 "tuple found in format when using keyword arguments");
1025 return 0;
1026 }
1027 else if (c == '\0')
1028 break;
1029 else if (c == ':') {
1030 fname = format;
1031 break;
1032 }
1033 else if (c == ';') {
1034 message = format;
1035 break;
1036 }
1037 else if (isalpha(c))
1038 max++;
1039 else if (c == '|')
1040 min = max;
1041 }
1042
1043 if (min < 0)
1044 min = max;
1045
1046 format = formatsave;
1047
1048 if (!PyTuple_Check(args)) {
1049 PyErr_SetString(PyExc_SystemError,
1050 "new style getargs format but argument is not a tuple");
1051 return 0;
1052 }
1053
1054 tplen = PyTuple_Size(args);
1055
1056 /* do a cursory check of the keywords just to see how many we got */
1057
1058 if (keywords) {
1059 if (!PyDict_Check(keywords)) {
1060 PyErr_SetString(PyExc_SystemError,
1061 "non-dictionary object received when keyword dictionary expected");
1062 return 0;
1063 }
1064 kwlen = PyDict_Size(keywords);
1065 }
1066 else {
1067 kwlen = 0;
1068 }
1069
1070 /* make sure there are no duplicate values for an argument;
1071 its not clear when to use the term "keyword argument vs.
1072 keyword parameter in messages */
1073
1074 if (keywords) {
1075 for (i = 0; i < tplen; i++) {
1076 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1077 sprintf(msgbuf,
1078 "keyword parameter %s redefined",
1079 kwlist[i]);
1080 PyErr_SetString(PyExc_TypeError, msgbuf);
1081 return 0;
1082 }
1083 }
1084 }
1085 PyErr_Clear(); /* I'm not which Py functions set the error string */
1086
1087 /* required arguments missing from args can be supplied by keyword
1088 arguments */
1089
1090 len = tplen;
1091 if (keywords && tplen < min) {
1092 for (i = tplen; i < min; i++) {
1093 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1094 len++;
1095 }
1096 }
1097 }
1098 PyErr_Clear();
1099
1100 /* make sure we got an acceptable number of arguments; the message
1101 is a little confusing with keywords since keyword arguments
1102 which are supplied, but don't match the required arguments
1103 are not included in the "%d given" part of the message */
1104
1105 if (len < min || max < len) {
1106 if (message == NULL) {
1107 sprintf(msgbuf,
1108 "%s requires %s %d argument%s; %d given",
1109 fname==NULL ? "function" : fname,
1110 min==max ? "exactly"
1111 : len < min ? "at least" : "at most",
1112 len < min ? min : max,
1113 (len < min ? min : max) == 1 ? "" : "s",
1114 len);
1115 message = msgbuf;
1116 }
1117 PyErr_SetString(PyExc_TypeError, message);
1118 return 0;
1119 }
1120
1121 for (i = 0; i < tplen; i++) {
1122 if (*format == '|')
1123 format++;
1124 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1125 levels, msgbuf);
1126 if (msg) {
1127 seterror(i+1, msg, levels, fname, message);
1128 return 0;
1129 }
1130 }
1131
1132 /* handle no keyword parameters in call */
1133
1134 if (!keywords) return 1;
1135
1136 /* make sure the number of keywords in the keyword list matches the
1137 number of items in the format string */
1138
1139 nkwds = 0;
1140 p = kwlist;
1141 for (;;) {
1142 if (!*(p++)) break;
1143 nkwds++;
1144 }
1145
1146 if (nkwds != max) {
1147 PyErr_SetString(PyExc_SystemError,
1148 "number of items in format string and keyword list do not match");
1149 return 0;
1150 }
1151
1152 /* convert the keyword arguments; this uses the format
1153 string where it was left after processing args */
1154
1155 converted = 0;
1156 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001157 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001158 if (*format == '|')
1159 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001160 item = PyMapping_GetItemString(keywords, kwlist[i]);
1161 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001162 msg = convertitem(item, &format, p_va, levels, msgbuf);
1163 if (msg) {
1164 seterror(i+1, msg, levels, fname, message);
1165 return 0;
1166 }
1167 converted++;
1168 }
1169 else {
1170 PyErr_Clear();
1171 msg = skipitem(&format, p_va);
1172 if (msg) {
1173 seterror(i+1, msg, levels, fname, message);
1174 return 0;
1175 }
1176 }
1177 }
1178
1179 /* make sure there are no extraneous keyword arguments */
1180
1181 pos = 0;
1182 if (converted < kwlen) {
1183 while (PyDict_Next(keywords, &pos, &key, &value)) {
1184 match = 0;
1185 ks = PyString_AsString(key);
1186 for (i = 0; i < nkwds; i++) {
1187 if (!strcmp(ks, kwlist[i])) {
1188 match = 1;
1189 break;
1190 }
1191 }
1192 if (!match) {
1193 sprintf(msgbuf,
Guido van Rossum80dc16b2000-05-08 14:02:41 +00001194 "%s is an invalid keyword argument for this function",
Guido van Rossumaa354651996-08-19 19:32:04 +00001195 ks);
1196 PyErr_SetString(PyExc_TypeError, msgbuf);
1197 return 0;
1198 }
1199 }
1200 }
1201
1202 return 1;
1203}
1204
1205
1206static char *
1207skipitem(p_format, p_va)
1208 char **p_format;
1209 va_list *p_va;
1210{
1211 char *format = *p_format;
1212 char c = *format++;
1213
1214 switch (c) {
1215
1216 case 'b': /* byte -- very short int */
1217 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001218 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001219 break;
1220 }
1221
1222 case 'h': /* short int */
1223 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001224 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001225 break;
1226 }
1227
1228 case 'i': /* int */
1229 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001230 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001231 break;
1232 }
1233
1234 case 'l': /* long int */
1235 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001236 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001237 break;
1238 }
1239
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001240#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001241 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001242 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001243 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001244 break;
1245 }
1246#endif
1247
Guido van Rossumaa354651996-08-19 19:32:04 +00001248 case 'f': /* float */
1249 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001250 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001251 break;
1252 }
1253
1254 case 'd': /* double */
1255 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001256 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001257 break;
1258 }
1259
1260#ifndef WITHOUT_COMPLEX
1261 case 'D': /* complex double */
1262 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001263 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001264 break;
1265 }
1266#endif /* WITHOUT_COMPLEX */
1267
1268 case 'c': /* char */
1269 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001270 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001271 break;
1272 }
1273
1274 case 's': /* string */
1275 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001276 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001277 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001278 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001279 format++;
1280 }
1281 break;
1282 }
1283
1284 case 'z': /* string */
1285 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001286 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001287 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001288 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001289 format++;
1290 }
1291 break;
1292 }
1293
1294 case 'S': /* string object */
1295 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001296 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001297 break;
1298 }
1299
1300 case 'O': /* object */
1301 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001302 if (*format == '!') {
1303 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 (void) va_arg(*p_va, PyTypeObject*);
1305 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001306 }
1307#if 0
1308/* I don't know what this is for */
1309 else if (*format == '?') {
1310 inquiry pred = va_arg(*p_va, inquiry);
1311 format++;
1312 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001313 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001314 }
1315 }
1316#endif
1317 else if (*format == '&') {
1318 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +00001320 (void) va_arg(*p_va, converter);
1321 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001322 format++;
1323 }
1324 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001325 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001326 }
1327 break;
1328 }
1329
1330 default:
1331 return "impossible<bad format char>";
1332
1333 }
1334
1335 *p_format = format;
1336 return NULL;
1337}