From 0af2ea7923693b3e25e709b469650f2e3cde9c1f Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Sun, 17 Jan 2021 13:21:05 +0100
Subject: [PATCH] BASE: Now when the string begins by '"', the end of it is not
 the following space but the next '"'

---
 src/base/json.c | 37 ++++++++++++++++++++++---------------
 1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/src/base/json.c b/src/base/json.c
index 5f2de939..1d5ffda2 100644
--- a/src/base/json.c
+++ b/src/base/json.c
@@ -10,6 +10,7 @@
 #define __JSON_SPACE " \n\t:=,"
 #define __JSON_BEGIN "{["
 #define __JSON_END   "}]"
+#define __JSON_SEP   '"'
 
 static inline char *
 strip(char *s)
@@ -30,11 +31,27 @@ skip(char *s)
 
 #define __SKIP_JSON(str) (str = &str[strspn(str, __JSON_SPACE)])
 
+#define __NEXT_JSON(str, len, is_paren, dest)                       \
+{                                                                   \
+    is_paren = 0;                                                   \
+    if (str[0] == __JSON_SEP) {                                     \
+        ++str;                                                      \
+        char *end = strchr(str, __JSON_SEP);                        \
+        len = (end - str);                                          \
+        is_paren = 1;                                               \
+    } else                                                          \
+        len = strcspn(str, __JSON_SPACE __JSON_BEGIN __JSON_END);   \
+    if (level == asked_level && len < LKT_LINE_MAX - 1)             \
+        strncpy(dest, str, len);                                    \
+    str += len + is_paren;                                          \
+}
+
 int
 json_parse(const char *str, int asked_level, json_parse_callback call, void *user)
 {
-    int level   = 0;
-    int new_obj = 1;
+    int level    = 0;
+    int new_obj  = 1;
+    int is_paren = 0;
     char key[LKT_LINE_MAX];
     char val[LKT_LINE_MAX];
 
@@ -61,24 +78,14 @@ json_parse(const char *str, int asked_level, json_parse_callback call, void *use
             memset(key, 0, sizeof(key));
             memset(val, 0, sizeof(val));
 
-            len = strcspn(str, __JSON_SPACE __JSON_BEGIN __JSON_END);
-            if (level == asked_level && len < LKT_LINE_MAX - 1)
-                strncpy(key, str, len);
-            str += len;
-
+            __NEXT_JSON(str, len, is_paren, key);
             __SKIP_JSON(str);
-
-            len = strcspn(str, __JSON_SPACE __JSON_BEGIN __JSON_END);
-            if (level == asked_level && len < LKT_LINE_MAX - 1)
-                strncpy(val, str, len);
-            str += len;
+            __NEXT_JSON(str, len, is_paren, val);
 
             if (asked_level == level)
                 call(key, val, new_obj, user);
 
-            if (new_obj)
-                new_obj = 0;
-
+            new_obj = 0;
         }
 
         if (level <= 0) {
-- 
GitLab