https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c36ea58f32deabb044b33…
commit c36ea58f32deabb044b333253b60c2ab0149835c
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Tue Jan 10 11:21:03 2023 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Tue Jan 24 18:53:13 2023 +0100
[CRT] Add a number of functions from wine
This adds _aligned_msize, _recalloc, wmemmove_s, memcpy_s, wmemcpy_s
---
sdk/lib/crt/wine/heap.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 119 insertions(+)
diff --git a/sdk/lib/crt/wine/heap.c b/sdk/lib/crt/wine/heap.c
index 39e2e0c44b9..ad809de181c 100644
--- a/sdk/lib/crt/wine/heap.c
+++ b/sdk/lib/crt/wine/heap.c
@@ -26,6 +26,7 @@
#define MSVCRT_size_t size_t
#define MSVCRT_intptr_t intptr_t
+#define MSVCRT_wchar_t wchar_t
#define MSVCRT__HEAPBADNODE _HEAPBADNODE
#define MSVCRT__HEAPOK _HEAPOK
#define MSVCRT__HEAPEND _HEAPEND
@@ -35,6 +36,7 @@
#define MSVCRT_EINVAL EINVAL
#define MSVCRT_ENOSYS ENOSYS
#define MSVCRT_ENOMEM ENOMEM
+#define MSVCRT_ERANGE ERANGE
#define MSVCRT__TRUNCATE _TRUNCATE
#define MSVCRT__heapinfo _heapinfo
#define MSVCRT__errno _errno
@@ -42,6 +44,7 @@
#define MSVCRT_malloc malloc
#define MSVCRT_realloc realloc
#define MSVCRT_free free
+#define MSVCRT_memcpy_s memcpy_s
#define MSVCRT_memmove_s memmove_s
#define MSVCRT_strncpy_s strncpy_s
#define msvcrt_set_errno _dosmaperr
@@ -394,6 +397,22 @@ MSVCRT_size_t CDECL _msize(void* mem)
return size;
}
+/*********************************************************************
+ * _aligned_msize (MSVCR100.@)
+ */
+size_t CDECL _aligned_msize(void *p, MSVCRT_size_t alignment, MSVCRT_size_t offset)
+{
+ void **alloc_ptr;
+
+ if(!MSVCRT_CHECK_PMT(p)) return -1;
+
+ if(alignment < sizeof(void*))
+ alignment = sizeof(void*);
+
+ alloc_ptr = SAVED_PTR(p);
+ return _msize(*alloc_ptr)-alignment-sizeof(void*);
+}
+
/*********************************************************************
* calloc (MSVCRT.@)
*/
@@ -432,6 +451,31 @@ void* CDECL MSVCRT_realloc(void* ptr, MSVCRT_size_t size)
return NULL;
}
+/*********************************************************************
+ * _recalloc (MSVCR100.@)
+ */
+void* CDECL _recalloc(void *mem, MSVCRT_size_t num, MSVCRT_size_t size)
+{
+ MSVCRT_size_t old_size;
+ void *ret;
+
+ if(!mem)
+ return MSVCRT_calloc(num, size);
+
+ size = num*size;
+ old_size = _msize(mem);
+
+ ret = MSVCRT_realloc(mem, size);
+ if(!ret) {
+ *MSVCRT__errno() = MSVCRT_ENOMEM;
+ return NULL;
+ }
+
+ if(size>old_size)
+ memset((BYTE*)ret+old_size, 0, size-old_size);
+ return ret;
+}
+
/*********************************************************************
* __p__amblksiz (MSVCRT.@)
*/
@@ -690,6 +734,81 @@ int CDECL MSVCRT_memmove_s(void *dest, MSVCRT_size_t
numberOfElements, const voi
return 0;
}
+/*********************************************************************
+ * wmemmove_s (MSVCR100.@)
+ */
+int CDECL wmemmove_s(MSVCRT_wchar_t *dest, MSVCRT_size_t numberOfElements,
+ const MSVCRT_wchar_t *src, MSVCRT_size_t count)
+{
+ TRACE("(%p %lu %p %lu)\n", dest, numberOfElements, src, count);
+
+ if (!count)
+ return 0;
+
+ /* Native does not seem to conform to 6.7.1.2.3 in
+ *
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1225.pdf
+ * in that it does not zero the output buffer on constraint violation.
+ */
+ if (!MSVCRT_CHECK_PMT(dest != NULL)) return MSVCRT_EINVAL;
+ if (!MSVCRT_CHECK_PMT(src != NULL)) return MSVCRT_EINVAL;
+ if (!MSVCRT_CHECK_PMT_ERR(count <= numberOfElements, MSVCRT_ERANGE)) return
MSVCRT_ERANGE;
+
+ memmove(dest, src, sizeof(MSVCRT_wchar_t)*count);
+ return 0;
+}
+
+/*********************************************************************
+ * memcpy_s (MSVCRT.@)
+ */
+int CDECL MSVCRT_memcpy_s(void *dest, MSVCRT_size_t numberOfElements, const void *src,
MSVCRT_size_t count)
+{
+ TRACE("(%p %lu %p %lu)\n", dest, numberOfElements, src, count);
+
+ if(!count)
+ return 0;
+
+ if (!MSVCRT_CHECK_PMT(dest != NULL)) return MSVCRT_EINVAL;
+ if (!MSVCRT_CHECK_PMT(src != NULL))
+ {
+ memset(dest, 0, numberOfElements);
+ return MSVCRT_EINVAL;
+ }
+ if (!MSVCRT_CHECK_PMT_ERR( count <= numberOfElements, MSVCRT_ERANGE ))
+ {
+ memset(dest, 0, numberOfElements);
+ return MSVCRT_ERANGE;
+ }
+
+ memcpy(dest, src, count);
+ return 0;
+}
+
+/*********************************************************************
+ * wmemcpy_s (MSVCR100.@)
+ */
+int CDECL wmemcpy_s(MSVCRT_wchar_t *dest, MSVCRT_size_t numberOfElements,
+ const MSVCRT_wchar_t *src, MSVCRT_size_t count)
+{
+ TRACE("(%p %lu %p %lu)\n", dest, numberOfElements, src, count);
+
+ if (!count)
+ return 0;
+
+ if (!MSVCRT_CHECK_PMT(dest != NULL)) return MSVCRT_EINVAL;
+
+ if (!MSVCRT_CHECK_PMT(src != NULL)) {
+ memset(dest, 0, numberOfElements*sizeof(MSVCRT_wchar_t));
+ return MSVCRT_EINVAL;
+ }
+ if (!MSVCRT_CHECK_PMT_ERR(count <= numberOfElements, MSVCRT_ERANGE)) {
+ memset(dest, 0, numberOfElements*sizeof(MSVCRT_wchar_t));
+ return MSVCRT_ERANGE;
+ }
+
+ memcpy(dest, src, sizeof(MSVCRT_wchar_t)*count);
+ return 0;
+}
+
/*********************************************************************
* strncpy_s (MSVCRT.@)
*/