accept unnamed sections
[project/uci.git] / err.h
diff --git a/err.h b/err.h
index 2e1e606..358cadf 100644 (file)
--- a/err.h
+++ b/err.h
@@ -27,6 +27,7 @@
  * in the context.
  */
 #define UCI_THROW(ctx, err) do {       \
+       DPRINTF("Exception: %s in %s, %s:%d\n", #err, __func__, __FILE__, __LINE__); \
        longjmp(ctx->trap, err);        \
 } while (0)
 
  * and UCI_TRAP_RESTORE.
  */
 #define UCI_HANDLE_ERR(ctx) do {       \
-       int __val;                      \
+       DPRINTF("ENTER: %s\n", __func__); \
+       int __val = 0;                  \
        if (!ctx)                       \
                return UCI_ERR_INVAL;   \
-       __val = setjmp(ctx->trap);      \
+       if (!ctx->internal)             \
+               __val = setjmp(ctx->trap); \
+       ctx->internal = false;          \
        if (__val) {                    \
                ctx->errno = __val;     \
                return __val;           \
        memcpy(ctx->trap, __old_trap, sizeof(ctx->trap)); \
 } while(0)
 
+/**
+ * UCI_INTERNAL: Do an internal call of a public API function
+ * 
+ * Sets Exception handling to passthrough mode.
+ * Allows API functions to change behavior compared to public use
+ */
+#define UCI_INTERNAL(func, ctx, ...) do { \
+       ctx->internal = true;           \
+       func(ctx, __VA_ARGS__);         \
+} while (0)
+
 /*
  * check the specified condition.
  * throw an invalid argument exception if it's false