From fef51722783e20123b58018ba0863dcce3974671 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 18 Nov 2020 23:40:54 +0000 Subject: [PATCH] Add `%q` for runes in fmt --- core/fmt/fmt.odin | 2 ++ core/strings/builder.odin | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 8a0d475d8..7eca5f503 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -776,6 +776,8 @@ fmt_rune :: proc(fi: ^Info, r: rune, verb: rune) { switch verb { case 'c', 'r', 'v': strings.write_rune(fi.buf, r); + case 'q': + strings.write_quoted_rune(fi.buf, r); case: fmt_int(fi, u64(r), false, 32, verb); } diff --git a/core/strings/builder.odin b/core/strings/builder.odin index 2683ea9c9..e5b93fb67 100644 --- a/core/strings/builder.odin +++ b/core/strings/builder.odin @@ -131,6 +131,22 @@ write_rune :: proc(b: ^Builder, r: rune) -> int { return n; } +write_quoted_rune :: proc(b: ^Builder, r: rune) -> (n: int) { + quote := byte('\''); + n += write_byte(b, quote); + buf, width := utf8.encode_rune(r); + if width == 1 && r == utf8.RUNE_ERROR { + n += write_byte(b, '\\'); + n += write_byte(b, 'x'); + n += write_byte(b, DIGITS_LOWER[buf[0]>>4]); + n += write_byte(b, DIGITS_LOWER[buf[0]&0xf]); + } else { + n += write_escaped_rune(b, r, quote); + } + n += write_byte(b, quote); + return; +} + write_string :: proc(b: ^Builder, s: string) -> (n: int) { return write_bytes(b, transmute([]byte)s); }