From 13e61c3234234a2614d172a3236bf0e691548c68 Mon Sep 17 00:00:00 2001 From: Peter Sherman Date: Mon, 15 Mar 2021 15:56:11 +0000 Subject: [PATCH 1/2] head: add support for -z/--zero-terminated --- src/uu/head/src/head.rs | 15 +++++++++++++-- tests/by-util/test_head.rs | 8 ++++++++ tests/fixtures/head/zero_terminated.expected | Bin 0 -> 182 bytes tests/fixtures/head/zero_terminated.txt | Bin 0 -> 7605 bytes 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/head/zero_terminated.expected create mode 100644 tests/fixtures/head/zero_terminated.txt diff --git a/src/uu/head/src/head.rs b/src/uu/head/src/head.rs index 56d7e8452..9e92dd8c7 100644 --- a/src/uu/head/src/head.rs +++ b/src/uu/head/src/head.rs @@ -29,6 +29,7 @@ enum FilterMode { struct Settings { mode: FilterMode, verbose: bool, + zero_terminated: bool, } impl Default for Settings { @@ -36,6 +37,7 @@ impl Default for Settings { Settings { mode: FilterMode::Lines(10), verbose: false, + zero_terminated: false, } } } @@ -69,6 +71,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { ) .optflag("q", "quiet", "never print headers giving file names") .optflag("v", "verbose", "always print headers giving file names") + .optflag("z", "zero-terminated", "line delimiter is NUL, not newline") .optflag("h", "help", "display this help and exit") .optflag("V", "version", "output version information and exit") .parse(new_args); @@ -113,6 +116,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let quiet = matches.opt_present("q"); let verbose = matches.opt_present("v"); + settings.zero_terminated = matches.opt_present("z"); let files = matches.free; // GNU implementation allows multiple declarations of "-q" and "-v" with the @@ -129,6 +133,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { settings.verbose = true; } + if files.is_empty() { let mut buffer = BufReader::new(stdin()); head(&mut buffer, &settings); @@ -203,8 +208,14 @@ fn head(reader: &mut BufReader, settings: &Settings) -> bool { } } FilterMode::Lines(count) => { - for line in reader.lines().take(count) { - println!("{}", line.unwrap()); + if settings.zero_terminated { + for line in reader.split(0).take(count) { + print!("{}\0", String::from_utf8(line.unwrap()).unwrap()) + } + } else { + for line in reader.lines().take(count) { + println!("{}", line.unwrap()); + } } } FilterMode::NLines(count) => { diff --git a/tests/by-util/test_head.rs b/tests/by-util/test_head.rs index 4324290cb..eec82b51f 100644 --- a/tests/by-util/test_head.rs +++ b/tests/by-util/test_head.rs @@ -86,6 +86,14 @@ fn test_verbose() { .stdout_is_fixture("lorem_ipsum_verbose.expected"); } +#[test] +fn test_zero_terminated() { + new_ucmd!() + .args(&["-z", "zero_terminated.txt"]) + .run() + .stdout_is_fixture("zero_terminated.expected"); +} + #[test] #[ignore] fn test_spams_newline() { diff --git a/tests/fixtures/head/zero_terminated.expected b/tests/fixtures/head/zero_terminated.expected new file mode 100644 index 0000000000000000000000000000000000000000..3c4cc058c3e55c81d16ec3ab18981d16fdb67cf1 GIT binary patch literal 182 zcmY+5Q4Yc|3`2LKR6>I5RG~Exk)~CfX*)h_LKFM4{cID3i73!hoZY+JXUEt`V*g3F zTyNy-5n0=d|AAG*qGCAUd(35jZzixxLKKTjwT!N8`LqmLJ4%%H9iNLbt4mYFhbRVN JZAgwheE{GdJ+S}) literal 0 HcmV?d00001 diff --git a/tests/fixtures/head/zero_terminated.txt b/tests/fixtures/head/zero_terminated.txt new file mode 100644 index 0000000000000000000000000000000000000000..6c7968122e22adf98694d530a1e23750b288616c GIT binary patch literal 7605 zcmb7J+nVDh4DJg#-eh+A%@gzq+G{>+Dxd#eh*5{TffL9(K7$6v9RkB(bZUoSfdNW)H3nq^8T;l+sguV?vCi<0|0NZ_g_r)MoQ zbAn#TGBNM0Xl+9szX(-~JV%@C=}BbWh+5#uVdj8ng@6{~x2EcmFX!rEuO{nJ->^vrG#xln1Cl2q&n-`Nw(uRej6SCH3;a1PGC!EtHM2f96fSFvYD ztrquqXKTnPu#o+LeaE19m1wn}Us4jpVHe7~4|LS%NytAEN&HLP!r)RSz~m=70z>^t z6@+$_eZ;~c4F|kqyRRAxSfwWln>)vNj-gGFtSE;GT&o4YA6ylJp@x>DLYFFtNww@f z`cXLJIF=fVHJ$wYK_DgVAjyrcPU!S7cqr=MJH#!_F25vn0L}bX6Bv7+5i?$ z><;tDuQh!#)r>kn_nfBxm>LOG(Sb`iVp9+C@5m)?WE^X1&Df7>pt%vpYv}~{2f_c# zW#JM5O&6D%Nxkg_on*;x&)|K}6q5#eA2=1WiIo6(d{zj-vQwW?F zTVu`#P0n#49X=3Km0S|vO30rX5hKs?=E7<4^p&kZ%xwkY(aH>5Y{Zhv%zYwYT($3Vfyk1)1jeBd}yZCLuK zZ)Om9d_qT;t%QSR+%V0_cs1rxLo^_Ma4F!LHUie2UnM*Q5a=GrD8>6D#p2E~&i_y1WL!x8l)IB0s4hc5w!16LhO2z5Gz+k3C|g&Q{Q`$~M7dX-n5mx`eLaCmmwrc+U0L@(9i zX2PCflaP@S!TvoQ?qx@>;mB@uM-HC7BV_O4JMlM9-^eLEv?EzR_2(<24s&GH12$$2 zb^QYj>E*B^lj6gwBo_f8dL$gqJ_IF5Blvcy;Q+$_Qe;U|03F$bZr3>#Gho?A2D0$anCjwmMWB%jiRdDUXBq+?H0FF1fZ=rWV?P%A1pO1*Q==-N?(_Aev$$e};cMXLr z+OqyGmEgB!)u9S}{HPX>AA7pixNX>DRrqox@2fqk^}sDuW1tRW^MpH5d!Mz{|NQ+I M`G5x+?XQdf1Dc4iZ~y=R literal 0 HcmV?d00001 From e3e5bf0178432234c4cc2d8d03ec7df6bee5bc64 Mon Sep 17 00:00:00 2001 From: Peter Sherman Date: Mon, 15 Mar 2021 20:48:49 +0000 Subject: [PATCH 2/2] Format head.rs --- src/uu/head/src/head.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/uu/head/src/head.rs b/src/uu/head/src/head.rs index 9e92dd8c7..ae5807c22 100644 --- a/src/uu/head/src/head.rs +++ b/src/uu/head/src/head.rs @@ -133,7 +133,6 @@ pub fn uumain(args: impl uucore::Args) -> i32 { settings.verbose = true; } - if files.is_empty() { let mut buffer = BufReader::new(stdin()); head(&mut buffer, &settings);