summaryrefslogtreecommitdiff
path: root/src/runtime/c/gu/assert.h
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2012-01-20 13:41:10 +0000
committerkr.angelov <kr.angelov@gmail.com>2012-01-20 13:41:10 +0000
commit2eee382a62a909d5a3f2f5eda94f30fe68fd5335 (patch)
treeb0b0d513535895f244214aebf6358e172b8dce6d /src/runtime/c/gu/assert.h
parentb9728357126f8b9a6311cca17d9f0dcc2a7bfb9b (diff)
initial import of the C runtime
Diffstat (limited to 'src/runtime/c/gu/assert.h')
-rw-r--r--src/runtime/c/gu/assert.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/runtime/c/gu/assert.h b/src/runtime/c/gu/assert.h
new file mode 100644
index 000000000..9d7ecc15f
--- /dev/null
+++ b/src/runtime/c/gu/assert.h
@@ -0,0 +1,61 @@
+#ifndef GU_ASSERT_H_
+#define GU_ASSERT_H_
+
+#include <gu/defs.h>
+
+typedef enum {
+ GU_ASSERT_PRECOND,
+ GU_ASSERT_ASSERTION,
+ GU_ASSERT_POSTCOND,
+ GU_ASSERT_NEVER
+} GuAssertMode;
+
+void
+gu_abort_v_(GuAssertMode mode,
+ const char* file, const char* func, int line,
+ const char* msg_fmt, va_list args);
+
+void
+gu_abort_(GuAssertMode mode,
+ const char* file, const char* func, int line,
+ const char* msg_fmt, ...);
+
+#ifndef NDEBUG
+#define gu_assertion_(mode_, expr_, ...) \
+ GU_BEGIN \
+ if (!(expr_)) { \
+ gu_abort_(mode_, __FILE__, __func__, __LINE__, __VA_ARGS__); \
+ } \
+ GU_END
+#else
+// this should prevent unused variable warnings when a variable is only used
+// in an assertion
+#define gu_assertion_(mode_, expr_, ...) \
+ GU_BEGIN \
+ (void) (sizeof (expr_)); \
+ GU_END
+#endif
+
+
+#define gu_require(expr) \
+ gu_assertion_(GU_ASSERT_PRECOND, expr, "%s", #expr)
+
+#define gu_assert_msg(expr, ...) \
+ gu_assertion_(GU_ASSERT_ASSERTION, expr, __VA_ARGS__)
+
+#define gu_assert(expr) \
+ gu_assert_msg(expr, "%s", #expr)
+
+#define gu_ensure(expr) \
+ gu_assertion_(GU_ASSERT_POSTCOND, expr, "%s", #expr)
+
+#define gu_impossible_msg(...) \
+ gu_assertion_(GU_ASSERT_ASSERTION, false, __VA_ARGS__)
+
+#define gu_impossible() \
+ gu_impossible_msg(NULL)
+
+void
+gu_fatal(const char* fmt, ...);
+
+#endif /* GU_ASSERT_H_ */