1// Trying to satisfy clippy here is hopeless
2#![allow(clippy::style)]
3
4#[allow(warnings)]
5#[cfg(target_pointer_width = "16")]
6type c_int = i16;
7#[allow(warnings)]
8#[cfg(not(target_pointer_width = "16"))]
9type c_int = i32;
10
11// memcpy/memmove/memset have optimized implementations on some architectures
12#[cfg_attr(
13 all(not(feature = "no-asm"), target_arch = "x86_64"),
14 path = "x86_64.rs"
15)]
16mod impls;
17
18intrinsics! {
19 #[mem_builtin]
20 pub unsafe extern "C" fn memcpy(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
21 impls::copy_forward(dest, src, n);
22 dest
23 }
24
25 #[mem_builtin]
26 pub unsafe extern "C" fn memmove(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
27 let delta = (dest as usize).wrapping_sub(src as usize);
28 if delta >= n {
29 // We can copy forwards because either dest is far enough ahead of src,
30 // or src is ahead of dest (and delta overflowed).
31 impls::copy_forward(dest, src, n);
32 } else {
33 impls::copy_backward(dest, src, n);
34 }
35 dest
36 }
37
38 #[mem_builtin]
39 pub unsafe extern "C" fn memset(s: *mut u8, c: crate::mem::c_int, n: usize) -> *mut u8 {
40 impls::set_bytes(s, c as u8, n);
41 s
42 }
43
44 #[mem_builtin]
45 pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
46 impls::compare_bytes(s1, s2, n)
47 }
48
49 #[mem_builtin]
50 pub unsafe extern "C" fn bcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
51 memcmp(s1, s2, n)
52 }
53
54 #[mem_builtin]
55 pub unsafe extern "C" fn strlen(s: *const core::ffi::c_char) -> usize {
56 impls::c_string_length(s)
57 }
58}
59