forked from bonsai/harakit
		
	getopt.rs(3): optind support
This commit is contained in:
		
							parent
							
								
									78eacd660a
								
							
						
					
					
						commit
						a5a9c91cb6
					
				@ -18,6 +18,21 @@
 | 
			
		||||
 | 
			
		||||
use std::ffi::{ c_int, c_char, CString, CStr };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* binding to getopt(3p) */
 | 
			
		||||
extern "C" {
 | 
			
		||||
	static mut optarg: *mut c_char;
 | 
			
		||||
	static mut _opterr: c_int;
 | 
			
		||||
	static mut optind: c_int;
 | 
			
		||||
	static mut optopt: c_int;
 | 
			
		||||
 | 
			
		||||
	fn getopt(
 | 
			
		||||
		___argc: c_int,
 | 
			
		||||
		___argv: *const *mut c_char,
 | 
			
		||||
		__shortopts: *const c_char,
 | 
			
		||||
	) -> c_int;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub struct Opt {
 | 
			
		||||
	pub arg: Option<String>,
 | 
			
		||||
	pub ind: i32,
 | 
			
		||||
@ -50,7 +65,7 @@ impl GetOpt for Vec<String> {
 | 
			
		||||
        let opts = CString::new(optstring).unwrap().into_raw();
 | 
			
		||||
        let len = self.len() as c_int;
 | 
			
		||||
 | 
			
		||||
        unsafe { // TODO: enable optind modification
 | 
			
		||||
        unsafe {
 | 
			
		||||
            match getopt(len, argv_ptr, opts) { 
 | 
			
		||||
				/* From getopt(3p):
 | 
			
		||||
				 *
 | 
			
		||||
@ -103,16 +118,24 @@ impl GetOpt for Vec<String> {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
/* binding to getopt(3p) */
 | 
			
		||||
extern "C" {
 | 
			
		||||
	static mut optarg: *mut c_char;
 | 
			
		||||
	static mut _opterr: c_int;
 | 
			
		||||
	static mut optind: c_int;
 | 
			
		||||
	static mut optopt: c_int;
 | 
			
		||||
 | 
			
		||||
	fn getopt(
 | 
			
		||||
		___argc: c_int,
 | 
			
		||||
		___argv: *const *mut c_char,
 | 
			
		||||
		__shortopts: *const c_char,
 | 
			
		||||
	) -> c_int;
 | 
			
		||||
}
 | 
			
		||||
/* From getopt(3p):
 | 
			
		||||
 *
 | 
			
		||||
 * The variable optind is the index of the next element of the argv[]
 | 
			
		||||
 * vector to be processed. It shall be initialized to 1 by the system, and
 | 
			
		||||
 * getopt() shall update it when it finishes with each element of argv[].
 | 
			
		||||
 * If the application sets optind to zero before calling getopt(), the 
 | 
			
		||||
 * behavior is unspecified. When an element of argv[] contains multiple
 | 
			
		||||
 * option characters, it is unspecified how getopt() determines which
 | 
			
		||||
 * options have already been processed.
 | 
			
		||||
 *
 | 
			
		||||
 * This API can be utilized using unsafe blocks and dereferencing:
 | 
			
		||||
 *
 | 
			
		||||
 * use getopt::OPTIND;
 | 
			
		||||
 *
 | 
			
		||||
 * unsafe { while *OPTIND < 5 {
 | 
			
		||||
 *	println!("{}", *OPTIND); // 1..4
 | 
			
		||||
 *	*OPTIND += 1;
 | 
			
		||||
 * }}
 | 
			
		||||
 */
 | 
			
		||||
pub static mut OPTIND: *mut i32 = unsafe { std::ptr::addr_of_mut!(optind) };
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user