summaryrefslogtreecommitdiff
path: root/src/_safety.h
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2024-01-30 22:23:00 -0500
committerJakob Kaivo <jkk@ung.org>2024-01-30 22:23:00 -0500
commit7da82792e165504c1565904dc4541fccbc10bcf8 (patch)
tree6cf4dc43daa9b9f7fe91ac64f79a4a1483f62c7e /src/_safety.h
parent0862a2b142ee6c9da71c9e7f58b47954ae4534f8 (diff)
add macros for 1:1 checked functions
Diffstat (limited to 'src/_safety.h')
-rw-r--r--src/_safety.h50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/_safety.h b/src/_safety.h
index 348b6b0b..76129899 100644
--- a/src/_safety.h
+++ b/src/_safety.h
@@ -60,6 +60,56 @@ extern struct __checked_call {
&_ci, 0); \
} \
} while (0)
+
+#define __setchecked(__file, __func, __line) \
+ do { \
+ __checked_call.func = (char*)func; \
+ __checked_call.file = (char*)file; \
+ __checked_call.line = line; \
+ } while (0)
+
+#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 __check_0(__type, __def, __fn) \
+ __type __##__fn(const char * file, const char * func, unsigned long long line) { \
+ __type ret = __def; \
+ __setchecked(file, func, line); \
+ ret = __fn(); \
+ __setchecked(NULL, NULL, 0); \
+ return ret; \
+ }
+
+#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); \
+ ret = __fn(a1); \
+ __setchecked(NULL, NULL, 0); \
+ return ret; \
+ }
+
+#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); \
+ ret = __fn(a1, a2); \
+ __setchecked(NULL, NULL, 0); \
+ return ret; \
+ }
+
+#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); \
+ ret = __fn(a1, a2, a3); \
+ __setchecked(NULL, NULL, 0); \
+ return ret; \
+ }
#else
#define ASSERT_REPRESENTABLE(_n, _min, _max, _type, _sentinel)