diff options
Diffstat (limited to 'src/util.rs')
-rw-r--r-- | src/util.rs | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 0000000..8bcc028 --- /dev/null +++ b/src/util.rs @@ -0,0 +1,25 @@ +use std::ffi::{self, CStr}; +use std::ptr; +use libc; + +/// Consumes and frees the input pointer, and assumes it points to +/// a nul-terminated C-string that contains valid UTF8. +pub unsafe fn string_from_utf8_charp(p: *mut i8) -> String { + let bytes = CStr::from_ptr(p).to_bytes(); + let res = String::from_utf8(bytes.to_vec()).unwrap(); + libc::free(p as *mut ffi::c_void); + res +} + +pub fn strdup(s: &str) -> *mut i8 { + unsafe { + let p: *mut i8 = malloc(s.len() + 1); + ptr::copy_nonoverlapping(s.as_ptr(), p as *mut u8, s.len()); + *p.add(s.len()) = 0; + p + } +} + +pub unsafe fn malloc<T>(count: usize) -> *mut T { + libc::malloc(count * std::mem::size_of::<T>()) as *mut T +} |