Skip to content
Snippets Groups Projects
Verified Commit 26d62967 authored by jD91mZM2's avatar jD91mZM2
Browse files

Implement strcasestr

parent 9d56ce42
No related branches found
No related tags found
No related merge requests found
Pipeline #1442 failed
...@@ -348,25 +348,35 @@ pub unsafe extern "C" fn strspn(s1: *const c_char, s2: *const c_char) -> size_t ...@@ -348,25 +348,35 @@ pub unsafe extern "C" fn strspn(s1: *const c_char, s2: *const c_char) -> size_t
inner_strspn(s1, s2, true) inner_strspn(s1, s2, true)
} }
#[no_mangle] unsafe fn inner_strstr(mut haystack: *const c_char, mut needle: *const c_char, mask: c_char) -> *mut c_char {
pub unsafe extern "C" fn strstr(s1: *const c_char, s2: *const c_char) -> *mut c_char { while *haystack != 0 {
let mut i = 0; let mut i = 0;
while *s1.offset(i) != 0 { loop {
let mut j = 0; if *needle.offset(i) == 0 {
while *s2.offset(j) != 0 && *s1.offset(j + i) != 0 { // We reached the end of the needle, everything matches this far
if *s2.offset(j) != *s1.offset(j + i) { return haystack as *mut c_char;
break;
} }
j += 1; if *haystack.offset(i) & mask != *needle.offset(i) & mask {
if *s2.offset(j) == 0 { break;
return s1.offset(i) as *mut c_char;
} }
i += 1;
} }
i += 1;
haystack = haystack.offset(1);
} }
ptr::null_mut() ptr::null_mut()
} }
#[no_mangle]
pub unsafe extern "C" fn strstr(haystack: *const c_char, needle: *const c_char) -> *mut c_char {
inner_strstr(haystack, needle, !0)
}
#[no_mangle]
pub unsafe extern "C" fn strcasestr(haystack: *const c_char, needle: *const c_char) -> *mut c_char {
inner_strstr(haystack, needle, !32)
}
#[no_mangle] #[no_mangle]
pub extern "C" fn strtok(s1: *mut c_char, delimiter: *const c_char) -> *mut c_char { pub extern "C" fn strtok(s1: *mut c_char, delimiter: *const c_char) -> *mut c_char {
static mut HAYSTACK: *mut c_char = ptr::null_mut(); static mut HAYSTACK: *mut c_char = ptr::null_mut();
......
rust rust
libc we trust libc we trust
NULL NULL
NULL
RUST
...@@ -2,17 +2,11 @@ ...@@ -2,17 +2,11 @@
#include <stdio.h> #include <stdio.h>
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
// should be "rust" printf("%s\n", strstr("In relibc we trust", "rust"));
char* res1 = strstr("In relibc we trust", "rust"); printf("%s\n", strstr("In relibc we trust", "libc"));
printf("%s\n", (res1) ? res1 : "NULL"); printf("%s\n", strstr("In relibc we trust", "bugs"));
printf("%s\n", strstr("IN RELIBC WE TRUST", "rust"));
// should be "libc we trust" printf("%s\n", strcasestr("IN RELIBC WE TRUST", "rust"));
char* res2 = strstr("In relibc we trust", "libc");
printf("%s\n", (res2) ? res2 : "NULL");
// should be "NULL"
char* res3 = strstr("In relibc we trust", "bugs");
printf("%s\n", (res3) ? res3 : "NULL");
return 0; 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