summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChoe Hwanjin <choe.hwanjin@gmail.com>2006-10-02 00:35:17 +0900
committerChoe Hwanjin <choe.hwanjin@gmail.com>2006-10-02 00:35:17 +0900
commit24437f6f0da4846ee28a28a4be0387e97d649dac (patch)
tree66de147bf7ca01f97e615ed6c132e5114b06953e
parent06d29636af5f421ddcfbf160e43f7ca9ef05a7f1 (diff)
downloadlibhangul-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.h10
-rw-r--r--hangul/hanja.c54
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)
{