From bf48ed6eb53662f875a6aee6ea51cfbf1fe7fc90 Mon Sep 17 00:00:00 2001 From: Arcterus Date: Wed, 7 May 2014 16:55:53 -0700 Subject: [PATCH] Add stdin (-) support to some programs --- fold/fold.rs | 24 ++++++++++++++++-------- md5sum/md5sum.rs | 21 +++++++++++++++++---- paste/paste.rs | 10 ++++++++-- tac/tac.rs | 14 ++++++++++++-- 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/fold/fold.rs b/fold/fold.rs index baccc32da..9d106df30 100644 --- a/fold/fold.rs +++ b/fold/fold.rs @@ -71,7 +71,12 @@ fn main() { }, None => 80 }; - fold(matches.free, bytes, spaces, width); + let files = if matches.free.is_empty() { + vec!("-".to_owned()) + } else { + matches.free + }; + fold(files, bytes, spaces, width); } } @@ -89,13 +94,16 @@ fn handle_obsolete(args: ~[~str]) -> (~[~str], Option<~str>) { } fn fold(filenames: Vec<~str>, bytes: bool, spaces: bool, width: uint) { - if filenames.len() == 0 { - fold_file(io::stdin(), bytes, spaces, width); - } else { - for filename in filenames.iter() { - let filename: &str = *filename; - fold_file(BufferedReader::new(safe_unwrap!(File::open(&Path::new(filename)))), bytes, spaces, width); - } + for filename in filenames.iter() { + let filename: &str = *filename; + let buffer = BufferedReader::new( + if filename == "-".to_owned() { + ~io::stdio::stdin_raw() as ~Reader + } else { + ~safe_unwrap!(File::open(&Path::new(filename))) as ~Reader + } + ); + fold_file(buffer, bytes, spaces, width); } } diff --git a/md5sum/md5sum.rs b/md5sum/md5sum.rs index 117eb00ef..89abab02d 100644 --- a/md5sum/md5sum.rs +++ b/md5sum/md5sum.rs @@ -16,6 +16,7 @@ extern crate getopts; extern crate libc; use std::io::fs::File; +use std::io::stdio::stdin_raw; use std::io::BufferedReader; use std::os; use crypto::digest::Digest; @@ -66,7 +67,12 @@ fn main() { let quiet = matches.opt_present("quiet") || status; let strict = matches.opt_present("strict"); let warn = matches.opt_present("warn") && !status; - md5sum(matches.free, binary, check, tag, status, quiet, strict, warn); + let files = if matches.free.is_empty() { + vec!("-".to_owned()) + } else { + matches.free + }; + md5sum(files, binary, check, tag, status, quiet, strict, warn); } } @@ -77,9 +83,16 @@ fn md5sum(files: Vec<~str>, binary: bool, check: bool, tag: bool, status: bool, let mut failed = 0; for filename in files.iter() { let filename: &str = *filename; - let mut file = safe_unwrap!(File::open(&Path::new(filename))); + let mut file = BufferedReader::new( + if filename == "-".to_owned() { + ~stdin_raw() as ~Reader + } else { + ~safe_unwrap!(File::open(&Path::new(filename))) as ~Reader + } + ); if check { - let mut buffer = BufferedReader::new(file); + let mut buffer = file; + //let mut buffer = BufferedReader::new(file); for (i, line) in buffer.lines().enumerate() { let line = safe_unwrap!(line); let (ck_filename, sum) = match from_gnu(line, bytes) { @@ -132,7 +145,7 @@ fn md5sum(files: Vec<~str>, binary: bool, check: bool, tag: bool, status: bool, } } -fn calc_sum(md5: &mut crypto::md5::Md5, file: &mut File, binary: bool) -> ~str { +fn calc_sum(md5: &mut crypto::md5::Md5, file: &mut Reader, binary: bool) -> ~str { let data = if binary { (safe_unwrap!(file.read_to_end())).as_slice().to_owned() diff --git a/paste/paste.rs b/paste/paste.rs index 78949fbf2..549c5abc5 100644 --- a/paste/paste.rs +++ b/paste/paste.rs @@ -57,8 +57,14 @@ fn main() { } fn paste(filenames: Vec<~str>, serial: bool, delimiters: ~str) { - let mut files: ~[io::BufferedReader] = filenames.move_iter().map(|name| - io::BufferedReader::new(crash_if_err!(1, io::File::open(&Path::new(name)))) + let mut files: ~[io::BufferedReader<~Reader>] = filenames.move_iter().map(|name| + io::BufferedReader::new( + if name == "-".to_owned() { + ~io::stdio::stdin_raw() as ~Reader + } else { + ~crash_if_err!(1, io::File::open(&Path::new(name))) as ~Reader + } + ) ).collect(); let delimiters: ~[~str] = delimiters.chars().map(|x| x.to_str()).collect(); let mut delim_count = 0; diff --git a/tac/tac.rs b/tac/tac.rs index 6cfc63696..5f21de09b 100644 --- a/tac/tac.rs +++ b/tac/tac.rs @@ -60,14 +60,24 @@ fn main() { } None => "\n".to_owned() }; - tac(matches.free, before, regex, separator); + let files = if matches.free.is_empty() { + vec!("-".to_owned()) + } else { + matches.free + }; + tac(files, before, regex, separator); } } fn tac(filenames: Vec<~str>, before: bool, _: bool, separator: ~str) { for filename in filenames.move_iter() { let mut file = io::BufferedReader::new( - crash_if_err!(1, io::File::open(&Path::new(filename)))); + if filename == "-".to_owned() { + ~io::stdio::stdin_raw() as ~Reader + } else { + ~crash_if_err!(1, io::File::open(&Path::new(filename))) as ~Reader + } + ); let mut data = crash_if_err!(1, file.read_to_str()); if data.ends_with("\n") { // removes blank line that is inserted otherwise