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