summaryrefslogtreecommitdiff
path: root/src/_assert.h
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2020-08-12 11:02:56 -0400
committerJakob Kaivo <jkk@ung.org>2020-08-12 11:02:56 -0400
commitecd4d00f1bdf184163cc44ed8261d9f11ca9aae0 (patch)
tree7148339b74cfd5f453be629843e4647b8ed3e7a2 /src/_assert.h
parentc37709cb45a4dac2c9c8ffb0fdae2361e2ead7de (diff)
remove all generated nonstd/ headers
Diffstat (limited to 'src/_assert.h')
-rw-r--r--src/_assert.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/_assert.h b/src/_assert.h
new file mode 100644
index 00000000..2d27edfb
--- /dev/null
+++ b/src/_assert.h
@@ -0,0 +1,51 @@
+#ifndef ___ASSERT_H__
+#define ___ASSERT_H__
+
+#ifndef NDEBUG
+#define ASSERT_NONNULL(__ptr) do { \
+ if (!__ptr) { \
+ struct __constraint_info _ci = {0}; \
+ _ci.func = __func__; \
+ __libc.stdlib.constraint_handler("Undefined behavior: " \
+ "Parameter " #__ptr " can not be NULL", &_ci, EFAULT); \
+ } \
+} while (0)
+
+#define ASSERT_NONZERO(__n) do { \
+ if (!__n) { \
+ struct __constraint_info _ci = {0}; \
+ _ci.func = __func__; \
+ __libc.stdlib.constraint_handler("Undefined behavior: " \
+ "Parameter " #__n " can not be 0", &_ci, ERANGE); \
+ } \
+} while (0)
+
+#define ASSERT_NOOVERLAP(__x, __y, __s) do { \
+ /* TODO */ \
+} while (0)
+
+#define ASSERT_REPRESENTABLE(_n, _min, _max, _type, _sentinel) do { \
+ if (_sentinel && (_n != _sentinel && (_n < _min || _n > _max))) { \
+ struct __constraint_info _ci = {0}; \
+ _ci.func = __func__; \
+ __libc.stdlib.constraint_handler("Undefined behavior: " \
+ "Paramater " #_n " must be representable as a " #_type \
+ "or be equal to " #_sentinel, &_ci, ERANGE); \
+ } else if (_n < _min || _n > _max) { \
+ struct __constraint_info _ci = {0}; \
+ _ci.func = __func__; \
+ __libc.stdlib.constraint_handler("Undefined behavior: " \
+ "Parameter " #_n " must be representable as a " #_type, \
+ &_ci, ERANGE); \
+ } \
+ } while (0)
+#else
+
+#define ASSERT_REPRESENTABLE(_n, _min, _max, _type, _sentinel)
+#define ASSERT_NOOVERLAP(__x, __y, __s)
+#define ASSERT_NONNULL(x)
+#define ASSERT_NONZERO(n)
+
+#endif
+
+#endif