Compare commits
2 Commits
bb2c63bfaf
...
95927ba8c5
Author | SHA1 | Date |
---|---|---|
Emma Tebibyte | 95927ba8c5 | |
Emma Tebibyte | ad92fe27d4 |
26
src/fop.rs
26
src/fop.rs
|
@ -26,33 +26,43 @@ extern crate getopt;
|
|||
extern crate strerror;
|
||||
extern crate sysexits;
|
||||
|
||||
use getopt::{ Opt, Parser };
|
||||
use getopt::GetOpt;
|
||||
use strerror::StrError;
|
||||
use sysexits::{ EX_DATAERR, EX_IOERR, EX_UNAVAILABLE, EX_USAGE };
|
||||
|
||||
fn main() {
|
||||
let argv = args().collect::<Vec<String>>();
|
||||
let mut d = '␞';
|
||||
let mut arg_parser = Parser::new(&argv, "d:");
|
||||
let usage = format!(
|
||||
"Usage: {} [-d delimiter] index command [args...]",
|
||||
argv[0],
|
||||
);
|
||||
let mut index_arg = 0;
|
||||
|
||||
while let Some(opt) = arg_parser.next() {
|
||||
while let Some(opt) = argv.getopt("d:") {
|
||||
match opt {
|
||||
Ok(Opt('d', Some(arg))) => {
|
||||
Ok(o) => {
|
||||
/* unwrap because Err(OptError::MissingArg) will be returned if
|
||||
* o.arg is None */
|
||||
let arg = o.arg.unwrap();
|
||||
let arg_char = arg.chars().collect::<Vec<char>>();
|
||||
if arg_char.len() > 1 {
|
||||
eprintln!("{}: {}: Not a character.", argv[0], arg);
|
||||
exit(EX_USAGE);
|
||||
} else { d = arg_char[0]; }
|
||||
index_arg = o.ind as usize;
|
||||
},
|
||||
_ => {},
|
||||
Err(_) => {
|
||||
eprintln!("{}", usage);
|
||||
exit(EX_USAGE);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
let index_arg = arg_parser.index();
|
||||
let command_arg = arg_parser.index() + 1;
|
||||
let command_arg = index_arg as usize + 1;
|
||||
|
||||
argv.get(command_arg).unwrap_or_else(|| {
|
||||
eprintln!("Usage: {} [-d delimiter] index command [args...]", argv[0]);
|
||||
eprintln!("{}", usage);
|
||||
exit(EX_USAGE);
|
||||
});
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ pub enum OptError {
|
|||
UnknownOpt,
|
||||
}
|
||||
|
||||
// Function signature
|
||||
/* function signature */
|
||||
pub trait GetOpt {
|
||||
fn getopt(&self, optstring: &str) -> Option<Result<Opt, OptError>>;
|
||||
}
|
||||
|
@ -43,10 +43,11 @@ impl GetOpt for Vec<String> {
|
|||
.map(Result::unwrap)
|
||||
.collect();
|
||||
|
||||
/* these operations must be separated out into separate operations so
|
||||
* the CStrings can live long enough */
|
||||
let argv: Vec<_> = c_strings.iter().map(|x| x.as_ptr()).collect();
|
||||
let argv_ptr = argv.as_ptr() as *const *mut c_char;
|
||||
let optstring_c = CString::new(optstring).unwrap();
|
||||
let opts = optstring_c.into_raw();
|
||||
let opts = CString::new(optstring).unwrap().into_raw();
|
||||
let len = self.len() as c_int;
|
||||
|
||||
unsafe {
|
||||
|
@ -67,10 +68,10 @@ impl GetOpt for Vec<String> {
|
|||
*
|
||||
* Otherwise, getopt() shall return -1 when all command line
|
||||
* options are parsed. */
|
||||
58 => { /* ASCII value for ':' */
|
||||
58 => { /* numerical ASCII value for ':' */
|
||||
return Some(Err(OptError::MissingArg));
|
||||
},
|
||||
63 => { /* ASCII value for '?' */
|
||||
63 => { /* numerical ASCII value for '?' */
|
||||
return Some(Err(OptError::UnknownOpt))
|
||||
},
|
||||
/* From getopt(3p):
|
||||
|
|
Loading…
Reference in New Issue