diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs index c795ee160b0500286bd194f51f5f655aec48d65c..c97302b92bf44cefacf6f081c32275c5dc8ecb70 100644 --- a/src/string/src/lib.rs +++ b/src/string/src/lib.rs @@ -324,33 +324,9 @@ pub unsafe extern "C" fn strstr(s1: *const c_char, s2: *const c_char) -> *mut c_ #[no_mangle] pub extern "C" fn strtok(s1: *mut c_char, delimiter: *const c_char) -> *mut c_char { - // Loosely based on GLIBC implementation + static mut HAYSTACK: *mut c_char = ptr::null_mut(); unsafe { - static mut HAYSTACK: *mut c_char = ptr::null_mut(); - if !s1.is_null() { - HAYSTACK = s1; - } else if HAYSTACK.is_null() { - return ptr::null_mut(); - } - - // Skip past any extra delimiter left over from previous call - HAYSTACK = HAYSTACK.add(strspn(HAYSTACK, delimiter)); - if *HAYSTACK == 0 { - HAYSTACK = ptr::null_mut(); - return ptr::null_mut(); - } - - // Build token by injecting null byte into delimiter - let token = HAYSTACK; - HAYSTACK = strpbrk(token, delimiter); - if !HAYSTACK.is_null() { - HAYSTACK.write(0); - HAYSTACK = HAYSTACK.add(1); - } else { - HAYSTACK = ptr::null_mut(); - } - - return token; + return strtok_r(s1, delimiter, &mut HAYSTACK); } }