sync json.{c,h} changes, add valuelen parameter - frontends - front-ends for some sites (experiment)
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 74c6d298f57f895cc82d55b5da2a5d710156cb27
(DIR) parent a9e2584bc6c2b314c4f1b6d6a5f4715161d64bc5
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Tue, 4 Apr 2023 18:51:43 +0200
sync json.{c,h} changes, add valuelen parameter
Diffstat:
M json.c | 16 +++++++++-------
M json.h | 2 +-
M reddit/reddit.c | 4 ++--
M twitch/twitch.c | 10 +++++-----
M youtube/youtube.c | 4 ++--
5 files changed, 19 insertions(+), 17 deletions(-)
---
(DIR) diff --git a/json.c b/json.c
@@ -8,6 +8,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)
@@ -118,7 +119,8 @@ capacity(char **value, size_t *sz, size_t cur, size_t inc)
int
parsejson(const char *s, size_t slen,
- void (*cb)(struct json_node *, size_t, const char *, void *), void *pp)
+ void (*cb)(struct json_node *, size_t, const char *, size_t, void *),
+ void *pp)
{
struct json_node nodes[JSON_MAX_NODE_DEPTH] = { { 0 } };
size_t depth = 0, p = 0, len, sz = 0;
@@ -231,7 +233,7 @@ escchr:
goto end;
memcpy(nodes[depth].name, str, len);
} else {
- cb(nodes, depth + 1, str, pp);
+ cb(nodes, depth + 1, str, len - 1, pp); /* length excluding NUL byte */
}
break;
} else {
@@ -260,7 +262,7 @@ escchr:
expect = EXPECT_OBJECT_STRING;
}
- cb(nodes, depth + 1, "", pp);
+ cb(nodes, depth + 1, "", 0, pp);
depth++;
nodes[depth].index = 0;
@@ -295,7 +297,7 @@ escchr:
if (GETNEXT() != 'r' || GETNEXT() != 'u' || GETNEXT() != 'e')
JSON_INVALID();
nodes[depth].type = JSON_TYPE_BOOL;
- cb(nodes, depth + 1, "true", pp);
+ cb(nodes, depth + 1, "true", 4, pp);
expect = EXPECT_END;
break;
case 'f': /* false */
@@ -303,14 +305,14 @@ escchr:
GETNEXT() != 'e')
JSON_INVALID();
nodes[depth].type = JSON_TYPE_BOOL;
- cb(nodes, depth + 1, "false", pp);
+ cb(nodes, depth + 1, "false", 5, pp);
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", pp);
+ cb(nodes, depth + 1, "null", 4, pp);
expect = EXPECT_END;
break;
default: /* number */
@@ -325,7 +327,7 @@ escchr:
c != '+' && c != '-' && c != '.') ||
p + 1 >= sizeof(pri)) {
pri[p] = '\0';
- cb(nodes, depth + 1, pri, pp);
+ cb(nodes, depth + 1, pri, p, pp);
goto handlechr; /* do not read next char, handle this */
} else {
pri[p++] = c;
(DIR) diff --git a/json.h b/json.h
@@ -27,6 +27,6 @@ struct json_node {
};
int parsejson(const char *, size_t,
- void (*cb)(struct json_node *, size_t, const char *, void *),
+ void (*cb)(struct json_node *, size_t, const char *, size_t, void *),
void *);
#endif
(DIR) diff --git a/reddit/reddit.c b/reddit/reddit.c
@@ -26,7 +26,7 @@ reddit_request(const char *path)
/* unmarshal JSON response, skip HTTP headers */
int
json_unmarshal(const char *data,
- void (*cb)(struct json_node *, size_t, const char *, void *),
+ void (*cb)(struct json_node *, size_t, const char *, size_t, void *),
void *pp)
{
const char *s;
@@ -79,7 +79,7 @@ reddit_list_data(const char *subreddit, int limit,
}
void
-reddit_list_processnode(struct json_node *nodes, size_t depth, const char *value,
+reddit_list_processnode(struct json_node *nodes, size_t depth, const char *value, size_t valuelen,
void *pp)
{
struct list_response *r = (struct list_response *)pp;
(DIR) diff --git a/twitch/twitch.c b/twitch/twitch.c
@@ -32,7 +32,7 @@ twitch_request(const char *path)
/* unmarshal JSON response, skip HTTP headers */
int
json_unmarshal(const char *data,
- void (*cb)(struct json_node *, size_t, const char *, void *),
+ void (*cb)(struct json_node *, size_t, const char *, size_t, void *),
void *pp)
{
const char *s;
@@ -133,7 +133,7 @@ twitch_games_top_data(void)
}
void
-twitch_games_processnode(struct json_node *nodes, size_t depth, const char *value,
+twitch_games_processnode(struct json_node *nodes, size_t depth, const char *value, size_t valuelen,
void *pp)
{
struct games_response *r = (struct games_response *)pp;
@@ -218,7 +218,7 @@ twitch_games_bygameids(const char *param)
}
void
-twitch_streams_processnode(struct json_node *nodes, size_t depth, const char *value,
+twitch_streams_processnode(struct json_node *nodes, size_t depth, const char *value, size_t valuelen,
void *pp)
{
struct streams_response *r = (struct streams_response *)pp;
@@ -392,7 +392,7 @@ twitch_streams_users(struct streams_response *r)
}
void
-twitch_users_processnode(struct json_node *nodes, size_t depth, const char *value,
+twitch_users_processnode(struct json_node *nodes, size_t depth, const char *value, size_t valuelen,
void *pp)
{
struct users_response *r = (struct users_response *)pp;
@@ -485,7 +485,7 @@ twitch_users_bylogin(const char *login)
}
void
-twitch_videos_processnode(struct json_node *nodes, size_t depth, const char *value,
+twitch_videos_processnode(struct json_node *nodes, size_t depth, const char *value, size_t valuelen,
void *pp)
{
struct videos_response *r = (struct videos_response *)pp;
(DIR) diff --git a/youtube/youtube.c b/youtube/youtube.c
@@ -148,7 +148,7 @@ extractjson_video(const char *s, const char **start, const char **end)
}
static void
-processnode_search(struct json_node *nodes, size_t depth, const char *value,
+processnode_search(struct json_node *nodes, size_t depth, const char *value, size_t valuelen,
void *pp)
{
struct search_response *r = (struct search_response *)pp;
@@ -308,7 +308,7 @@ parse_search_response(const char *data)
}
static void
-processnode_video(struct json_node *nodes, size_t depth, const char *value,
+processnode_video(struct json_node *nodes, size_t depth, const char *value, size_t valuelen,
void *pp)
{
struct video_response *r = (struct video_response *)pp;