blob: a28354dda0c8db70cc973c458218e3265c671539 [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00009******************************************************************/
10
11/* New getargs implementation */
12
13/* XXX There are several unchecked sprintf or strcat calls in this file.
14 XXX The only way these can become a danger is if some C code in the
15 XXX Python source (or in an extension) uses ridiculously long names
16 XXX or riduculously deep nesting in format strings. */
17
Guido van Rossum79f25d91997-04-29 20:08:16 +000018#include "Python.h"
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000019
Guido van Rossumc1d50531996-08-21 23:38:24 +000020#include <ctype.h>
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
Guido van Rossum79f25d91997-04-29 20:08:16 +000026int PyArg_Parse Py_PROTO((PyObject *, char *, ...));
27int PyArg_ParseTuple Py_PROTO((PyObject *, char *, ...));
Guido van Rossum13454c31997-05-05 21:57:29 +000028int PyArg_VaParse Py_PROTO((PyObject *, char *, va_list));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000029
Guido van Rossum79f25d91997-04-29 20:08:16 +000030int PyArg_ParseTupleAndKeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000031 char *, char **, ...));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000032
33/* Forward */
Guido van Rossum79f25d91997-04-29 20:08:16 +000034static int vgetargs1 Py_PROTO((PyObject *, char *, va_list *, int));
35static void seterror Py_PROTO((int, char *, int *, char *, char *));
36static char *convertitem Py_PROTO((PyObject *, char **, va_list *,
37 int *, char *));
38static char *converttuple Py_PROTO((PyObject *, char **, va_list *,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000039 int *, char *, int));
Guido van Rossum79f25d91997-04-29 20:08:16 +000040static char *convertsimple Py_PROTO((PyObject *, char **, va_list *, char *));
41static char *convertsimple1 Py_PROTO((PyObject *, char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000042
Guido van Rossum79f25d91997-04-29 20:08:16 +000043static int vgetargskeywords Py_PROTO((PyObject *, PyObject *,
Guido van Rossumaa354651996-08-19 19:32:04 +000044 char *, char **, va_list *));
Guido van Rossum79f25d91997-04-29 20:08:16 +000045static char *skipitem Py_PROTO((char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000046
47#ifdef HAVE_STDARG_PROTOTYPES
48/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000049int PyArg_Parse(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000050#else
51/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000052int PyArg_Parse(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000053#endif
54{
55 int retval;
56 va_list va;
57#ifdef HAVE_STDARG_PROTOTYPES
58
59 va_start(va, format);
60#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000061 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000062 char *format;
63
64 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +000065 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000066 format = va_arg(va, char *);
67#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000069 va_end(va);
70 return retval;
71}
72
73
74#ifdef HAVE_STDARG_PROTOTYPES
75/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +000076int PyArg_ParseTuple(PyObject *args, char *format, ...)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000077#else
78/* VARARGS */
Guido van Rossum79f25d91997-04-29 20:08:16 +000079int PyArg_ParseTuple(va_alist) va_dcl
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000080#endif
81{
82 int retval;
83 va_list va;
84#ifdef HAVE_STDARG_PROTOTYPES
85
86 va_start(va, format);
87#else
Guido van Rossum79f25d91997-04-29 20:08:16 +000088 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000089 char *format;
90
91 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +000092 args = va_arg(va, PyObject *);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000093 format = va_arg(va, char *);
94#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000095 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000096 va_end(va);
97 return retval;
98}
99
100
101int
Guido van Rossum13454c31997-05-05 21:57:29 +0000102PyArg_VaParse(args, format, va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000104 char *format;
105 va_list va;
106{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000107 va_list lva;
108
109#ifdef VA_LIST_IS_ARRAY
110 memcpy(lva, va, sizeof(va_list));
111#else
112 lva = va;
113#endif
114
115 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000116}
117
118
119static int
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000120vgetargs1(args, format, p_va, compat)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000121 PyObject *args;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000122 char *format;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000123 va_list *p_va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000124 int compat;
125{
126 char msgbuf[256];
127 int levels[32];
128 char *fname = NULL;
129 char *message = NULL;
130 int min = -1;
131 int max = 0;
132 int level = 0;
133 char *formatsave = format;
134 int i, len;
135 char *msg;
136
137 for (;;) {
138 int c = *format++;
139 if (c == '(' /* ')' */) {
140 if (level == 0)
141 max++;
142 level++;
143 }
144 else if (/* '(' */ c == ')') {
145 if (level == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 Py_FatalError(/* '(' */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000147 "excess ')' in getargs format");
148 else
149 level--;
150 }
151 else if (c == '\0')
152 break;
153 else if (c == ':') {
154 fname = format;
155 break;
156 }
157 else if (c == ';') {
158 message = format;
159 break;
160 }
161 else if (level != 0)
162 ; /* Pass */
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000163 else if (c == 'e')
164 ; /* Pass */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000165 else if (isalpha(c))
166 max++;
167 else if (c == '|')
168 min = max;
169 }
170
171 if (level != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 Py_FatalError(/* '(' */ "missing ')' in getargs format");
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000173
174 if (min < 0)
175 min = max;
176
177 format = formatsave;
178
179 if (compat) {
180 if (max == 0) {
181 if (args == NULL)
182 return 1;
183 sprintf(msgbuf, "%s requires no arguments",
184 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000186 return 0;
187 }
188 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000189 if (args == NULL) {
190 sprintf(msgbuf,
191 "%s requires at least one argument",
192 fname==NULL ? "function" : fname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000193 PyErr_SetString(PyExc_TypeError, msgbuf);
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000194 return 0;
195 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000196 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000197 if (msg == NULL)
198 return 1;
199 seterror(levels[0], msg, levels+1, fname, message);
200 return 0;
201 }
202 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000204 "old style getargs format uses new features");
205 return 0;
206 }
207 }
208
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 if (!PyTuple_Check(args)) {
210 PyErr_SetString(PyExc_SystemError,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000211 "new style getargs format but argument is not a tuple");
212 return 0;
213 }
214
Guido van Rossum79f25d91997-04-29 20:08:16 +0000215 len = PyTuple_Size(args);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000216
217 if (len < min || max < len) {
218 if (message == NULL) {
219 sprintf(msgbuf,
220 "%s requires %s %d argument%s; %d given",
221 fname==NULL ? "function" : fname,
222 min==max ? "exactly"
223 : len < min ? "at least" : "at most",
224 len < min ? min : max,
225 (len < min ? min : max) == 1 ? "" : "s",
226 len);
227 message = msgbuf;
228 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000229 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000230 return 0;
231 }
232
233 for (i = 0; i < len; i++) {
234 if (*format == '|')
235 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000236 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000237 levels, msgbuf);
238 if (msg) {
239 seterror(i+1, msg, levels, fname, message);
240 return 0;
241 }
242 }
Guido van Rossum231a41e1997-12-09 20:36:39 +0000243
Guido van Rossum730806d1998-04-10 22:27:42 +0000244 if (*format != '\0' && !isalpha((int)(*format)) &&
Guido van Rossum7d4f68c1997-12-19 04:25:23 +0000245 *format != '(' &&
Guido van Rossum231a41e1997-12-09 20:36:39 +0000246 *format != '|' && *format != ':' && *format != ';') {
247 PyErr_Format(PyExc_SystemError,
Guido van Rossum0d6b49e1998-01-19 22:22:44 +0000248 "bad format string: %.200s", formatsave);
Guido van Rossum231a41e1997-12-09 20:36:39 +0000249 return 0;
250 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000251
252 return 1;
253}
254
255
256
257static void
258seterror(iarg, msg, levels, fname, message)
259 int iarg;
260 char *msg;
261 int *levels;
262 char *fname;
263 char *message;
264{
265 char buf[256];
266 int i;
267 char *p = buf;
268
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 if (PyErr_Occurred())
Guido van Rossum64fc6491995-01-21 14:09:37 +0000270 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000271 if (iarg == 0 && message == NULL)
272 message = msg;
273 else if (message == NULL) {
274 if (fname != NULL) {
275 sprintf(p, "%s, ", fname);
276 p += strlen(p);
277 }
278 sprintf(p, "argument %d", iarg);
279 i = 0;
280 p += strlen(p);
281 while (levels[i] > 0) {
282 sprintf(p, ", item %d", levels[i]-1);
283 p += strlen(p);
284 i++;
285 }
286 sprintf(p, ": expected %s found", msg);
287 message = buf;
288 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000289 PyErr_SetString(PyExc_TypeError, message);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000290}
291
292
293/* Convert a tuple argument.
294 On entry, *p_format points to the character _after_ the opening '('.
295 On successful exit, *p_format points to the closing ')'.
296 If successful:
297 *p_format and *p_va are updated,
298 *levels and *msgbuf are untouched,
299 and NULL is returned.
300 If the argument is invalid:
301 *p_format is unchanged,
302 *p_va is undefined,
303 *levels is a 0-terminated list of item numbers,
304 *msgbuf contains an error message, whose format is:
305 "<typename1>, <typename2>", where:
306 <typename1> is the name of the expected type, and
307 <typename2> is the name of the actual type,
308 (so you can surround it by "expected ... found"),
309 and msgbuf is returned.
310*/
311
312static char *
313converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000315 char **p_format;
316 va_list *p_va;
317 int *levels;
318 char *msgbuf;
319 int toplevel;
320{
321 int level = 0;
322 int n = 0;
323 char *format = *p_format;
324 int i;
325
326 for (;;) {
327 int c = *format++;
328 if (c == '(') {
329 if (level == 0)
330 n++;
331 level++;
332 }
333 else if (c == ')') {
334 if (level == 0)
335 break;
336 level--;
337 }
338 else if (c == ':' || c == ';' || c == '\0')
339 break;
340 else if (level == 0 && isalpha(c))
341 n++;
342 }
343
Guido van Rossum66368cc1999-02-17 23:16:43 +0000344 if (!PySequence_Check(arg)) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000345 levels[0] = 0;
346 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000347 toplevel ? "%d arguments, %s" : "%d-sequence, %s",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 n, arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000349 return msgbuf;
350 }
351
Guido van Rossum66368cc1999-02-17 23:16:43 +0000352 if ((i = PySequence_Length(arg)) != n) {
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000353 levels[0] = 0;
354 sprintf(msgbuf,
Guido van Rossum66368cc1999-02-17 23:16:43 +0000355 toplevel ? "%d arguments, %d" : "%d-sequence, %d-sequence",
356 n, i);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000357 return msgbuf;
358 }
359
360 format = *p_format;
361 for (i = 0; i < n; i++) {
362 char *msg;
Guido van Rossum66368cc1999-02-17 23:16:43 +0000363 PyObject *item;
364 item = PySequence_GetItem(arg, i);
365 msg = convertitem(item, &format, p_va, levels+1, msgbuf);
366 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
367 Py_XDECREF(item);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000368 if (msg != NULL) {
369 levels[0] = i+1;
370 return msg;
371 }
372 }
373
374 *p_format = format;
375 return NULL;
376}
377
378
379/* Convert a single item. */
380
381static char *
382convertitem(arg, p_format, p_va, levels, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000384 char **p_format;
385 va_list *p_va;
386 int *levels;
387 char *msgbuf;
388{
389 char *msg;
390 char *format = *p_format;
391
392 if (*format == '(' /* ')' */) {
393 format++;
394 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
395 if (msg == NULL)
396 format++;
397 }
398 else {
399 msg = convertsimple(arg, &format, p_va, msgbuf);
400 if (msg != NULL)
401 levels[0] = 0;
402 }
403 if (msg == NULL)
404 *p_format = format;
405 return msg;
406}
407
408
409/* Convert a non-tuple argument. Adds to convertsimple1 functionality
410 by appending ", <actual argument type>" to error message. */
411
412static char *
413convertsimple(arg, p_format, p_va, msgbuf)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000415 char **p_format;
416 va_list *p_va;
417 char *msgbuf;
418{
419 char *msg = convertsimple1(arg, p_format, p_va);
420 if (msg != NULL) {
421 sprintf(msgbuf, "%.50s, %.50s", msg,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 arg == Py_None ? "None" : arg->ob_type->tp_name);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000423 msg = msgbuf;
424 }
425 return msg;
426}
427
428
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000429/* Internal API needed by convertsimple1(): */
430extern
431PyObject *_PyUnicode_AsUTF8String(PyObject *unicode,
432 const char *errors);
433
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000434/* Convert a non-tuple argument. Return NULL if conversion went OK,
435 or a string representing the expected type if the conversion failed.
436 When failing, an exception may or may not have been raised.
437 Don't call if a tuple is expected. */
438
439static char *
440convertsimple1(arg, p_format, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 PyObject *arg;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000442 char **p_format;
443 va_list *p_va;
444{
445 char *format = *p_format;
446 char c = *format++;
447
448 switch (c) {
449
Fred Drake230cae72000-05-09 21:50:00 +0000450 case 'b': /* unsigned byte -- very short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000451 {
452 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 long ival = PyInt_AsLong(arg);
454 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000455 return "integer<b>";
Fred Drake230cae72000-05-09 21:50:00 +0000456 else if (ival < 0) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000457 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000458 "unsigned byte integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000459 return "integer<b>";
460 }
Fred Drake230cae72000-05-09 21:50:00 +0000461 else if (ival > UCHAR_MAX) {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000462 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000463 "unsigned byte integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000464 return "integer<b>";
465 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000466 else
Fred Drake230cae72000-05-09 21:50:00 +0000467 *p = (unsigned char) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000468 break;
469 }
470
Fred Drake230cae72000-05-09 21:50:00 +0000471 case 'h': /* signed short int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000472 {
473 short *p = va_arg(*p_va, short *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 long ival = PyInt_AsLong(arg);
475 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000476 return "integer<h>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000477 else if (ival < SHRT_MIN) {
478 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000479 "signed short integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000480 return "integer<h>";
481 }
482 else if (ival > SHRT_MAX) {
483 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000484 "signed short integer is greater than maximum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000485 return "integer<h>";
486 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000487 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000488 *p = (short) ival;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000489 break;
490 }
491
Jack Jansend50338f2000-07-06 12:22:00 +0000492 case 'H': /* unsigned short int */
493 {
494 unsigned short *p = va_arg(*p_va, unsigned short *);
495 long ival = PyInt_AsLong(arg);
496 if (ival == -1 && PyErr_Occurred())
497 return "integer<H>";
498 else if (ival < 0) {
499 PyErr_SetString(PyExc_OverflowError,
500 "unsigned short integer is less than minimum");
501 return "integer<H>";
502 }
503 else if (ival > USHRT_MAX) {
504 PyErr_SetString(PyExc_OverflowError,
505 "unsigned short integer is greater than maximum");
506 return "integer<H>";
507 }
508 else
509 *p = (unsigned short) ival;
510 break;
511 }
512
Fred Drake230cae72000-05-09 21:50:00 +0000513 case 'i': /* signed int */
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000514 {
515 int *p = va_arg(*p_va, int *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 long ival = PyInt_AsLong(arg);
517 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000518 return "integer<i>";
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000519 else if (ival > INT_MAX) {
520 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum5e08cb82000-06-28 23:53:56 +0000521 "signed integer is greater than maximum");
522 return "integer<i>";
523 }
524 else if (ival < INT_MIN) {
525 PyErr_SetString(PyExc_OverflowError,
526 "signed integer is less than minimum");
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000527 return "integer<i>";
528 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000529 else
530 *p = ival;
531 break;
532 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000533 case 'l': /* long int */
534 {
535 long *p = va_arg(*p_va, long *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 long ival = PyInt_AsLong(arg);
537 if (ival == -1 && PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000538 return "integer<l>";
539 else
540 *p = ival;
541 break;
542 }
543
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000544#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +0000545 case 'L': /* LONG_LONG */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000546 {
Guido van Rossum3293b071998-08-25 16:07:15 +0000547 LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
548 LONG_LONG ival = PyLong_AsLongLong( arg );
549 if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000550 return "long<L>";
551 } else {
552 *p = ival;
553 }
554 break;
555 }
556#endif
557
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000558 case 'f': /* float */
559 {
560 float *p = va_arg(*p_va, float *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 double dval = PyFloat_AsDouble(arg);
562 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000563 return "float<f>";
564 else
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000565 *p = (float) dval;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000566 break;
567 }
568
569 case 'd': /* double */
570 {
571 double *p = va_arg(*p_va, double *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 double dval = PyFloat_AsDouble(arg);
573 if (PyErr_Occurred())
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000574 return "float<d>";
575 else
576 *p = dval;
577 break;
578 }
579
Guido van Rossum530956d1996-07-21 02:27:43 +0000580#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000581 case 'D': /* complex double */
582 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000583 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000584 Py_complex cval;
585 cval = PyComplex_AsCComplex(arg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 if (PyErr_Occurred())
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000587 return "complex<D>";
588 else
589 *p = cval;
590 break;
591 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000592#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000593
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000594 case 'c': /* char */
595 {
596 char *p = va_arg(*p_va, char *);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 if (PyString_Check(arg) && PyString_Size(arg) == 1)
598 *p = PyString_AsString(arg)[0];
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000599 else
600 return "char";
601 break;
602 }
603
604 case 's': /* string */
605 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000606 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000607 void **p = (void **)va_arg(*p_va, char **);
608 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000609 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000610 int count;
611
612 if ( pb == NULL ||
613 pb->bf_getreadbuffer == NULL ||
614 pb->bf_getsegcount == NULL )
615 return "read-only buffer";
616 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
617 return "single-segment read-only buffer";
618 if ( (count =
619 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
620 return "(unspecified)";
621 *q = count;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000622 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000623 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000624 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000625
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000626 if (PyString_Check(arg))
Guido van Rossume826ef02000-03-10 23:02:17 +0000627 *p = PyString_AS_STRING(arg);
628 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000629 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000630 if (arg == NULL)
631 return "unicode conversion error";
632 *p = PyString_AS_STRING(arg);
633 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000634 else
635 return "string";
636 if ((int)strlen(*p) != PyString_Size(arg))
637 return "string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000638 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000639 break;
640 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000641
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000642 case 'z': /* string, may be NULL (None) */
643 {
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000644 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000645 void **p = (void **)va_arg(*p_va, char **);
646 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000647 int *q = va_arg(*p_va, int *);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000648 int count;
649
650 if (arg == Py_None) {
651 *p = 0;
652 *q = 0;
653 } else {
654 if ( pb == NULL ||
655 pb->bf_getreadbuffer == NULL ||
656 pb->bf_getsegcount == NULL )
657 return "read-only buffer";
658 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
659 return "single-segment read-only buffer";
660 if ( (count = (*pb->bf_getreadbuffer)
661 (arg, 0, p)) < 0 )
662 return "(unspecified)";
663 *q = count;
664 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000665 format++;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000666 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000667 char **p = va_arg(*p_va, char **);
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000668
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000669 if (arg == Py_None)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000670 *p = 0;
671 else if (PyString_Check(arg))
672 *p = PyString_AsString(arg);
Guido van Rossume826ef02000-03-10 23:02:17 +0000673 else if (PyUnicode_Check(arg)) {
Guido van Rossum700c6ff2000-04-27 20:13:18 +0000674 arg = _PyUnicode_AsUTF8String(arg, NULL);
Guido van Rossume826ef02000-03-10 23:02:17 +0000675 if (arg == NULL)
676 return "unicode conversion error";
677 *p = PyString_AS_STRING(arg);
678 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000679 else
680 return "None or string";
681 if (*format == '#') {
682 int *q = va_arg(*p_va, int *);
683 if (arg == Py_None)
684 *q = 0;
685 else
686 *q = PyString_Size(arg);
687 format++;
688 }
689 else if (*p != NULL &&
690 (int)strlen(*p) != PyString_Size(arg))
691 return "None or string without null bytes";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000692 }
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000693 break;
694 }
695
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000696 case 'e': /* encoded string */
697 {
698 char **buffer;
699 const char *encoding;
700 PyObject *u, *s;
701 int size;
702
703 /* Get 'e' parameter: the encoding name */
704 encoding = (const char *)va_arg(*p_va, const char *);
705 if (encoding == NULL)
706 return "(encoding is NULL)";
707
708 /* Get 's' parameter: the output buffer to use */
709 if (*format != 's')
Guido van Rossum50fbb152000-03-28 02:00:29 +0000710 return "(unknown parser marker combination)";
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000711 buffer = (char **)va_arg(*p_va, char **);
712 format++;
713 if (buffer == NULL)
714 return "(buffer is NULL)";
715
716 /* Convert object to Unicode */
717 u = PyUnicode_FromObject(arg);
718 if (u == NULL)
719 return "string, unicode or text buffer";
720
721 /* Encode object; use default error handling */
722 s = PyUnicode_AsEncodedString(u,
723 encoding,
724 NULL);
725 Py_DECREF(u);
726 if (s == NULL)
727 return "(encoding failed)";
728 if (!PyString_Check(s)) {
729 Py_DECREF(s);
730 return "(encoder failed to return a string)";
731 }
732 size = PyString_GET_SIZE(s);
733
734 /* Write output; output is guaranteed to be
735 0-terminated */
736 if (*format == '#') {
737 /* Using buffer length parameter '#':
738
739 - if *buffer is NULL, a new buffer
740 of the needed size is allocated and
741 the data copied into it; *buffer is
742 updated to point to the new buffer;
743 the caller is responsible for
Guido van Rossum24bdb042000-03-28 20:29:59 +0000744 PyMem_Free()ing it after usage
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000745
746 - if *buffer is not NULL, the data
747 is copied to *buffer; *buffer_len
748 has to be set to the size of the
749 buffer on input; buffer overflow is
750 signalled with an error; buffer has
751 to provide enough room for the
752 encoded string plus the trailing
753 0-byte
754
755 - in both cases, *buffer_len is
756 updated to the size of the buffer
757 /excluding/ the trailing 0-byte
758
759 */
760 int *buffer_len = va_arg(*p_va, int *);
761
762 format++;
763 if (buffer_len == NULL)
764 return "(buffer_len is NULL)";
765 if (*buffer == NULL) {
766 *buffer = PyMem_NEW(char, size + 1);
767 if (*buffer == NULL) {
768 Py_DECREF(s);
769 return "(memory error)";
770 }
771 } else {
772 if (size + 1 > *buffer_len) {
773 Py_DECREF(s);
774 return "(buffer overflow)";
775 }
776 }
777 memcpy(*buffer,
778 PyString_AS_STRING(s),
779 size + 1);
780 *buffer_len = size;
781 } else {
782 /* Using a 0-terminated buffer:
783
784 - the encoded string has to be
785 0-terminated for this variant to
786 work; if it is not, an error raised
787
788 - a new buffer of the needed size
789 is allocated and the data copied
790 into it; *buffer is updated to
791 point to the new buffer; the caller
Guido van Rossum24bdb042000-03-28 20:29:59 +0000792 is responsible for PyMem_Free()ing it
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000793 after usage
794
795 */
Guido van Rossum50fbb152000-03-28 02:00:29 +0000796 if ((int)strlen(PyString_AS_STRING(s)) != size)
Guido van Rossumd8855fd2000-03-24 22:14:19 +0000797 return "(encoded string without "\
798 "NULL bytes)";
799 *buffer = PyMem_NEW(char, size + 1);
800 if (*buffer == NULL) {
801 Py_DECREF(s);
802 return "(memory error)";
803 }
804 memcpy(*buffer,
805 PyString_AS_STRING(s),
806 size + 1);
807 }
808 Py_DECREF(s);
809 break;
810 }
811
Fred Drake25871c02000-05-03 15:17:02 +0000812 case 'u': /* raw unicode buffer (Py_UNICODE *) */
813 {
814 if (*format == '#') { /* any buffer-like object */
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000815 void **p = (void **)va_arg(*p_va, char **);
816 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
Fred Drake25871c02000-05-03 15:17:02 +0000817 int *q = va_arg(*p_va, int *);
818 int count;
819
820 if ( pb == NULL ||
821 pb->bf_getreadbuffer == NULL ||
822 pb->bf_getsegcount == NULL )
823 return "read-only buffer";
824 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
825 return "single-segment read-only buffer";
826 if ( (count =
827 (*pb->bf_getreadbuffer)(arg, 0, p)) < 0 )
828 return "(unspecified)";
829 /* buffer interface returns bytes, we want
830 length in characters */
831 *q = count/(sizeof(Py_UNICODE));
832 format++;
833 } else {
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000834 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
Fred Drake25871c02000-05-03 15:17:02 +0000835
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000836 if (PyUnicode_Check(arg))
Fred Drake25871c02000-05-03 15:17:02 +0000837 *p = PyUnicode_AS_UNICODE(arg);
838 else
839 return "unicode";
840 }
841 break;
842 }
843
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000844 case 'S': /* string object */
845 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 PyObject **p = va_arg(*p_va, PyObject **);
847 if (PyString_Check(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000848 *p = arg;
849 else
850 return "string";
851 break;
852 }
853
Guido van Rossume826ef02000-03-10 23:02:17 +0000854 case 'U': /* Unicode object */
855 {
856 PyObject **p = va_arg(*p_va, PyObject **);
857 if (PyUnicode_Check(arg))
858 *p = arg;
859 else
860 return "unicode";
861 break;
862 }
863
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000864 case 'O': /* object */
865 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 PyTypeObject *type;
867 PyObject **p;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000868 if (*format == '!') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 type = va_arg(*p_va, PyTypeObject*);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000870 p = va_arg(*p_va, PyObject **);
871 format++;
872 if (arg->ob_type == type)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000873 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000874 else
875 return type->tp_name;
876
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000877 }
878 else if (*format == '?') {
879 inquiry pred = va_arg(*p_va, inquiry);
Guido van Rossumfccfe891998-05-15 22:04:07 +0000880 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000881 format++;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000882 if ((*pred)(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000883 *p = arg;
Guido van Rossumfccfe891998-05-15 22:04:07 +0000884 else
Guido van Rossum80dc16b2000-05-08 14:02:41 +0000885 return "(unspecified)";
Guido van Rossumfccfe891998-05-15 22:04:07 +0000886
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000887 }
888 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000889 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 Py_PROTO((PyObject *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000891 converter convert = va_arg(*p_va, converter);
892 void *addr = va_arg(*p_va, void *);
893 format++;
894 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000895 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000896 }
897 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898 p = va_arg(*p_va, PyObject **);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000899 *p = arg;
900 }
901 break;
902 }
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000903
904
905 case 'w': /* memory buffer, read-write access */
906 {
907 void **p = va_arg(*p_va, void **);
908 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
909 int count;
910
911 if ( pb == NULL || pb->bf_getwritebuffer == NULL ||
912 pb->bf_getsegcount == NULL )
913 return "read-write buffer";
914 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
915 return "single-segment read-write buffer";
916 if ( (count = pb->bf_getwritebuffer(arg, 0, p)) < 0 )
917 return "(unspecified)";
918 if (*format == '#') {
919 int *q = va_arg(*p_va, int *);
920
921 *q = count;
922 format++;
923 }
924 break;
925 }
926
Guido van Rossumb317f8a1998-10-08 02:21:21 +0000927 case 't': /* 8-bit character buffer, read-only access */
928 {
929 const char **p = va_arg(*p_va, const char **);
930 PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
931 int count;
932
933 if ( *format++ != '#' )
934 return "invalid use of 't' format character";
935 if ( !PyType_HasFeature(
936 arg->ob_type,
937 Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
938 pb == NULL ||
939 pb->bf_getcharbuffer == NULL ||
940 pb->bf_getsegcount == NULL )
941 return "read-only character buffer";
942 if ( (*pb->bf_getsegcount)(arg, NULL) != 1 )
943 return "single-segment read-only buffer";
944 if ( (count = pb->bf_getcharbuffer(arg, 0, p)) < 0 )
945 return "(unspecified)";
946
947 *va_arg(*p_va, int *) = count;
948
949 break;
950 }
951
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000952
953 default:
954 return "impossible<bad format char>";
955
956 }
957
958 *p_format = format;
959 return NULL;
960}
Guido van Rossumaa354651996-08-19 19:32:04 +0000961
962
963/* Support for keyword arguments donated by
964 Geoff Philbrick <philbric@delphi.hks.com> */
965
966#ifdef HAVE_STDARG_PROTOTYPES
967/* VARARGS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968int PyArg_ParseTupleAndKeywords(PyObject *args,
969 PyObject *keywords,
Guido van Rossumaa354651996-08-19 19:32:04 +0000970 char *format,
971 char **kwlist, ...)
972#else
973/* VARARGS */
974int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
975#endif
976{
977 int retval;
978 va_list va;
979#ifdef HAVE_STDARG_PROTOTYPES
980
981 va_start(va, kwlist);
982#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983 PyObject *args;
984 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +0000985 char *format;
986 char **kwlist;
987
988 va_start(va);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000989 args = va_arg(va, PyObject *);
990 keywords = va_arg(va, PyObject *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000991 format = va_arg(va, char *);
992 kwlist = va_arg(va, char **);
993#endif
994 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
995 va_end(va);
996 return retval;
997}
998
999
1000static int
1001vgetargskeywords(args, keywords, format, kwlist, p_va)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001002 PyObject *args;
1003 PyObject *keywords;
Guido van Rossumaa354651996-08-19 19:32:04 +00001004 char *format;
1005 char **kwlist;
1006 va_list *p_va;
1007{
1008 char msgbuf[256];
1009 int levels[32];
1010 char *fname = NULL;
1011 char *message = NULL;
1012 int min = -1;
1013 int max = 0;
Guido van Rossumaa354651996-08-19 19:32:04 +00001014 char *formatsave = format;
1015 int i, len, tplen, kwlen;
1016 char *msg, *ks, **p;
1017 int nkwds, pos, match, converted;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018 PyObject *key, *value;
Guido van Rossumaa354651996-08-19 19:32:04 +00001019
1020 /* nested tuples cannot be parsed when using keyword arguments */
1021
1022 for (;;) {
1023 int c = *format++;
1024 if (c == '(') {
1025 PyErr_SetString(PyExc_SystemError,
1026 "tuple found in format when using keyword arguments");
1027 return 0;
1028 }
1029 else if (c == '\0')
1030 break;
1031 else if (c == ':') {
1032 fname = format;
1033 break;
1034 }
1035 else if (c == ';') {
1036 message = format;
1037 break;
1038 }
1039 else if (isalpha(c))
1040 max++;
1041 else if (c == '|')
1042 min = max;
1043 }
1044
1045 if (min < 0)
1046 min = max;
1047
1048 format = formatsave;
1049
1050 if (!PyTuple_Check(args)) {
1051 PyErr_SetString(PyExc_SystemError,
1052 "new style getargs format but argument is not a tuple");
1053 return 0;
1054 }
1055
1056 tplen = PyTuple_Size(args);
1057
1058 /* do a cursory check of the keywords just to see how many we got */
1059
1060 if (keywords) {
1061 if (!PyDict_Check(keywords)) {
1062 PyErr_SetString(PyExc_SystemError,
1063 "non-dictionary object received when keyword dictionary expected");
1064 return 0;
1065 }
1066 kwlen = PyDict_Size(keywords);
1067 }
1068 else {
1069 kwlen = 0;
1070 }
1071
1072 /* make sure there are no duplicate values for an argument;
1073 its not clear when to use the term "keyword argument vs.
1074 keyword parameter in messages */
1075
1076 if (keywords) {
1077 for (i = 0; i < tplen; i++) {
1078 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1079 sprintf(msgbuf,
1080 "keyword parameter %s redefined",
1081 kwlist[i]);
1082 PyErr_SetString(PyExc_TypeError, msgbuf);
1083 return 0;
1084 }
1085 }
1086 }
1087 PyErr_Clear(); /* I'm not which Py functions set the error string */
1088
1089 /* required arguments missing from args can be supplied by keyword
1090 arguments */
1091
1092 len = tplen;
1093 if (keywords && tplen < min) {
1094 for (i = tplen; i < min; i++) {
1095 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
1096 len++;
1097 }
1098 }
1099 }
1100 PyErr_Clear();
1101
1102 /* make sure we got an acceptable number of arguments; the message
1103 is a little confusing with keywords since keyword arguments
1104 which are supplied, but don't match the required arguments
1105 are not included in the "%d given" part of the message */
1106
1107 if (len < min || max < len) {
1108 if (message == NULL) {
1109 sprintf(msgbuf,
1110 "%s requires %s %d argument%s; %d given",
1111 fname==NULL ? "function" : fname,
1112 min==max ? "exactly"
1113 : len < min ? "at least" : "at most",
1114 len < min ? min : max,
1115 (len < min ? min : max) == 1 ? "" : "s",
1116 len);
1117 message = msgbuf;
1118 }
1119 PyErr_SetString(PyExc_TypeError, message);
1120 return 0;
1121 }
1122
1123 for (i = 0; i < tplen; i++) {
1124 if (*format == '|')
1125 format++;
1126 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
1127 levels, msgbuf);
1128 if (msg) {
1129 seterror(i+1, msg, levels, fname, message);
1130 return 0;
1131 }
1132 }
1133
1134 /* handle no keyword parameters in call */
1135
1136 if (!keywords) return 1;
1137
1138 /* make sure the number of keywords in the keyword list matches the
1139 number of items in the format string */
1140
1141 nkwds = 0;
1142 p = kwlist;
1143 for (;;) {
1144 if (!*(p++)) break;
1145 nkwds++;
1146 }
1147
1148 if (nkwds != max) {
1149 PyErr_SetString(PyExc_SystemError,
1150 "number of items in format string and keyword list do not match");
1151 return 0;
1152 }
1153
1154 /* convert the keyword arguments; this uses the format
1155 string where it was left after processing args */
1156
1157 converted = 0;
1158 for (i = tplen; i < nkwds; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 PyObject *item;
Guido van Rossumaa354651996-08-19 19:32:04 +00001160 if (*format == '|')
1161 format++;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001162 item = PyMapping_GetItemString(keywords, kwlist[i]);
1163 if (item != NULL) {
Guido van Rossumaa354651996-08-19 19:32:04 +00001164 msg = convertitem(item, &format, p_va, levels, msgbuf);
1165 if (msg) {
1166 seterror(i+1, msg, levels, fname, message);
1167 return 0;
1168 }
1169 converted++;
1170 }
1171 else {
1172 PyErr_Clear();
1173 msg = skipitem(&format, p_va);
1174 if (msg) {
1175 seterror(i+1, msg, levels, fname, message);
1176 return 0;
1177 }
1178 }
1179 }
1180
1181 /* make sure there are no extraneous keyword arguments */
1182
1183 pos = 0;
1184 if (converted < kwlen) {
1185 while (PyDict_Next(keywords, &pos, &key, &value)) {
1186 match = 0;
1187 ks = PyString_AsString(key);
1188 for (i = 0; i < nkwds; i++) {
1189 if (!strcmp(ks, kwlist[i])) {
1190 match = 1;
1191 break;
1192 }
1193 }
1194 if (!match) {
1195 sprintf(msgbuf,
Guido van Rossum80dc16b2000-05-08 14:02:41 +00001196 "%s is an invalid keyword argument for this function",
Guido van Rossumaa354651996-08-19 19:32:04 +00001197 ks);
1198 PyErr_SetString(PyExc_TypeError, msgbuf);
1199 return 0;
1200 }
1201 }
1202 }
1203
1204 return 1;
1205}
1206
1207
1208static char *
1209skipitem(p_format, p_va)
1210 char **p_format;
1211 va_list *p_va;
1212{
1213 char *format = *p_format;
1214 char c = *format++;
1215
1216 switch (c) {
1217
1218 case 'b': /* byte -- very short int */
1219 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001220 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001221 break;
1222 }
1223
1224 case 'h': /* short int */
1225 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001226 (void) va_arg(*p_va, short *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001227 break;
1228 }
1229
Jack Jansend50338f2000-07-06 12:22:00 +00001230 case 'H': /* unsigned short int */
1231 {
1232 (void) va_arg(*p_va, unsigned short *);
1233 break;
1234 }
1235
Guido van Rossumaa354651996-08-19 19:32:04 +00001236 case 'i': /* int */
1237 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001238 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001239 break;
1240 }
1241
1242 case 'l': /* long int */
1243 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001244 (void) va_arg(*p_va, long *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001245 break;
1246 }
1247
Guido van Rossum3dbba6e1999-01-25 21:48:56 +00001248#ifdef HAVE_LONG_LONG
Guido van Rossum3293b071998-08-25 16:07:15 +00001249 case 'L': /* LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001250 {
Guido van Rossum3293b071998-08-25 16:07:15 +00001251 (void) va_arg(*p_va, LONG_LONG *);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001252 break;
1253 }
1254#endif
1255
Guido van Rossumaa354651996-08-19 19:32:04 +00001256 case 'f': /* float */
1257 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001258 (void) va_arg(*p_va, float *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001259 break;
1260 }
1261
1262 case 'd': /* double */
1263 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001264 (void) va_arg(*p_va, double *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001265 break;
1266 }
1267
1268#ifndef WITHOUT_COMPLEX
1269 case 'D': /* complex double */
1270 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001271 (void) va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001272 break;
1273 }
1274#endif /* WITHOUT_COMPLEX */
1275
1276 case 'c': /* char */
1277 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001278 (void) va_arg(*p_va, char *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001279 break;
1280 }
1281
1282 case 's': /* string */
1283 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001284 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001285 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001286 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001287 format++;
1288 }
1289 break;
1290 }
1291
1292 case 'z': /* string */
1293 {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001294 (void) va_arg(*p_va, char **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001295 if (*format == '#') {
Guido van Rossum80bb9651996-12-05 23:27:02 +00001296 (void) va_arg(*p_va, int *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001297 format++;
1298 }
1299 break;
1300 }
1301
1302 case 'S': /* string object */
1303 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001305 break;
1306 }
1307
1308 case 'O': /* object */
1309 {
Guido van Rossumaa354651996-08-19 19:32:04 +00001310 if (*format == '!') {
1311 format++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001312 (void) va_arg(*p_va, PyTypeObject*);
1313 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001314 }
1315#if 0
1316/* I don't know what this is for */
1317 else if (*format == '?') {
1318 inquiry pred = va_arg(*p_va, inquiry);
1319 format++;
1320 if ((*pred)(arg)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001321 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001322 }
1323 }
1324#endif
1325 else if (*format == '&') {
1326 typedef int (*converter)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 Py_PROTO((PyObject *, void *));
Guido van Rossum80bb9651996-12-05 23:27:02 +00001328 (void) va_arg(*p_va, converter);
1329 (void) va_arg(*p_va, void *);
Guido van Rossumaa354651996-08-19 19:32:04 +00001330 format++;
1331 }
1332 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001333 (void) va_arg(*p_va, PyObject **);
Guido van Rossumaa354651996-08-19 19:32:04 +00001334 }
1335 break;
1336 }
1337
1338 default:
1339 return "impossible<bad format char>";
1340
1341 }
1342
1343 *p_format = format;
1344 return NULL;
1345}