# HG changeset patch # User Bryan O'Sullivan # Date 1355346573 28800 # Node ID 0459c6555f69ef47c044ca333fa7ff9204e9fa0a # Parent e9ea0f0f05e72e6bcce81a47417fcac43f86f89f store: implement lowerencode in C diff -r e9ea0f0f05e7 -r 0459c6555f69 mercurial/parsers.c --- a/mercurial/parsers.c Tue Jan 15 22:34:56 2013 +0100 +++ b/mercurial/parsers.c Wed Dec 12 13:09:33 2012 -0800 @@ -1508,6 +1508,7 @@ PyObject *encodedir(PyObject *self, PyObject *args); PyObject *pathencode(PyObject *self, PyObject *args); +PyObject *lowerencode(PyObject *self, PyObject *args); static PyMethodDef methods[] = { {"pack_dirstate", pack_dirstate, METH_VARARGS, "pack a dirstate\n"}, @@ -1516,6 +1517,7 @@ {"parse_index2", parse_index2, METH_VARARGS, "parse a revlog index\n"}, {"encodedir", encodedir, METH_VARARGS, "encodedir a path\n"}, {"pathencode", pathencode, METH_VARARGS, "fncache-encode a path\n"}, + {"lowerencode", lowerencode, METH_VARARGS, "lower-encode a path\n"}, {NULL, NULL} }; diff -r e9ea0f0f05e7 -r 0459c6555f69 mercurial/pathencode.c --- a/mercurial/pathencode.c Tue Jan 15 22:34:56 2013 +0100 +++ b/mercurial/pathencode.c Wed Dec 12 13:09:33 2012 -0800 @@ -15,6 +15,7 @@ * required. */ +#define PY_SSIZE_T_CLEAN #include #include #include @@ -481,6 +482,47 @@ static const Py_ssize_t maxstorepathlen = 120; +static Py_ssize_t _lowerencode(char *dest, size_t destsize, + const char *src, Py_ssize_t len) +{ + static const uint32_t onebyte[8] = { + 1, 0x2bfffbfb, 0xe8000001, 0x2fffffff + }; + + static const uint32_t lower[8] = { 0, 0, 0x7fffffe }; + + Py_ssize_t i, destlen = 0; + + for (i = 0; i < len; i++) { + if (inset(onebyte, src[i])) + charcopy(dest, &destlen, destsize, src[i]); + else if (inset(lower, src[i])) + charcopy(dest, &destlen, destsize, src[i] + 32); + else + escape3(dest, &destlen, destsize, src[i]); + } + + return destlen; +} + +PyObject *lowerencode(PyObject *self, PyObject *args) +{ + char *path; + Py_ssize_t len, newlen; + PyObject *ret; + + if (!PyArg_ParseTuple(args, "s#:lowerencode", &path, &len)) + return NULL; + + newlen = _lowerencode(NULL, 0, path, len); + ret = PyString_FromStringAndSize(NULL, newlen); + if (ret) + newlen = _lowerencode(PyString_AS_STRING(ret), newlen, + path, len); + + return ret; +} + /* * We currently implement only basic encoding. * diff -r e9ea0f0f05e7 -r 0459c6555f69 mercurial/store.py --- a/mercurial/store.py Tue Jan 15 22:34:56 2013 +0100 +++ b/mercurial/store.py Wed Dec 12 13:09:33 2012 -0800 @@ -132,7 +132,7 @@ cmap[chr(x)] = chr(x).lower() return lambda s: "".join([cmap[c] for c in s]) -lowerencode = _buildlowerencodefun() +lowerencode = getattr(parsers, 'lowerencode', None) or _buildlowerencodefun() # Windows reserved names: con, prn, aux, nul, com1..com9, lpt1..lpt9 _winres3 = ('aux', 'con', 'prn', 'nul') # length 3