OSSP CVS Repository

ossp - Difference in ossp-pkg/ex/ex.h versions 1.3 and 1.4
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [History

ossp-pkg/ex/ex.h 1.3 -> 1.4

--- ex.h 2002/01/25 18:36:17     1.3
+++ ex.h 2002/01/25 22:23:17     1.4
@@ -26,9 +26,13 @@
 #ifndef __EX_H__
 #define __EX_H__
 
-/* the required ISO-C standard facilities */
-#include <stdio.h>   /* for NULL */
-#include <setjmp.h>  /* for jmp_buf, setjmp(3), longjmp(3) */
+/* required ISO-C standard facilities */
+#include <stdio.h>
+
+/* convinience define */
+#ifndef NULL
+#define NULL (void *)0
+#endif
 
 /* determine how the current function name can be fetched */
 #if (   defined(__STDC__) \
@@ -45,19 +49,30 @@
 #endif
 
 /* the machine context */
-#ifndef __ex_mctx_st
-#define __ex_mctx_st             struct { jmp_buf jb; }
-#endif
-#ifndef __ex_mctx_save
+#if defined(__EX_MCTX_USE_MCSC__)
+#include <ucontext.h>            /* POSIX.1 ucontext(3) */
+#define __ex_mctx_struct         ucontext_t uc; 
+#define __ex_mctx_save(mctx)     (getcontext(&(mctx)->uc) == 0)
+#define __ex_mctx_restored(mctx) /* noop */
+#define __ex_mctx_restore(mctx)  (void)setcontext(&(mctx)->uc)
+
+#elif defined(__EX_MCTX_USE_SSJLJ__)
+#include <setjmp.h>              /* POSIX.1 sigjmp_buf(3) */
+#define __ex_mctx_struct         sigjmp_buf jb;
+#define __ex_mctx_save(mctx)     (sigsetjmp((mctx)->jb, 1) == 0)
+#define __ex_mctx_restored(mctx) /* noop */
+#define __ex_mctx_restore(mctx)  (void)siglongjmp((mctx)->jb, 1)
+
+#elif defined(__EX_MCTX_USE_SJLJ__) || !defined(__EX_MCTX_USE_CUSTOM__)
+#include <setjmp.h>              /* ISO C jmp_buf(3) */
+#define __ex_mctx_struct         jmp_buf jb;
 #define __ex_mctx_save(mctx)     (setjmp((mctx)->jb) == 0)
-#endif
-#ifndef __ex_mctx_restore
+#define __ex_mctx_restored(mctx) /* noop */
 #define __ex_mctx_restore(mctx)  (void)longjmp((mctx)->jb, 1)
 #endif
-#ifndef __ex_mctx_restored
-#define __ex_mctx_restored(mctx) /* NOOP */
-#endif
-typedef __ex_mctx_st __ex_mctx_t;
+
+/* declare the machine context type */
+typedef struct { __ex_mctx_struct } __ex_mctx_t;
 
 /* declare the exception type (public) */
 typedef struct {
@@ -71,34 +86,65 @@
     char *ex_func;
 } ex_t;
 
-/* declare the exception context type (private) */
+/* declare the context type (private) */
 typedef struct {
-    __ex_mctx_t  *ctx_mctx_prev; /* previous jump buffer */
-    int           ctx_caught;    /* flag whether exception was caught */
-    volatile ex_t ctx_ex;        /* the exception temporary storage */
+    __ex_mctx_t  *ctx_mctx;      /* permanent machine context of enclosing try/catch */
+    int           ctx_disabled;  /* permanent flag whether exception handling is disabled */
+    int           ctx_caught;    /* temporary flag whether exception was caught */
+    volatile ex_t ctx_ex;        /* temporary exception storage */
 } ex_ctx_t;
 
-/* exception context */
-#ifndef __ex_ctx
+/* the static and dynamic initializers for a context structure */
+#define EX_CTX_INITIALIZER \
+    { NULL, 0, 0, { NULL, NULL, NULL, NULL, 0, NULL } }
+#define EX_CTX_INITIALIZE(ctx) \
+    do { \
+        (ctx)->ctx_mctx         = NULL; \
+        (ctx)->ctx_disabled     = 0;    \
+        (ctx)->ctx_caught       = 0;    \
+        (ctx)->ctx_ex.ex_class  = NULL; \
+        (ctx)->ctx_ex.ex_object = NULL; \
+        (ctx)->ctx_ex.ex_value  = NULL; \
+        (ctx)->ctx_ex.ex_file   = NULL; \
+        (ctx)->ctx_ex.ex_line   = 0;    \
+        (ctx)->ctx_ex.ex_func   = NULL; \
+    } while (0)
+
+/* the exception context */
+#if defined(__EX_CTX_USE_STATIC__)
+static ex_ctx_t __ex_ctx_global;
+#define __ex_ctx (&__ex_ctx_global)
+#elif defined(__EX_CTX_USE_GLOBAL__) || !(__EX_CTX_USE_CUSTOM__)
+#define EX_CTX_GLOBAL ex_ctx_t __ex_ctx_global;
+extern ex_ctx_t __ex_ctx_global;
 #define __ex_ctx (&__ex_ctx_global)
-#ifdef __EX_STATIC_CTX__
-static ex_ctx_t __ex_ctx_global; /* for very small environments */
-#else
-extern ex_ctx_t __ex_ctx_global; /* for non-MT environments (require libex.a) */
 #endif
+
+/* the termination handler */
+#if defined(__EX_TERMINATE_USE_NOOP__)
+#define __ex_terminate(e) \
+    /* noop */
+#elif defined(__EX_TERMINATE_USE_ABORT__) || !(__EX_CTX_USE_CUSTOM__)
+#define __ex_terminate(e) \
+    ( fprintf(stderr, \
+              "**EX: UNCAUGHT EXCEPTION: " \
+              "class=0x%lx object=0x%lx value=0x%lx [%s:%d@%s]\n", \
+              (long)((e)->ex_class), (long)((e)->ex_object), (long)((e)->ex_value), \
+              (e)->ex_file, (e)->ex_line, (e)->ex_func), \
+     abort() )
 #endif
 
-/* block for trying execution */
+/* the block for trying execution */
 #define ex_try \
     { \
-        __ex_mctx_t *__ex_mctx_prev; \
+        __ex_mctx_t *__ex_mctx_en; \
         __ex_mctx_t __ex_mctx_me; \
-        __ex_mctx_prev = __ex_ctx->ctx_mctx_prev; \
-        __ex_ctx->ctx_mctx_prev = &__ex_mctx_me; \
+        __ex_mctx_en = __ex_ctx->ctx_mctx; \
+        __ex_ctx->ctx_mctx = &__ex_mctx_me; \
         if (__ex_mctx_save(&__ex_mctx_me)) { \
             if (1)
 
-/* block for catching an exception */
+/* the block for catching an exception */
 #define ex_catch(e) \
             else { \
             } \
@@ -108,46 +154,55 @@
             __ex_mctx_restored(&__ex_mctx_me); \
             __ex_ctx->ctx_caught = 1; \
         } \
-        __ex_ctx->ctx_mctx_prev = __ex_mctx_prev; \
+        __ex_ctx->ctx_mctx = __ex_mctx_en; \
     } \
-    if (!__ex_ctx->ctx_caught || ((e) = __ex_ctx->ctx_ex, 0)) { \
+    if (   !(__ex_ctx->ctx_caught) \
+        || ((e) = __ex_ctx->ctx_ex, 0)) { \
     } \
     else
 
-/* throw a new exception */
+/* the throwing of a new exception */
 #define ex_throw(c,o,v) \
-    (__ex_ctx->ctx_mctx_prev == NULL ? \
-     (abort(), 0) : \
-     ( __ex_ctx->ctx_ex.ex_class  = (void *)(c), \
-       __ex_ctx->ctx_ex.ex_object = (void *)(o), \
-       __ex_ctx->ctx_ex.ex_value  = (void *)(v), \
-       __ex_ctx->ctx_ex.ex_file   = __FILE__, \
-       __ex_ctx->ctx_ex.ex_line   = __LINE__, \
-       __ex_ctx->ctx_ex.ex_func   = __EX_FUNC__, \
-       __ex_mctx_restore(__ex_ctx->ctx_mctx_prev), \
-       0 \
-     ) \
-    )
+    (__ex_ctx->ctx_disabled ? 0 : \
+     (__ex_ctx->ctx_ex.ex_class  = (void *)(c), \
+      __ex_ctx->ctx_ex.ex_object = (void *)(o), \
+      __ex_ctx->ctx_ex.ex_value  = (void *)(v), \
+      __ex_ctx->ctx_ex.ex_file   = __FILE__, \
+      __ex_ctx->ctx_ex.ex_line   = __LINE__, \
+      __ex_ctx->ctx_ex.ex_func   = __EX_FUNC__, \
+      (  __ex_ctx->ctx_mctx == NULL \
+       ? (__ex_terminate(&(__ex_ctx->ctx_ex)), -1) \
+       : (__ex_mctx_restore(__ex_ctx->ctx_mctx), 1) )))
 
-/* re-throw a caught exception */
+/* the re-throwing of an already caught exception */
 #define ex_rethrow \
-    (__ex_ctx->ctx_mctx_prev == NULL ? \
-     (abort(), 0) : \
-     (__ex_mctx_restore(__ex_ctx->ctx_mctx_prev), 0) \
-    )
+    (__ex_ctx->ctx_disabled ? 0 : \
+      (__ex_ctx->ctx_mctx == NULL ? (__ex_terminate(&(__ex_ctx->ctx_ex)), -1) : \
+        (__ex_mctx_restore(__ex_ctx->ctx_mctx), 1) ))
+
+/* shield an operation from exception handling */
+#define ex_shield \
+    for (__ex_ctx->ctx_disabled = 1; \
+         __ex_ctx->ctx_disabled == 1; \
+         __ex_ctx->ctx_disabled = 0)
+#define ex_shielded \
+        (__ex_ctx->ctx_disabled)
 
 /* optional namespace mapping */
-#if !defined(__cplusplus) && !defined(__EX_NO_CXX_NS__)
-#define try      ex_try
-#define catch    ex_catch
-#define throw    ex_throw
-#define rethrow  ex_rethrow
-#endif
-#if !defined(__EX_NO_SIMPLE_NS__)
+#if defined(__EX_NS_USE_UCCXX__)
 #define Try      ex_try
 #define Catch    ex_catch
 #define Throw    ex_throw
 #define Rethrow  ex_rethrow
+#define Shield   ex_shield
+#define Shielded ex_shielded
+#elif defined(__EX_NS_USE_CXX__) || (!defined(__cplusplus) && !defined(__EX_NS_USE_CUSTOM__))
+#define try      ex_try
+#define catch    ex_catch
+#define throw    ex_throw
+#define rethrow  ex_rethrow
+#define shield   ex_shield
+#define shielded ex_shielded
 #endif
 
 #endif /* __EX_H__ */

CVSTrac 2.0.1