diff --git a/Cargo.lock b/Cargo.lock index ba385a0d2..62277a370 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3779,6 +3779,7 @@ dependencies = [ "clap", "codspeed-divan-compat", "fluent", + "memchr", "thiserror 2.0.18", "uucore", ] diff --git a/src/uu/numfmt/Cargo.toml b/src/uu/numfmt/Cargo.toml index 765d4dcce..e7ce4f9c9 100644 --- a/src/uu/numfmt/Cargo.toml +++ b/src/uu/numfmt/Cargo.toml @@ -23,6 +23,7 @@ clap = { workspace = true } uucore = { workspace = true, features = ["parser", "ranges"] } thiserror = { workspace = true } fluent = { workspace = true } +memchr = { workspace = true } [dev-dependencies] divan = { workspace = true } diff --git a/src/uu/numfmt/src/numfmt.rs b/src/uu/numfmt/src/numfmt.rs index bcc4a4825..f71e96bfb 100644 --- a/src/uu/numfmt/src/numfmt.rs +++ b/src/uu/numfmt/src/numfmt.rs @@ -87,21 +87,19 @@ fn write_line( eol: Option, ) -> UResult<()> { // Read lines only up to null byte (as GNU does) - let line = input_line - .iter() - .take_while(|&&b| b != b'\0') - .copied() - .collect::>(); - + let line = match memchr::memchr(b'\0', input_line) { + Some(i) => &input_line[..i], + None => input_line, + }; let handled_line = if options.delimiter.is_some() { - write_formatted_with_delimiter(writer, &line, options, eol) + write_formatted_with_delimiter(writer, line, options, eol) } else { // Whitespace mode requires valid UTF-8 - match std::str::from_utf8(&line) { + match std::str::from_utf8(line) { Ok(s) => write_formatted_with_whitespace(writer, s, options, eol), - Err(_) => Err( - translate!("numfmt-error-invalid-number", "input" => escape_line(&line).quote()), - ), + Err(_) => { + Err(translate!("numfmt-error-invalid-number", "input" => escape_line(line).quote())) + } } };