diff options
Diffstat (limited to 'src/_safety.h')
| -rw-r--r-- | src/_safety.h | 53 |
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) |
