diff options
Diffstat (limited to 'win32/HanjaDic.cxx')
-rw-r--r-- | win32/HanjaDic.cxx | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/win32/HanjaDic.cxx b/win32/HanjaDic.cxx index 94fc10b06..3a86ad313 100644 --- a/win32/HanjaDic.cxx +++ b/win32/HanjaDic.cxx @@ -97,26 +97,30 @@ public: } }; -int GetHangulOfHanja(int hanjaChar) { - // Convert hanja character to hangul one. - int hangulChar = -1; // If fails, return -1. +int GetHangulOfHanja(wchar_t *inout) { + // Convert every hanja to hangul. + // Return the number of characters converted. + int changed = 0; HanjaDic dict; - if (!dict.HJdictAvailable() || !dict.IsHanja(hanjaChar)) { - return hangulChar; - } - wchar_t convHnja[UTF8MaxBytes] = {0}; - convHnja[0] = static_cast<wchar_t>(hanjaChar); - - BSTR bstrHangul = SysAllocString(NULL); - BSTR bstrHanja = SysAllocString(convHnja); - HRESULT hr = dict.HJinterface->HanjaToHangul(bstrHanja, &bstrHangul); - if (SUCCEEDED(hr)) { - wchar_t wHangul = static_cast<wchar_t *>(bstrHangul)[0]; - hangulChar = static_cast<int>(wHangul); + if (dict.HJdictAvailable()) { + const size_t len = wcslen(inout); + wchar_t conv[UTF8MaxBytes] = {0}; + BSTR bstrHangul = SysAllocString(conv); + for (size_t i=0; i<len; i++) { + if (dict.IsHanja(static_cast<int>(inout[i]))) { // Pass hanja only! + conv[0] = inout[i]; + BSTR bstrHanja = SysAllocString(conv); + HRESULT hr = dict.HJinterface->HanjaToHangul(bstrHanja, &bstrHangul); + if (SUCCEEDED(hr)) { + inout[i] = static_cast<wchar_t>(bstrHangul[0]); + changed += 1; + } + SysFreeString(bstrHanja); + } + } + SysFreeString(bstrHangul); } - SysFreeString(bstrHangul); - SysFreeString(bstrHanja); - return hangulChar; + return changed; } } |