diff --git a/SDK/CRT/INC/string.h b/SDK/CRT/INC/string.h index ba4d158..86a3b80 100644 --- a/SDK/CRT/INC/string.h +++ b/SDK/CRT/INC/string.h @@ -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 } diff --git a/SDK/CRT/INC/wchar.h b/SDK/CRT/INC/wchar.h index 39ca953..7bf073a 100644 --- a/SDK/CRT/INC/wchar.h +++ b/SDK/CRT/INC/wchar.h @@ -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 } diff --git a/SDK/CRT/STRING/mem.c b/SDK/CRT/STRING/mem.c index 31cf63b..544029d 100644 --- a/SDK/CRT/STRING/mem.c +++ b/SDK/CRT/STRING/mem.c @@ -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; +} diff --git a/SDK/CRT/STRING/wmem.c b/SDK/CRT/STRING/wmem.c index 1cb7d3c..0cecd08 100644 --- a/SDK/CRT/STRING/wmem.c +++ b/SDK/CRT/STRING/wmem.c @@ -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; +}