alcyone/SDK/CRT/STRING/wmem.c

86 lines
1.4 KiB
C

/*++
Copyright (c) 2024, Quinn Stephens.
Provided under the BSD 3-Clause license.
Module Name:
wmem.c
Abstract:
Provides wide memory manipulation routines.
--*/
#include <wchar.h>
wchar_t *
wmemset (
wchar_t *dest,
wchar_t c,
size_t count
)
{
wchar_t *ptr = dest;
while (count--) {
*(wchar_t *)dest = c;
dest = (wchar_t *)dest + 1;
}
return ptr;
}
wchar_t *
wmemcpy (
wchar_t *dest,
const wchar_t *src,
size_t count
)
{
wchar_t *ptr = dest;
while (count--) {
*(wchar_t *)dest = *(wchar_t *)src;
dest = (wchar_t *)dest + 1;
src = (wchar_t *)src + 1;
}
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;
}