From 22f8aed31e54dc801e9682c93cdbf51d8a83a303 Mon Sep 17 00:00:00 2001 From: Stephen Dolan Date: Sun, 2 Sep 2012 00:24:23 +0100 Subject: [PATCH] Validation for empty objects Now (correctly) fails to parse {,} --- c/jv.c | 16 ++++++++++++++++ c/jv.h | 1 + c/jv_parse.c | 3 ++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/c/jv.c b/c/jv.c index 6f72c9d4..3029904b 100644 --- a/c/jv.c +++ b/c/jv.c @@ -632,6 +632,15 @@ static int jvp_object_delete(jv_complex* object, jvp_string* key) { return 0; } +static int jvp_object_length(jv_complex* object) { + int n = 0; + for (int i=0; istring) n++; + } + return n; +} + /* * Objects (public interface) */ @@ -670,6 +679,13 @@ jv jv_object_delete(jv object, jv key) { return object; } +int jv_object_length(jv object) { + assert(jv_get_kind(object) == JV_KIND_OBJECT); + int n = jvp_object_length(&object.val.complex); + jv_free(object); + return n; +} + /* * Object iteration (internal helpers) */ diff --git a/c/jv.h b/c/jv.h index d815827a..44fe4798 100644 --- a/c/jv.h +++ b/c/jv.h @@ -109,6 +109,7 @@ jv jv_object(); jv jv_object_get(jv object, jv key); jv jv_object_set(jv object, jv key, jv value); jv jv_object_delete(jv object, jv key); +int jv_object_length(jv object); int jv_object_iter(jv); int jv_object_iter_next(jv, int); diff --git a/c/jv_parse.c b/c/jv_parse.c index 4f7ef019..31e8d68d 100644 --- a/c/jv_parse.c +++ b/c/jv_parse.c @@ -100,7 +100,8 @@ pfunc token(char ch) { } else { if (jv_get_kind(stack[stackpos-1]) != JV_KIND_OBJECT) return "Unmatched '}'"; - // FIXME: assert object empty + if (jv_object_length(jv_copy(stack[stackpos-1])) != 0) + return "Expected another key-value pair"; } hasnext = 1; next = stack[--stackpos];