diff --git a/env/env.rs b/env/env.rs index 21ec4e586..867f604d0 100644 --- a/env/env.rs +++ b/env/env.rs @@ -1,3 +1,16 @@ +#[link(name="env", vers="1.0.0", author="LeoTestard")]; + +/* + * This file is part of the uutils coreutils package. + * + * (c) Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* last synced with: env (GNU coreutils) 8.13 */ + struct options { ignore_env: bool, null: bool, @@ -10,11 +23,11 @@ fn usage(prog: &str) { println!("Usage: {:s} [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]", prog); println!("Set each NAME to VALUE in the environment and run COMMAND\n"); println!("Possible options are:"); - println!(" -i, --ignore-environment\t start with an empty environment"); - println!(" -0, --null \t end each output line with a 0 byte rather than newline"); - println!(" -u, --unset NAME \t remove variable from the environment"); - println!(" --help \t display this help and exit"); - println!(" --version \t output version information and exit\n"); + println!(" -i --ignore-environment\t start with an empty environment"); + println!(" -0 --null \t end each output line with a 0 byte rather than newline"); + println!(" -u --unset NAME \t remove variable from the environment"); + println!(" -h --help \t display this help and exit"); + println!(" -V --version \t output version information and exit\n"); println!("A mere - implies -i. If no COMMAND, print the resulting environment"); } @@ -41,8 +54,6 @@ fn main() { let prog = args[0].as_slice(); // to handle arguments the same way than GNU env, we can't use getopts - // and have to do this: - let mut opts = ~options { ignore_env: false, null: false, @@ -70,7 +81,7 @@ fn main() { match (name, value) { (Some(n), Some(v)) => { - opts.sets.push((n.into_owned(), v.into_owned())); + opts.sets.push((n.into_owned(), v.into_owned())); } _ => { // read the program now @@ -78,17 +89,47 @@ fn main() { break; } } - } + } else if opt.starts_with("--") { + match *opt { + ~"--help" => { usage(prog); return } + ~"--version" => { version(); return } - else { - if opt.starts_with("--") { - match *opt { - ~"--help" => { usage(prog); return } - ~"--version" => { version(); return } + ~"--ignore-environment" => opts.ignore_env = true, + ~"--null" => opts.null = true, + ~"--unset" => { + let var = iter.next(); - ~"--ignore-environment" => opts.ignore_env = true, - ~"--null" => opts.null = true, - ~"--unset" => { + match var { + None => println!("{:s}: this option requires an argument: {:s}", prog, opt.as_slice()), + Some(s) => opts.unsets.push(s.to_owned()) + } + } + + _ => { + println!("{:s}: invalid option \"{:s}\"", prog, *opt); + println!("Type \"{:s} --help\" for detailed informations", prog); + return + } + } + } else if opt.starts_with("-") { + if opt.len() == 0 { + // implies -i and stop parsing opts + wait_cmd = true; + opts.ignore_env = true; + continue; + } + + let mut chars = opt.iter(); + chars.next(); + + for c in chars { + // short versions of options + match c { + 'h' => { usage(prog); return } + 'V' => { version(); return } + 'i' => opts.ignore_env = true, + '0' => opts.null = true, + 'u' => { let var = iter.next(); match var { @@ -96,57 +137,29 @@ fn main() { Some(s) => opts.unsets.push(s.to_owned()) } } - _ => { - println!("{:s}: invalid option \"{:s}\"", prog, *opt); + println!("{:s}: illegal option -- {:c}", prog, c); println!("Type \"{:s} --help\" for detailed informations", prog); return } } } + } else { + // is it a NAME=VALUE like opt ? + let mut sp = opt.splitn_iter('=', 1); + let name = sp.next(); + let value = sp.next(); - else if opt.starts_with("-") { - if opt.len() == 0 { - // implies -i and stop parsing opts + match (name, value) { + (Some(n), Some(v)) => { + // yes + opts.sets.push((n.into_owned(), v.into_owned())); wait_cmd = true; - opts.ignore_env = true; - continue; } - - let mut chars = opt.iter(); - chars.next(); - - for c in chars { - // short versions of options - match c { - 'i' => opts.ignore_env = true, - '0' => opts.null = true, - _ => { - println!("{:s}: illegal option -- {:c}", prog, c); - println!("Type \"{:s} --help\" for detailed informations", prog); - return - } - } - } - } - - else { - // is it a NAME=VALUE like opt ? - let mut sp = opt.splitn_iter('=', 1); - let name = sp.next(); - let value = sp.next(); - - match (name, value) { - (Some(n), Some(v)) => { - // yes - opts.sets.push((n.into_owned(), v.into_owned())); - wait_cmd = true; - } - // no, its a program-like opt - _ => { - opts.program.push(opt.to_owned()); - break; - } + // no, its a program-like opt + _ => { + opts.program.push(opt.to_owned()); + break; } } } @@ -154,8 +167,7 @@ fn main() { item = iter.next(); } - // read program arguments now - + // read program arguments for opt in iter { opts.program.push(opt.to_owned()); } @@ -177,13 +189,13 @@ fn main() { } match opts.program { - [ref prog, ..args] => { + [ref prog, ..args] => { let status = std::run::process_status(prog.as_slice(), args.as_slice()); std::os::set_exit_status(status) } [] => { - // no program providen + // no program provided print_env(opts.null); } }