From 88f3389d992245aee145f17bf2a3f62638842930 Mon Sep 17 00:00:00 2001 From: HalidOdat Date: Mon, 21 Jun 2021 03:56:02 +0200 Subject: [PATCH 1/2] Implement scope mismatch --- jim.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/jim.h b/jim.h index 12f38f0..a36a101 100644 --- a/jim.h +++ b/jim.h @@ -14,6 +14,7 @@ typedef enum { JIM_SCOPES_OVERFLOW, JIM_SCOPES_UNDERFLOW, JIM_OUT_OF_SCOPE_KEY, + JIM_SCOPE_MISMATCH, JIM_DOUBLE_KEY } Jim_Error; @@ -169,6 +170,8 @@ const char *jim_error_string(Jim_Error error) return "Stack of Scopes Underflow"; case JIM_OUT_OF_SCOPE_KEY: return "Out of Scope key"; + case JIM_SCOPE_MISMATCH: + return "Scope mismatch"; case JIM_DOUBLE_KEY: return "Tried to set the member key twice"; default: @@ -333,6 +336,12 @@ void jim_array_begin(Jim *jim) void jim_array_end(Jim *jim) { if (jim->error == JIM_OK) { + Jim_Scope *scope = jim_current_scope(jim); + if (scope->kind != JIM_ARRAY_SCOPE) { + jim->error = JIM_SCOPE_MISMATCH; + return; + } + jim_write_cstr(jim, "]"); jim_scope_pop(jim); jim_element_end(jim); @@ -377,6 +386,12 @@ void jim_member_key_sized(Jim *jim, const char *str, size_t size) void jim_object_end(Jim *jim) { if (jim->error == JIM_OK) { + Jim_Scope *scope = jim_current_scope(jim); + if (scope->kind != JIM_OBJECT_SCOPE) { + jim->error = JIM_SCOPE_MISMATCH; + return; + } + jim_write_cstr(jim, "}"); jim_scope_pop(jim); jim_element_end(jim); From c50d29f3cc5e454283f9b39860a77cee1534671f Mon Sep 17 00:00:00 2001 From: HalidOdat Date: Mon, 21 Jun 2021 12:53:05 +0200 Subject: [PATCH 2/2] Check if scope is empty --- jim.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/jim.h b/jim.h index a36a101..0869ae0 100644 --- a/jim.h +++ b/jim.h @@ -337,6 +337,11 @@ void jim_array_end(Jim *jim) { if (jim->error == JIM_OK) { Jim_Scope *scope = jim_current_scope(jim); + if (!scope) { + jim->error = JIM_SCOPES_UNDERFLOW; + return; + } + if (scope->kind != JIM_ARRAY_SCOPE) { jim->error = JIM_SCOPE_MISMATCH; return; @@ -387,6 +392,11 @@ void jim_object_end(Jim *jim) { if (jim->error == JIM_OK) { Jim_Scope *scope = jim_current_scope(jim); + if (!scope) { + jim->error = JIM_SCOPES_UNDERFLOW; + return; + } + if (scope->kind != JIM_OBJECT_SCOPE) { jim->error = JIM_SCOPE_MISMATCH; return;