Problem
- With , uutils csplit failed to create the final empty output file when the last split point consumed the trailing input.
- GNU csplit always creates a final segment after processing patterns; with , that empty final segment is elided.
- This broke the GNU test (tests/csplit/csplit-suppress-matched.pl) and the scenario:
Root cause
- Final-file creation was conditional on there being remaining input after pattern processing. If none remained, no final file was created, contrary to GNU semantics.
Fix (minimal, targeted)
- In , after :
- If there is remaining input, always create a final split and copy the remainder, then finish.
- Else, if all patterns were integer-based and is set, create a final (possibly empty) split and finish; elides it when is set.
Tests (Rust integration)
- Added two Rust tests under to lock down GNU-compatible behavior:
- (expects sizes 2,2,2,0 and a final empty )
- (final empty file is correctly elided)
Verification
- All tests pass locally. The originally reported case now matches GNU.
Relation to PR #7806
- #7806 proposes a broader refactor to fix multiple issues, but remains a draft and notes remaining GNU suppress-matched differences.
- This PR provides a small, reviewable fix specifically for #7286, plus precise integration tests to safeguard behavior.
Fixes#7286
Minor cleanup using clippy autofix. This makes the code a bit more readable, and helps spot a few inefficiencies and possible bugs.
```
cargo clippy --fix --workspace -- -A clippy::all -W clippy::uninlined_format_args && cargo fmt
```
Avoid a panic that would occur when attempting to remove a file that
didn't exist. This would happen when scanning for a regular expression
match, advancing by a positive offset, and suppressing empty files. For
example, before this commit,
echo a | csplit -z - %a%1
would cause a panic. After this commit, the process terminates as
expected: without error, without output, and without any files written.
Fixes#7251.
* tests/csplit: modified test test_up_to_match_offset_option_suppress_matched according to issue #7052 and modified also test_up_to_match_negative_offset_option_suppress_matched
* csplit: managed the positive and negative offset when the --suppressed-matched flag is active
* tests/csplit: modified test test_up_to_match_offset_option_suppress_matched according to issue #7052 and modified also test_up_to_match_negative_offset_option_suppress_matched
* csplit: managed the positive and negative offset when the --suppressed-matched flag is active
* csplit: swapped if and else blocks for better readability