diff options
author | Fred Drake <fdrake@acm.org> | 2001-10-23 21:09:29 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2001-10-23 21:09:29 (GMT) |
commit | e4616e67525be58454db078594776c98450d8810 (patch) | |
tree | dcb340aed385280299166e6e9d5433da069bab5d /Python | |
parent | 4855b0255437a30ff6565bf7b61dd91ac076f052 (diff) | |
download | cpython-e4616e67525be58454db078594776c98450d8810.zip cpython-e4616e67525be58454db078594776c98450d8810.tar.gz cpython-e4616e67525be58454db078594776c98450d8810.tar.bz2 |
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fulton, based on code Jim supplied.
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; +} |