67 lines
1.5 KiB
Rust
67 lines
1.5 KiB
Rust
#[allow(warnings)]
|
|
#[cfg(target_pointer_width = "16")]
|
|
type c_int = i16;
|
|
#[allow(warnings)]
|
|
#[cfg(not(target_pointer_width = "16"))]
|
|
type c_int = i32;
|
|
|
|
#[no_mangle]
|
|
pub unsafe extern "C" fn memcpy(dest: *mut u8,
|
|
src: *const u8,
|
|
n: usize)
|
|
-> *mut u8 {
|
|
let mut i = 0;
|
|
while i < n {
|
|
*dest.offset(i as isize) = *src.offset(i as isize);
|
|
i += 1;
|
|
}
|
|
dest
|
|
}
|
|
|
|
#[no_mangle]
|
|
pub unsafe extern "C" fn memmove(dest: *mut u8,
|
|
src: *const u8,
|
|
n: usize)
|
|
-> *mut u8 {
|
|
if src < dest as *const u8 {
|
|
// copy from end
|
|
let mut i = n;
|
|
while i != 0 {
|
|
i -= 1;
|
|
*dest.offset(i as isize) = *src.offset(i as isize);
|
|
}
|
|
} else {
|
|
// copy from beginning
|
|
let mut i = 0;
|
|
while i < n {
|
|
*dest.offset(i as isize) = *src.offset(i as isize);
|
|
i += 1;
|
|
}
|
|
}
|
|
dest
|
|
}
|
|
|
|
#[no_mangle]
|
|
pub unsafe extern "C" fn memset(s: *mut u8, c: c_int, n: usize) -> *mut u8 {
|
|
let mut i = 0;
|
|
while i < n {
|
|
*s.offset(i as isize) = c as u8;
|
|
i += 1;
|
|
}
|
|
s
|
|
}
|
|
|
|
#[no_mangle]
|
|
pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
|
|
let mut i = 0;
|
|
while i < n {
|
|
let a = *s1.offset(i as isize);
|
|
let b = *s2.offset(i as isize);
|
|
if a != b {
|
|
return a as i32 - b as i32;
|
|
}
|
|
i += 1;
|
|
}
|
|
0
|
|
}
|