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;