blob: f765a7c4466249a2256ae50b08dff1221bfcb158 [file] [log] [blame]
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumfe3f1a21994-09-29 09:42:55 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* New getargs implementation */
26
27/* XXX There are several unchecked sprintf or strcat calls in this file.
28 XXX The only way these can become a danger is if some C code in the
29 XXX Python source (or in an extension) uses ridiculously long names
30 XXX or riduculously deep nesting in format strings. */
31
32#include "allobjects.h"
33
Guido van Rossumc1d50531996-08-21 23:38:24 +000034#include <ctype.h>
35
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000036
37int getargs PROTO((object *, char *, ...));
38int newgetargs PROTO((object *, char *, ...));
39int vgetargs PROTO((object *, char *, va_list));
40
Guido van Rossumaa354651996-08-19 19:32:04 +000041int PyArg_ParseTupleAndKeywords PROTO((object *, object *,
42 char *, char **, ...));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000043
44/* Forward */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045static int vgetargs1 PROTO((object *, char *, va_list *, int));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000046static void seterror PROTO((int, char *, int *, char *, char *));
47static char *convertitem PROTO((object *, char **, va_list *, int *, char *));
48static char *converttuple PROTO((object *, char **, va_list *,
49 int *, char *, int));
50static char *convertsimple PROTO((object *, char **, va_list *, char *));
51static char *convertsimple1 PROTO((object *, char **, va_list *));
52
Guido van Rossumaa354651996-08-19 19:32:04 +000053static int vgetargskeywords PROTO((object *, object *,
54 char *, char **, va_list *));
55static char *skipitem PROTO((char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000056
57#ifdef HAVE_STDARG_PROTOTYPES
58/* VARARGS2 */
59int getargs(object *args, char *format, ...)
60#else
61/* VARARGS */
62int getargs(va_alist) va_dcl
63#endif
64{
65 int retval;
66 va_list va;
67#ifdef HAVE_STDARG_PROTOTYPES
68
69 va_start(va, format);
70#else
71 object *args;
72 char *format;
73
74 va_start(va);
75 args = va_arg(va, object *);
76 format = va_arg(va, char *);
77#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000078 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000079 va_end(va);
80 return retval;
81}
82
83
84#ifdef HAVE_STDARG_PROTOTYPES
85/* VARARGS2 */
86int newgetargs(object *args, char *format, ...)
87#else
88/* VARARGS */
89int newgetargs(va_alist) va_dcl
90#endif
91{
92 int retval;
93 va_list va;
94#ifdef HAVE_STDARG_PROTOTYPES
95
96 va_start(va, format);
97#else
98 object *args;
99 char *format;
100
101 va_start(va);
102 args = va_arg(va, object *);
103 format = va_arg(va, char *);
104#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000105 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000106 va_end(va);
107 return retval;
108}
109
110
111int
112vgetargs(args, format, va)
113 object *args;
114 char *format;
115 va_list va;
116{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000117 va_list lva;
118
119#ifdef VA_LIST_IS_ARRAY
120 memcpy(lva, va, sizeof(va_list));
121#else
122 lva = va;
123#endif
124
125 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000126}
127
128
129static int
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000130vgetargs1(args, format, p_va, compat)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000131 object *args;
132 char *format;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000133 va_list *p_va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000134 int compat;
135{
136 char msgbuf[256];
137 int levels[32];
138 char *fname = NULL;
139 char *message = NULL;
140 int min = -1;
141 int max = 0;
142 int level = 0;
143 char *formatsave = format;
144 int i, len;
145 char *msg;
146
147 for (;;) {
148 int c = *format++;
149 if (c == '(' /* ')' */) {
150 if (level == 0)
151 max++;
152 level++;
153 }
154 else if (/* '(' */ c == ')') {
155 if (level == 0)
156 fatal(/* '(' */
157 "excess ')' in getargs format");
158 else
159 level--;
160 }
161 else if (c == '\0')
162 break;
163 else if (c == ':') {
164 fname = format;
165 break;
166 }
167 else if (c == ';') {
168 message = format;
169 break;
170 }
171 else if (level != 0)
172 ; /* Pass */
173 else if (isalpha(c))
174 max++;
175 else if (c == '|')
176 min = max;
177 }
178
179 if (level != 0)
180 fatal(/* '(' */ "missing ')' in getargs format");
181
182 if (min < 0)
183 min = max;
184
185 format = formatsave;
186
187 if (compat) {
188 if (max == 0) {
189 if (args == NULL)
190 return 1;
191 sprintf(msgbuf, "%s requires no arguments",
192 fname==NULL ? "function" : fname);
193 err_setstr(TypeError, msgbuf);
194 return 0;
195 }
196 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000197 if (args == NULL) {
198 sprintf(msgbuf,
199 "%s requires at least one argument",
200 fname==NULL ? "function" : fname);
201 err_setstr(TypeError, msgbuf);
202 return 0;
203 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000204 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000205 if (msg == NULL)
206 return 1;
207 seterror(levels[0], msg, levels+1, fname, message);
208 return 0;
209 }
210 else {
211 err_setstr(SystemError,
212 "old style getargs format uses new features");
213 return 0;
214 }
215 }
216
217 if (!is_tupleobject(args)) {
218 err_setstr(SystemError,
219 "new style getargs format but argument is not a tuple");
220 return 0;
221 }
222
223 len = gettuplesize(args);
224
225 if (len < min || max < len) {
226 if (message == NULL) {
227 sprintf(msgbuf,
228 "%s requires %s %d argument%s; %d given",
229 fname==NULL ? "function" : fname,
230 min==max ? "exactly"
231 : len < min ? "at least" : "at most",
232 len < min ? min : max,
233 (len < min ? min : max) == 1 ? "" : "s",
234 len);
235 message = msgbuf;
236 }
237 err_setstr(TypeError, message);
238 return 0;
239 }
240
241 for (i = 0; i < len; i++) {
242 if (*format == '|')
243 format++;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000244 msg = convertitem(gettupleitem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000245 levels, msgbuf);
246 if (msg) {
247 seterror(i+1, msg, levels, fname, message);
248 return 0;
249 }
250 }
251
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 Rossum64fc6491995-01-21 14:09:37 +0000269 if (err_occurred())
270 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 }
289 err_setstr(TypeError, message);
290}
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)
314 object *arg;
315 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
344 if (!is_tupleobject(arg)) {
345 levels[0] = 0;
346 sprintf(msgbuf,
347 toplevel ? "%d arguments, %s" : "%d-tuple, %s",
348 n, arg == None ? "None" : arg->ob_type->tp_name);
349 return msgbuf;
350 }
351
352 if ((i = gettuplesize(arg)) != n) {
353 levels[0] = 0;
354 sprintf(msgbuf,
355 toplevel ? "%d arguments, %d" : "%d-tuple, %d-tuple",
356 n, i);
357 return msgbuf;
358 }
359
360 format = *p_format;
361 for (i = 0; i < n; i++) {
362 char *msg;
363 msg = convertitem(gettupleitem(arg, i), &format, p_va,
364 levels+1, msgbuf);
365 if (msg != NULL) {
366 levels[0] = i+1;
367 return msg;
368 }
369 }
370
371 *p_format = format;
372 return NULL;
373}
374
375
376/* Convert a single item. */
377
378static char *
379convertitem(arg, p_format, p_va, levels, msgbuf)
380 object *arg;
381 char **p_format;
382 va_list *p_va;
383 int *levels;
384 char *msgbuf;
385{
386 char *msg;
387 char *format = *p_format;
388
389 if (*format == '(' /* ')' */) {
390 format++;
391 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
392 if (msg == NULL)
393 format++;
394 }
395 else {
396 msg = convertsimple(arg, &format, p_va, msgbuf);
397 if (msg != NULL)
398 levels[0] = 0;
399 }
400 if (msg == NULL)
401 *p_format = format;
402 return msg;
403}
404
405
406/* Convert a non-tuple argument. Adds to convertsimple1 functionality
407 by appending ", <actual argument type>" to error message. */
408
409static char *
410convertsimple(arg, p_format, p_va, msgbuf)
411 object *arg;
412 char **p_format;
413 va_list *p_va;
414 char *msgbuf;
415{
416 char *msg = convertsimple1(arg, p_format, p_va);
417 if (msg != NULL) {
418 sprintf(msgbuf, "%.50s, %.50s", msg,
419 arg == None ? "None" : arg->ob_type->tp_name);
420 msg = msgbuf;
421 }
422 return msg;
423}
424
425
426/* Convert a non-tuple argument. Return NULL if conversion went OK,
427 or a string representing the expected type if the conversion failed.
428 When failing, an exception may or may not have been raised.
429 Don't call if a tuple is expected. */
430
431static char *
432convertsimple1(arg, p_format, p_va)
433 object *arg;
434 char **p_format;
435 va_list *p_va;
436{
437 char *format = *p_format;
438 char c = *format++;
439
440 switch (c) {
441
442 case 'b': /* byte -- very short int */
443 {
444 char *p = va_arg(*p_va, char *);
445 long ival = getintvalue(arg);
446 if (ival == -1 && err_occurred())
447 return "integer<b>";
448 else
449 *p = ival;
450 break;
451 }
452
453 case 'h': /* short int */
454 {
455 short *p = va_arg(*p_va, short *);
456 long ival = getintvalue(arg);
457 if (ival == -1 && err_occurred())
458 return "integer<h>";
459 else
460 *p = ival;
461 break;
462 }
463
464 case 'i': /* int */
465 {
466 int *p = va_arg(*p_va, int *);
467 long ival = getintvalue(arg);
468 if (ival == -1 && err_occurred())
469 return "integer<i>";
470 else
471 *p = ival;
472 break;
473 }
474
475 case 'l': /* long int */
476 {
477 long *p = va_arg(*p_va, long *);
478 long ival = getintvalue(arg);
479 if (ival == -1 && err_occurred())
480 return "integer<l>";
481 else
482 *p = ival;
483 break;
484 }
485
486 case 'f': /* float */
487 {
488 float *p = va_arg(*p_va, float *);
489 double dval = getfloatvalue(arg);
490 if (err_occurred())
491 return "float<f>";
492 else
493 *p = dval;
494 break;
495 }
496
497 case 'd': /* double */
498 {
499 double *p = va_arg(*p_va, double *);
500 double dval = getfloatvalue(arg);
501 if (err_occurred())
502 return "float<d>";
503 else
504 *p = dval;
505 break;
506 }
507
Guido van Rossum530956d1996-07-21 02:27:43 +0000508#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000509 case 'D': /* complex double */
510 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000511 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000512 Py_complex cval;
513 cval = PyComplex_AsCComplex(arg);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000514 if (err_occurred())
515 return "complex<D>";
516 else
517 *p = cval;
518 break;
519 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000520#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000521
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000522 case 'c': /* char */
523 {
524 char *p = va_arg(*p_va, char *);
525 if (is_stringobject(arg) && getstringsize(arg) == 1)
526 *p = getstringvalue(arg)[0];
527 else
528 return "char";
529 break;
530 }
531
532 case 's': /* string */
533 {
534 char **p = va_arg(*p_va, char **);
535 if (is_stringobject(arg))
536 *p = getstringvalue(arg);
537 else
538 return "string";
539 if (*format == '#') {
540 int *q = va_arg(*p_va, int *);
541 *q = getstringsize(arg);
542 format++;
543 }
544 else if (strlen(*p) != getstringsize(arg))
545 return "string without null bytes";
546 break;
547 }
548
549 case 'z': /* string, may be NULL (None) */
550 {
551 char **p = va_arg(*p_va, char **);
552 if (arg == None)
553 *p = 0;
554 else if (is_stringobject(arg))
555 *p = getstringvalue(arg);
556 else
557 return "None or string";
558 if (*format == '#') {
559 int *q = va_arg(*p_va, int *);
560 if (arg == None)
561 *q = 0;
562 else
563 *q = getstringsize(arg);
564 format++;
565 }
Guido van Rossumaa354651996-08-19 19:32:04 +0000566 else if (*p != NULL &&
567 strlen(*p) != getstringsize(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000568 return "None or string without null bytes";
569 break;
570 }
571
572 case 'S': /* string object */
573 {
574 object **p = va_arg(*p_va, object **);
575 if (is_stringobject(arg))
576 *p = arg;
577 else
578 return "string";
579 break;
580 }
581
582 case 'O': /* object */
583 {
584 typeobject *type;
585 object **p;
586 if (*format == '!') {
587 format++;
588 type = va_arg(*p_va, typeobject*);
589 if (arg->ob_type != type)
590 return type->tp_name;
591 else {
592 p = va_arg(*p_va, object **);
593 *p = arg;
594 }
595 }
596 else if (*format == '?') {
597 inquiry pred = va_arg(*p_va, inquiry);
598 format++;
599 if ((*pred)(arg)) {
600 p = va_arg(*p_va, object **);
601 *p = arg;
602 }
603 }
604 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000605 typedef int (*converter)
606 PROTO((object *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000607 converter convert = va_arg(*p_va, converter);
608 void *addr = va_arg(*p_va, void *);
609 format++;
610 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000611 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000612 }
613 else {
614 p = va_arg(*p_va, object **);
615 *p = arg;
616 }
617 break;
618 }
619
620 default:
621 return "impossible<bad format char>";
622
623 }
624
625 *p_format = format;
626 return NULL;
627}
Guido van Rossumaa354651996-08-19 19:32:04 +0000628
629
630/* Support for keyword arguments donated by
631 Geoff Philbrick <philbric@delphi.hks.com> */
632
633#ifdef HAVE_STDARG_PROTOTYPES
634/* VARARGS2 */
635int PyArg_ParseTupleAndKeywords(object *args,
636 object *keywords,
637 char *format,
638 char **kwlist, ...)
639#else
640/* VARARGS */
641int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
642#endif
643{
644 int retval;
645 va_list va;
646#ifdef HAVE_STDARG_PROTOTYPES
647
648 va_start(va, kwlist);
649#else
650 object *args;
651 object *keywords;
652 char *format;
653 char **kwlist;
654
655 va_start(va);
656 args = va_arg(va, object *);
657 keywords = va_arg(va, object *);
658 format = va_arg(va, char *);
659 kwlist = va_arg(va, char **);
660#endif
661 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
662 va_end(va);
663 return retval;
664}
665
666
667static int
668vgetargskeywords(args, keywords, format, kwlist, p_va)
669 object *args;
670 object *keywords;
671 char *format;
672 char **kwlist;
673 va_list *p_va;
674{
675 char msgbuf[256];
676 int levels[32];
677 char *fname = NULL;
678 char *message = NULL;
679 int min = -1;
680 int max = 0;
681 int level = 0;
682 char *formatsave = format;
683 int i, len, tplen, kwlen;
684 char *msg, *ks, **p;
685 int nkwds, pos, match, converted;
686 object *key, *value, *item;
687
688 /* nested tuples cannot be parsed when using keyword arguments */
689
690 for (;;) {
691 int c = *format++;
692 if (c == '(') {
693 PyErr_SetString(PyExc_SystemError,
694 "tuple found in format when using keyword arguments");
695 return 0;
696 }
697 else if (c == '\0')
698 break;
699 else if (c == ':') {
700 fname = format;
701 break;
702 }
703 else if (c == ';') {
704 message = format;
705 break;
706 }
707 else if (isalpha(c))
708 max++;
709 else if (c == '|')
710 min = max;
711 }
712
713 if (min < 0)
714 min = max;
715
716 format = formatsave;
717
718 if (!PyTuple_Check(args)) {
719 PyErr_SetString(PyExc_SystemError,
720 "new style getargs format but argument is not a tuple");
721 return 0;
722 }
723
724 tplen = PyTuple_Size(args);
725
726 /* do a cursory check of the keywords just to see how many we got */
727
728 if (keywords) {
729 if (!PyDict_Check(keywords)) {
730 PyErr_SetString(PyExc_SystemError,
731 "non-dictionary object received when keyword dictionary expected");
732 return 0;
733 }
734 kwlen = PyDict_Size(keywords);
735 }
736 else {
737 kwlen = 0;
738 }
739
740 /* make sure there are no duplicate values for an argument;
741 its not clear when to use the term "keyword argument vs.
742 keyword parameter in messages */
743
744 if (keywords) {
745 for (i = 0; i < tplen; i++) {
746 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
747 sprintf(msgbuf,
748 "keyword parameter %s redefined",
749 kwlist[i]);
750 PyErr_SetString(PyExc_TypeError, msgbuf);
751 return 0;
752 }
753 }
754 }
755 PyErr_Clear(); /* I'm not which Py functions set the error string */
756
757 /* required arguments missing from args can be supplied by keyword
758 arguments */
759
760 len = tplen;
761 if (keywords && tplen < min) {
762 for (i = tplen; i < min; i++) {
763 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
764 len++;
765 }
766 }
767 }
768 PyErr_Clear();
769
770 /* make sure we got an acceptable number of arguments; the message
771 is a little confusing with keywords since keyword arguments
772 which are supplied, but don't match the required arguments
773 are not included in the "%d given" part of the message */
774
775 if (len < min || max < len) {
776 if (message == NULL) {
777 sprintf(msgbuf,
778 "%s requires %s %d argument%s; %d given",
779 fname==NULL ? "function" : fname,
780 min==max ? "exactly"
781 : len < min ? "at least" : "at most",
782 len < min ? min : max,
783 (len < min ? min : max) == 1 ? "" : "s",
784 len);
785 message = msgbuf;
786 }
787 PyErr_SetString(PyExc_TypeError, message);
788 return 0;
789 }
790
791 for (i = 0; i < tplen; i++) {
792 if (*format == '|')
793 format++;
794 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
795 levels, msgbuf);
796 if (msg) {
797 seterror(i+1, msg, levels, fname, message);
798 return 0;
799 }
800 }
801
802 /* handle no keyword parameters in call */
803
804 if (!keywords) return 1;
805
806 /* make sure the number of keywords in the keyword list matches the
807 number of items in the format string */
808
809 nkwds = 0;
810 p = kwlist;
811 for (;;) {
812 if (!*(p++)) break;
813 nkwds++;
814 }
815
816 if (nkwds != max) {
817 PyErr_SetString(PyExc_SystemError,
818 "number of items in format string and keyword list do not match");
819 return 0;
820 }
821
822 /* convert the keyword arguments; this uses the format
823 string where it was left after processing args */
824
825 converted = 0;
826 for (i = tplen; i < nkwds; i++) {
827 if (*format == '|')
828 format++;
829 if (item = PyMapping_GetItemString(keywords, kwlist[i])) {
830 msg = convertitem(item, &format, p_va, levels, msgbuf);
831 if (msg) {
832 seterror(i+1, msg, levels, fname, message);
833 return 0;
834 }
835 converted++;
836 }
837 else {
838 PyErr_Clear();
839 msg = skipitem(&format, p_va);
840 if (msg) {
841 seterror(i+1, msg, levels, fname, message);
842 return 0;
843 }
844 }
845 }
846
847 /* make sure there are no extraneous keyword arguments */
848
849 pos = 0;
850 if (converted < kwlen) {
851 while (PyDict_Next(keywords, &pos, &key, &value)) {
852 match = 0;
853 ks = PyString_AsString(key);
854 for (i = 0; i < nkwds; i++) {
855 if (!strcmp(ks, kwlist[i])) {
856 match = 1;
857 break;
858 }
859 }
860 if (!match) {
861 sprintf(msgbuf,
862 "%s is an invalid keyword argument for this function",
863 ks);
864 PyErr_SetString(PyExc_TypeError, msgbuf);
865 return 0;
866 }
867 }
868 }
869
870 return 1;
871}
872
873
874static char *
875skipitem(p_format, p_va)
876 char **p_format;
877 va_list *p_va;
878{
879 char *format = *p_format;
880 char c = *format++;
881
882 switch (c) {
883
884 case 'b': /* byte -- very short int */
885 {
886 va_arg(*p_va, char *);
887 break;
888 }
889
890 case 'h': /* short int */
891 {
892 va_arg(*p_va, short *);
893 break;
894 }
895
896 case 'i': /* int */
897 {
898 va_arg(*p_va, int *);
899 break;
900 }
901
902 case 'l': /* long int */
903 {
904 va_arg(*p_va, long *);
905 break;
906 }
907
908 case 'f': /* float */
909 {
910 va_arg(*p_va, float *);
911 break;
912 }
913
914 case 'd': /* double */
915 {
916 va_arg(*p_va, double *);
917 break;
918 }
919
920#ifndef WITHOUT_COMPLEX
921 case 'D': /* complex double */
922 {
923 va_arg(*p_va, Py_complex *);
924 break;
925 }
926#endif /* WITHOUT_COMPLEX */
927
928 case 'c': /* char */
929 {
930 va_arg(*p_va, char *);
931 break;
932 }
933
934 case 's': /* string */
935 {
936 va_arg(*p_va, char **);
937 if (*format == '#') {
938 va_arg(*p_va, int *);
939 format++;
940 }
941 break;
942 }
943
944 case 'z': /* string */
945 {
946 va_arg(*p_va, char **);
947 if (*format == '#') {
948 va_arg(*p_va, int *);
949 format++;
950 }
951 break;
952 }
953
954 case 'S': /* string object */
955 {
956 va_arg(*p_va, object **);
957 break;
958 }
959
960 case 'O': /* object */
961 {
962 typeobject *type;
963 object **p;
964 if (*format == '!') {
965 format++;
966 va_arg(*p_va, typeobject*);
967 va_arg(*p_va, object **);
968 }
969#if 0
970/* I don't know what this is for */
971 else if (*format == '?') {
972 inquiry pred = va_arg(*p_va, inquiry);
973 format++;
974 if ((*pred)(arg)) {
975 va_arg(*p_va, object **);
976 }
977 }
978#endif
979 else if (*format == '&') {
980 typedef int (*converter)
981 PROTO((object *, void *));
982 va_arg(*p_va, converter);
983 va_arg(*p_va, void *);
984 format++;
985 }
986 else {
987 va_arg(*p_va, object **);
988 }
989 break;
990 }
991
992 default:
993 return "impossible<bad format char>";
994
995 }
996
997 *p_format = format;
998 return NULL;
999}