From 4f601f4896219d9c080d51ba1494ecc5f7f9fc11 Mon Sep 17 00:00:00 2001 From: Tom Almeida Date: Sat, 10 Mar 2018 16:59:53 +0800 Subject: [PATCH 1/6] Added memchr and memccpy to string --- src/string/Cargo.toml | 3 ++- src/string/src/lib.rs | 38 ++++++++++++++++++++++++++++++++++---- tests/Makefile | 1 + tests/mem.c | 22 ++++++++++++++++++++++ 4 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 tests/mem.c diff --git a/src/string/Cargo.toml b/src/string/Cargo.toml index d00a3e5c11..771d72c5ce 100644 --- a/src/string/Cargo.toml +++ b/src/string/Cargo.toml @@ -10,4 +10,5 @@ cbindgen = { path = "../../cbindgen" } [dependencies] platform = { path = "../platform" } stdlib = { path = "../stdlib" } -errno = { path = "../errno" } \ No newline at end of file +errno = { path = "../errno" } +compiler_builtins = { git = "https://github.com/rust-lang-nursery/compiler-builtins.git", default-features = false, features = ["mem"] } diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs index c272d9211a..ad98548e01 100644 --- a/src/string/src/lib.rs +++ b/src/string/src/lib.rs @@ -1,7 +1,9 @@ //! string implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/string.h.html +#![feature(compiler_builtins_lib)] #![no_std] +extern crate compiler_builtins; extern crate errno; extern crate platform; extern crate stdlib; @@ -12,13 +14,41 @@ use core::cmp; use core::usize; #[no_mangle] -pub extern "C" fn memccpy(s1: *mut c_void, s2: *const c_void, c: c_int, n: usize) -> *mut c_void { - unimplemented!(); +pub unsafe extern "C" fn memccpy( + dest: *mut c_void, + src: *const c_void, + c: c_int, + n: usize, +) -> *mut c_void { + use compiler_builtins::mem::memcpy; + use core::mem; + let dest = dest as *mut u8; + let to = memchr(src, c, n); + if to as usize == 0 { + return to; + } + let src = src as *mut u8; + let dist = ((to as usize) - (src as usize)) / mem::size_of::(); + if memcpy(dest, src, dist) as usize > 0 { + return dest.offset(dist as isize) as *mut c_void; + } + 0usize as *mut c_void } #[no_mangle] -pub extern "C" fn memchr(s: *const c_void, c: c_int, n: usize) -> *mut c_void { - unimplemented!(); +pub unsafe extern "C" fn memchr(s: *const c_void, c: c_int, n: usize) -> *mut c_void { + let s = s as *mut u8; + let c = c as u8; + let mut i = 0; + loop { + if *s.offset(i as isize) == c { + return s.offset(i as isize) as *mut c_void; + } + i += 1; + if i == n { + return 0usize as *mut c_void; + } + } } // #[no_mangle] diff --git a/tests/Makefile b/tests/Makefile index ae73d603b1..18061472fc 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -16,6 +16,7 @@ BINS=\ getid \ link \ math \ + mem \ pipe \ printf \ rmdir \ diff --git a/tests/mem.c b/tests/mem.c new file mode 100644 index 0000000000..0faa781f43 --- /dev/null +++ b/tests/mem.c @@ -0,0 +1,22 @@ +#include +#include + +int main(int argc, char ** argv) { + printf("# mem #\n"); + char arr[100]; + memset(arr, 0, 100); // Compiler builtin, should work + arr[50] = 1; + if ((size_t)memchr((void *)arr, 1, 100) - (size_t)arr != 50) { + printf("Incorrect memchr\n"); + exit(1); + } + printf("Correct memchr\n"); + char arr2[51]; + memset(arr2, 0, 51); // Compiler builtin, should work + memccpy((void *)arr2, (void *)arr, 1, 100); + if (arr[50] != 1) { + printf("Incorrect memccpy\n"); + exit(1); + } + printf("Correct memccpy\n"); +} From b013f5f0ed97e22d375453468299cf963b689778 Mon Sep 17 00:00:00 2001 From: Tom Almeida Date: Sat, 10 Mar 2018 17:05:56 +0800 Subject: [PATCH 2/6] Fixed mem test --- tests/mem.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/mem.c b/tests/mem.c index 0faa781f43..cc104cbb92 100644 --- a/tests/mem.c +++ b/tests/mem.c @@ -1,4 +1,5 @@ #include +#include #include int main(int argc, char ** argv) { From 3470882df690f33e15360626c6707e94c2fc453b Mon Sep 17 00:00:00 2001 From: Tom Almeida Date: Sat, 10 Mar 2018 17:12:05 +0800 Subject: [PATCH 3/6] Fixed incorrect return of memccpy --- src/string/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs index ad98548e01..47ecec5167 100644 --- a/src/string/src/lib.rs +++ b/src/string/src/lib.rs @@ -30,7 +30,7 @@ pub unsafe extern "C" fn memccpy( let src = src as *mut u8; let dist = ((to as usize) - (src as usize)) / mem::size_of::(); if memcpy(dest, src, dist) as usize > 0 { - return dest.offset(dist as isize) as *mut c_void; + return dest.offset(dist as isize + 1) as *mut c_void; } 0usize as *mut c_void } From 774856f9b29e31a8f4933479f57b86dbc9c8fa64 Mon Sep 17 00:00:00 2001 From: Tom Almeida Date: Sat, 10 Mar 2018 21:37:01 +0800 Subject: [PATCH 4/6] Update lib.rs --- src/string/src/lib.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs index 47ecec5167..96688cac3c 100644 --- a/src/string/src/lib.rs +++ b/src/string/src/lib.rs @@ -12,6 +12,7 @@ use platform::types::*; use errno::*; use core::cmp; use core::usize; +use core::ptr; #[no_mangle] pub unsafe extern "C" fn memccpy( @@ -21,18 +22,17 @@ pub unsafe extern "C" fn memccpy( n: usize, ) -> *mut c_void { use compiler_builtins::mem::memcpy; - use core::mem; let dest = dest as *mut u8; let to = memchr(src, c, n); - if to as usize == 0 { + if to.is_null() { return to; } let src = src as *mut u8; - let dist = ((to as usize) - (src as usize)) / mem::size_of::(); + let dist = (to as usize) - (src as usize); if memcpy(dest, src, dist) as usize > 0 { return dest.offset(dist as isize + 1) as *mut c_void; } - 0usize as *mut c_void + ptr::null_mut() } #[no_mangle] @@ -40,15 +40,12 @@ pub unsafe extern "C" fn memchr(s: *const c_void, c: c_int, n: usize) -> *mut c_ let s = s as *mut u8; let c = c as u8; let mut i = 0; - loop { + for i in 0..n { if *s.offset(i as isize) == c { return s.offset(i as isize) as *mut c_void; } - i += 1; - if i == n { - return 0usize as *mut c_void; - } } + ptr::null_mut() } // #[no_mangle] From d214817c871d7ca13ff079b4306362df197f538c Mon Sep 17 00:00:00 2001 From: Tom Almeida Date: Sat, 10 Mar 2018 21:52:06 +0800 Subject: [PATCH 5/6] readability update in lib.rs --- src/string/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs index 96688cac3c..da667794b1 100644 --- a/src/string/src/lib.rs +++ b/src/string/src/lib.rs @@ -29,10 +29,10 @@ pub unsafe extern "C" fn memccpy( } let src = src as *mut u8; let dist = (to as usize) - (src as usize); - if memcpy(dest, src, dist) as usize > 0 { - return dest.offset(dist as isize + 1) as *mut c_void; + if memcpy(dest, src, dist).is_null() { + return ptr::null_mut(); } - ptr::null_mut() + dest.offset(dist as isize + 1) as *mut c_void } #[no_mangle] From a2a7efa9462af4bb7387fbd58e5f1f9000c87e95 Mon Sep 17 00:00:00 2001 From: Tom Almeida Date: Sat, 10 Mar 2018 21:52:37 +0800 Subject: [PATCH 6/6] Update .gitignore --- tests/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/.gitignore b/tests/.gitignore index 620d8c7244..052d905de4 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -20,6 +20,7 @@ /link /link.out /math +/mem /setid /sleep /pipe