1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-27 19:17:43 +00:00

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

This commit is contained in:
Sylvestre Ledru 2025-01-01 17:24:53 +01:00 committed by Justin Tracey
parent d99b7b31a6
commit 8ff0db1db9
No known key found for this signature in database
GPG key ID: 62B84F5ABDDDCE54
2 changed files with 22 additions and 1 deletions

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,
}
}

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");
}
}