From e9b59df0ab0e18037c1499c6f98f6fe78cf95d41 Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Fri, 3 Jul 2015 19:25:06 -0700 Subject: [PATCH] std.format - better formatChar() --- std/format.d | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/std/format.d b/std/format.d index 450e927e54f..54e21089166 100644 --- a/std/format.d +++ b/std/format.d @@ -2511,37 +2511,36 @@ private void formatChar(Writer)(Writer w, in dchar c, in char quote) { import std.uni : isGraphical; + string fmt; if (std.uni.isGraphical(c)) { if (c == quote || c == '\\') - { put(w, '\\'); - put(w, c); - } - else - put(w, c); + put(w, c); + return; } else if (c <= 0xFF) { - put(w, '\\'); - switch (c) + if (c < 0x20) { - case '\0': put(w, '0'); break; - case '\a': put(w, 'a'); break; - case '\b': put(w, 'b'); break; - case '\f': put(w, 'f'); break; - case '\n': put(w, 'n'); break; - case '\r': put(w, 'r'); break; - case '\t': put(w, 't'); break; - case '\v': put(w, 'v'); break; - default: - formattedWrite(w, "x%02X", cast(uint)c); + foreach (i, k; "\n\r\t\a\b\f\v\0") + { + if (c == k) + { + put(w, '\\'); + put(w, "nrtabfv0"[i]); + return; + } + } } + fmt = "\\x%02X"; } else if (c <= 0xFFFF) - formattedWrite(w, "\\u%04X", cast(uint)c); + fmt = "\\u%04X"; else - formattedWrite(w, "\\U%08X", cast(uint)c); + fmt = "\\U%08X"; + + formattedWrite(w, fmt, cast(uint)c); } // undocumented because of deprecation