summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2004-07-10 22:20:32 (GMT)
committerBrett Cannon <bcannon@gmail.com>2004-07-10 22:20:32 (GMT)
commit711e7d97e4bebec002233e7caa72fc43ffba06a5 (patch)
tree80f45e962986f89ebc408731e51b276d0ab741f3
parent9a2a1cb031f9149ca6bfaf7b43ae0955d16db9b1 (diff)
downloadcpython-711e7d97e4bebec002233e7caa72fc43ffba06a5.zip
cpython-711e7d97e4bebec002233e7caa72fc43ffba06a5.tar.gz
cpython-711e7d97e4bebec002233e7caa72fc43ffba06a5.tar.bz2
Add PyArg_VaParseTupleAndKeywords(). Document this function and
PyArg_VaParse(). Closes patch #550732. Thanks Greg Chapman.
-rw-r--r--Doc/api/utilities.tex15
-rw-r--r--Include/modsupport.h2
-rw-r--r--Misc/NEWS3
-rw-r--r--Python/getargs.c36
4 files changed, 55 insertions, 1 deletions
diff --git a/Doc/api/utilities.tex b/Doc/api/utilities.tex
index 9cc7a19..0d71cd9 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 7e69921..2d67f3e 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 af94bdd..4005297 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 72194a8..cd7633c 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)