Verified Commit 26d62967 authored by jD91mZM2's avatar jD91mZM2
Browse files

Implement strcasestr

parent 9d56ce42
Pipeline #1442 failed with stages
in 9 minutes and 3 seconds
......@@ -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)
}
#[no_mangle]
pub unsafe extern "C" fn strstr(s1: *const c_char, s2: *const c_char) -> *mut c_char {
let mut i = 0;
while *s1.offset(i) != 0 {
let mut j = 0;
while *s2.offset(j) != 0 && *s1.offset(j + i) != 0 {
if *s2.offset(j) != *s1.offset(j + i) {
break;
unsafe fn inner_strstr(mut haystack: *const c_char, mut needle: *const c_char, mask: c_char) -> *mut c_char {
while *haystack != 0 {
let mut i = 0;
loop {
if *needle.offset(i) == 0 {
// We reached the end of the needle, everything matches this far
return haystack as *mut c_char;
}
j += 1;
if *s2.offset(j) == 0 {
return s1.offset(i) as *mut c_char;
if *haystack.offset(i) & mask != *needle.offset(i) & mask {
break;
}
i += 1;
}
i += 1;
haystack = haystack.offset(1);
}
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]
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();
......
......@@ -2,17 +2,11 @@
#include <stdio.h>
int main(int argc, char* argv[]) {
// should be "rust"
char* res1 = strstr("In relibc we trust", "rust");
printf("%s\n", (res1) ? res1 : "NULL");
// should be "libc we trust"
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");
printf("%s\n", strstr("In relibc we trust", "rust"));
printf("%s\n", strstr("In relibc we trust", "libc"));
printf("%s\n", strstr("In relibc we trust", "bugs"));
printf("%s\n", strstr("IN RELIBC WE TRUST", "rust"));
printf("%s\n", strcasestr("IN RELIBC WE TRUST", "rust"));
return 0;
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment