Compare commits

...

2 Commits

Author SHA1 Message Date
Emma Tebibyte 95927ba8c5
getopt.rs(3): formatting 2024-04-11 23:51:52 -06:00
Emma Tebibyte ad92fe27d4
fop(1): switch to getopt.rs(3) 2024-04-11 23:37:04 -06:00
2 changed files with 24 additions and 13 deletions

View File

@ -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);
});

View File

@ -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):