Mercurial > libguess
diff guess.c @ 0:d9b6ff839eab
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Fri, 30 Nov 2007 19:34:51 +0900 |
parents | |
children | 8a64459dab94 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/guess.c Fri Nov 30 19:34:51 2007 +0900 @@ -0,0 +1,55 @@ +#include "libguess.h" + +typedef struct _guess_impl { + struct _guess_impl *next; + const char *name; + const char *(*impl)(const char *buf, int len); +} guess_impl; + +static guess_impl *guess_impl_list = NULL; + +void guess_impl_register(const char *lang, + const char *(*impl)(const char *buf, int len)) +{ + guess_impl *iptr = calloc(sizeof(guess_impl), 1); + + iptr->name = lang; + iptr->impl = impl; + iptr->next = guess_impl_list; + + guess_impl_list = iptr; +} + +void guess_init(void) +{ + /* check if already initialized */ + if (guess_impl_list != NULL) + return; + + 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); +} + +const char *guess_encoding(const char *inbuf, int buflen, const char *lang) +{ + guess_impl *iter; + + guess_init(); + + for (iter = guess_impl_list; iter != NULL; iter = iter->next) + { + if (!strcasecmp(lang, iter->name)) + return iter->impl(inbuf, buflen); + } + + /* TODO: try other languages as fallback? */ + + return NULL; +}