blob: 359e3bdf2689607eb8b725d4ecaa58f554048cd7 [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00009******************************************************************/
10
11/* New getargs implementation */
12
13/* XXX There are several unchecked sprintf or strcat calls in this file.
14 XXX The only way these can become a danger is if some C code in the
15 XXX Python source (or in an extension) uses ridiculously long names
Thomas Wouters7e474022000-07-16 12:04:32 +000016 XXX or ridiculously deep nesting in format strings. */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000017
Guido van Rossum79f25d91997-04-29 20:08:16 +000018#include "Python.h"
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000019
Guido van Rossumc1d50531996-08-21 23:38:24 +000020#include <ctype.h>
Guido van Rossumdb677392000-07-01 01:09:43 +000021#ifdef HAVE_LIMITS_H
22#include <limits.h>
23#endif
Guido van Rossumc1d50531996-08-21 23:38:24 +000024
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000025
Tim Petersdbd9ba62000-07-09 03:09:57 +000026int PyArg_Parse(PyObject *, char *, ...);
27int PyArg_ParseTuple(PyObject *, char *, ...);
28int PyArg_VaParse(PyObject *, char *, va_list);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000029
Tim Petersdbd9ba62000-07-09 03:09:57 +000030int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
31 char *, char **, ...);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000032
33/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000034static int vgetargs1(PyObject *, char *, va_list *, int);
35static void seterror(int, char *, int *, char *, char *);
36static char *convertitem(PyObject *, char **, va_list *, int *, char *);
37static char *converttuple(PyObject *, char **, va_list *,
38 int *, char *, int);
39static char *convertsimple(PyObject *, char **, va_list *, char *);
40static char *convertsimple1(PyObject *, char **, va_list *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000041
Tim Petersdbd9ba62000-07-09 03:09:57 +000042static int vgetargskeywords(PyObject *, PyObject *,
43 char *, char **, va_list *);
44static char *skipitem(char **, va_list *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000045
Guido van Rossum79f25d91997-04-29 20:08:16 +000046int PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000047{
48 int retval;
49 va_list va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000050
51 va_start(va, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000052 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000053 va_end(va);
54 return retval;
55}
56
57
Guido van Rossum79f25d91997-04-29 20:08:16 +000058int PyArg_ParseTuple(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000059{
60 int retval;
61 va_list va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000062
63 va_start(va, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000065 va_end(va);
66 return retval;
67}
68
69
70int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000071PyArg_VaParse(PyObject *args, char *format, va_list va)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000072{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000073 va_list lva;
74
75#ifdef VA_LIST_IS_ARRAY
76 memcpy(lva, va, sizeof(va_list));
77#else
78 lva = va;
79#endif
80
81 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000082}
83
84
85static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000086vgetargs1(PyObject *args, char *format, va_list *p_va, int compat)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000087{
88 char msgbuf[256];
89 int levels[32];
90 char *fname = NULL;
91 char *message = NULL;
92 int min = -1;
93 int max = 0;
94 int level = 0;
95 char *formatsave = format;
96 int i, len;
97 char *msg;
98
99 for (;;) {
100 int c = *format++;
101 if (c == '(' /* ')' */) {
102 if (level == 0)
103 max++;
104 level++;
105 }
106 else if (/* '(' */ c == ')') {
107 if (level == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 Py_FatalError(/* '(' */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000109 "excess ')' in getargs format");
110 else
111 level--;
112 }
113 else if (c == '\0')
114 break;
115 else if (c == ':') {
116 fname = format;
117 break;
118 }
119 else if (c == ';') {
120 message = format;
121 break;
122 }
123 else if (level != 0)
124 ; /* Pass */
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000125 else if (c == 'e')
126 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000127 else if (isalpha(c))
128 max++;
129 else if (c == '|')
130 min = max;
131 }
132
133 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000135
136 if (min < 0)
137 min = max;
138
139 format = formatsave;
140
141 if (compat) {
142 if (max == 0) {
143 if (args == NULL)
144 return 1;
145 sprintf(msgbuf, "%s requires no arguments",
146 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000148 return 0;
149 }
150 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000151 if (args == NULL) {
152 sprintf(msgbuf,
153 "%s requires at least one argument",
154 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000156 return 0;
157 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000158 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000159 if (msg == NULL)
160 return 1;
161 seterror(levels[0], msg, levels+1, fname, message);
162 return 0;
163 }
164 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000166 "old style getargs format uses new features");
167 return 0;
168 }
169 }
170
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 if (!PyTuple_Check(args)) {
172 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000173 "new style getargs format but argument is not a tuple");
174 return 0;
175 }
176
Guido van Rossum79f25d91997-04-29 20:08:16 +0000177 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000178
179 if (len < min || max < len) {
180 if (message == NULL) {
181 sprintf(msgbuf,
182 "%s requires %s %d argument%s; %d given",
183 fname==NULL ? "function" : fname,
184 min==max ? "exactly"
185 : len < min ? "at least" : "at most",
186 len < min ? min : max,
187 (len < min ? min : max) == 1 ? "" : "s",
188 len);
189 message = msgbuf;
190 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000192 return 0;
193 }
194
195 for (i = 0; i < len; i++) {
196 if (*format == '|')
197 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000198 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000199 levels, msgbuf);
200 if (msg) {
201 seterror(i+1, msg, levels, fname, message);
202 return 0;
203 }
204 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000205
Guido van Rossum730806d1998-04-10 22:27:42 +0000206 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000207 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000208 *format != '|' && *format != ':' && *format != ';') {
209 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000210 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000211 return 0;
212 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000213
214 return 1;
215}
216
217
218
219static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000220seterror(int iarg, char *msg, int *levels, char *fname, char *message)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000221{
222 char buf[256];
223 int i;
224 char *p = buf;
225
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000227 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000228 if (iarg == 0 && message == NULL)
229 message = msg;
230 else if (message == NULL) {
231 if (fname != NULL) {
232 sprintf(p, "%s, ", fname);
233 p += strlen(p);
234 }
235 sprintf(p, "argument %d", iarg);
236 i = 0;
237 p += strlen(p);
238 while (levels[i] > 0) {
239 sprintf(p, ", item %d", levels[i]-1);
240 p += strlen(p);
241 i++;
242 }
243 sprintf(p, ": expected %s found", msg);
244 message = buf;
245 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000247}
248
249
250/* Convert a tuple argument.
251 On entry, *p_format points to the character _after_ the opening '('.
252 On successful exit, *p_format points to the closing ')'.
253 If successful:
254 *p_format and *p_va are updated,
255 *levels and *msgbuf are untouched,
256 and NULL is returned.
257 If the argument is invalid:
258 *p_format is unchanged,
259 *p_va is undefined,
260 *levels is a 0-terminated list of item numbers,
261 *msgbuf contains an error message, whose format is:
262 "<typename1>, <typename2>", where:
263 <typename1> is the name of the expected type, and
264 <typename2> is the name of the actual type,
265 (so you can surround it by "expected ... found"),
266 and msgbuf is returned.
267*/
268
269static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000270converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
271 char *msgbuf, int toplevel)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000272{
273 int level = 0;
274 int n = 0;
275 char *format = *p_format;
276 int i;
277
278 for (;;) {
279 int c = *format++;
280 if (c == '(') {
281 if (level == 0)
282 n++;
283 level++;
284 }
285 else if (c == ')') {
286 if (level == 0)
287 break;
288 level--;
289 }
290 else if (c == ':' || c == ';' || c == '\0')
291 break;
292 else if (level == 0 && isalpha(c))
293 n++;
294 }
295
Guido van Rossum66368cc1999-02-17 23:16:43 +0000296 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000297 levels[0] = 0;
298 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000299 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000301 return msgbuf;
302 }
303
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000304 if ((i = PySequence_Size(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000305 levels[0] = 0;
306 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000307 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
308 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000309 return msgbuf;
310 }
311
312 format = *p_format;
313 for (i = 0; i < n; i++) {
314 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000315 PyObject *item;
316 item = PySequence_GetItem(arg, i);
317 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
318 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
319 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000320 if (msg != NULL) {
321 levels[0] = i+1;
322 return msg;
323 }
324 }
325
326 *p_format = format;
327 return NULL;
328}
329
330
331/* Convert a single item. */
332
333static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels,
335 char *msgbuf)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000336{
337 char *msg;
338 char *format = *p_format;
339
340 if (*format == '(' /* ')' */) {
341 format++;
342 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
343 if (msg == NULL)
344 format++;
345 }
346 else {
347 msg = convertsimple(arg, &format, p_va, msgbuf);
348 if (msg != NULL)
349 levels[0] = 0;
350 }
351 if (msg == NULL)
352 *p_format = format;
353 return msg;
354}
355
356
357/* Convert a non-tuple argument. Adds to convertsimple1 functionality
358 by appending ", <actual argument type>" to error message. */
359
360static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000361convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000362{
363 char *msg = convertsimple1(arg, p_format, p_va);
364 if (msg != NULL) {
365 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000367 msg = msgbuf;
368 }
369 return msg;
370}
371
372
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000373/* Internal API needed by convertsimple1(): */
374extern
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000375PyObject *_PyUnicode_AsDefaultEncodedString(PyObject *unicode,
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000376 const char *errors);
377
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000378/* Convert a non-tuple argument. Return NULL if conversion went OK,
379 or a string representing the expected type if the conversion failed.
380 When failing, an exception may or may not have been raised.
381 Don't call if a tuple is expected. */
382
383static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000384convertsimple1(PyObject *arg, char **p_format, va_list *p_va)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000385{
386 char *format = *p_format;
387 char c = *format++;
388
389 switch (c) {
390
Fred Drake230cae72000-05-09 21:50:00 +0000391 case 'b': /* unsigned byte -- very short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000392 {
393 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394 long ival = PyInt_AsLong(arg);
395 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000396 return "integer<b>";
Fred Drake230cae72000-05-09 21:50:00 +0000397 else if (ival < 0) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000398 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000399 "unsigned byte integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000400 return "integer<b>";
401 }
Fred Drake230cae72000-05-09 21:50:00 +0000402 else if (ival > UCHAR_MAX) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000403 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000404 "unsigned byte integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000405 return "integer<b>";
406 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000407 else
Fred Drake230cae72000-05-09 21:50:00 +0000408 *p = (unsigned char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000409 break;
410 }
411
Jack Jansencc22fbe2000-08-05 21:29:58 +0000412 case 'B': /* byte sized bitfield - both signed and unsigned values allowed */
413 {
414 char *p = va_arg(*p_va, char *);
415 long ival = PyInt_AsLong(arg);
416 if (ival == -1 && PyErr_Occurred())
417 return "integer<b>";
418 else if (ival < SCHAR_MIN) {
419 PyErr_SetString(PyExc_OverflowError,
420 "byte-sized integer bitfield is less than minimum");
421 return "integer<B>";
422 }
423 else if (ival > UCHAR_MAX) {
424 PyErr_SetString(PyExc_OverflowError,
425 "byte-sized integer bitfield is greater than maximum");
426 return "integer<B>";
427 }
428 else
429 *p = (unsigned char) ival;
430 break;
431 }
432
Fred Drake230cae72000-05-09 21:50:00 +0000433 case 'h': /* signed short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000434 {
435 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 long ival = PyInt_AsLong(arg);
437 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000438 return "integer<h>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000439 else if (ival < SHRT_MIN) {
440 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000441 "signed short integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000442 return "integer<h>";
443 }
444 else if (ival > SHRT_MAX) {
445 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000446 "signed short integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000447 return "integer<h>";
448 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000449 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000450 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000451 break;
452 }
453
Jack Jansencc22fbe2000-08-05 21:29:58 +0000454 case 'H': /* short int sized bitfield, both signed and unsigned allowed */
Jack Jansend50338f2000-07-06 12:22:00 +0000455 {
456 unsigned short *p = va_arg(*p_va, unsigned short *);
457 long ival = PyInt_AsLong(arg);
458 if (ival == -1 && PyErr_Occurred())
459 return "integer<H>";
Jack Jansencc22fbe2000-08-05 21:29:58 +0000460 else if (ival < SHRT_MIN) {
Jack Jansend50338f2000-07-06 12:22:00 +0000461 PyErr_SetString(PyExc_OverflowError,
Jack Jansencc22fbe2000-08-05 21:29:58 +0000462 "short integer bitfield is less than minimum");
Jack Jansend50338f2000-07-06 12:22:00 +0000463 return "integer<H>";
464 }
465 else if (ival > USHRT_MAX) {
466 PyErr_SetString(PyExc_OverflowError,
Jack Jansencc22fbe2000-08-05 21:29:58 +0000467 "short integer bitfield is greater than maximum");
Jack Jansend50338f2000-07-06 12:22:00 +0000468 return "integer<H>";
469 }
470 else
471 *p = (unsigned short) ival;
472 break;
473 }
474
Fred Drake230cae72000-05-09 21:50:00 +0000475 case 'i': /* signed int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000476 {
477 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 long ival = PyInt_AsLong(arg);
479 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000480 return "integer<i>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000481 else if (ival > INT_MAX) {
482 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000483 "signed integer is greater than maximum");
484 return "integer<i>";
485 }
486 else if (ival < INT_MIN) {
487 PyErr_SetString(PyExc_OverflowError,
488 "signed integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000489 return "integer<i>";
490 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000491 else
492 *p = ival;
493 break;
494 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000495 case 'l': /* long int */
496 {
497 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000498 long ival = PyInt_AsLong(arg);
499 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000500 return "integer<l>";
501 else
502 *p = ival;
503 break;
504 }
505
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000506#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000507 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000508 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000509 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
510 LONG_LONG ival = PyLong_AsLongLong( arg );
511 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000512 return "long<L>";
513 } else {
514 *p = ival;
515 }
516 break;
517 }
518#endif
519
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000520 case 'f': /* float */
521 {
522 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000523 double dval = PyFloat_AsDouble(arg);
524 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000525 return "float<f>";
526 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000527 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000528 break;
529 }
530
531 case 'd': /* double */
532 {
533 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 double dval = PyFloat_AsDouble(arg);
535 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000536 return "float<d>";
537 else
538 *p = dval;
539 break;
540 }
541
Guido van Rossum530956d1996-07-21 02:27:43 +0000542#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000543 case 'D': /* complex double */
544 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000545 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000546 Py_complex cval;
547 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000549 return "complex<D>";
550 else
551 *p = cval;
552 break;
553 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000554#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000555
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000556 case 'c': /* char */
557 {
558 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 if (PyString_Check(arg) && PyString_Size(arg) == 1)
560 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000561 else
562 return "char";
563 break;
564 }
565
566 case 's': /* string */
567 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000568 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000569 void **p = (void **)va_arg(*p_va, char **);
570 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000571 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000572 int count;
573
574 if ( pb == NULL ||
575 pb->bf_getreadbuffer == NULL ||
576 pb->bf_getsegcount == NULL )
577 return "read-only buffer";
578 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
579 return "single-segment read-only buffer";
580 if ( (count =
581 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
582 return "(unspecified)";
583 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000584 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000585 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000586 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000587
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000588 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000589 *p = PyString_AS_STRING(arg);
590 else if (PyUnicode_Check(arg)) {
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000591 arg = _PyUnicode_AsDefaultEncodedString(
592 arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000593 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 */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000608 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 {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000630 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000631
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000632 if (arg == Py_None)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000633 *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)) {
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000637 arg = _PyUnicode_AsDefaultEncodedString(
638 arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000639 if (arg == NULL)
640 return "unicode conversion error";
641 *p = PyString_AS_STRING(arg);
642 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000643 else
644 return "None or string";
645 if (*format == '#') {
646 int *q = va_arg(*p_va, int *);
647 if (arg == Py_None)
648 *q = 0;
649 else
650 *q = PyString_Size(arg);
651 format++;
652 }
653 else if (*p != NULL &&
654 (int)strlen(*p) != PyString_Size(arg))
655 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000656 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000657 break;
658 }
659
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000660 case 'e': /* encoded string */
661 {
662 char **buffer;
663 const char *encoding;
664 PyObject *u, *s;
665 int size;
666
667 /* Get 'e' parameter: the encoding name */
668 encoding = (const char *)va_arg(*p_va, const char *);
669 if (encoding == NULL)
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000670 encoding = PyUnicode_GetDefaultEncoding();
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000671
672 /* Get 's' parameter: the output buffer to use */
673 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000674 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000675 buffer = (char **)va_arg(*p_va, char **);
676 format++;
677 if (buffer == NULL)
678 return "(buffer is NULL)";
679
680 /* Convert object to Unicode */
681 u = PyUnicode_FromObject(arg);
682 if (u == NULL)
683 return "string, unicode or text buffer";
684
685 /* Encode object; use default error handling */
686 s = PyUnicode_AsEncodedString(u,
687 encoding,
688 NULL);
689 Py_DECREF(u);
690 if (s == NULL)
691 return "(encoding failed)";
692 if (!PyString_Check(s)) {
693 Py_DECREF(s);
694 return "(encoder failed to return a string)";
695 }
696 size = PyString_GET_SIZE(s);
697
698 /* Write output; output is guaranteed to be
699 0-terminated */
700 if (*format == '#') {
701 /* Using buffer length parameter '#':
702
703 - if *buffer is NULL, a new buffer
704 of the needed size is allocated and
705 the data copied into it; *buffer is
706 updated to point to the new buffer;
707 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000708 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000709
710 - if *buffer is not NULL, the data
711 is copied to *buffer; *buffer_len
712 has to be set to the size of the
713 buffer on input; buffer overflow is
714 signalled with an error; buffer has
715 to provide enough room for the
716 encoded string plus the trailing
717 0-byte
718
719 - in both cases, *buffer_len is
720 updated to the size of the buffer
721 /excluding/ the trailing 0-byte
722
723 */
724 int *buffer_len = va_arg(*p_va, int *);
725
726 format++;
727 if (buffer_len == NULL)
728 return "(buffer_len is NULL)";
729 if (*buffer == NULL) {
730 *buffer = PyMem_NEW(char, size + 1);
731 if (*buffer == NULL) {
732 Py_DECREF(s);
733 return "(memory error)";
734 }
735 } else {
736 if (size + 1 > *buffer_len) {
737 Py_DECREF(s);
738 return "(buffer overflow)";
739 }
740 }
741 memcpy(*buffer,
742 PyString_AS_STRING(s),
743 size + 1);
744 *buffer_len = size;
745 } else {
746 /* Using a 0-terminated buffer:
747
748 - the encoded string has to be
749 0-terminated for this variant to
750 work; if it is not, an error raised
751
752 - a new buffer of the needed size
753 is allocated and the data copied
754 into it; *buffer is updated to
755 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000756 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000757 after usage
758
759 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000760 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000761 return "(encoded string without "\
762 "NULL bytes)";
763 *buffer = PyMem_NEW(char, size + 1);
764 if (*buffer == NULL) {
765 Py_DECREF(s);
766 return "(memory error)";
767 }
768 memcpy(*buffer,
769 PyString_AS_STRING(s),
770 size + 1);
771 }
772 Py_DECREF(s);
773 break;
774 }
775
Fred Drake25871c02000-05-03 15:17:02 +0000776 case 'u': /* raw unicode buffer (Py_UNICODE *) */
777 {
778 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000779 void **p = (void **)va_arg(*p_va, char **);
780 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Fred Drake25871c02000-05-03 15:17:02 +0000781 int *q = va_arg(*p_va, int *);
782 int count;
783
784 if ( pb == NULL ||
785 pb->bf_getreadbuffer == NULL ||
786 pb->bf_getsegcount == NULL )
787 return "read-only buffer";
788 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
789 return "single-segment read-only buffer";
790 if ( (count =
791 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
792 return "(unspecified)";
793 /* buffer interface returns bytes, we want
794 length in characters */
795 *q = count/(sizeof(Py_UNICODE));
796 format++;
797 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000798 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
Fred Drake25871c02000-05-03 15:17:02 +0000799
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000800 if (PyUnicode_Check(arg))
Fred Drake25871c02000-05-03 15:17:02 +0000801 *p = PyUnicode_AS_UNICODE(arg);
802 else
803 return "unicode";
804 }
805 break;
806 }
807
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000808 case 'S': /* string object */
809 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 PyObject **p = va_arg(*p_va, PyObject **);
811 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000812 *p = arg;
813 else
814 return "string";
815 break;
816 }
817
Guido van Rossume826ef02000-03-10 23:02:17 +0000818 case 'U': /* Unicode object */
819 {
820 PyObject **p = va_arg(*p_va, PyObject **);
821 if (PyUnicode_Check(arg))
822 *p = arg;
823 else
824 return "unicode";
825 break;
826 }
827
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000828 case 'O': /* object */
829 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830 PyTypeObject *type;
831 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000832 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000834 p = va_arg(*p_va, PyObject **);
835 format++;
836 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000837 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000838 else
839 return type->tp_name;
840
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000841 }
842 else if (*format == '?') {
843 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000844 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000845 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000846 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000847 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000848 else
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000849 return "(unspecified)";
Guido van Rossumfccfe891998-05-15 22:04:07 +0000850
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000851 }
852 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +0000853 typedef int (*converter)(PyObject *, void *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000854 converter convert = va_arg(*p_va, converter);
855 void *addr = va_arg(*p_va, void *);
856 format++;
857 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000858 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000859 }
860 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000862 *p = arg;
863 }
864 break;
865 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000866
867
868 case 'w': /* memory buffer, read-write access */
869 {
870 void **p = va_arg(*p_va, void **);
871 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
872 int count;
873
874 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
875 pb->bf_getsegcount == NULL )
876 return "read-write buffer";
877 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
878 return "single-segment read-write buffer";
879 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
880 return "(unspecified)";
881 if (*format == '#') {
882 int *q = va_arg(*p_va, int *);
883
884 *q = count;
885 format++;
886 }
887 break;
888 }
889
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000890 case 't': /* 8-bit character buffer, read-only access */
891 {
892 const char **p = va_arg(*p_va, const char **);
893 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
894 int count;
895
896 if ( *format++ != '#' )
897 return "invalid use of 't' format character";
898 if ( !PyType_HasFeature(
899 arg->ob_type,
900 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
901 pb == NULL ||
902 pb->bf_getcharbuffer == NULL ||
903 pb->bf_getsegcount == NULL )
904 return "read-only character buffer";
905 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
906 return "single-segment read-only buffer";
907 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
908 return "(unspecified)";
909
910 *va_arg(*p_va, int *) = count;
911
912 break;
913 }
914
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000915
916 default:
917 return "impossible<bad format char>";
918
919 }
920
921 *p_format = format;
922 return NULL;
923}
Guido van Rossumaa354651996-08-19 19:32:04 +0000924
925
926/* Support for keyword arguments donated by
927 Geoff Philbrick <philbric@delphi.hks.com> */
928
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929int PyArg_ParseTupleAndKeywords(PyObject *args,
930 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000931 char *format,
932 char **kwlist, ...)
Guido van Rossumaa354651996-08-19 19:32:04 +0000933{
934 int retval;
935 va_list va;
Guido van Rossumaa354651996-08-19 19:32:04 +0000936
937 va_start(va, kwlist);
Guido van Rossumaa354651996-08-19 19:32:04 +0000938 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
939 va_end(va);
940 return retval;
941}
942
943
944static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000945vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
946 char **kwlist, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +0000947{
948 char msgbuf[256];
949 int levels[32];
950 char *fname = NULL;
951 char *message = NULL;
952 int min = -1;
953 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000954 char *formatsave = format;
955 int i, len, tplen, kwlen;
956 char *msg, *ks, **p;
957 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000958 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000959
960 /* nested tuples cannot be parsed when using keyword arguments */
961
962 for (;;) {
963 int c = *format++;
964 if (c == '(') {
965 PyErr_SetString(PyExc_SystemError,
966 "tuple found in format when using keyword arguments");
967 return 0;
968 }
969 else if (c == '\0')
970 break;
971 else if (c == ':') {
972 fname = format;
973 break;
974 }
975 else if (c == ';') {
976 message = format;
977 break;
978 }
979 else if (isalpha(c))
980 max++;
981 else if (c == '|')
982 min = max;
983 }
984
985 if (min < 0)
986 min = max;
987
988 format = formatsave;
989
990 if (!PyTuple_Check(args)) {
991 PyErr_SetString(PyExc_SystemError,
992 "new style getargs format but argument is not a tuple");
993 return 0;
994 }
995
996 tplen = PyTuple_Size(args);
997
998 /* do a cursory check of the keywords just to see how many we got */
999
1000 if (keywords) {
1001 if (!PyDict_Check(keywords)) {
1002 PyErr_SetString(PyExc_SystemError,
1003 "non-dictionary object received when keyword dictionary expected");
1004 return 0;
1005 }
1006 kwlen = PyDict_Size(keywords);
1007 }
1008 else {
1009 kwlen = 0;
1010 }
1011
1012 /* make sure there are no duplicate values for an argument;
1013 its not clear when to use the term "keyword argument vs.
1014 keyword parameter in messages */
1015
1016 if (keywords) {
1017 for (i = 0; i < tplen; i++) {
1018 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1019 sprintf(msgbuf,
1020 "keyword parameter %s redefined",
1021 kwlist[i]);
1022 PyErr_SetString(PyExc_TypeError, msgbuf);
1023 return 0;
1024 }
1025 }
1026 }
1027 PyErr_Clear(); /* I'm not which Py functions set the error string */
1028
1029 /* required arguments missing from args can be supplied by keyword
1030 arguments */
1031
1032 len = tplen;
1033 if (keywords && tplen < min) {
1034 for (i = tplen; i < min; i++) {
1035 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1036 len++;
1037 }
1038 }
1039 }
1040 PyErr_Clear();
1041
1042 /* make sure we got an acceptable number of arguments; the message
1043 is a little confusing with keywords since keyword arguments
1044 which are supplied, but don't match the required arguments
1045 are not included in the "%d given" part of the message */
1046
1047 if (len < min || max < len) {
1048 if (message == NULL) {
1049 sprintf(msgbuf,
1050 "%s requires %s %d argument%s; %d given",
1051 fname==NULL ? "function" : fname,
1052 min==max ? "exactly"
1053 : len < min ? "at least" : "at most",
1054 len < min ? min : max,
1055 (len < min ? min : max) == 1 ? "" : "s",
1056 len);
1057 message = msgbuf;
1058 }
1059 PyErr_SetString(PyExc_TypeError, message);
1060 return 0;
1061 }
1062
1063 for (i = 0; i < tplen; i++) {
1064 if (*format == '|')
1065 format++;
1066 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1067 levels, msgbuf);
1068 if (msg) {
1069 seterror(i+1, msg, levels, fname, message);
1070 return 0;
1071 }
1072 }
1073
1074 /* handle no keyword parameters in call */
1075
1076 if (!keywords) return 1;
1077
1078 /* make sure the number of keywords in the keyword list matches the
1079 number of items in the format string */
1080
1081 nkwds = 0;
1082 p = kwlist;
1083 for (;;) {
1084 if (!*(p++)) break;
1085 nkwds++;
1086 }
1087
1088 if (nkwds != max) {
1089 PyErr_SetString(PyExc_SystemError,
1090 "number of items in format string and keyword list do not match");
1091 return 0;
1092 }
1093
1094 /* convert the keyword arguments; this uses the format
1095 string where it was left after processing args */
1096
1097 converted = 0;
1098 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001100 if (*format == '|')
1101 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001102 item = PyMapping_GetItemString(keywords, kwlist[i]);
1103 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001104 msg = convertitem(item, &format, p_va, levels, msgbuf);
1105 if (msg) {
1106 seterror(i+1, msg, levels, fname, message);
1107 return 0;
1108 }
1109 converted++;
1110 }
1111 else {
1112 PyErr_Clear();
1113 msg = skipitem(&format, p_va);
1114 if (msg) {
1115 seterror(i+1, msg, levels, fname, message);
1116 return 0;
1117 }
1118 }
1119 }
1120
1121 /* make sure there are no extraneous keyword arguments */
1122
1123 pos = 0;
1124 if (converted < kwlen) {
1125 while (PyDict_Next(keywords, &pos, &key, &value)) {
1126 match = 0;
1127 ks = PyString_AsString(key);
1128 for (i = 0; i < nkwds; i++) {
1129 if (!strcmp(ks, kwlist[i])) {
1130 match = 1;
1131 break;
1132 }
1133 }
1134 if (!match) {
1135 sprintf(msgbuf,
Guido van Rossum80dc16b2000-05-08 14:02:41 +00001136 "%s is an invalid keyword argument for this function",
Guido van Rossumaa354651996-08-19 19:32:04 +00001137 ks);
1138 PyErr_SetString(PyExc_TypeError, msgbuf);
1139 return 0;
1140 }
1141 }
1142 }
1143
1144 return 1;
1145}
1146
1147
1148static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001149skipitem(char **p_format, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +00001150{
1151 char *format = *p_format;
1152 char c = *format++;
1153
1154 switch (c) {
1155
1156 case 'b': /* byte -- very short int */
Jack Jansencc22fbe2000-08-05 21:29:58 +00001157 case 'B': /* byte as bitfield */
Guido van Rossumaa354651996-08-19 19:32:04 +00001158 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001159 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001160 break;
1161 }
1162
1163 case 'h': /* short int */
1164 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001165 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001166 break;
1167 }
1168
Jack Jansencc22fbe2000-08-05 21:29:58 +00001169 case 'H': /* short int as bitfield */
Jack Jansend50338f2000-07-06 12:22:00 +00001170 {
1171 (void) va_arg(*p_va, unsigned short *);
1172 break;
1173 }
1174
Guido van Rossumaa354651996-08-19 19:32:04 +00001175 case 'i': /* int */
1176 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001177 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001178 break;
1179 }
1180
1181 case 'l': /* long int */
1182 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001183 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001184 break;
1185 }
1186
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001187#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001188 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001189 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001190 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001191 break;
1192 }
1193#endif
1194
Guido van Rossumaa354651996-08-19 19:32:04 +00001195 case 'f': /* float */
1196 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001197 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001198 break;
1199 }
1200
1201 case 'd': /* double */
1202 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001203 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001204 break;
1205 }
1206
1207#ifndef WITHOUT_COMPLEX
1208 case 'D': /* complex double */
1209 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001210 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001211 break;
1212 }
1213#endif /* WITHOUT_COMPLEX */
1214
1215 case 'c': /* char */
1216 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001217 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001218 break;
1219 }
1220
1221 case 's': /* string */
1222 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001223 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001224 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001225 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001226 format++;
1227 }
1228 break;
1229 }
1230
1231 case 'z': /* string */
1232 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001233 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001234 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001235 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001236 format++;
1237 }
1238 break;
1239 }
1240
1241 case 'S': /* string object */
1242 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001244 break;
1245 }
1246
1247 case 'O': /* object */
1248 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001249 if (*format == '!') {
1250 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 (void) va_arg(*p_va, PyTypeObject*);
1252 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001253 }
1254#if 0
1255/* I don't know what this is for */
1256 else if (*format == '?') {
1257 inquiry pred = va_arg(*p_va, inquiry);
1258 format++;
1259 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001260 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001261 }
1262 }
1263#endif
1264 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +00001265 typedef int (*converter)(PyObject *, void *);
Guido van Rossum80bb9651996-12-05 23:27:02 +00001266 (void) va_arg(*p_va, converter);
1267 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001268 format++;
1269 }
1270 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001271 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001272 }
1273 break;
1274 }
1275
1276 default:
1277 return "impossible<bad format char>";
1278
1279 }
1280
1281 *p_format = format;
1282 return NULL;
1283}