summaryrefslogtreecommitdiff
path: root/src/runtime/c/gu/assert.h
blob: a49d647486f687f843cf7ef218b614e4b995e299 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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;

GU_API_DECL void
gu_abort_v_(GuAssertMode mode, 
	    const char* file, const char* func, int line,
	    const char* msg_fmt, va_list args);

GU_API_DECL 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)

GU_API_DECL void
gu_fatal(const char* fmt, ...);

#endif /* GU_ASSERT_H_ */