Skip to content
Snippets Groups Projects
Commit f60fafe8 authored by Timothy Bess's avatar Timothy Bess
Browse files

* create basic strtok

* add test and expected output
parent bebbd35e
No related branches found
No related tags found
No related merge requests found
/target/
.idea/
......@@ -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]
......
......@@ -29,6 +29,7 @@ EXPECT_BINS=\
string/strspn \
string/strstr \
string/strpbrk \
string/strtok \
unlink \
waitpid \
write
......
I'd_just_like_to_interject_for_a_moment.__What_you're_referring_to_as_Linux,
is_in_fact,_GNU/Linux,_or_as_I've_recently_taken_to_calling_it,_GNU_plus_Linux.
\ No newline at end of file
#include <string.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
char source[] = "I'd just like to interject for a moment. What you're referring to as Linux, "
"is in fact, GNU/Linux, or as I've recently taken to calling it, GNU plus Linux.\n";
char* token = strtok(source, " ");
while (token) {
printf("%s_", token);
token = strtok(NULL, " ");
}
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment