Implement strstr(), add strstr test

This commit is contained in:
Andrii Zymohliad
2018-03-12 14:55:02 +08:00
parent 7912332137
commit a1de0ef8a1
5 changed files with 38 additions and 2 deletions
+16 -2
View File
@@ -299,8 +299,22 @@ pub unsafe extern "C" fn strspn(s1: *const c_char, s2: *const c_char) -> c_ulong
}
#[no_mangle]
pub extern "C" fn strstr(s1: *const c_char, s2: *const c_char) -> *mut c_char {
unimplemented!();
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;
}
j += 1;
if *s2.offset(j) == 0 {
return s1.offset(i) as *mut c_char;
}
}
i += 1;
}
ptr::null_mut()
}
#[no_mangle]
+1
View File
@@ -27,6 +27,7 @@ EXPECT_BINS=\
string/strchr \
string/strrchr \
string/strspn \
string/strstr \
unlink \
write
View File
+3
View File
@@ -0,0 +1,3 @@
rust
libc we trust
NULL
+18
View File
@@ -0,0 +1,18 @@
#include <string.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
// should be "rust"
char* str1 = strstr("In relibc we trust", "rust");
printf("%s\n", (str1) ? str1 : "NULL");
// should be "libc we trust"
char* str2 = strstr("In relibc we trust", "libc");
printf("%s\n", (str2) ? str2 : "NULL");
// should be "NULL"
char* str3 = strstr("In relibc we trust", "bugs");
printf("%s\n", (str3) ? str3 : "NULL");
return 0;
}