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()   
  })
}