Added memchr and memccpy to string

This commit is contained in:
Tom Almeida
2018-03-10 16:59:53 +08:00
parent 3890ec58f0
commit 4f601f4896
4 changed files with 59 additions and 5 deletions
+2 -1
View File
@@ -10,4 +10,5 @@ cbindgen = { path = "../../cbindgen" }
[dependencies]
platform = { path = "../platform" }
stdlib = { path = "../stdlib" }
errno = { path = "../errno" }
errno = { path = "../errno" }
compiler_builtins = { git = "https://github.com/rust-lang-nursery/compiler-builtins.git", default-features = false, features = ["mem"] }
+34 -4
View File
@@ -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::<u8>();
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]