char* convert_text_to_translit(const char *text) { int i, j, len = strlen(text); char *trans_text = (char *)xnmalloc((len * 3 + 1) * sizeof(char)); for(i = 0, j = 0; i < len; i++) { if (isascii(text[i])) { trans_text[j++] = text[i]; continue; } const char *new_symbol = get_translit(&text[i]); for(; i < len - 1; i++) { if (isascii(text[i + 1])) break; if (get_translit(&text[i + 1]) != NULLSYM) break; } while (*new_symbol != NULLSYM) { trans_text[j++] = *new_symbol; new_symbol++; } } trans_text[j] = NULLSYM; return trans_text; }
static void test_fts_icu_translate_resize(void) { const char *translit_id = "Any-Hex"; const char *src_utf8 = "FOO"; buffer_t *dest, *src_utf16; UTransliterator *translit; const char *error; unsigned int i; test_begin("fts_icu_translate_resize resize"); src_utf16 = buffer_create_dynamic(pool_datastack_create(), 16); translit = get_translit(translit_id); for (i = 2; i <= 20; i++) { buffer_set_used_size(src_utf16, 0); fts_icu_utf8_to_utf16(src_utf16, src_utf8); dest = buffer_create_dynamic(pool_datastack_create(), i); test_assert(buffer_get_size(dest) == i); test_assert(fts_icu_translate(dest, src_utf16->data, src_utf16->used/sizeof(UChar), translit, &error) == 0); } utrans_close(translit); test_end(); }
void convert_text_to_translit(char **work_text) { char *text = *work_text; int j = 0, len = strlen(text); char *trans_text = (char *) malloc((len * 3 + 1) * sizeof(char)); for (int i = 0; i < len; i++) { if (isascii(text[i])) { trans_text[j++] = text[i]; continue; } const char *new_symbol = get_translit(&text[i]); for(; i < len - 1; i++) { if (isascii(text[i + 1])) break; if (get_translit(&text[i + 1]) != NULLSYM) break; } while (*new_symbol != NULLSYM) { trans_text[j++] = *new_symbol; new_symbol++; } } trans_text[j] = NULLSYM; free(*work_text); *work_text = trans_text; }
static void test_fts_icu_translate(void) { const char *translit_id = "Any-Lower"; UTransliterator *translit; buffer_t *dest = buffer_create_dynamic(pool_datastack_create(), 64); const UChar src[] = { 0xbd, 'B', 'C' }; const char *error; unsigned int i; test_begin("fts_icu_translate"); translit = get_translit(translit_id); for (i = N_ELEMENTS(src); i > 0; i--) { buffer_set_used_size(dest, 0); test_assert(fts_icu_translate(dest, src, i, translit, &error) == 0); test_assert(dest->used == i * sizeof(UChar)); } utrans_close(translit); test_end(); }