PyArg_UnpackTuple(): New argument unpacking function suggested by Jim

Fulton, based on code Jim supplied.
This commit is contained in:
Fred Drake 2001-10-23 21:09:29 +00:00
parent 4855b02554
commit e4616e6752
2 changed files with 61 additions and 0 deletions

View 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);

View 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;
}