diff Python/getargs.c @ 20632:6c84d55abb58 legacy-trunk

PyArg_UnpackTuple(): New argument unpacking function suggested by Jim Fulton, based on code Jim supplied.
author Fred Drake <fdrake@acm.org>
date Tue, 23 Oct 2001 21:09:29 +0000
parents acc7e3b4d042
children e912b683ed3e
line wrap: on
line diff
--- a/Python/getargs.c	Tue Oct 23 20:26:16 2001 +0000
+++ b/Python/getargs.c	Tue Oct 23 21:09:29 2001 +0000
@@ -1360,3 +1360,63 @@
 	*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;
+}