#[macro_use(err, errp)]
extern crate unixcli;
use std::env;
use std::ffi::OsStr;
use std::fs::File;
use std::io;
use std::io::{BufReader, Read, Write};
use std::path::Path;
use unixcli::progname;
fn main() {
let mut args = env::args_os();
progname::setprogname(args.next().unwrap().as_os_str());
let args = match args.len() {
0 => args.chain(vec![OsStr::new("-").to_os_string()]),
_ => args.chain(vec![]),
};
for path in args {
let path = Path::new(path.as_os_str());
if let Err(e) = cat_one(path) {
if path == Path::new("-") {
err!(1, "stdin: {}", e);
} else {
errp!(1, path, "{}", e);
}
}
}
}
fn cat_one(path: &Path) -> io::Result<()> {
if path == Path::new("-") {
cat_read(io::stdin())
} else {
cat_read(try!(File::open(path)))
}
}
fn cat_read<R>(r: R) -> io::Result<()> where R: Read {
let mut reader = BufReader::new(r);
let mut buf = vec![0; 64 * 1024];
loop {
match try!(reader.read(&mut buf)) {
0 => return Ok(()),
n => { try!(io::stdout().write(&buf[0..n])); },
}
}
}