From e972ff468aeee799090477fb9a270ec3f0d7f475 Mon Sep 17 00:00:00 2001 From: emma Date: Sat, 13 Jul 2024 23:56:30 -0600 Subject: [PATCH] mm(1): added -t for disabling truncation; mm.1: updated docs --- docs/mm.1 | 16 ++++++---------- src/mm.rs | 14 ++++++++------ 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/docs/mm.1 b/docs/mm.1 index 2916aa7..d4659d2 100644 --- a/docs/mm.1 +++ b/docs/mm.1 @@ -10,7 +10,7 @@ mm \(en middleman .SH SYNOPSIS mm -.RB [ -aenu ] +.RB [ -aetu ] .RB [ -i\ input ] .RB [ -o\ output ] .\" @@ -21,19 +21,19 @@ Catenate input files and write them to the start of each output file or stream. .SH OPTIONS .IP \fB-a\fP -Opens subsequent outputs for appending rather than updating. +Opens outputs for appending rather than updating. .IP \fB-e\fP Use the standard error as an output. +.IP \fB-t\fP +Causes outputs to be overwritten instead of being truncated. +.IP \fB-u\fP +Ensures neither input or output will be buffered. .IP \fB-i\fP\ \fIinput\fP Opens a path as an input. If one or more of the input files is \(lq-\(rq or if no inputs are specified, the standard input shall be used. .IP \fB-o\fP\ \fIoutput\fP Opens a path as an output. If one or more of the output files is \(lq-\(rq or if no outputs are specified, the standard output shall be used. -.IP \fB-u\fP -Ensures neither input or output will be buffered. -.IP \fB-n\fP -Causes SIGINT signals to be ignored. .\" .SH DIAGNOSTICS @@ -45,10 +45,6 @@ exits with the appropriate .BR sysexits.h (3) status. .\" -.SH CAVEATS - -Existing files are not truncated on ouput and are instead overwritten. -.\" .SH RATIONALE The diff --git a/src/mm.rs b/src/mm.rs index aa7ce19..e991b5a 100644 --- a/src/mm.rs +++ b/src/mm.rs @@ -34,19 +34,21 @@ use sysexits::{ EX_IOERR, EX_USAGE }; fn main() -> ExitCode { let argv = args().collect::>(); - let usage = format!("Usage: {} [-aeu] [-i input] [-o output]", argv[0]); + let usage = format!("Usage: {} [-aetu] [-i input] [-o output]", argv[0]); let mut a = false; /* append rather than update */ let mut e = false; /* use stderr as an output */ + let mut t = true; let mut u = false; /* unbuffer i/o */ let mut ins = Vec::new(); /* initial inputs vector */ let mut outs = Vec::new(); /* initial outputs vector */ - while let Some(opt) = argv.getopt("aei:o:u") { + while let Some(opt) = argv.getopt("aei:o:tu") { match opt.opt() { Ok("a") => a = true, - Ok("e") => e = true, - Ok("u") => u = true, + Ok("e") => e = true, + Ok("u") => u = true, + Ok("t") => t = false, Ok("i") => { /* add input */ let input = opt.arg().unwrap(); ins.push(input); @@ -75,7 +77,7 @@ fn main() -> ExitCode { return unsafe { File::from_raw_fd(stdin().as_raw_fd()) }; /* fd0 = stdin */ } - match File::options().append(a).open(file) { + match File::options().open(file) { Ok(f) => f, Err(e) => { eprintln!("{}: {}", argv[0], e.strerror()); @@ -91,7 +93,7 @@ fn main() -> ExitCode { return unsafe { File::from_raw_fd(stdout().as_raw_fd()) }; /* fd1 = stdout */ } - match File::options().append(a).open(file) { + match File::options().truncate(t).append(a).open(file) { Ok(f) => return f, Err(e) => { eprintln!("{}: {}", argv[0], e.strerror());