commit 8eab55840daed10eb13f117f0cf3ef7a425510e0
parent 7a69b58f612e296d4bb562780cda8629f09ae032
Author: Yersa Nordman <finwo@pm.me>
Date: Thu, 21 May 2020 23:55:43 +0200
Added calloc and realloc functions
Diffstat:
5 files changed, 49 insertions(+), 6 deletions(-)
diff --git a/arch/wasm32/malloc/malloc.c b/arch/wasm32/malloc/malloc.c
@@ -3,6 +3,7 @@
#include <malloc.h>
#include <stddef.h>
+#include <string.h>
extern unsigned char __heap_base;
@@ -16,7 +17,7 @@ unsigned int hsize = (2 * sizeof(unsigned int));
// TODO: realloc
// TODO: free
-void * malloc(int n) {
+void * malloc(size_t n) {
unsigned char *r = heap_start;
unsigned int *size = NULL;
@@ -63,4 +64,42 @@ void free(void *p) {
*used = 0;
}
+void *calloc(size_t num, size_t nsize)
+{
+ size_t size;
+ void *block;
+ if (!num || !nsize)
+ return NULL;
+ size = num * nsize;
+ /* check mul overflow */
+ if (nsize != size / num)
+ return NULL;
+ block = malloc(size);
+ if (!block)
+ return NULL;
+ memset(block, 0, size);
+ return block;
+}
+
+void *realloc(void *block, size_t size)
+{
+ void *ret;
+ size_t original_size = (size_t)(((char*)block) - hsize);
+
+ if (!block || !size)
+ return malloc(size);
+
+ if (size <= (size_t)(((char*)block) - hsize)) {
+ return block;
+ }
+
+ ret = malloc(size);
+ if (ret) {
+ memcpy(ret, block, original_size);
+ free(block);
+ }
+
+ return ret;
+}
+
#endif // _MALLOC_C_
diff --git a/include/malloc.h b/include/malloc.h
@@ -1,7 +1,9 @@
#ifndef _MALLOC_H_
#define _MALLOC_H_
-void * malloc(int n);
+#include <stddef.h>
+
+void * malloc(size_t n);
void free(void *p);
#endif // _MALLOC_H_
diff --git a/include/string.h b/include/string.h
@@ -1,8 +1,10 @@
#ifndef _STRING_H_
#define _STRING_H_
+#include <stddef.h>
+
int memcmp (const void *str1, const void *str2, int count);
-void * memcpy (void *dest, const void *src, int len);
-void * memset (void *dest, int val, int len);
+void * memcpy (void *dest, const void *src, size_t len);
+void * memset (void *dest, int val, size_t len);
#endif // _STRING_H_
diff --git a/src/string/memcpy.c b/src/string/memcpy.c
@@ -3,7 +3,7 @@
#include <string.h>
-void * memcpy (void *dest, const void *src, int len) {
+void * memcpy (void *dest, const void *src, size_t len) {
char *d = dest;
const char *s = src;
while (len--) {
diff --git a/src/string/memset.c b/src/string/memset.c
@@ -3,7 +3,7 @@
#include <string.h>
-void * memset (void *dest, int val, int len) {
+void * memset (void *dest, int val, size_t len) {
unsigned char *ptr = dest;
while (len-- > 0)
*ptr++ = val;