summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2014-03-25 11:08:14 +0800
committerPeng Wu <alexepico@gmail.com>2014-03-25 11:08:14 +0800
commit0e49d2a18e3fda2edee5829a60aa11c2401c3408 (patch)
treee7369b509faab244dc8174e38e44c2a207f6c481 /src
parent293e128ea1af4ea6177b13d31df8796d5d028cf3 (diff)
downloadibus-libzhuyin-0e49d2a18e3fda2edee5829a60aa11c2401c3408.tar.gz
ibus-libzhuyin-0e49d2a18e3fda2edee5829a60aa11c2401c3408.tar.xz
ibus-libzhuyin-0e49d2a18e3fda2edee5829a60aa11c2401c3408.zip
write class TradSimpConverter
Diffstat (limited to 'src')
-rw-r--r--src/ZYTradSimpConverter.cc84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/ZYTradSimpConverter.cc b/src/ZYTradSimpConverter.cc
new file mode 100644
index 0000000..fceadb7
--- /dev/null
+++ b/src/ZYTradSimpConverter.cc
@@ -0,0 +1,84 @@
+/* vim:set et ts=4 sts=4:
+ *
+ * ibus-libzhuyin - New Zhuyin engine based on libzhuyin for IBus
+ *
+ * Copyright (c) 2014 Peng Wu <alexepico@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "ZYTradSimpConverter.h"
+
+#include <opencc.h>
+
+#include "ZYTypes.h"
+#include "ZYString.h"
+
+namespace ZY {
+
+class opencc {
+ static const int BUFFER_SIZE = 64;
+public:
+ opencc (void)
+ {
+ m_cc = opencc_open (OPENCC_DEFAULT_CONFIG_TRAD_TO_SIMP);
+ g_assert (m_cc != NULL);
+ }
+
+ ~opencc (void)
+ {
+ opencc_close (m_cc);
+ }
+
+ void convert (const gchar *in, String &out)
+ {
+ glong n_char;
+ gunichar *in_ucs4 = g_utf8_to_ucs4_fast (in, -1, &n_char);
+
+ ucs4_t *pinbuf = (ucs4_t *)in_ucs4;
+ size_t inbuf_left = n_char;
+ while (inbuf_left != 0) {
+ ucs4_t *poutbuf = (ucs4_t *)m_buffer;
+ size_t outbuf_left = BUFFER_SIZE;
+ size_t retval = opencc_convert(m_cc, &pinbuf, &inbuf_left, &poutbuf, &outbuf_left);
+ if (retval == (size_t) -1) {
+ /* append left chars in pinbuf */
+ g_warning ("opencc_convert return failed");
+ out << (gunichar *) pinbuf;
+ break;
+ }
+ *poutbuf = L'\0';
+ out << m_buffer;
+ }
+ g_free (in_ucs4);
+ }
+
+private:
+ opencc_t m_cc;
+ gunichar m_buffer[BUFFER_SIZE + 1];
+};
+
+void
+TradSimpConverter::tradToSimp (const gchar *in, String &out)
+{
+ static opencc cc;
+ cc.convert (in, out);
+}
+
+};