Skip to content
Snippets Groups Projects
Unverified Commit a1baf1c9 authored by Jeremy Soller's avatar Jeremy Soller Committed by GitHub
Browse files

Merge pull request #75 from azymohliad/master

Implement strstr() and strpbrk() from string.h
parents b419e150 cd2312fd
No related branches found
No related tags found
No related merge requests found
...@@ -250,8 +250,13 @@ pub unsafe extern "C" fn strncpy(s1: *mut c_char, s2: *const c_char, n: usize) - ...@@ -250,8 +250,13 @@ pub unsafe extern "C" fn strncpy(s1: *mut c_char, s2: *const c_char, n: usize) -
} }
#[no_mangle] #[no_mangle]
pub extern "C" fn strpbrk(s1: *const c_char, s2: *const c_char) -> *mut c_char { pub unsafe extern "C" fn strpbrk(s1: *const c_char, s2: *const c_char) -> *mut c_char {
unimplemented!(); let p = s1.offset(strcspn(s1, s2) as isize);
if *p != 0 {
p as *mut c_char
} else {
ptr::null_mut()
}
} }
#[no_mangle] #[no_mangle]
...@@ -299,8 +304,22 @@ pub unsafe extern "C" fn strspn(s1: *const c_char, s2: *const c_char) -> c_ulong ...@@ -299,8 +304,22 @@ pub unsafe extern "C" fn strspn(s1: *const c_char, s2: *const c_char) -> c_ulong
} }
#[no_mangle] #[no_mangle]
pub extern "C" fn strstr(s1: *const c_char, s2: *const c_char) -> *mut c_char { pub unsafe extern "C" fn strstr(s1: *const c_char, s2: *const c_char) -> *mut c_char {
unimplemented!(); 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] #[no_mangle]
......
...@@ -27,6 +27,8 @@ EXPECT_BINS=\ ...@@ -27,6 +27,8 @@ EXPECT_BINS=\
string/strchr \ string/strchr \
string/strrchr \ string/strrchr \
string/strspn \ string/strspn \
string/strstr \
string/strpbrk \
unlink \ unlink \
write write
......
The quick drawn fix jumps over the lazy bug
lazy bug
NULL
rust
libc we trust
NULL
#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;
}
#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;
}
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