sort: Support hexadecimal numbers/floats correctly
Some checks are pending
CICD / Style/cargo-deny (push) Waiting to run
CICD / Style/deps (push) Waiting to run
CICD / Test all features separately (push) Blocked by required conditions
CICD / Documentation/warnings (push) Waiting to run
CICD / MinRustV (push) Waiting to run
CICD / Dependencies (push) Waiting to run
CICD / Build/Makefile (push) Blocked by required conditions
CICD / Build/stable (push) Blocked by required conditions
CICD / Build/nightly (push) Blocked by required conditions
CICD / Binary sizes (push) Blocked by required conditions
CICD / Build (push) Blocked by required conditions
CICD / Tests/BusyBox test suite (push) Blocked by required conditions
CICD / Tests/Toybox test suite (push) Blocked by required conditions
CICD / Code Coverage (push) Waiting to run
CICD / Separate Builds (push) Waiting to run
CICD / Build/SELinux (push) Blocked by required conditions
GnuTests / Run GNU tests (push) Waiting to run
Android / Test builds (push) Waiting to run
Code Quality / Style/toml (push) Waiting to run
Code Quality / Style/format (push) Waiting to run
Code Quality / Style/Python (push) Waiting to run
Code Quality / Style/lint (push) Waiting to run
Code Quality / Style/spelling (push) Waiting to run
Code Quality / Pre-commit hooks (push) Waiting to run
FreeBSD / Style and Lint (push) Waiting to run
FreeBSD / Tests (push) Waiting to run

Fixes https://github.com/uutils/coreutils/issues/8060
This commit is contained in:
Yonatan Linik 2025-07-23 19:16:12 +03:00 committed by Dorian Péron
parent d2b95eb9e5
commit bd2e33bb34
5 changed files with 32 additions and 8 deletions

View file

@ -7,7 +7,7 @@
// https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html
// https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
// spell-checker:ignore (misc) HFKJFK Mbdfhn getrlimit RLIMIT_NOFILE rlim bigdecimal extendedbigdecimal
// spell-checker:ignore (misc) HFKJFK Mbdfhn getrlimit RLIMIT_NOFILE rlim bigdecimal extendedbigdecimal hexdigit
mod check;
mod chunks;
@ -1834,15 +1834,27 @@ fn get_leading_gen(input: &str) -> Range<usize> {
let mut had_e_notation = false;
let mut had_decimal_pt = false;
let mut had_hex_notation: bool = false;
while let Some((idx, c)) = char_indices.next() {
if c.is_ascii_digit() {
if had_hex_notation && c.is_ascii_hexdigit() {
continue;
}
if c.is_ascii_digit() {
if c == '0' && matches!(char_indices.peek(), Some((_, 'x' | 'X'))) {
had_hex_notation = true;
char_indices.next();
}
continue;
}
if c == DECIMAL_PT && !had_decimal_pt && !had_e_notation {
had_decimal_pt = true;
continue;
}
if (c == 'e' || c == 'E') && !had_e_notation {
let is_decimal_e = (c == 'e' || c == 'E') && !had_hex_notation;
let is_hex_e = (c == 'p' || c == 'P') && had_hex_notation;
if (is_decimal_e || is_hex_e) && !had_e_notation {
// we can only consume the 'e' if what follow is either a digit, or a sign followed by a digit.
if let Some(&(_, next_char)) = char_indices.peek() {
if (next_char == '+' || next_char == '-')

View file

@ -1556,3 +1556,15 @@ fn test_g_arbitrary() {
.succeeds()
.stdout_is(output);
}
#[test]
// Test hexadecimal numbers (and hex floats)
fn test_g_float_hex() {
let input = "0x123\n0x0\n0x2p10\n0x9p-10\n";
let output = "0x0\n0x9p-10\n0x123\n0x2p10\n";
new_ucmd!()
.args(&["-g"])
.pipe_in(input)
.succeeds()
.stdout_is(output);
}

View file

@ -8,11 +8,11 @@
-12e-5555.5
0b10 // binary not supported
0x10 // hexadecimal not supported, but it should be
55e-20
55e-20.10
5.5.5.5
10E
0x10
64e+
99e-
1000EDKLD

View file

@ -28,9 +28,6 @@ ______________
0b10 // binary not supported
_
____________________________
0x10 // hexadecimal not supported, but it should be
_
___________________________________________________
55e-20
______
______
@ -43,6 +40,9 @@ _______
10E
__
___
0x10
____
____
64e+
__
____

View file

@ -4,7 +4,7 @@
+100000
10000K78
0x10 // hexadecimal not supported, but it should be
0x10
10E
0b10 // binary not supported
64e+