Advertisement
Guest User

Untitled

a guest
Jul 15th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.34 KB | None | 0 0
  1. extern crate libc;
  2.  
  3. use libc::{c_int, c_char};
  4. use std::env;
  5. use std::ffi::CString;
  6.  
  7. extern {
  8.     pub fn getopt(argc: c_int, argv: *const *mut c_char, optstr: *const c_char) -> c_int;
  9. }
  10.  
  11. fn r_getopt(argc: usize, c_args: *const *mut i8) -> i32 {
  12.     // Ping command line args
  13.     let valid_args = "h?4bRT:6F:N:aABc:dDfi:I:l:Lm:M:nOp:qQ:rs:S:t:UvVw:W:";
  14.     unsafe {
  15.         return getopt(
  16.             argc as c_int,
  17.             c_args,
  18.             std::ffi::CString::new(valid_args).unwrap().as_ptr()
  19.         ) as i32;
  20.     }
  21. }
  22.  
  23. fn main() {
  24.     // Parse command line arguements and handle them
  25.     let argc = env::args().len();
  26.  
  27.     // Borrowed from https://stackoverflow.com/questions/34379641/how-do-i-convert-rust-args-into-the-argc-and-argv-c-equivalents
  28.     // Create a vector of zero terminated strings
  29.     let args = env::args().map(|arg| CString::new(arg).unwrap()).collect::<Vec<CString>>();
  30.     // Convert the strings to raw pointers
  31.     let c_args = args.iter().map(|arg| arg.as_ptr()).collect::<Vec<*const c_char>>().as_ptr();
  32.  
  33.     let mut cmd : i32 = r_getopt(argc, c_args);
  34.     println!("{}", cmd);
  35.     while cmd != -1 {
  36.         let chr = cmd as u8;
  37.         match chr as char {
  38.             '4' => println!("4!"),
  39.             _   => {println!("{}", chr); break}
  40.         }
  41.         cmd = r_getopt(argc, c_args);
  42.     }
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement