]> granicus.if.org Git - python/commitdiff
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
authorFred Drake <fdrake@acm.org>
Tue, 23 Oct 2001 21:09:29 +0000 (21:09 +0000)
committerFred Drake <fdrake@acm.org>
Tue, 23 Oct 2001 21:09:29 +0000 (21:09 +0000)
    Fulton, based on code Jim supplied.

Include/modsupport.h
Python/getargs.c

index 8ef343c6d755f22961739db540230349dc5270c5..ccbabffd946c4a5b624be584c1057481adb4ec0b 100644 (file)
@@ -13,6 +13,7 @@ extern DL_IMPORT(int) PyArg_Parse(PyObject *, char *, ...);
 extern DL_IMPORT(int) PyArg_ParseTuple(PyObject *, char *, ...);
 extern DL_IMPORT(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
                                                   char *, char **, ...);
+extern DL_IMPORT(int) PyArg_UnpackTuple(PyObject *, char *, int, int, ...);
 extern DL_IMPORT(PyObject *) Py_BuildValue(char *, ...);
 
 extern DL_IMPORT(int) PyArg_VaParse(PyObject *, char *, va_list);
index 592d247ae01f3dc76d0add1897b6d120d988bd76..6593a82fb7f3ccecc618fb87a5eecd433319efb7 100644 (file)
@@ -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;
+}