blob: 91fe26736b5b4c2b55c87ac3a8cf82270a79779b [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000029
30******************************************************************/
31
32/* New getargs implementation */
33
34/* XXX There are several unchecked sprintf or strcat calls in this file.
35 XXX The only way these can become a danger is if some C code in the
36 XXX Python source (or in an extension) uses ridiculously long names
37 XXX or riduculously deep nesting in format strings. */
38
Guido van Rossum79f25d91997-04-29 20:08:16 +000039#include "Python.h"
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000040
Guido van Rossumc1d50531996-08-21 23:38:24 +000041#include <ctype.h>
42
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000043
Guido van Rossum79f25d91997-04-29 20:08:16 +000044int PyArg_Parse Py_PROTO((PyObject *, char *, ...));
45int PyArg_ParseTuple Py_PROTO((PyObject *, char *, ...));
Guido van Rossum13454c31997-05-05 21:57:29 +000046int PyArg_VaParse Py_PROTO((PyObject *, char *, va_list));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000047
Guido van Rossum79f25d91997-04-29 20:08:16 +000048int PyArg_ParseTupleAndKeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000049 char *, char **, ...));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000050
51/* Forward */
Guido van Rossum79f25d91997-04-29 20:08:16 +000052static int vgetargs1 Py_PROTO((PyObject *, char *, va_list *, int));
53static void seterror Py_PROTO((int, char *, int *, char *, char *));
54static char *convertitem Py_PROTO((PyObject *, char **, va_list *,
55 int *, char *));
56static char *converttuple Py_PROTO((PyObject *, char **, va_list *,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000057 int *, char *, int));
Guido van Rossum79f25d91997-04-29 20:08:16 +000058static char *convertsimple Py_PROTO((PyObject *, char **, va_list *, char *));
59static char *convertsimple1 Py_PROTO((PyObject *, char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000060
Guido van Rossum79f25d91997-04-29 20:08:16 +000061static int vgetargskeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000062 char *, char **, va_list *));
Guido van Rossum79f25d91997-04-29 20:08:16 +000063static char *skipitem Py_PROTO((char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000064
65#ifdef HAVE_STDARG_PROTOTYPES
66/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000067int PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000068#else
69/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000070int PyArg_Parse(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000071#endif
72{
73 int retval;
74 va_list va;
75#ifdef HAVE_STDARG_PROTOTYPES
76
77 va_start(va, format);
78#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000079 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000080 char *format;
81
82 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +000083 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000084 format = va_arg(va, char *);
85#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000086 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000087 va_end(va);
88 return retval;
89}
90
91
92#ifdef HAVE_STDARG_PROTOTYPES
93/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000094int PyArg_ParseTuple(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000095#else
96/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000097int PyArg_ParseTuple(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000098#endif
99{
100 int retval;
101 va_list va;
102#ifdef HAVE_STDARG_PROTOTYPES
103
104 va_start(va, format);
105#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000107 char *format;
108
109 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000110 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000111 format = va_arg(va, char *);
112#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000113 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000114 va_end(va);
115 return retval;
116}
117
118
119int
Guido van Rossum13454c31997-05-05 21:57:29 +0000120PyArg_VaParse(args, format, va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000121 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000122 char *format;
123 va_list va;
124{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000125 va_list lva;
126
127#ifdef VA_LIST_IS_ARRAY
128 memcpy(lva, va, sizeof(va_list));
129#else
130 lva = va;
131#endif
132
133 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000134}
135
136
137static int
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000138vgetargs1(args, format, p_va, compat)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000139 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000140 char *format;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000141 va_list *p_va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000142 int compat;
143{
144 char msgbuf[256];
145 int levels[32];
146 char *fname = NULL;
147 char *message = NULL;
148 int min = -1;
149 int max = 0;
150 int level = 0;
151 char *formatsave = format;
152 int i, len;
153 char *msg;
154
155 for (;;) {
156 int c = *format++;
157 if (c == '(' /* ')' */) {
158 if (level == 0)
159 max++;
160 level++;
161 }
162 else if (/* '(' */ c == ')') {
163 if (level == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000164 Py_FatalError(/* '(' */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000165 "excess ')' in getargs format");
166 else
167 level--;
168 }
169 else if (c == '\0')
170 break;
171 else if (c == ':') {
172 fname = format;
173 break;
174 }
175 else if (c == ';') {
176 message = format;
177 break;
178 }
179 else if (level != 0)
180 ; /* Pass */
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000181 else if (c == 'e')
182 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000183 else if (isalpha(c))
184 max++;
185 else if (c == '|')
186 min = max;
187 }
188
189 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000191
192 if (min < 0)
193 min = max;
194
195 format = formatsave;
196
197 if (compat) {
198 if (max == 0) {
199 if (args == NULL)
200 return 1;
201 sprintf(msgbuf, "%s requires no arguments",
202 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000204 return 0;
205 }
206 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000207 if (args == NULL) {
208 sprintf(msgbuf,
209 "%s requires at least one argument",
210 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000212 return 0;
213 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000214 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000215 if (msg == NULL)
216 return 1;
217 seterror(levels[0], msg, levels+1, fname, message);
218 return 0;
219 }
220 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000221 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000222 "old style getargs format uses new features");
223 return 0;
224 }
225 }
226
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 if (!PyTuple_Check(args)) {
228 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000229 "new style getargs format but argument is not a tuple");
230 return 0;
231 }
232
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000234
235 if (len < min || max < len) {
236 if (message == NULL) {
237 sprintf(msgbuf,
238 "%s requires %s %d argument%s; %d given",
239 fname==NULL ? "function" : fname,
240 min==max ? "exactly"
241 : len < min ? "at least" : "at most",
242 len < min ? min : max,
243 (len < min ? min : max) == 1 ? "" : "s",
244 len);
245 message = msgbuf;
246 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000248 return 0;
249 }
250
251 for (i = 0; i < len; i++) {
252 if (*format == '|')
253 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000255 levels, msgbuf);
256 if (msg) {
257 seterror(i+1, msg, levels, fname, message);
258 return 0;
259 }
260 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000261
Guido van Rossum730806d1998-04-10 22:27:42 +0000262 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000263 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000264 *format != '|' && *format != ':' && *format != ';') {
265 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000266 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000267 return 0;
268 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000269
270 return 1;
271}
272
273
274
275static void
276seterror(iarg, msg, levels, fname, message)
277 int iarg;
278 char *msg;
279 int *levels;
280 char *fname;
281 char *message;
282{
283 char buf[256];
284 int i;
285 char *p = buf;
286
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000288 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000289 if (iarg == 0 && message == NULL)
290 message = msg;
291 else if (message == NULL) {
292 if (fname != NULL) {
293 sprintf(p, "%s, ", fname);
294 p += strlen(p);
295 }
296 sprintf(p, "argument %d", iarg);
297 i = 0;
298 p += strlen(p);
299 while (levels[i] > 0) {
300 sprintf(p, ", item %d", levels[i]-1);
301 p += strlen(p);
302 i++;
303 }
304 sprintf(p, ": expected %s found", msg);
305 message = buf;
306 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000308}
309
310
311/* Convert a tuple argument.
312 On entry, *p_format points to the character _after_ the opening '('.
313 On successful exit, *p_format points to the closing ')'.
314 If successful:
315 *p_format and *p_va are updated,
316 *levels and *msgbuf are untouched,
317 and NULL is returned.
318 If the argument is invalid:
319 *p_format is unchanged,
320 *p_va is undefined,
321 *levels is a 0-terminated list of item numbers,
322 *msgbuf contains an error message, whose format is:
323 "<typename1>, <typename2>", where:
324 <typename1> is the name of the expected type, and
325 <typename2> is the name of the actual type,
326 (so you can surround it by "expected ... found"),
327 and msgbuf is returned.
328*/
329
330static char *
331converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000332 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000333 char **p_format;
334 va_list *p_va;
335 int *levels;
336 char *msgbuf;
337 int toplevel;
338{
339 int level = 0;
340 int n = 0;
341 char *format = *p_format;
342 int i;
343
344 for (;;) {
345 int c = *format++;
346 if (c == '(') {
347 if (level == 0)
348 n++;
349 level++;
350 }
351 else if (c == ')') {
352 if (level == 0)
353 break;
354 level--;
355 }
356 else if (c == ':' || c == ';' || c == '\0')
357 break;
358 else if (level == 0 && isalpha(c))
359 n++;
360 }
361
Guido van Rossum66368cc1999-02-17 23:16:43 +0000362 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000363 levels[0] = 0;
364 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000365 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000367 return msgbuf;
368 }
369
Guido van Rossum66368cc1999-02-17 23:16:43 +0000370 if ((i = PySequence_Length(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000371 levels[0] = 0;
372 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000373 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
374 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000375 return msgbuf;
376 }
377
378 format = *p_format;
379 for (i = 0; i < n; i++) {
380 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000381 PyObject *item;
382 item = PySequence_GetItem(arg, i);
383 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
384 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
385 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000386 if (msg != NULL) {
387 levels[0] = i+1;
388 return msg;
389 }
390 }
391
392 *p_format = format;
393 return NULL;
394}
395
396
397/* Convert a single item. */
398
399static char *
400convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000402 char **p_format;
403 va_list *p_va;
404 int *levels;
405 char *msgbuf;
406{
407 char *msg;
408 char *format = *p_format;
409
410 if (*format == '(' /* ')' */) {
411 format++;
412 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
413 if (msg == NULL)
414 format++;
415 }
416 else {
417 msg = convertsimple(arg, &format, p_va, msgbuf);
418 if (msg != NULL)
419 levels[0] = 0;
420 }
421 if (msg == NULL)
422 *p_format = format;
423 return msg;
424}
425
426
427/* Convert a non-tuple argument. Adds to convertsimple1 functionality
428 by appending ", <actual argument type>" to error message. */
429
430static char *
431convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000433 char **p_format;
434 va_list *p_va;
435 char *msgbuf;
436{
437 char *msg = convertsimple1(arg, p_format, p_va);
438 if (msg != NULL) {
439 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000441 msg = msgbuf;
442 }
443 return msg;
444}
445
446
447/* Convert a non-tuple argument. Return NULL if conversion went OK,
448 or a string representing the expected type if the conversion failed.
449 When failing, an exception may or may not have been raised.
450 Don't call if a tuple is expected. */
451
452static char *
453convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000455 char **p_format;
456 va_list *p_va;
457{
458 char *format = *p_format;
459 char c = *format++;
460
461 switch (c) {
462
463 case 'b': /* byte -- very short int */
464 {
465 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 long ival = PyInt_AsLong(arg);
467 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000468 return "integer<b>";
469 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000470 *p = (char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000471 break;
472 }
473
474 case 'h': /* short int */
475 {
476 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000477 long ival = PyInt_AsLong(arg);
478 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000479 return "integer<h>";
480 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000481 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000482 break;
483 }
484
485 case 'i': /* int */
486 {
487 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488 long ival = PyInt_AsLong(arg);
489 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000490 return "integer<i>";
491 else
492 *p = ival;
493 break;
494 }
495
496 case 'l': /* long int */
497 {
498 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000499 long ival = PyInt_AsLong(arg);
500 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000501 return "integer<l>";
502 else
503 *p = ival;
504 break;
505 }
506
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000507#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000508 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000509 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000510 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
511 LONG_LONG ival = PyLong_AsLongLong( arg );
512 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000513 return "long<L>";
514 } else {
515 *p = ival;
516 }
517 break;
518 }
519#endif
520
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000521 case 'f': /* float */
522 {
523 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000524 double dval = PyFloat_AsDouble(arg);
525 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000526 return "float<f>";
527 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000528 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000529 break;
530 }
531
532 case 'd': /* double */
533 {
534 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 double dval = PyFloat_AsDouble(arg);
536 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000537 return "float<d>";
538 else
539 *p = dval;
540 break;
541 }
542
Guido van Rossum530956d1996-07-21 02:27:43 +0000543#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000544 case 'D': /* complex double */
545 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000546 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000547 Py_complex cval;
548 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000550 return "complex<D>";
551 else
552 *p = cval;
553 break;
554 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000555#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000556
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000557 case 'c': /* char */
558 {
559 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 if (PyString_Check(arg) && PyString_Size(arg) == 1)
561 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000562 else
563 return "char";
564 break;
565 }
566
567 case 's': /* string */
568 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000569 if (*format == '#') { /* any buffer-like object */
570 void **p = (void **)va_arg(*p_va, char **);
571 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000572 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000573 int count;
574
575 if ( pb == NULL ||
576 pb->bf_getreadbuffer == NULL ||
577 pb->bf_getsegcount == NULL )
578 return "read-only buffer";
579 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
580 return "single-segment read-only buffer";
581 if ( (count =
582 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
583 return "(unspecified)";
584 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000585 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000586 } else {
587 char **p = va_arg(*p_va, char **);
588
589 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000590 *p = PyString_AS_STRING(arg);
591 else if (PyUnicode_Check(arg)) {
592 arg = PyUnicode_AsUTF8String(arg);
593 if (arg == NULL)
594 return "unicode conversion error";
595 *p = PyString_AS_STRING(arg);
596 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000597 else
598 return "string";
599 if ((int)strlen(*p) != PyString_Size(arg))
600 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000601 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000602 break;
603 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000604
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000605 case 'z': /* string, may be NULL (None) */
606 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000607 if (*format == '#') { /* any buffer-like object */
608 void **p = (void **)va_arg(*p_va, char **);
609 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000610 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000611 int count;
612
613 if (arg == Py_None) {
614 *p = 0;
615 *q = 0;
616 } else {
617 if ( pb == NULL ||
618 pb->bf_getreadbuffer == NULL ||
619 pb->bf_getsegcount == NULL )
620 return "read-only buffer";
621 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
622 return "single-segment read-only buffer";
623 if ( (count = (*pb->bf_getreadbuffer)
624 (arg, 0, p)) < 0 )
625 return "(unspecified)";
626 *q = count;
627 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000628 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000629 } else {
630 char **p = va_arg(*p_va, char **);
631
632 if (arg == Py_None)
633 *p = 0;
634 else if (PyString_Check(arg))
635 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000636 else if (PyUnicode_Check(arg)) {
637 arg = PyUnicode_AsUTF8String(arg);
638 if (arg == NULL)
639 return "unicode conversion error";
640 *p = PyString_AS_STRING(arg);
641 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000642 else
643 return "None or string";
644 if (*format == '#') {
645 int *q = va_arg(*p_va, int *);
646 if (arg == Py_None)
647 *q = 0;
648 else
649 *q = PyString_Size(arg);
650 format++;
651 }
652 else if (*p != NULL &&
653 (int)strlen(*p) != PyString_Size(arg))
654 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000655 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000656 break;
657 }
658
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000659 case 'e': /* encoded string */
660 {
661 char **buffer;
662 const char *encoding;
663 PyObject *u, *s;
664 int size;
665
666 /* Get 'e' parameter: the encoding name */
667 encoding = (const char *)va_arg(*p_va, const char *);
668 if (encoding == NULL)
669 return "(encoding is NULL)";
670
671 /* Get 's' parameter: the output buffer to use */
672 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000673 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000674 buffer = (char **)va_arg(*p_va, char **);
675 format++;
676 if (buffer == NULL)
677 return "(buffer is NULL)";
678
679 /* Convert object to Unicode */
680 u = PyUnicode_FromObject(arg);
681 if (u == NULL)
682 return "string, unicode or text buffer";
683
684 /* Encode object; use default error handling */
685 s = PyUnicode_AsEncodedString(u,
686 encoding,
687 NULL);
688 Py_DECREF(u);
689 if (s == NULL)
690 return "(encoding failed)";
691 if (!PyString_Check(s)) {
692 Py_DECREF(s);
693 return "(encoder failed to return a string)";
694 }
695 size = PyString_GET_SIZE(s);
696
697 /* Write output; output is guaranteed to be
698 0-terminated */
699 if (*format == '#') {
700 /* Using buffer length parameter '#':
701
702 - if *buffer is NULL, a new buffer
703 of the needed size is allocated and
704 the data copied into it; *buffer is
705 updated to point to the new buffer;
706 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000707 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000708
709 - if *buffer is not NULL, the data
710 is copied to *buffer; *buffer_len
711 has to be set to the size of the
712 buffer on input; buffer overflow is
713 signalled with an error; buffer has
714 to provide enough room for the
715 encoded string plus the trailing
716 0-byte
717
718 - in both cases, *buffer_len is
719 updated to the size of the buffer
720 /excluding/ the trailing 0-byte
721
722 */
723 int *buffer_len = va_arg(*p_va, int *);
724
725 format++;
726 if (buffer_len == NULL)
727 return "(buffer_len is NULL)";
728 if (*buffer == NULL) {
729 *buffer = PyMem_NEW(char, size + 1);
730 if (*buffer == NULL) {
731 Py_DECREF(s);
732 return "(memory error)";
733 }
734 } else {
735 if (size + 1 > *buffer_len) {
736 Py_DECREF(s);
737 return "(buffer overflow)";
738 }
739 }
740 memcpy(*buffer,
741 PyString_AS_STRING(s),
742 size + 1);
743 *buffer_len = size;
744 } else {
745 /* Using a 0-terminated buffer:
746
747 - the encoded string has to be
748 0-terminated for this variant to
749 work; if it is not, an error raised
750
751 - a new buffer of the needed size
752 is allocated and the data copied
753 into it; *buffer is updated to
754 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000755 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000756 after usage
757
758 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000759 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000760 return "(encoded string without "\
761 "NULL bytes)";
762 *buffer = PyMem_NEW(char, size + 1);
763 if (*buffer == NULL) {
764 Py_DECREF(s);
765 return "(memory error)";
766 }
767 memcpy(*buffer,
768 PyString_AS_STRING(s),
769 size + 1);
770 }
771 Py_DECREF(s);
772 break;
773 }
774
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000775 case 'S': /* string object */
776 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 PyObject **p = va_arg(*p_va, PyObject **);
778 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000779 *p = arg;
780 else
781 return "string";
782 break;
783 }
784
Guido van Rossume826ef02000-03-10 23:02:17 +0000785 case 'U': /* Unicode object */
786 {
787 PyObject **p = va_arg(*p_va, PyObject **);
788 if (PyUnicode_Check(arg))
789 *p = arg;
790 else
791 return "unicode";
792 break;
793 }
794
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000795 case 'O': /* object */
796 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797 PyTypeObject *type;
798 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000799 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000800 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000801 p = va_arg(*p_va, PyObject **);
802 format++;
803 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000804 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000805 else
806 return type->tp_name;
807
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000808 }
809 else if (*format == '?') {
810 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000811 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000812 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000813 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000814 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000815 else
816 return "(unspecified)";
817
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000818 }
819 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000820 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000822 converter convert = va_arg(*p_va, converter);
823 void *addr = va_arg(*p_va, void *);
824 format++;
825 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000826 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000827 }
828 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000829 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000830 *p = arg;
831 }
832 break;
833 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000834
835
836 case 'w': /* memory buffer, read-write access */
837 {
838 void **p = va_arg(*p_va, void **);
839 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
840 int count;
841
842 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
843 pb->bf_getsegcount == NULL )
844 return "read-write buffer";
845 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
846 return "single-segment read-write buffer";
847 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
848 return "(unspecified)";
849 if (*format == '#') {
850 int *q = va_arg(*p_va, int *);
851
852 *q = count;
853 format++;
854 }
855 break;
856 }
857
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000858 case 't': /* 8-bit character buffer, read-only access */
859 {
860 const char **p = va_arg(*p_va, const char **);
861 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
862 int count;
863
864 if ( *format++ != '#' )
865 return "invalid use of 't' format character";
866 if ( !PyType_HasFeature(
867 arg->ob_type,
868 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
869 pb == NULL ||
870 pb->bf_getcharbuffer == NULL ||
871 pb->bf_getsegcount == NULL )
872 return "read-only character buffer";
873 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
874 return "single-segment read-only buffer";
875 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
876 return "(unspecified)";
877
878 *va_arg(*p_va, int *) = count;
879
880 break;
881 }
882
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000883
884 default:
885 return "impossible<bad format char>";
886
887 }
888
889 *p_format = format;
890 return NULL;
891}
Guido van Rossumaa354651996-08-19 19:32:04 +0000892
893
894/* Support for keyword arguments donated by
895 Geoff Philbrick <philbric@delphi.hks.com> */
896
897#ifdef HAVE_STDARG_PROTOTYPES
898/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000899int PyArg_ParseTupleAndKeywords(PyObject *args,
900 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000901 char *format,
902 char **kwlist, ...)
903#else
904/* VARARGS */
905int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
906#endif
907{
908 int retval;
909 va_list va;
910#ifdef HAVE_STDARG_PROTOTYPES
911
912 va_start(va, kwlist);
913#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 PyObject *args;
915 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000916 char *format;
917 char **kwlist;
918
919 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 args = va_arg(va, PyObject *);
921 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000922 format = va_arg(va, char *);
923 kwlist = va_arg(va, char **);
924#endif
925 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
926 va_end(va);
927 return retval;
928}
929
930
931static int
932vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 PyObject *args;
934 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000935 char *format;
936 char **kwlist;
937 va_list *p_va;
938{
939 char msgbuf[256];
940 int levels[32];
941 char *fname = NULL;
942 char *message = NULL;
943 int min = -1;
944 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000945 char *formatsave = format;
946 int i, len, tplen, kwlen;
947 char *msg, *ks, **p;
948 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000949 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000950
951 /* nested tuples cannot be parsed when using keyword arguments */
952
953 for (;;) {
954 int c = *format++;
955 if (c == '(') {
956 PyErr_SetString(PyExc_SystemError,
957 "tuple found in format when using keyword arguments");
958 return 0;
959 }
960 else if (c == '\0')
961 break;
962 else if (c == ':') {
963 fname = format;
964 break;
965 }
966 else if (c == ';') {
967 message = format;
968 break;
969 }
970 else if (isalpha(c))
971 max++;
972 else if (c == '|')
973 min = max;
974 }
975
976 if (min < 0)
977 min = max;
978
979 format = formatsave;
980
981 if (!PyTuple_Check(args)) {
982 PyErr_SetString(PyExc_SystemError,
983 "new style getargs format but argument is not a tuple");
984 return 0;
985 }
986
987 tplen = PyTuple_Size(args);
988
989 /* do a cursory check of the keywords just to see how many we got */
990
991 if (keywords) {
992 if (!PyDict_Check(keywords)) {
993 PyErr_SetString(PyExc_SystemError,
994 "non-dictionary object received when keyword dictionary expected");
995 return 0;
996 }
997 kwlen = PyDict_Size(keywords);
998 }
999 else {
1000 kwlen = 0;
1001 }
1002
1003 /* make sure there are no duplicate values for an argument;
1004 its not clear when to use the term "keyword argument vs.
1005 keyword parameter in messages */
1006
1007 if (keywords) {
1008 for (i = 0; i < tplen; i++) {
1009 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1010 sprintf(msgbuf,
1011 "keyword parameter %s redefined",
1012 kwlist[i]);
1013 PyErr_SetString(PyExc_TypeError, msgbuf);
1014 return 0;
1015 }
1016 }
1017 }
1018 PyErr_Clear(); /* I'm not which Py functions set the error string */
1019
1020 /* required arguments missing from args can be supplied by keyword
1021 arguments */
1022
1023 len = tplen;
1024 if (keywords && tplen < min) {
1025 for (i = tplen; i < min; i++) {
1026 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1027 len++;
1028 }
1029 }
1030 }
1031 PyErr_Clear();
1032
1033 /* make sure we got an acceptable number of arguments; the message
1034 is a little confusing with keywords since keyword arguments
1035 which are supplied, but don't match the required arguments
1036 are not included in the "%d given" part of the message */
1037
1038 if (len < min || max < len) {
1039 if (message == NULL) {
1040 sprintf(msgbuf,
1041 "%s requires %s %d argument%s; %d given",
1042 fname==NULL ? "function" : fname,
1043 min==max ? "exactly"
1044 : len < min ? "at least" : "at most",
1045 len < min ? min : max,
1046 (len < min ? min : max) == 1 ? "" : "s",
1047 len);
1048 message = msgbuf;
1049 }
1050 PyErr_SetString(PyExc_TypeError, message);
1051 return 0;
1052 }
1053
1054 for (i = 0; i < tplen; i++) {
1055 if (*format == '|')
1056 format++;
1057 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1058 levels, msgbuf);
1059 if (msg) {
1060 seterror(i+1, msg, levels, fname, message);
1061 return 0;
1062 }
1063 }
1064
1065 /* handle no keyword parameters in call */
1066
1067 if (!keywords) return 1;
1068
1069 /* make sure the number of keywords in the keyword list matches the
1070 number of items in the format string */
1071
1072 nkwds = 0;
1073 p = kwlist;
1074 for (;;) {
1075 if (!*(p++)) break;
1076 nkwds++;
1077 }
1078
1079 if (nkwds != max) {
1080 PyErr_SetString(PyExc_SystemError,
1081 "number of items in format string and keyword list do not match");
1082 return 0;
1083 }
1084
1085 /* convert the keyword arguments; this uses the format
1086 string where it was left after processing args */
1087
1088 converted = 0;
1089 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001090 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001091 if (*format == '|')
1092 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001093 item = PyMapping_GetItemString(keywords, kwlist[i]);
1094 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001095 msg = convertitem(item, &format, p_va, levels, msgbuf);
1096 if (msg) {
1097 seterror(i+1, msg, levels, fname, message);
1098 return 0;
1099 }
1100 converted++;
1101 }
1102 else {
1103 PyErr_Clear();
1104 msg = skipitem(&format, p_va);
1105 if (msg) {
1106 seterror(i+1, msg, levels, fname, message);
1107 return 0;
1108 }
1109 }
1110 }
1111
1112 /* make sure there are no extraneous keyword arguments */
1113
1114 pos = 0;
1115 if (converted < kwlen) {
1116 while (PyDict_Next(keywords, &pos, &key, &value)) {
1117 match = 0;
1118 ks = PyString_AsString(key);
1119 for (i = 0; i < nkwds; i++) {
1120 if (!strcmp(ks, kwlist[i])) {
1121 match = 1;
1122 break;
1123 }
1124 }
1125 if (!match) {
1126 sprintf(msgbuf,
1127 "%s is an invalid keyword argument for this function",
1128 ks);
1129 PyErr_SetString(PyExc_TypeError, msgbuf);
1130 return 0;
1131 }
1132 }
1133 }
1134
1135 return 1;
1136}
1137
1138
1139static char *
1140skipitem(p_format, p_va)
1141 char **p_format;
1142 va_list *p_va;
1143{
1144 char *format = *p_format;
1145 char c = *format++;
1146
1147 switch (c) {
1148
1149 case 'b': /* byte -- very short int */
1150 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001151 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001152 break;
1153 }
1154
1155 case 'h': /* short int */
1156 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001157 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001158 break;
1159 }
1160
1161 case 'i': /* int */
1162 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001163 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001164 break;
1165 }
1166
1167 case 'l': /* long int */
1168 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001169 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001170 break;
1171 }
1172
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001173#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001174 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001175 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001176 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001177 break;
1178 }
1179#endif
1180
Guido van Rossumaa354651996-08-19 19:32:04 +00001181 case 'f': /* float */
1182 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001183 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001184 break;
1185 }
1186
1187 case 'd': /* double */
1188 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001189 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001190 break;
1191 }
1192
1193#ifndef WITHOUT_COMPLEX
1194 case 'D': /* complex double */
1195 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001196 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001197 break;
1198 }
1199#endif /* WITHOUT_COMPLEX */
1200
1201 case 'c': /* char */
1202 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001203 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001204 break;
1205 }
1206
1207 case 's': /* string */
1208 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001209 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001210 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001211 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001212 format++;
1213 }
1214 break;
1215 }
1216
1217 case 'z': /* string */
1218 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001219 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001220 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001221 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001222 format++;
1223 }
1224 break;
1225 }
1226
1227 case 'S': /* string object */
1228 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001229 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001230 break;
1231 }
1232
1233 case 'O': /* object */
1234 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001235 if (*format == '!') {
1236 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001237 (void) va_arg(*p_va, PyTypeObject*);
1238 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001239 }
1240#if 0
1241/* I don't know what this is for */
1242 else if (*format == '?') {
1243 inquiry pred = va_arg(*p_va, inquiry);
1244 format++;
1245 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001246 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001247 }
1248 }
1249#endif
1250 else if (*format == '&') {
1251 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001252 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +00001253 (void) va_arg(*p_va, converter);
1254 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001255 format++;
1256 }
1257 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001258 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001259 }
1260 break;
1261 }
1262
1263 default:
1264 return "impossible<bad format char>";
1265
1266 }
1267
1268 *p_format = format;
1269 return NULL;
1270}