[SDK:CRT] Implement memcpy() and wmemcpy()

This commit is contained in:
Quinn Stephens 2024-08-08 08:24:20 -04:00
parent 8ff7a75afc
commit e48262d4d7
4 changed files with 68 additions and 2 deletions

View File

@ -29,6 +29,7 @@ size_t strnlen(const char *str, size_t maxlen);
void *memset(void *dest, int c, size_t count);
void *memcpy(void *dest, const void *src, size_t count);
void *memmove(void *dest, const void *src, size_t count);
#ifdef __cplusplus
}

View File

@ -29,6 +29,7 @@ size_t wcsnlen(const wchar_t *str, size_t maxlen);
wchar_t *wmemset(wchar_t *dest, wchar_t c, size_t count);
wchar_t *wmemcpy(wchar_t *dest, const wchar_t *src, size_t count);
wchar_t *wmemmove(wchar_t *dest, const wchar_t *src, size_t count);
#ifdef __cplusplus
}

View File

@ -51,3 +51,35 @@ memcpy (
return ptr;
}
void *
memmove (
void *dest,
const void *src,
size_t count
)
{
void *ptr = dest;
/* Check for overlap */
if (src > dest || ((char *)src + count) < (char *)dest) {
/* Low-to-high copy, like memcpy() */
while (count--) {
*(char *)dest = *(char *)src;
dest = (char *)dest + 1;
src = (char *)src + 1;
}
} else {
/* High-to-low copy */
dest = (char *)dest + count - 1;
src = (char *)src + count - 1;
while (count--) {
*(char *)dest = *(char *)src;
dest = (char *)dest - 1;
src = (char *)src - 1;
}
}
return ptr;
}

View File

@ -23,7 +23,7 @@ wmemset (
)
{
void *ptr = dest;
wchar_t *ptr = dest;
while (count--) {
*(wchar_t *)dest = c;
@ -41,7 +41,7 @@ wmemcpy (
)
{
void *ptr = dest;
wchar_t *ptr = dest;
while (count--) {
*(wchar_t *)dest = *(wchar_t *)src;
@ -51,3 +51,35 @@ wmemcpy (
return ptr;
}
wchar_t *
wmemmove (
wchar_t *dest,
const wchar_t *src,
size_t count
)
{
wchar_t *ptr = dest;
/* Check for overlap */
if (src > dest || ((wchar_t *)src + count) < (wchar_t *)dest) {
/* Low-to-high copy, like memcpy() */
while (count--) {
*(wchar_t *)dest = *(wchar_t *)src;
dest = (wchar_t *)dest + 1;
src = (wchar_t *)src + 1;
}
} else {
/* High-to-low copy */
dest = (wchar_t *)dest + count - 1;
src = (wchar_t *)src + count - 1;
while (count--) {
*(wchar_t *)dest = *(wchar_t *)src;
dest = (wchar_t *)dest - 1;
src = (wchar_t *)src - 1;
}
}
return ptr;
}