aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sloan <mgsloan@gmail.com>2020-01-30 00:55:36 -0700
committerGitHub <noreply@github.com>2020-01-30 08:55:36 +0100
commitbb675c5f56c6ddb5d450df53d2685f519dc8d78c (patch)
treedac7bf5544e05d91c49adb7239d4643d28559ba1
parentf60e3423426c7322533433f9d40e0f282a05d220 (diff)
downloadmilf-rs-bb675c5f56c6ddb5d450df53d2685f519dc8d78c.tar.gz
milf-rs-bb675c5f56c6ddb5d450df53d2685f519dc8d78c.zip
Fix roundtripping of \u001f and \u007f in toml string literals (#372)
-rw-r--r--src/ser.rs7
-rw-r--r--test-suite/tests/valid/string-escapes.json8
-rw-r--r--test-suite/tests/valid/string-escapes.toml2
3 files changed, 14 insertions, 3 deletions
diff --git a/src/ser.rs b/src/ser.rs
index b4737cc..90cfcd7 100644
--- a/src/ser.rs
+++ b/src/ser.rs
@@ -569,8 +569,9 @@ impl<'a> Serializer<'a> {
match ch {
'\t' => {}
'\n' => ty = Type::NewlineTripple,
- // note that the following are invalid: \b \f \r
- c if c < '\u{1f}' => can_be_pretty = false, // Invalid control character
+ // Escape codes are needed if any ascii control
+ // characters are present, including \b \f \r.
+ c if c <= '\u{1f}' || c == '\u{7f}' => can_be_pretty = false,
_ => {}
}
out.push(ch);
@@ -646,7 +647,7 @@ impl<'a> Serializer<'a> {
'\u{d}' => self.dst.push_str("\\r"),
'\u{22}' => self.dst.push_str("\\\""),
'\u{5c}' => self.dst.push_str("\\\\"),
- c if c < '\u{1f}' => {
+ c if c <= '\u{1f}' || c == '\u{7f}' => {
write!(self.dst, "\\u{:04X}", ch as u32).map_err(ser::Error::custom)?;
}
ch => self.dst.push(ch),
diff --git a/test-suite/tests/valid/string-escapes.json b/test-suite/tests/valid/string-escapes.json
index 62dac51..e3b2d94 100644
--- a/test-suite/tests/valid/string-escapes.json
+++ b/test-suite/tests/valid/string-escapes.json
@@ -46,5 +46,13 @@
"notunicode4": {
"type": "string",
"value": "This string does not have a unicode \\\u0075 escape."
+ },
+ "delete": {
+ "type": "string",
+ "value": "This string has a \u007f delete control code."
+ },
+ "unitseparator": {
+ "type": "string",
+ "value": "This string has a \u001f unit separator control code."
}
}
diff --git a/test-suite/tests/valid/string-escapes.toml b/test-suite/tests/valid/string-escapes.toml
index c5d4954..152c6ad 100644
--- a/test-suite/tests/valid/string-escapes.toml
+++ b/test-suite/tests/valid/string-escapes.toml
@@ -10,3 +10,5 @@ notunicode1 = "This string does not have a unicode \\u escape."
notunicode2 = "This string does not have a unicode \u005Cu escape."
notunicode3 = "This string does not have a unicode \\u0075 escape."
notunicode4 = "This string does not have a unicode \\\u0075 escape."
+delete = "This string has a \u007F delete control code."
+unitseparator = "This string has a \u001F unit separator control code."