| #pragma once |
| |
| #include <stdint.h> |
| #include <string.h> |
| |
| #define __FILENAME__ \ |
| (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 \ |
| : strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) |
| |
| |
| #define ASSERT(message, body) \ |
| { \ |
| if (!(body)) \ |
| THROW("Assert failed: " message " [" #body "]"); \ |
| } |
| |
| #define MAX_CATCH_LEN 32 |
| |
| typedef void (* handle_t)(intptr_t); |
| |
| typedef struct |
| { |
| handle_t fn; |
| intptr_t arg; |
| } catch_t; |
| |
| extern catch_t g_catch[MAX_CATCH_LEN]; |
| extern unsigned g_catch_len; |
| |
| void throw_(const char *msg, const char *file, unsigned int line); |
| void unwind(); |
| void catch_(handle_t hdl, intptr_t arg); |
| |
| #define THROW(msg) throw_(msg, __FILENAME__, __LINE__) |
| #define CATCH(fn, arg) catch_((handle_t) fn, (intptr_t) arg) |