summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2001-10-23 21:09:29 (GMT)
committerFred Drake <fdrake@acm.org>2001-10-23 21:09:29 (GMT)
commite4616e67525be58454db078594776c98450d8810 (patch)
treedcb340aed385280299166e6e9d5433da069bab5d /Python
parent4855b0255437a30ff6565bf7b61dd91ac076f052 (diff)
downloadcpython-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.c60
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;
+}