https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c36ea58f32deabb044b333253b60c2ab0149835c

commit c36ea58f32deabb044b333253b60c2ab0149835c
Author:     Timo Kreuzer <[email protected]>
AuthorDate: Tue Jan 10 11:21:03 2023 +0200
Commit:     Timo Kreuzer <[email protected]>
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.@)
  */

Reply via email to