blob: 8723423a814cb35224628028bdce52b90396108a [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
34
35int getargs PROTO((object *, char *, ...));
36int newgetargs PROTO((object *, char *, ...));
37int vgetargs PROTO((object *, char *, va_list));
38
Guido van Rossumaa354651996-08-19 19:32:04 +000039int PyArg_ParseTupleAndKeywords PROTO((object *, object *,
40 char *, char **, ...));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000041
42/* Forward */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043static int vgetargs1 PROTO((object *, char *, va_list *, int));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000044static void seterror PROTO((int, char *, int *, char *, char *));
45static char *convertitem PROTO((object *, char **, va_list *, int *, char *));
46static char *converttuple PROTO((object *, char **, va_list *,
47 int *, char *, int));
48static char *convertsimple PROTO((object *, char **, va_list *, char *));
49static char *convertsimple1 PROTO((object *, char **, va_list *));
50
Guido van Rossumaa354651996-08-19 19:32:04 +000051static int vgetargskeywords PROTO((object *, object *,
52 char *, char **, va_list *));
53static char *skipitem PROTO((char **, va_list *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000054
55#ifdef HAVE_STDARG_PROTOTYPES
56/* VARARGS2 */
57int getargs(object *args, char *format, ...)
58#else
59/* VARARGS */
60int getargs(va_alist) va_dcl
61#endif
62{
63 int retval;
64 va_list va;
65#ifdef HAVE_STDARG_PROTOTYPES
66
67 va_start(va, format);
68#else
69 object *args;
70 char *format;
71
72 va_start(va);
73 args = va_arg(va, object *);
74 format = va_arg(va, char *);
75#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +000076 retval = vgetargs1(args, format, &va, 1);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +000077 va_end(va);
78 return retval;
79}
80
81
82#ifdef HAVE_STDARG_PROTOTYPES
83/* VARARGS2 */
84int newgetargs(object *args, char *format, ...)
85#else
86/* VARARGS */
87int newgetargs(va_alist) va_dcl
88#endif
89{
90 int retval;
91 va_list va;
92#ifdef HAVE_STDARG_PROTOTYPES
93
94 va_start(va, format);
95#else
96 object *args;
97 char *format;
98
99 va_start(va);
100 args = va_arg(va, object *);
101 format = va_arg(va, char *);
102#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000103 retval = vgetargs1(args, format, &va, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000104 va_end(va);
105 return retval;
106}
107
108
109int
110vgetargs(args, format, va)
111 object *args;
112 char *format;
113 va_list va;
114{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000115 va_list lva;
116
117#ifdef VA_LIST_IS_ARRAY
118 memcpy(lva, va, sizeof(va_list));
119#else
120 lva = va;
121#endif
122
123 return vgetargs1(args, format, &lva, 0);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000124}
125
126
127static int
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000128vgetargs1(args, format, p_va, compat)
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000129 object *args;
130 char *format;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000131 va_list *p_va;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000132 int compat;
133{
134 char msgbuf[256];
135 int levels[32];
136 char *fname = NULL;
137 char *message = NULL;
138 int min = -1;
139 int max = 0;
140 int level = 0;
141 char *formatsave = format;
142 int i, len;
143 char *msg;
144
145 for (;;) {
146 int c = *format++;
147 if (c == '(' /* ')' */) {
148 if (level == 0)
149 max++;
150 level++;
151 }
152 else if (/* '(' */ c == ')') {
153 if (level == 0)
154 fatal(/* '(' */
155 "excess ')' in getargs format");
156 else
157 level--;
158 }
159 else if (c == '\0')
160 break;
161 else if (c == ':') {
162 fname = format;
163 break;
164 }
165 else if (c == ';') {
166 message = format;
167 break;
168 }
169 else if (level != 0)
170 ; /* Pass */
171 else if (isalpha(c))
172 max++;
173 else if (c == '|')
174 min = max;
175 }
176
177 if (level != 0)
178 fatal(/* '(' */ "missing ')' in getargs format");
179
180 if (min < 0)
181 min = max;
182
183 format = formatsave;
184
185 if (compat) {
186 if (max == 0) {
187 if (args == NULL)
188 return 1;
189 sprintf(msgbuf, "%s requires no arguments",
190 fname==NULL ? "function" : fname);
191 err_setstr(TypeError, msgbuf);
192 return 0;
193 }
194 else if (min == 1 && max == 1) {
Guido van Rossum13d0ed11994-11-10 22:35:48 +0000195 if (args == NULL) {
196 sprintf(msgbuf,
197 "%s requires at least one argument",
198 fname==NULL ? "function" : fname);
199 err_setstr(TypeError, msgbuf);
200 return 0;
201 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000202 msg = convertitem(args, &format, p_va, levels, msgbuf);
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000203 if (msg == NULL)
204 return 1;
205 seterror(levels[0], msg, levels+1, fname, message);
206 return 0;
207 }
208 else {
209 err_setstr(SystemError,
210 "old style getargs format uses new features");
211 return 0;
212 }
213 }
214
215 if (!is_tupleobject(args)) {
216 err_setstr(SystemError,
217 "new style getargs format but argument is not a tuple");
218 return 0;
219 }
220
221 len = gettuplesize(args);
222
223 if (len < min || max < len) {
224 if (message == NULL) {
225 sprintf(msgbuf,
226 "%s requires %s %d argument%s; %d given",
227 fname==NULL ? "function" : fname,
228 min==max ? "exactly"
229 : len < min ? "at least" : "at most",
230 len < min ? min : max,
231 (len < min ? min : max) == 1 ? "" : "s",
232 len);
233 message = msgbuf;
234 }
235 err_setstr(TypeError, message);
236 return 0;
237 }
238
239 for (i = 0; i < len; i++) {
240 if (*format == '|')
241 format++;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000242 msg = convertitem(gettupleitem(args, i), &format, p_va,
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000243 levels, msgbuf);
244 if (msg) {
245 seterror(i+1, msg, levels, fname, message);
246 return 0;
247 }
248 }
249
250 return 1;
251}
252
253
254
255static void
256seterror(iarg, msg, levels, fname, message)
257 int iarg;
258 char *msg;
259 int *levels;
260 char *fname;
261 char *message;
262{
263 char buf[256];
264 int i;
265 char *p = buf;
266
Guido van Rossum64fc6491995-01-21 14:09:37 +0000267 if (err_occurred())
268 return;
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000269 if (iarg == 0 && message == NULL)
270 message = msg;
271 else if (message == NULL) {
272 if (fname != NULL) {
273 sprintf(p, "%s, ", fname);
274 p += strlen(p);
275 }
276 sprintf(p, "argument %d", iarg);
277 i = 0;
278 p += strlen(p);
279 while (levels[i] > 0) {
280 sprintf(p, ", item %d", levels[i]-1);
281 p += strlen(p);
282 i++;
283 }
284 sprintf(p, ": expected %s found", msg);
285 message = buf;
286 }
287 err_setstr(TypeError, message);
288}
289
290
291/* Convert a tuple argument.
292 On entry, *p_format points to the character _after_ the opening '('.
293 On successful exit, *p_format points to the closing ')'.
294 If successful:
295 *p_format and *p_va are updated,
296 *levels and *msgbuf are untouched,
297 and NULL is returned.
298 If the argument is invalid:
299 *p_format is unchanged,
300 *p_va is undefined,
301 *levels is a 0-terminated list of item numbers,
302 *msgbuf contains an error message, whose format is:
303 "<typename1>, <typename2>", where:
304 <typename1> is the name of the expected type, and
305 <typename2> is the name of the actual type,
306 (so you can surround it by "expected ... found"),
307 and msgbuf is returned.
308*/
309
310static char *
311converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
312 object *arg;
313 char **p_format;
314 va_list *p_va;
315 int *levels;
316 char *msgbuf;
317 int toplevel;
318{
319 int level = 0;
320 int n = 0;
321 char *format = *p_format;
322 int i;
323
324 for (;;) {
325 int c = *format++;
326 if (c == '(') {
327 if (level == 0)
328 n++;
329 level++;
330 }
331 else if (c == ')') {
332 if (level == 0)
333 break;
334 level--;
335 }
336 else if (c == ':' || c == ';' || c == '\0')
337 break;
338 else if (level == 0 && isalpha(c))
339 n++;
340 }
341
342 if (!is_tupleobject(arg)) {
343 levels[0] = 0;
344 sprintf(msgbuf,
345 toplevel ? "%d arguments, %s" : "%d-tuple, %s",
346 n, arg == None ? "None" : arg->ob_type->tp_name);
347 return msgbuf;
348 }
349
350 if ((i = gettuplesize(arg)) != n) {
351 levels[0] = 0;
352 sprintf(msgbuf,
353 toplevel ? "%d arguments, %d" : "%d-tuple, %d-tuple",
354 n, i);
355 return msgbuf;
356 }
357
358 format = *p_format;
359 for (i = 0; i < n; i++) {
360 char *msg;
361 msg = convertitem(gettupleitem(arg, i), &format, p_va,
362 levels+1, msgbuf);
363 if (msg != NULL) {
364 levels[0] = i+1;
365 return msg;
366 }
367 }
368
369 *p_format = format;
370 return NULL;
371}
372
373
374/* Convert a single item. */
375
376static char *
377convertitem(arg, p_format, p_va, levels, msgbuf)
378 object *arg;
379 char **p_format;
380 va_list *p_va;
381 int *levels;
382 char *msgbuf;
383{
384 char *msg;
385 char *format = *p_format;
386
387 if (*format == '(' /* ')' */) {
388 format++;
389 msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
390 if (msg == NULL)
391 format++;
392 }
393 else {
394 msg = convertsimple(arg, &format, p_va, msgbuf);
395 if (msg != NULL)
396 levels[0] = 0;
397 }
398 if (msg == NULL)
399 *p_format = format;
400 return msg;
401}
402
403
404/* Convert a non-tuple argument. Adds to convertsimple1 functionality
405 by appending ", <actual argument type>" to error message. */
406
407static char *
408convertsimple(arg, p_format, p_va, msgbuf)
409 object *arg;
410 char **p_format;
411 va_list *p_va;
412 char *msgbuf;
413{
414 char *msg = convertsimple1(arg, p_format, p_va);
415 if (msg != NULL) {
416 sprintf(msgbuf, "%.50s, %.50s", msg,
417 arg == None ? "None" : arg->ob_type->tp_name);
418 msg = msgbuf;
419 }
420 return msg;
421}
422
423
424/* Convert a non-tuple argument. Return NULL if conversion went OK,
425 or a string representing the expected type if the conversion failed.
426 When failing, an exception may or may not have been raised.
427 Don't call if a tuple is expected. */
428
429static char *
430convertsimple1(arg, p_format, p_va)
431 object *arg;
432 char **p_format;
433 va_list *p_va;
434{
435 char *format = *p_format;
436 char c = *format++;
437
438 switch (c) {
439
440 case 'b': /* byte -- very short int */
441 {
442 char *p = va_arg(*p_va, char *);
443 long ival = getintvalue(arg);
444 if (ival == -1 && err_occurred())
445 return "integer<b>";
446 else
447 *p = ival;
448 break;
449 }
450
451 case 'h': /* short int */
452 {
453 short *p = va_arg(*p_va, short *);
454 long ival = getintvalue(arg);
455 if (ival == -1 && err_occurred())
456 return "integer<h>";
457 else
458 *p = ival;
459 break;
460 }
461
462 case 'i': /* int */
463 {
464 int *p = va_arg(*p_va, int *);
465 long ival = getintvalue(arg);
466 if (ival == -1 && err_occurred())
467 return "integer<i>";
468 else
469 *p = ival;
470 break;
471 }
472
473 case 'l': /* long int */
474 {
475 long *p = va_arg(*p_va, long *);
476 long ival = getintvalue(arg);
477 if (ival == -1 && err_occurred())
478 return "integer<l>";
479 else
480 *p = ival;
481 break;
482 }
483
484 case 'f': /* float */
485 {
486 float *p = va_arg(*p_va, float *);
487 double dval = getfloatvalue(arg);
488 if (err_occurred())
489 return "float<f>";
490 else
491 *p = dval;
492 break;
493 }
494
495 case 'd': /* double */
496 {
497 double *p = va_arg(*p_va, double *);
498 double dval = getfloatvalue(arg);
499 if (err_occurred())
500 return "float<d>";
501 else
502 *p = dval;
503 break;
504 }
505
Guido van Rossum530956d1996-07-21 02:27:43 +0000506#ifndef WITHOUT_COMPLEX
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000507 case 'D': /* complex double */
508 {
Guido van Rossum530956d1996-07-21 02:27:43 +0000509 Py_complex *p = va_arg(*p_va, Py_complex *);
Guido van Rossumaa354651996-08-19 19:32:04 +0000510 Py_complex cval;
511 cval = PyComplex_AsCComplex(arg);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000512 if (err_occurred())
513 return "complex<D>";
514 else
515 *p = cval;
516 break;
517 }
Guido van Rossum530956d1996-07-21 02:27:43 +0000518#endif /* WITHOUT_COMPLEX */
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000519
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000520 case 'c': /* char */
521 {
522 char *p = va_arg(*p_va, char *);
523 if (is_stringobject(arg) && getstringsize(arg) == 1)
524 *p = getstringvalue(arg)[0];
525 else
526 return "char";
527 break;
528 }
529
530 case 's': /* string */
531 {
532 char **p = va_arg(*p_va, char **);
533 if (is_stringobject(arg))
534 *p = getstringvalue(arg);
535 else
536 return "string";
537 if (*format == '#') {
538 int *q = va_arg(*p_va, int *);
539 *q = getstringsize(arg);
540 format++;
541 }
542 else if (strlen(*p) != getstringsize(arg))
543 return "string without null bytes";
544 break;
545 }
546
547 case 'z': /* string, may be NULL (None) */
548 {
549 char **p = va_arg(*p_va, char **);
550 if (arg == None)
551 *p = 0;
552 else if (is_stringobject(arg))
553 *p = getstringvalue(arg);
554 else
555 return "None or string";
556 if (*format == '#') {
557 int *q = va_arg(*p_va, int *);
558 if (arg == None)
559 *q = 0;
560 else
561 *q = getstringsize(arg);
562 format++;
563 }
Guido van Rossumaa354651996-08-19 19:32:04 +0000564 else if (*p != NULL &&
565 strlen(*p) != getstringsize(arg))
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000566 return "None or string without null bytes";
567 break;
568 }
569
570 case 'S': /* string object */
571 {
572 object **p = va_arg(*p_va, object **);
573 if (is_stringobject(arg))
574 *p = arg;
575 else
576 return "string";
577 break;
578 }
579
580 case 'O': /* object */
581 {
582 typeobject *type;
583 object **p;
584 if (*format == '!') {
585 format++;
586 type = va_arg(*p_va, typeobject*);
587 if (arg->ob_type != type)
588 return type->tp_name;
589 else {
590 p = va_arg(*p_va, object **);
591 *p = arg;
592 }
593 }
594 else if (*format == '?') {
595 inquiry pred = va_arg(*p_va, inquiry);
596 format++;
597 if ((*pred)(arg)) {
598 p = va_arg(*p_va, object **);
599 *p = arg;
600 }
601 }
602 else if (*format == '&') {
Guido van Rossumaa354651996-08-19 19:32:04 +0000603 typedef int (*converter)
604 PROTO((object *, void *));
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000605 converter convert = va_arg(*p_va, converter);
606 void *addr = va_arg(*p_va, void *);
607 format++;
608 if (! (*convert)(arg, addr))
Guido van Rossum64fc6491995-01-21 14:09:37 +0000609 return "(unspecified)";
Guido van Rossumfe3f1a21994-09-29 09:42:55 +0000610 }
611 else {
612 p = va_arg(*p_va, object **);
613 *p = arg;
614 }
615 break;
616 }
617
618 default:
619 return "impossible<bad format char>";
620
621 }
622
623 *p_format = format;
624 return NULL;
625}
Guido van Rossumaa354651996-08-19 19:32:04 +0000626
627
628/* Support for keyword arguments donated by
629 Geoff Philbrick <philbric@delphi.hks.com> */
630
631#ifdef HAVE_STDARG_PROTOTYPES
632/* VARARGS2 */
633int PyArg_ParseTupleAndKeywords(object *args,
634 object *keywords,
635 char *format,
636 char **kwlist, ...)
637#else
638/* VARARGS */
639int PyArg_ParseTupleAndKeywords(va_alist) va_dcl
640#endif
641{
642 int retval;
643 va_list va;
644#ifdef HAVE_STDARG_PROTOTYPES
645
646 va_start(va, kwlist);
647#else
648 object *args;
649 object *keywords;
650 char *format;
651 char **kwlist;
652
653 va_start(va);
654 args = va_arg(va, object *);
655 keywords = va_arg(va, object *);
656 format = va_arg(va, char *);
657 kwlist = va_arg(va, char **);
658#endif
659 retval = vgetargskeywords(args, keywords, format, kwlist, &va);
660 va_end(va);
661 return retval;
662}
663
664
665static int
666vgetargskeywords(args, keywords, format, kwlist, p_va)
667 object *args;
668 object *keywords;
669 char *format;
670 char **kwlist;
671 va_list *p_va;
672{
673 char msgbuf[256];
674 int levels[32];
675 char *fname = NULL;
676 char *message = NULL;
677 int min = -1;
678 int max = 0;
679 int level = 0;
680 char *formatsave = format;
681 int i, len, tplen, kwlen;
682 char *msg, *ks, **p;
683 int nkwds, pos, match, converted;
684 object *key, *value, *item;
685
686 /* nested tuples cannot be parsed when using keyword arguments */
687
688 for (;;) {
689 int c = *format++;
690 if (c == '(') {
691 PyErr_SetString(PyExc_SystemError,
692 "tuple found in format when using keyword arguments");
693 return 0;
694 }
695 else if (c == '\0')
696 break;
697 else if (c == ':') {
698 fname = format;
699 break;
700 }
701 else if (c == ';') {
702 message = format;
703 break;
704 }
705 else if (isalpha(c))
706 max++;
707 else if (c == '|')
708 min = max;
709 }
710
711 if (min < 0)
712 min = max;
713
714 format = formatsave;
715
716 if (!PyTuple_Check(args)) {
717 PyErr_SetString(PyExc_SystemError,
718 "new style getargs format but argument is not a tuple");
719 return 0;
720 }
721
722 tplen = PyTuple_Size(args);
723
724 /* do a cursory check of the keywords just to see how many we got */
725
726 if (keywords) {
727 if (!PyDict_Check(keywords)) {
728 PyErr_SetString(PyExc_SystemError,
729 "non-dictionary object received when keyword dictionary expected");
730 return 0;
731 }
732 kwlen = PyDict_Size(keywords);
733 }
734 else {
735 kwlen = 0;
736 }
737
738 /* make sure there are no duplicate values for an argument;
739 its not clear when to use the term "keyword argument vs.
740 keyword parameter in messages */
741
742 if (keywords) {
743 for (i = 0; i < tplen; i++) {
744 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
745 sprintf(msgbuf,
746 "keyword parameter %s redefined",
747 kwlist[i]);
748 PyErr_SetString(PyExc_TypeError, msgbuf);
749 return 0;
750 }
751 }
752 }
753 PyErr_Clear(); /* I'm not which Py functions set the error string */
754
755 /* required arguments missing from args can be supplied by keyword
756 arguments */
757
758 len = tplen;
759 if (keywords && tplen < min) {
760 for (i = tplen; i < min; i++) {
761 if (PyMapping_HasKeyString(keywords, kwlist[i])) {
762 len++;
763 }
764 }
765 }
766 PyErr_Clear();
767
768 /* make sure we got an acceptable number of arguments; the message
769 is a little confusing with keywords since keyword arguments
770 which are supplied, but don't match the required arguments
771 are not included in the "%d given" part of the message */
772
773 if (len < min || max < len) {
774 if (message == NULL) {
775 sprintf(msgbuf,
776 "%s requires %s %d argument%s; %d given",
777 fname==NULL ? "function" : fname,
778 min==max ? "exactly"
779 : len < min ? "at least" : "at most",
780 len < min ? min : max,
781 (len < min ? min : max) == 1 ? "" : "s",
782 len);
783 message = msgbuf;
784 }
785 PyErr_SetString(PyExc_TypeError, message);
786 return 0;
787 }
788
789 for (i = 0; i < tplen; i++) {
790 if (*format == '|')
791 format++;
792 msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
793 levels, msgbuf);
794 if (msg) {
795 seterror(i+1, msg, levels, fname, message);
796 return 0;
797 }
798 }
799
800 /* handle no keyword parameters in call */
801
802 if (!keywords) return 1;
803
804 /* make sure the number of keywords in the keyword list matches the
805 number of items in the format string */
806
807 nkwds = 0;
808 p = kwlist;
809 for (;;) {
810 if (!*(p++)) break;
811 nkwds++;
812 }
813
814 if (nkwds != max) {
815 PyErr_SetString(PyExc_SystemError,
816 "number of items in format string and keyword list do not match");
817 return 0;
818 }
819
820 /* convert the keyword arguments; this uses the format
821 string where it was left after processing args */
822
823 converted = 0;
824 for (i = tplen; i < nkwds; i++) {
825 if (*format == '|')
826 format++;
827 if (item = PyMapping_GetItemString(keywords, kwlist[i])) {
828 msg = convertitem(item, &format, p_va, levels, msgbuf);
829 if (msg) {
830 seterror(i+1, msg, levels, fname, message);
831 return 0;
832 }
833 converted++;
834 }
835 else {
836 PyErr_Clear();
837 msg = skipitem(&format, p_va);
838 if (msg) {
839 seterror(i+1, msg, levels, fname, message);
840 return 0;
841 }
842 }
843 }
844
845 /* make sure there are no extraneous keyword arguments */
846
847 pos = 0;
848 if (converted < kwlen) {
849 while (PyDict_Next(keywords, &pos, &key, &value)) {
850 match = 0;
851 ks = PyString_AsString(key);
852 for (i = 0; i < nkwds; i++) {
853 if (!strcmp(ks, kwlist[i])) {
854 match = 1;
855 break;
856 }
857 }
858 if (!match) {
859 sprintf(msgbuf,
860 "%s is an invalid keyword argument for this function",
861 ks);
862 PyErr_SetString(PyExc_TypeError, msgbuf);
863 return 0;
864 }
865 }
866 }
867
868 return 1;
869}
870
871
872static char *
873skipitem(p_format, p_va)
874 char **p_format;
875 va_list *p_va;
876{
877 char *format = *p_format;
878 char c = *format++;
879
880 switch (c) {
881
882 case 'b': /* byte -- very short int */
883 {
884 va_arg(*p_va, char *);
885 break;
886 }
887
888 case 'h': /* short int */
889 {
890 va_arg(*p_va, short *);
891 break;
892 }
893
894 case 'i': /* int */
895 {
896 va_arg(*p_va, int *);
897 break;
898 }
899
900 case 'l': /* long int */
901 {
902 va_arg(*p_va, long *);
903 break;
904 }
905
906 case 'f': /* float */
907 {
908 va_arg(*p_va, float *);
909 break;
910 }
911
912 case 'd': /* double */
913 {
914 va_arg(*p_va, double *);
915 break;
916 }
917
918#ifndef WITHOUT_COMPLEX
919 case 'D': /* complex double */
920 {
921 va_arg(*p_va, Py_complex *);
922 break;
923 }
924#endif /* WITHOUT_COMPLEX */
925
926 case 'c': /* char */
927 {
928 va_arg(*p_va, char *);
929 break;
930 }
931
932 case 's': /* string */
933 {
934 va_arg(*p_va, char **);
935 if (*format == '#') {
936 va_arg(*p_va, int *);
937 format++;
938 }
939 break;
940 }
941
942 case 'z': /* string */
943 {
944 va_arg(*p_va, char **);
945 if (*format == '#') {
946 va_arg(*p_va, int *);
947 format++;
948 }
949 break;
950 }
951
952 case 'S': /* string object */
953 {
954 va_arg(*p_va, object **);
955 break;
956 }
957
958 case 'O': /* object */
959 {
960 typeobject *type;
961 object **p;
962 if (*format == '!') {
963 format++;
964 va_arg(*p_va, typeobject*);
965 va_arg(*p_va, object **);
966 }
967#if 0
968/* I don't know what this is for */
969 else if (*format == '?') {
970 inquiry pred = va_arg(*p_va, inquiry);
971 format++;
972 if ((*pred)(arg)) {
973 va_arg(*p_va, object **);
974 }
975 }
976#endif
977 else if (*format == '&') {
978 typedef int (*converter)
979 PROTO((object *, void *));
980 va_arg(*p_va, converter);
981 va_arg(*p_va, void *);
982 format++;
983 }
984 else {
985 va_arg(*p_va, object **);
986 }
987 break;
988 }
989
990 default:
991 return "impossible<bad format char>";
992
993 }
994
995 *p_format = format;
996 return NULL;
997}