matter.c

Cross-platform minimalist libc
git clone git://git.finwo.net/lib/matter.c
Log | Files | Refs | README | LICENSE

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:
March/wasm32/malloc/malloc.c | 41++++++++++++++++++++++++++++++++++++++++-
Minclude/malloc.h | 4+++-
Minclude/string.h | 6++++--
Msrc/string/memcpy.c | 2+-
Msrc/string/memset.c | 2+-
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;