printf: Improve support for printing multi-byte values of characters

This commit is contained in:
Sylvestre Ledru
2025-04-18 00:38:48 -04:00
committed by Justin Tracey
parent d99b7b31a6
commit 8ff0db1db9
2 changed files with 22 additions and 1 deletions
+12 -1
View File
@@ -58,7 +58,18 @@ impl<'a, T: Iterator<Item = &'a FormatArgument>> ArgumentIter<'a> for T {
};
match next {
FormatArgument::UnsignedInt(n) => *n,
FormatArgument::Unparsed(s) => extract_value(u64::extended_parse(s), s),
FormatArgument::Unparsed(s) => {
// Check if the string is a character literal enclosed in quotes
if s.starts_with(['"', '\'']) && s.len() > 2 {
// Extract the content between the quotes safely
let chars: Vec<char> =
s.trim_matches(|c| c == '"' || c == '\'').chars().collect();
if chars.len() == 1 {
return chars[0] as u64; // Return the Unicode code point
}
}
extract_value(u64::extended_parse(s), s)
}
_ => 0,
}
}
+10
View File
@@ -1385,3 +1385,13 @@ fn float_arg_with_whitespace() {
.fails()
.stderr_contains("expected a numeric value");
}
#[test]
fn mb_input() {
for format in ["\"á", "\'á"] {
new_ucmd!()
.args(&["%04x\n", format])
.succeeds()
.stdout_only("00e1\n");
}
}