mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Faster implementation of utf16_length
This commit is contained in:
parent
d337debc92
commit
d3c2d8cd6f
@ -993,14 +993,26 @@ icu_string_length(PyObject *self, PyObject *args) {
|
|||||||
// utf16_length {{{
|
// utf16_length {{{
|
||||||
static PyObject *
|
static PyObject *
|
||||||
icu_utf16_length(PyObject *self, PyObject *args) {
|
icu_utf16_length(PyObject *self, PyObject *args) {
|
||||||
|
#if PY_VERSION_HEX >= 0x03030000
|
||||||
|
#error Not implemented for python >= 3.3
|
||||||
|
#endif
|
||||||
|
|
||||||
int32_t sz = 0;
|
int32_t sz = 0;
|
||||||
UChar *icu = NULL;
|
|
||||||
PyObject *src = NULL;
|
PyObject *src = NULL;
|
||||||
|
#ifdef Py_UNICODE_WIDE
|
||||||
|
int32_t i = 0, t = 0;
|
||||||
|
Py_UNICODE *data = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "O", &src)) return NULL;
|
if (!PyArg_ParseTuple(args, "U", &src)) return NULL;
|
||||||
icu = python_to_icu(src, &sz, 1);
|
sz = PyUnicode_GET_SIZE(src);
|
||||||
if (icu == NULL) return NULL;
|
#ifdef Py_UNICODE_WIDE
|
||||||
free(icu);
|
data = PyUnicode_AS_UNICODE(src);
|
||||||
|
for (i = 0; i < sz; i++) {
|
||||||
|
t += (data[i] > 0xffff) ? 2 : 1;
|
||||||
|
}
|
||||||
|
sz = t;
|
||||||
|
#endif
|
||||||
return Py_BuildValue("i", sz);
|
return Py_BuildValue("i", sz);
|
||||||
} // }}}
|
} // }}}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user