src/dirname.rs in faster_path-0.1.13 vs src/dirname.rs in faster_path-0.2.0

- old
+ new

@@ -1,46 +1,31 @@ -use libc::c_char; -use std::ffi::{CStr, CString}; +use std::path::MAIN_SEPARATOR; +use path_parsing::{last_sep_i, last_non_sep_i, last_non_sep_i_before}; -#[no_mangle] -pub extern "C" fn dirname(path: *const c_char) -> *const c_char { - if path.is_null() { - return path +pub fn dirname(path: &str) -> String { + let r_str = path; + if r_str.is_empty() { + return ".".to_string(); } - let r_str = unsafe { CStr::from_ptr(path) }.to_str().unwrap(); - - CString::new(rust::dirname(r_str)).unwrap().into_raw() -} - -pub mod rust { - use std::path::MAIN_SEPARATOR; - use path_parsing::{last_sep_i, last_non_sep_i, last_non_sep_i_before}; - - pub fn dirname(path: &str) -> String { - let r_str = path; - if r_str.is_empty() { - return ".".to_string(); - } - let non_sep_i = last_non_sep_i(r_str); - if non_sep_i == -1 { - return MAIN_SEPARATOR.to_string(); - } - let sep_i = last_sep_i(r_str, non_sep_i); - if sep_i == -1 { - return ".".to_string(); - } - if sep_i == 0 { - return MAIN_SEPARATOR.to_string(); - } - let non_sep_i2 = last_non_sep_i_before(r_str, sep_i); - if non_sep_i2 != -1 { - return r_str[..(non_sep_i2 + 1) as usize].to_string(); - } else { - return MAIN_SEPARATOR.to_string(); - } + let non_sep_i = last_non_sep_i(r_str); + if non_sep_i == -1 { + return MAIN_SEPARATOR.to_string(); } + let sep_i = last_sep_i(r_str, non_sep_i); + if sep_i == -1 { + return ".".to_string(); + } + if sep_i == 0 { + return MAIN_SEPARATOR.to_string(); + } + let non_sep_i2 = last_non_sep_i_before(r_str, sep_i); + if non_sep_i2 != -1 { + return r_str[..(non_sep_i2 + 1) as usize].to_string(); + } else { + return MAIN_SEPARATOR.to_string(); + } } #[test] fn returns_dot_for_empty_string(){ - assert_eq!(rust::dirname(""), ".".to_string()); + assert_eq!(dirname(""), ".".to_string()); }