From 13e61c3234234a2614d172a3236bf0e691548c68 Mon Sep 17 00:00:00 2001 From: Peter Sherman Date: Mon, 15 Mar 2021 15:56:11 +0000 Subject: [PATCH] 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 zcmdPX(`V4r)7MMSEJ-XWDauSLElDi~i6keMKq-AAQ!~Ai3OF}0rywH{Ss*VzFSR@; zGcOe`m|a|&3)T%{=qKi6Ca1<{=Eaxi=cS|;t{nTIN#p9^tVer~RQBG?=-D+xoD zeqxd#HbEn7g2vbc<5N;|GIKLaQj6lt^NUijC`rvND5=C0PlCHEDKRBJzbGZO$k0$P zB{eOvG^ZpvBQ-f2B8WvNT)mMV(F*hOiBlSHi0Q6)Be)of`%3dN^GZrHOESw+F%N}F_{iMp0)cC~o z^rF=C#1gdRgsHHgC^ap!0=M}Pl&@`G+cYLPB-+aoPM2W&Zr#@4Vv z7mqhFh)>SXDb3A`&qze8rSYf**^QE#Fw|PW%*C%PFSR@#-Tlb!j)y6T$8KOoVsQqv zwFPDBCmDenQmIIdC74WRUO{OIEVN;QxhbY7PK1dUXC$JwfRH4Nj7)Ip0ksyf*EkXe$LlUaqTS0CKy%FHWH%`3)i z3xaiGb2mgHGc7H(C^fGn9$cAV+L?l?0JSBCW<*YEUV2Fey!ZjjLK=(ELK7hppPh=@ zBnL}@-B28F2#ZK$L3k;NENF~Pr3s24DCAR78y8>`AmV6tK?PCmf(qh`ncU1`P{ke( zi8)AEVhO6^)Z9!^#heFKfo3~~G^#rg(#5F-iACTfgq&Kz-YPCFC@4xTE{+HB&>Bl1 zA^p<4g2c?C)D&=*z~V+!d8m(2(nT(~R?02I)*jBw0j1=;9DR^oNjZsm*`QJvo+R>e z^ovuIOEUBGU~vQz$;>Utf%j_jN^_wV5QL?lk`@p1C0r9&4M+y1sD)}s&jahrjmF9M&LJ~I1{h_Vs!iS!39@-ioR|dD4_CF^bMeNGL)_W(FKXc zC8=D7lGSfAX*A>bZcHqy#4^}{T?MlCjMCi1 zy!fP?{N(KT;>;?v!6UGKOeM$$K*A#)RD+>J8dxi`B(kR5)S`6INLNX5Jh)eqlbTqD zR@8y@V^@bLbnz*I7rpot!K)v1MMbG)sYS&E+yqmE+d*&@I9&r*f##I_yb^F%4>XpA z8L+u1(kMX-mMJa)6&1MjL1j_2;T}PR1PzKjyne?bhw9V3(%jUd%;fmA%!<^M__Un- zL~O|%t14vY!4(iP03wfDE4b9m#G2Po?La8RV;HE*7N3`hI(7;U6Ewr%3b7ehnnzsd zpsB-d6v%d*#R<$+sHF};gW^l`G7C#l+ruDxK;vKF*hMi9rW)B;P-X(P8DQ-ISTU&& zlYl9PjE5JO=HeR-2T3Otr^MqK_J%0|HR`Ype8c52hQ2{ESO(fb!o`)vWrQpRtHEb0 zL;;4iC5hnnLrG#XeB>}CzMv>G7p+LfssI{#*yQ4qQq%H_P~#4y4s3LML241W8HrL- zV3CGfkO^)cmLz88=%?l9HUBc%PL zi_y43Rs(W0*!iI5Cr*osAzd`&@)y|<5W6&07q1bZ!4F-e!4F(!p{v6Tc37!U4leS_ nlkt`H<;mCvh{}`obMuob<5Mz|vk|80hlaStTf~FLiot>anuxG) literal 0 HcmV?d00001