sort: Support hexadecimal numbers/floats correctly

Fixes https://github.com/uutils/coreutils/issues/8060
This commit is contained in:
Yonatan Linik
2025-07-23 21:14:14 +02:00
committed by Dorian Péron
parent d2b95eb9e5
commit bd2e33bb34
5 changed files with 32 additions and 8 deletions
+15 -3
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 == '-')
+12
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);
}
+1 -1
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
+3 -3
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+
__
____
+1 -1
View File
@@ -4,7 +4,7 @@
+100000
10000K78
0x10 // hexadecimal not supported, but it should be
0x10
10E
0b10 // binary not supported
64e+