9 using namespace stardict_collation;
11 static CHARSET_INFO *get_cs(CollateFunctions func)
14 if (func == UTF8_GENERAL_CI)
15 cs = &my_charset_utf8_general_ci;
16 else if (func == UTF8_BIN)
17 cs = &my_charset_utf8_bin;
18 else if (func == UTF8_UNICODE_CI)
19 cs = &my_charset_utf8_general_uca_ci;
20 else if (func == UTF8_ICELANDIC_CI)
21 cs = &my_charset_utf8_icelandic_uca_ci;
22 else if (func == UTF8_LATVIAN_CI)
23 cs = &my_charset_utf8_latvian_uca_ci;
24 else if (func == UTF8_ROMANIAN_CI)
25 cs = &my_charset_utf8_romanian_uca_ci;
26 else if (func == UTF8_SLOVENIAN_CI)
27 cs = &my_charset_utf8_slovenian_uca_ci;
28 else if (func == UTF8_POLISH_CI)
29 cs = &my_charset_utf8_polish_uca_ci;
30 else if (func == UTF8_ESTONIAN_CI)
31 cs = &my_charset_utf8_estonian_uca_ci;
32 else if (func == UTF8_SPANISH_CI)
33 cs = &my_charset_utf8_spanish_uca_ci;
34 else if (func == UTF8_SWEDISH_CI)
35 cs = &my_charset_utf8_swedish_uca_ci;
36 else if (func == UTF8_TURKISH_CI)
37 cs = &my_charset_utf8_turkish_uca_ci;
38 else if (func == UTF8_CZECH_CI)
39 cs = &my_charset_utf8_czech_uca_ci;
40 else if (func == UTF8_DANISH_CI)
41 cs = &my_charset_utf8_danish_uca_ci;
42 else if (func == UTF8_LITHUANIAN_CI)
43 cs = &my_charset_utf8_lithuanian_uca_ci;
44 else if (func == UTF8_SLOVAK_CI)
45 cs = &my_charset_utf8_slovak_uca_ci;
46 else if (func == UTF8_SPANISH2_CI)
47 cs = &my_charset_utf8_spanish2_uca_ci;
48 else if (func == UTF8_ROMAN_CI)
49 cs = &my_charset_utf8_roman_uca_ci;
50 else if (func == UTF8_PERSIAN_CI)
51 cs = &my_charset_utf8_persian_uca_ci;
52 else if (func == UTF8_ESPERANTO_CI)
53 cs = &my_charset_utf8_esperanto_uca_ci;
54 else if (func == UTF8_HUNGARIAN_CI)
55 cs = &my_charset_utf8_hungarian_uca_ci;
61 static GSList *my_once_root_block = NULL;
63 static void *my_once_alloc(uint size)
65 void *mem = g_malloc(size);
66 my_once_root_block = g_slist_prepend (my_once_root_block, mem);
70 static void my_once_free()
72 GSList *list = my_once_root_block;
77 g_slist_free(my_once_root_block);
78 my_once_root_block = NULL;
81 int utf8_collate_init(CollateFunctions func)
83 CHARSET_INFO *cs = get_cs(func);
85 if ((cs->cset->init && cs->cset->init(cs, my_once_alloc)) ||
86 (cs->coll->init && cs->coll->init(cs, my_once_alloc)))
94 int utf8_collate_init_all()
97 for (int func=0; func<COLLATE_FUNC_NUMS; func++) {
98 cs = get_cs((CollateFunctions)func);
100 if ((cs->cset->init && cs->cset->init(cs, my_once_alloc)) ||
101 (cs->coll->init && cs->coll->init(cs, my_once_alloc)))
109 int utf8_collate(const char *str1, const char *str2, CollateFunctions func)
111 CHARSET_INFO *cs = get_cs(func);
113 return cs->coll->strnncoll(cs, (const uchar*)str1, strlen(str1), (const uchar*)str2, strlen(str2), 0);
115 return 0; //Should never happen.
118 void utf8_collate_end()