]> 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>
Tue, 12 Dec 2023 11:47:54 +0000 (12:47 +0100)
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
(cherry picked from commit e60bc3a1a1d0d976a408b9edf21e7d755af88fe6)

include/jsonwrt.h
lib/jsonwrt.c

index 421903aab375a55010a3df62d4646ba2e97063ad..93fd730c6c60476c5985d712ffeaf87b65a732aa 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_boolean(struct ul_jsonwrt *fmt,
index 8ca1d4d9a3b2e687940c448d35d8b0c0d042d15a..d35048bfe46a57b92c0b83b343a461c6dad342b7 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)
 {