]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
jsonwrt: add ul_jsonwrt_value_s_sized
authorThomas Weißschuh <thomas@t-8ch.de>
Fri, 8 Dec 2023 17:10:47 +0000 (18:10 +0100)
committerThomas Weißschuh <thomas@t-8ch.de>
Mon, 11 Dec 2023 11:03:44 +0000 (12:03 +0100)
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
include/jsonwrt.h
lib/jsonwrt.c

index 8527516f75d98f6985a9ee45f3a20974036923eb..b450afcf87883491374f40eb05930834a465babe 100644 (file)
@@ -41,6 +41,8 @@ void ul_jsonwrt_value_raw(struct ul_jsonwrt *fmt,
                        const char *name, const char *data);
 void ul_jsonwrt_value_s(struct ul_jsonwrt *fmt,
                        const char *name, const char *data);
+void ul_jsonwrt_value_s_sized(struct ul_jsonwrt *fmt,
+                             const char *name, const char *data, size_t size);
 void ul_jsonwrt_value_u64(struct ul_jsonwrt *fmt,
                        const char *name, uint64_t data);
 void ul_jsonwrt_value_double(struct ul_jsonwrt *fmt,
index 6008a839c085bd3350a718055db44d0ae900081b..dc20d2e46e4593019a5c547937fd77dfbcb9e5f2 100644 (file)
  *     }
  * }
  */
-static void fputs_quoted_case_json(const char *data, FILE *out, int dir)
+static void fputs_quoted_case_json(const char *data, FILE *out, int dir, size_t size)
 {
        const char *p;
 
        fputc('"', out);
-       for (p = data; p && *p; p++) {
+       for (p = data; p && *p && (!size || p < data + size); p++) {
 
                const unsigned int c = (unsigned int) *p;
 
@@ -98,9 +98,9 @@ static void fputs_quoted_case_json(const char *data, FILE *out, int dir)
        fputc('"', out);
 }
 
-#define fputs_quoted_json(_d, _o)       fputs_quoted_case_json(_d, _o, 0)
-#define fputs_quoted_json_upper(_d, _o) fputs_quoted_case_json(_d, _o, 1)
-#define fputs_quoted_json_lower(_d, _o) fputs_quoted_case_json(_d, _o, -1)
+#define fputs_quoted_json(_d, _o)       fputs_quoted_case_json(_d, _o, 0, 0)
+#define fputs_quoted_json_upper(_d, _o) fputs_quoted_case_json(_d, _o, 1, 0)
+#define fputs_quoted_json_lower(_d, _o) fputs_quoted_case_json(_d, _o, -1, 0)
 
 void ul_jsonwrt_init(struct ul_jsonwrt *fmt, FILE *out, int indent)
 {
@@ -204,6 +204,17 @@ void ul_jsonwrt_value_s(struct ul_jsonwrt *fmt,
        ul_jsonwrt_value_close(fmt);
 }
 
+void ul_jsonwrt_value_s_sized(struct ul_jsonwrt *fmt,
+                             const char *name, const char *data, size_t size)
+{
+       ul_jsonwrt_value_open(fmt, name);
+       if (data && *data)
+               fputs_quoted_case_json(data, fmt->out, 0, size);
+       else
+               fputs("null", fmt->out);
+       ul_jsonwrt_value_close(fmt);
+}
+
 void ul_jsonwrt_value_u64(struct ul_jsonwrt *fmt,
                        const char *name, uint64_t data)
 {