blob: c1a5d6b8e01ca5427d1219b9ccf3f36c14f78ae6 [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>
21
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000022
Guido van Rossum79f25d91997-04-29 20:08:16 +000023int PyArg_Parse Py_PROTO((PyObject *, char *, ...));
24int PyArg_ParseTuple Py_PROTO((PyObject *, char *, ...));
Guido van Rossum13454c31997-05-05 21:57:29 +000025int PyArg_VaParse Py_PROTO((PyObject *, char *, va_list));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000026
Guido van Rossum79f25d91997-04-29 20:08:16 +000027int PyArg_ParseTupleAndKeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000028 char *, char **, ...));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000029
30/* Forward */
Guido van Rossum79f25d91997-04-29 20:08:16 +000031static int vgetargs1 Py_PROTO((PyObject *, char *, va_list *, int));
32static void seterror Py_PROTO((int, char *, int *, char *, char *));
33static char *convertitem Py_PROTO((PyObject *, char **, va_list *,
34 int *, char *));
35static char *converttuple Py_PROTO((PyObject *, char **, va_list *,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000036 int *, char *, int));
Guido van Rossum79f25d91997-04-29 20:08:16 +000037static char *convertsimple Py_PROTO((PyObject *, char **, va_list *, char *));
38static char *convertsimple1 Py_PROTO((PyObject *, char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000039
Guido van Rossum79f25d91997-04-29 20:08:16 +000040static int vgetargskeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000041 char *, char **, va_list *));
Guido van Rossum79f25d91997-04-29 20:08:16 +000042static char *skipitem Py_PROTO((char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000043
44#ifdef HAVE_STDARG_PROTOTYPES
45/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000046int PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000047#else
48/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000049int PyArg_Parse(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000050#endif
51{
52 int retval;
53 va_list va;
54#ifdef HAVE_STDARG_PROTOTYPES
55
56 va_start(va, format);
57#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000058 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000059 char *format;
60
61 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +000062 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000063 format = va_arg(va, char *);
64#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000065 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000066 va_end(va);
67 return retval;
68}
69
70
71#ifdef HAVE_STDARG_PROTOTYPES
72/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000073int PyArg_ParseTuple(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000074#else
75/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000076int PyArg_ParseTuple(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000077#endif
78{
79 int retval;
80 va_list va;
81#ifdef HAVE_STDARG_PROTOTYPES
82
83 va_start(va, format);
84#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000085 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000086 char *format;
87
88 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +000089 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000090 format = va_arg(va, char *);
91#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000092 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000093 va_end(va);
94 return retval;
95}
96
97
98int
Guido van Rossum13454c31997-05-05 21:57:29 +000099PyArg_VaParse(args, format, va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000100 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000101 char *format;
102 va_list va;
103{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000104 va_list lva;
105
106#ifdef VA_LIST_IS_ARRAY
107 memcpy(lva, va, sizeof(va_list));
108#else
109 lva = va;
110#endif
111
112 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000113}
114
115
116static int
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000117vgetargs1(args, format, p_va, compat)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000118 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000119 char *format;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000120 va_list *p_va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000121 int compat;
122{
123 char msgbuf[256];
124 int levels[32];
125 char *fname = NULL;
126 char *message = NULL;
127 int min = -1;
128 int max = 0;
129 int level = 0;
130 char *formatsave = format;
131 int i, len;
132 char *msg;
133
134 for (;;) {
135 int c = *format++;
136 if (c == '(' /* ')' */) {
137 if (level == 0)
138 max++;
139 level++;
140 }
141 else if (/* '(' */ c == ')') {
142 if (level == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000143 Py_FatalError(/* '(' */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000144 "excess ')' in getargs format");
145 else
146 level--;
147 }
148 else if (c == '\0')
149 break;
150 else if (c == ':') {
151 fname = format;
152 break;
153 }
154 else if (c == ';') {
155 message = format;
156 break;
157 }
158 else if (level != 0)
159 ; /* Pass */
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000160 else if (c == 'e')
161 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000162 else if (isalpha(c))
163 max++;
164 else if (c == '|')
165 min = max;
166 }
167
168 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000169 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000170
171 if (min < 0)
172 min = max;
173
174 format = formatsave;
175
176 if (compat) {
177 if (max == 0) {
178 if (args == NULL)
179 return 1;
180 sprintf(msgbuf, "%s requires no arguments",
181 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000183 return 0;
184 }
185 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000186 if (args == NULL) {
187 sprintf(msgbuf,
188 "%s requires at least one argument",
189 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000191 return 0;
192 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000193 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000194 if (msg == NULL)
195 return 1;
196 seterror(levels[0], msg, levels+1, fname, message);
197 return 0;
198 }
199 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000200 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000201 "old style getargs format uses new features");
202 return 0;
203 }
204 }
205
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 if (!PyTuple_Check(args)) {
207 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000208 "new style getargs format but argument is not a tuple");
209 return 0;
210 }
211
Guido van Rossum79f25d91997-04-29 20:08:16 +0000212 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000213
214 if (len < min || max < len) {
215 if (message == NULL) {
216 sprintf(msgbuf,
217 "%s requires %s %d argument%s; %d given",
218 fname==NULL ? "function" : fname,
219 min==max ? "exactly"
220 : len < min ? "at least" : "at most",
221 len < min ? min : max,
222 (len < min ? min : max) == 1 ? "" : "s",
223 len);
224 message = msgbuf;
225 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000227 return 0;
228 }
229
230 for (i = 0; i < len; i++) {
231 if (*format == '|')
232 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000234 levels, msgbuf);
235 if (msg) {
236 seterror(i+1, msg, levels, fname, message);
237 return 0;
238 }
239 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000240
Guido van Rossum730806d1998-04-10 22:27:42 +0000241 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000242 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000243 *format != '|' && *format != ':' && *format != ';') {
244 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000245 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000246 return 0;
247 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000248
249 return 1;
250}
251
252
253
254static void
255seterror(iarg, msg, levels, fname, message)
256 int iarg;
257 char *msg;
258 int *levels;
259 char *fname;
260 char *message;
261{
262 char buf[256];
263 int i;
264 char *p = buf;
265
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000267 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000268 if (iarg == 0 && message == NULL)
269 message = msg;
270 else if (message == NULL) {
271 if (fname != NULL) {
272 sprintf(p, "%s, ", fname);
273 p += strlen(p);
274 }
275 sprintf(p, "argument %d", iarg);
276 i = 0;
277 p += strlen(p);
278 while (levels[i] > 0) {
279 sprintf(p, ", item %d", levels[i]-1);
280 p += strlen(p);
281 i++;
282 }
283 sprintf(p, ": expected %s found", msg);
284 message = buf;
285 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000287}
288
289
290/* Convert a tuple argument.
291 On entry, *p_format points to the character _after_ the opening '('.
292 On successful exit, *p_format points to the closing ')'.
293 If successful:
294 *p_format and *p_va are updated,
295 *levels and *msgbuf are untouched,
296 and NULL is returned.
297 If the argument is invalid:
298 *p_format is unchanged,
299 *p_va is undefined,
300 *levels is a 0-terminated list of item numbers,
301 *msgbuf contains an error message, whose format is:
302 "<typename1>, <typename2>", where:
303 <typename1> is the name of the expected type, and
304 <typename2> is the name of the actual type,
305 (so you can surround it by "expected ... found"),
306 and msgbuf is returned.
307*/
308
309static char *
310converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000311 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000312 char **p_format;
313 va_list *p_va;
314 int *levels;
315 char *msgbuf;
316 int toplevel;
317{
318 int level = 0;
319 int n = 0;
320 char *format = *p_format;
321 int i;
322
323 for (;;) {
324 int c = *format++;
325 if (c == '(') {
326 if (level == 0)
327 n++;
328 level++;
329 }
330 else if (c == ')') {
331 if (level == 0)
332 break;
333 level--;
334 }
335 else if (c == ':' || c == ';' || c == '\0')
336 break;
337 else if (level == 0 && isalpha(c))
338 n++;
339 }
340
Guido van Rossum66368cc1999-02-17 23:16:43 +0000341 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000342 levels[0] = 0;
343 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000344 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000346 return msgbuf;
347 }
348
Guido van Rossum66368cc1999-02-17 23:16:43 +0000349 if ((i = PySequence_Length(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000350 levels[0] = 0;
351 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000352 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
353 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000354 return msgbuf;
355 }
356
357 format = *p_format;
358 for (i = 0; i < n; i++) {
359 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000360 PyObject *item;
361 item = PySequence_GetItem(arg, i);
362 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
363 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
364 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000365 if (msg != NULL) {
366 levels[0] = i+1;
367 return msg;
368 }
369 }
370
371 *p_format = format;
372 return NULL;
373}
374
375
376/* Convert a single item. */
377
378static char *
379convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000380 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000381 char **p_format;
382 va_list *p_va;
383 int *levels;
384 char *msgbuf;
385{
386 char *msg;
387 char *format = *p_format;
388
389 if (*format == '(' /* ')' */) {
390 format++;
391 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
392 if (msg == NULL)
393 format++;
394 }
395 else {
396 msg = convertsimple(arg, &format, p_va, msgbuf);
397 if (msg != NULL)
398 levels[0] = 0;
399 }
400 if (msg == NULL)
401 *p_format = format;
402 return msg;
403}
404
405
406/* Convert a non-tuple argument. Adds to convertsimple1 functionality
407 by appending ", <actual argument type>" to error message. */
408
409static char *
410convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000412 char **p_format;
413 va_list *p_va;
414 char *msgbuf;
415{
416 char *msg = convertsimple1(arg, p_format, p_va);
417 if (msg != NULL) {
418 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000420 msg = msgbuf;
421 }
422 return msg;
423}
424
425
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000426/* Internal API needed by convertsimple1(): */
427extern
428PyObject *_PyUnicode_AsUTF8String(PyObject *unicode,
429 const char *errors);
430
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000431/* Convert a non-tuple argument. Return NULL if conversion went OK,
432 or a string representing the expected type if the conversion failed.
433 When failing, an exception may or may not have been raised.
434 Don't call if a tuple is expected. */
435
436static char *
437convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000439 char **p_format;
440 va_list *p_va;
441{
442 char *format = *p_format;
443 char c = *format++;
444
445 switch (c) {
446
Fred Drake230cae72000-05-09 21:50:00 +0000447 case 'b': /* unsigned byte -- very short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000448 {
449 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000450 long ival = PyInt_AsLong(arg);
451 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000452 return "integer<b>";
Fred Drake230cae72000-05-09 21:50:00 +0000453 else if (ival < 0) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000454 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000455 "unsigned byte integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000456 return "integer<b>";
457 }
Fred Drake230cae72000-05-09 21:50:00 +0000458 else if (ival > UCHAR_MAX) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000459 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000460 "unsigned byte integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000461 return "integer<b>";
462 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000463 else
Fred Drake230cae72000-05-09 21:50:00 +0000464 *p = (unsigned char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000465 break;
466 }
467
Fred Drake230cae72000-05-09 21:50:00 +0000468 case 'h': /* signed short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000469 {
470 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 long ival = PyInt_AsLong(arg);
472 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000473 return "integer<h>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000474 else if (ival < SHRT_MIN) {
475 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000476 "signed short integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000477 return "integer<h>";
478 }
479 else if (ival > SHRT_MAX) {
480 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000481 "signed short integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000482 return "integer<h>";
483 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000484 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000485 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000486 break;
487 }
488
Fred Drake230cae72000-05-09 21:50:00 +0000489 case 'i': /* signed int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000490 {
491 int *p = va_arg(*p_va, int *);
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<i>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000495 else if (ival > INT_MAX) {
496 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000497 "signed integer is greater than maximum");
498 return "integer<i>";
499 }
500 else if (ival < INT_MIN) {
501 PyErr_SetString(PyExc_OverflowError,
502 "signed integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000503 return "integer<i>";
504 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000505 else
506 *p = ival;
507 break;
508 }
509
510 case 'l': /* long int */
511 {
512 long *p = va_arg(*p_va, long *);
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<l>";
516 else
517 *p = ival;
518 break;
519 }
520
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000521#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000522 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000523 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000524 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
525 LONG_LONG ival = PyLong_AsLongLong( arg );
526 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000527 return "long<L>";
528 } else {
529 *p = ival;
530 }
531 break;
532 }
533#endif
534
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000535 case 'f': /* float */
536 {
537 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 double dval = PyFloat_AsDouble(arg);
539 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000540 return "float<f>";
541 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000542 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000543 break;
544 }
545
546 case 'd': /* double */
547 {
548 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 double dval = PyFloat_AsDouble(arg);
550 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000551 return "float<d>";
552 else
553 *p = dval;
554 break;
555 }
556
Guido van Rossum530956d1996-07-21 02:27:43 +0000557#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000558 case 'D': /* complex double */
559 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000560 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000561 Py_complex cval;
562 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000564 return "complex<D>";
565 else
566 *p = cval;
567 break;
568 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000569#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000570
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000571 case 'c': /* char */
572 {
573 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 if (PyString_Check(arg) && PyString_Size(arg) == 1)
575 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000576 else
577 return "char";
578 break;
579 }
580
581 case 's': /* string */
582 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000583 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000584 void **p = (void **)va_arg(*p_va, char **);
585 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000586 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000587 int count;
588
589 if ( pb == NULL ||
590 pb->bf_getreadbuffer == NULL ||
591 pb->bf_getsegcount == NULL )
592 return "read-only buffer";
593 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
594 return "single-segment read-only buffer";
595 if ( (count =
596 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
597 return "(unspecified)";
598 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000599 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000600 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000601 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000602
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000603 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000604 *p = PyString_AS_STRING(arg);
605 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000606 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000607 if (arg == NULL)
608 return "unicode conversion error";
609 *p = PyString_AS_STRING(arg);
610 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000611 else
612 return "string";
613 if ((int)strlen(*p) != PyString_Size(arg))
614 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000615 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000616 break;
617 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000618
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000619 case 'z': /* string, may be NULL (None) */
620 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000621 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000622 void **p = (void **)va_arg(*p_va, char **);
623 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000624 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000625 int count;
626
627 if (arg == Py_None) {
628 *p = 0;
629 *q = 0;
630 } else {
631 if ( pb == NULL ||
632 pb->bf_getreadbuffer == NULL ||
633 pb->bf_getsegcount == NULL )
634 return "read-only buffer";
635 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
636 return "single-segment read-only buffer";
637 if ( (count = (*pb->bf_getreadbuffer)
638 (arg, 0, p)) < 0 )
639 return "(unspecified)";
640 *q = count;
641 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000642 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000643 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000644 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000645
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000646 if (arg == Py_None)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000647 *p = 0;
648 else if (PyString_Check(arg))
649 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000650 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000651 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000652 if (arg == NULL)
653 return "unicode conversion error";
654 *p = PyString_AS_STRING(arg);
655 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000656 else
657 return "None or string";
658 if (*format == '#') {
659 int *q = va_arg(*p_va, int *);
660 if (arg == Py_None)
661 *q = 0;
662 else
663 *q = PyString_Size(arg);
664 format++;
665 }
666 else if (*p != NULL &&
667 (int)strlen(*p) != PyString_Size(arg))
668 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000669 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000670 break;
671 }
672
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000673 case 'e': /* encoded string */
674 {
675 char **buffer;
676 const char *encoding;
677 PyObject *u, *s;
678 int size;
679
680 /* Get 'e' parameter: the encoding name */
681 encoding = (const char *)va_arg(*p_va, const char *);
682 if (encoding == NULL)
683 return "(encoding is NULL)";
684
685 /* Get 's' parameter: the output buffer to use */
686 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000687 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000688 buffer = (char **)va_arg(*p_va, char **);
689 format++;
690 if (buffer == NULL)
691 return "(buffer is NULL)";
692
693 /* Convert object to Unicode */
694 u = PyUnicode_FromObject(arg);
695 if (u == NULL)
696 return "string, unicode or text buffer";
697
698 /* Encode object; use default error handling */
699 s = PyUnicode_AsEncodedString(u,
700 encoding,
701 NULL);
702 Py_DECREF(u);
703 if (s == NULL)
704 return "(encoding failed)";
705 if (!PyString_Check(s)) {
706 Py_DECREF(s);
707 return "(encoder failed to return a string)";
708 }
709 size = PyString_GET_SIZE(s);
710
711 /* Write output; output is guaranteed to be
712 0-terminated */
713 if (*format == '#') {
714 /* Using buffer length parameter '#':
715
716 - if *buffer is NULL, a new buffer
717 of the needed size is allocated and
718 the data copied into it; *buffer is
719 updated to point to the new buffer;
720 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000721 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000722
723 - if *buffer is not NULL, the data
724 is copied to *buffer; *buffer_len
725 has to be set to the size of the
726 buffer on input; buffer overflow is
727 signalled with an error; buffer has
728 to provide enough room for the
729 encoded string plus the trailing
730 0-byte
731
732 - in both cases, *buffer_len is
733 updated to the size of the buffer
734 /excluding/ the trailing 0-byte
735
736 */
737 int *buffer_len = va_arg(*p_va, int *);
738
739 format++;
740 if (buffer_len == NULL)
741 return "(buffer_len is NULL)";
742 if (*buffer == NULL) {
743 *buffer = PyMem_NEW(char, size + 1);
744 if (*buffer == NULL) {
745 Py_DECREF(s);
746 return "(memory error)";
747 }
748 } else {
749 if (size + 1 > *buffer_len) {
750 Py_DECREF(s);
751 return "(buffer overflow)";
752 }
753 }
754 memcpy(*buffer,
755 PyString_AS_STRING(s),
756 size + 1);
757 *buffer_len = size;
758 } else {
759 /* Using a 0-terminated buffer:
760
761 - the encoded string has to be
762 0-terminated for this variant to
763 work; if it is not, an error raised
764
765 - a new buffer of the needed size
766 is allocated and the data copied
767 into it; *buffer is updated to
768 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000769 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000770 after usage
771
772 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000773 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000774 return "(encoded string without "\
775 "NULL bytes)";
776 *buffer = PyMem_NEW(char, size + 1);
777 if (*buffer == NULL) {
778 Py_DECREF(s);
779 return "(memory error)";
780 }
781 memcpy(*buffer,
782 PyString_AS_STRING(s),
783 size + 1);
784 }
785 Py_DECREF(s);
786 break;
787 }
788
Fred Drake25871c02000-05-03 15:17:02 +0000789 case 'u': /* raw unicode buffer (Py_UNICODE *) */
790 {
791 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000792 void **p = (void **)va_arg(*p_va, char **);
793 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Fred Drake25871c02000-05-03 15:17:02 +0000794 int *q = va_arg(*p_va, int *);
795 int count;
796
797 if ( pb == NULL ||
798 pb->bf_getreadbuffer == NULL ||
799 pb->bf_getsegcount == NULL )
800 return "read-only buffer";
801 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
802 return "single-segment read-only buffer";
803 if ( (count =
804 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
805 return "(unspecified)";
806 /* buffer interface returns bytes, we want
807 length in characters */
808 *q = count/(sizeof(Py_UNICODE));
809 format++;
810 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000811 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
Fred Drake25871c02000-05-03 15:17:02 +0000812
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000813 if (PyUnicode_Check(arg))
Fred Drake25871c02000-05-03 15:17:02 +0000814 *p = PyUnicode_AS_UNICODE(arg);
815 else
816 return "unicode";
817 }
818 break;
819 }
820
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000821 case 'S': /* string object */
822 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000823 PyObject **p = va_arg(*p_va, PyObject **);
824 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000825 *p = arg;
826 else
827 return "string";
828 break;
829 }
830
Guido van Rossume826ef02000-03-10 23:02:17 +0000831 case 'U': /* Unicode object */
832 {
833 PyObject **p = va_arg(*p_va, PyObject **);
834 if (PyUnicode_Check(arg))
835 *p = arg;
836 else
837 return "unicode";
838 break;
839 }
840
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000841 case 'O': /* object */
842 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843 PyTypeObject *type;
844 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000845 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000847 p = va_arg(*p_va, PyObject **);
848 format++;
849 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000850 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000851 else
852 return type->tp_name;
853
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000854 }
855 else if (*format == '?') {
856 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000857 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000858 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000859 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000860 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000861 else
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000862 return "(unspecified)";
Guido van Rossumfccfe891998-05-15 22:04:07 +0000863
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000864 }
865 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000866 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000867 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000868 converter convert = va_arg(*p_va, converter);
869 void *addr = va_arg(*p_va, void *);
870 format++;
871 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000872 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000873 }
874 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000876 *p = arg;
877 }
878 break;
879 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000880
881
882 case 'w': /* memory buffer, read-write access */
883 {
884 void **p = va_arg(*p_va, void **);
885 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
886 int count;
887
888 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
889 pb->bf_getsegcount == NULL )
890 return "read-write buffer";
891 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
892 return "single-segment read-write buffer";
893 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
894 return "(unspecified)";
895 if (*format == '#') {
896 int *q = va_arg(*p_va, int *);
897
898 *q = count;
899 format++;
900 }
901 break;
902 }
903
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000904 case 't': /* 8-bit character buffer, read-only access */
905 {
906 const char **p = va_arg(*p_va, const char **);
907 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
908 int count;
909
910 if ( *format++ != '#' )
911 return "invalid use of 't' format character";
912 if ( !PyType_HasFeature(
913 arg->ob_type,
914 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
915 pb == NULL ||
916 pb->bf_getcharbuffer == NULL ||
917 pb->bf_getsegcount == NULL )
918 return "read-only character buffer";
919 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
920 return "single-segment read-only buffer";
921 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
922 return "(unspecified)";
923
924 *va_arg(*p_va, int *) = count;
925
926 break;
927 }
928
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000929
930 default:
931 return "impossible<bad format char>";
932
933 }
934
935 *p_format = format;
936 return NULL;
937}
Guido van Rossumaa354651996-08-19 19:32:04 +0000938
939
940/* Support for keyword arguments donated by
941 Geoff Philbrick <philbric@delphi.hks.com> */
942
943#ifdef HAVE_STDARG_PROTOTYPES
944/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945int PyArg_ParseTupleAndKeywords(PyObject *args,
946 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000947 char *format,
948 char **kwlist, ...)
949#else
950/* VARARGS */
951int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
952#endif
953{
954 int retval;
955 va_list va;
956#ifdef HAVE_STDARG_PROTOTYPES
957
958 va_start(va, kwlist);
959#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 PyObject *args;
961 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000962 char *format;
963 char **kwlist;
964
965 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000966 args = va_arg(va, PyObject *);
967 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000968 format = va_arg(va, char *);
969 kwlist = va_arg(va, char **);
970#endif
971 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
972 va_end(va);
973 return retval;
974}
975
976
977static int
978vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000979 PyObject *args;
980 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000981 char *format;
982 char **kwlist;
983 va_list *p_va;
984{
985 char msgbuf[256];
986 int levels[32];
987 char *fname = NULL;
988 char *message = NULL;
989 int min = -1;
990 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000991 char *formatsave = format;
992 int i, len, tplen, kwlen;
993 char *msg, *ks, **p;
994 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000996
997 /* nested tuples cannot be parsed when using keyword arguments */
998
999 for (;;) {
1000 int c = *format++;
1001 if (c == '(') {
1002 PyErr_SetString(PyExc_SystemError,
1003 "tuple found in format when using keyword arguments");
1004 return 0;
1005 }
1006 else if (c == '\0')
1007 break;
1008 else if (c == ':') {
1009 fname = format;
1010 break;
1011 }
1012 else if (c == ';') {
1013 message = format;
1014 break;
1015 }
1016 else if (isalpha(c))
1017 max++;
1018 else if (c == '|')
1019 min = max;
1020 }
1021
1022 if (min < 0)
1023 min = max;
1024
1025 format = formatsave;
1026
1027 if (!PyTuple_Check(args)) {
1028 PyErr_SetString(PyExc_SystemError,
1029 "new style getargs format but argument is not a tuple");
1030 return 0;
1031 }
1032
1033 tplen = PyTuple_Size(args);
1034
1035 /* do a cursory check of the keywords just to see how many we got */
1036
1037 if (keywords) {
1038 if (!PyDict_Check(keywords)) {
1039 PyErr_SetString(PyExc_SystemError,
1040 "non-dictionary object received when keyword dictionary expected");
1041 return 0;
1042 }
1043 kwlen = PyDict_Size(keywords);
1044 }
1045 else {
1046 kwlen = 0;
1047 }
1048
1049 /* make sure there are no duplicate values for an argument;
1050 its not clear when to use the term "keyword argument vs.
1051 keyword parameter in messages */
1052
1053 if (keywords) {
1054 for (i = 0; i < tplen; i++) {
1055 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1056 sprintf(msgbuf,
1057 "keyword parameter %s redefined",
1058 kwlist[i]);
1059 PyErr_SetString(PyExc_TypeError, msgbuf);
1060 return 0;
1061 }
1062 }
1063 }
1064 PyErr_Clear(); /* I'm not which Py functions set the error string */
1065
1066 /* required arguments missing from args can be supplied by keyword
1067 arguments */
1068
1069 len = tplen;
1070 if (keywords && tplen < min) {
1071 for (i = tplen; i < min; i++) {
1072 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1073 len++;
1074 }
1075 }
1076 }
1077 PyErr_Clear();
1078
1079 /* make sure we got an acceptable number of arguments; the message
1080 is a little confusing with keywords since keyword arguments
1081 which are supplied, but don't match the required arguments
1082 are not included in the "%d given" part of the message */
1083
1084 if (len < min || max < len) {
1085 if (message == NULL) {
1086 sprintf(msgbuf,
1087 "%s requires %s %d argument%s; %d given",
1088 fname==NULL ? "function" : fname,
1089 min==max ? "exactly"
1090 : len < min ? "at least" : "at most",
1091 len < min ? min : max,
1092 (len < min ? min : max) == 1 ? "" : "s",
1093 len);
1094 message = msgbuf;
1095 }
1096 PyErr_SetString(PyExc_TypeError, message);
1097 return 0;
1098 }
1099
1100 for (i = 0; i < tplen; i++) {
1101 if (*format == '|')
1102 format++;
1103 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1104 levels, msgbuf);
1105 if (msg) {
1106 seterror(i+1, msg, levels, fname, message);
1107 return 0;
1108 }
1109 }
1110
1111 /* handle no keyword parameters in call */
1112
1113 if (!keywords) return 1;
1114
1115 /* make sure the number of keywords in the keyword list matches the
1116 number of items in the format string */
1117
1118 nkwds = 0;
1119 p = kwlist;
1120 for (;;) {
1121 if (!*(p++)) break;
1122 nkwds++;
1123 }
1124
1125 if (nkwds != max) {
1126 PyErr_SetString(PyExc_SystemError,
1127 "number of items in format string and keyword list do not match");
1128 return 0;
1129 }
1130
1131 /* convert the keyword arguments; this uses the format
1132 string where it was left after processing args */
1133
1134 converted = 0;
1135 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001137 if (*format == '|')
1138 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001139 item = PyMapping_GetItemString(keywords, kwlist[i]);
1140 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001141 msg = convertitem(item, &format, p_va, levels, msgbuf);
1142 if (msg) {
1143 seterror(i+1, msg, levels, fname, message);
1144 return 0;
1145 }
1146 converted++;
1147 }
1148 else {
1149 PyErr_Clear();
1150 msg = skipitem(&format, p_va);
1151 if (msg) {
1152 seterror(i+1, msg, levels, fname, message);
1153 return 0;
1154 }
1155 }
1156 }
1157
1158 /* make sure there are no extraneous keyword arguments */
1159
1160 pos = 0;
1161 if (converted < kwlen) {
1162 while (PyDict_Next(keywords, &pos, &key, &value)) {
1163 match = 0;
1164 ks = PyString_AsString(key);
1165 for (i = 0; i < nkwds; i++) {
1166 if (!strcmp(ks, kwlist[i])) {
1167 match = 1;
1168 break;
1169 }
1170 }
1171 if (!match) {
1172 sprintf(msgbuf,
Guido van Rossum80dc16b2000-05-08 14:02:41 +00001173 "%s is an invalid keyword argument for this function",
Guido van Rossumaa354651996-08-19 19:32:04 +00001174 ks);
1175 PyErr_SetString(PyExc_TypeError, msgbuf);
1176 return 0;
1177 }
1178 }
1179 }
1180
1181 return 1;
1182}
1183
1184
1185static char *
1186skipitem(p_format, p_va)
1187 char **p_format;
1188 va_list *p_va;
1189{
1190 char *format = *p_format;
1191 char c = *format++;
1192
1193 switch (c) {
1194
1195 case 'b': /* byte -- very short int */
1196 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001197 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001198 break;
1199 }
1200
1201 case 'h': /* short int */
1202 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001203 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001204 break;
1205 }
1206
1207 case 'i': /* int */
1208 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001209 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001210 break;
1211 }
1212
1213 case 'l': /* long int */
1214 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001215 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001216 break;
1217 }
1218
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001219#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001220 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001221 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001222 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001223 break;
1224 }
1225#endif
1226
Guido van Rossumaa354651996-08-19 19:32:04 +00001227 case 'f': /* float */
1228 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001229 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001230 break;
1231 }
1232
1233 case 'd': /* double */
1234 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001235 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001236 break;
1237 }
1238
1239#ifndef WITHOUT_COMPLEX
1240 case 'D': /* complex double */
1241 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001242 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001243 break;
1244 }
1245#endif /* WITHOUT_COMPLEX */
1246
1247 case 'c': /* char */
1248 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001249 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001250 break;
1251 }
1252
1253 case 's': /* string */
1254 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001255 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001256 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001257 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001258 format++;
1259 }
1260 break;
1261 }
1262
1263 case 'z': /* string */
1264 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001265 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001266 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001267 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001268 format++;
1269 }
1270 break;
1271 }
1272
1273 case 'S': /* string object */
1274 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001275 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001276 break;
1277 }
1278
1279 case 'O': /* object */
1280 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001281 if (*format == '!') {
1282 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001283 (void) va_arg(*p_va, PyTypeObject*);
1284 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001285 }
1286#if 0
1287/* I don't know what this is for */
1288 else if (*format == '?') {
1289 inquiry pred = va_arg(*p_va, inquiry);
1290 format++;
1291 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001293 }
1294 }
1295#endif
1296 else if (*format == '&') {
1297 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001298 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +00001299 (void) va_arg(*p_va, converter);
1300 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001301 format++;
1302 }
1303 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001305 }
1306 break;
1307 }
1308
1309 default:
1310 return "impossible<bad format char>";
1311
1312 }
1313
1314 *p_format = format;
1315 return NULL;
1316}