Merge pull request #75 from azymohliad/master
Implement strstr() and strpbrk() from string.h
This commit is contained in:
+23
-4
@@ -250,8 +250,13 @@ pub unsafe extern "C" fn strncpy(s1: *mut c_char, s2: *const c_char, n: usize) -
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn strpbrk(s1: *const c_char, s2: *const c_char) -> *mut c_char {
|
||||
unimplemented!();
|
||||
pub unsafe extern "C" fn strpbrk(s1: *const c_char, s2: *const c_char) -> *mut c_char {
|
||||
let p = s1.offset(strcspn(s1, s2) as isize);
|
||||
if *p != 0 {
|
||||
p as *mut c_char
|
||||
} else {
|
||||
ptr::null_mut()
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
@@ -299,8 +304,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]
|
||||
|
||||
@@ -27,6 +27,8 @@ EXPECT_BINS=\
|
||||
string/strchr \
|
||||
string/strrchr \
|
||||
string/strspn \
|
||||
string/strstr \
|
||||
string/strpbrk \
|
||||
unlink \
|
||||
write
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
The quick drawn fix jumps over the lazy bug
|
||||
lazy bug
|
||||
NULL
|
||||
@@ -0,0 +1,3 @@
|
||||
rust
|
||||
libc we trust
|
||||
NULL
|
||||
@@ -0,0 +1,20 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
char* source = "The quick drawn fix jumps over the lazy bug";
|
||||
|
||||
// should be "The quick drawn fix jumps over the lazy bug"
|
||||
char* res1 = strpbrk(source, "From The Very Beginning");
|
||||
printf("%s\n", (res1) ? res1 : "NULL");
|
||||
|
||||
// should be "lazy bug"
|
||||
char* res2 = strpbrk(source, "lzbg");
|
||||
printf("%s\n", (res2) ? res2 : "NULL");
|
||||
|
||||
// should be "NULL"
|
||||
char* res3 = strpbrk(source, "404");
|
||||
printf("%s\n", (res3) ? res3 : "NULL");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
#include <string.h>
|
||||
#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");
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user