# HG changeset patch # User Siddharth Agarwal # Date 2015-03-31 17:25:29 # Node ID e97a00bf18ae4156ba1590ae08bf204db29ca132 # Parent 701d3554de0e47f224239eac7023f9d7ee13c9c4 parsers: factor out most of asciilower into an internal function We're going to reuse this in upcoming patches. The change to Py_ssize_t is necessary because parsers.c doesn't define PY_SSIZE_T_CLEAN. That macro changes the behavior of PyArg_ParseTuple but not PyBytes_GET_SIZE. diff --git a/mercurial/parsers.c b/mercurial/parsers.c --- a/mercurial/parsers.c +++ b/mercurial/parsers.c @@ -93,14 +93,14 @@ PyObject *unhexlify(const char *str, int return ret; } -static PyObject *asciilower(PyObject *self, PyObject *args) +static inline PyObject *_asciilower(PyObject *str_obj) { char *str, *newstr; - int i, len; + Py_ssize_t i, len; PyObject *newobj = NULL; - if (!PyArg_ParseTuple(args, "s#", &str, &len)) - goto quit; + str = PyBytes_AS_STRING(str_obj); + len = PyBytes_GET_SIZE(str_obj); newobj = PyBytes_FromStringAndSize(NULL, len); if (!newobj) @@ -127,6 +127,14 @@ quit: return NULL; } +static PyObject *asciilower(PyObject *self, PyObject *args) +{ + PyObject *str_obj; + if (!PyArg_ParseTuple(args, "O!:asciilower", &PyBytes_Type, &str_obj)) + return NULL; + return _asciilower(str_obj); +} + /* * This code assumes that a manifest is stitched together with newline * ('\n') characters.