blob: b25b20ac015f065146698dca857988a671f4f674 [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001
2/* New getargs implementation */
3
4/* XXX There are several unchecked sprintf or strcat calls in this file.
5 XXX The only way these can become a danger is if some C code in the
6 XXX Python source (or in an extension) uses ridiculously long names
Thomas Wouters7e474022000-07-16 12:04:32 +00007 XXX or ridiculously deep nesting in format strings. */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00008
Guido van Rossum79f25d91997-04-29 20:08:16 +00009#include "Python.h"
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000010
Guido van Rossumc1d50531996-08-21 23:38:24 +000011#include <ctype.h>
12
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000013
Tim Petersdbd9ba62000-07-09 03:09:57 +000014int PyArg_Parse(PyObject *, char *, ...);
15int PyArg_ParseTuple(PyObject *, char *, ...);
16int PyArg_VaParse(PyObject *, char *, va_list);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000017
Tim Petersdbd9ba62000-07-09 03:09:57 +000018int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
19 char *, char **, ...);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000020
21/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000022static int vgetargs1(PyObject *, char *, va_list *, int);
23static void seterror(int, char *, int *, char *, char *);
24static char *convertitem(PyObject *, char **, va_list *, int *, char *);
25static char *converttuple(PyObject *, char **, va_list *,
26 int *, char *, int);
27static char *convertsimple(PyObject *, char **, va_list *, char *);
28static char *convertsimple1(PyObject *, char **, va_list *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000029
Tim Petersdbd9ba62000-07-09 03:09:57 +000030static int vgetargskeywords(PyObject *, PyObject *,
31 char *, char **, va_list *);
32static char *skipitem(char **, va_list *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000033
Guido van Rossum79f25d91997-04-29 20:08:16 +000034int PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000035{
36 int retval;
37 va_list va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000038
39 va_start(va, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000040 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000041 va_end(va);
42 return retval;
43}
44
45
Guido van Rossum79f25d91997-04-29 20:08:16 +000046int PyArg_ParseTuple(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, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000053 va_end(va);
54 return retval;
55}
56
57
58int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000059PyArg_VaParse(PyObject *args, char *format, va_list va)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000060{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061 va_list lva;
62
63#ifdef VA_LIST_IS_ARRAY
64 memcpy(lva, va, sizeof(va_list));
65#else
66 lva = va;
67#endif
68
69 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000070}
71
72
73static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000074vgetargs1(PyObject *args, char *format, va_list *p_va, int compat)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000075{
76 char msgbuf[256];
77 int levels[32];
78 char *fname = NULL;
79 char *message = NULL;
80 int min = -1;
81 int max = 0;
82 int level = 0;
83 char *formatsave = format;
84 int i, len;
85 char *msg;
86
Tim Peters5c4d5bf2001-02-12 22:13:26 +000087 assert(compat || (args != (PyObject*)NULL));
88
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000089 for (;;) {
90 int c = *format++;
91 if (c == '(' /* ')' */) {
92 if (level == 0)
93 max++;
94 level++;
95 }
96 else if (/* '(' */ c == ')') {
97 if (level == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +000098 Py_FatalError(/* '(' */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000099 "excess ')' in getargs format");
100 else
101 level--;
102 }
103 else if (c == '\0')
104 break;
105 else if (c == ':') {
106 fname = format;
107 break;
108 }
109 else if (c == ';') {
110 message = format;
111 break;
112 }
113 else if (level != 0)
114 ; /* Pass */
Fred Draked6573032001-05-18 21:03:40 +0000115 else if (c == 'e')
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000116 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000117 else if (isalpha(c))
118 max++;
119 else if (c == '|')
120 min = max;
121 }
122
123 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000124 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000125
126 if (min < 0)
127 min = max;
128
129 format = formatsave;
130
131 if (compat) {
132 if (max == 0) {
133 if (args == NULL)
134 return 1;
Ka-Ping Yee20579702001-01-15 22:14:16 +0000135 sprintf(msgbuf, "%s%s takes no arguments",
136 fname==NULL ? "function" : fname,
137 fname==NULL ? "" : "()");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000138 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000139 return 0;
140 }
141 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000142 if (args == NULL) {
143 sprintf(msgbuf,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000144 "%s%s takes at least one argument",
145 fname==NULL ? "function" : fname,
146 fname==NULL ? "" : "()");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000148 return 0;
149 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000150 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000151 if (msg == NULL)
152 return 1;
153 seterror(levels[0], msg, levels+1, fname, message);
154 return 0;
155 }
156 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000158 "old style getargs format uses new features");
159 return 0;
160 }
161 }
162
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 if (!PyTuple_Check(args)) {
164 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000165 "new style getargs format but argument is not a tuple");
166 return 0;
167 }
168
Jeremy Hylton0f8117f2001-05-18 20:57:38 +0000169 len = PyTuple_GET_SIZE(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000170
171 if (len < min || max < len) {
172 if (message == NULL) {
173 sprintf(msgbuf,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000174 "%s%s takes %s %d argument%s (%d given)",
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000175 fname==NULL ? "function" : fname,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000176 fname==NULL ? "" : "()",
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000177 min==max ? "exactly"
178 : len < min ? "at least" : "at most",
179 len < min ? min : max,
180 (len < min ? min : max) == 1 ? "" : "s",
181 len);
182 message = msgbuf;
183 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000185 return 0;
186 }
187
188 for (i = 0; i < len; i++) {
189 if (*format == '|')
190 format++;
Jeremy Hylton0f8117f2001-05-18 20:57:38 +0000191 msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
192 levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000193 if (msg) {
194 seterror(i+1, msg, levels, fname, message);
195 return 0;
196 }
197 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000198
Guido van Rossum730806d1998-04-10 22:27:42 +0000199 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000200 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000201 *format != '|' && *format != ':' && *format != ';') {
202 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000203 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000204 return 0;
205 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000206
207 return 1;
208}
209
210
211
212static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000213seterror(int iarg, char *msg, int *levels, char *fname, char *message)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000214{
215 char buf[256];
216 int i;
217 char *p = buf;
218
Guido van Rossum79f25d91997-04-29 20:08:16 +0000219 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000220 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000221 else if (message == NULL) {
222 if (fname != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000223 sprintf(p, "%s() ", fname);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000224 p += strlen(p);
225 }
Ka-Ping Yee20579702001-01-15 22:14:16 +0000226 if (iarg != 0) {
227 sprintf(p, "argument %d", iarg);
228 i = 0;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000229 p += strlen(p);
Ka-Ping Yee20579702001-01-15 22:14:16 +0000230 while (levels[i] > 0) {
231 sprintf(p, ", item %d", levels[i]-1);
232 p += strlen(p);
233 i++;
234 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000235 }
Ka-Ping Yee20579702001-01-15 22:14:16 +0000236 else {
237 sprintf(p, "argument");
238 p += strlen(p);
239 }
240 sprintf(p, " %s", msg);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000241 message = buf;
242 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000244}
245
246
247/* Convert a tuple argument.
248 On entry, *p_format points to the character _after_ the opening '('.
249 On successful exit, *p_format points to the closing ')'.
250 If successful:
251 *p_format and *p_va are updated,
252 *levels and *msgbuf are untouched,
253 and NULL is returned.
254 If the argument is invalid:
255 *p_format is unchanged,
256 *p_va is undefined,
257 *levels is a 0-terminated list of item numbers,
258 *msgbuf contains an error message, whose format is:
Ka-Ping Yee20579702001-01-15 22:14:16 +0000259 "must be <typename1>, not <typename2>", where:
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000260 <typename1> is the name of the expected type, and
261 <typename2> is the name of the actual type,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000262 and msgbuf is returned.
263*/
264
265static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000266converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
267 char *msgbuf, int toplevel)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000268{
269 int level = 0;
270 int n = 0;
271 char *format = *p_format;
272 int i;
273
274 for (;;) {
275 int c = *format++;
276 if (c == '(') {
277 if (level == 0)
278 n++;
279 level++;
280 }
281 else if (c == ')') {
282 if (level == 0)
283 break;
284 level--;
285 }
286 else if (c == ':' || c == ';' || c == '\0')
287 break;
288 else if (level == 0 && isalpha(c))
289 n++;
290 }
291
Ka-Ping Yee20579702001-01-15 22:14:16 +0000292 if (!PySequence_Check(arg) || PyString_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000293 levels[0] = 0;
294 sprintf(msgbuf,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000295 toplevel ? "expected %d arguments, not %s" :
296 "must be %d-item sequence, not %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000298 return msgbuf;
299 }
300
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000301 if ((i = PySequence_Size(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000302 levels[0] = 0;
303 sprintf(msgbuf,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000304 toplevel ? "expected %d arguments, not %d" :
305 "must be sequence of length %d, not %d",
306 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000307 return msgbuf;
308 }
Ka-Ping Yee20579702001-01-15 22:14:16 +0000309
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000310 format = *p_format;
311 for (i = 0; i < n; i++) {
312 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000313 PyObject *item;
314 item = PySequence_GetItem(arg, i);
315 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
316 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
317 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000318 if (msg != NULL) {
319 levels[0] = i+1;
320 return msg;
321 }
322 }
Ka-Ping Yee20579702001-01-15 22:14:16 +0000323
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000324 *p_format = format;
325 return NULL;
326}
327
328
329/* Convert a single item. */
330
331static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000332convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels,
333 char *msgbuf)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000334{
335 char *msg;
336 char *format = *p_format;
337
338 if (*format == '(' /* ')' */) {
339 format++;
340 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
341 if (msg == NULL)
342 format++;
343 }
344 else {
345 msg = convertsimple(arg, &format, p_va, msgbuf);
346 if (msg != NULL)
347 levels[0] = 0;
348 }
349 if (msg == NULL)
350 *p_format = format;
351 return msg;
352}
353
354
355/* Convert a non-tuple argument. Adds to convertsimple1 functionality
Ka-Ping Yee20579702001-01-15 22:14:16 +0000356 by formatting messages as "must be <desired type>, not <actual type>". */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000357
358static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000359convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000360{
361 char *msg = convertsimple1(arg, p_format, p_va);
362 if (msg != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000363 sprintf(msgbuf, "must be %.50s, not %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000365 msg = msgbuf;
366 }
367 return msg;
368}
369
370
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000371/* Internal API needed by convertsimple1(): */
372extern
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000373PyObject *_PyUnicode_AsDefaultEncodedString(PyObject *unicode,
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000374 const char *errors);
375
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000376/* Convert a non-tuple argument. Return NULL if conversion went OK,
377 or a string representing the expected type if the conversion failed.
378 When failing, an exception may or may not have been raised.
379 Don't call if a tuple is expected. */
380
381static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000382convertsimple1(PyObject *arg, char **p_format, va_list *p_va)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000383{
384 char *format = *p_format;
385 char c = *format++;
386
387 switch (c) {
388
Fred Drake230cae72000-05-09 21:50:00 +0000389 case 'b': /* unsigned byte -- very short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000390 {
391 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392 long ival = PyInt_AsLong(arg);
393 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000394 return "integer<b>";
Fred Drake230cae72000-05-09 21:50:00 +0000395 else if (ival < 0) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000396 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000397 "unsigned byte integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000398 return "integer<b>";
399 }
Fred Drake230cae72000-05-09 21:50:00 +0000400 else if (ival > UCHAR_MAX) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000401 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000402 "unsigned byte integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000403 return "integer<b>";
404 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000405 else
Fred Drake230cae72000-05-09 21:50:00 +0000406 *p = (unsigned char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000407 break;
408 }
409
Jack Jansencc22fbe2000-08-05 21:29:58 +0000410 case 'B': /* byte sized bitfield - both signed and unsigned values allowed */
411 {
412 char *p = va_arg(*p_va, char *);
413 long ival = PyInt_AsLong(arg);
414 if (ival == -1 && PyErr_Occurred())
415 return "integer<b>";
416 else if (ival < SCHAR_MIN) {
417 PyErr_SetString(PyExc_OverflowError,
418 "byte-sized integer bitfield is less than minimum");
419 return "integer<B>";
420 }
Jack Jansena454ebd2000-09-15 12:52:19 +0000421 else if (ival > (int)UCHAR_MAX) {
Jack Jansencc22fbe2000-08-05 21:29:58 +0000422 PyErr_SetString(PyExc_OverflowError,
423 "byte-sized integer bitfield is greater than maximum");
424 return "integer<B>";
425 }
426 else
427 *p = (unsigned char) ival;
428 break;
429 }
430
Fred Drake230cae72000-05-09 21:50:00 +0000431 case 'h': /* signed short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000432 {
433 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 long ival = PyInt_AsLong(arg);
435 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000436 return "integer<h>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000437 else if (ival < SHRT_MIN) {
438 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000439 "signed short integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000440 return "integer<h>";
441 }
442 else if (ival > SHRT_MAX) {
443 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000444 "signed short integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000445 return "integer<h>";
446 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000447 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000448 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000449 break;
450 }
451
Jack Jansencc22fbe2000-08-05 21:29:58 +0000452 case 'H': /* short int sized bitfield, both signed and unsigned allowed */
Jack Jansend50338f2000-07-06 12:22:00 +0000453 {
454 unsigned short *p = va_arg(*p_va, unsigned short *);
455 long ival = PyInt_AsLong(arg);
456 if (ival == -1 && PyErr_Occurred())
457 return "integer<H>";
Jack Jansencc22fbe2000-08-05 21:29:58 +0000458 else if (ival < SHRT_MIN) {
Jack Jansend50338f2000-07-06 12:22:00 +0000459 PyErr_SetString(PyExc_OverflowError,
Jack Jansencc22fbe2000-08-05 21:29:58 +0000460 "short integer bitfield is less than minimum");
Jack Jansend50338f2000-07-06 12:22:00 +0000461 return "integer<H>";
462 }
463 else if (ival > USHRT_MAX) {
464 PyErr_SetString(PyExc_OverflowError,
Jack Jansencc22fbe2000-08-05 21:29:58 +0000465 "short integer bitfield is greater than maximum");
Jack Jansend50338f2000-07-06 12:22:00 +0000466 return "integer<H>";
467 }
468 else
469 *p = (unsigned short) ival;
470 break;
471 }
472
Fred Drake230cae72000-05-09 21:50:00 +0000473 case 'i': /* signed int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000474 {
475 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 long ival = PyInt_AsLong(arg);
477 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000478 return "integer<i>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000479 else if (ival > INT_MAX) {
480 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000481 "signed integer is greater than maximum");
482 return "integer<i>";
483 }
484 else if (ival < INT_MIN) {
485 PyErr_SetString(PyExc_OverflowError,
486 "signed integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000487 return "integer<i>";
488 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000489 else
490 *p = ival;
491 break;
492 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000493 case 'l': /* long int */
494 {
495 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 long ival = PyInt_AsLong(arg);
497 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000498 return "integer<l>";
499 else
500 *p = ival;
501 break;
502 }
503
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000504#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000505 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000506 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000507 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
508 LONG_LONG ival = PyLong_AsLongLong( arg );
509 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000510 return "long<L>";
511 } else {
512 *p = ival;
513 }
514 break;
515 }
516#endif
517
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000518 case 'f': /* float */
519 {
520 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 double dval = PyFloat_AsDouble(arg);
522 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000523 return "float<f>";
524 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000525 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000526 break;
527 }
528
529 case 'd': /* double */
530 {
531 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 double dval = PyFloat_AsDouble(arg);
533 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000534 return "float<d>";
535 else
536 *p = dval;
537 break;
538 }
539
Guido van Rossum530956d1996-07-21 02:27:43 +0000540#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000541 case 'D': /* complex double */
542 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000543 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000544 Py_complex cval;
545 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000547 return "complex<D>";
548 else
549 *p = cval;
550 break;
551 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000552#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000553
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000554 case 'c': /* char */
555 {
556 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 if (PyString_Check(arg) && PyString_Size(arg) == 1)
558 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000559 else
560 return "char";
561 break;
562 }
563
564 case 's': /* string */
565 {
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000566 if (*format == '#') {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000567 void **p = (void **)va_arg(*p_va, char **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000568 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000569
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000570 if (PyString_Check(arg)) {
571 *p = PyString_AS_STRING(arg);
572 *q = PyString_GET_SIZE(arg);
573 }
574 else if (PyUnicode_Check(arg)) {
575 arg = _PyUnicode_AsDefaultEncodedString(
576 arg, NULL);
577 if (arg == NULL)
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000578 return "(unicode conversion error)";
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000579 *p = PyString_AS_STRING(arg);
580 *q = PyString_GET_SIZE(arg);
581 }
582 else { /* any buffer-like object */
583 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
584 int count;
585 if ( pb == NULL ||
586 pb->bf_getreadbuffer == NULL ||
587 pb->bf_getsegcount == NULL )
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000588 return "string or read-only buffer";
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000589 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000590 return "string or single-segment read-only buffer";
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000591 if ( (count =
592 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
593 return "(unspecified)";
594 *q = count;
595 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000596 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000597 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000598 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000599
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000600 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000601 *p = PyString_AS_STRING(arg);
602 else if (PyUnicode_Check(arg)) {
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000603 arg = _PyUnicode_AsDefaultEncodedString(
604 arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000605 if (arg == NULL)
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000606 return "(unicode conversion error)";
Guido van Rossume826ef02000-03-10 23:02:17 +0000607 *p = PyString_AS_STRING(arg);
608 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000609 else
610 return "string";
611 if ((int)strlen(*p) != PyString_Size(arg))
612 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000613 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000614 break;
615 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000616
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000617 case 'z': /* string, may be NULL (None) */
618 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000619 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000620 void **p = (void **)va_arg(*p_va, char **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000621 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000622
623 if (arg == Py_None) {
624 *p = 0;
625 *q = 0;
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000626 }
627 else if (PyString_Check(arg)) {
628 *p = PyString_AS_STRING(arg);
629 *q = PyString_GET_SIZE(arg);
630 }
631 else if (PyUnicode_Check(arg)) {
632 arg = _PyUnicode_AsDefaultEncodedString(
633 arg, NULL);
634 if (arg == NULL)
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000635 return "(unicode conversion error)";
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000636 *p = PyString_AS_STRING(arg);
637 *q = PyString_GET_SIZE(arg);
638 }
639 else { /* any buffer-like object */
640 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
641 int count;
642 if ( pb == NULL ||
643 pb->bf_getreadbuffer == NULL ||
644 pb->bf_getsegcount == NULL )
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000645 return "string or read-only buffer";
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000646 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000647 return "string or single-segment read-only buffer";
Marc-André Lemburg0afff382000-09-21 21:08:30 +0000648 if ( (count =
649 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
650 return "(unspecified)";
651 *q = count;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000652 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000653 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000654 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000655 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000656
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000657 if (arg == Py_None)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000658 *p = 0;
659 else if (PyString_Check(arg))
660 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000661 else if (PyUnicode_Check(arg)) {
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000662 arg = _PyUnicode_AsDefaultEncodedString(
663 arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000664 if (arg == NULL)
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000665 return "(unicode conversion error)";
Guido van Rossume826ef02000-03-10 23:02:17 +0000666 *p = PyString_AS_STRING(arg);
667 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000668 else
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000669 return "string or None";
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000670 if (*format == '#') {
671 int *q = va_arg(*p_va, int *);
672 if (arg == Py_None)
673 *q = 0;
674 else
675 *q = PyString_Size(arg);
676 format++;
677 }
678 else if (*p != NULL &&
679 (int)strlen(*p) != PyString_Size(arg))
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000680 return "string without null bytes or None";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000681 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000682 break;
683 }
684
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000685 case 'e': /* encoded string */
686 {
687 char **buffer;
688 const char *encoding;
689 PyObject *u, *s;
Marc-André Lemburg6f15e572001-05-02 17:16:16 +0000690 int size, recode_strings;
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000691
692 /* Get 'e' parameter: the encoding name */
693 encoding = (const char *)va_arg(*p_va, const char *);
694 if (encoding == NULL)
Marc-André Lemburgbff879c2000-08-03 18:46:08 +0000695 encoding = PyUnicode_GetDefaultEncoding();
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000696
Marc-André Lemburg6f15e572001-05-02 17:16:16 +0000697 /* Get output buffer parameter:
698 's' (recode all objects via Unicode) or
699 't' (only recode non-string objects)
700 */
Mark Hammondef8b6542001-05-13 08:04:26 +0000701 if (*format == 's')
Marc-André Lemburg6f15e572001-05-02 17:16:16 +0000702 recode_strings = 1;
703 else if (*format == 't')
704 recode_strings = 0;
705 else
Guido van Rossum50fbb152000-03-28 02:00:29 +0000706 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000707 buffer = (char **)va_arg(*p_va, char **);
708 format++;
709 if (buffer == NULL)
710 return "(buffer is NULL)";
711
Marc-André Lemburg6f15e572001-05-02 17:16:16 +0000712 /* Encode object */
713 if (!recode_strings && PyString_Check(arg)) {
714 s = arg;
715 Py_INCREF(s);
716 }
717 else {
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000718 /* Convert object to Unicode */
719 u = PyUnicode_FromObject(arg);
720 if (u == NULL)
Marc-André Lemburg6f15e572001-05-02 17:16:16 +0000721 return \
722 "string or unicode or text buffer";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000723
724 /* Encode object; use default error handling */
725 s = PyUnicode_AsEncodedString(u,
726 encoding,
727 NULL);
728 Py_DECREF(u);
729 if (s == NULL)
730 return "(encoding failed)";
731 if (!PyString_Check(s)) {
732 Py_DECREF(s);
Marc-André Lemburg6f15e572001-05-02 17:16:16 +0000733 return \
734 "(encoder failed to return a string)";
735 }
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000736 }
737 size = PyString_GET_SIZE(s);
738
739 /* Write output; output is guaranteed to be
740 0-terminated */
741 if (*format == '#') {
742 /* Using buffer length parameter '#':
743
744 - if *buffer is NULL, a new buffer
745 of the needed size is allocated and
746 the data copied into it; *buffer is
747 updated to point to the new buffer;
748 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000749 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000750
751 - if *buffer is not NULL, the data
752 is copied to *buffer; *buffer_len
753 has to be set to the size of the
754 buffer on input; buffer overflow is
755 signalled with an error; buffer has
756 to provide enough room for the
757 encoded string plus the trailing
758 0-byte
759
760 - in both cases, *buffer_len is
761 updated to the size of the buffer
762 /excluding/ the trailing 0-byte
763
764 */
765 int *buffer_len = va_arg(*p_va, int *);
766
767 format++;
768 if (buffer_len == NULL)
769 return "(buffer_len is NULL)";
770 if (*buffer == NULL) {
771 *buffer = PyMem_NEW(char, size + 1);
772 if (*buffer == NULL) {
773 Py_DECREF(s);
774 return "(memory error)";
775 }
776 } else {
777 if (size + 1 > *buffer_len) {
778 Py_DECREF(s);
779 return "(buffer overflow)";
780 }
781 }
782 memcpy(*buffer,
783 PyString_AS_STRING(s),
784 size + 1);
785 *buffer_len = size;
786 } else {
787 /* Using a 0-terminated buffer:
788
789 - the encoded string has to be
790 0-terminated for this variant to
791 work; if it is not, an error raised
792
793 - a new buffer of the needed size
794 is allocated and the data copied
795 into it; *buffer is updated to
796 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000797 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000798 after usage
799
800 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000801 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000802 return "(encoded string without NULL bytes)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000803 *buffer = PyMem_NEW(char, size + 1);
804 if (*buffer == NULL) {
805 Py_DECREF(s);
806 return "(memory error)";
807 }
808 memcpy(*buffer,
809 PyString_AS_STRING(s),
810 size + 1);
811 }
812 Py_DECREF(s);
813 break;
814 }
815
Fred Drake25871c02000-05-03 15:17:02 +0000816 case 'u': /* raw unicode buffer (Py_UNICODE *) */
817 {
818 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000819 void **p = (void **)va_arg(*p_va, char **);
820 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Fred Drake25871c02000-05-03 15:17:02 +0000821 int *q = va_arg(*p_va, int *);
822 int count;
823
824 if ( pb == NULL ||
825 pb->bf_getreadbuffer == NULL ||
826 pb->bf_getsegcount == NULL )
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000827 return "unicode or read-only buffer";
Fred Drake25871c02000-05-03 15:17:02 +0000828 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000829 return "unicode or single-segment read-only buffer";
Fred Drake25871c02000-05-03 15:17:02 +0000830 if ( (count =
831 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
832 return "(unspecified)";
833 /* buffer interface returns bytes, we want
834 length in characters */
835 *q = count/(sizeof(Py_UNICODE));
836 format++;
837 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000838 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
Fred Drake25871c02000-05-03 15:17:02 +0000839
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000840 if (PyUnicode_Check(arg))
Fred Drake25871c02000-05-03 15:17:02 +0000841 *p = PyUnicode_AS_UNICODE(arg);
842 else
843 return "unicode";
844 }
845 break;
846 }
847
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000848 case 'S': /* string object */
849 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 PyObject **p = va_arg(*p_va, PyObject **);
851 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000852 *p = arg;
853 else
854 return "string";
855 break;
856 }
857
Guido van Rossume826ef02000-03-10 23:02:17 +0000858 case 'U': /* Unicode object */
859 {
860 PyObject **p = va_arg(*p_va, PyObject **);
861 if (PyUnicode_Check(arg))
862 *p = arg;
863 else
864 return "unicode";
865 break;
866 }
867
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000868 case 'O': /* object */
869 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 PyTypeObject *type;
871 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000872 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000874 p = va_arg(*p_va, PyObject **);
875 format++;
876 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000877 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000878 else
879 return type->tp_name;
880
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000881 }
882 else if (*format == '?') {
883 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000884 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000885 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000886 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000887 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000888 else
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000889 return "(unspecified)";
Guido van Rossumfccfe891998-05-15 22:04:07 +0000890
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000891 }
892 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +0000893 typedef int (*converter)(PyObject *, void *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000894 converter convert = va_arg(*p_va, converter);
895 void *addr = va_arg(*p_va, void *);
896 format++;
897 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000898 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000899 }
900 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000902 *p = arg;
903 }
904 break;
905 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000906
907
908 case 'w': /* memory buffer, read-write access */
909 {
910 void **p = va_arg(*p_va, void **);
911 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
912 int count;
913
914 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
915 pb->bf_getsegcount == NULL )
916 return "read-write buffer";
917 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
918 return "single-segment read-write buffer";
919 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
920 return "(unspecified)";
921 if (*format == '#') {
922 int *q = va_arg(*p_va, int *);
923
924 *q = count;
925 format++;
926 }
927 break;
928 }
929
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000930 case 't': /* 8-bit character buffer, read-only access */
931 {
932 const char **p = va_arg(*p_va, const char **);
933 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
934 int count;
935
936 if ( *format++ != '#' )
937 return "invalid use of 't' format character";
938 if ( !PyType_HasFeature(
939 arg->ob_type,
940 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
941 pb == NULL ||
942 pb->bf_getcharbuffer == NULL ||
943 pb->bf_getsegcount == NULL )
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000944 return "string or read-only character buffer";
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000945 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
Guido van Rossum60a1e7f2000-12-01 12:59:05 +0000946 return "string or single-segment read-only buffer";
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000947 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
948 return "(unspecified)";
949
950 *va_arg(*p_va, int *) = count;
951
952 break;
953 }
954
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000955
956 default:
957 return "impossible<bad format char>";
958
959 }
960
961 *p_format = format;
962 return NULL;
963}
Guido van Rossumaa354651996-08-19 19:32:04 +0000964
965
966/* Support for keyword arguments donated by
967 Geoff Philbrick <philbric@delphi.hks.com> */
968
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969int PyArg_ParseTupleAndKeywords(PyObject *args,
970 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000971 char *format,
972 char **kwlist, ...)
Guido van Rossumaa354651996-08-19 19:32:04 +0000973{
974 int retval;
975 va_list va;
Guido van Rossumaa354651996-08-19 19:32:04 +0000976
977 va_start(va, kwlist);
Guido van Rossumaa354651996-08-19 19:32:04 +0000978 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
979 va_end(va);
980 return retval;
981}
982
983
984static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000985vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
986 char **kwlist, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +0000987{
988 char msgbuf[256];
989 int levels[32];
990 char *fname = NULL;
991 char *message = NULL;
992 int min = -1;
993 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +0000994 char *formatsave = format;
995 int i, len, tplen, kwlen;
996 char *msg, *ks, **p;
997 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +0000999
1000 /* nested tuples cannot be parsed when using keyword arguments */
1001
1002 for (;;) {
1003 int c = *format++;
1004 if (c == '(') {
1005 PyErr_SetString(PyExc_SystemError,
1006 "tuple found in format when using keyword arguments");
1007 return 0;
1008 }
1009 else if (c == '\0')
1010 break;
1011 else if (c == ':') {
1012 fname = format;
1013 break;
Jeremy Hylton0f8117f2001-05-18 20:57:38 +00001014 } else if (c == ';') {
Guido van Rossumaa354651996-08-19 19:32:04 +00001015 message = format;
1016 break;
Jeremy Hylton0f8117f2001-05-18 20:57:38 +00001017 } else if (c == 'e')
Marc-André Lemburgbbcf2a72000-09-08 11:49:37 +00001018 ; /* Pass */
Guido van Rossumaa354651996-08-19 19:32:04 +00001019 else if (isalpha(c))
1020 max++;
1021 else if (c == '|')
1022 min = max;
1023 }
1024
1025 if (min < 0)
1026 min = max;
1027
1028 format = formatsave;
1029
1030 if (!PyTuple_Check(args)) {
1031 PyErr_SetString(PyExc_SystemError,
1032 "new style getargs format but argument is not a tuple");
1033 return 0;
1034 }
1035
Jeremy Hylton0f8117f2001-05-18 20:57:38 +00001036 tplen = PyTuple_GET_SIZE(args);
Guido van Rossumaa354651996-08-19 19:32:04 +00001037
1038 /* do a cursory check of the keywords just to see how many we got */
1039
1040 if (keywords) {
1041 if (!PyDict_Check(keywords)) {
Jeremy Hyltona0ac40c2001-01-25 20:13:10 +00001042 if (keywords == NULL)
1043 PyErr_SetString(PyExc_SystemError,
1044 "NULL received when keyword dictionary expected");
1045 else
1046 PyErr_Format(PyExc_SystemError,
1047 "%s received when keyword dictionary expected",
1048 keywords->ob_type->tp_name);
Guido van Rossumaa354651996-08-19 19:32:04 +00001049 return 0;
1050 }
1051 kwlen = PyDict_Size(keywords);
1052 }
1053 else {
1054 kwlen = 0;
1055 }
1056
1057 /* make sure there are no duplicate values for an argument;
1058 its not clear when to use the term "keyword argument vs.
1059 keyword parameter in messages */
1060
1061 if (keywords) {
1062 for (i = 0; i < tplen; i++) {
1063 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1064 sprintf(msgbuf,
1065 "keyword parameter %s redefined",
1066 kwlist[i]);
1067 PyErr_SetString(PyExc_TypeError, msgbuf);
1068 return 0;
1069 }
1070 }
1071 }
1072 PyErr_Clear(); /* I'm not which Py functions set the error string */
1073
1074 /* required arguments missing from args can be supplied by keyword
1075 arguments */
1076
1077 len = tplen;
1078 if (keywords && tplen < min) {
1079 for (i = tplen; i < min; i++) {
1080 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1081 len++;
1082 }
1083 }
1084 }
1085 PyErr_Clear();
1086
1087 /* make sure we got an acceptable number of arguments; the message
1088 is a little confusing with keywords since keyword arguments
1089 which are supplied, but don't match the required arguments
1090 are not included in the "%d given" part of the message */
1091
1092 if (len < min || max < len) {
1093 if (message == NULL) {
1094 sprintf(msgbuf,
Ka-Ping Yee20579702001-01-15 22:14:16 +00001095 "%s%s takes %s %d argument%s (%d given)",
Guido van Rossumaa354651996-08-19 19:32:04 +00001096 fname==NULL ? "function" : fname,
Ka-Ping Yee20579702001-01-15 22:14:16 +00001097 fname==NULL ? "" : "()",
Guido van Rossumaa354651996-08-19 19:32:04 +00001098 min==max ? "exactly"
1099 : len < min ? "at least" : "at most",
1100 len < min ? min : max,
1101 (len < min ? min : max) == 1 ? "" : "s",
1102 len);
1103 message = msgbuf;
1104 }
1105 PyErr_SetString(PyExc_TypeError, message);
1106 return 0;
1107 }
1108
1109 for (i = 0; i < tplen; i++) {
1110 if (*format == '|')
1111 format++;
Jeremy Hylton0f8117f2001-05-18 20:57:38 +00001112 msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
Guido van Rossumaa354651996-08-19 19:32:04 +00001113 levels, msgbuf);
1114 if (msg) {
1115 seterror(i+1, msg, levels, fname, message);
1116 return 0;
1117 }
1118 }
1119
1120 /* handle no keyword parameters in call */
1121
1122 if (!keywords) return 1;
1123
1124 /* make sure the number of keywords in the keyword list matches the
1125 number of items in the format string */
1126
1127 nkwds = 0;
1128 p = kwlist;
1129 for (;;) {
1130 if (!*(p++)) break;
1131 nkwds++;
1132 }
1133
1134 if (nkwds != max) {
1135 PyErr_SetString(PyExc_SystemError,
1136 "number of items in format string and keyword list do not match");
1137 return 0;
1138 }
1139
1140 /* convert the keyword arguments; this uses the format
1141 string where it was left after processing args */
1142
1143 converted = 0;
1144 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001146 if (*format == '|')
1147 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001148 item = PyMapping_GetItemString(keywords, kwlist[i]);
1149 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001150 msg = convertitem(item, &format, p_va, levels, msgbuf);
1151 if (msg) {
1152 seterror(i+1, msg, levels, fname, message);
1153 return 0;
1154 }
1155 converted++;
Barry Warsaw07050282000-12-11 20:01:55 +00001156 Py_DECREF(item);
Guido van Rossumaa354651996-08-19 19:32:04 +00001157 }
1158 else {
1159 PyErr_Clear();
1160 msg = skipitem(&format, p_va);
1161 if (msg) {
1162 seterror(i+1, msg, levels, fname, message);
1163 return 0;
1164 }
1165 }
1166 }
1167
1168 /* make sure there are no extraneous keyword arguments */
1169
1170 pos = 0;
1171 if (converted < kwlen) {
1172 while (PyDict_Next(keywords, &pos, &key, &value)) {
1173 match = 0;
1174 ks = PyString_AsString(key);
1175 for (i = 0; i < nkwds; i++) {
1176 if (!strcmp(ks, kwlist[i])) {
1177 match = 1;
1178 break;
1179 }
1180 }
1181 if (!match) {
1182 sprintf(msgbuf,
Guido van Rossum80dc16b2000-05-08 14:02:41 +00001183 "%s is an invalid keyword argument for this function",
Guido van Rossumaa354651996-08-19 19:32:04 +00001184 ks);
1185 PyErr_SetString(PyExc_TypeError, msgbuf);
1186 return 0;
1187 }
1188 }
1189 }
1190
1191 return 1;
1192}
1193
1194
1195static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001196skipitem(char **p_format, va_list *p_va)
Guido van Rossumaa354651996-08-19 19:32:04 +00001197{
1198 char *format = *p_format;
1199 char c = *format++;
1200
1201 switch (c) {
1202
1203 case 'b': /* byte -- very short int */
Jack Jansencc22fbe2000-08-05 21:29:58 +00001204 case 'B': /* byte as bitfield */
Guido van Rossumaa354651996-08-19 19:32:04 +00001205 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001206 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001207 break;
1208 }
1209
1210 case 'h': /* short int */
1211 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001212 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001213 break;
1214 }
1215
Jack Jansencc22fbe2000-08-05 21:29:58 +00001216 case 'H': /* short int as bitfield */
Jack Jansend50338f2000-07-06 12:22:00 +00001217 {
1218 (void) va_arg(*p_va, unsigned short *);
1219 break;
1220 }
1221
Guido van Rossumaa354651996-08-19 19:32:04 +00001222 case 'i': /* int */
1223 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001224 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001225 break;
1226 }
1227
1228 case 'l': /* long int */
1229 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001230 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001231 break;
1232 }
1233
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001234#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001235 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001236 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001237 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001238 break;
1239 }
1240#endif
1241
Guido van Rossumaa354651996-08-19 19:32:04 +00001242 case 'f': /* float */
1243 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001244 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001245 break;
1246 }
1247
1248 case 'd': /* double */
1249 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001250 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001251 break;
1252 }
1253
1254#ifndef WITHOUT_COMPLEX
1255 case 'D': /* complex double */
1256 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001257 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001258 break;
1259 }
1260#endif /* WITHOUT_COMPLEX */
1261
1262 case 'c': /* char */
1263 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001264 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001265 break;
1266 }
1267
1268 case 's': /* string */
1269 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001270 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001271 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001272 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001273 format++;
1274 }
1275 break;
1276 }
1277
1278 case 'z': /* string */
1279 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001280 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001281 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001282 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001283 format++;
1284 }
1285 break;
1286 }
1287
1288 case 'S': /* string object */
1289 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001290 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001291 break;
1292 }
1293
1294 case 'O': /* object */
1295 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001296 if (*format == '!') {
1297 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001298 (void) va_arg(*p_va, PyTypeObject*);
1299 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001300 }
1301#if 0
1302/* I don't know what this is for */
1303 else if (*format == '?') {
1304 inquiry pred = va_arg(*p_va, inquiry);
1305 format++;
1306 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001307 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001308 }
1309 }
1310#endif
1311 else if (*format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +00001312 typedef int (*converter)(PyObject *, void *);
Guido van Rossum80bb9651996-12-05 23:27:02 +00001313 (void) va_arg(*p_va, converter);
1314 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001315 format++;
1316 }
1317 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001318 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001319 }
1320 break;
1321 }
1322
1323 default:
1324 return "impossible<bad format char>";
1325
1326 }
1327
1328 *p_format = format;
1329 return NULL;
1330}