mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 01:16:31 +03:00
Reimplement dc_str_replace() with standard Rust functions
This change removes one more use of unstable `wrapping_offset_of'.
This commit is contained in:
committed by
holger krekel
parent
24b025f573
commit
1c5d07a29f
@@ -94,50 +94,14 @@ pub unsafe fn dc_str_replace(
|
|||||||
haystack: *mut *mut libc::c_char,
|
haystack: *mut *mut libc::c_char,
|
||||||
needle: *const libc::c_char,
|
needle: *const libc::c_char,
|
||||||
replacement: *const libc::c_char,
|
replacement: *const libc::c_char,
|
||||||
) -> libc::c_int {
|
) {
|
||||||
let mut replacements: libc::c_int = 0i32;
|
let haystack_s = to_string(*haystack);
|
||||||
let mut start_search_pos: libc::c_int = 0i32;
|
let needle_s = to_string(needle);
|
||||||
let needle_len: libc::c_int;
|
let replacement_s = to_string(replacement);
|
||||||
let replacement_len: libc::c_int;
|
|
||||||
if haystack.is_null()
|
|
||||||
|| (*haystack).is_null()
|
|
||||||
|| needle.is_null()
|
|
||||||
|| *needle.offset(0isize) as libc::c_int == 0i32
|
|
||||||
{
|
|
||||||
return 0i32;
|
|
||||||
}
|
|
||||||
needle_len = strlen(needle) as libc::c_int;
|
|
||||||
replacement_len = (if !replacement.is_null() {
|
|
||||||
strlen(replacement)
|
|
||||||
} else {
|
|
||||||
0
|
|
||||||
}) as libc::c_int;
|
|
||||||
loop {
|
|
||||||
let mut p2: *mut libc::c_char =
|
|
||||||
strstr((*haystack).offset(start_search_pos as isize), needle);
|
|
||||||
if p2.is_null() {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
start_search_pos =
|
|
||||||
(p2.wrapping_offset_from(*haystack) + replacement_len as isize) as libc::c_int;
|
|
||||||
*p2 = 0i32 as libc::c_char;
|
|
||||||
p2 = p2.offset(needle_len as isize);
|
|
||||||
let new_string: *mut libc::c_char = dc_mprintf(
|
|
||||||
b"%s%s%s\x00" as *const u8 as *const libc::c_char,
|
|
||||||
*haystack,
|
|
||||||
if !replacement.is_null() {
|
|
||||||
replacement
|
|
||||||
} else {
|
|
||||||
b"\x00" as *const u8 as *const libc::c_char
|
|
||||||
},
|
|
||||||
p2,
|
|
||||||
);
|
|
||||||
free(*haystack as *mut libc::c_void);
|
|
||||||
*haystack = new_string;
|
|
||||||
replacements += 1
|
|
||||||
}
|
|
||||||
|
|
||||||
replacements
|
free(*haystack as *mut libc::c_void);
|
||||||
|
|
||||||
|
*haystack = haystack_s.replace(&needle_s, &replacement_s).strdup();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn dc_ftoa(f: libc::c_double) -> *mut libc::c_char {
|
pub unsafe fn dc_ftoa(f: libc::c_double) -> *mut libc::c_char {
|
||||||
@@ -1717,7 +1681,7 @@ mod tests {
|
|||||||
fn test_dc_str_replace() {
|
fn test_dc_str_replace() {
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut str: *mut libc::c_char = strdup(b"aaa\x00" as *const u8 as *const libc::c_char);
|
let mut str: *mut libc::c_char = strdup(b"aaa\x00" as *const u8 as *const libc::c_char);
|
||||||
let replacements: libc::c_int = dc_str_replace(
|
dc_str_replace(
|
||||||
&mut str,
|
&mut str,
|
||||||
b"a\x00" as *const u8 as *const libc::c_char,
|
b"a\x00" as *const u8 as *const libc::c_char,
|
||||||
b"ab\x00" as *const u8 as *const libc::c_char,
|
b"ab\x00" as *const u8 as *const libc::c_char,
|
||||||
@@ -1726,7 +1690,6 @@ mod tests {
|
|||||||
CStr::from_ptr(str as *const libc::c_char).to_str().unwrap(),
|
CStr::from_ptr(str as *const libc::c_char).to_str().unwrap(),
|
||||||
"ababab"
|
"ababab"
|
||||||
);
|
);
|
||||||
assert_eq!(replacements, 3);
|
|
||||||
free(str as *mut libc::c_void);
|
free(str as *mut libc::c_void);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user