Author: yamakenz
Date: Sat Aug 11 08:58:08 2007
New Revision: 4828
Modified:
trunk/uim/iconv.c
trunk/uim/plugin.c
trunk/uim/uim-func.c
trunk/uim/uim-key.c
trunk/uim/uim-util.c
trunk/uim/uim.c
Log:
* This commit add the exception-based error handlings to all core uim
API functions. Each IM plugin and uim-{helper*,ipc} is not modified yet
* uim/uim.c
- (enum uim_result): New type
- (uim_init, uim_quit, uim_create_context, uim_release_context,
uim_reset_context, uim_focus_in_context, uim_focus_out_context,
uim_place_context, uim_displace_context, uim_set_preedit_cb,
uim_set_candidate_selector_cb, uim_get_candidate,
uim_get_candidate_internal, uim_candidate_get_cand_str,
uim_candidate_get_heading_label, uim_candidate_get_annotation_str,
uim_candidate_free, uim_get_candidate_index,
uim_set_candidate_index, uim_set_text_acquisition_cb,
uim_input_string, uim_set_configuration_changed_cb,
uim_set_im_switch_request_cb, uim_switch_im,
uim_get_current_im_name, uim_get_default_im_name,
uim_get_im_name_for_locale, uim_get_nr_modes, uim_get_mode_name,
uim_get_current_mode, uim_set_mode, uim_set_mode_cb,
uim_set_mode_list_update_cb, uim_set_prop_list_update_cb,
uim_set_prop_label_update_cb, uim_prop_list_update,
uim_prop_label_update, uim_prop_activate, uim_prop_update_custom,
uim_prop_reload_configs, uim_get_nr_im, uim_get_im_name,
uim_get_im_language, uim_get_im_encoding, uim_get_im_short_desc):
Add the exception-based error handlings
* uim/uim-key.c
- (uim_press_key, uim_release_key): Ditto
* uim/uim-util.c
- (uim_get_language_name_from_locale,
uim_get_language_code_from_language_name): Ditto
* uim/uim-func.c
- (im_pushback_mode_list): Ditto
* uim/plugin.c
- (plugin_load, uim_init_plugin, uim_quit_plugin): Ditto
* uim/iconv.c
- (check_encoding_equivalence, uim_iconv_is_convertible,
uim_iconv_open, uim_iconv_create, uim_iconv_code_conv,
uim_iconv_release): Ditto
Modified: trunk/uim/iconv.c
==============================================================================
--- trunk/uim/iconv.c (original)
+++ trunk/uim/iconv.c Sat Aug 11 08:58:08 2007
@@ -88,13 +88,13 @@
alias_fromcode = uim_get_encoding_alias(fromcode);
if (!alias_tocode) {
- alias_tocode = malloc(sizeof(char *) * 2);
+ alias_tocode = uim_malloc(sizeof(char *) * 2);
alias_tocode[0] = tocode;
alias_tocode[1] = NULL;
alias_tocode_alloced = 1;
}
if (!alias_fromcode) {
- alias_fromcode = malloc(sizeof(char *) * 2);
+ alias_fromcode = uim_malloc(sizeof(char *) * 2);
alias_fromcode[0] = fromcode;
alias_fromcode[1] = NULL;
alias_fromcode_alloced = 1;
@@ -123,6 +123,9 @@
{
iconv_t ic;
+ if (uim_catch_error_begin())
+ return UIM_FALSE;
+
assert(tocode);
assert(fromcode);
@@ -135,6 +138,8 @@
return UIM_FALSE;
iconv_close(ic);
+ uim_catch_error_end();
+
return UIM_TRUE;
}
@@ -172,13 +177,13 @@
alias_fromcode = uim_get_encoding_alias(fromcode);
if (!alias_tocode) {
- alias_tocode = malloc(sizeof(char *) * 2);
+ alias_tocode = uim_malloc(sizeof(char *) * 2);
alias_tocode[0] = tocode;
alias_tocode[1] = NULL;
alias_tocode_alloced = 1;
}
if (!alias_fromcode) {
- alias_fromcode = malloc(sizeof(char *) * 2);
+ alias_fromcode = uim_malloc(sizeof(char *) * 2);
alias_fromcode[0] = fromcode;
alias_fromcode[1] = NULL;
alias_fromcode_alloced = 1;
@@ -208,6 +213,9 @@
{
iconv_t ic;
+ if (uim_catch_error_begin())
+ return NULL;
+
assert(tocode);
assert(fromcode);
@@ -219,6 +227,9 @@
/* since iconv_t is not explicit pointer, use 0 instead of NULL */
ic = (iconv_t)0;
}
+
+ uim_catch_error_end();
+
return (void *)ic;
}
@@ -227,9 +238,12 @@
{
iconv_t ic;
size_t len, bufsize;
- char *outbuf, *realbuf;
+ char *outbuf, *realbuf, *copied;
const char *inbuf, *src;
+ if (uim_catch_error_begin())
+ return NULL;
+
if (!str)
return NULL;
@@ -248,7 +262,11 @@
src = str;
}
- return strdup(src);
+ copied = uim_strdup(src);
+
+ uim_catch_error_end();
+
+ return copied;
}
static void
@@ -256,6 +274,11 @@
{
int err;
+ if (uim_catch_error_begin())
+ return;
+
if (obj)
err = iconv_close((iconv_t)obj);
+
+ uim_catch_error_end();
}
Modified: trunk/uim/plugin.c
==============================================================================
--- trunk/uim/plugin.c (original)
+++ trunk/uim/plugin.c Sat Aug 11 08:58:08 2007
@@ -117,7 +117,7 @@
path_car = uim_scm_car(path_cdr);
path = uim_scm_refer_c_str(path_car);
len = strlen(path) + 1 + strlen(PLUGIN_PREFIX) + strlen(plugin_name)+
strlen(PLUGIN_SUFFIX) + 1;
- plugin_lib_filename = malloc(sizeof(char) * len);
+ plugin_lib_filename = uim_malloc(sizeof(char) * len);
snprintf(plugin_lib_filename, len, "%s/%s%s%s",
path, PLUGIN_PREFIX, plugin_name, PLUGIN_SUFFIX);
fd = open(plugin_lib_filename, O_RDONLY);
@@ -140,7 +140,7 @@
path_car = uim_scm_car(path_cdr);
path = uim_scm_refer_c_str(path_car);
len = strlen(path) + 1 + strlen(plugin_name)+ strlen(".scm") + 1;
- plugin_scm_filename = malloc(sizeof(char) * len);
+ plugin_scm_filename = uim_malloc(sizeof(char) * len);
snprintf(plugin_scm_filename, len, "%s/%s.scm", path, plugin_name);
fd = open(plugin_scm_filename, O_RDONLY);
if (fd >= 0) {
@@ -244,17 +244,25 @@
void
uim_init_plugin(void)
{
+ if (uim_catch_error_begin())
+ return;
+
uim_scm_init_subr_1("load-plugin", plugin_load);
uim_scm_init_subr_1("unload-plugin", plugin_unload);
- return;
+ uim_catch_error_end();
}
/* Called from uim_quit */
void
uim_quit_plugin(void)
{
+ if (uim_catch_error_begin())
+ return;
+
uim_scm_call_with_gc_ready_stack(uim_quit_plugin_internal, NULL);
+
+ uim_catch_error_end();
}
static void *
Modified: trunk/uim/uim-func.c
==============================================================================
--- trunk/uim/uim-func.c (original)
+++ trunk/uim/uim-func.c Sat Aug 11 08:58:08 2007
@@ -205,7 +205,7 @@
uc = retrieve_uim_context(uc_);
str = uim_scm_refer_c_str(str_);
- uc->modes = realloc(uc->modes, sizeof(char *) * (uc->nr_modes + 1));
+ uc->modes = uim_realloc(uc->modes, sizeof(char *) * (uc->nr_modes + 1));
uc->modes[uc->nr_modes] = uc->conv_if->convert(uc->outbound_conv, str);
uc->nr_modes++;
Modified: trunk/uim/uim-key.c
==============================================================================
--- trunk/uim/uim-key.c (original)
+++ trunk/uim/uim-key.c Sat Aug 11 08:58:08 2007
@@ -382,12 +382,18 @@
{
uim_bool filtered;
+ if (uim_catch_error_begin())
+ return PASSTHROUGH;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
assert(key >= 0);
assert(state >= 0);
filtered = filter_key(uc, key, state, UIM_TRUE);
+
+ uim_catch_error_end();
+
return (filtered) ? FILTERED : PASSTHROUGH;
}
@@ -396,12 +402,18 @@
{
uim_bool filtered;
+ if (uim_catch_error_begin())
+ return PASSTHROUGH;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
assert(key >= 0);
assert(state >= 0);
filtered = filter_key(uc, key, state, UIM_FALSE);
+
+ uim_catch_error_end();
+
return (filtered) ? FILTERED : PASSTHROUGH;
}
Modified: trunk/uim/uim-util.c
==============================================================================
--- trunk/uim/uim-util.c (original)
+++ trunk/uim/uim-util.c Sat Aug 11 08:58:08 2007
@@ -243,6 +243,10 @@
uim_get_language_name_from_locale(const char *locale)
{
uim_lisp lang_code, lang_name;
+ const char *name;
+
+ if (uim_catch_error_begin())
+ return "-";
assert(uim_scm_gc_any_contextp());
assert(locale);
@@ -253,20 +257,32 @@
lang_code = uim_scm_callf("langgroup-primary-lang-code", "s", locale);
protected =
lang_name = uim_scm_callf("lang-code->lang-name", "o", lang_code);
- return uim_scm_refer_c_str(lang_name);
+ name = uim_scm_refer_c_str(lang_name);
+
+ uim_catch_error_end();
+
+ return name;
}
const char *
uim_get_language_code_from_language_name(const char *language_name)
{
uim_lisp lang_code;
+ const char *name;
+
+ if (uim_catch_error_begin())
+ return "-";
assert(uim_scm_gc_any_contextp());
assert(language_name);
protected =
lang_code = uim_scm_callf("lang-name->lang-code", "s", language_name);
- return uim_scm_refer_c_str(lang_code);
+ name = uim_scm_refer_c_str(lang_code);
+
+ uim_catch_error_end();
+
+ return name;
}
static uim_lisp
Modified: trunk/uim/uim.c
==============================================================================
--- trunk/uim/uim.c (original)
+++ trunk/uim/uim.c Sat Aug 11 08:58:08 2007
@@ -45,7 +45,10 @@
#include "uim-scm-abbrev.h"
-#define OK 0
+enum uim_result {
+ FAILED = -1,
+ OK = 0
+};
static void fatal_error_hook(void);
@@ -83,6 +86,7 @@
int
uim_init(void)
{
+ int ret;
char *sys_load_path;
if (uim_initialized)
@@ -90,11 +94,18 @@
uim_init_error();
+ if (uim_catch_error_begin())
+ return FAILED;
+
sys_load_path = (uim_issetugid()) ? NULL : getenv("LIBUIM_SYSTEM_SCM_FILES");
uim_scm_init(sys_load_path);
uim_scm_set_fatal_error_hook(fatal_error_hook);
- return
(int)uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_init_internal,
NULL);
+ ret =
(int)uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_init_internal,
NULL);
+
+ uim_catch_error_end();
+
+ return ret;
}
static void *
@@ -141,6 +152,11 @@
if (!uim_initialized)
return;
+ if (uim_catch_error_begin()) {
+ /* Leave uim_initialized uncleared to keep libuim disabled. */
+ return;
+ }
+
uim_quit_plugin();
#ifdef ENABLE_ANTHY_STATIC
uim_anthy_plugin_instance_quit();
@@ -163,17 +179,18 @@
uim_context uc;
uim_lisp lang_, engine_;
+ if (uim_catch_error_begin())
+ return NULL;
+
assert(uim_scm_gc_any_contextp());
- uc = malloc(sizeof(*uc));
- if (!uc)
- return NULL;
+ uc = uim_malloc(sizeof(*uc));
memset(uc, 0, sizeof(*uc));
/* encoding handlings */
if (!enc)
enc = "UTF-8";
- uc->client_encoding = strdup(enc);
+ uc->client_encoding = uim_strdup(enc);
uc->conv_if = (conv) ? conv : uim_iconv;
/* variables */
@@ -192,6 +209,8 @@
uim_scm_gc_protect(&uc->sc);
uim_scm_callf("setup-context", "o", uc->sc);
+ uim_catch_error_end();
+
return uc;
}
@@ -200,6 +219,9 @@
{
int i;
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
@@ -217,51 +239,78 @@
free(uc->modes);
free(uc->client_encoding);
free(uc);
+
+ uim_catch_error_end();
}
void
uim_reset_context(uim_context uc)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
uim_scm_callf("reset-handler", "p", uc);
+
+ uim_catch_error_end();
}
void
uim_focus_in_context(uim_context uc)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
uim_scm_callf("focus-in-handler", "p", uc);
+
+ uim_catch_error_end();
}
void
uim_focus_out_context(uim_context uc)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
uim_scm_callf("focus-out-handler", "p", uc);
+
+ uim_catch_error_end();
}
void
uim_place_context(uim_context uc)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
uim_scm_callf("place-handler", "p", uc);
+
+ uim_catch_error_end();
}
void
uim_displace_context(uim_context uc)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
uim_scm_callf("displace-handler", "p", uc);
+
+ uim_catch_error_end();
}
void
@@ -270,12 +319,17 @@
void (*pushback_cb)(void *ptr, int attr, const char *str),
void (*update_cb)(void *ptr))
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
uc->preedit_clear_cb = clear_cb;
uc->preedit_pushback_cb = pushback_cb;
uc->preedit_update_cb = update_cb;
+
+ uim_catch_error_end();
}
void
@@ -286,6 +340,9 @@
void (*shift_page_cb)(void *ptr, int direction),
void (*deactivate_cb)(void *ptr))
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
@@ -293,12 +350,18 @@
uc->candidate_selector_select_cb = select_cb;
uc->candidate_selector_deactivate_cb = deactivate_cb;
uc->candidate_selector_shift_page_cb = shift_page_cb;
+
+ uim_catch_error_end();
}
uim_candidate
uim_get_candidate(uim_context uc, int index, int accel_enumeration_hint)
{
struct uim_get_candidate_args args;
+ uim_candidate cand;
+
+ if (uim_catch_error_begin())
+ return NULL;
assert(uim_scm_gc_any_contextp());
assert(uc);
@@ -309,7 +372,11 @@
args.index = index;
args.enum_hint = accel_enumeration_hint;
- return
(uim_candidate)uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_get_candidate_internal,
&args);
+ cand =
(uim_candidate)uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_get_candidate_internal,
&args);
+
+ uim_catch_error_end();
+
+ return cand;
}
static void *
@@ -323,28 +390,33 @@
uc = args->uc;
triple = uim_scm_callf("get-candidate", "pii",
uc, args->index, args->enum_hint);
+ uim_scm_ensure(uim_scm_length(triple) == 3);
- cand = malloc(sizeof(*cand));
- if (cand) {
- memset(cand, 0, sizeof(*cand));
- if (uim_scm_length(triple) == 3) {
- str = uim_scm_refer_c_str(CAR(triple));
- head = uim_scm_refer_c_str(CAR(CDR(triple)));
- ann = uim_scm_refer_c_str(CAR(CDR(CDR((triple)))));
- cand->str = uc->conv_if->convert(uc->outbound_conv, str);
- cand->heading_label = uc->conv_if->convert(uc->outbound_conv, head);
- cand->annotation = uc->conv_if->convert(uc->outbound_conv, ann);
- }
- }
+ cand = uim_malloc(sizeof(*cand));
+ memset(cand, 0, sizeof(*cand));
+
+ str = uim_scm_refer_c_str(CAR(triple));
+ head = uim_scm_refer_c_str(CAR(CDR(triple)));
+ ann = uim_scm_refer_c_str(CAR(CDR(CDR((triple)))));
+ cand->str = uc->conv_if->convert(uc->outbound_conv, str);
+ cand->heading_label = uc->conv_if->convert(uc->outbound_conv, head);
+ cand->annotation = uc->conv_if->convert(uc->outbound_conv, ann);
return (void *)cand;
}
+/* Accepts NULL candidates that produced by an error on uim_get_candidate(). */
const char *
uim_candidate_get_cand_str(uim_candidate cand)
{
+ if (uim_catch_error_begin())
+ return "";
+
assert(uim_scm_gc_any_contextp());
- assert(cand);
+ if (!cand)
+ uim_fatal_error("null candidate");
+
+ uim_catch_error_end();
return cand->str;
}
@@ -352,8 +424,14 @@
const char *
uim_candidate_get_heading_label(uim_candidate cand)
{
+ if (uim_catch_error_begin())
+ return "";
+
assert(uim_scm_gc_any_contextp());
- assert(cand);
+ if (!cand)
+ uim_fatal_error("null candidate");
+
+ uim_catch_error_end();
return cand->heading_label;
}
@@ -361,8 +439,14 @@
const char *
uim_candidate_get_annotation_str(uim_candidate cand)
{
+ if (uim_catch_error_begin())
+ return "";
+
assert(uim_scm_gc_any_contextp());
- assert(cand);
+ if (!cand)
+ uim_fatal_error("null candidate");
+
+ uim_catch_error_end();
return cand->annotation;
}
@@ -370,32 +454,48 @@
void
uim_candidate_free(uim_candidate cand)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
- assert(cand);
+ if (!cand)
+ uim_fatal_error("null candidate");
free(cand->str);
free(cand->heading_label);
free(cand->annotation);
free(cand);
+
+ uim_catch_error_end();
}
int
uim_get_candidate_index(uim_context uc)
{
+ if (uim_catch_error_begin())
+ return 0;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
+ uim_catch_error_end();
+
return 0;
}
void
uim_set_candidate_index(uim_context uc, int nth)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
assert(nth >= 0);
uim_scm_callf("set-candidate-index", "pi", uc, nth);
+
+ uim_catch_error_end();
}
void
@@ -409,19 +509,28 @@
enum UTextOrigin origin,
int former_len, int latter_len))
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
uc->acquire_text_cb = acquire_cb;
uc->delete_text_cb = delete_cb;
+
+ uim_catch_error_end();
}
uim_bool
uim_input_string(uim_context uc, const char *str)
{
+ uim_bool ret;
uim_lisp consumed;
char *conv;
+ if (uim_catch_error_begin())
+ return UIM_FALSE;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
assert(str);
@@ -432,10 +541,14 @@
consumed = uim_scm_callf("input-string-handler", "ps", uc, conv);
free(conv);
- return uim_scm_c_bool(consumed);
+ ret = uim_scm_c_bool(consumed);
+ } else {
+ ret = UIM_FALSE;
}
- return UIM_FALSE;
+ uim_catch_error_end();
+
+ return ret;
}
/****************************************************************
@@ -445,10 +558,15 @@
uim_set_configuration_changed_cb(uim_context uc,
void (*changed_cb)(void *ptr))
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
uc->configuration_changed_cb = changed_cb;
+
+ uim_catch_error_end();
}
void
@@ -457,16 +575,24 @@
void (*sw_system_im_cb)(void *ptr,
const char *name))
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
uc->switch_app_global_im_cb = sw_app_im_cb;
uc->switch_system_global_im_cb = sw_system_im_cb;
+
+ uim_catch_error_end();
}
void
uim_switch_im(uim_context uc, const char *engine)
{
+ if (uim_catch_error_begin())
+ return;
+
/* related to the commit log of r1400:
We should not add the API uim_destroy_context(). We should move
@@ -482,46 +608,70 @@
assert(engine);
uim_scm_callf("uim-switch-im", "py", uc, engine);
+
+ uim_catch_error_end();
}
const char *
uim_get_current_im_name(uim_context uc)
{
- uim_lisp im;
+ uim_lisp im, ret;
+ const char *name;
+
+ if (uim_catch_error_begin())
+ return "direct";
assert(uim_scm_gc_any_contextp());
assert(uc);
protected0 = im = uim_scm_callf("uim-context-im", "p", uc);
- if (UIM_SCM_FALSEP(im))
- return NULL;
+ protected1 = ret = uim_scm_callf("im-name", "o", im);
+ name = uim_scm_refer_c_str(ret);
+
+ uim_catch_error_end();
- return uim_scm_refer_c_str(uim_scm_callf("im-name", "o", im));
+ return name;
}
const char *
uim_get_default_im_name(const char *localename)
{
uim_lisp ret;
+ const char *name;
+
+ if (uim_catch_error_begin())
+ return "direct";
assert(uim_scm_gc_any_contextp());
assert(localename);
protected0 = ret = uim_scm_callf("uim-get-default-im-name", "s", localename);
- return uim_scm_refer_c_str(ret);
+ name = uim_scm_refer_c_str(ret);
+
+ uim_catch_error_end();
+
+ return name;
}
const char *
uim_get_im_name_for_locale(const char *localename)
{
uim_lisp ret;
+ const char *name;
+
+ if (uim_catch_error_begin())
+ return "direct";
assert(uim_scm_gc_any_contextp());
assert(localename);
protected0 =
ret = uim_scm_callf("uim-get-im-name-for-locale", "s", localename);
- return uim_scm_refer_c_str(ret);
+ name = uim_scm_refer_c_str(ret);
+
+ uim_catch_error_end();
+
+ return name;
}
/****************************************************************
@@ -530,60 +680,88 @@
int
uim_get_nr_modes(uim_context uc)
{
+ if (uim_catch_error_begin())
+ return 0;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
+ uim_catch_error_end();
+
return uc->nr_modes;
}
const char *
uim_get_mode_name(uim_context uc, int nth)
{
+ if (uim_catch_error_begin())
+ return NULL;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
assert(nth >= 0);
+ assert(nth < uc->nr_modes);
- if (nth >= 0 && nth < uc->nr_modes) {
- return uc->modes[nth];
- }
- return NULL;
+ uim_catch_error_end();
+
+ return uc->modes[nth];
}
int
uim_get_current_mode(uim_context uc)
{
+ if (uim_catch_error_begin())
+ return 0;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
+ uim_catch_error_end();
+
return uc->mode;
}
void
uim_set_mode(uim_context uc, int mode)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
assert(mode >= 0);
uc->mode = mode;
uim_scm_callf("mode-handler", "pi", uc, mode);
+
+ uim_catch_error_end();
}
void
uim_set_mode_cb(uim_context uc, void (*update_cb)(void *ptr, int mode))
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
+ uim_catch_error_end();
+
uc->mode_update_cb = update_cb;
}
void
uim_set_mode_list_update_cb(uim_context uc, void (*update_cb)(void *ptr))
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
+ uim_catch_error_end();
+
uc->mode_list_update_cb = update_cb;
}
@@ -594,10 +772,15 @@
uim_set_prop_list_update_cb(uim_context uc,
void (*update_cb)(void *ptr, const char *str))
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
uc->prop_list_update_cb = update_cb;
+
+ uim_catch_error_end();
}
/* Obsolete */
@@ -605,36 +788,56 @@
uim_set_prop_label_update_cb(uim_context uc,
void (*update_cb)(void *ptr, const char *str))
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
+
+ uim_catch_error_end();
}
void
uim_prop_list_update(uim_context uc)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
if (uc->propstr && uc->prop_list_update_cb)
uc->prop_list_update_cb(uc->ptr, uc->propstr);
+
+ uim_catch_error_end();
}
/* Obsolete */
void
uim_prop_label_update(uim_context uc)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
+
+ uim_catch_error_end();
}
void
uim_prop_activate(uim_context uc, const char *str)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
assert(str);
uim_scm_callf("prop-activate-handler", "ps", uc, str);
+
+ uim_catch_error_end();
}
/****************************************************************
@@ -658,6 +861,9 @@
void
uim_prop_update_custom(uim_context uc, const char *custom, const char *val)
{
+ if (uim_catch_error_begin())
+ return;
+
assert(uim_scm_gc_any_contextp());
assert(uc);
assert(custom);
@@ -665,15 +871,23 @@
uim_scm_callf("custom-set-handler", "pyo",
uc, custom, uim_scm_eval_c_string(val));
+
+ uim_catch_error_end();
}
uim_bool
uim_prop_reload_configs(void)
{
+ if (uim_catch_error_begin())
+ return UIM_FALSE;
+
assert(uim_scm_gc_any_contextp());
/* FIXME: handle return value properly. */
uim_scm_callf("custom-reload-user-configs", "");
+
+ uim_catch_error_end();
+
return UIM_TRUE;
}
@@ -683,13 +897,21 @@
int
uim_get_nr_im(uim_context uc)
{
- uim_lisp n;
+ uim_lisp n_;
+ int n;
+
+ if (uim_catch_error_begin())
+ return 0;
assert(uim_scm_gc_any_contextp());
assert(uc);
- protected0 = n = uim_scm_callf("uim-n-convertible-ims", "p", uc);
- return uim_scm_c_int(n);
+ protected0 = n_ = uim_scm_callf("uim-n-convertible-ims", "p", uc);
+ n = uim_scm_c_int(n_);
+
+ uim_catch_error_end();
+
+ return n;
}
static uim_lisp
@@ -705,54 +927,71 @@
const char *
uim_get_im_name(uim_context uc, int nth)
{
- uim_lisp im, str;
+ uim_lisp im, str_;
+ const char *str;
- protected0 = im = get_nth_im(uc, nth);
- if (UIM_SCM_FALSEP(im))
+ if (uim_catch_error_begin())
return NULL;
- protected1 = str = uim_scm_callf("im-name", "o", im);
+ protected0 = im = get_nth_im(uc, nth);
+ protected1 = str_ = uim_scm_callf("im-name", "o", im);
+ str = uim_scm_refer_c_str(str_);
+
+ uim_catch_error_end();
- return uim_scm_refer_c_str(str);
+ return str;
}
const char *
uim_get_im_language(uim_context uc, int nth)
{
- uim_lisp im, str;
+ uim_lisp im, str_;
+ const char *str;
- protected0 = im = get_nth_im(uc, nth);
- if (UIM_SCM_FALSEP(im))
+ if (uim_catch_error_begin())
return NULL;
- protected1 = str = uim_scm_callf("im-lang", "o", im);
+ protected0 = im = get_nth_im(uc, nth);
+ protected1 = str_ = uim_scm_callf("im-lang", "o", im);
+ str = uim_scm_refer_c_str(str_);
+
+ uim_catch_error_end();
- return uim_scm_refer_c_str(str);
+ return str;
}
const char *
uim_get_im_encoding(uim_context uc, int nth)
{
- uim_lisp im, str;
+ uim_lisp im, str_;
+ const char *str;
- protected0 = im = get_nth_im(uc, nth);
- if (UIM_SCM_FALSEP(im))
+ if (uim_catch_error_begin())
return NULL;
- protected1 = str = uim_scm_callf("im-encoding", "o", im);
+ protected0 = im = get_nth_im(uc, nth);
+ protected1 = str_ = uim_scm_callf("im-encoding", "o", im);
+ str = uim_scm_refer_c_str(str_);
+
+ uim_catch_error_end();
- return uim_scm_refer_c_str(str);
+ return str;
}
const char *
uim_get_im_short_desc(uim_context uc, int nth)
{
uim_lisp im, short_desc;
+ const char *str;
- protected0 = im = get_nth_im(uc, nth);
- if (UIM_SCM_FALSEP(im))
+ if (uim_catch_error_begin())
return NULL;
+ protected0 = im = get_nth_im(uc, nth);
protected1 = short_desc = uim_scm_callf("im-short-desc", "o", im);
- return UIM_SCM_FALSEP(short_desc) ? "-" : uim_scm_refer_c_str(short_desc);
+ str = UIM_SCM_FALSEP(short_desc) ? "-" : uim_scm_refer_c_str(short_desc);
+
+ uim_catch_error_end();
+
+ return str;
}