diff options
Diffstat (limited to 'Python')
-rw-r--r-- | Python/getargs.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/Python/getargs.c b/Python/getargs.c index 592d247..6593a82 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -1360,3 +1360,63 @@ skipitem(char **p_format, va_list *p_va) *p_format = format; return NULL; } + + +int +PyArg_UnpackTuple(PyObject *args, char *name, int min, int max, ...) +{ + int i, l; + PyObject **o; + va_list vargs; + +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, max); +#else + va_start(vargs); +#endif + + assert(min >= 0); + assert(min <= max); + if (!PyTuple_Check(args)) { + PyErr_SetString(PyExc_SystemError, + "PyArg_UnpackTuple() argument list is not a tuple"); + return 0; + } + l = PyTuple_GET_SIZE(args); + if (l < min) { + if (name != NULL) + PyErr_Format( + PyExc_TypeError, + "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at least "), min, l); + else + PyErr_Format( + PyExc_TypeError, + "unpacked tuple should have %s%d elements," + " but has %d", + (min == max ? "" : "at least "), min, l); + va_end(vargs); + return 0; + } + if (l > max) { + if (name != NULL) + PyErr_Format( + PyExc_TypeError, + "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at most "), max, l); + else + PyErr_Format( + PyExc_TypeError, + "unpacked tuple should have %s%d elements," + " but has %d", + (min == max ? "" : "at most "), max, l); + va_end(vargs); + return 0; + } + for (i = 0; i < l; i++) { + o = va_arg(vargs, PyObject **); + *o = PyTuple_GET_ITEM(args, i); + } + va_end(vargs); + return 1; +} |