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