1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
use std::ffi::CString; use std::os::raw::c_char; use std::path::Path; mod helpers; #[no_mangle] pub extern fn rust_join(c_path_string1: *const c_char, c_path_string2: *const c_char) -> *const c_char { helpers::protect_against_panic(|| { let path_string1 = helpers::build_str_from_c(c_path_string1); let path_string2 = helpers::build_str_from_c(c_path_string2); let path1 = Path::new(&path_string1); let joined_path = path1.join(path_string2); let joined_string = helpers::path_to_str(joined_path.into_os_string()); let c_joined = CString::new(joined_string).unwrap(); c_joined.into_raw() }) } #[no_mangle] pub extern fn rust_dirname(c_path_string: *const c_char) -> *const c_char { helpers::protect_against_panic(|| { let path_string = helpers::build_str_from_c(c_path_string); let path = Path::new(&path_string); let dirname_string = helpers::path_to_str(path.parent().unwrap().to_owned().into_os_string()); let c_dirname = CString::new(dirname_string).unwrap(); c_dirname.into_raw() }) } #[no_mangle] pub extern fn rust_extension(c_path_string: *const c_char) -> *const c_char { helpers::protect_against_panic(|| { let path_string = helpers::build_str_from_c(c_path_string); let path = Path::new(&path_string); let extension_string = helpers::path_to_str(path.extension().unwrap().to_owned()); let c_extension = CString::new(extension_string).unwrap(); c_extension.into_raw() }) } #[no_mangle] pub extern fn rust_filename(c_path_string: *const c_char) -> *const c_char { helpers::protect_against_panic (|| { let path_string = helpers::build_str_from_c(c_path_string); let path = Path::new(&path_string); let filename_string = helpers::path_to_str(path.file_name().unwrap().to_owned()); let c_filename = CString::new(filename_string).unwrap(); c_filename.into_raw() }) }