* create basic strtok
* add test and expected output
This commit is contained in:
+31
-2
@@ -323,8 +323,37 @@ 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, s2: *const c_char) -> *mut c_char {
|
||||
unimplemented!();
|
||||
pub extern "C" fn strtok(s1: *mut c_char, delimiter: *const c_char) -> *mut c_char {
|
||||
// Loosely based on GLIBC implementation
|
||||
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 as c_char);
|
||||
HAYSTACK = HAYSTACK.add(1);
|
||||
} else {
|
||||
HAYSTACK = ptr::null_mut();
|
||||
}
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
ptr::null_mut()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
|
||||
Reference in New Issue
Block a user