diff options
author | Choe Hwanjin <choe.hwanjin@gmail.com> | 2006-10-02 00:35:17 +0900 |
---|---|---|
committer | Choe Hwanjin <choe.hwanjin@gmail.com> | 2006-10-02 00:35:17 +0900 |
commit | 24437f6f0da4846ee28a28a4be0387e97d649dac (patch) | |
tree | 66de147bf7ca01f97e615ed6c132e5114b06953e | |
parent | 06d29636af5f421ddcfbf160e43f7ca9ef05a7f1 (diff) | |
download | libhangul-24437f6f0da4846ee28a28a4be0387e97d649dac.tar.gz |
hangul/hangul.h,hangul/hanja.c:
* remove hanja_table_match() and add hanja_table_match_prefix() and
hanja_table_match_suffix()
git-svn-id: http://kldp.net/svn/hangul/libhangul/trunk@77 8f00fcd2-89fc-0310-932e-b01be5b65e01
-rw-r--r-- | hangul/hangul.h | 10 | ||||
-rw-r--r-- | hangul/hanja.c | 54 |
2 files changed, 48 insertions, 16 deletions
diff --git a/hangul/hangul.h b/hangul/hangul.h index 5d9bc97..11cd84a 100644 --- a/hangul/hangul.h +++ b/hangul/hangul.h @@ -102,11 +102,6 @@ const ucschar* hangul_ic_get_commit_string(HangulInputContext *hic); const ucschar* hangul_ic_flush(HangulInputContext *hic); /* hanja.c */ -enum { - HANJA_MATCH_EXACT, - HANJA_MATCH_PREFIX -}; - typedef struct _Hanja Hanja; typedef struct _HanjaList HanjaList; typedef struct _HanjaTable HanjaTable; @@ -129,8 +124,9 @@ struct _HanjaTable { }; HanjaTable* hanja_table_load(const char *filename); -HanjaList* hanja_table_match(const HanjaTable* table, - int option, const char *key); +HanjaList* hanja_table_match_prefix(const HanjaTable* table, const char *key); +HanjaList* hanja_table_match_suffix(const HanjaTable* table, const char *key); + void hanja_table_destroy(HanjaTable *table); void hanja_list_destroy(HanjaList *list); diff --git a/hangul/hanja.c b/hangul/hanja.c index ccaa5f6..43773dc 100644 --- a/hangul/hanja.c +++ b/hangul/hanja.c @@ -49,14 +49,9 @@ static const char utf8_skip_table[256] = { 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 }; -static inline char *h_nth_char(char *p, int n) +static inline int h_char_len(const char *p) { - while (n > 0) { - p += utf8_skip_table[*(unsigned char*)p]; - n--; - } - - return p; + return utf8_skip_table[*(const unsigned char*)p]; } static struct slist * @@ -258,7 +253,7 @@ hanja_table_compare(const void *key, const void *item) } HanjaList* -hanja_table_match(const HanjaTable* table, int option, const char *key) +hanja_table_match_prefix(const HanjaTable* table, const char *key) { char *p; char newkey[64] = { '\0', }; @@ -267,7 +262,7 @@ hanja_table_match(const HanjaTable* table, int option, const char *key) struct slist *items = NULL; strncpy(newkey, key, sizeof(newkey)); - p = h_nth_char(newkey, 1); + p = newkey + h_char_len(newkey); *p = '\0'; list = bsearch(newkey, @@ -295,6 +290,47 @@ hanja_table_match(const HanjaTable* table, int option, const char *key) return NULL; } +HanjaList* +hanja_table_match_suffix(const HanjaTable* table, const char *key) +{ + const char *p; + char newkey[64] = { '\0', }; + HanjaList **list = NULL; + HanjaList *ret; + struct slist *items = NULL; + + p = key; + strncpy(newkey, p, sizeof(newkey)); + newkey[h_char_len(newkey)] = '\0'; + while (strlen(newkey) > 0) { + list = bsearch(newkey, + table->base, table->nmember, + sizeof(HanjaList*), + hanja_table_compare); + + if (list != NULL) { + int i; + for (i = 0; i < (*list)->nitems; i++) { + if (strcmp(p, (*list)->items[i]->key) == 0) { + items = slist_append(items, (*list)->items[i]); + } + } + } + + p += h_char_len(p); + strncpy(newkey, p, sizeof(newkey)); + newkey[h_char_len(newkey)] = '\0'; + } + + if (items != NULL) { + ret = hanja_list_new_from_slist(key, items); + slist_delete(items); + return ret; + } + + return NULL; +} + void hanja_table_destroy(HanjaTable *table) { |