Skip to content

Commit 2dff075

Browse files
committed
added example that uses both jim and jimp
1 parent a465d70 commit 2dff075

File tree

2 files changed

+189
-0
lines changed

2 files changed

+189
-0
lines changed

examples/04_from_readme_round.c

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
#include <stdio.h>
2+
3+
#define NOB_IMPLEMENTATION
4+
#define NOB_STRIP_PREFIX
5+
#include "../thirdparty/nob.h"
6+
#define JIM_IMPLEMENTATION
7+
#include "../jim.h"
8+
#define JIMP_IMPLEMENTATION
9+
#include "../jimp.h"
10+
11+
const char* JSON_STR =
12+
"{"
13+
// TODO: Uncomment when null is implemented
14+
//" \"null\": null,"
15+
"\"bool\":["
16+
"false,"
17+
"true"
18+
"],"
19+
"\"integers\":["
20+
"-3,"
21+
"-2,"
22+
"-1,"
23+
"0,"
24+
"1,"
25+
"2,"
26+
"3"
27+
"],"
28+
"\"floats\":["
29+
"3.1415,"
30+
"2.71828,"
31+
"1.618"
32+
"],"
33+
"\"string\":["
34+
"\"Hello\\tWorld\\n\","
35+
"\"\\u0000\\u0000\\u0000\\u0000\""
36+
"]"
37+
"}";
38+
39+
typedef struct {
40+
bool *items;
41+
size_t count;
42+
size_t capacity;
43+
} Bools;
44+
45+
typedef struct {
46+
long long *items;
47+
size_t count;
48+
size_t capacity;
49+
} Integers;
50+
51+
typedef struct {
52+
double *items;
53+
size_t count;
54+
size_t capacity;
55+
} Floats;
56+
57+
typedef struct {
58+
const char* *items;
59+
size_t count;
60+
size_t capacity;
61+
} Strings;
62+
63+
typedef struct {
64+
// TODO: Re-add null when null is implemented
65+
Bools bools;
66+
Integers integers;
67+
Floats floats;
68+
Strings strings;
69+
} JSON;
70+
71+
size_t sbwrite(const char *ptr, size_t size, size_t nmemb, String_Builder *sb) {
72+
assert(size == 1);
73+
74+
sb_append_buf(sb, ptr, nmemb);
75+
return nmemb;
76+
}
77+
78+
int main()
79+
{
80+
JSON json = {0};
81+
82+
Jimp jimp = {
83+
.file_path = "JSON_STR",
84+
.start = JSON_STR,
85+
.end = JSON_STR + strlen(JSON_STR),
86+
.point = JSON_STR,
87+
};
88+
89+
if (!jimp_object_begin(&jimp)) return 1;
90+
while (jimp_object_member(&jimp)) {
91+
if (strcmp(jimp.member, "null") == 0) {
92+
return 1; // TODO: Handle when null is implemented
93+
} else if (strcmp(jimp.member, "bool") == 0) {
94+
if (!jimp_array_begin(&jimp)) return 1;
95+
while (jimp_array_item(&jimp)) {
96+
bool x = false;
97+
if (!jimp_bool(&jimp, &x)) return 1;
98+
da_append(&json.bools, x);
99+
}
100+
if (!jimp_array_end(&jimp)) return 1;
101+
} else if (strcmp(jimp.member, "integers") == 0) {
102+
if (!jimp_array_begin(&jimp)) return 1;
103+
while (jimp_array_item(&jimp)) {
104+
long long x = 0;
105+
if (!jimp_int(&jimp, &x)) return 1;
106+
da_append(&json.integers, x);
107+
}
108+
if (!jimp_array_end(&jimp)) return 1;
109+
} else if (strcmp(jimp.member, "floats") == 0) {
110+
if (!jimp_array_begin(&jimp)) return 1;
111+
while (jimp_array_item(&jimp)) {
112+
double x = 0;
113+
if (!jimp_float(&jimp, &x)) return 1;
114+
da_append(&json.floats, x);
115+
}
116+
if (!jimp_array_end(&jimp)) return 1;
117+
} else if (strcmp(jimp.member, "string") == 0) {
118+
if (!jimp_array_begin(&jimp)) return 1;
119+
while (jimp_array_item(&jimp)) {
120+
const char* x = NULL;
121+
if (!jimp_string(&jimp, &x)) return 1;
122+
da_append(&json.strings, x);
123+
}
124+
if (!jimp_array_end(&jimp)) return 1;
125+
} else {
126+
jimp_unknown_member(&jimp);
127+
return 1;
128+
}
129+
}
130+
if (!jimp_object_end(&jimp)) return 1;
131+
132+
133+
String_Builder sb = {0};
134+
135+
Jim jim = {
136+
.sink = &sb,
137+
.write = (Jim_Write) sbwrite,
138+
};
139+
140+
jim_object_begin(&jim);
141+
// TODO: Redo when null is implemented
142+
//jim_member_key(&jim, "null");
143+
//jim_null(&jim);
144+
145+
jim_member_key(&jim, "bool");
146+
jim_array_begin(&jim);
147+
da_foreach(bool, b, &json.bools) {
148+
jim_bool(&jim, *b);
149+
}
150+
jim_array_end(&jim);
151+
152+
jim_member_key(&jim, "integers");
153+
jim_array_begin(&jim);
154+
da_foreach(long long, i, &json.integers) {
155+
jim_integer(&jim, *i);
156+
}
157+
jim_array_end(&jim);
158+
159+
jim_member_key(&jim, "floats");
160+
jim_array_begin(&jim);
161+
da_foreach(double, f, &json.floats) {
162+
jim_float(&jim, *f, 5);
163+
}
164+
jim_array_end(&jim);
165+
166+
jim_member_key(&jim, "string");
167+
jim_array_begin(&jim);
168+
da_foreach(const char*, s, &json.strings) {
169+
jim_string(&jim, *s);
170+
}
171+
jim_array_end(&jim);
172+
jim_object_end(&jim);
173+
174+
if (jim.error != JIM_OK) {
175+
fprintf(stderr, "ERROR: could not serialize json properly: %s\n",
176+
jim_error_string(jim.error));
177+
return -1;
178+
}
179+
180+
printf("Initial: %s\n", JSON_STR);
181+
printf("Round Trip: %.*s\n", (int)sb.count, sb.items);
182+
183+
184+
185+
return 0;
186+
}

examples/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,6 @@ all: 01_from_readme 02_binary_tree 03_parsing_database
1111

1212
03_parsing_database: 03_parsing_database.c ../jimp.h ../thirdparty/nob.h
1313
$(CC) $(CFLAGS) -o 03_parsing_database 03_parsing_database.c
14+
15+
04_from_readme_round: 04_from_readme_round.c ../jimp.h ../thirdparty/nob.h
16+
$(CC) $(CFLAGS) -o 04_from_readme_round 04_from_readme_round.c

0 commit comments

Comments
 (0)