mirror of
https://github.com/uutils/coreutils.git
synced 2025-12-23 08:47:37 +00:00
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
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:
parent
d2b95eb9e5
commit
bd2e33bb34
5 changed files with 32 additions and 8 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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+
|
||||
__
|
||||
____
|
||||
|
|
|
|||
2
tests/fixtures/sort/exponents_general.txt
vendored
2
tests/fixtures/sort/exponents_general.txt
vendored
|
|
@ -4,7 +4,7 @@
|
|||
+100000
|
||||
|
||||
10000K78
|
||||
0x10 // hexadecimal not supported, but it should be
|
||||
0x10
|
||||
10E
|
||||
0b10 // binary not supported
|
||||
64e+
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue