Mercurial > public > mercurial-scm > hg-stable
diff mercurial/pathencode.c @ 18430:0459c6555f69
store: implement lowerencode in C
author | Bryan O'Sullivan <bryano@fb.com> |
---|---|
date | Wed, 12 Dec 2012 13:09:33 -0800 |
parents | 0696b1793f4b |
children | 3aa9b2136593 |
line wrap: on
line diff
--- 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 <Python.h> #include <assert.h> #include <ctype.h> @@ -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. *