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