mirror of
https://github.com/uutils/coreutils.git
synced 2026-06-10 15:48:22 -07:00
sort: Support hexadecimal numbers/floats correctly
Fixes https://github.com/uutils/coreutils/issues/8060
This commit is contained in:
committed by
Dorian Péron
parent
d2b95eb9e5
commit
bd2e33bb34
+15
-3
@@ -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 == '-')
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -4,7 +4,7 @@
|
||||
+100000
|
||||
|
||||
10000K78
|
||||
0x10 // hexadecimal not supported, but it should be
|
||||
0x10
|
||||
10E
|
||||
0b10 // binary not supported
|
||||
64e+
|
||||
|
||||
Reference in New Issue
Block a user