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 (!PySequence_Check(arg
)) {
363 toplevel
? "%d arguments, %s" : "%d-sequence, %s",
364 n
, arg
== Py_None
? "None" : arg
->ob_type
->tp_name
);
368 if ((i
= PySequence_Length(arg
)) != n
) {
371 toplevel
? "%d arguments, %d" : "%d-sequence, %d-sequence",
377 for (i
= 0; i
< n
; i
++) {
380 item
= PySequence_GetItem(arg
, i
);
381 msg
= convertitem(item
, &format
, p_va
, levels
+1, msgbuf
);
382 /* PySequence_GetItem calls tp->sq_item, which INCREFs */
395 /* Convert a single item. */
398 convertitem(arg
, p_format
, p_va
, levels
, msgbuf
)
406 char *format
= *p_format
;
408 if (*format
== '(' /* ')' */) {
410 msg
= converttuple(arg
, &format
, p_va
, levels
, msgbuf
, 0);
415 msg
= convertsimple(arg
, &format
, p_va
, msgbuf
);
425 /* Convert a non-tuple argument. Adds to convertsimple1 functionality
426 by appending ", <actual argument type>" to error message. */
429 convertsimple(arg
, p_format
, p_va
, msgbuf
)
435 char *msg
= convertsimple1(arg
, p_format
, p_va
);
437 sprintf(msgbuf
, "%.50s, %.50s", msg
,
438 arg
== Py_None
? "None" : arg
->ob_type
->tp_name
);
445 /* Convert a non-tuple argument. Return NULL if conversion went OK,
446 or a string representing the expected type if the conversion failed.
447 When failing, an exception may or may not have been raised.
448 Don't call if a tuple is expected. */
451 convertsimple1(arg
, p_format
, p_va
)
456 char *format
= *p_format
;
461 case 'b': /* byte -- very short int */
463 char *p
= va_arg(*p_va
, char *);
464 long ival
= PyInt_AsLong(arg
);
465 if (ival
== -1 && PyErr_Occurred())
472 case 'h': /* short int */
474 short *p
= va_arg(*p_va
, short *);
475 long ival
= PyInt_AsLong(arg
);
476 if (ival
== -1 && PyErr_Occurred())
485 int *p
= va_arg(*p_va
, int *);
486 long ival
= PyInt_AsLong(arg
);
487 if (ival
== -1 && PyErr_Occurred())
494 case 'l': /* long int */
496 long *p
= va_arg(*p_va
, long *);
497 long ival
= PyInt_AsLong(arg
);
498 if (ival
== -1 && PyErr_Occurred())
505 #ifdef HAVE_LONG_LONG
506 case 'L': /* LONG_LONG */
508 LONG_LONG
*p
= va_arg( *p_va
, LONG_LONG
* );
509 LONG_LONG ival
= PyLong_AsLongLong( arg
);
510 if( ival
== (LONG_LONG
)-1 && PyErr_Occurred() ) {
519 case 'f': /* float */
521 float *p
= va_arg(*p_va
, float *);
522 double dval
= PyFloat_AsDouble(arg
);
523 if (PyErr_Occurred())
530 case 'd': /* double */
532 double *p
= va_arg(*p_va
, double *);
533 double dval
= PyFloat_AsDouble(arg
);
534 if (PyErr_Occurred())
541 #ifndef WITHOUT_COMPLEX
542 case 'D': /* complex double */
544 Py_complex
*p
= va_arg(*p_va
, Py_complex
*);
546 cval
= PyComplex_AsCComplex(arg
);
547 if (PyErr_Occurred())
553 #endif /* WITHOUT_COMPLEX */
557 char *p
= va_arg(*p_va
, char *);
558 if (PyString_Check(arg
) && PyString_Size(arg
) == 1)
559 *p
= PyString_AsString(arg
)[0];
565 case 's': /* string */
567 if (*format
== '#') { /* any buffer-like object */
568 void **p
= (void **)va_arg(*p_va
, char **);
569 PyBufferProcs
*pb
= arg
->ob_type
->tp_as_buffer
;
570 int *q
= va_arg(*p_va
, int *);
574 pb
->bf_getreadbuffer
== NULL
||
575 pb
->bf_getsegcount
== NULL
)
576 return "read-only buffer";
577 if ( (*pb
->bf_getsegcount
)(arg
, NULL
) != 1 )
578 return "single-segment read-only buffer";
580 (*pb
->bf_getreadbuffer
)(arg
, 0, p
)) < 0 )
581 return "(unspecified)";
585 char **p
= va_arg(*p_va
, char **);
587 if (PyString_Check(arg
))
588 *p
= PyString_AsString(arg
);
591 if ((int)strlen(*p
) != PyString_Size(arg
))
592 return "string without null bytes";
597 case 'z': /* string, may be NULL (None) */
599 if (*format
== '#') { /* any buffer-like object */
600 void **p
= (void **)va_arg(*p_va
, char **);
601 PyBufferProcs
*pb
= arg
->ob_type
->tp_as_buffer
;
602 int *q
= va_arg(*p_va
, int *);
605 if (arg
== Py_None
) {
610 pb
->bf_getreadbuffer
== NULL
||
611 pb
->bf_getsegcount
== NULL
)
612 return "read-only buffer";
613 if ( (*pb
->bf_getsegcount
)(arg
, NULL
) != 1 )
614 return "single-segment read-only buffer";
615 if ( (count
= (*pb
->bf_getreadbuffer
)
617 return "(unspecified)";
622 char **p
= va_arg(*p_va
, char **);
626 else if (PyString_Check(arg
))
627 *p
= PyString_AsString(arg
);
629 return "None or string";
630 if (*format
== '#') {
631 int *q
= va_arg(*p_va
, int *);
635 *q
= PyString_Size(arg
);
638 else if (*p
!= NULL
&&
639 (int)strlen(*p
) != PyString_Size(arg
))
640 return "None or string without null bytes";
645 case 'S': /* string object */
647 PyObject
**p
= va_arg(*p_va
, PyObject
**);
648 if (PyString_Check(arg
))
655 case 'O': /* object */
659 if (*format
== '!') {
660 type
= va_arg(*p_va
, PyTypeObject
*);
661 p
= va_arg(*p_va
, PyObject
**);
663 if (arg
->ob_type
== type
)
666 return type
->tp_name
;
669 else if (*format
== '?') {
670 inquiry pred
= va_arg(*p_va
, inquiry
);
671 p
= va_arg(*p_va
, PyObject
**);
676 return "(unspecified)";
679 else if (*format
== '&') {
680 typedef int (*converter
)
681 Py_PROTO((PyObject
*, void *));
682 converter convert
= va_arg(*p_va
, converter
);
683 void *addr
= va_arg(*p_va
, void *);
685 if (! (*convert
)(arg
, addr
))
686 return "(unspecified)";
689 p
= va_arg(*p_va
, PyObject
**);
696 case 'w': /* memory buffer, read-write access */
698 void **p
= va_arg(*p_va
, void **);
699 PyBufferProcs
*pb
= arg
->ob_type
->tp_as_buffer
;
702 if ( pb
== NULL
|| pb
->bf_getwritebuffer
== NULL
||
703 pb
->bf_getsegcount
== NULL
)
704 return "read-write buffer";
705 if ( (*pb
->bf_getsegcount
)(arg
, NULL
) != 1 )
706 return "single-segment read-write buffer";
707 if ( (count
= pb
->bf_getwritebuffer(arg
, 0, p
)) < 0 )
708 return "(unspecified)";
709 if (*format
== '#') {
710 int *q
= va_arg(*p_va
, int *);
718 case 't': /* 8-bit character buffer, read-only access */
720 const char **p
= va_arg(*p_va
, const char **);
721 PyBufferProcs
*pb
= arg
->ob_type
->tp_as_buffer
;
724 if ( *format
++ != '#' )
725 return "invalid use of 't' format character";
726 if ( !PyType_HasFeature(
728 Py_TPFLAGS_HAVE_GETCHARBUFFER
) ||
730 pb
->bf_getcharbuffer
== NULL
||
731 pb
->bf_getsegcount
== NULL
)
732 return "read-only character buffer";
733 if ( (*pb
->bf_getsegcount
)(arg
, NULL
) != 1 )
734 return "single-segment read-only buffer";
735 if ( (count
= pb
->bf_getcharbuffer(arg
, 0, p
)) < 0 )
736 return "(unspecified)";
738 *va_arg(*p_va
, int *) = count
;
745 return "impossible<bad format char>";
754 /* Support for keyword arguments donated by
755 Geoff Philbrick <philbric@delphi.hks.com> */
757 #ifdef HAVE_STDARG_PROTOTYPES
759 int PyArg_ParseTupleAndKeywords(PyObject
*args
,
765 int PyArg_ParseTupleAndKeywords(va_alist
) va_dcl
770 #ifdef HAVE_STDARG_PROTOTYPES
772 va_start(va
, kwlist
);
780 args
= va_arg(va
, PyObject
*);
781 keywords
= va_arg(va
, PyObject
*);
782 format
= va_arg(va
, char *);
783 kwlist
= va_arg(va
, char **);
785 retval
= vgetargskeywords(args
, keywords
, format
, kwlist
, &va
);
792 vgetargskeywords(args
, keywords
, format
, kwlist
, p_va
)
802 char *message
= NULL
;
805 char *formatsave
= format
;
806 int i
, len
, tplen
, kwlen
;
808 int nkwds
, pos
, match
, converted
;
809 PyObject
*key
, *value
;
811 /* nested tuples cannot be parsed when using keyword arguments */
816 PyErr_SetString(PyExc_SystemError
,
817 "tuple found in format when using keyword arguments");
841 if (!PyTuple_Check(args
)) {
842 PyErr_SetString(PyExc_SystemError
,
843 "new style getargs format but argument is not a tuple");
847 tplen
= PyTuple_Size(args
);
849 /* do a cursory check of the keywords just to see how many we got */
852 if (!PyDict_Check(keywords
)) {
853 PyErr_SetString(PyExc_SystemError
,
854 "non-dictionary object received when keyword dictionary expected");
857 kwlen
= PyDict_Size(keywords
);
863 /* make sure there are no duplicate values for an argument;
864 its not clear when to use the term "keyword argument vs.
865 keyword parameter in messages */
868 for (i
= 0; i
< tplen
; i
++) {
869 if (PyMapping_HasKeyString(keywords
, kwlist
[i
])) {
871 "keyword parameter %s redefined",
873 PyErr_SetString(PyExc_TypeError
, msgbuf
);
878 PyErr_Clear(); /* I'm not which Py functions set the error string */
880 /* required arguments missing from args can be supplied by keyword
884 if (keywords
&& tplen
< min
) {
885 for (i
= tplen
; i
< min
; i
++) {
886 if (PyMapping_HasKeyString(keywords
, kwlist
[i
])) {
893 /* make sure we got an acceptable number of arguments; the message
894 is a little confusing with keywords since keyword arguments
895 which are supplied, but don't match the required arguments
896 are not included in the "%d given" part of the message */
898 if (len
< min
|| max
< len
) {
899 if (message
== NULL
) {
901 "%s requires %s %d argument%s; %d given",
902 fname
==NULL
? "function" : fname
,
904 : len
< min
? "at least" : "at most",
905 len
< min
? min
: max
,
906 (len
< min
? min
: max
) == 1 ? "" : "s",
910 PyErr_SetString(PyExc_TypeError
, message
);
914 for (i
= 0; i
< tplen
; i
++) {
917 msg
= convertitem(PyTuple_GetItem(args
, i
), &format
, p_va
,
920 seterror(i
+1, msg
, levels
, fname
, message
);
925 /* handle no keyword parameters in call */
927 if (!keywords
) return 1;
929 /* make sure the number of keywords in the keyword list matches the
930 number of items in the format string */
940 PyErr_SetString(PyExc_SystemError
,
941 "number of items in format string and keyword list do not match");
945 /* convert the keyword arguments; this uses the format
946 string where it was left after processing args */
949 for (i
= tplen
; i
< nkwds
; i
++) {
953 item
= PyMapping_GetItemString(keywords
, kwlist
[i
]);
955 msg
= convertitem(item
, &format
, p_va
, levels
, msgbuf
);
957 seterror(i
+1, msg
, levels
, fname
, message
);
964 msg
= skipitem(&format
, p_va
);
966 seterror(i
+1, msg
, levels
, fname
, message
);
972 /* make sure there are no extraneous keyword arguments */
975 if (converted
< kwlen
) {
976 while (PyDict_Next(keywords
, &pos
, &key
, &value
)) {
978 ks
= PyString_AsString(key
);
979 for (i
= 0; i
< nkwds
; i
++) {
980 if (!strcmp(ks
, kwlist
[i
])) {
987 "%s is an invalid keyword argument for this function",
989 PyErr_SetString(PyExc_TypeError
, msgbuf
);
1000 skipitem(p_format
, p_va
)
1004 char *format
= *p_format
;
1009 case 'b': /* byte -- very short int */
1011 (void) va_arg(*p_va
, char *);
1015 case 'h': /* short int */
1017 (void) va_arg(*p_va
, short *);
1023 (void) va_arg(*p_va
, int *);
1027 case 'l': /* long int */
1029 (void) va_arg(*p_va
, long *);
1033 #ifdef HAVE_LONG_LONG
1034 case 'L': /* LONG_LONG int */
1036 (void) va_arg(*p_va
, LONG_LONG
*);
1041 case 'f': /* float */
1043 (void) va_arg(*p_va
, float *);
1047 case 'd': /* double */
1049 (void) va_arg(*p_va
, double *);
1053 #ifndef WITHOUT_COMPLEX
1054 case 'D': /* complex double */
1056 (void) va_arg(*p_va
, Py_complex
*);
1059 #endif /* WITHOUT_COMPLEX */
1061 case 'c': /* char */
1063 (void) va_arg(*p_va
, char *);
1067 case 's': /* string */
1069 (void) va_arg(*p_va
, char **);
1070 if (*format
== '#') {
1071 (void) va_arg(*p_va
, int *);
1077 case 'z': /* string */
1079 (void) va_arg(*p_va
, char **);
1080 if (*format
== '#') {
1081 (void) va_arg(*p_va
, int *);
1087 case 'S': /* string object */
1089 (void) va_arg(*p_va
, PyObject
**);
1093 case 'O': /* object */
1095 if (*format
== '!') {
1097 (void) va_arg(*p_va
, PyTypeObject
*);
1098 (void) va_arg(*p_va
, PyObject
**);
1101 /* I don't know what this is for */
1102 else if (*format
== '?') {
1103 inquiry pred
= va_arg(*p_va
, inquiry
);
1106 (void) va_arg(*p_va
, PyObject
**);
1110 else if (*format
== '&') {
1111 typedef int (*converter
)
1112 Py_PROTO((PyObject
*, void *));
1113 (void) va_arg(*p_va
, converter
);
1114 (void) va_arg(*p_va
, void *);
1118 (void) va_arg(*p_va
, PyObject
**);
1124 return "impossible<bad format char>";