Skip to content

Commit a82a1ee

Browse files
committed
update k2v3
1 parent 398a91c commit a82a1ee

3 files changed

Lines changed: 76 additions & 12 deletions

File tree

v3/k2v3.c

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,42 @@
2828
*
2929
*/
3030
#include "k2v3.h"
31-
bool k2v_stop_at_warning = false;
32-
bool k2v_show_warning = true;
33-
bool k2v3_warning_triggered = false;
31+
bool k2v3_stop_at_warning(int req)
32+
{
33+
static thread_local bool ret = false;
34+
if (req == -1) {
35+
return ret;
36+
}
37+
if (req == 0) {
38+
ret = false;
39+
} else {
40+
ret = true;
41+
}
42+
return ret;
43+
}
44+
bool k2v3_show_warning(int req)
45+
{
46+
static thread_local bool ret = false;
47+
if (req == -1) {
48+
return ret;
49+
}
50+
if (req == 0) {
51+
ret = false;
52+
} else {
53+
ret = true;
54+
}
55+
return ret;
56+
}
57+
enum K2V3_ERRNO k2v3_errno(enum K2V3_ERRNO req)
58+
{
59+
static thread_local enum K2V3_ERRNO ret = K2V3_NORMAL;
60+
if (req == K2V3_QUERY) {
61+
return ret;
62+
}
63+
ret = req;
64+
return ret;
65+
}
66+
thread_local jmp_buf k2v3_jmp;
3467
//
3568
//
3669
// Parse into cache.
@@ -476,6 +509,11 @@ static struct K2V3_VALUE get_value(struct K2V3_STRING conf)
476509
k2v3_cache k2v3_parse(char *const _Nonnull buf)
477510
{
478511
k2v3_cache ret = NULL;
512+
if (setjmp(k2v3_jmp) != 0) {
513+
// Free cache before returning NULL.
514+
k2v3_free_cache(&ret);
515+
return NULL;
516+
}
479517
struct K2V3_STRING conf = { .str = buf, .len = strlen(buf) };
480518
while (conf.len > 0) {
481519
// We do not allow leading spaces.

v3/k2v3.h

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,15 @@
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
};
7173
typedef 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
} \

v3/test.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,20 @@
22
#include "../src/include/k2v.h"
33
int main()
44
{
5+
k2v3_stop_at_warning(0);
56
char *buf = k2v3_open_file("test.conf");
67
k2v3_cache cache = k2v3_parse(buf);
8+
switch (k2v3_errno(K2V3_QUERY)) {
9+
case K2V3_UNRECOVERABLE:
10+
printf("Unrecoverable error occurred during parsing.\n");
11+
break;
12+
case K2V3_RECOVERABLE:
13+
printf("Recoverable error occurred during parsing.\n");
14+
break;
15+
default:
16+
printf("No errors occurred during parsing.\n");
17+
break;
18+
}
719
k2v3_dump(cache);
820
printf("\n\n");
921
printf("bool_val: %s\n", k2v3_get_bool("bool_val", cache) ? "true" : "false");

0 commit comments

Comments
 (0)