|
@@ -1,9 +1,7 @@
|
|
|
//! 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;
|
|
@@ -21,18 +19,15 @@ pub unsafe extern "C" fn memccpy(
|
|
|
c: c_int,
|
|
|
n: usize,
|
|
|
) -> *mut c_void {
|
|
|
- use compiler_builtins::mem::memcpy;
|
|
|
- let dest = dest as *mut u8;
|
|
|
let to = memchr(src, c, n);
|
|
|
if to.is_null() {
|
|
|
return to;
|
|
|
}
|
|
|
- let src = src as *mut u8;
|
|
|
let dist = (to as usize) - (src as usize);
|
|
|
if memcpy(dest, src, dist).is_null() {
|
|
|
return ptr::null_mut();
|
|
|
}
|
|
|
- dest.offset(dist as isize + 1) as *mut c_void
|
|
|
+ (dest as *mut u8).offset(dist as isize + 1) as *mut c_void
|
|
|
}
|
|
|
|
|
|
#[no_mangle]
|
|
@@ -47,41 +42,75 @@ pub unsafe extern "C" fn memchr(s: *const c_void, c: c_int, n: usize) -> *mut c_
|
|
|
ptr::null_mut()
|
|
|
}
|
|
|
|
|
|
-// #[no_mangle]
|
|
|
-// pub extern "C" fn memcmp(
|
|
|
-// s1: *const c_void,
|
|
|
-// s2: *const c_void,
|
|
|
-// n: usize,
|
|
|
-// ) -> c_int {
|
|
|
-// unimplemented!();
|
|
|
-// }
|
|
|
-
|
|
|
-// #[no_mangle]
|
|
|
-// pub extern "C" fn memcpy(
|
|
|
-// s1: *mut c_void,
|
|
|
-// s2: *const c_void,
|
|
|
-// n: usize,
|
|
|
-// ) -> *mut c_void {
|
|
|
-// unimplemented!();
|
|
|
-// }
|
|
|
-
|
|
|
-// #[no_mangle]
|
|
|
-// pub extern "C" fn memmove(
|
|
|
-// s1: *mut c_void,
|
|
|
-// s2: *const c_void,
|
|
|
-// n: usize,
|
|
|
-// ) -> *mut c_void {
|
|
|
-// unimplemented!();
|
|
|
-// }
|
|
|
-
|
|
|
-// #[no_mangle]
|
|
|
-// pub extern "C" fn memset(
|
|
|
-// s: *mut c_void,
|
|
|
-// c: c_int,
|
|
|
-// n: usize,
|
|
|
-// ) -> *mut c_void {
|
|
|
-// unimplemented!();
|
|
|
-// }
|
|
|
+#[no_mangle]
|
|
|
+pub unsafe extern "C" fn memcmp(
|
|
|
+ s1: *const c_void,
|
|
|
+ s2: *const c_void,
|
|
|
+ n: usize,
|
|
|
+) -> c_int {
|
|
|
+ let mut i = 0;
|
|
|
+ while i < n {
|
|
|
+ let a = *(s1 as *const u8).offset(i as isize);
|
|
|
+ let b = *(s2 as *const u8).offset(i as isize);
|
|
|
+ if a != b {
|
|
|
+ return a as i32 - b as i32;
|
|
|
+ }
|
|
|
+ i += 1;
|
|
|
+ }
|
|
|
+ 0
|
|
|
+}
|
|
|
+
|
|
|
+#[no_mangle]
|
|
|
+pub unsafe extern "C" fn memcpy(
|
|
|
+ s1: *mut c_void,
|
|
|
+ s2: *const c_void,
|
|
|
+ n: usize,
|
|
|
+) -> *mut c_void {
|
|
|
+ let mut i = 0;
|
|
|
+ while i < n {
|
|
|
+ *(s1 as *mut u8).offset(i as isize) = *(s2 as *const u8).offset(i as isize);
|
|
|
+ i += 1;
|
|
|
+ }
|
|
|
+ s1
|
|
|
+}
|
|
|
+
|
|
|
+#[no_mangle]
|
|
|
+pub unsafe extern "C" fn memmove(
|
|
|
+ s1: *mut c_void,
|
|
|
+ s2: *const c_void,
|
|
|
+ n: usize,
|
|
|
+) -> *mut c_void {
|
|
|
+ if s2 < s1 as *const c_void {
|
|
|
+ // copy from end
|
|
|
+ let mut i = n;
|
|
|
+ while i != 0 {
|
|
|
+ i -= 1;
|
|
|
+ *(s1 as *mut u8).offset(i as isize) = *(s2 as *const u8).offset(i as isize);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // copy from beginning
|
|
|
+ let mut i = 0;
|
|
|
+ while i < n {
|
|
|
+ *(s1 as *mut u8).offset(i as isize) = *(s2 as *const u8).offset(i as isize);
|
|
|
+ i += 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ s1
|
|
|
+}
|
|
|
+
|
|
|
+#[no_mangle]
|
|
|
+pub unsafe extern "C" fn memset(
|
|
|
+ s: *mut c_void,
|
|
|
+ c: c_int,
|
|
|
+ n: usize,
|
|
|
+) -> *mut c_void {
|
|
|
+ let mut i = 0;
|
|
|
+ while i < n {
|
|
|
+ *(s as *mut u8).offset(i as isize) = c as u8;
|
|
|
+ i += 1;
|
|
|
+ }
|
|
|
+ s
|
|
|
+}
|
|
|
|
|
|
#[no_mangle]
|
|
|
pub unsafe extern "C" fn strcat(s1: *mut c_char, s2: *const c_char) -> *mut c_char {
|