#ifndef _STDLIB_H
#define _STDLIB_H

#include <bits/macros.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C"
{
#endif

    /* Aborts the program. */
    noreturn void abort();

    /* Exits the program with the specified status code. */
    noreturn void exit(int status);

    /* Not implemented. */
    int atexit(void (*)(void));

    /* Not implemented.*/
    int atoi(const char*);

    /* Not implemented. */
    char* getenv(const char*);

    /* Allocates n bytes of memory and returns a pointer to it. This memory should be freed by calling free() when it is
     * not in use anymore. */
    void* malloc(size_t n);

    /* Allocates enough bytes of memory for an array containing nmemb items of size n and returns a pointer to it. This
     * memory should be freed by calling free() when it is not in use anymore. */
    void* calloc(size_t nmemb, size_t n);

    /* Resizes memory allocated by malloc() or calloc() to n bytes. Returns a pointer to the new resized region of
     * memory, which should be used instead of the old one. This memory should be freed by calling free() when it is not
     * in use anymore. */
    void* realloc(void* ptr, size_t n);

    /* Frees a pointer to memory allocated by malloc(), calloc() or realloc(). Accessing the contents of ptr afterwards
     * is undefined behavior. */
    void free(void* ptr);

#ifdef __cplusplus
}
#endif

#endif