diff --git a/Doc/api/utilities.tex b/Doc/api/utilities.tex index 9cc7a193509..0d71cd90073 100644 --- a/Doc/api/utilities.tex +++ b/Doc/api/utilities.tex @@ -145,7 +145,7 @@ values from C values. \begin{cfuncdesc}{PyObject*}{PyImport_AddModule}{char *name} Return the module object corresponding to a module name. The - \var{name} argument may be of the form \code{package.module}). + \var{name} argument may be of the form \code{package.module}. First check the modules dictionary if there's one there, and if not, create a new one and insert it in the modules dictionary. Return \NULL{} with an exception set on failure. @@ -675,6 +675,12 @@ return false and raise an appropriate exception. failure, it returns false and raises the appropriate exception. \end{cfuncdesc} +\begin{cfuncdesc}{int}{PyArg_VaParse}{PyObject *args, char *format, + va_list vargs} + Identical to \cfunction{PyArg_ParseTuple()}, except that it accepts a + va_list rather than a variable number of arguments. +\end{cfuncdesc} + \begin{cfuncdesc}{int}{PyArg_ParseTupleAndKeywords}{PyObject *args, PyObject *kw, char *format, char *keywords[], \moreargs} @@ -683,6 +689,13 @@ return false and raise an appropriate exception. on failure, it returns false and raises the appropriate exception. \end{cfuncdesc} +\begin{cfuncdesc}{int}{PyArg_VaParseTupleAndKeywords}{PyObject *args, + PyObject *kw, char *format, char *keywords[], + va_list vargs} + Identical to \cfunction{PyArg_ParseTupleAndKeywords()}, except that it + accepts a va_list rather than a variable number of arguments. +\end{cfuncdesc} + \begin{cfuncdesc}{int}{PyArg_Parse}{PyObject *args, char *format, \moreargs} Function used to deconstruct the argument lists of ``old-style'' diff --git a/Include/modsupport.h b/Include/modsupport.h index 7e6992148f5..2d67f3e59bb 100644 --- a/Include/modsupport.h +++ b/Include/modsupport.h @@ -17,6 +17,8 @@ PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, char *, int, int, ...); PyAPI_FUNC(PyObject *) Py_BuildValue(char *, ...); PyAPI_FUNC(int) PyArg_VaParse(PyObject *, char *, va_list); +PyAPI_FUNC(int) PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, + char *, char **, va_list); PyAPI_FUNC(PyObject *) Py_VaBuildValue(char *, va_list); PyAPI_FUNC(int) PyModule_AddObject(PyObject *, char *, PyObject *); diff --git a/Misc/NEWS b/Misc/NEWS index af94bdddec9..40052977047 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.4 alpha 2? Core and builtins ----------------- +- Patch #550732: Add PyArg_VaParseTupleAndKeywords(). Analogous to +PyArg_VaParse(). Both are now documented. Thanks Greg Chapman. + - Allow string and unicode return types from .encode()/.decode() methods on string and unicode objects. Added unicode.decode() which was missing for no apparent reason. diff --git a/Python/getargs.c b/Python/getargs.c index 72194a86a0e..cd7633c4101 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -12,6 +12,9 @@ int PyArg_VaParse(PyObject *, char *, va_list); int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, char *, char **, ...); +int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, + char *, char **, va_list); + /* Forward */ static int vgetargs1(PyObject *, char *, va_list *, int); @@ -1153,6 +1156,39 @@ PyArg_ParseTupleAndKeywords(PyObject *args, } +int +PyArg_VaParseTupleAndKeywords(PyObject *args, + PyObject *keywords, + char *format, + char **kwlist, va_list va) +{ + int retval; + va_list lva; + + if ((args == NULL || !PyTuple_Check(args)) || + (keywords != NULL && !PyDict_Check(keywords)) || + format == NULL || + kwlist == NULL) + { + PyErr_BadInternalCall(); + return 0; + } + +#ifdef VA_LIST_IS_ARRAY + memcpy(lva, va, sizeof(va_list)); +#else +#ifdef __va_copy + __va_copy(lva, va); +#else + lva = va; +#endif +#endif + + retval = vgetargskeywords(args, keywords, format, kwlist, &lva); + return retval; +} + + static int vgetargskeywords(PyObject *args, PyObject *keywords, char *format, char **kwlist, va_list *p_va)