3737#include <string.h>
3838#include <stdlib.h>
3939#include <limits.h>
40+ #include <threads.h>
41+ #include <setjmp.h>
4042#include <sys/stat.h>
4143// Bool!!!
4244#if __STDC_VERSION__ < 202000L
4345#ifndef bool
4446#define bool _Bool
45- #define true ((_Bool) + 1u)
46- #define false ((_Bool) + 0u)
47+ #define true ((_Bool)1u)
48+ #define false ((_Bool)0u)
4749#endif
4850#endif
4951#ifndef _Nullable
@@ -69,25 +71,37 @@ struct K2V3_BUF {
6971 struct K2V3_BUF * next ;
7072};
7173typedef struct K2V3_BUF * k2v3_cache ;
72- extern bool k2v_stop_at_warning ;
73- extern bool k2v_show_warning ;
74- extern bool k2v3_warning_triggered ;
74+ enum K2V3_ERRNO {
75+ K2V3_QUERY ,
76+ K2V3_NORMAL ,
77+ K2V3_RECOVERABLE ,
78+ K2V3_UNRECOVERABLE ,
79+ };
80+ bool k2v3_stop_at_warning (int req );
81+ bool k2v3_show_warning (int req );
82+ enum K2V3_ERRNO k2v3_errno (enum K2V3_ERRNO req );
83+ extern thread_local jmp_buf k2v3_jmp ;
7584#define k2v3_error (...) \
7685 do { \
86+ k2v3_errno(K2V3_UNRECOVERABLE); \
7787 fprintf(stderr, "[libk2v]: in %s() at %s line %d :", __func__, __FILE__, __LINE__); \
7888 fprintf(stderr, __VA_ARGS__); \
7989 fprintf(stderr, "\n"); \
80- exit(114); \
90+ if (k2v3_stop_at_warning(-1)) { \
91+ fprintf(stderr, "[libk2v]: k2v_stop_at_warning set, exit\n"); \
92+ exit(114); \
93+ } \
94+ longjmp(k2v3_jmp, 1); \
8195 } while (0)
8296#define k2v3_warning (...) \
8397 do { \
84- k2v3_warning_triggered = true; \
85- if (k2v_show_warning || k2v_stop_at_warning) { \
98+ k2v3_errno(K2V3_RECOVERABLE); \
99+ if (k2v3_show_warning(-1) || k2v3_stop_at_warning(-1)) { \
86100 fprintf(stderr, "[libk2v]: in %s() at %s line %d :", __func__, __FILE__, __LINE__); \
87101 fprintf(stderr, __VA_ARGS__); \
88102 fprintf(stderr, "\n"); \
89103 } \
90- if (k2v_stop_at_warning) { \
104+ if (k2v3_stop_at_warning(-1)) { \
91105 fprintf(stderr, "[libk2v]: k2v_stop_at_warning set, exit\n"); \
92106 exit(114); \
93107 } \
0 commit comments