diff options
| author | BYVoid <byvoid1@gmail.com> | 2010-07-05 16:29:48 +0800 |
|---|---|---|
| committer | BYVoid <byvoid1@gmail.com> | 2010-07-05 16:29:48 +0800 |
| commit | f46a3755384fb6dab200d42c059d3d9ec6ebbbf3 (patch) | |
| tree | e406876298023f3fe0be318066d7961b15115085 /src | |
| parent | 4b0a1b6d39fa13a401c70b3ed1f3d293904e8b45 (diff) | |
| download | ibus-libpinyin-f46a3755384fb6dab200d42c059d3d9ec6ebbbf3.tar.gz ibus-libpinyin-f46a3755384fb6dab200d42c059d3d9ec6ebbbf3.tar.xz ibus-libpinyin-f46a3755384fb6dab200d42c059d3d9ec6ebbbf3.zip | |
Revert to OpenCC C language API
Diffstat (limited to 'src')
| -rw-r--r-- | src/SimpTradConverter.cc | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/src/SimpTradConverter.cc b/src/SimpTradConverter.cc index 1da4720..877e3c3 100644 --- a/src/SimpTradConverter.cc +++ b/src/SimpTradConverter.cc @@ -42,19 +42,39 @@ namespace PY { void SimpTradConverter::simpToTrad (const gchar *in, String &out) { - static opencc::converter conv (opencc::converter::CONFIG_SIMP_TO_TRAD); - static std::string inbuf, outbuf; - - inbuf = (const char *) in; - - if (conv == -1 || conv.convert (inbuf, outbuf) == -1) + const static int BUFFER_SIZE = 64; + static gunichar buf[BUFFER_SIZE + 1]; + gunichar *in_ucs4; + wchar_t * pinbuf, * poutbuf; + size_t inbuf_left, outbuf_left; + + in_ucs4 = g_utf8_to_ucs4_fast (in, -1, NULL); + pinbuf = (wchar_t *)in_ucs4; + poutbuf = (wchar_t *)buf; + inbuf_left = std::wcslen ((wchar_t *) pinbuf); + outbuf_left = BUFFER_SIZE; + + opencc_t od = opencc_open(OPENCC_DEFAULT_CONFIG_SIMP_TO_TRAD); + + size_t retv; + while ((retv = opencc_convert(od, &pinbuf, &inbuf_left, &poutbuf, &outbuf_left)) > 0) { - g_warning ("An error occurs in SimpTradConverter:"); - conv.perror (); - return; + if (retv == (size_t) -1) + { + g_warning ("SimpTradConverter:"); + opencc_perror("Opencc:"); + g_free (in_ucs4); + return; + } + + *poutbuf = L'\0'; + out << buf; + outbuf_left = BUFFER_SIZE; + poutbuf = (wchar_t *)buf; } - out << outbuf.c_str (); + opencc_close(od); + g_free (in_ucs4); } #else |
