Author: yamakenz
Date: Sat Aug 11 10:36:39 2007
New Revision: 4829
Modified:
trunk/doc/COMPATIBILITY
trunk/uim/uim-error.c
trunk/uim/uim-internal.h
Log:
* This commit fix the broken exceptoin-based error handlings. Now
uim_throw_error() and uim_fatal_error() are actually recovered
without application termination
* uim/uim-internal.h
- Include setjmp.h
- (JMP_BUF, SETJMP, LONGJMP): Moved from uim-error.c
- (uim_print_caught_error, uim_caught_fatal_error,
uim_catch_error_begin_pre, uim_catch_error_begin_post): New function decl
- (uim_catch_error_begin): New macro
- (uim_catch_block_env): New variable decl
* uim/uim-error.c
- Exclude setjmp.h
- (JMP_BUF, SETJMP, LONGJMP): Move to uim-internal.h
- (env, uim_catch_block_env): Replace static var env with
public uim_catch_block_env
- (uim_print_caught_error, uim_caught_fatal_error,
uim_catch_error_begin_pre, uim_catch_error_begin_post): New
function
- (uim_catch_error_begin): Removed and replaced with the same name
macro in uim-internal.h
- (uim_throw_error): Follow the renaming of env
* doc/COMPATIBILITY
- Update
Modified: trunk/doc/COMPATIBILITY
==============================================================================
--- trunk/doc/COMPATIBILITY (original)
+++ trunk/doc/COMPATIBILITY Sat Aug 11 10:36:39 2007
@@ -81,8 +81,8 @@
Affects: uim developers
Updates: internal C API
Version: 1.5.0
-Revision: ac4814, ac4815
-Date: 2007-08-11
+Revision: ac4814, ac4815, ac4829
+Date: 2007-08-11, 2007-08-12
Modifier: YamaKen
Related: Fatal error handling helpers for plugin developers
uim-scm API reorganization in uim 1.5.0
Modified: trunk/uim/uim-error.c
==============================================================================
--- trunk/uim/uim-error.c (original)
+++ trunk/uim/uim-error.c Sat Aug 11 10:36:39 2007
@@ -35,7 +35,6 @@
#include <stdlib.h>
#include <string.h>
-#include <setjmp.h>
#include <stdio.h>
#include <assert.h>
@@ -43,21 +42,12 @@
#include "uim-internal.h"
-#if HAVE_SIGSETJMP
-#define JMP_BUF sigjmp_buf
-#define SETJMP(env) sigsetjmp((env), 1)
-#define LONGJMP(env, val) siglongjmp((env), (val))
-#else
-#define JMP_BUF jmp_buf
-#define SETJMP(env) setjmp(env)
-#define LONGJMP(env, val) longjmp((env), (val))
-#endif
/* Immediately returns UIM_TRUE if uim is disabled by a fatal error. */
+JMP_BUF uim_catch_block_env;
static uim_bool fatal_errored;
static int guarded;
-static JMP_BUF env;
static const char *err_msg;
@@ -70,32 +60,39 @@
/* fatal_errored must not be cleared even if libuim is re-initialized. */
}
-/* can be nested */
+void
+uim_print_caught_error(void)
+{
+ if (err_msg) {
+ fputs("ERROR: ", stderr);
+ if (fatal_errored)
+ fputs("fatal: ", stderr);
+ fputs(err_msg, stderr);
+ fputs("\n", stderr);
+ }
+}
+
uim_bool
-uim_catch_error_begin(void)
+uim_caught_fatal_error(void)
{
- assert(guarded >= 0);
+ return fatal_errored;
+}
- if (fatal_errored)
- return UIM_TRUE;
+uim_bool
+uim_catch_error_begin_pre(void)
+{
+ assert(guarded >= 0);
- if (!guarded++) {
- if (SETJMP(env)) {
- guarded = 0;
-
- if (err_msg) {
- fputs("ERROR: ", stderr);
- if (fatal_errored)
- fputs("fatal: ", stderr);
- fputs(err_msg, stderr);
- fputs("\n", stderr);
- }
+ return !guarded++;
+}
- return UIM_TRUE;
- }
- }
+uim_bool
+uim_catch_error_begin_post(void)
+{
+ guarded = 0;
+ uim_print_caught_error();
- return UIM_FALSE;
+ return UIM_TRUE;
}
void
@@ -115,7 +112,7 @@
exit(EXIT_FAILURE);
err_msg = msg;
- LONGJMP(env, guarded);
+ LONGJMP(uim_catch_block_env, guarded);
}
void
Modified: trunk/uim/uim-internal.h
==============================================================================
--- trunk/uim/uim-internal.h (original)
+++ trunk/uim/uim-internal.h Sat Aug 11 10:36:39 2007
@@ -35,6 +35,8 @@
#include <config.h>
+#include <setjmp.h>
+
#include "uim.h"
#include "uim-scm.h"
@@ -42,6 +44,18 @@
extern "C" {
#endif
+
+#if HAVE_SIGSETJMP
+#define JMP_BUF sigjmp_buf
+#define SETJMP(env) sigsetjmp((env), 1)
+#define LONGJMP(env, val) siglongjmp((env), (val))
+#else
+#define JMP_BUF jmp_buf
+#define SETJMP(env) setjmp(env)
+#define LONGJMP(env, val) longjmp((env), (val))
+#endif
+
+
struct uim_candidate_ {
char *str; /* candidate */
char *heading_label;
@@ -106,11 +120,21 @@
void (*switch_system_global_im_cb)(void *ptr, const char *name);
};
-
+/* internal functions */
void uim_init_error(void);
-uim_bool uim_catch_error_begin(void);
-void uim_catch_error_end(void);
-void uim_throw_error(const char *msg);
+void uim_print_caught_error(void);
+uim_bool uim_caught_fatal_error(void);
+uim_bool uim_catch_error_begin_pre(void);
+uim_bool uim_catch_error_begin_post(void);
+
+/* can be nested */
+#define uim_catch_error_begin()
\
+ (uim_caught_fatal_error() \
+ || (uim_catch_error_begin_pre() \
+ && SETJMP(uim_catch_block_env) \
+ && uim_catch_error_begin_post()))
+void uim_catch_error_end(void);
+void uim_throw_error(const char *msg);
void uim_scm_init(const char *system_load_path);
void uim_scm_quit(void);
@@ -127,6 +151,10 @@
void uim_init_intl_subrs(void);
uim_bool uim_issetugid(void);
+
+
+/* don't touch directly */
+extern JMP_BUF uim_catch_block_env;
#ifdef __cplusplus
}