diff options
Diffstat (limited to 'src/libguess/guess.c')
-rw-r--r-- | src/libguess/guess.c | 66 |
1 files changed, 31 insertions, 35 deletions
diff --git a/src/libguess/guess.c b/src/libguess/guess.c index 2a3845c..fe5934e 100644 --- a/src/libguess/guess.c +++ b/src/libguess/guess.c @@ -1,54 +1,50 @@ -#include "libguess.h" +#include <strings.h> -mowgli_patricia_t *guess_impl_list = NULL; +#include "libguess.h" -void strcasecanon(char *str) +struct guess_impl { + const char *lang; + guess_impl_f impl; +}; + +static const struct guess_impl guess_impl_list[] = { + {GUESS_REGION_JP, guess_jp}, + {GUESS_REGION_TW, guess_tw}, + {GUESS_REGION_CN, guess_cn}, + {GUESS_REGION_KR, guess_kr}, + {GUESS_REGION_RU, guess_ru}, + {GUESS_REGION_AR, guess_ar}, + {GUESS_REGION_TR, guess_tr}, + {GUESS_REGION_GR, guess_gr}, + {GUESS_REGION_HW, guess_hw}, + {GUESS_REGION_PL, guess_pl}, + {GUESS_REGION_BL, guess_bl}, +}; + +static guess_impl_f +guess_find_impl(const char *lang) { - while (*str) - { - *str = toupper(*str); - str++; - } -} + int i; -static void -guess_impl_register(const char *lang, guess_impl_f impl) -{ - return_if_fail(guess_impl_list != NULL); + for (i = 0; i < sizeof(guess_impl_list) / sizeof(guess_impl_list[0]); i++) { + if (!strcasecmp(guess_impl_list[i].lang, lang)) + return guess_impl_list[i].impl; + } - mowgli_patricia_add(guess_impl_list, lang, impl); + return 0; } void libguess_init(void) { - /* check if already initialized */ - if (guess_impl_list != NULL) - return; - - guess_impl_list = mowgli_patricia_create(strcasecanon); - - guess_impl_register(GUESS_REGION_JP, guess_jp); - guess_impl_register(GUESS_REGION_TW, guess_tw); - guess_impl_register(GUESS_REGION_CN, guess_cn); - guess_impl_register(GUESS_REGION_KR, guess_kr); - guess_impl_register(GUESS_REGION_RU, guess_ru); - guess_impl_register(GUESS_REGION_AR, guess_ar); - guess_impl_register(GUESS_REGION_TR, guess_tr); - guess_impl_register(GUESS_REGION_GR, guess_gr); - guess_impl_register(GUESS_REGION_HW, guess_hw); - guess_impl_register(GUESS_REGION_PL, guess_pl); - guess_impl_register(GUESS_REGION_BL, guess_bl); + /* provided for API compatibility with older versions */ } const char * libguess_determine_encoding(const char *inbuf, int buflen, const char *lang) { - guess_impl_f impl; - - libguess_init(); + guess_impl_f impl = guess_find_impl(lang); - impl = mowgli_patricia_retrieve(guess_impl_list, lang); if (impl != NULL) return impl(inbuf, buflen); |