mem.rs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #[allow(warnings)]
  2. #[cfg(target_pointer_width = "16")]
  3. type c_int = i16;
  4. #[allow(warnings)]
  5. #[cfg(not(target_pointer_width = "16"))]
  6. type c_int = i32;
  7. #[no_mangle]
  8. pub unsafe extern "C" fn memcpy(dest: *mut u8,
  9. src: *const u8,
  10. n: usize)
  11. -> *mut u8 {
  12. let mut i = 0;
  13. while i < n {
  14. *dest.offset(i as isize) = *src.offset(i as isize);
  15. i += 1;
  16. }
  17. dest
  18. }
  19. #[no_mangle]
  20. pub unsafe extern "C" fn memmove(dest: *mut u8,
  21. src: *const u8,
  22. n: usize)
  23. -> *mut u8 {
  24. if src < dest as *const u8 {
  25. // copy from end
  26. let mut i = n;
  27. while i != 0 {
  28. i -= 1;
  29. *dest.offset(i as isize) = *src.offset(i as isize);
  30. }
  31. } else {
  32. // copy from beginning
  33. let mut i = 0;
  34. while i < n {
  35. *dest.offset(i as isize) = *src.offset(i as isize);
  36. i += 1;
  37. }
  38. }
  39. dest
  40. }
  41. #[no_mangle]
  42. pub unsafe extern "C" fn memset(s: *mut u8, c: c_int, n: usize) -> *mut u8 {
  43. let mut i = 0;
  44. while i < n {
  45. *s.offset(i as isize) = c as u8;
  46. i += 1;
  47. }
  48. s
  49. }
  50. #[no_mangle]
  51. pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
  52. let mut i = 0;
  53. while i < n {
  54. let a = *s1.offset(i as isize);
  55. let b = *s2.offset(i as isize);
  56. if a != b {
  57. return a as i32 - b as i32;
  58. }
  59. i += 1;
  60. }
  61. 0
  62. }