pub struct CArgsBuf {
pub argc: usize,
pub argv: Vec<*mut i8>,
u8zz: Vec<u8>
}
impl CArgsBuf {
pub fn from(args: &Vec<String>) -> Self {
let argc: usize = args.len();
let u8zz_len: usize = (0..argc).map(|i| args[i].len()).sum();
let mut s = Self{
argc: argc,
argv: vec![0 as *mut i8; argc],
u8zz: vec![0u8; u8zz_len + argc + 1]};
let mut p: usize = 0;
for i in 0..argc {
s.argv[i] = ((&s.u8zz[0] as *const u8) as usize + p) as *mut i8;
for j in 0..args[i].len() {
s.u8zz[p] = args[i].as_bytes()[j];
p += 1;
}
s.u8zz[p] = b'\0';
p += 1;
}
s.u8zz[p] = b'\0';
s
}
pub fn as_argc(&self) -> i32 {
self.argc as i32
}
pub fn as_argv_ptr_mut(&mut self) -> *mut *mut i8 {
let av: &mut [*mut i8] = &mut self.argv;
av as *mut [*mut i8] as *mut *mut i8
}
pub fn as_argv_ptr(&self) -> *const *mut i8 {
let av: &[*mut i8] = &self.argv;
av as *const [*mut i8] as *const *mut i8
}
}