From 97bd4f161cb970b9aacf1e3b2a33721aaa4988a2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 4 Dec 2010 09:45:45 -0700 Subject: [PATCH] Speed up ICU key generation by not preflighting in most cases --- src/calibre/utils/icu.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/calibre/utils/icu.c b/src/calibre/utils/icu.c index 81f3ef4e9a..f981abe62e 100644 --- a/src/calibre/utils/icu.c +++ b/src/calibre/utils/icu.c @@ -108,11 +108,22 @@ icu_Collator_sort_key(icu_Collator *self, PyObject *args, PyObject *kwargs) { PyMem_Free(input); if (U_SUCCESS(status)) { - key_size = ucol_getSortKey(self->collator, buf, -1, NULL, 0); - buf2 = (uint8_t*)calloc(key_size + 1, sizeof(uint8_t)); + buf2 = (uint8_t*)calloc(7*sz+1, sizeof(uint8_t)); if (buf2 == NULL) return PyErr_NoMemory(); - ucol_getSortKey(self->collator, buf, -1, buf2, key_size+1); - ans = PyBytes_FromString((char *)buf2); + + key_size = ucol_getSortKey(self->collator, buf, -1, buf2, 7*sz+1); + + if (key_size == 0) { + ans = PyBytes_FromString(""); + } else { + if (key_size >= 7*sz+1) { + free(buf2); + buf2 = (uint8_t*)calloc(key_size+1, sizeof(uint8_t)); + if (buf2 == NULL) return PyErr_NoMemory(); + ucol_getSortKey(self->collator, buf, -1, buf2, key_size+1); + } + ans = PyBytes_FromString((char *)buf2); + } free(buf2); } else ans = PyBytes_FromString("");