ports/textproc/uim/files/patch-uim_anthy.c

124 lines
3 KiB
C

--- uim/anthy.c.orig 2017-08-14 00:07:27 UTC
+++ uim/anthy.c
@@ -40,6 +40,7 @@
#include "uim.h"
#include "uim-scm.h"
#include "uim-scm-abbrev.h"
+#include "uim-util.h"
#include "dynlib.h"
@@ -51,6 +52,9 @@ void uim_anthy_plugin_instance_quit(void);
static uim_bool initialized;
static uim_lisp context_list;
+static void *iconv_cd_e2u;
+static void *iconv_cd_u2e;
+
static void
validate_segment_index(anthy_context_t ac, int i)
{
@@ -96,15 +100,26 @@ init_anthy_lib(void)
}
static uim_lisp
-create_context(void)
+create_context(uim_lisp encoding_)
{
anthy_context_t ac;
uim_lisp ac_;
+ int encoding;
+ /* 0: compiled, 1: EUC-JP, 2: UTF-8 */
+ encoding = C_INT(encoding_);
+
+ if (!iconv_cd_e2u)
+ iconv_cd_e2u = uim_iconv->create("UTF-8", "EUC-JP");
+
+ if (!iconv_cd_u2e)
+ iconv_cd_u2e = uim_iconv->create("EUC-JP", "UTF-8");
+
ac = anthy_create_context();
if (!ac)
uim_fatal_error("anthy_create_context() failed");
+ anthy_context_set_encoding(ac, encoding);
ac_ = MAKE_PTR(ac);
context_list = uim_scm_callf("cons", "oo", ac_, context_list);
@@ -338,6 +353,42 @@ commit_nth_prediction(uim_lisp ac_, uim_lisp nth_)
#endif
}
+static uim_lisp
+eucjp_to_utf8(uim_lisp str_)
+{
+ const char *str;
+ char *convstr;
+ uim_lisp utf8_;
+
+ if (!iconv_cd_e2u)
+ return MAKE_STR("");
+
+ str = REFER_C_STR(str_);
+ convstr = uim_iconv->convert(iconv_cd_e2u, str);
+ utf8_ = MAKE_STR(convstr);
+ free(convstr);
+
+ return utf8_;
+}
+
+static uim_lisp
+utf8_to_eucjp(uim_lisp str_)
+{
+ const char *str;
+ char *convstr;
+ uim_lisp eucjp_;
+
+ if (!iconv_cd_u2e)
+ return MAKE_STR("");
+
+ str = REFER_C_STR(str_);
+ convstr = uim_iconv->convert(iconv_cd_u2e, str);
+ eucjp_ = MAKE_STR(convstr);
+ free(convstr);
+
+ return eucjp_;
+}
+
#ifndef ENABLE_ANTHY_STATIC
void
uim_plugin_instance_init(void)
@@ -352,7 +403,7 @@ uim_anthy_plugin_instance_init(void)
uim_scm_eval_c_string("(require-extension (srfi 1))"); /* for delete! */
uim_scm_init_proc0("anthy-lib-init", init_anthy_lib);
- uim_scm_init_proc0("anthy-lib-alloc-context", create_context);
+ uim_scm_init_proc1("anthy-lib-alloc-context", create_context);
uim_scm_init_proc1("anthy-lib-free-context", release_context);
uim_scm_init_proc2("anthy-lib-set-string", set_string);
uim_scm_init_proc1("anthy-lib-get-nr-segments",get_nr_segments);
@@ -368,6 +419,8 @@ uim_anthy_plugin_instance_init(void)
uim_scm_init_proc2("anthy-lib-get-nth-prediction", get_nth_prediction);
uim_scm_init_proc2("anthy-lib-commit-nth-prediction",
commit_nth_prediction);
+ uim_scm_init_proc1("anthy-lib-eucjp-to-utf8", eucjp_to_utf8);
+ uim_scm_init_proc1("anthy-lib-utf8-to-eucjp", utf8_to_eucjp);
}
#ifndef ENABLE_ANTHY_STATIC
@@ -385,5 +438,14 @@ uim_anthy_plugin_instance_quit(void)
anthy_quit();
initialized = UIM_FALSE;
+
+ if (iconv_cd_e2u) {
+ uim_iconv->release(iconv_cd_e2u);
+ iconv_cd_e2u = NULL;
+ }
+ if (iconv_cd_u2e) {
+ uim_iconv->release(iconv_cd_u2e);
+ iconv_cd_u2e = NULL;
+ }
}
}