blob: 3ed65a3a2bdc02a35bd0d87feb322183f2d49cba [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00009******************************************************************/
10
11/* New getargs implementation */
12
13/* XXX There are several unchecked sprintf or strcat calls in this file.
14 XXX The only way these can become a danger is if some C code in the
15 XXX Python source (or in an extension) uses ridiculously long names
Thomas Wouters7e474022000-07-16 12:04:32 +000016 XXX or ridiculously deep nesting in format strings. */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000017
Guido van Rossum79f25d91997-04-29 20:08:16 +000018#include "Python.h"
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000019
Guido van Rossumc1d50531996-08-21 23:38:24 +000020#include <ctype.h>
Guido van Rossumdb677392000-07-01 01:09:43 +000021#ifdef HAVE_LIMITS_H
22#include <limits.h>
23#endif
Guido van Rossumc1d50531996-08-21 23:38:24 +000024
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000025
Tim Petersdbd9ba62000-07-09 03:09:57 +000026int PyArg_Parse(PyObject *, char *, ...);
27int PyArg_ParseTuple(PyObject *, char *, ...);
28int PyArg_VaParse(PyObject *, char *, va_list);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000029
Tim Petersdbd9ba62000-07-09 03:09:57 +000030int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
31 char *, char **, ...);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000032
33/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000034static int vgetargs1(PyObject *, char *, va_list *, int);
35static void seterror(int, char *, int *, char *, char *);
36static char *convertitem(PyObject *, char **, va_list *, int *, char *);
37static char *converttuple(PyObject *, char **, va_list *,
38 int *, char *, int);
39static char *convertsimple(PyObject *, char **, va_list *, char *);
40static char *convertsimple1(PyObject *, char **, va_list *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000041
Tim Petersdbd9ba62000-07-09 03:09:57 +000042static int vgetargskeywords(PyObject *, PyObject *,
43 char *, char **, va_list *);
44static char *skipitem(char **, va_list *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000045
46#ifdef HAVE_STDARG_PROTOTYPES
47/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000048int PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000049#else
50/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000051int PyArg_Parse(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000052#endif
53{
54 int retval;
55 va_list va;
56#ifdef HAVE_STDARG_PROTOTYPES
57
58 va_start(va, format);
59#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000060 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000061 char *format;
62
63 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +000064 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000065 format = va_arg(va, char *);
66#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000067 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000068 va_end(va);
69 return retval;
70}
71
72
73#ifdef HAVE_STDARG_PROTOTYPES
74/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000075int PyArg_ParseTuple(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000076#else
77/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000078int PyArg_ParseTuple(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000079#endif
80{
81 int retval;
82 va_list va;
83#ifdef HAVE_STDARG_PROTOTYPES
84
85 va_start(va, format);
86#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000087 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000088 char *format;
89
90 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +000091 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000092 format = va_arg(va, char *);
93#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000094 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000095 va_end(va);
96 return retval;
97}
98
99
100int
Guido van Rossum13454c31997-05-05 21:57:29 +0000101PyArg_VaParse(args, format, va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000102 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000103 char *format;
104 va_list va;
105{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000106 va_list lva;
107
108#ifdef VA_LIST_IS_ARRAY
109 memcpy(lva, va, sizeof(va_list));
110#else
111 lva = va;
112#endif
113
114 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000115}
116
117
118static int
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000119vgetargs1(args, format, p_va, compat)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000121 char *format;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000122 va_list *p_va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000123 int compat;
124{
125 char msgbuf[256];
126 int levels[32];
127 char *fname = NULL;
128 char *message = NULL;
129 int min = -1;
130 int max = 0;
131 int level = 0;
132 char *formatsave = format;
133 int i, len;
134 char *msg;
135
136 for (;;) {
137 int c = *format++;
138 if (c == '(' /* ')' */) {
139 if (level == 0)
140 max++;
141 level++;
142 }
143 else if (/* '(' */ c == ')') {
144 if (level == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000145 Py_FatalError(/* '(' */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000146 "excess ')' in getargs format");
147 else
148 level--;
149 }
150 else if (c == '\0')
151 break;
152 else if (c == ':') {
153 fname = format;
154 break;
155 }
156 else if (c == ';') {
157 message = format;
158 break;
159 }
160 else if (level != 0)
161 ; /* Pass */
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000162 else if (c == 'e')
163 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000164 else if (isalpha(c))
165 max++;
166 else if (c == '|')
167 min = max;
168 }
169
170 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000172
173 if (min < 0)
174 min = max;
175
176 format = formatsave;
177
178 if (compat) {
179 if (max == 0) {
180 if (args == NULL)
181 return 1;
182 sprintf(msgbuf, "%s requires no arguments",
183 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000185 return 0;
186 }
187 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000188 if (args == NULL) {
189 sprintf(msgbuf,
190 "%s requires at least one argument",
191 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000192 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000193 return 0;
194 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000195 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000196 if (msg == NULL)
197 return 1;
198 seterror(levels[0], msg, levels+1, fname, message);
199 return 0;
200 }
201 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000202 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000203 "old style getargs format uses new features");
204 return 0;
205 }
206 }
207
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 if (!PyTuple_Check(args)) {
209 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000210 "new style getargs format but argument is not a tuple");
211 return 0;
212 }
213
Guido van Rossum79f25d91997-04-29 20:08:16 +0000214 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000215
216 if (len < min || max < len) {
217 if (message == NULL) {
218 sprintf(msgbuf,
219 "%s requires %s %d argument%s; %d given",
220 fname==NULL ? "function" : fname,
221 min==max ? "exactly"
222 : len < min ? "at least" : "at most",
223 len < min ? min : max,
224 (len < min ? min : max) == 1 ? "" : "s",
225 len);
226 message = msgbuf;
227 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000229 return 0;
230 }
231
232 for (i = 0; i < len; i++) {
233 if (*format == '|')
234 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000235 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000236 levels, msgbuf);
237 if (msg) {
238 seterror(i+1, msg, levels, fname, message);
239 return 0;
240 }
241 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000242
Guido van Rossum730806d1998-04-10 22:27:42 +0000243 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000244 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000245 *format != '|' && *format != ':' && *format != ';') {
246 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000247 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000248 return 0;
249 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000250
251 return 1;
252}
253
254
255
256static void
257seterror(iarg, msg, levels, fname, message)
258 int iarg;
259 char *msg;
260 int *levels;
261 char *fname;
262 char *message;
263{
264 char buf[256];
265 int i;
266 char *p = buf;
267
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000269 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000270 if (iarg == 0 && message == NULL)
271 message = msg;
272 else if (message == NULL) {
273 if (fname != NULL) {
274 sprintf(p, "%s, ", fname);
275 p += strlen(p);
276 }
277 sprintf(p, "argument %d", iarg);
278 i = 0;
279 p += strlen(p);
280 while (levels[i] > 0) {
281 sprintf(p, ", item %d", levels[i]-1);
282 p += strlen(p);
283 i++;
284 }
285 sprintf(p, ": expected %s found", msg);
286 message = buf;
287 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000289}
290
291
292/* Convert a tuple argument.
293 On entry, *p_format points to the character _after_ the opening '('.
294 On successful exit, *p_format points to the closing ')'.
295 If successful:
296 *p_format and *p_va are updated,
297 *levels and *msgbuf are untouched,
298 and NULL is returned.
299 If the argument is invalid:
300 *p_format is unchanged,
301 *p_va is undefined,
302 *levels is a 0-terminated list of item numbers,
303 *msgbuf contains an error message, whose format is:
304 "<typename1>, <typename2>", where:
305 <typename1> is the name of the expected type, and
306 <typename2> is the name of the actual type,
307 (so you can surround it by "expected ... found"),
308 and msgbuf is returned.
309*/
310
311static char *
312converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000314 char **p_format;
315 va_list *p_va;
316 int *levels;
317 char *msgbuf;
318 int toplevel;
319{
320 int level = 0;
321 int n = 0;
322 char *format = *p_format;
323 int i;
324
325 for (;;) {
326 int c = *format++;
327 if (c == '(') {
328 if (level == 0)
329 n++;
330 level++;
331 }
332 else if (c == ')') {
333 if (level == 0)
334 break;
335 level--;
336 }
337 else if (c == ':' || c == ';' || c == '\0')
338 break;
339 else if (level == 0 && isalpha(c))
340 n++;
341 }
342
Guido van Rossum66368cc1999-02-17 23:16:43 +0000343 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000344 levels[0] = 0;
345 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000346 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000347 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000348 return msgbuf;
349 }
350
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000351 if ((i = PySequence_Size(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000352 levels[0] = 0;
353 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000354 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
355 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000356 return msgbuf;
357 }
358
359 format = *p_format;
360 for (i = 0; i < n; i++) {
361 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000362 PyObject *item;
363 item = PySequence_GetItem(arg, i);
364 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
365 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
366 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000367 if (msg != NULL) {
368 levels[0] = i+1;
369 return msg;
370 }
371 }
372
373 *p_format = format;
374 return NULL;
375}
376
377
378/* Convert a single item. */
379
380static char *
381convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000382 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000383 char **p_format;
384 va_list *p_va;
385 int *levels;
386 char *msgbuf;
387{
388 char *msg;
389 char *format = *p_format;
390
391 if (*format == '(' /* ')' */) {
392 format++;
393 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
394 if (msg == NULL)
395 format++;
396 }
397 else {
398 msg = convertsimple(arg, &format, p_va, msgbuf);
399 if (msg != NULL)
400 levels[0] = 0;
401 }
402 if (msg == NULL)
403 *p_format = format;
404 return msg;
405}
406
407
408/* Convert a non-tuple argument. Adds to convertsimple1 functionality
409 by appending ", <actual argument type>" to error message. */
410
411static char *
412convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000414 char **p_format;
415 va_list *p_va;
416 char *msgbuf;
417{
418 char *msg = convertsimple1(arg, p_format, p_va);
419 if (msg != NULL) {
420 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000421 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000422 msg = msgbuf;
423 }
424 return msg;
425}
426
427
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000428/* Internal API needed by convertsimple1(): */
429extern
430PyObject *_PyUnicode_AsUTF8String(PyObject *unicode,
431 const char *errors);
432
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000433/* Convert a non-tuple argument. Return NULL if conversion went OK,
434 or a string representing the expected type if the conversion failed.
435 When failing, an exception may or may not have been raised.
436 Don't call if a tuple is expected. */
437
438static char *
439convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000441 char **p_format;
442 va_list *p_va;
443{
444 char *format = *p_format;
445 char c = *format++;
446
447 switch (c) {
448
Fred Drake230cae72000-05-09 21:50:00 +0000449 case 'b': /* unsigned byte -- very short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000450 {
451 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 long ival = PyInt_AsLong(arg);
453 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000454 return "integer<b>";
Fred Drake230cae72000-05-09 21:50:00 +0000455 else if (ival < 0) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000456 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000457 "unsigned byte integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000458 return "integer<b>";
459 }
Fred Drake230cae72000-05-09 21:50:00 +0000460 else if (ival > UCHAR_MAX) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000461 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000462 "unsigned byte integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000463 return "integer<b>";
464 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000465 else
Fred Drake230cae72000-05-09 21:50:00 +0000466 *p = (unsigned char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000467 break;
468 }
469
Fred Drake230cae72000-05-09 21:50:00 +0000470 case 'h': /* signed short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000471 {
472 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000473 long ival = PyInt_AsLong(arg);
474 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000475 return "integer<h>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000476 else if (ival < SHRT_MIN) {
477 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000478 "signed short integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000479 return "integer<h>";
480 }
481 else if (ival > SHRT_MAX) {
482 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000483 "signed short integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000484 return "integer<h>";
485 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000486 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000487 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000488 break;
489 }
490
Jack Jansend50338f2000-07-06 12:22:00 +0000491 case 'H': /* unsigned short int */
492 {
493 unsigned short *p = va_arg(*p_va, unsigned short *);
494 long ival = PyInt_AsLong(arg);
495 if (ival == -1 && PyErr_Occurred())
496 return "integer<H>";
497 else if (ival < 0) {
498 PyErr_SetString(PyExc_OverflowError,
499 "unsigned short integer is less than minimum");
500 return "integer<H>";
501 }
502 else if (ival > USHRT_MAX) {
503 PyErr_SetString(PyExc_OverflowError,
504 "unsigned short integer is greater than maximum");
505 return "integer<H>";
506 }
507 else
508 *p = (unsigned short) ival;
509 break;
510 }
511
Fred Drake230cae72000-05-09 21:50:00 +0000512 case 'i': /* signed int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000513 {
514 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 long ival = PyInt_AsLong(arg);
516 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000517 return "integer<i>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000518 else if (ival > INT_MAX) {
519 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000520 "signed integer is greater than maximum");
521 return "integer<i>";
522 }
523 else if (ival < INT_MIN) {
524 PyErr_SetString(PyExc_OverflowError,
525 "signed integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000526 return "integer<i>";
527 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000528 else
529 *p = ival;
530 break;
531 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000532 case 'l': /* long int */
533 {
534 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 long ival = PyInt_AsLong(arg);
536 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000537 return "integer<l>";
538 else
539 *p = ival;
540 break;
541 }
542
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000543#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000544 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000545 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000546 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
547 LONG_LONG ival = PyLong_AsLongLong( arg );
548 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000549 return "long<L>";
550 } else {
551 *p = ival;
552 }
553 break;
554 }
555#endif
556
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000557 case 'f': /* float */
558 {
559 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 double dval = PyFloat_AsDouble(arg);
561 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000562 return "float<f>";
563 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000564 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000565 break;
566 }
567
568 case 'd': /* double */
569 {
570 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 double dval = PyFloat_AsDouble(arg);
572 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000573 return "float<d>";
574 else
575 *p = dval;
576 break;
577 }
578
Guido van Rossum530956d1996-07-21 02:27:43 +0000579#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000580 case 'D': /* complex double */
581 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000582 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000583 Py_complex cval;
584 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000586 return "complex<D>";
587 else
588 *p = cval;
589 break;
590 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000591#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000592
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000593 case 'c': /* char */
594 {
595 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 if (PyString_Check(arg) && PyString_Size(arg) == 1)
597 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000598 else
599 return "char";
600 break;
601 }
602
603 case 's': /* string */
604 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000605 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000606 void **p = (void **)va_arg(*p_va, char **);
607 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000608 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000609 int count;
610
611 if ( pb == NULL ||
612 pb->bf_getreadbuffer == NULL ||
613 pb->bf_getsegcount == NULL )
614 return "read-only buffer";
615 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
616 return "single-segment read-only buffer";
617 if ( (count =
618 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
619 return "(unspecified)";
620 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000621 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000622 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000623 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000624
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000625 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000626 *p = PyString_AS_STRING(arg);
627 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000628 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000629 if (arg == NULL)
630 return "unicode conversion error";
631 *p = PyString_AS_STRING(arg);
632 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000633 else
634 return "string";
635 if ((int)strlen(*p) != PyString_Size(arg))
636 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000637 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000638 break;
639 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000640
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000641 case 'z': /* string, may be NULL (None) */
642 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000643 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000644 void **p = (void **)va_arg(*p_va, char **);
645 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000646 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000647 int count;
648
649 if (arg == Py_None) {
650 *p = 0;
651 *q = 0;
652 } else {
653 if ( pb == NULL ||
654 pb->bf_getreadbuffer == NULL ||
655 pb->bf_getsegcount == NULL )
656 return "read-only buffer";
657 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
658 return "single-segment read-only buffer";
659 if ( (count = (*pb->bf_getreadbuffer)
660 (arg, 0, p)) < 0 )
661 return "(unspecified)";
662 *q = count;
663 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000664 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000665 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000666 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000667
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000668 if (arg == Py_None)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000669 *p = 0;
670 else if (PyString_Check(arg))
671 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000672 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000673 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000674 if (arg == NULL)
675 return "unicode conversion error";
676 *p = PyString_AS_STRING(arg);
677 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000678 else
679 return "None or string";
680 if (*format == '#') {
681 int *q = va_arg(*p_va, int *);
682 if (arg == Py_None)
683 *q = 0;
684 else
685 *q = PyString_Size(arg);
686 format++;
687 }
688 else if (*p != NULL &&
689 (int)strlen(*p) != PyString_Size(arg))
690 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000691 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000692 break;
693 }
694
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000695 case 'e': /* encoded string */
696 {
697 char **buffer;
698 const char *encoding;
699 PyObject *u, *s;
700 int size;
701
702 /* Get 'e' parameter: the encoding name */
703 encoding = (const char *)va_arg(*p_va, const char *);
704 if (encoding == NULL)
705 return "(encoding is NULL)";
706
707 /* Get 's' parameter: the output buffer to use */
708 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000709 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000710 buffer = (char **)va_arg(*p_va, char **);
711 format++;
712 if (buffer == NULL)
713 return "(buffer is NULL)";
714
715 /* Convert object to Unicode */
716 u = PyUnicode_FromObject(arg);
717 if (u == NULL)
718 return "string, unicode or text buffer";
719
720 /* Encode object; use default error handling */
721 s = PyUnicode_AsEncodedString(u,
722 encoding,
723 NULL);
724 Py_DECREF(u);
725 if (s == NULL)
726 return "(encoding failed)";
727 if (!PyString_Check(s)) {
728 Py_DECREF(s);
729 return "(encoder failed to return a string)";
730 }
731 size = PyString_GET_SIZE(s);
732
733 /* Write output; output is guaranteed to be
734 0-terminated */
735 if (*format == '#') {
736 /* Using buffer length parameter '#':
737
738 - if *buffer is NULL, a new buffer
739 of the needed size is allocated and
740 the data copied into it; *buffer is
741 updated to point to the new buffer;
742 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000743 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000744
745 - if *buffer is not NULL, the data
746 is copied to *buffer; *buffer_len
747 has to be set to the size of the
748 buffer on input; buffer overflow is
749 signalled with an error; buffer has
750 to provide enough room for the
751 encoded string plus the trailing
752 0-byte
753
754 - in both cases, *buffer_len is
755 updated to the size of the buffer
756 /excluding/ the trailing 0-byte
757
758 */
759 int *buffer_len = va_arg(*p_va, int *);
760
761 format++;
762 if (buffer_len == NULL)
763 return "(buffer_len is NULL)";
764 if (*buffer == NULL) {
765 *buffer = PyMem_NEW(char, size + 1);
766 if (*buffer == NULL) {
767 Py_DECREF(s);
768 return "(memory error)";
769 }
770 } else {
771 if (size + 1 > *buffer_len) {
772 Py_DECREF(s);
773 return "(buffer overflow)";
774 }
775 }
776 memcpy(*buffer,
777 PyString_AS_STRING(s),
778 size + 1);
779 *buffer_len = size;
780 } else {
781 /* Using a 0-terminated buffer:
782
783 - the encoded string has to be
784 0-terminated for this variant to
785 work; if it is not, an error raised
786
787 - a new buffer of the needed size
788 is allocated and the data copied
789 into it; *buffer is updated to
790 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000791 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000792 after usage
793
794 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000795 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000796 return "(encoded string without "\
797 "NULL bytes)";
798 *buffer = PyMem_NEW(char, size + 1);
799 if (*buffer == NULL) {
800 Py_DECREF(s);
801 return "(memory error)";
802 }
803 memcpy(*buffer,
804 PyString_AS_STRING(s),
805 size + 1);
806 }
807 Py_DECREF(s);
808 break;
809 }
810
Fred Drake25871c02000-05-03 15:17:02 +0000811 case 'u': /* raw unicode buffer (Py_UNICODE *) */
812 {
813 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000814 void **p = (void **)va_arg(*p_va, char **);
815 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Fred Drake25871c02000-05-03 15:17:02 +0000816 int *q = va_arg(*p_va, int *);
817 int count;
818
819 if ( pb == NULL ||
820 pb->bf_getreadbuffer == NULL ||
821 pb->bf_getsegcount == NULL )
822 return "read-only buffer";
823 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
824 return "single-segment read-only buffer";
825 if ( (count =
826 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
827 return "(unspecified)";
828 /* buffer interface returns bytes, we want
829 length in characters */
830 *q = count/(sizeof(Py_UNICODE));
831 format++;
832 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000833 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
Fred Drake25871c02000-05-03 15:17:02 +0000834
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000835 if (PyUnicode_Check(arg))
Fred Drake25871c02000-05-03 15:17:02 +0000836 *p = PyUnicode_AS_UNICODE(arg);
837 else
838 return "unicode";
839 }
840 break;
841 }
842
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000843 case 'S': /* string object */
844 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000845 PyObject **p = va_arg(*p_va, PyObject **);
846 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000847 *p = arg;
848 else
849 return "string";
850 break;
851 }
852
Guido van Rossume826ef02000-03-10 23:02:17 +0000853 case 'U': /* Unicode object */
854 {
855 PyObject **p = va_arg(*p_va, PyObject **);
856 if (PyUnicode_Check(arg))
857 *p = arg;
858 else
859 return "unicode";
860 break;
861 }
862
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000863 case 'O': /* object */
864 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865 PyTypeObject *type;
866 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000867 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000869 p = va_arg(*p_va, PyObject **);
870 format++;
871 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000872 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000873 else
874 return type->tp_name;
875
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000876 }
877 else if (*format == '?') {
878 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000879 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000880 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000881 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000882 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000883 else
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000884 return "(unspecified)";
Guido van Rossumfccfe891998-05-15 22:04:07 +0000885
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000886 }
887 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +0000888 typedef int (*converter)(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
Jack Jansend50338f2000-07-06 12:22:00 +00001228 case 'H': /* unsigned short int */
1229 {
1230 (void) va_arg(*p_va, unsigned short *);
1231 break;
1232 }
1233
Guido van Rossumaa354651996-08-19 19:32:04 +00001234 case 'i': /* int */
1235 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001236 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001237 break;
1238 }
1239
1240 case 'l': /* long int */
1241 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001242 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001243 break;
1244 }
1245
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001246#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001247 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001248 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001249 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001250 break;
1251 }
1252#endif
1253
Guido van Rossumaa354651996-08-19 19:32:04 +00001254 case 'f': /* float */
1255 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001256 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001257 break;
1258 }
1259
1260 case 'd': /* double */
1261 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001262 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001263 break;
1264 }
1265
1266#ifndef WITHOUT_COMPLEX
1267 case 'D': /* complex double */
1268 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001269 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001270 break;
1271 }
1272#endif /* WITHOUT_COMPLEX */
1273
1274 case 'c': /* char */
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 break;
1278 }
1279
1280 case 's': /* string */
1281 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001282 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001283 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001284 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001285 format++;
1286 }
1287 break;
1288 }
1289
1290 case 'z': /* string */
1291 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001292 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001293 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001294 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001295 format++;
1296 }
1297 break;
1298 }
1299
1300 case 'S': /* string object */
1301 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001303 break;
1304 }
1305
1306 case 'O': /* object */
1307 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001308 if (*format == '!') {
1309 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001310 (void) va_arg(*p_va, PyTypeObject*);
1311 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001312 }
1313#if 0
1314/* I don't know what this is for */
1315 else if (*format == '?') {
1316 inquiry pred = va_arg(*p_va, inquiry);
1317 format++;
1318 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001320 }
1321 }
1322#endif
1323 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +00001324 typedef int (*converter)(PyObject *, void *);
Guido van Rossum80bb9651996-12-05 23:27:02 +00001325 (void) va_arg(*p_va, converter);
1326 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001327 format++;
1328 }
1329 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001331 }
1332 break;
1333 }
1334
1335 default:
1336 return "impossible<bad format char>";
1337
1338 }
1339
1340 *p_format = format;
1341 return NULL;
1342}