diff options
Diffstat (limited to 'kernel/src/klibc/c/stdlib.h')
| -rw-r--r-- | kernel/src/klibc/c/stdlib.h | 32 |
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 |
