* create basic strtok

* add test and expected output
This commit is contained in:
Timothy Bess
2018-03-17 02:58:08 -04:00
parent bebbd35e1a
commit f60fafe8fb
6 changed files with 50 additions and 2 deletions
+31 -2
View File
@@ -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]