changeset 24606:e4a733c34bc6

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.
author Siddharth Agarwal <sid0@fb.com>
date Tue, 31 Mar 2015 23:22:03 -0700
parents 98744856b7d3
children f5b527024fcc
files mercurial/parsers.c
diffstat 1 files changed, 14 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/parsers.c	Wed Apr 01 00:38:56 2015 -0700
+++ b/mercurial/parsers.c	Tue Mar 31 23:22:03 2015 -0700
@@ -115,7 +115,8 @@
 }
 
 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 @@
 	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 @@
 	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 @@
 	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);
 }
 
 /*