From: Zbigniew Jędrzejewski-Szmek Date: Fri, 28 Aug 2020 17:47:19 +0000 (+0200) Subject: json: split out string formatting to a separate function X-Git-Tag: v247-rc1~318^2~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e12b6e1951dd1dcde6c0c10fda0b9bb148e1847c;p=thirdparty%2Fsystemd.git json: split out string formatting to a separate function It's complicated enough to deserve it's own function. No functional change. --- diff --git a/src/shared/json.c b/src/shared/json.c index 04c721e1570..11ad6091a42 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -1482,6 +1482,58 @@ static int print_source(FILE *f, JsonVariant *v, JsonFormatFlags flags, bool whi return 0; } +static void json_format_string(FILE *f, const char *q, JsonFormatFlags flags) { + assert(q); + + fputc('"', f); + + if (flags & JSON_FORMAT_COLOR) + fputs(ANSI_GREEN, f); + + for (; *q; q++) + switch (*q) { + case '"': + fputs("\\\"", f); + break; + + case '\\': + fputs("\\\\", f); + break; + + case '\b': + fputs("\\b", f); + break; + + case '\f': + fputs("\\f", f); + break; + + case '\n': + fputs("\\n", f); + break; + + case '\r': + fputs("\\r", f); + break; + + case '\t': + fputs("\\t", f); + break; + + default: + if ((signed char) *q >= 0 && *q < ' ') + fprintf(f, "\\u%04x", *q); + else + fputc(*q, f); + break; + } + + if (flags & JSON_FORMAT_COLOR) + fputs(ANSI_NORMAL, f); + + fputc('"', f); +} + static int json_format(FILE *f, JsonVariant *v, JsonFormatFlags flags, const char *prefix) { int r; @@ -1554,61 +1606,9 @@ static int json_format(FILE *f, JsonVariant *v, JsonFormatFlags flags, const cha fputs(ANSI_NORMAL, f); break; - case JSON_VARIANT_STRING: { - const char *q; - - fputc('"', f); - - if (flags & JSON_FORMAT_COLOR) - fputs(ANSI_GREEN, f); - - for (q = json_variant_string(v); *q; q++) { - - switch (*q) { - - case '"': - fputs("\\\"", f); - break; - - case '\\': - fputs("\\\\", f); - break; - - case '\b': - fputs("\\b", f); - break; - - case '\f': - fputs("\\f", f); - break; - - case '\n': - fputs("\\n", f); - break; - - case '\r': - fputs("\\r", f); - break; - - case '\t': - fputs("\\t", f); - break; - - default: - if ((signed char) *q >= 0 && *q < ' ') - fprintf(f, "\\u%04x", *q); - else - fputc(*q, f); - break; - } - } - - if (flags & JSON_FORMAT_COLOR) - fputs(ANSI_NORMAL, f); - - fputc('"', f); + case JSON_VARIANT_STRING: + json_format_string(f, json_variant_string(v), flags); break; - } case JSON_VARIANT_ARRAY: { size_t i, n;