1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-27 11:07:44 +00:00

comm: implement --total

This commit is contained in:
Daniel Hofstetter 2023-01-24 13:36:13 +01:00
parent dce8a021da
commit b06485990d
4 changed files with 39 additions and 0 deletions

View file

@ -29,6 +29,7 @@ mod options {
pub const DELIMITER_DEFAULT: &str = "\t";
pub const FILE_1: &str = "FILE1";
pub const FILE_2: &str = "FILE2";
pub const TOTAL: &str = "total";
}
fn mkdelim(col: usize, opts: &ArgMatches) -> String {
@ -76,6 +77,10 @@ fn comm(a: &mut LineReader, b: &mut LineReader, opts: &ArgMatches) {
let rb = &mut String::new();
let mut nb = b.read_line(rb);
let mut total_col_1 = 0;
let mut total_col_2 = 0;
let mut total_col_3 = 0;
while na.is_ok() || nb.is_ok() {
let ord = match (na.is_ok(), nb.is_ok()) {
(false, true) => Ordering::Greater,
@ -97,6 +102,7 @@ fn comm(a: &mut LineReader, b: &mut LineReader, opts: &ArgMatches) {
}
ra.clear();
na = a.read_line(ra);
total_col_1 += 1;
}
Ordering::Greater => {
if !opts.get_flag(options::COLUMN_2) {
@ -105,6 +111,7 @@ fn comm(a: &mut LineReader, b: &mut LineReader, opts: &ArgMatches) {
}
rb.clear();
nb = b.read_line(rb);
total_col_2 += 1;
}
Ordering::Equal => {
if !opts.get_flag(options::COLUMN_3) {
@ -115,9 +122,14 @@ fn comm(a: &mut LineReader, b: &mut LineReader, opts: &ArgMatches) {
rb.clear();
na = a.read_line(ra);
nb = b.read_line(rb);
total_col_3 += 1;
}
}
}
if opts.get_flag(options::TOTAL) {
println!("{total_col_1}\t{total_col_2}\t{total_col_3}\ttotal");
}
}
fn open_file(name: &str) -> io::Result<LineReader> {
@ -187,4 +199,10 @@ pub fn uu_app() -> Command {
.required(true)
.value_hint(clap::ValueHint::FilePath),
)
.arg(
Arg::new(options::TOTAL)
.long(options::TOTAL)
.help("output a summary")
.action(ArgAction::SetTrue),
)
}

View file

@ -55,6 +55,22 @@ fn empty_empty() {
.stdout_only_fixture("emptyempty.expected"); // spell-checker:disable-line
}
#[test]
fn total() {
new_ucmd!()
.args(&["--total", "a", "b"])
.succeeds()
.stdout_is_fixture("ab_total.expected");
}
#[test]
fn total_with_suppressed_regular_output() {
new_ucmd!()
.args(&["--total", "-123", "a", "b"])
.succeeds()
.stdout_is_fixture("ab_total_suppressed_regular_output.expected");
}
#[test]
fn output_delimiter() {
new_ucmd!()

4
tests/fixtures/comm/ab_total.expected vendored Normal file
View file

@ -0,0 +1,4 @@
a
b
z
1 1 1 total

View file

@ -0,0 +1 @@
1 1 1 total