diff --git a/jemi.c b/jemi.c index a037c5b..fcd78c6 100644 --- a/jemi.c +++ b/jemi.c @@ -147,6 +147,14 @@ jemi_node_t *jemi_integer(int64_t value) { return node; } +jemi_node_t *jemi_uinteger(uint64_t value) { + jemi_node_t *node = jemi_alloc(JEMI_UINTEGER); + if (node) { + node->uinteger = value; + } + return node; +} + jemi_node_t *jemi_string(const char *string) { jemi_node_t *node = jemi_alloc(JEMI_STRING); if (node) { @@ -337,6 +345,12 @@ static void emit_aux(jemi_node_t *root, jemi_writer_t writer_fn, void *arg, emit_string(writer_fn, arg, buf); } break; + case JEMI_UINTEGER: { + char buf[22]; // 21 digits, 1 null + snprintf(buf, sizeof(buf), "%llu", node->uinteger); + emit_string(writer_fn, arg, buf); + } break; + case JEMI_STRING: { writer_fn('"', arg); emit_string(writer_fn, arg, node->string); @@ -380,6 +394,9 @@ static jemi_node_t *copy_node(jemi_node_t *node) { case JEMI_INTEGER: { copy->integer = node->integer; } + case JEMI_UINTEGER: { + copy->uinteger = node->uinteger; + } default: { // no action needed } diff --git a/jemi.h b/jemi.h index 6741b92..daeb347 100644 --- a/jemi.h +++ b/jemi.h @@ -56,6 +56,7 @@ typedef enum { JEMI_ARRAY, JEMI_FLOAT, JEMI_INTEGER, + JEMI_UINTEGER, JEMI_STRING, JEMI_TRUE, JEMI_FALSE, @@ -69,6 +70,7 @@ typedef struct _jemi_node { struct _jemi_node *children; // for JEMI_ARRAY or JEMI_OBJECT double number; // for JEMI_FLOAT int64_t integer; // for JEMI_INTEGER + uint64_t uinteger; // for JEMI_UINTEGER const char *string; // for JEMI_STRING }; } jemi_node_t; @@ -143,6 +145,7 @@ jemi_node_t *jemi_float(double value); * more compactly than using jemi_float(). */ jemi_node_t *jemi_integer(int64_t value); +jemi_node_t *jemi_uinteger(uint64_t value); /** * @brief Create a JSON string.