From a1de0ef8a1eb442a12ec16cb40b1a37c881fe2be Mon Sep 17 00:00:00 2001 From: Andrii Zymohliad Date: Mon, 12 Mar 2018 14:55:02 +0800 Subject: [PATCH 1/4] Implement strstr(), add strstr test --- src/string/src/lib.rs | 18 ++++++++++++++++-- tests/Makefile | 1 + tests/expected/string/strstr.stderr | 0 tests/expected/string/strstr.stdout | 3 +++ tests/string/strstr.c | 18 ++++++++++++++++++ 5 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 tests/expected/string/strstr.stderr create mode 100644 tests/expected/string/strstr.stdout create mode 100644 tests/string/strstr.c diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs index ca56dff001..04b8c93bcd 100644 --- a/src/string/src/lib.rs +++ b/src/string/src/lib.rs @@ -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] diff --git a/tests/Makefile b/tests/Makefile index a252889605..ecd259335b 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -27,6 +27,7 @@ EXPECT_BINS=\ string/strchr \ string/strrchr \ string/strspn \ + string/strstr \ unlink \ write diff --git a/tests/expected/string/strstr.stderr b/tests/expected/string/strstr.stderr new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/expected/string/strstr.stdout b/tests/expected/string/strstr.stdout new file mode 100644 index 0000000000..e978edff7f --- /dev/null +++ b/tests/expected/string/strstr.stdout @@ -0,0 +1,3 @@ +rust +libc we trust +NULL diff --git a/tests/string/strstr.c b/tests/string/strstr.c new file mode 100644 index 0000000000..1f6796a2f1 --- /dev/null +++ b/tests/string/strstr.c @@ -0,0 +1,18 @@ +#include +#include + +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; +} From 1e969afd43b83477a2251e72400970d690d058b8 Mon Sep 17 00:00:00 2001 From: Andrii Zymohliad Date: Mon, 12 Mar 2018 18:01:12 +0800 Subject: [PATCH 2/4] Implement strpbrk(), add strpbrk test --- src/string/src/lib.rs | 11 +++++++++-- tests/Makefile | 1 + tests/expected/string/strpbrk.stderr | 0 tests/expected/string/strpbrk.stdout | 3 +++ tests/string/strpbrk.c | 21 +++++++++++++++++++++ 5 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 tests/expected/string/strpbrk.stderr create mode 100644 tests/expected/string/strpbrk.stdout create mode 100644 tests/string/strpbrk.c diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs index 04b8c93bcd..ef348830ee 100644 --- a/src/string/src/lib.rs +++ b/src/string/src/lib.rs @@ -250,8 +250,15 @@ 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 mut i = 0; + while *s1.offset(i) != 0 { + if !strchr(s2, *s1.offset(i) as i32).is_null() { + return s1.offset(i) as *mut c_char; + } + i += 1; + } + ptr::null_mut() } #[no_mangle] diff --git a/tests/Makefile b/tests/Makefile index ecd259335b..351d48df23 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -28,6 +28,7 @@ EXPECT_BINS=\ string/strrchr \ string/strspn \ string/strstr \ + string/strpbrk \ unlink \ write diff --git a/tests/expected/string/strpbrk.stderr b/tests/expected/string/strpbrk.stderr new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/expected/string/strpbrk.stdout b/tests/expected/string/strpbrk.stdout new file mode 100644 index 0000000000..7a6bc8b089 --- /dev/null +++ b/tests/expected/string/strpbrk.stdout @@ -0,0 +1,3 @@ +The quick drawn fix jumps over the lazy bug +lazy bug +NULL diff --git a/tests/string/strpbrk.c b/tests/string/strpbrk.c new file mode 100644 index 0000000000..40cae665b1 --- /dev/null +++ b/tests/string/strpbrk.c @@ -0,0 +1,21 @@ +#include +#include + +int main(int argc, char* argv[]) { + char* str = "The quick drawn fix jumps over the lazy bug"; + + // should be "The quick drawn fix jumps over the lazy bug" + char* str1 = strpbrk(str, "From The Very Beginning"); + printf("%s\n", (str1) ? str1 : "NULL"); + + // should be "lazy bug" + char* str2 = strpbrk(str, "lzbg"); + printf("%s\n", (str2) ? str2 : "NULL"); + + + // should be "NULL" + char* str3 = strpbrk(str, "404"); + printf("%s\n", (str3) ? str3 : "NULL"); + + return 0; +} From c4620be999234328e7aca7edccffdba8232071af Mon Sep 17 00:00:00 2001 From: Andrii Zymohliad Date: Mon, 12 Mar 2018 18:22:39 +0800 Subject: [PATCH 3/4] Prettify strpbrk and strstr tests --- tests/string/strpbrk.c | 15 +++++++-------- tests/string/strstr.c | 12 ++++++------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/tests/string/strpbrk.c b/tests/string/strpbrk.c index 40cae665b1..dc0ebf7c53 100644 --- a/tests/string/strpbrk.c +++ b/tests/string/strpbrk.c @@ -2,20 +2,19 @@ #include int main(int argc, char* argv[]) { - char* str = "The quick drawn fix jumps over the lazy bug"; + char* source = "The quick drawn fix jumps over the lazy bug"; // should be "The quick drawn fix jumps over the lazy bug" - char* str1 = strpbrk(str, "From The Very Beginning"); - printf("%s\n", (str1) ? str1 : "NULL"); + char* res1 = strpbrk(source, "From The Very Beginning"); + printf("%s\n", (res1) ? res1 : "NULL"); // should be "lazy bug" - char* str2 = strpbrk(str, "lzbg"); - printf("%s\n", (str2) ? str2 : "NULL"); - + char* res2 = strpbrk(source, "lzbg"); + printf("%s\n", (res2) ? res2 : "NULL"); // should be "NULL" - char* str3 = strpbrk(str, "404"); - printf("%s\n", (str3) ? str3 : "NULL"); + char* res3 = strpbrk(source, "404"); + printf("%s\n", (res3) ? res3 : "NULL"); return 0; } diff --git a/tests/string/strstr.c b/tests/string/strstr.c index 1f6796a2f1..6a074d18d8 100644 --- a/tests/string/strstr.c +++ b/tests/string/strstr.c @@ -3,16 +3,16 @@ int main(int argc, char* argv[]) { // should be "rust" - char* str1 = strstr("In relibc we trust", "rust"); - printf("%s\n", (str1) ? str1 : "NULL"); + char* res1 = strstr("In relibc we trust", "rust"); + printf("%s\n", (res1) ? res1 : "NULL"); // should be "libc we trust" - char* str2 = strstr("In relibc we trust", "libc"); - printf("%s\n", (str2) ? str2 : "NULL"); + char* res2 = strstr("In relibc we trust", "libc"); + printf("%s\n", (res2) ? res2 : "NULL"); // should be "NULL" - char* str3 = strstr("In relibc we trust", "bugs"); - printf("%s\n", (str3) ? str3 : "NULL"); + char* res3 = strstr("In relibc we trust", "bugs"); + printf("%s\n", (res3) ? res3 : "NULL"); return 0; } From 40efea056b787f38bde154fcfe000258b58e1046 Mon Sep 17 00:00:00 2001 From: Andrii Zymohliad Date: Wed, 14 Mar 2018 08:06:51 +0800 Subject: [PATCH 4/4] Reimplement strpbrk() using strcspn() --- src/string/src/lib.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs index ef348830ee..47e562bcc2 100644 --- a/src/string/src/lib.rs +++ b/src/string/src/lib.rs @@ -251,14 +251,12 @@ pub unsafe extern "C" fn strncpy(s1: *mut c_char, s2: *const c_char, n: usize) - #[no_mangle] pub unsafe extern "C" fn strpbrk(s1: *const c_char, s2: *const c_char) -> *mut c_char { - let mut i = 0; - while *s1.offset(i) != 0 { - if !strchr(s2, *s1.offset(i) as i32).is_null() { - return s1.offset(i) as *mut c_char; - } - i += 1; + let p = s1.offset(strcspn(s1, s2) as isize); + if *p != 0 { + p as *mut c_char + } else { + ptr::null_mut() } - ptr::null_mut() } #[no_mangle]