[PATCH 2 of 6 foldmap-in-C] parsers._asciitransform: also accept a fallback function
Siddharth Agarwal
sid0 at fb.com
Thu Apr 2 23:02:15 CDT 2015
# HG changeset patch
# User Siddharth Agarwal <sid0 at fb.com>
# Date 1427869323 25200
# Tue Mar 31 23:22:03 2015 -0700
# Node ID e76c0533d7ef1091fa1ac4252f66bbcda3073780
# Parent a0f05ad01122ba8cd3653af01f4dfd13a839dc02
parsers._asciitransform: also accept a fallback function
This function will be used in upcoming patches to provide a C implementation of
the function to generate the foldmap.
diff --git a/mercurial/parsers.c b/mercurial/parsers.c
--- a/mercurial/parsers.c
+++ b/mercurial/parsers.c
@@ -115,7 +115,8 @@ PyObject *unhexlify(const char *str, int
}
static inline PyObject *_asciitransform(PyObject *str_obj,
- const char table[128])
+ const char table[128],
+ PyObject *fallback_fn)
{
char *str, *newstr;
Py_ssize_t i, len;
@@ -134,11 +135,16 @@ static inline PyObject *_asciitransform(
for (i = 0; i < len; i++) {
char c = str[i];
if (c & 0x80) {
- PyObject *err = PyUnicodeDecodeError_Create(
- "ascii", str, len, i, (i + 1),
- "unexpected code byte");
- PyErr_SetObject(PyExc_UnicodeDecodeError, err);
- Py_XDECREF(err);
+ if (fallback_fn != NULL) {
+ ret = PyObject_CallFunctionObjArgs(fallback_fn,
+ str_obj, NULL);
+ } else {
+ PyObject *err = PyUnicodeDecodeError_Create(
+ "ascii", str, len, i, (i + 1),
+ "unexpected code byte");
+ PyErr_SetObject(PyExc_UnicodeDecodeError, err);
+ Py_XDECREF(err);
+ }
goto quit;
}
newstr[i] = table[(unsigned char)c];
@@ -156,7 +162,7 @@ static PyObject *asciilower(PyObject *se
PyObject *str_obj;
if (!PyArg_ParseTuple(args, "O!:asciilower", &PyBytes_Type, &str_obj))
return NULL;
- return _asciitransform(str_obj, lowertable);
+ return _asciitransform(str_obj, lowertable, NULL);
}
static PyObject *asciiupper(PyObject *self, PyObject *args)
@@ -164,7 +170,7 @@ static PyObject *asciiupper(PyObject *se
PyObject *str_obj;
if (!PyArg_ParseTuple(args, "O!:asciiupper", &PyBytes_Type, &str_obj))
return NULL;
- return _asciitransform(str_obj, uppertable);
+ return _asciitransform(str_obj, uppertable, NULL);
}
/*
More information about the Mercurial-devel
mailing list