Browse Source

Allow jim_member_key() to be used only in the Object scope

Close #3
rexim 4 years ago
parent
commit
8d86feadce
1 changed files with 11 additions and 5 deletions
  1. 11 5
      jim.h

+ 11 - 5
jim.h

@@ -19,7 +19,13 @@ typedef enum {
 
 const char *jim_error_string(Jim_Error error);
 
+typedef enum {
+    JIM_ARRAY_SCOPE,
+    JIM_OBJECT_SCOPE,
+} Jim_Scope_Kind;
+
 typedef struct {
+    Jim_Scope_Kind kind;
     int tail;
     int key;
 } Jim_Scope;
@@ -61,10 +67,11 @@ static size_t jim_strlen(const char *s)
     return count;
 }
 
-static void jim_stack_push(Jim *jim)
+static void jim_stack_push(Jim *jim, Jim_Scope_Kind kind)
 {
     if (jim->error == JIM_OK) {
         if (jim->stack_size < JIM_STACK_CAPACITY) {
+            jim->stack[jim->stack_size].kind = kind;
             jim->stack[jim->stack_size].tail = 0;
             jim->stack[jim->stack_size].key = 0;
             jim->stack_size += 1;
@@ -309,7 +316,7 @@ void jim_array_begin(Jim *jim)
     if (jim->error == JIM_OK) {
         jim_element_begin(jim);
         jim_write_cstr(jim, "[");
-        jim_stack_push(jim);
+        jim_stack_push(jim, JIM_ARRAY_SCOPE);
     }
 }
 
@@ -328,17 +335,16 @@ void jim_object_begin(Jim *jim)
     if (jim->error == JIM_OK) {
         jim_element_begin(jim);
         jim_write_cstr(jim, "{");
-        jim_stack_push(jim);
+        jim_stack_push(jim, JIM_OBJECT_SCOPE);
     }
 }
 
 void jim_member_key(Jim *jim, const char *str, const unsigned int *size)
 {
-    // TODO(#3): jim_member_key does not throw an error when used inside of array scope instead of object scope
     if (jim->error == JIM_OK) {
         jim_element_begin(jim);
         Jim_Scope *scope = jim_stack_top(jim);
-        if (scope) {
+        if (scope && scope->kind == JIM_OBJECT_SCOPE) {
             if (!scope->key) {
                 jim_string_no_element(jim, str, size);
                 jim_write_cstr(jim, ":");