Merge pull request #2882 from jtracey/join-bigfields-compat

join: "support" field numbers larger than usize::MAX
This commit is contained in:
Terts Diepraam 2022-01-31 21:52:13 +01:00 committed by GitHub
commit 7477761428
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 0 deletions

View file

@ -830,8 +830,13 @@ fn get_field_number(keys: Option<usize>, key: Option<usize>) -> UResult<usize> {
/// Parse the specified field string as a natural number and return
/// the zero-based field number.
fn parse_field_number(value: &str) -> UResult<usize> {
// TODO: use ParseIntError.kind() once MSRV >= 1.55
// For now, store an overflow Err from parsing a value 10x 64 bit usize::MAX
// Adapted from https://github.com/rust-lang/rust/issues/22639
let overflow = "184467440737095516150".parse::<usize>().err().unwrap();
match value.parse::<usize>() {
Ok(result) if result > 0 => Ok(result - 1),
Err(ref e) if *e == overflow => Ok(usize::MAX),
_ => Err(USimpleError::new(
1,
format!("invalid field number: {}", value.quote()),

View file

@ -75,6 +75,27 @@ fn different_field() {
.stdout_only_fixture("different_field.expected");
}
#[test]
fn out_of_bounds_fields() {
new_ucmd!()
.arg("fields_1.txt")
.arg("fields_4.txt")
.arg("-1")
.arg("3")
.arg("-2")
.arg("5")
.succeeds()
.stdout_only_fixture("out_of_bounds_fields.expected");
new_ucmd!()
.arg("fields_1.txt")
.arg("fields_4.txt")
.arg("-j")
.arg("100000000000000000000") // > usize::MAX for 64 bits
.succeeds()
.stdout_only_fixture("out_of_bounds_fields.expected");
}
#[test]
fn unpaired_lines() {
new_ucmd!()

View file

@ -0,0 +1,25 @@
1 2 c 1 cd
1 3 d 2 de
1 5 e 3 ef
1 7 f 4 fg
1 11 g 5 gh
2 2 c 1 cd
2 3 d 2 de
2 5 e 3 ef
2 7 f 4 fg
2 11 g 5 gh
3 2 c 1 cd
3 3 d 2 de
3 5 e 3 ef
3 7 f 4 fg
3 11 g 5 gh
5 2 c 1 cd
5 3 d 2 de
5 5 e 3 ef
5 7 f 4 fg
5 11 g 5 gh
8 2 c 1 cd
8 3 d 2 de
8 5 e 3 ef
8 7 f 4 fg
8 11 g 5 gh