Skip to content

Commit e39c55a

Browse files
committed
(t5)complete
1 parent 0212fb0 commit e39c55a

File tree

5 files changed

+91
-11
lines changed

5 files changed

+91
-11
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"variant": null,
3+
"activeEnvironments": [],
4+
"codeModel": null
5+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"configurations": [
3+
{
4+
"name": "null",
5+
"includePath": [],
6+
"defines": [],
7+
"browse": {
8+
"path": [
9+
"${workspaceRoot}"
10+
],
11+
"limitSymbolsToIncludedHeaders": true,
12+
"databaseFilename": ""
13+
},
14+
"intelliSenseMode": "clang-x64"
15+
}
16+
],
17+
"version": 2
18+
}

tutorial05/.vscode/settings.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"files.associations": {
3+
"leptjson.h": "c"
4+
}
5+
}

tutorial05/leptjson.c

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ static const char* lept_parse_hex4(const char* p, unsigned* u) {
105105
}
106106

107107
static void lept_encode_utf8(lept_context* c, unsigned u) {
108-
if (u <= 0x7F)
108+
if (u <= 0x7F)
109109
PUTC(c, u & 0xFF);
110110
else if (u <= 0x7FF) {
111111
PUTC(c, 0xC0 | ((u >> 6) & 0xFF));
@@ -184,9 +184,10 @@ static int lept_parse_string(lept_context* c, lept_value* v) {
184184
static int lept_parse_value(lept_context* c, lept_value* v);
185185

186186
static int lept_parse_array(lept_context* c, lept_value* v) {
187-
size_t size = 0;
187+
size_t i, size = 0;
188188
int ret;
189189
EXPECT(c, '[');
190+
lept_parse_whitespace(c);
190191
if (*c->json == ']') {
191192
c->json++;
192193
v->type = LEPT_ARRAY;
@@ -197,23 +198,33 @@ static int lept_parse_array(lept_context* c, lept_value* v) {
197198
for (;;) {
198199
lept_value e;
199200
lept_init(&e);
200-
if ((ret = lept_parse_value(c, &e)) != LEPT_PARSE_OK)
201-
return ret;
201+
if ((ret = lept_parse_value(c, &e)) != LEPT_PARSE_OK) {
202+
break;
203+
}
202204
memcpy(lept_context_push(c, sizeof(lept_value)), &e, sizeof(lept_value));
203205
size++;
204-
if (*c->json == ',')
206+
lept_parse_whitespace(c);
207+
if (*c->json == ',') {
205208
c->json++;
209+
lept_parse_whitespace(c);
210+
}
206211
else if (*c->json == ']') {
207212
c->json++;
208213
v->type = LEPT_ARRAY;
209214
v->u.a.size = size;
210215
size *= sizeof(lept_value);
211-
memcpy(v->u.a.e = (lept_value*)malloc(size), lept_context_pop(c, size), size);
216+
memcpy((v->u.a.e = (lept_value*)malloc(size)), lept_context_pop(c, size), size);
212217
return LEPT_PARSE_OK;
213218
}
214-
else
215-
return LEPT_PARSE_MISS_COMMA_OR_SQUARE_BRACKET;
219+
else {
220+
ret = LEPT_PARSE_MISS_COMMA_OR_SQUARE_BRACKET;
221+
break;
222+
}
223+
}
224+
for (i = 0; i < size; i++) {
225+
lept_free((lept_value*)lept_context_pop(c, sizeof(lept_value)));
216226
}
227+
return ret;
217228
}
218229

219230
static int lept_parse_value(lept_context* c, lept_value* v) {
@@ -250,9 +261,20 @@ int lept_parse(lept_value* v, const char* json) {
250261
}
251262

252263
void lept_free(lept_value* v) {
264+
size_t i;
253265
assert(v != NULL);
254-
if (v->type == LEPT_STRING)
255-
free(v->u.s.s);
266+
switch (v->type) {
267+
case LEPT_STRING:
268+
free(v->u.s.s);
269+
break;
270+
case LEPT_ARRAY:
271+
for (i = 0; i < v->u.a.size; i++) {
272+
lept_free(&v->u.a.e[i]);
273+
}
274+
free(v->u.a.e);
275+
break;
276+
default: break;
277+
}
256278
v->type = LEPT_NULL;
257279
}
258280

tutorial05/test.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,43 @@ static void test_parse_string() {
128128
}
129129

130130
static void test_parse_array() {
131+
size_t i, j;
131132
lept_value v;
132133

133134
lept_init(&v);
134135
EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "[ ]"));
135136
EXPECT_EQ_INT(LEPT_ARRAY, lept_get_type(&v));
136137
EXPECT_EQ_SIZE_T(0, lept_get_array_size(&v));
137138
lept_free(&v);
139+
140+
lept_init(&v);
141+
EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "[ null , false , true , 123 , \"abc\" ]"));
142+
EXPECT_EQ_INT(LEPT_ARRAY, lept_get_type(&v));
143+
EXPECT_EQ_SIZE_T(5, lept_get_array_size(&v));
144+
EXPECT_EQ_INT(LEPT_NULL, lept_get_type(lept_get_array_element(&v, 0)));
145+
EXPECT_EQ_INT(LEPT_FALSE, lept_get_type(lept_get_array_element(&v, 1)));
146+
EXPECT_EQ_INT(LEPT_TRUE, lept_get_type(lept_get_array_element(&v, 2)));
147+
EXPECT_EQ_INT(LEPT_NUMBER, lept_get_type(lept_get_array_element(&v, 3)));
148+
EXPECT_EQ_INT(LEPT_STRING, lept_get_type(lept_get_array_element(&v, 4)));
149+
EXPECT_EQ_DOUBLE(123.0, lept_get_number(lept_get_array_element(&v, 3)));
150+
EXPECT_EQ_STRING("abc", lept_get_string(lept_get_array_element(&v, 4)), lept_get_string_length(lept_get_array_element(&v, 4)));
151+
lept_free(&v);
152+
153+
lept_init(&v);
154+
EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "[ [ ] , [ 0 ] , [ 0 , 1 ] , [ 0 , 1 , 2 ] ]"));
155+
EXPECT_EQ_INT(LEPT_ARRAY, lept_get_type(&v));
156+
EXPECT_EQ_SIZE_T(4, lept_get_array_size(&v));
157+
for (i = 0; i < 4; i++) {
158+
lept_value* a = lept_get_array_element(&v, i);
159+
EXPECT_EQ_INT(LEPT_ARRAY, lept_get_type(a));
160+
EXPECT_EQ_SIZE_T(i, lept_get_array_size(a));
161+
for (j = 0; j < i; j++) {
162+
lept_value* e = lept_get_array_element(a, j);
163+
EXPECT_EQ_INT(LEPT_NUMBER, lept_get_type(e));
164+
EXPECT_EQ_DOUBLE((double)j, lept_get_number(e));
165+
}
166+
}
167+
lept_free(&v);
138168
}
139169

140170
#define TEST_ERROR(error, json)\
@@ -229,7 +259,7 @@ static void test_parse_invalid_unicode_surrogate() {
229259
}
230260

231261
static void test_parse_miss_comma_or_square_bracket() {
232-
#if 0
262+
#if 1
233263
TEST_ERROR(LEPT_PARSE_MISS_COMMA_OR_SQUARE_BRACKET, "[1");
234264
TEST_ERROR(LEPT_PARSE_MISS_COMMA_OR_SQUARE_BRACKET, "[1}");
235265
TEST_ERROR(LEPT_PARSE_MISS_COMMA_OR_SQUARE_BRACKET, "[1 2");

0 commit comments

Comments
 (0)