summaryrefslogtreecommitdiff
path: root/kernel/src/klibc/c/stdlib.h
blob: d97c7f4350d2833fcfaa2a4ec5d9bd0b082f203d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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; \
    })