blob: b213ba2adb69b21c1addeee345d45df7d5cc26a2 [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
16 XXX or riduculously deep nesting in format strings. */
17
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
Guido van Rossum79f25d91997-04-29 20:08:16 +000026int PyArg_Parse Py_PROTO((PyObject *, char *, ...));
27int PyArg_ParseTuple Py_PROTO((PyObject *, char *, ...));
Guido van Rossum13454c31997-05-05 21:57:29 +000028int PyArg_VaParse Py_PROTO((PyObject *, char *, va_list));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000029
Guido van Rossum79f25d91997-04-29 20:08:16 +000030int PyArg_ParseTupleAndKeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000031 char *, char **, ...));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000032
33/* Forward */
Guido van Rossum79f25d91997-04-29 20:08:16 +000034static int vgetargs1 Py_PROTO((PyObject *, char *, va_list *, int));
35static void seterror Py_PROTO((int, char *, int *, char *, char *));
36static char *convertitem Py_PROTO((PyObject *, char **, va_list *,
37 int *, char *));
38static char *converttuple Py_PROTO((PyObject *, char **, va_list *,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000039 int *, char *, int));
Guido van Rossum79f25d91997-04-29 20:08:16 +000040static char *convertsimple Py_PROTO((PyObject *, char **, va_list *, char *));
41static char *convertsimple1 Py_PROTO((PyObject *, char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000042
Guido van Rossum79f25d91997-04-29 20:08:16 +000043static int vgetargskeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000044 char *, char **, va_list *));
Guido van Rossum79f25d91997-04-29 20:08:16 +000045static char *skipitem Py_PROTO((char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000046
47#ifdef HAVE_STDARG_PROTOTYPES
48/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000049int PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000050#else
51/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000052int PyArg_Parse(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000053#endif
54{
55 int retval;
56 va_list va;
57#ifdef HAVE_STDARG_PROTOTYPES
58
59 va_start(va, format);
60#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000061 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000062 char *format;
63
64 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +000065 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000066 format = va_arg(va, char *);
67#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000069 va_end(va);
70 return retval;
71}
72
73
74#ifdef HAVE_STDARG_PROTOTYPES
75/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000076int PyArg_ParseTuple(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000077#else
78/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000079int PyArg_ParseTuple(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000080#endif
81{
82 int retval;
83 va_list va;
84#ifdef HAVE_STDARG_PROTOTYPES
85
86 va_start(va, format);
87#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000088 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000089 char *format;
90
91 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +000092 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000093 format = va_arg(va, char *);
94#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000095 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000096 va_end(va);
97 return retval;
98}
99
100
101int
Guido van Rossum13454c31997-05-05 21:57:29 +0000102PyArg_VaParse(args, format, va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000104 char *format;
105 va_list va;
106{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000107 va_list lva;
108
109#ifdef VA_LIST_IS_ARRAY
110 memcpy(lva, va, sizeof(va_list));
111#else
112 lva = va;
113#endif
114
115 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000116}
117
118
119static int
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000120vgetargs1(args, format, p_va, compat)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000121 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000122 char *format;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000123 va_list *p_va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000124 int compat;
125{
126 char msgbuf[256];
127 int levels[32];
128 char *fname = NULL;
129 char *message = NULL;
130 int min = -1;
131 int max = 0;
132 int level = 0;
133 char *formatsave = format;
134 int i, len;
135 char *msg;
136
137 for (;;) {
138 int c = *format++;
139 if (c == '(' /* ')' */) {
140 if (level == 0)
141 max++;
142 level++;
143 }
144 else if (/* '(' */ c == ')') {
145 if (level == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 Py_FatalError(/* '(' */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000147 "excess ')' in getargs format");
148 else
149 level--;
150 }
151 else if (c == '\0')
152 break;
153 else if (c == ':') {
154 fname = format;
155 break;
156 }
157 else if (c == ';') {
158 message = format;
159 break;
160 }
161 else if (level != 0)
162 ; /* Pass */
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000163 else if (c == 'e')
164 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000165 else if (isalpha(c))
166 max++;
167 else if (c == '|')
168 min = max;
169 }
170
171 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000173
174 if (min < 0)
175 min = max;
176
177 format = formatsave;
178
179 if (compat) {
180 if (max == 0) {
181 if (args == NULL)
182 return 1;
183 sprintf(msgbuf, "%s requires no arguments",
184 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000186 return 0;
187 }
188 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000189 if (args == NULL) {
190 sprintf(msgbuf,
191 "%s requires at least one argument",
192 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000193 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000194 return 0;
195 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000196 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000197 if (msg == NULL)
198 return 1;
199 seterror(levels[0], msg, levels+1, fname, message);
200 return 0;
201 }
202 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000204 "old style getargs format uses new features");
205 return 0;
206 }
207 }
208
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 if (!PyTuple_Check(args)) {
210 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000211 "new style getargs format but argument is not a tuple");
212 return 0;
213 }
214
Guido van Rossum79f25d91997-04-29 20:08:16 +0000215 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000216
217 if (len < min || max < len) {
218 if (message == NULL) {
219 sprintf(msgbuf,
220 "%s requires %s %d argument%s; %d given",
221 fname==NULL ? "function" : fname,
222 min==max ? "exactly"
223 : len < min ? "at least" : "at most",
224 len < min ? min : max,
225 (len < min ? min : max) == 1 ? "" : "s",
226 len);
227 message = msgbuf;
228 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000229 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000230 return 0;
231 }
232
233 for (i = 0; i < len; i++) {
234 if (*format == '|')
235 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000236 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000237 levels, msgbuf);
238 if (msg) {
239 seterror(i+1, msg, levels, fname, message);
240 return 0;
241 }
242 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000243
Guido van Rossum730806d1998-04-10 22:27:42 +0000244 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000245 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000246 *format != '|' && *format != ':' && *format != ';') {
247 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000248 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000249 return 0;
250 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000251
252 return 1;
253}
254
255
256
257static void
258seterror(iarg, msg, levels, fname, message)
259 int iarg;
260 char *msg;
261 int *levels;
262 char *fname;
263 char *message;
264{
265 char buf[256];
266 int i;
267 char *p = buf;
268
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000270 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000271 if (iarg == 0 && message == NULL)
272 message = msg;
273 else if (message == NULL) {
274 if (fname != NULL) {
275 sprintf(p, "%s, ", fname);
276 p += strlen(p);
277 }
278 sprintf(p, "argument %d", iarg);
279 i = 0;
280 p += strlen(p);
281 while (levels[i] > 0) {
282 sprintf(p, ", item %d", levels[i]-1);
283 p += strlen(p);
284 i++;
285 }
286 sprintf(p, ": expected %s found", msg);
287 message = buf;
288 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000289 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000290}
291
292
293/* Convert a tuple argument.
294 On entry, *p_format points to the character _after_ the opening '('.
295 On successful exit, *p_format points to the closing ')'.
296 If successful:
297 *p_format and *p_va are updated,
298 *levels and *msgbuf are untouched,
299 and NULL is returned.
300 If the argument is invalid:
301 *p_format is unchanged,
302 *p_va is undefined,
303 *levels is a 0-terminated list of item numbers,
304 *msgbuf contains an error message, whose format is:
305 "<typename1>, <typename2>", where:
306 <typename1> is the name of the expected type, and
307 <typename2> is the name of the actual type,
308 (so you can surround it by "expected ... found"),
309 and msgbuf is returned.
310*/
311
312static char *
313converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000315 char **p_format;
316 va_list *p_va;
317 int *levels;
318 char *msgbuf;
319 int toplevel;
320{
321 int level = 0;
322 int n = 0;
323 char *format = *p_format;
324 int i;
325
326 for (;;) {
327 int c = *format++;
328 if (c == '(') {
329 if (level == 0)
330 n++;
331 level++;
332 }
333 else if (c == ')') {
334 if (level == 0)
335 break;
336 level--;
337 }
338 else if (c == ':' || c == ';' || c == '\0')
339 break;
340 else if (level == 0 && isalpha(c))
341 n++;
342 }
343
Guido van Rossum66368cc1999-02-17 23:16:43 +0000344 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000345 levels[0] = 0;
346 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000347 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000349 return msgbuf;
350 }
351
Guido van Rossum66368cc1999-02-17 23:16:43 +0000352 if ((i = PySequence_Length(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000353 levels[0] = 0;
354 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000355 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
356 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000357 return msgbuf;
358 }
359
360 format = *p_format;
361 for (i = 0; i < n; i++) {
362 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000363 PyObject *item;
364 item = PySequence_GetItem(arg, i);
365 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
366 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
367 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000368 if (msg != NULL) {
369 levels[0] = i+1;
370 return msg;
371 }
372 }
373
374 *p_format = format;
375 return NULL;
376}
377
378
379/* Convert a single item. */
380
381static char *
382convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000384 char **p_format;
385 va_list *p_va;
386 int *levels;
387 char *msgbuf;
388{
389 char *msg;
390 char *format = *p_format;
391
392 if (*format == '(' /* ')' */) {
393 format++;
394 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
395 if (msg == NULL)
396 format++;
397 }
398 else {
399 msg = convertsimple(arg, &format, p_va, msgbuf);
400 if (msg != NULL)
401 levels[0] = 0;
402 }
403 if (msg == NULL)
404 *p_format = format;
405 return msg;
406}
407
408
409/* Convert a non-tuple argument. Adds to convertsimple1 functionality
410 by appending ", <actual argument type>" to error message. */
411
412static char *
413convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000415 char **p_format;
416 va_list *p_va;
417 char *msgbuf;
418{
419 char *msg = convertsimple1(arg, p_format, p_va);
420 if (msg != NULL) {
421 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000423 msg = msgbuf;
424 }
425 return msg;
426}
427
428
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000429/* Internal API needed by convertsimple1(): */
430extern
431PyObject *_PyUnicode_AsUTF8String(PyObject *unicode,
432 const char *errors);
433
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000434/* Convert a non-tuple argument. Return NULL if conversion went OK,
435 or a string representing the expected type if the conversion failed.
436 When failing, an exception may or may not have been raised.
437 Don't call if a tuple is expected. */
438
439static char *
440convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000442 char **p_format;
443 va_list *p_va;
444{
445 char *format = *p_format;
446 char c = *format++;
447
448 switch (c) {
449
Fred Drake230cae72000-05-09 21:50:00 +0000450 case 'b': /* unsigned byte -- very short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000451 {
452 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 long ival = PyInt_AsLong(arg);
454 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000455 return "integer<b>";
Fred Drake230cae72000-05-09 21:50:00 +0000456 else if (ival < 0) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000457 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000458 "unsigned byte integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000459 return "integer<b>";
460 }
Fred Drake230cae72000-05-09 21:50:00 +0000461 else if (ival > UCHAR_MAX) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000462 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000463 "unsigned byte integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000464 return "integer<b>";
465 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000466 else
Fred Drake230cae72000-05-09 21:50:00 +0000467 *p = (unsigned char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000468 break;
469 }
470
Fred Drake230cae72000-05-09 21:50:00 +0000471 case 'h': /* signed short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000472 {
473 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 long ival = PyInt_AsLong(arg);
475 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000476 return "integer<h>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000477 else if (ival < SHRT_MIN) {
478 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000479 "signed short integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000480 return "integer<h>";
481 }
482 else if (ival > SHRT_MAX) {
483 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000484 "signed short integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000485 return "integer<h>";
486 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000487 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000488 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000489 break;
490 }
491
Fred Drake230cae72000-05-09 21:50:00 +0000492 case 'i': /* signed int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000493 {
494 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000495 long ival = PyInt_AsLong(arg);
496 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000497 return "integer<i>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000498 else if (ival > INT_MAX) {
499 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000500 "signed integer is greater than maximum");
501 return "integer<i>";
502 }
503 else if (ival < INT_MIN) {
504 PyErr_SetString(PyExc_OverflowError,
505 "signed integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000506 return "integer<i>";
507 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000508 else
509 *p = ival;
510 break;
511 }
512
513 case 'l': /* long int */
514 {
515 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 long ival = PyInt_AsLong(arg);
517 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000518 return "integer<l>";
519 else
520 *p = ival;
521 break;
522 }
523
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000524#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000525 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000526 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000527 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
528 LONG_LONG ival = PyLong_AsLongLong( arg );
529 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000530 return "long<L>";
531 } else {
532 *p = ival;
533 }
534 break;
535 }
536#endif
537
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000538 case 'f': /* float */
539 {
540 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 double dval = PyFloat_AsDouble(arg);
542 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000543 return "float<f>";
544 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000545 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000546 break;
547 }
548
549 case 'd': /* double */
550 {
551 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 double dval = PyFloat_AsDouble(arg);
553 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000554 return "float<d>";
555 else
556 *p = dval;
557 break;
558 }
559
Guido van Rossum530956d1996-07-21 02:27:43 +0000560#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000561 case 'D': /* complex double */
562 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000563 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000564 Py_complex cval;
565 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000566 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000567 return "complex<D>";
568 else
569 *p = cval;
570 break;
571 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000572#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000573
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000574 case 'c': /* char */
575 {
576 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 if (PyString_Check(arg) && PyString_Size(arg) == 1)
578 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000579 else
580 return "char";
581 break;
582 }
583
584 case 's': /* string */
585 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000586 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000587 void **p = (void **)va_arg(*p_va, char **);
588 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000589 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000590 int count;
591
592 if ( pb == NULL ||
593 pb->bf_getreadbuffer == NULL ||
594 pb->bf_getsegcount == NULL )
595 return "read-only buffer";
596 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
597 return "single-segment read-only buffer";
598 if ( (count =
599 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
600 return "(unspecified)";
601 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000602 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000603 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000604 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000605
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000606 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000607 *p = PyString_AS_STRING(arg);
608 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000609 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000610 if (arg == NULL)
611 return "unicode conversion error";
612 *p = PyString_AS_STRING(arg);
613 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000614 else
615 return "string";
616 if ((int)strlen(*p) != PyString_Size(arg))
617 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000618 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000619 break;
620 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000621
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000622 case 'z': /* string, may be NULL (None) */
623 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000624 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000625 void **p = (void **)va_arg(*p_va, char **);
626 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000627 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000628 int count;
629
630 if (arg == Py_None) {
631 *p = 0;
632 *q = 0;
633 } else {
634 if ( pb == NULL ||
635 pb->bf_getreadbuffer == NULL ||
636 pb->bf_getsegcount == NULL )
637 return "read-only buffer";
638 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
639 return "single-segment read-only buffer";
640 if ( (count = (*pb->bf_getreadbuffer)
641 (arg, 0, p)) < 0 )
642 return "(unspecified)";
643 *q = count;
644 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000645 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000646 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000647 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000648
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000649 if (arg == Py_None)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000650 *p = 0;
651 else if (PyString_Check(arg))
652 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000653 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000654 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000655 if (arg == NULL)
656 return "unicode conversion error";
657 *p = PyString_AS_STRING(arg);
658 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000659 else
660 return "None or string";
661 if (*format == '#') {
662 int *q = va_arg(*p_va, int *);
663 if (arg == Py_None)
664 *q = 0;
665 else
666 *q = PyString_Size(arg);
667 format++;
668 }
669 else if (*p != NULL &&
670 (int)strlen(*p) != PyString_Size(arg))
671 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000672 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000673 break;
674 }
675
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000676 case 'e': /* encoded string */
677 {
678 char **buffer;
679 const char *encoding;
680 PyObject *u, *s;
681 int size;
682
683 /* Get 'e' parameter: the encoding name */
684 encoding = (const char *)va_arg(*p_va, const char *);
685 if (encoding == NULL)
686 return "(encoding is NULL)";
687
688 /* Get 's' parameter: the output buffer to use */
689 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000690 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000691 buffer = (char **)va_arg(*p_va, char **);
692 format++;
693 if (buffer == NULL)
694 return "(buffer is NULL)";
695
696 /* Convert object to Unicode */
697 u = PyUnicode_FromObject(arg);
698 if (u == NULL)
699 return "string, unicode or text buffer";
700
701 /* Encode object; use default error handling */
702 s = PyUnicode_AsEncodedString(u,
703 encoding,
704 NULL);
705 Py_DECREF(u);
706 if (s == NULL)
707 return "(encoding failed)";
708 if (!PyString_Check(s)) {
709 Py_DECREF(s);
710 return "(encoder failed to return a string)";
711 }
712 size = PyString_GET_SIZE(s);
713
714 /* Write output; output is guaranteed to be
715 0-terminated */
716 if (*format == '#') {
717 /* Using buffer length parameter '#':
718
719 - if *buffer is NULL, a new buffer
720 of the needed size is allocated and
721 the data copied into it; *buffer is
722 updated to point to the new buffer;
723 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000724 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000725
726 - if *buffer is not NULL, the data
727 is copied to *buffer; *buffer_len
728 has to be set to the size of the
729 buffer on input; buffer overflow is
730 signalled with an error; buffer has
731 to provide enough room for the
732 encoded string plus the trailing
733 0-byte
734
735 - in both cases, *buffer_len is
736 updated to the size of the buffer
737 /excluding/ the trailing 0-byte
738
739 */
740 int *buffer_len = va_arg(*p_va, int *);
741
742 format++;
743 if (buffer_len == NULL)
744 return "(buffer_len is NULL)";
745 if (*buffer == NULL) {
746 *buffer = PyMem_NEW(char, size + 1);
747 if (*buffer == NULL) {
748 Py_DECREF(s);
749 return "(memory error)";
750 }
751 } else {
752 if (size + 1 > *buffer_len) {
753 Py_DECREF(s);
754 return "(buffer overflow)";
755 }
756 }
757 memcpy(*buffer,
758 PyString_AS_STRING(s),
759 size + 1);
760 *buffer_len = size;
761 } else {
762 /* Using a 0-terminated buffer:
763
764 - the encoded string has to be
765 0-terminated for this variant to
766 work; if it is not, an error raised
767
768 - a new buffer of the needed size
769 is allocated and the data copied
770 into it; *buffer is updated to
771 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000772 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000773 after usage
774
775 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000776 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000777 return "(encoded string without "\
778 "NULL bytes)";
779 *buffer = PyMem_NEW(char, size + 1);
780 if (*buffer == NULL) {
781 Py_DECREF(s);
782 return "(memory error)";
783 }
784 memcpy(*buffer,
785 PyString_AS_STRING(s),
786 size + 1);
787 }
788 Py_DECREF(s);
789 break;
790 }
791
Fred Drake25871c02000-05-03 15:17:02 +0000792 case 'u': /* raw unicode buffer (Py_UNICODE *) */
793 {
794 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000795 void **p = (void **)va_arg(*p_va, char **);
796 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Fred Drake25871c02000-05-03 15:17:02 +0000797 int *q = va_arg(*p_va, int *);
798 int count;
799
800 if ( pb == NULL ||
801 pb->bf_getreadbuffer == NULL ||
802 pb->bf_getsegcount == NULL )
803 return "read-only buffer";
804 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
805 return "single-segment read-only buffer";
806 if ( (count =
807 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
808 return "(unspecified)";
809 /* buffer interface returns bytes, we want
810 length in characters */
811 *q = count/(sizeof(Py_UNICODE));
812 format++;
813 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000814 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
Fred Drake25871c02000-05-03 15:17:02 +0000815
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000816 if (PyUnicode_Check(arg))
Fred Drake25871c02000-05-03 15:17:02 +0000817 *p = PyUnicode_AS_UNICODE(arg);
818 else
819 return "unicode";
820 }
821 break;
822 }
823
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000824 case 'S': /* string object */
825 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 PyObject **p = va_arg(*p_va, PyObject **);
827 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000828 *p = arg;
829 else
830 return "string";
831 break;
832 }
833
Guido van Rossume826ef02000-03-10 23:02:17 +0000834 case 'U': /* Unicode object */
835 {
836 PyObject **p = va_arg(*p_va, PyObject **);
837 if (PyUnicode_Check(arg))
838 *p = arg;
839 else
840 return "unicode";
841 break;
842 }
843
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000844 case 'O': /* object */
845 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 PyTypeObject *type;
847 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000848 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000850 p = va_arg(*p_va, PyObject **);
851 format++;
852 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000853 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000854 else
855 return type->tp_name;
856
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000857 }
858 else if (*format == '?') {
859 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000860 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000861 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000862 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000863 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000864 else
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000865 return "(unspecified)";
Guido van Rossumfccfe891998-05-15 22:04:07 +0000866
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000867 }
868 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000869 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000871 converter convert = va_arg(*p_va, converter);
872 void *addr = va_arg(*p_va, void *);
873 format++;
874 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000875 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000876 }
877 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000879 *p = arg;
880 }
881 break;
882 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000883
884
885 case 'w': /* memory buffer, read-write access */
886 {
887 void **p = va_arg(*p_va, void **);
888 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
889 int count;
890
891 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
892 pb->bf_getsegcount == NULL )
893 return "read-write buffer";
894 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
895 return "single-segment read-write buffer";
896 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
897 return "(unspecified)";
898 if (*format == '#') {
899 int *q = va_arg(*p_va, int *);
900
901 *q = count;
902 format++;
903 }
904 break;
905 }
906
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000907 case 't': /* 8-bit character buffer, read-only access */
908 {
909 const char **p = va_arg(*p_va, const char **);
910 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
911 int count;
912
913 if ( *format++ != '#' )
914 return "invalid use of 't' format character";
915 if ( !PyType_HasFeature(
916 arg->ob_type,
917 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
918 pb == NULL ||
919 pb->bf_getcharbuffer == NULL ||
920 pb->bf_getsegcount == NULL )
921 return "read-only character buffer";
922 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
923 return "single-segment read-only buffer";
924 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
925 return "(unspecified)";
926
927 *va_arg(*p_va, int *) = count;
928
929 break;
930 }
931
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000932
933 default:
934 return "impossible<bad format char>";
935
936 }
937
938 *p_format = format;
939 return NULL;
940}
Guido van Rossumaa354651996-08-19 19:32:04 +0000941
942
943/* Support for keyword arguments donated by
944 Geoff Philbrick <philbric@delphi.hks.com> */
945
946#ifdef HAVE_STDARG_PROTOTYPES
947/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948int PyArg_ParseTupleAndKeywords(PyObject *args,
949 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000950 char *format,
951 char **kwlist, ...)
952#else
953/* VARARGS */
954int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
955#endif
956{
957 int retval;
958 va_list va;
959#ifdef HAVE_STDARG_PROTOTYPES
960
961 va_start(va, kwlist);
962#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 PyObject *args;
964 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000965 char *format;
966 char **kwlist;
967
968 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 args = va_arg(va, PyObject *);
970 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000971 format = va_arg(va, char *);
972 kwlist = va_arg(va, char **);
973#endif
974 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
975 va_end(va);
976 return retval;
977}
978
979
980static int
981vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 PyObject *args;
983 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000984 char *format;
985 char **kwlist;
986 va_list *p_va;
987{
988 char msgbuf[256];
989 int levels[32];
990 char *fname = NULL;
991 char *message = NULL;
992 int min = -1;
993 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000994 char *formatsave = format;
995 int i, len, tplen, kwlen;
996 char *msg, *ks, **p;
997 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000999
1000 /* nested tuples cannot be parsed when using keyword arguments */
1001
1002 for (;;) {
1003 int c = *format++;
1004 if (c == '(') {
1005 PyErr_SetString(PyExc_SystemError,
1006 "tuple found in format when using keyword arguments");
1007 return 0;
1008 }
1009 else if (c == '\0')
1010 break;
1011 else if (c == ':') {
1012 fname = format;
1013 break;
1014 }
1015 else if (c == ';') {
1016 message = format;
1017 break;
1018 }
1019 else if (isalpha(c))
1020 max++;
1021 else if (c == '|')
1022 min = max;
1023 }
1024
1025 if (min < 0)
1026 min = max;
1027
1028 format = formatsave;
1029
1030 if (!PyTuple_Check(args)) {
1031 PyErr_SetString(PyExc_SystemError,
1032 "new style getargs format but argument is not a tuple");
1033 return 0;
1034 }
1035
1036 tplen = PyTuple_Size(args);
1037
1038 /* do a cursory check of the keywords just to see how many we got */
1039
1040 if (keywords) {
1041 if (!PyDict_Check(keywords)) {
1042 PyErr_SetString(PyExc_SystemError,
1043 "non-dictionary object received when keyword dictionary expected");
1044 return 0;
1045 }
1046 kwlen = PyDict_Size(keywords);
1047 }
1048 else {
1049 kwlen = 0;
1050 }
1051
1052 /* make sure there are no duplicate values for an argument;
1053 its not clear when to use the term "keyword argument vs.
1054 keyword parameter in messages */
1055
1056 if (keywords) {
1057 for (i = 0; i < tplen; i++) {
1058 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1059 sprintf(msgbuf,
1060 "keyword parameter %s redefined",
1061 kwlist[i]);
1062 PyErr_SetString(PyExc_TypeError, msgbuf);
1063 return 0;
1064 }
1065 }
1066 }
1067 PyErr_Clear(); /* I'm not which Py functions set the error string */
1068
1069 /* required arguments missing from args can be supplied by keyword
1070 arguments */
1071
1072 len = tplen;
1073 if (keywords && tplen < min) {
1074 for (i = tplen; i < min; i++) {
1075 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1076 len++;
1077 }
1078 }
1079 }
1080 PyErr_Clear();
1081
1082 /* make sure we got an acceptable number of arguments; the message
1083 is a little confusing with keywords since keyword arguments
1084 which are supplied, but don't match the required arguments
1085 are not included in the "%d given" part of the message */
1086
1087 if (len < min || max < len) {
1088 if (message == NULL) {
1089 sprintf(msgbuf,
1090 "%s requires %s %d argument%s; %d given",
1091 fname==NULL ? "function" : fname,
1092 min==max ? "exactly"
1093 : len < min ? "at least" : "at most",
1094 len < min ? min : max,
1095 (len < min ? min : max) == 1 ? "" : "s",
1096 len);
1097 message = msgbuf;
1098 }
1099 PyErr_SetString(PyExc_TypeError, message);
1100 return 0;
1101 }
1102
1103 for (i = 0; i < tplen; i++) {
1104 if (*format == '|')
1105 format++;
1106 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1107 levels, msgbuf);
1108 if (msg) {
1109 seterror(i+1, msg, levels, fname, message);
1110 return 0;
1111 }
1112 }
1113
1114 /* handle no keyword parameters in call */
1115
1116 if (!keywords) return 1;
1117
1118 /* make sure the number of keywords in the keyword list matches the
1119 number of items in the format string */
1120
1121 nkwds = 0;
1122 p = kwlist;
1123 for (;;) {
1124 if (!*(p++)) break;
1125 nkwds++;
1126 }
1127
1128 if (nkwds != max) {
1129 PyErr_SetString(PyExc_SystemError,
1130 "number of items in format string and keyword list do not match");
1131 return 0;
1132 }
1133
1134 /* convert the keyword arguments; this uses the format
1135 string where it was left after processing args */
1136
1137 converted = 0;
1138 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001140 if (*format == '|')
1141 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001142 item = PyMapping_GetItemString(keywords, kwlist[i]);
1143 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001144 msg = convertitem(item, &format, p_va, levels, msgbuf);
1145 if (msg) {
1146 seterror(i+1, msg, levels, fname, message);
1147 return 0;
1148 }
1149 converted++;
1150 }
1151 else {
1152 PyErr_Clear();
1153 msg = skipitem(&format, p_va);
1154 if (msg) {
1155 seterror(i+1, msg, levels, fname, message);
1156 return 0;
1157 }
1158 }
1159 }
1160
1161 /* make sure there are no extraneous keyword arguments */
1162
1163 pos = 0;
1164 if (converted < kwlen) {
1165 while (PyDict_Next(keywords, &pos, &key, &value)) {
1166 match = 0;
1167 ks = PyString_AsString(key);
1168 for (i = 0; i < nkwds; i++) {
1169 if (!strcmp(ks, kwlist[i])) {
1170 match = 1;
1171 break;
1172 }
1173 }
1174 if (!match) {
1175 sprintf(msgbuf,
Guido van Rossum80dc16b2000-05-08 14:02:41 +00001176 "%s is an invalid keyword argument for this function",
Guido van Rossumaa354651996-08-19 19:32:04 +00001177 ks);
1178 PyErr_SetString(PyExc_TypeError, msgbuf);
1179 return 0;
1180 }
1181 }
1182 }
1183
1184 return 1;
1185}
1186
1187
1188static char *
1189skipitem(p_format, p_va)
1190 char **p_format;
1191 va_list *p_va;
1192{
1193 char *format = *p_format;
1194 char c = *format++;
1195
1196 switch (c) {
1197
1198 case 'b': /* byte -- very short int */
1199 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001200 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001201 break;
1202 }
1203
1204 case 'h': /* short int */
1205 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001206 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001207 break;
1208 }
1209
1210 case 'i': /* int */
1211 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001212 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001213 break;
1214 }
1215
1216 case 'l': /* long int */
1217 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001218 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001219 break;
1220 }
1221
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001222#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001223 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001224 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001225 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001226 break;
1227 }
1228#endif
1229
Guido van Rossumaa354651996-08-19 19:32:04 +00001230 case 'f': /* float */
1231 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001232 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001233 break;
1234 }
1235
1236 case 'd': /* double */
1237 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001238 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001239 break;
1240 }
1241
1242#ifndef WITHOUT_COMPLEX
1243 case 'D': /* complex double */
1244 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001245 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001246 break;
1247 }
1248#endif /* WITHOUT_COMPLEX */
1249
1250 case 'c': /* char */
1251 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001252 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001253 break;
1254 }
1255
1256 case 's': /* string */
1257 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001258 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001259 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001260 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001261 format++;
1262 }
1263 break;
1264 }
1265
1266 case 'z': /* string */
1267 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001268 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001269 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001270 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001271 format++;
1272 }
1273 break;
1274 }
1275
1276 case 'S': /* string object */
1277 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001278 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001279 break;
1280 }
1281
1282 case 'O': /* object */
1283 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001284 if (*format == '!') {
1285 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001286 (void) va_arg(*p_va, PyTypeObject*);
1287 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001288 }
1289#if 0
1290/* I don't know what this is for */
1291 else if (*format == '?') {
1292 inquiry pred = va_arg(*p_va, inquiry);
1293 format++;
1294 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001295 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001296 }
1297 }
1298#endif
1299 else if (*format == '&') {
1300 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001301 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +00001302 (void) va_arg(*p_va, converter);
1303 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001304 format++;
1305 }
1306 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001307 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001308 }
1309 break;
1310 }
1311
1312 default:
1313 return "impossible<bad format char>";
1314
1315 }
1316
1317 *p_format = format;
1318 return NULL;
1319}