#pragma once

#ifdef __cplusplus
extern "C" {
#endif

#include <features.h>
#include <bits/null.h>

#define __NEED_size_t

#include <bits/alltypes.h>

void* memcpy(void* __restrict, const void* __restrict, size_t);
void* memmove(void*, const void*, size_t);
void* memset(void*, int, size_t);
int memcmp(const void*, const void*, size_t);
void* memchr(const void*, int, size_t);

char* strcpy(char* __restrict, const char* __restrict);
char* strncpy(char* __restrict, const char* __restrict, size_t);

char* strcat(char* __restrict, const char* __restrict);
char* strncat(char* __restrict, const char* __restrict, size_t);

int strcmp(const char*, const char*);
int strncmp(const char*, const char*, size_t);

int strcoll(const char*, const char*);
size_t strxfrm(char* __restrict, const char* __restrict, size_t);

char* strchr(const char*, int);
char* strrchr(const char*, int);

size_t strcspn(const char*, const char*);
size_t strspn(const char*, const char*);
char* strpbrk(const char*, const char*);
char* strstr(const char*, const char*);
char* strtok(char* __restrict, const char* __restrict);

size_t strlen(const char*);

char* strerror(int);

#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
#include <strings.h>
#endif

#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \
    defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
char* strtok_r(char* __restrict, const char* __restrict, char** __restrict);
int strerror_r(int, char*, size_t);
char* stpcpy(char* __restrict, const char* __restrict);
char* stpncpy(char* __restrict, const char* __restrict, size_t);
size_t strnlen(const char*, size_t);
char* strdup(const char*);
char* strndup(const char*, size_t);
char* strsignal(int);
#endif

#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
void* memccpy(void* __restrict, const void* __restrict, int, size_t);
#endif

#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
char* strsep(char**, const char*);
size_t strlcat(char*, const char*, size_t);
size_t strlcpy(char*, const char*, size_t);
#endif

#ifdef _GNU_SOURCE
#define strdupa(x) strcpy(alloca(strlen(x) + 1), x)
int strverscmp(const char*, const char*);
char* strchrnul(const char*, int);
char* strcasestr(const char*, const char*);
void* memmem(const void*, size_t, const void*, size_t);
void* memrchr(const void*, int, size_t);
void* mempcpy(void*, const void*, size_t);
#ifndef __cplusplus
char* basename(char*);
#endif
#endif

#ifdef __cplusplus
}
#endif