getopt.rs(3): returns last parsed option
This commit is contained in:
parent
8c255e61fc
commit
d1b77d652b
@ -21,12 +21,13 @@ use std::ffi::{ c_int, c_char, CString, CStr };
|
|||||||
pub struct Opt {
|
pub struct Opt {
|
||||||
pub arg: Option<String>,
|
pub arg: Option<String>,
|
||||||
pub ind: i32,
|
pub ind: i32,
|
||||||
pub opt: i32,
|
/* opt is set to either the current option or the one that cause an error */
|
||||||
|
pub opt: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum OptError {
|
pub enum OptError {
|
||||||
MissingArg,
|
MissingArg(String),
|
||||||
UnknownOpt,
|
UnknownOpt(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
/* function signature */
|
/* function signature */
|
||||||
@ -51,7 +52,7 @@ impl GetOpt for Vec<String> {
|
|||||||
let len = self.len() as c_int;
|
let len = self.len() as c_int;
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let a = match getopt(len, argv_ptr, opts) {
|
match getopt(len, argv_ptr, opts) {
|
||||||
/* From getopt(3p):
|
/* From getopt(3p):
|
||||||
*
|
*
|
||||||
* The getopt() function shall return the next option character
|
* The getopt() function shall return the next option character
|
||||||
@ -69,10 +70,10 @@ impl GetOpt for Vec<String> {
|
|||||||
* Otherwise, getopt() shall return -1 when all command line
|
* Otherwise, getopt() shall return -1 when all command line
|
||||||
* options are parsed. */
|
* options are parsed. */
|
||||||
58 => { /* numerical ASCII value for ':' */
|
58 => { /* numerical ASCII value for ':' */
|
||||||
return Some(Err(OptError::MissingArg));
|
Some(Err(OptError::MissingArg(optopt.to_string())))
|
||||||
},
|
},
|
||||||
63 => { /* numerical ASCII value for '?' */
|
63 => { /* numerical ASCII value for '?' */
|
||||||
return Some(Err(OptError::UnknownOpt))
|
Some(Err(OptError::UnknownOpt(optopt.to_string())))
|
||||||
},
|
},
|
||||||
/* From getopt(3p):
|
/* From getopt(3p):
|
||||||
*
|
*
|
||||||
@ -88,10 +89,18 @@ impl GetOpt for Vec<String> {
|
|||||||
*
|
*
|
||||||
* getopt() shall return -1 after incrementing optind. */
|
* getopt() shall return -1 after incrementing optind. */
|
||||||
-1 => return None,
|
-1 => return None,
|
||||||
_ => CStr::from_ptr(optarg).to_string_lossy().into_owned(),
|
opt => {
|
||||||
};
|
let arg = CStr::from_ptr(optarg)
|
||||||
|
.to_string_lossy()
|
||||||
|
.into_owned();
|
||||||
|
|
||||||
Some(Ok(Opt { arg: Some(a), ind: optind, opt: optopt }))
|
Some(Ok(Opt {
|
||||||
|
arg: Some(arg),
|
||||||
|
ind: optind,
|
||||||
|
opt: opt.to_string(),
|
||||||
|
}))
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user