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.
--- a/mercurial/parsers.c Tue Mar 31 14:01:33 2015 -0700
+++ b/mercurial/parsers.c Tue Mar 31 10:25:29 2015 -0700
@@ -93,14 +93,14 @@
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 @@
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.