summaryrefslogtreecommitdiff
path: root/src/_safety.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/_safety.h')
-rw-r--r--src/_safety.h53
1 files changed, 44 insertions, 9 deletions
diff --git a/src/_safety.h b/src/_safety.h
index 76129899..1e11187a 100644
--- a/src/_safety.h
+++ b/src/_safety.h
@@ -1,6 +1,10 @@
#ifndef ___ASSERT_H__
#define ___ASSERT_H__
+#if ! (__STDC_VERSION__ >= 201112 && defined __STDC_WANT_LIB_EXT1__)
+#define abort_handler_s __abort_handler_s
+#endif
+
#include <errno.h>
#include <stdio.h>
#include "stdlib/_stdlib.h"
@@ -50,11 +54,11 @@ extern struct __checked_call {
} while (0)
#define SIGNAL_SAFE(__n) do { \
- if (__n == 0 && __signal.current != 0) { \
+ if (__n == 0 && ___signal.current != 0) { \
struct __constraint_info _ci = {0}; \
_ci.func = __func__; \
- _ci.signal = __signal.current; \
- __signal.current = 0; \
+ _ci.signal = ___signal.current; \
+ ___signal.current = 0; \
__stdlib.constraint_handler("Undefined behavior: " \
"Standard library function called from signal handler", \
&_ci, 0); \
@@ -68,14 +72,31 @@ extern struct __checked_call {
__checked_call.line = line; \
} while (0)
-#define __vcheck_0(__fn) \
- void __#__fn(const char * file, const char * func, unsigned long long line) { \
+#define VCHECK_0(__fn) \
+ void __##__fn(const char * file, const char * func, unsigned long long line) { \
__setchecked(file, func, line); \
__fn(); \
__setchecked(NULL, NULL, 0); \
}
+#define __vcheck_0(__fn) VCHECK_0(__fn)
+
+#define VCHECK_1(__fn, __t1) \
+ void __##__fn(const char * file, const char * func, unsigned long long line, __t1 __a1) { \
+ __setchecked(file, func, line); \
+ __fn(__a1); \
+ __setchecked(NULL, NULL, 0); \
+ }
+#define __vcheck_1(__fn, __t1) VCHECK_1(__fn, __t1)
+
+#define VCHECK_2(__fn, __t1, __t2) \
+ void __##__fn(const char * file, const char * func, unsigned long long line, __t1 __a1, __t2 __a2) { \
+ __setchecked(file, func, line); \
+ __fn(__a1, __a2); \
+ __setchecked(NULL, NULL, 0); \
+ }
+#define vcheck_2(__fn, __t1, __t2) VCHECK_2(__fn, __t1, __t2)
-#define __check_0(__type, __def, __fn) \
+#define CHECK_0(__type, __def, __fn) \
__type __##__fn(const char * file, const char * func, unsigned long long line) { \
__type ret = __def; \
__setchecked(file, func, line); \
@@ -83,8 +104,9 @@ extern struct __checked_call {
__setchecked(NULL, NULL, 0); \
return ret; \
}
+#define __check_0(__type, __def, __fn) CHECK_0(__type, __def, __fn)
-#define __check_1(__type, __def, __fn, __t1) \
+#define CHECK_1(__type, __def, __fn, __t1) \
__type __##__fn(const char * file, const char * func, unsigned long long line, __t1 a1) { \
__type ret = __def; \
__setchecked(file, func, line); \
@@ -92,8 +114,9 @@ extern struct __checked_call {
__setchecked(NULL, NULL, 0); \
return ret; \
}
+#define __check_1(__type, __def, __fn, __t1) CHECK_1(__type, __def, __fn, __t1)
-#define __check_2(__type, __def, __fn, __t1, __t2) \
+#define CHECK_2(__type, __def, __fn, __t1, __t2) \
__type __##__fn(const char * file, const char * func, unsigned long long line, __t1 a1, __t2 a2) { \
__type ret = __def; \
__setchecked(file, func, line); \
@@ -101,8 +124,9 @@ extern struct __checked_call {
__setchecked(NULL, NULL, 0); \
return ret; \
}
+#define __check_2(__type, __def, __fn, __t1, __t2) CHECK_2(__type, __def, __fn, __t1, __t2)
-#define __check_3(__type, __def, __fn, __t1, __t2, __t3) \
+#define CHECK_3(__type, __def, __fn, __t1, __t2, __t3) \
__type __##__fn(const char * file, const char * func, unsigned long long line, __t1 a1, __t2 a2, __t3 a3) { \
__type ret = __def; \
__setchecked(file, func, line); \
@@ -110,6 +134,17 @@ extern struct __checked_call {
__setchecked(NULL, NULL, 0); \
return ret; \
}
+#define __check_3(__type, __def, __fn, __t1, __t2, __t3) CHECK_3(__type, __def, __fn, __t1, __t2, __t3)
+
+#define CHECK_4(__type, __def, __fn, __t1, __t2, __t3, __t4) \
+ __type __##__fn(const char * file, const char * func, unsigned long long line, __t1 a1, __t2 a2, __t3 a3, __t4 a4) { \
+ __type ret = __def; \
+ __setchecked(file, func, line); \
+ ret = __fn(a1, a2, a3, a4); \
+ __setchecked(NULL, NULL, 0); \
+ return ret; \
+ }
+#define __check_4(__type, __def, __fn, __t1, __t2, __t3, __t4) CHECK_4(__type, __def, __fn, __t1, __t2, __t3, __t4)
#else
#define ASSERT_REPRESENTABLE(_n, _min, _max, _type, _sentinel)