summaryrefslogtreecommitdiff
path: root/kernel/src/klibc/c/stdlib.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/klibc/c/stdlib.h')
-rw-r--r--kernel/src/klibc/c/stdlib.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/kernel/src/klibc/c/stdlib.h b/kernel/src/klibc/c/stdlib.h
new file mode 100644
index 0000000..d97c7f4
--- /dev/null
+++ b/kernel/src/klibc/c/stdlib.h
@@ -0,0 +1,32 @@
+#pragma once
+
+#include <klibc/string.hpp>
+#include <klibc/stdlib.hpp>
+
+using namespace klibc;
+
+#define realloc(ptr, new_size) \
+ ({ \
+ void *__new_ptr = NULL; \
+ size_t __new_size = (new_size); \
+ \
+ if (__new_size == 0) { \
+ /* Если размер 0 - free и возвращаем NULL */ \
+ if (ptr) free(ptr); \
+ __new_ptr = NULL; \
+ } else { \
+ /* Выделяем новую память */ \
+ __new_ptr = malloc(__new_size); \
+ if (__new_ptr && ptr) { \
+ /* Копируем старые данные (размер неизвестен, копируем сколько влезет) */ \
+ /* Примечание: old_size неизвестен, поэтому копируем весь новый размер */ \
+ /* Это безопасно только если старый размер >= нового */ \
+ memcpy(__new_ptr, ptr, __new_size); \
+ } \
+ /* Освобождаем старый указатель */ \
+ if (ptr) { \
+ free(ptr); \
+ } \
+ } \
+ __new_ptr; \
+ }) \ No newline at end of file