PatchworkOS  c9fea19
A non-POSIX operating system.
Loading...
Searching...
No Matches
memmove_s.c
Go to the documentation of this file.
2#include <errno.h>
3#include <stdint.h>
4#include <stdlib.h>
5#include <string.h>
6
8
9errno_t memmove_s(void* s1, rsize_t s1max, const void* s2, rsize_t n)
10{
11 uint8_t* d = (uint8_t*)s1;
12 const uint8_t* s = (const uint8_t*)s2;
13
14 if (s1 == NULL || s2 == NULL || s1max > RSIZE_MAX || n > RSIZE_MAX || n > s1max)
15 {
16 if (s1 != NULL && s1max <= RSIZE_MAX)
17 {
18 memset(s1, 0, s1max);
19 }
20
22 return EINVAL;
23 }
24
25 if (d > s && d < (s + n))
26 {
27 d += n;
28 s += n;
29
30 while ((((uintptr_t)d & 7) != ((uintptr_t)s & 7)) && n)
31 {
32 *(--d) = *(--s);
33 n--;
34 }
35
36 while (n >= 64)
37 {
38 d -= 64;
39 s -= 64;
40 *(uint64_t*)(d + 56) = *(const uint64_t*)(s + 56);
41 *(uint64_t*)(d + 48) = *(const uint64_t*)(s + 48);
42 *(uint64_t*)(d + 40) = *(const uint64_t*)(s + 40);
43 *(uint64_t*)(d + 32) = *(const uint64_t*)(s + 32);
44 *(uint64_t*)(d + 24) = *(const uint64_t*)(s + 24);
45 *(uint64_t*)(d + 16) = *(const uint64_t*)(s + 16);
46 *(uint64_t*)(d + 8) = *(const uint64_t*)(s + 8);
47 *(uint64_t*)(d + 0) = *(const uint64_t*)(s + 0);
48 n -= 64;
49 }
50
51 while (n >= 8)
52 {
53 d -= 8;
54 s -= 8;
55 *(uint64_t*)d = *(const uint64_t*)s;
56 n -= 8;
57 }
58
59 while (n--)
60 {
61 *(--d) = *(--s);
62 }
63 }
64 else
65 {
66 while (((uintptr_t)d & 7) && n)
67 {
68 *d++ = *s++;
69 n--;
70 }
71
72 while (n >= 64)
73 {
74 *(uint64_t*)(d + 0) = *(const uint64_t*)(s + 0);
75 *(uint64_t*)(d + 8) = *(const uint64_t*)(s + 8);
76 *(uint64_t*)(d + 16) = *(const uint64_t*)(s + 16);
77 *(uint64_t*)(d + 24) = *(const uint64_t*)(s + 24);
78 *(uint64_t*)(d + 32) = *(const uint64_t*)(s + 32);
79 *(uint64_t*)(d + 40) = *(const uint64_t*)(s + 40);
80 *(uint64_t*)(d + 48) = *(const uint64_t*)(s + 48);
81 *(uint64_t*)(d + 56) = *(const uint64_t*)(s + 56);
82 d += 64;
83 s += 64;
84 n -= 64;
85 }
86
87 while (n >= 8)
88 {
89 *(uint64_t*)d = *(const uint64_t*)s;
90 d += 8;
91 s += 8;
92 n -= 8;
93 }
94
95 while (n--)
96 {
97 *d++ = *s++;
98 }
99 }
100
101 return 0;
102}
constraint_handler_t _constraintHandler
#define _CONSTRAINT_VIOLATION(e)
int errno_t
Definition errno_t.h:4
#define EINVAL
Invalid argument.
Definition errno.h:142
#define NULL
Pointer error value.
Definition NULL.h:23
errno_t memmove_s(void *s1, rsize_t s1max, const void *s2, rsize_t n)
Definition memmove_s.c:9
__SIZE_TYPE__ rsize_t
Definition rsize_t.h:4
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
__UINT8_TYPE__ uint8_t
Definition stdint.h:11
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:43
_PUBLIC void * memset(void *s, int c, size_t n)
Definition memset.c:4