#ifndef SYSROOT_STDLIB_H_
#define SYSROOT_STDLIB_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <features.h>

#include <bits/null.h>

#define __NEED_size_t
#define __NEED_wchar_t

#include <bits/alltypes.h>

int atoi(const char*);
long atol(const char*);
long long atoll(const char*);
double atof(const char*);

float strtof(const char* __restrict, char** __restrict);
double strtod(const char* __restrict, char** __restrict);
long double strtold(const char* __restrict, char** __restrict);

long strtol(const char* __restrict, char** __restrict, int);
unsigned long strtoul(const char* __restrict, char** __restrict, int);
long long strtoll(const char* __restrict, char** __restrict, int);
unsigned long long strtoull(const char* __restrict, char** __restrict, int);

int rand(void);
void srand(unsigned);

void* malloc(size_t) __nothrow_fn;
void* calloc(size_t, size_t) __nothrow_fn;
void* realloc(void*, size_t) __nothrow_fn;
void free(void*) __nothrow_fn;
void* aligned_alloc(size_t alignment, size_t size) __nothrow_fn;

_Noreturn void abort(void);
int atexit(void (*)(void));
_Noreturn void exit(int);
_Noreturn void _Exit(int);
int at_quick_exit(void (*)(void));
_Noreturn void quick_exit(int);

char* getenv(const char*);

int system(const char*);

void* bsearch(const void*, const void*, size_t, size_t, int (*)(const void*, const void*));
void qsort(void*, size_t, size_t, int (*)(const void*, const void*));

int abs(int);
long labs(long);
long long llabs(long long);

typedef struct {
  int quot, rem;
} div_t;
typedef struct {
  long quot, rem;
} ldiv_t;
typedef struct {
  long long quot, rem;
} lldiv_t;

div_t div(int, int);
ldiv_t ldiv(long, long);
lldiv_t lldiv(long long, long long);

int mblen(const char*, size_t);
int mbtowc(wchar_t* __restrict, const char* __restrict, size_t);
int wctomb(char*, wchar_t);
size_t mbstowcs(wchar_t* __restrict, const char* __restrict, size_t);
size_t wcstombs(char* __restrict, const wchar_t* __restrict, size_t);

#define EXIT_FAILURE 1
#define EXIT_SUCCESS 0

size_t __ctype_get_mb_cur_max(void);
#define MB_CUR_MAX (__ctype_get_mb_cur_max())

#define RAND_MAX (0x7fffffff)

#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \
    defined(_GNU_SOURCE) || defined(_BSD_SOURCE)

#define WNOHANG 1
#define WUNTRACED 2

#define WEXITSTATUS(s) (((s)&0xff00) >> 8)
#define WTERMSIG(s) ((s)&0x7f)
#define WSTOPSIG(s) WEXITSTATUS(s)
#define WIFEXITED(s) (!WTERMSIG(s))
#define WIFSTOPPED(s) ((short)((((s)&0xffff) * 0x10001) >> 8) > 0x7f00)
#define WIFSIGNALED(s) (((s)&0xffff) - 1U < 0xffu)

int posix_memalign(void**, size_t, size_t) __nothrow_fn;
int setenv(const char*, const char*, int);
int unsetenv(const char*);
int mkstemp(char*);
int mkostemp(char*, int);
char* mkdtemp(char*);
int getsubopt(char**, char* const*, char**);
int rand_r(unsigned*);

#endif

#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
char* realpath(const char* __restrict, char* __restrict);
long int random(void);
void srandom(unsigned int);
char* initstate(unsigned int, char*, size_t);
char* setstate(char*);
int putenv(char*);
int posix_openpt(int);
int grantpt(int);
int unlockpt(int);
char* ptsname(int);
long a64l(const char*);
void setkey(const char*);
double drand48(void);
double erand48(unsigned short[3]);
long int lrand48(void);
long int nrand48(unsigned short[3]);
long mrand48(void);
long jrand48(unsigned short[3]);
void srand48(long);
unsigned short* seed48(unsigned short[3]);
void lcong48(unsigned short[7]);
#endif

#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
#include <alloca.h>
char* mktemp(char*);
int mkstemps(char*, int);
int mkostemps(char*, int, int);
void* valloc(size_t) __nothrow_fn;
void* memalign(size_t, size_t) __nothrow_fn;
int clearenv(void);
#define WCOREDUMP(s) ((s)&0x80)
#define WIFCONTINUED(s) ((s) == 0xffff)
#endif

#ifdef _GNU_SOURCE
int ptsname_r(int, char*, size_t);
char* ecvt(double, int, int*, int*);
char* fcvt(double, int, int*, int*);
char* gcvt(double, int, char*);
#endif

#ifdef __cplusplus
}
#endif

#endif  // SYSROOT_STDLIB_H_
