f02542353130bfc1d528ddae4fc258c94d354fef
[akaros.git] / user / parlib / include / assert.h
1 /* See COPYRIGHT for copyright information. */
2
3 #ifndef PARLIB_ASSERT_H
4 #define PARLIB_ASSERT_H
5
6 #ifdef BUILDING_PARLIB
7 # include_next "assert.h"
8 #else
9 # include <assert.h>
10 #endif
11 /* For __BEGIN_DECLS.  Most every header gets it already from features.h. */
12 #include <sys/cdefs.h>
13 /* So we can undefine warn */
14 #include <err.h>
15
16 __BEGIN_DECLS
17
18 #undef assert
19 #undef static_assert
20 #undef warn
21
22 void _warn(const char*, int, const char*, ...);
23 void _panic(const char*, int, const char*, ...) __attribute__((noreturn));
24 void _assert_failed(const char *file, int line, const char *msg)
25      __attribute__((noreturn));
26
27 #define warn(...) _warn(__FILE__, __LINE__, __VA_ARGS__)
28 #define panic(...) _panic(__FILE__, __LINE__, __VA_ARGS__)
29
30 #define assert(x)                                                                  \
31         do {                                                                       \
32                 if (!(x))                                                              \
33                         _assert_failed(__FILE__, __LINE__, #x);                            \
34         } while (0)
35
36 // static_assert(x) will generate a compile-time error if 'x' is false.
37 #define static_assert(x)        switch (x) case 0: case (x):
38
39 __END_DECLS
40
41 #endif /* PARLIB_ASSERT_H */