c_path/
lib.rs

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}