1 /***********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI or Corporation for National Research Initiatives or
13 CNRI not be used in advertising or publicity pertaining to
14 distribution of the software without specific, written prior
17 While CWI is the initial source for this software, a modified version
18 is made available by the Corporation for National Research Initiatives
19 (CNRI) at the Internet address ftp://ftp.python.org.
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28 PERFORMANCE OF THIS SOFTWARE.
30 ******************************************************************/
32 /* New getargs implementation */
34 /* XXX There are several unchecked sprintf or strcat calls in this file.
35 XXX The only way these can become a danger is if some C code in the
36 XXX Python source (or in an extension) uses ridiculously long names
37 XXX or riduculously deep nesting in format strings. */
44 int PyArg_Parse
Py_PROTO((PyObject
*, char *, ...));
45 int PyArg_ParseTuple
Py_PROTO((PyObject
*, char *, ...));
46 int PyArg_VaParse
Py_PROTO((PyObject
*, char *, va_list));
48 int PyArg_ParseTupleAndKeywords
Py_PROTO((PyObject
*, PyObject
*,
49 char *, char **, ...));
52 static int vgetargs1
Py_PROTO((PyObject
*, char *, va_list *, int));
53 static void seterror
Py_PROTO((int, char *, int *, char *, char *));
54 static char *convertitem
Py_PROTO((PyObject
*, char **, va_list *,
56 static char *converttuple
Py_PROTO((PyObject
*, char **, va_list *,
58 static char *convertsimple
Py_PROTO((PyObject
*, char **, va_list *, char *));
59 static char *convertsimple1
Py_PROTO((PyObject
*, char **, va_list *));
61 static int vgetargskeywords
Py_PROTO((PyObject
*, PyObject
*,
62 char *, char **, va_list *));
63 static char *skipitem
Py_PROTO((char **, va_list *));
65 #ifdef HAVE_STDARG_PROTOTYPES
67 int PyArg_Parse(PyObject
*args
, char *format
, ...)
70 int PyArg_Parse(va_alist
) va_dcl
75 #ifdef HAVE_STDARG_PROTOTYPES
83 args
= va_arg(va
, PyObject
*);
84 format
= va_arg(va
, char *);
86 retval
= vgetargs1(args
, format
, &va
, 1);
92 #ifdef HAVE_STDARG_PROTOTYPES
94 int PyArg_ParseTuple(PyObject
*args
, char *format
, ...)
97 int PyArg_ParseTuple(va_alist
) va_dcl
102 #ifdef HAVE_STDARG_PROTOTYPES
104 va_start(va
, format
);
110 args
= va_arg(va
, PyObject
*);
111 format
= va_arg(va
, char *);
113 retval
= vgetargs1(args
, format
, &va
, 0);
120 PyArg_VaParse(args
, format
, va
)
127 #ifdef VA_LIST_IS_ARRAY
128 memcpy(lva
, va
, sizeof(va_list));
133 return vgetargs1(args
, format
, &lva
, 0);
138 vgetargs1(args
, format
, p_va
, compat
)
147 char *message
= NULL
;
151 char *formatsave
= format
;
157 if (c
== '(' /* ')' */) {
162 else if (/* '(' */ c
== ')') {
164 Py_FatalError(/* '(' */
165 "excess ')' in getargs format");
188 Py_FatalError(/* '(' */ "missing ')' in getargs format");
199 sprintf(msgbuf
, "%s requires no arguments",
200 fname
==NULL
? "function" : fname
);
201 PyErr_SetString(PyExc_TypeError
, msgbuf
);
204 else if (min
== 1 && max
== 1) {
207 "%s requires at least one argument",
208 fname
==NULL
? "function" : fname
);
209 PyErr_SetString(PyExc_TypeError
, msgbuf
);
212 msg
= convertitem(args
, &format
, p_va
, levels
, msgbuf
);
215 seterror(levels
[0], msg
, levels
+1, fname
, message
);
219 PyErr_SetString(PyExc_SystemError
,
220 "old style getargs format uses new features");
225 if (!PyTuple_Check(args
)) {
226 PyErr_SetString(PyExc_SystemError
,
227 "new style getargs format but argument is not a tuple");
231 len
= PyTuple_Size(args
);
233 if (len
< min
|| max
< len
) {
234 if (message
== NULL
) {
236 "%s requires %s %d argument%s; %d given",
237 fname
==NULL
? "function" : fname
,
239 : len
< min
? "at least" : "at most",
240 len
< min
? min
: max
,
241 (len
< min
? min
: max
) == 1 ? "" : "s",
245 PyErr_SetString(PyExc_TypeError
, message
);
249 for (i
= 0; i
< len
; i
++) {
252 msg
= convertitem(PyTuple_GetItem(args
, i
), &format
, p_va
,
255 seterror(i
+1, msg
, levels
, fname
, message
);
260 if (*format
!= '\0' && !isalpha((int)(*format
)) &&
262 *format
!= '|' && *format
!= ':' && *format
!= ';') {
263 PyErr_Format(PyExc_SystemError
,
264 "bad format string: %.200s", formatsave
);
274 seterror(iarg
, msg
, levels
, fname
, message
)
285 if (PyErr_Occurred())
287 if (iarg
== 0 && message
== NULL
)
289 else if (message
== NULL
) {
291 sprintf(p
, "%s, ", fname
);
294 sprintf(p
, "argument %d", iarg
);
297 while (levels
[i
] > 0) {
298 sprintf(p
, ", item %d", levels
[i
]-1);
302 sprintf(p
, ": expected %s found", msg
);
305 PyErr_SetString(PyExc_TypeError
, message
);
309 /* Convert a tuple argument.
310 On entry, *p_format points to the character _after_ the opening '('.
311 On successful exit, *p_format points to the closing ')'.
313 *p_format and *p_va are updated,
314 *levels and *msgbuf are untouched,
315 and NULL is returned.
316 If the argument is invalid:
317 *p_format is unchanged,
319 *levels is a 0-terminated list of item numbers,
320 *msgbuf contains an error message, whose format is:
321 "<typename1>, <typename2>", where:
322 <typename1> is the name of the expected type, and
323 <typename2> is the name of the actual type,
324 (so you can surround it by "expected ... found"),
325 and msgbuf is returned.
329 converttuple(arg
, p_format
, p_va
, levels
, msgbuf
, toplevel
)
339 char *format
= *p_format
;
354 else if (c
== ':' || c
== ';' || c
== '\0')
356 else if (level
== 0 && isalpha(c
))
360 if (!PyTuple_Check(arg
)) {
363 toplevel
? "%d arguments, %s" : "%d-tuple, %s",
364 n
, arg
== Py_None
? "None" : arg
->ob_type
->tp_name
);
368 if ((i
= PyTuple_Size(arg
)) != n
) {
371 toplevel
? "%d arguments, %d" : "%d-tuple, %d-tuple",
377 for (i
= 0; i
< n
; i
++) {
379 msg
= convertitem(PyTuple_GetItem(arg
, i
), &format
, p_va
,
392 /* Convert a single item. */
395 convertitem(arg
, p_format
, p_va
, levels
, msgbuf
)
403 char *format
= *p_format
;
405 if (*format
== '(' /* ')' */) {
407 msg
= converttuple(arg
, &format
, p_va
, levels
, msgbuf
, 0);
412 msg
= convertsimple(arg
, &format
, p_va
, msgbuf
);
422 /* Convert a non-tuple argument. Adds to convertsimple1 functionality
423 by appending ", <actual argument type>" to error message. */
426 convertsimple(arg
, p_format
, p_va
, msgbuf
)
432 char *msg
= convertsimple1(arg
, p_format
, p_va
);
434 sprintf(msgbuf
, "%.50s, %.50s", msg
,
435 arg
== Py_None
? "None" : arg
->ob_type
->tp_name
);
442 /* Convert a non-tuple argument. Return NULL if conversion went OK,
443 or a string representing the expected type if the conversion failed.
444 When failing, an exception may or may not have been raised.
445 Don't call if a tuple is expected. */
448 convertsimple1(arg
, p_format
, p_va
)
453 char *format
= *p_format
;
458 case 'b': /* byte -- very short int */
460 char *p
= va_arg(*p_va
, char *);
461 long ival
= PyInt_AsLong(arg
);
462 if (ival
== -1 && PyErr_Occurred())
469 case 'h': /* short int */
471 short *p
= va_arg(*p_va
, short *);
472 long ival
= PyInt_AsLong(arg
);
473 if (ival
== -1 && PyErr_Occurred())
482 int *p
= va_arg(*p_va
, int *);
483 long ival
= PyInt_AsLong(arg
);
484 if (ival
== -1 && PyErr_Occurred())
491 case 'l': /* long int */
493 long *p
= va_arg(*p_va
, long *);
494 long ival
= PyInt_AsLong(arg
);
495 if (ival
== -1 && PyErr_Occurred())
503 case 'L': /* long long */
505 long long *p
= va_arg( *p_va
, long long * );
506 long long ival
= PyLong_AsLongLong( arg
);
507 if( ival
== (long long)-1 && PyErr_Occurred() ) {
516 case 'f': /* float */
518 float *p
= va_arg(*p_va
, float *);
519 double dval
= PyFloat_AsDouble(arg
);
520 if (PyErr_Occurred())
527 case 'd': /* double */
529 double *p
= va_arg(*p_va
, double *);
530 double dval
= PyFloat_AsDouble(arg
);
531 if (PyErr_Occurred())
538 #ifndef WITHOUT_COMPLEX
539 case 'D': /* complex double */
541 Py_complex
*p
= va_arg(*p_va
, Py_complex
*);
543 cval
= PyComplex_AsCComplex(arg
);
544 if (PyErr_Occurred())
550 #endif /* WITHOUT_COMPLEX */
554 char *p
= va_arg(*p_va
, char *);
555 if (PyString_Check(arg
) && PyString_Size(arg
) == 1)
556 *p
= PyString_AsString(arg
)[0];
562 case 's': /* string */
564 if (*format
== '#') { /* any buffer-like object */
565 void **p
= (void **)va_arg(*p_va
, char **);
566 PyBufferProcs
*pb
= arg
->ob_type
->tp_as_buffer
;
567 int *q
= va_arg(*p_va
, int *);
571 pb
->bf_getreadbuffer
== NULL
||
572 pb
->bf_getsegcount
== NULL
)
573 return "read-only buffer";
574 if ( (*pb
->bf_getsegcount
)(arg
, NULL
) != 1 )
575 return "single-segment read-only buffer";
577 (*pb
->bf_getreadbuffer
)(arg
, 0, p
)) < 0 )
578 return "(unspecified)";
582 char **p
= va_arg(*p_va
, char **);
584 if (PyString_Check(arg
))
585 *p
= PyString_AsString(arg
);
588 if ((int)strlen(*p
) != PyString_Size(arg
))
589 return "string without null bytes";
594 case 'z': /* string, may be NULL (None) */
596 if (*format
== '#') { /* any buffer-like object */
597 void **p
= (void **)va_arg(*p_va
, char **);
598 PyBufferProcs
*pb
= arg
->ob_type
->tp_as_buffer
;
599 int *q
= va_arg(*p_va
, int *);
602 if (arg
== Py_None
) {
607 pb
->bf_getreadbuffer
== NULL
||
608 pb
->bf_getsegcount
== NULL
)
609 return "read-only buffer";
610 if ( (*pb
->bf_getsegcount
)(arg
, NULL
) != 1 )
611 return "single-segment read-only buffer";
612 if ( (count
= (*pb
->bf_getreadbuffer
)
614 return "(unspecified)";
619 char **p
= va_arg(*p_va
, char **);
623 else if (PyString_Check(arg
))
624 *p
= PyString_AsString(arg
);
626 return "None or string";
627 if (*format
== '#') {
628 int *q
= va_arg(*p_va
, int *);
632 *q
= PyString_Size(arg
);
635 else if (*p
!= NULL
&&
636 (int)strlen(*p
) != PyString_Size(arg
))
637 return "None or string without null bytes";
642 case 'S': /* string object */
644 PyObject
**p
= va_arg(*p_va
, PyObject
**);
645 if (PyString_Check(arg
))
652 case 'O': /* object */
656 if (*format
== '!') {
657 type
= va_arg(*p_va
, PyTypeObject
*);
658 p
= va_arg(*p_va
, PyObject
**);
660 if (arg
->ob_type
== type
)
663 return type
->tp_name
;
666 else if (*format
== '?') {
667 inquiry pred
= va_arg(*p_va
, inquiry
);
668 p
= va_arg(*p_va
, PyObject
**);
673 return "(unspecified)";
676 else if (*format
== '&') {
677 typedef int (*converter
)
678 Py_PROTO((PyObject
*, void *));
679 converter convert
= va_arg(*p_va
, converter
);
680 void *addr
= va_arg(*p_va
, void *);
682 if (! (*convert
)(arg
, addr
))
683 return "(unspecified)";
686 p
= va_arg(*p_va
, PyObject
**);
693 case 'w': /* memory buffer, read-write access */
695 void **p
= va_arg(*p_va
, void **);
696 PyBufferProcs
*pb
= arg
->ob_type
->tp_as_buffer
;
699 if ( pb
== NULL
|| pb
->bf_getwritebuffer
== NULL
||
700 pb
->bf_getsegcount
== NULL
)
701 return "read-write buffer";
702 if ( (*pb
->bf_getsegcount
)(arg
, NULL
) != 1 )
703 return "single-segment read-write buffer";
704 if ( (count
= pb
->bf_getwritebuffer(arg
, 0, p
)) < 0 )
705 return "(unspecified)";
706 if (*format
== '#') {
707 int *q
= va_arg(*p_va
, int *);
717 return "impossible<bad format char>";
726 /* Support for keyword arguments donated by
727 Geoff Philbrick <philbric@delphi.hks.com> */
729 #ifdef HAVE_STDARG_PROTOTYPES
731 int PyArg_ParseTupleAndKeywords(PyObject
*args
,
737 int PyArg_ParseTupleAndKeywords(va_alist
) va_dcl
742 #ifdef HAVE_STDARG_PROTOTYPES
744 va_start(va
, kwlist
);
752 args
= va_arg(va
, PyObject
*);
753 keywords
= va_arg(va
, PyObject
*);
754 format
= va_arg(va
, char *);
755 kwlist
= va_arg(va
, char **);
757 retval
= vgetargskeywords(args
, keywords
, format
, kwlist
, &va
);
764 vgetargskeywords(args
, keywords
, format
, kwlist
, p_va
)
774 char *message
= NULL
;
777 char *formatsave
= format
;
778 int i
, len
, tplen
, kwlen
;
780 int nkwds
, pos
, match
, converted
;
781 PyObject
*key
, *value
;
783 /* nested tuples cannot be parsed when using keyword arguments */
788 PyErr_SetString(PyExc_SystemError
,
789 "tuple found in format when using keyword arguments");
813 if (!PyTuple_Check(args
)) {
814 PyErr_SetString(PyExc_SystemError
,
815 "new style getargs format but argument is not a tuple");
819 tplen
= PyTuple_Size(args
);
821 /* do a cursory check of the keywords just to see how many we got */
824 if (!PyDict_Check(keywords
)) {
825 PyErr_SetString(PyExc_SystemError
,
826 "non-dictionary object received when keyword dictionary expected");
829 kwlen
= PyDict_Size(keywords
);
835 /* make sure there are no duplicate values for an argument;
836 its not clear when to use the term "keyword argument vs.
837 keyword parameter in messages */
840 for (i
= 0; i
< tplen
; i
++) {
841 if (PyMapping_HasKeyString(keywords
, kwlist
[i
])) {
843 "keyword parameter %s redefined",
845 PyErr_SetString(PyExc_TypeError
, msgbuf
);
850 PyErr_Clear(); /* I'm not which Py functions set the error string */
852 /* required arguments missing from args can be supplied by keyword
856 if (keywords
&& tplen
< min
) {
857 for (i
= tplen
; i
< min
; i
++) {
858 if (PyMapping_HasKeyString(keywords
, kwlist
[i
])) {
865 /* make sure we got an acceptable number of arguments; the message
866 is a little confusing with keywords since keyword arguments
867 which are supplied, but don't match the required arguments
868 are not included in the "%d given" part of the message */
870 if (len
< min
|| max
< len
) {
871 if (message
== NULL
) {
873 "%s requires %s %d argument%s; %d given",
874 fname
==NULL
? "function" : fname
,
876 : len
< min
? "at least" : "at most",
877 len
< min
? min
: max
,
878 (len
< min
? min
: max
) == 1 ? "" : "s",
882 PyErr_SetString(PyExc_TypeError
, message
);
886 for (i
= 0; i
< tplen
; i
++) {
889 msg
= convertitem(PyTuple_GetItem(args
, i
), &format
, p_va
,
892 seterror(i
+1, msg
, levels
, fname
, message
);
897 /* handle no keyword parameters in call */
899 if (!keywords
) return 1;
901 /* make sure the number of keywords in the keyword list matches the
902 number of items in the format string */
912 PyErr_SetString(PyExc_SystemError
,
913 "number of items in format string and keyword list do not match");
917 /* convert the keyword arguments; this uses the format
918 string where it was left after processing args */
921 for (i
= tplen
; i
< nkwds
; i
++) {
925 item
= PyMapping_GetItemString(keywords
, kwlist
[i
]);
927 msg
= convertitem(item
, &format
, p_va
, levels
, msgbuf
);
929 seterror(i
+1, msg
, levels
, fname
, message
);
936 msg
= skipitem(&format
, p_va
);
938 seterror(i
+1, msg
, levels
, fname
, message
);
944 /* make sure there are no extraneous keyword arguments */
947 if (converted
< kwlen
) {
948 while (PyDict_Next(keywords
, &pos
, &key
, &value
)) {
950 ks
= PyString_AsString(key
);
951 for (i
= 0; i
< nkwds
; i
++) {
952 if (!strcmp(ks
, kwlist
[i
])) {
959 "%s is an invalid keyword argument for this function",
961 PyErr_SetString(PyExc_TypeError
, msgbuf
);
972 skipitem(p_format
, p_va
)
976 char *format
= *p_format
;
981 case 'b': /* byte -- very short int */
983 (void) va_arg(*p_va
, char *);
987 case 'h': /* short int */
989 (void) va_arg(*p_va
, short *);
995 (void) va_arg(*p_va
, int *);
999 case 'l': /* long int */
1001 (void) va_arg(*p_va
, long *);
1006 case 'L': /* long long int */
1008 (void) va_arg(*p_va
, long long *);
1013 case 'f': /* float */
1015 (void) va_arg(*p_va
, float *);
1019 case 'd': /* double */
1021 (void) va_arg(*p_va
, double *);
1025 #ifndef WITHOUT_COMPLEX
1026 case 'D': /* complex double */
1028 (void) va_arg(*p_va
, Py_complex
*);
1031 #endif /* WITHOUT_COMPLEX */
1033 case 'c': /* char */
1035 (void) va_arg(*p_va
, char *);
1039 case 's': /* string */
1041 (void) va_arg(*p_va
, char **);
1042 if (*format
== '#') {
1043 (void) va_arg(*p_va
, int *);
1049 case 'z': /* string */
1051 (void) va_arg(*p_va
, char **);
1052 if (*format
== '#') {
1053 (void) va_arg(*p_va
, int *);
1059 case 'S': /* string object */
1061 (void) va_arg(*p_va
, PyObject
**);
1065 case 'O': /* object */
1067 if (*format
== '!') {
1069 (void) va_arg(*p_va
, PyTypeObject
*);
1070 (void) va_arg(*p_va
, PyObject
**);
1073 /* I don't know what this is for */
1074 else if (*format
== '?') {
1075 inquiry pred
= va_arg(*p_va
, inquiry
);
1078 (void) va_arg(*p_va
, PyObject
**);
1082 else if (*format
== '&') {
1083 typedef int (*converter
)
1084 Py_PROTO((PyObject
*, void *));
1085 (void) va_arg(*p_va
, converter
);
1086 (void) va_arg(*p_va
, void *);
1090 (void) va_arg(*p_va
, PyObject
**);
1096 return "impossible<bad format char>";