From 6295f6747fbbeeb849c2334c489d774051d78f6e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 6 Jan 2019 22:16:14 +0000 Subject: [PATCH] strings.write_quoted_string --- core/fmt/fmt.odin | 21 +-------------------- core/strings/builder.odin | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 453110fa2..83f2996c2 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -601,26 +601,7 @@ fmt_string :: proc(fi: ^Info, s: string, verb: rune) { strings.write_string(fi.buf, s); case 'q': // quoted string - quote: byte = '"'; - strings.write_byte(fi.buf, quote); - for width := 0; len(s) > 0; s = s[width:] { - r := rune(s[0]); - width = 1; - if r >= utf8.RUNE_SELF { - r, width = utf8.decode_rune_in_string(s); - } - if width == 1 && r == utf8.RUNE_ERROR { - strings.write_byte(fi.buf, '\\'); - strings.write_byte(fi.buf, 'x'); - strings.write_byte(fi.buf, __DIGITS_LOWER[s[0]>>4]); - strings.write_byte(fi.buf, __DIGITS_LOWER[s[0]&0xf]); - continue; - } - - strings.write_escaped_rune(fi.buf, r, quote); - - } - strings.write_byte(fi.buf, quote); + strings.write_quoted_string(fi.buf, s, '"'); case 'x', 'X': space := fi.space; diff --git a/core/strings/builder.odin b/core/strings/builder.odin index 389030ba4..f0fc8ae17 100644 --- a/core/strings/builder.odin +++ b/core/strings/builder.odin @@ -61,6 +61,31 @@ write_bytes :: proc(b: ^Builder, x: []byte) { append(&b.buf, ..x); } +@(private) +static DIGITS_LOWER := "0123456789abcdefx"; + +write_quoted_string :: proc(b: ^Builder, s: string, quote: byte = '"') { + write_byte(b, quote); + for width := 0; len(s) > 0; s = s[width:] { + r := rune(s[0]); + width = 1; + if r >= utf8.RUNE_SELF { + r, width = utf8.decode_rune_in_string(s); + } + if width == 1 && r == utf8.RUNE_ERROR { + write_byte(b, '\\'); + write_byte(b, 'x'); + write_byte(b, DIGITS_LOWER[s[0]>>4]); + write_byte(b, DIGITS_LOWER[s[0]&0xf]); + continue; + } + + write_escaped_rune(b, r, quote); + + } + write_byte(b, quote); +} + write_encoded_rune :: proc(b: ^Builder, r: rune, write_quote := true) { if write_quote do write_byte(b, '\''); @@ -93,8 +118,6 @@ write_encoded_rune :: proc(b: ^Builder, r: rune, write_quote := true) { write_escaped_rune :: proc(b: ^Builder, r: rune, quote: byte) { - static DIGITS_LOWER := "0123456789abcdefx"; - is_printable :: proc(r: rune) -> bool { if r <= 0xff { switch r {