diff --git a/honoka/plugins/skkdic.cpp b/honoka/plugins/skkdic.cpp index 6fffbfd..59d3600 100644 --- a/honoka/plugins/skkdic.cpp +++ b/honoka/plugins/skkdic.cpp @@ -19,6 +19,7 @@ ***************************************************************************/ #include "skkdic.h" +#include using namespace Honoka; @@ -26,6 +27,7 @@ SKKDic::SKKDic(String file) { filename = file; + fd = -1; iconv.set_encoding("EUC-JP"); init(); } @@ -33,6 +35,10 @@ SKKDic::~SKKDic() { + if (fd != -1) { + munmap(mmapptr,mmapsize); + close(fd); + } } @@ -43,6 +49,25 @@ */ void SKKDic::init() { + if (1) { + fd = open(filename.c_str(),O_RDONLY); + if (fd == -1) return; + mmapsize = lseek(fd,0,SEEK_END); + if (mmapsize == -1) { + close(fd); + fd = -1; + return; + } + void *ptr = mmap(0,mmapsize,PROT_READ,MAP_PRIVATE,fd,0); + if (ptr == MAP_FAILED) { + close(fd); + fd = -1; + return; + } + mmapptr = (char *)ptr; + return; + } + bool okuri = true; FILE *f = fopen(filename.c_str(),"r"); if (!f) return; @@ -112,8 +137,40 @@ { vector d; map::iterator it = dic_data.find(text); - if (it == dic_data.end()) return d; - if (it->second.cache) return it->second.data; + if (it != dic_data.end()) { + if (it->second.cache) return it->second.data; + } + + if (fd != -1) { + String t; + iconv.convert(t,text); + char *p = mmapptr; + while(p < mmapptr + mmapsize) { + if ((strncmp(p,t.c_str(),t.length()) == 0) && (p[t.length()] == ' ')) { + string r; + for(unsigned int i = 1;p[t.length() + i] != '\n';i ++) { + r += p[t.length() + i]; + } + WideString w; + iconv.convert(w,r); + vector l = parser(w); + SKKDicEntry dic; + for(unsigned int i = 1;i < l.size();i ++) { + SKKDicEntryData e = annotationParser(l[i]); + dic.data.push_back(e); + } + iconv.convert(w,t); + dic_data.insert(pair(w,dic)); + return dic.data; + } else { + while(1) { + p ++; + if (*p == '\n') break; + } + p ++; + } + } + } return d; } diff --git a/honoka/plugins/skkdic.h b/honoka/plugins/skkdic.h index beaed5d..56d561d 100644 --- a/honoka/plugins/skkdic.h +++ b/honoka/plugins/skkdic.h @@ -27,6 +27,11 @@ #include #include #include +#include +#include +#include +#include +#include #define Uses_SCIM_UTILITY #define Uses_SCIM_ICONV @@ -64,6 +69,9 @@ String filename; IConvert iconv; map dic_data; + int fd; + char *mmapptr; + off_t mmapsize; protected: void init(); vector parser(const WideString data);