src/json.c

changeset 1121
7fd2672199d7
parent 1119
ff4d7e76f85a
child 1122
49ab92de9a13
--- a/src/json.c	Fri Jan 10 23:16:36 2025 +0100
+++ b/src/json.c	Sat Jan 11 12:33:10 2025 +0100
@@ -27,13 +27,11 @@
  */
 
 #include "cx/json.h"
-#include "cx/compare.h"
 
 #include <string.h>
 #include <ctype.h>
 #include <assert.h>
 #include <stdio.h>
-#include <errno.h>
 #include <inttypes.h>
 
 /*
@@ -429,7 +427,7 @@
     return str;
 }
 
-static CxJsonValue* create_json_value(CxJson *json, CxJsonValueType type) {
+static CxJsonValue* json_create_value(CxJson *json, CxJsonValueType type) {
     CxJsonValue *v = cxCalloc(json->allocator, 1, sizeof(CxJsonValue));
     if (v == NULL) return NULL; // LCOV_EXCL_LINE
 
@@ -595,21 +593,21 @@
         json_add_state(json, 10 + state);
         switch (token.tokentype) {
             case CX_JSON_TOKEN_BEGIN_ARRAY: {
-                if (create_json_value(json, CX_JSON_ARRAY) == NULL) {
+                if (json_create_value(json, CX_JSON_ARRAY) == NULL) {
                     return_rec(CX_JSON_VALUE_ALLOC_FAILED); // LCOV_EXCL_LINE
                 }
                 json_add_state(json, JP_STATE_VALUE_BEGIN_AR);
                 return_rec(CX_JSON_NO_ERROR);
             }
             case CX_JSON_TOKEN_BEGIN_OBJECT: {
-                if (create_json_value(json, CX_JSON_OBJECT) == NULL) {
+                if (json_create_value(json, CX_JSON_OBJECT) == NULL) {
                     return_rec(CX_JSON_VALUE_ALLOC_FAILED); // LCOV_EXCL_LINE
                 }
                 json_add_state(json, JP_STATE_OBJ_NAME_OR_CLOSE);
                 return_rec(CX_JSON_NO_ERROR);
             }
             case CX_JSON_TOKEN_STRING: {
-                if ((vbuf = create_json_value(json, CX_JSON_STRING)) == NULL) {
+                if ((vbuf = json_create_value(json, CX_JSON_STRING)) == NULL) {
                     return_rec(CX_JSON_VALUE_ALLOC_FAILED); // LCOV_EXCL_LINE
                 }
                 cxmutstr str = unescape_string(json->allocator, token.content);
@@ -622,7 +620,7 @@
             case CX_JSON_TOKEN_INTEGER:
             case CX_JSON_TOKEN_NUMBER: {
                 int type = token.tokentype == CX_JSON_TOKEN_INTEGER ? CX_JSON_INTEGER : CX_JSON_NUMBER;
-                if (NULL == (vbuf = create_json_value(json, type))) {
+                if (NULL == (vbuf = json_create_value(json, type))) {
                     return_rec(CX_JSON_VALUE_ALLOC_FAILED); // LCOV_EXCL_LINE
                 }
                 if (type == CX_JSON_INTEGER) {
@@ -637,7 +635,7 @@
                 return_rec(CX_JSON_NO_ERROR);
             }
             case CX_JSON_TOKEN_LITERAL: {
-                if ((vbuf = create_json_value(json, CX_JSON_LITERAL)) == NULL) {
+                if ((vbuf = json_create_value(json, CX_JSON_LITERAL)) == NULL) {
                     return_rec(CX_JSON_VALUE_ALLOC_FAILED); // LCOV_EXCL_LINE
                 }
                 if (0 == cx_strcmp(cx_strcast(token.content), cx_str("true"))) {
@@ -868,7 +866,7 @@
 
 // LCOV_EXCL_START
 // never called as long as malloc() does not return NULL
-static void cx_json_arr_free_temp(CxJsonValue** values, size_t count) {
+static void json_arr_free_temp(CxJsonValue** values, size_t count) {
     for (size_t i = 0; i < count; i++) {
         if (values[i] == NULL) break;
         cxJsonValueFree(values[i]);
@@ -882,7 +880,7 @@
     if (values == NULL) return -1;
     for (size_t i = 0; i < count; i++) {
         values[i] = cxJsonCreateNumber(arr->allocator, num[i]);
-        if (values[i] == NULL) { cx_json_arr_free_temp(values, count); return -1; }
+        if (values[i] == NULL) { json_arr_free_temp(values, count); return -1; }
     }
     int ret = cxJsonArrAddValues(arr, values, count);
     free(values);
@@ -894,7 +892,7 @@
     if (values == NULL) return -1;
     for (size_t i = 0; i < count; i++) {
         values[i] = cxJsonCreateInteger(arr->allocator, num[i]);
-        if (values[i] == NULL) { cx_json_arr_free_temp(values, count); return -1; }
+        if (values[i] == NULL) { json_arr_free_temp(values, count); return -1; }
     }
     int ret = cxJsonArrAddValues(arr, values, count);
     free(values);
@@ -906,7 +904,7 @@
     if (values == NULL) return -1;
     for (size_t i = 0; i < count; i++) {
         values[i] = cxJsonCreateString(arr->allocator, str[i]);
-        if (values[i] == NULL) { cx_json_arr_free_temp(values, count); return -1; }
+        if (values[i] == NULL) { json_arr_free_temp(values, count); return -1; }
     }
     int ret = cxJsonArrAddValues(arr, values, count);
     free(values);
@@ -918,7 +916,7 @@
     if (values == NULL) return -1;
     for (size_t i = 0; i < count; i++) {
         values[i] = cxJsonCreateCxString(arr->allocator, str[i]);
-        if (values[i] == NULL) { cx_json_arr_free_temp(values, count); return -1; }
+        if (values[i] == NULL) { json_arr_free_temp(values, count); return -1; }
     }
     int ret = cxJsonArrAddValues(arr, values, count);
     free(values);
@@ -930,7 +928,7 @@
     if (values == NULL) return -1;
     for (size_t i = 0; i < count; i++) {
         values[i] = cxJsonCreateLiteral(arr->allocator, lit[i]);
-        if (values[i] == NULL) { cx_json_arr_free_temp(values, count); return -1; }
+        if (values[i] == NULL) { json_arr_free_temp(values, count); return -1; }
     }
     int ret = cxJsonArrAddValues(arr, values, count);
     free(values);
@@ -1039,16 +1037,14 @@
     }
 }
 
-static const CxJsonWriter cx_json_writer_default = {
-    false,
-    true,
-    6,
-    false,
-    4
-};
-
 CxJsonWriter cxJsonWriterCompact(void) {
-    return cx_json_writer_default;
+    return (CxJsonWriter) {
+        false,
+        true,
+        6,
+        false,
+        4
+    };
 }
 
 CxJsonWriter cxJsonWriterPretty(bool use_spaces) {
@@ -1324,12 +1320,13 @@
     cx_write_func wfunc,
     const CxJsonWriter *settings
 ) {
-    if (settings == NULL) {
-        settings = &cx_json_writer_default;
-    }
     assert(target != NULL);
     assert(value != NULL);
     assert(wfunc != NULL);
 
+    CxJsonWriter writer_default = cxJsonWriterCompact();
+    if (settings == NULL) {
+        settings = &writer_default;
+    }
     return cx_json_write_rec(target, value, wfunc, settings, 0);
 }

mercurial