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;
 }

Reply via email to