blob: 1e88a8809a2d7d7c8e59f8fe4ec7016298664ec8 [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000029
30******************************************************************/
31
32/* New getargs implementation */
33
34/* XXX There are several unchecked sprintf or strcat calls in this file.
35 XXX The only way these can become a danger is if some C code in the
36 XXX Python source (or in an extension) uses ridiculously long names
37 XXX or riduculously deep nesting in format strings. */
38
Guido van Rossum79f25d91997-04-29 20:08:16 +000039#include "Python.h"
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000040
Guido van Rossumc1d50531996-08-21 23:38:24 +000041#include <ctype.h>
42
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000043
Guido van Rossum79f25d91997-04-29 20:08:16 +000044int PyArg_Parse Py_PROTO((PyObject *, char *, ...));
45int PyArg_ParseTuple Py_PROTO((PyObject *, char *, ...));
Guido van Rossum13454c31997-05-05 21:57:29 +000046int PyArg_VaParse Py_PROTO((PyObject *, char *, va_list));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000047
Guido van Rossum79f25d91997-04-29 20:08:16 +000048int PyArg_ParseTupleAndKeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000049 char *, char **, ...));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000050
51/* Forward */
Guido van Rossum79f25d91997-04-29 20:08:16 +000052static int vgetargs1 Py_PROTO((PyObject *, char *, va_list *, int));
53static void seterror Py_PROTO((int, char *, int *, char *, char *));
54static char *convertitem Py_PROTO((PyObject *, char **, va_list *,
55 int *, char *));
56static char *converttuple Py_PROTO((PyObject *, char **, va_list *,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000057 int *, char *, int));
Guido van Rossum79f25d91997-04-29 20:08:16 +000058static char *convertsimple Py_PROTO((PyObject *, char **, va_list *, char *));
59static char *convertsimple1 Py_PROTO((PyObject *, char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000060
Guido van Rossum79f25d91997-04-29 20:08:16 +000061static int vgetargskeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000062 char *, char **, va_list *));
Guido van Rossum79f25d91997-04-29 20:08:16 +000063static char *skipitem Py_PROTO((char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000064
65#ifdef HAVE_STDARG_PROTOTYPES
66/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000067int PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000068#else
69/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000070int PyArg_Parse(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000071#endif
72{
73 int retval;
74 va_list va;
75#ifdef HAVE_STDARG_PROTOTYPES
76
77 va_start(va, format);
78#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000079 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000080 char *format;
81
82 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +000083 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000084 format = va_arg(va, char *);
85#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000086 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000087 va_end(va);
88 return retval;
89}
90
91
92#ifdef HAVE_STDARG_PROTOTYPES
93/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000094int PyArg_ParseTuple(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000095#else
96/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000097int PyArg_ParseTuple(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000098#endif
99{
100 int retval;
101 va_list va;
102#ifdef HAVE_STDARG_PROTOTYPES
103
104 va_start(va, format);
105#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000107 char *format;
108
109 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000110 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000111 format = va_arg(va, char *);
112#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000113 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000114 va_end(va);
115 return retval;
116}
117
118
119int
Guido van Rossum13454c31997-05-05 21:57:29 +0000120PyArg_VaParse(args, format, va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000121 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000122 char *format;
123 va_list va;
124{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000125 va_list lva;
126
127#ifdef VA_LIST_IS_ARRAY
128 memcpy(lva, va, sizeof(va_list));
129#else
130 lva = va;
131#endif
132
133 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000134}
135
136
137static int
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000138vgetargs1(args, format, p_va, compat)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000139 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000140 char *format;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000141 va_list *p_va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000142 int compat;
143{
144 char msgbuf[256];
145 int levels[32];
146 char *fname = NULL;
147 char *message = NULL;
148 int min = -1;
149 int max = 0;
150 int level = 0;
151 char *formatsave = format;
152 int i, len;
153 char *msg;
154
155 for (;;) {
156 int c = *format++;
157 if (c == '(' /* ')' */) {
158 if (level == 0)
159 max++;
160 level++;
161 }
162 else if (/* '(' */ c == ')') {
163 if (level == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000164 Py_FatalError(/* '(' */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000165 "excess ')' in getargs format");
166 else
167 level--;
168 }
169 else if (c == '\0')
170 break;
171 else if (c == ':') {
172 fname = format;
173 break;
174 }
175 else if (c == ';') {
176 message = format;
177 break;
178 }
179 else if (level != 0)
180 ; /* Pass */
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000181 else if (c == 'e')
182 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000183 else if (isalpha(c))
184 max++;
185 else if (c == '|')
186 min = max;
187 }
188
189 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000191
192 if (min < 0)
193 min = max;
194
195 format = formatsave;
196
197 if (compat) {
198 if (max == 0) {
199 if (args == NULL)
200 return 1;
201 sprintf(msgbuf, "%s requires no arguments",
202 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000204 return 0;
205 }
206 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000207 if (args == NULL) {
208 sprintf(msgbuf,
209 "%s requires at least one argument",
210 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000212 return 0;
213 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000214 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000215 if (msg == NULL)
216 return 1;
217 seterror(levels[0], msg, levels+1, fname, message);
218 return 0;
219 }
220 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000221 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000222 "old style getargs format uses new features");
223 return 0;
224 }
225 }
226
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 if (!PyTuple_Check(args)) {
228 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000229 "new style getargs format but argument is not a tuple");
230 return 0;
231 }
232
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000234
235 if (len < min || max < len) {
236 if (message == NULL) {
237 sprintf(msgbuf,
238 "%s requires %s %d argument%s; %d given",
239 fname==NULL ? "function" : fname,
240 min==max ? "exactly"
241 : len < min ? "at least" : "at most",
242 len < min ? min : max,
243 (len < min ? min : max) == 1 ? "" : "s",
244 len);
245 message = msgbuf;
246 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000248 return 0;
249 }
250
251 for (i = 0; i < len; i++) {
252 if (*format == '|')
253 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000255 levels, msgbuf);
256 if (msg) {
257 seterror(i+1, msg, levels, fname, message);
258 return 0;
259 }
260 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000261
Guido van Rossum730806d1998-04-10 22:27:42 +0000262 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000263 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000264 *format != '|' && *format != ':' && *format != ';') {
265 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000266 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000267 return 0;
268 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000269
270 return 1;
271}
272
273
274
275static void
276seterror(iarg, msg, levels, fname, message)
277 int iarg;
278 char *msg;
279 int *levels;
280 char *fname;
281 char *message;
282{
283 char buf[256];
284 int i;
285 char *p = buf;
286
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000288 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000289 if (iarg == 0 && message == NULL)
290 message = msg;
291 else if (message == NULL) {
292 if (fname != NULL) {
293 sprintf(p, "%s, ", fname);
294 p += strlen(p);
295 }
296 sprintf(p, "argument %d", iarg);
297 i = 0;
298 p += strlen(p);
299 while (levels[i] > 0) {
300 sprintf(p, ", item %d", levels[i]-1);
301 p += strlen(p);
302 i++;
303 }
304 sprintf(p, ": expected %s found", msg);
305 message = buf;
306 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000308}
309
310
311/* Convert a tuple argument.
312 On entry, *p_format points to the character _after_ the opening '('.
313 On successful exit, *p_format points to the closing ')'.
314 If successful:
315 *p_format and *p_va are updated,
316 *levels and *msgbuf are untouched,
317 and NULL is returned.
318 If the argument is invalid:
319 *p_format is unchanged,
320 *p_va is undefined,
321 *levels is a 0-terminated list of item numbers,
322 *msgbuf contains an error message, whose format is:
323 "<typename1>, <typename2>", where:
324 <typename1> is the name of the expected type, and
325 <typename2> is the name of the actual type,
326 (so you can surround it by "expected ... found"),
327 and msgbuf is returned.
328*/
329
330static char *
331converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000332 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000333 char **p_format;
334 va_list *p_va;
335 int *levels;
336 char *msgbuf;
337 int toplevel;
338{
339 int level = 0;
340 int n = 0;
341 char *format = *p_format;
342 int i;
343
344 for (;;) {
345 int c = *format++;
346 if (c == '(') {
347 if (level == 0)
348 n++;
349 level++;
350 }
351 else if (c == ')') {
352 if (level == 0)
353 break;
354 level--;
355 }
356 else if (c == ':' || c == ';' || c == '\0')
357 break;
358 else if (level == 0 && isalpha(c))
359 n++;
360 }
361
Guido van Rossum66368cc1999-02-17 23:16:43 +0000362 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000363 levels[0] = 0;
364 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000365 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000367 return msgbuf;
368 }
369
Guido van Rossum66368cc1999-02-17 23:16:43 +0000370 if ((i = PySequence_Length(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000371 levels[0] = 0;
372 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000373 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
374 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000375 return msgbuf;
376 }
377
378 format = *p_format;
379 for (i = 0; i < n; i++) {
380 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000381 PyObject *item;
382 item = PySequence_GetItem(arg, i);
383 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
384 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
385 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000386 if (msg != NULL) {
387 levels[0] = i+1;
388 return msg;
389 }
390 }
391
392 *p_format = format;
393 return NULL;
394}
395
396
397/* Convert a single item. */
398
399static char *
400convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000402 char **p_format;
403 va_list *p_va;
404 int *levels;
405 char *msgbuf;
406{
407 char *msg;
408 char *format = *p_format;
409
410 if (*format == '(' /* ')' */) {
411 format++;
412 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
413 if (msg == NULL)
414 format++;
415 }
416 else {
417 msg = convertsimple(arg, &format, p_va, msgbuf);
418 if (msg != NULL)
419 levels[0] = 0;
420 }
421 if (msg == NULL)
422 *p_format = format;
423 return msg;
424}
425
426
427/* Convert a non-tuple argument. Adds to convertsimple1 functionality
428 by appending ", <actual argument type>" to error message. */
429
430static char *
431convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000433 char **p_format;
434 va_list *p_va;
435 char *msgbuf;
436{
437 char *msg = convertsimple1(arg, p_format, p_va);
438 if (msg != NULL) {
439 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000441 msg = msgbuf;
442 }
443 return msg;
444}
445
446
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000447/* Internal API needed by convertsimple1(): */
448extern
449PyObject *_PyUnicode_AsUTF8String(PyObject *unicode,
450 const char *errors);
451
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000452/* Convert a non-tuple argument. Return NULL if conversion went OK,
453 or a string representing the expected type if the conversion failed.
454 When failing, an exception may or may not have been raised.
455 Don't call if a tuple is expected. */
456
457static char *
458convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000460 char **p_format;
461 va_list *p_va;
462{
463 char *format = *p_format;
464 char c = *format++;
465
466 switch (c) {
467
468 case 'b': /* byte -- very short int */
469 {
470 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 long ival = PyInt_AsLong(arg);
472 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000473 return "integer<b>";
474 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000475 *p = (char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000476 break;
477 }
478
479 case 'h': /* short int */
480 {
481 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482 long ival = PyInt_AsLong(arg);
483 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000484 return "integer<h>";
485 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000486 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000487 break;
488 }
489
490 case 'i': /* int */
491 {
492 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 long ival = PyInt_AsLong(arg);
494 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000495 return "integer<i>";
496 else
497 *p = ival;
498 break;
499 }
500
501 case 'l': /* long int */
502 {
503 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504 long ival = PyInt_AsLong(arg);
505 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000506 return "integer<l>";
507 else
508 *p = ival;
509 break;
510 }
511
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000512#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000513 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000514 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000515 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
516 LONG_LONG ival = PyLong_AsLongLong( arg );
517 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000518 return "long<L>";
519 } else {
520 *p = ival;
521 }
522 break;
523 }
524#endif
525
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000526 case 'f': /* float */
527 {
528 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 double dval = PyFloat_AsDouble(arg);
530 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000531 return "float<f>";
532 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000533 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000534 break;
535 }
536
537 case 'd': /* double */
538 {
539 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 double dval = PyFloat_AsDouble(arg);
541 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000542 return "float<d>";
543 else
544 *p = dval;
545 break;
546 }
547
Guido van Rossum530956d1996-07-21 02:27:43 +0000548#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000549 case 'D': /* complex double */
550 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000551 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000552 Py_complex cval;
553 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000555 return "complex<D>";
556 else
557 *p = cval;
558 break;
559 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000560#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000561
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000562 case 'c': /* char */
563 {
564 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 if (PyString_Check(arg) && PyString_Size(arg) == 1)
566 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000567 else
568 return "char";
569 break;
570 }
571
572 case 's': /* string */
573 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000574 if (*format == '#') { /* any buffer-like object */
575 void **p = (void **)va_arg(*p_va, char **);
576 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000577 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000578 int count;
579
580 if ( pb == NULL ||
581 pb->bf_getreadbuffer == NULL ||
582 pb->bf_getsegcount == NULL )
583 return "read-only buffer";
584 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
585 return "single-segment read-only buffer";
586 if ( (count =
587 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
588 return "(unspecified)";
589 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000590 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000591 } else {
592 char **p = va_arg(*p_va, char **);
593
594 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000595 *p = PyString_AS_STRING(arg);
596 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000597 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000598 if (arg == NULL)
599 return "unicode conversion error";
600 *p = PyString_AS_STRING(arg);
601 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000602 else
603 return "string";
604 if ((int)strlen(*p) != PyString_Size(arg))
605 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000606 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000607 break;
608 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000609
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000610 case 'z': /* string, may be NULL (None) */
611 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000612 if (*format == '#') { /* any buffer-like object */
613 void **p = (void **)va_arg(*p_va, char **);
614 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000615 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000616 int count;
617
618 if (arg == Py_None) {
619 *p = 0;
620 *q = 0;
621 } else {
622 if ( pb == NULL ||
623 pb->bf_getreadbuffer == NULL ||
624 pb->bf_getsegcount == NULL )
625 return "read-only buffer";
626 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
627 return "single-segment read-only buffer";
628 if ( (count = (*pb->bf_getreadbuffer)
629 (arg, 0, p)) < 0 )
630 return "(unspecified)";
631 *q = count;
632 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000633 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000634 } else {
635 char **p = va_arg(*p_va, char **);
636
637 if (arg == Py_None)
638 *p = 0;
639 else if (PyString_Check(arg))
640 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000641 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000642 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000643 if (arg == NULL)
644 return "unicode conversion error";
645 *p = PyString_AS_STRING(arg);
646 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000647 else
648 return "None or string";
649 if (*format == '#') {
650 int *q = va_arg(*p_va, int *);
651 if (arg == Py_None)
652 *q = 0;
653 else
654 *q = PyString_Size(arg);
655 format++;
656 }
657 else if (*p != NULL &&
658 (int)strlen(*p) != PyString_Size(arg))
659 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000660 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000661 break;
662 }
663
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000664 case 'e': /* encoded string */
665 {
666 char **buffer;
667 const char *encoding;
668 PyObject *u, *s;
669 int size;
670
671 /* Get 'e' parameter: the encoding name */
672 encoding = (const char *)va_arg(*p_va, const char *);
673 if (encoding == NULL)
674 return "(encoding is NULL)";
675
676 /* Get 's' parameter: the output buffer to use */
677 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000678 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000679 buffer = (char **)va_arg(*p_va, char **);
680 format++;
681 if (buffer == NULL)
682 return "(buffer is NULL)";
683
684 /* Convert object to Unicode */
685 u = PyUnicode_FromObject(arg);
686 if (u == NULL)
687 return "string, unicode or text buffer";
688
689 /* Encode object; use default error handling */
690 s = PyUnicode_AsEncodedString(u,
691 encoding,
692 NULL);
693 Py_DECREF(u);
694 if (s == NULL)
695 return "(encoding failed)";
696 if (!PyString_Check(s)) {
697 Py_DECREF(s);
698 return "(encoder failed to return a string)";
699 }
700 size = PyString_GET_SIZE(s);
701
702 /* Write output; output is guaranteed to be
703 0-terminated */
704 if (*format == '#') {
705 /* Using buffer length parameter '#':
706
707 - if *buffer is NULL, a new buffer
708 of the needed size is allocated and
709 the data copied into it; *buffer is
710 updated to point to the new buffer;
711 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000712 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000713
714 - if *buffer is not NULL, the data
715 is copied to *buffer; *buffer_len
716 has to be set to the size of the
717 buffer on input; buffer overflow is
718 signalled with an error; buffer has
719 to provide enough room for the
720 encoded string plus the trailing
721 0-byte
722
723 - in both cases, *buffer_len is
724 updated to the size of the buffer
725 /excluding/ the trailing 0-byte
726
727 */
728 int *buffer_len = va_arg(*p_va, int *);
729
730 format++;
731 if (buffer_len == NULL)
732 return "(buffer_len is NULL)";
733 if (*buffer == NULL) {
734 *buffer = PyMem_NEW(char, size + 1);
735 if (*buffer == NULL) {
736 Py_DECREF(s);
737 return "(memory error)";
738 }
739 } else {
740 if (size + 1 > *buffer_len) {
741 Py_DECREF(s);
742 return "(buffer overflow)";
743 }
744 }
745 memcpy(*buffer,
746 PyString_AS_STRING(s),
747 size + 1);
748 *buffer_len = size;
749 } else {
750 /* Using a 0-terminated buffer:
751
752 - the encoded string has to be
753 0-terminated for this variant to
754 work; if it is not, an error raised
755
756 - a new buffer of the needed size
757 is allocated and the data copied
758 into it; *buffer is updated to
759 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000760 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000761 after usage
762
763 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000764 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000765 return "(encoded string without "\
766 "NULL bytes)";
767 *buffer = PyMem_NEW(char, size + 1);
768 if (*buffer == NULL) {
769 Py_DECREF(s);
770 return "(memory error)";
771 }
772 memcpy(*buffer,
773 PyString_AS_STRING(s),
774 size + 1);
775 }
776 Py_DECREF(s);
777 break;
778 }
779
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000780 case 'S': /* string object */
781 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782 PyObject **p = va_arg(*p_va, PyObject **);
783 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000784 *p = arg;
785 else
786 return "string";
787 break;
788 }
789
Guido van Rossume826ef02000-03-10 23:02:17 +0000790 case 'U': /* Unicode object */
791 {
792 PyObject **p = va_arg(*p_va, PyObject **);
793 if (PyUnicode_Check(arg))
794 *p = arg;
795 else
796 return "unicode";
797 break;
798 }
799
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000800 case 'O': /* object */
801 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 PyTypeObject *type;
803 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000804 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000806 p = va_arg(*p_va, PyObject **);
807 format++;
808 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000809 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000810 else
811 return type->tp_name;
812
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000813 }
814 else if (*format == '?') {
815 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000816 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000817 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000818 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000819 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000820 else
821 return "(unspecified)";
822
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000823 }
824 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000825 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000827 converter convert = va_arg(*p_va, converter);
828 void *addr = va_arg(*p_va, void *);
829 format++;
830 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000831 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000832 }
833 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000835 *p = arg;
836 }
837 break;
838 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000839
840
841 case 'w': /* memory buffer, read-write access */
842 {
843 void **p = va_arg(*p_va, void **);
844 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
845 int count;
846
847 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
848 pb->bf_getsegcount == NULL )
849 return "read-write buffer";
850 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
851 return "single-segment read-write buffer";
852 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
853 return "(unspecified)";
854 if (*format == '#') {
855 int *q = va_arg(*p_va, int *);
856
857 *q = count;
858 format++;
859 }
860 break;
861 }
862
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000863 case 't': /* 8-bit character buffer, read-only access */
864 {
865 const char **p = va_arg(*p_va, const char **);
866 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
867 int count;
868
869 if ( *format++ != '#' )
870 return "invalid use of 't' format character";
871 if ( !PyType_HasFeature(
872 arg->ob_type,
873 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
874 pb == NULL ||
875 pb->bf_getcharbuffer == NULL ||
876 pb->bf_getsegcount == NULL )
877 return "read-only character buffer";
878 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
879 return "single-segment read-only buffer";
880 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
881 return "(unspecified)";
882
883 *va_arg(*p_va, int *) = count;
884
885 break;
886 }
887
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000888
889 default:
890 return "impossible<bad format char>";
891
892 }
893
894 *p_format = format;
895 return NULL;
896}
Guido van Rossumaa354651996-08-19 19:32:04 +0000897
898
899/* Support for keyword arguments donated by
900 Geoff Philbrick <philbric@delphi.hks.com> */
901
902#ifdef HAVE_STDARG_PROTOTYPES
903/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904int PyArg_ParseTupleAndKeywords(PyObject *args,
905 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000906 char *format,
907 char **kwlist, ...)
908#else
909/* VARARGS */
910int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
911#endif
912{
913 int retval;
914 va_list va;
915#ifdef HAVE_STDARG_PROTOTYPES
916
917 va_start(va, kwlist);
918#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 PyObject *args;
920 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000921 char *format;
922 char **kwlist;
923
924 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 args = va_arg(va, PyObject *);
926 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000927 format = va_arg(va, char *);
928 kwlist = va_arg(va, char **);
929#endif
930 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
931 va_end(va);
932 return retval;
933}
934
935
936static int
937vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938 PyObject *args;
939 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000940 char *format;
941 char **kwlist;
942 va_list *p_va;
943{
944 char msgbuf[256];
945 int levels[32];
946 char *fname = NULL;
947 char *message = NULL;
948 int min = -1;
949 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000950 char *formatsave = format;
951 int i, len, tplen, kwlen;
952 char *msg, *ks, **p;
953 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000955
956 /* nested tuples cannot be parsed when using keyword arguments */
957
958 for (;;) {
959 int c = *format++;
960 if (c == '(') {
961 PyErr_SetString(PyExc_SystemError,
962 "tuple found in format when using keyword arguments");
963 return 0;
964 }
965 else if (c == '\0')
966 break;
967 else if (c == ':') {
968 fname = format;
969 break;
970 }
971 else if (c == ';') {
972 message = format;
973 break;
974 }
975 else if (isalpha(c))
976 max++;
977 else if (c == '|')
978 min = max;
979 }
980
981 if (min < 0)
982 min = max;
983
984 format = formatsave;
985
986 if (!PyTuple_Check(args)) {
987 PyErr_SetString(PyExc_SystemError,
988 "new style getargs format but argument is not a tuple");
989 return 0;
990 }
991
992 tplen = PyTuple_Size(args);
993
994 /* do a cursory check of the keywords just to see how many we got */
995
996 if (keywords) {
997 if (!PyDict_Check(keywords)) {
998 PyErr_SetString(PyExc_SystemError,
999 "non-dictionary object received when keyword dictionary expected");
1000 return 0;
1001 }
1002 kwlen = PyDict_Size(keywords);
1003 }
1004 else {
1005 kwlen = 0;
1006 }
1007
1008 /* make sure there are no duplicate values for an argument;
1009 its not clear when to use the term "keyword argument vs.
1010 keyword parameter in messages */
1011
1012 if (keywords) {
1013 for (i = 0; i < tplen; i++) {
1014 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1015 sprintf(msgbuf,
1016 "keyword parameter %s redefined",
1017 kwlist[i]);
1018 PyErr_SetString(PyExc_TypeError, msgbuf);
1019 return 0;
1020 }
1021 }
1022 }
1023 PyErr_Clear(); /* I'm not which Py functions set the error string */
1024
1025 /* required arguments missing from args can be supplied by keyword
1026 arguments */
1027
1028 len = tplen;
1029 if (keywords && tplen < min) {
1030 for (i = tplen; i < min; i++) {
1031 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1032 len++;
1033 }
1034 }
1035 }
1036 PyErr_Clear();
1037
1038 /* make sure we got an acceptable number of arguments; the message
1039 is a little confusing with keywords since keyword arguments
1040 which are supplied, but don't match the required arguments
1041 are not included in the "%d given" part of the message */
1042
1043 if (len < min || max < len) {
1044 if (message == NULL) {
1045 sprintf(msgbuf,
1046 "%s requires %s %d argument%s; %d given",
1047 fname==NULL ? "function" : fname,
1048 min==max ? "exactly"
1049 : len < min ? "at least" : "at most",
1050 len < min ? min : max,
1051 (len < min ? min : max) == 1 ? "" : "s",
1052 len);
1053 message = msgbuf;
1054 }
1055 PyErr_SetString(PyExc_TypeError, message);
1056 return 0;
1057 }
1058
1059 for (i = 0; i < tplen; i++) {
1060 if (*format == '|')
1061 format++;
1062 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1063 levels, msgbuf);
1064 if (msg) {
1065 seterror(i+1, msg, levels, fname, message);
1066 return 0;
1067 }
1068 }
1069
1070 /* handle no keyword parameters in call */
1071
1072 if (!keywords) return 1;
1073
1074 /* make sure the number of keywords in the keyword list matches the
1075 number of items in the format string */
1076
1077 nkwds = 0;
1078 p = kwlist;
1079 for (;;) {
1080 if (!*(p++)) break;
1081 nkwds++;
1082 }
1083
1084 if (nkwds != max) {
1085 PyErr_SetString(PyExc_SystemError,
1086 "number of items in format string and keyword list do not match");
1087 return 0;
1088 }
1089
1090 /* convert the keyword arguments; this uses the format
1091 string where it was left after processing args */
1092
1093 converted = 0;
1094 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001095 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001096 if (*format == '|')
1097 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001098 item = PyMapping_GetItemString(keywords, kwlist[i]);
1099 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001100 msg = convertitem(item, &format, p_va, levels, msgbuf);
1101 if (msg) {
1102 seterror(i+1, msg, levels, fname, message);
1103 return 0;
1104 }
1105 converted++;
1106 }
1107 else {
1108 PyErr_Clear();
1109 msg = skipitem(&format, p_va);
1110 if (msg) {
1111 seterror(i+1, msg, levels, fname, message);
1112 return 0;
1113 }
1114 }
1115 }
1116
1117 /* make sure there are no extraneous keyword arguments */
1118
1119 pos = 0;
1120 if (converted < kwlen) {
1121 while (PyDict_Next(keywords, &pos, &key, &value)) {
1122 match = 0;
1123 ks = PyString_AsString(key);
1124 for (i = 0; i < nkwds; i++) {
1125 if (!strcmp(ks, kwlist[i])) {
1126 match = 1;
1127 break;
1128 }
1129 }
1130 if (!match) {
1131 sprintf(msgbuf,
1132 "%s is an invalid keyword argument for this function",
1133 ks);
1134 PyErr_SetString(PyExc_TypeError, msgbuf);
1135 return 0;
1136 }
1137 }
1138 }
1139
1140 return 1;
1141}
1142
1143
1144static char *
1145skipitem(p_format, p_va)
1146 char **p_format;
1147 va_list *p_va;
1148{
1149 char *format = *p_format;
1150 char c = *format++;
1151
1152 switch (c) {
1153
1154 case 'b': /* byte -- very short int */
1155 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001156 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001157 break;
1158 }
1159
1160 case 'h': /* short int */
1161 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001162 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001163 break;
1164 }
1165
1166 case 'i': /* int */
1167 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001168 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001169 break;
1170 }
1171
1172 case 'l': /* long int */
1173 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001174 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001175 break;
1176 }
1177
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001178#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001179 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001180 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001181 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001182 break;
1183 }
1184#endif
1185
Guido van Rossumaa354651996-08-19 19:32:04 +00001186 case 'f': /* float */
1187 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001188 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001189 break;
1190 }
1191
1192 case 'd': /* double */
1193 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001194 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001195 break;
1196 }
1197
1198#ifndef WITHOUT_COMPLEX
1199 case 'D': /* complex double */
1200 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001201 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001202 break;
1203 }
1204#endif /* WITHOUT_COMPLEX */
1205
1206 case 'c': /* char */
1207 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001208 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001209 break;
1210 }
1211
1212 case 's': /* string */
1213 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001214 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001215 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001216 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001217 format++;
1218 }
1219 break;
1220 }
1221
1222 case 'z': /* string */
1223 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001224 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001225 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001226 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001227 format++;
1228 }
1229 break;
1230 }
1231
1232 case 'S': /* string object */
1233 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001234 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001235 break;
1236 }
1237
1238 case 'O': /* object */
1239 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001240 if (*format == '!') {
1241 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001242 (void) va_arg(*p_va, PyTypeObject*);
1243 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001244 }
1245#if 0
1246/* I don't know what this is for */
1247 else if (*format == '?') {
1248 inquiry pred = va_arg(*p_va, inquiry);
1249 format++;
1250 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001252 }
1253 }
1254#endif
1255 else if (*format == '&') {
1256 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001257 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +00001258 (void) va_arg(*p_va, converter);
1259 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001260 format++;
1261 }
1262 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001264 }
1265 break;
1266 }
1267
1268 default:
1269 return "impossible<bad format char>";
1270
1271 }
1272
1273 *p_format = format;
1274 return NULL;
1275}