diff options
Diffstat (limited to 'src-diclib/file_dic.c')
-rw-r--r-- | src-diclib/file_dic.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src-diclib/file_dic.c b/src-diclib/file_dic.c new file mode 100644 index 0000000..0df30e8 --- /dev/null +++ b/src-diclib/file_dic.c @@ -0,0 +1,65 @@ +#include <stdio.h> +#include <string.h> + +#include <anthy/diclib.h> +#include <anthy/filemap.h> +#include <anthy/alloc.h> +#include <anthy/conf.h> +#include <anthy/logger.h> +#include "diclib_inner.h" + +/** + 複数セクションがリンクされた辞書 + */ +struct file_dic +{ + struct filemapping *mapping; +}; + +static struct file_dic fdic; + +void* +anthy_file_dic_get_section(const char* section_name) +{ + int i; + char* head = anthy_mmap_address(fdic.mapping); + int* p = (int*)head; + int entry_num = anthy_dic_ntohl(*p++); + + for (i = 0; i < entry_num; ++i) { + int hash_offset = anthy_dic_ntohl(*p++); + int key_len = anthy_dic_ntohl(*p++); + int contents_offset = anthy_dic_ntohl(*p++); + if (strncmp(section_name, head + hash_offset, key_len) == 0) { + return (void*)(head + contents_offset); + } + } + return NULL; +} + +int +anthy_init_file_dic(void) +{ + const char *fn; + fn = anthy_conf_get_str("DIC_FILE"); + if (!fn) { + anthy_log(0, "dictionary is not specified.\n"); + return -1; + } + + /* 辞書をメモリ上にmapする */ + fdic.mapping = anthy_mmap(fn, 0); + if (!fdic.mapping) { + anthy_log(0, "failed to init file dic.\n"); + return -1; + } + + return 0; +} + +void +anthy_quit_file_dic(void) +{ + anthy_munmap(fdic.mapping); +} + |