Browse Source

strings.write_quoted_string

gingerBill 6 years ago
parent
commit
6295f6747f
2 changed files with 26 additions and 22 deletions
  1. 1 20
      core/fmt/fmt.odin
  2. 25 2
      core/strings/builder.odin

+ 1 - 20
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;

+ 25 - 2
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 {