src/basename.rs in faster_path-0.1.13 vs src/basename.rs in faster_path-0.2.0
- old
+ new
@@ -1,41 +1,23 @@
-use libc::c_char;
-use std::ffi::{CStr, CString};
+extern crate array_tool;
+use path_parsing::extract_last_path_segment;
+use self::array_tool::string::Squeeze;
-#[no_mangle]
-pub extern "C" fn basename(c_pth: *const c_char, c_ext: *const c_char) -> *const c_char {
- if c_pth.is_null() || c_ext.is_null() {
- return c_pth;
+pub fn basename(pth: &str, ext: &str) -> String {
+ // Known edge case
+ match &pth.squeeze("/")[..] {
+ "/" => { return "/".to_string() }
+ _ => {}
}
- let pth = unsafe { CStr::from_ptr(c_pth) }.to_str().unwrap();
- let ext = unsafe { CStr::from_ptr(c_ext) }.to_str().unwrap();
- let name = rust::basename(pth, ext);
-
- CString::new(name).unwrap().into_raw()
-}
+ let mut name = extract_last_path_segment(pth);
-pub mod rust {
- extern crate array_tool;
- use path_parsing::extract_last_path_segment;
- use self::array_tool::string::Squeeze;
-
- pub fn basename(pth: &str, ext: &str) -> String {
- // Known edge case
- match &pth.squeeze("/")[..] {
- "/" => { return "/".to_string() }
- _ => {}
+ if ext == ".*" {
+ if let Some(dot_i) = name.rfind('.') {
+ name = &name[0..dot_i];
}
-
- let mut name = extract_last_path_segment(pth);
-
- if ext == ".*" {
- if let Some(dot_i) = name.rfind('.') {
- name = &name[0..dot_i];
- }
- } else if name.ends_with(ext) {
- name = &name[..name.len() - ext.len()];
- };
- name.to_string()
- }
+ } else if name.ends_with(ext) {
+ name = &name[..name.len() - ext.len()];
+ };
+ name.to_string()
}