sync json.{c,h} - jfconvert - JSON Feed (subset) to sfeed or Atom converter
(HTM) git clone git://git.codemadness.org/jfconvert
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 469bc51805a16876507da21e3145e05bb3c57e72
(DIR) parent 59db718080ecd81eeaff6ac50298d488044c3001
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Tue, 4 Apr 2023 18:35:43 +0200
sync json.{c,h}
Diffstat:
M jf2atom.c | 2 +-
M json.c | 15 ++++++++-------
M json.h | 2 +-
3 files changed, 10 insertions(+), 9 deletions(-)
---
(DIR) diff --git a/jf2atom.c b/jf2atom.c
@@ -38,7 +38,7 @@ xmlencode(const char *s, FILE *fp)
}
void
-processnode(struct json_node *nodes, size_t depth, const char *value)
+processnode(struct json_node *nodes, size_t depth, const char *value, size_t valuelen)
{
const char *outtag, *outtype, *outhref;
(DIR) diff --git a/json.c b/json.c
@@ -10,6 +10,7 @@
#include "json.h"
+/* ctype-like macros, but always compatible with ASCII / UTF-8 */
#define ISDIGIT(c) (((unsigned)c) - '0' < 10)
#define ISXDIGIT(c) ((((unsigned)c) - '0' < 10) || ((unsigned)c | 32) - 'a' < 6)
@@ -93,7 +94,7 @@ capacity(char **value, size_t *sz, size_t cur, size_t inc)
#define JSON_INVALID() do { ret = JSON_ERROR_INVALID; goto end; } while (0);
int
-parsejson(void (*cb)(struct json_node *, size_t, const char *))
+parsejson(void (*cb)(struct json_node *, size_t, const char *, size_t))
{
struct json_node nodes[JSON_MAX_NODE_DEPTH] = { { 0 } };
size_t depth = 0, p = 0, len, sz = 0;
@@ -204,7 +205,7 @@ escchr:
goto end;
memcpy(nodes[depth].name, str, len);
} else {
- cb(nodes, depth + 1, str);
+ cb(nodes, depth + 1, str, len - 1); /* length excluding NUL byte */
}
break;
} else {
@@ -233,7 +234,7 @@ escchr:
expect = EXPECT_OBJECT_STRING;
}
- cb(nodes, depth + 1, "");
+ cb(nodes, depth + 1, "", 0);
depth++;
nodes[depth].index = 0;
@@ -268,7 +269,7 @@ escchr:
if (GETNEXT() != 'r' || GETNEXT() != 'u' || GETNEXT() != 'e')
JSON_INVALID();
nodes[depth].type = JSON_TYPE_BOOL;
- cb(nodes, depth + 1, "true");
+ cb(nodes, depth + 1, "true", 4);
expect = EXPECT_END;
break;
case 'f': /* false */
@@ -276,14 +277,14 @@ escchr:
GETNEXT() != 'e')
JSON_INVALID();
nodes[depth].type = JSON_TYPE_BOOL;
- cb(nodes, depth + 1, "false");
+ cb(nodes, depth + 1, "false", 5);
expect = EXPECT_END;
break;
case 'n': /* null */
if (GETNEXT() != 'u' || GETNEXT() != 'l' || GETNEXT() != 'l')
JSON_INVALID();
nodes[depth].type = JSON_TYPE_NULL;
- cb(nodes, depth + 1, "null");
+ cb(nodes, depth + 1, "null", 4);
expect = EXPECT_END;
break;
default: /* number */
@@ -298,7 +299,7 @@ escchr:
c != '+' && c != '-' && c != '.') ||
p + 1 >= sizeof(pri)) {
pri[p] = '\0';
- cb(nodes, depth + 1, pri);
+ cb(nodes, depth + 1, pri, p);
goto handlechr; /* do not read next char, handle this */
} else {
pri[p++] = c;
(DIR) diff --git a/json.h b/json.h
@@ -26,5 +26,5 @@ struct json_node {
size_t index; /* count/index for array or object type */
};
-int parsejson(void (*cb)(struct json_node *, size_t, const char *));
+int parsejson(void (*cb)(struct json_node *, size_t, const char *, size_t));
#endif