| # C11 Compatibility Summary |
| |
| Fuchsia's libc supports the functions listed in Appendix B of |
| the [C11][c11] standard as documented below. |
| |
| ## B.1 Diagnostics <assert.h> |
| |
| | Function | Supported | |
| |----------|-----------| |
| | `void assert(scalar expression);` | Yes | |
| |
| ## B.2 Complex <complex.h> |
| |
| | Function | Supported | |
| |----------|-----------| |
| |`double complex cacos(double complex z);`| Yes | |
| |`float complex cacosf(float complex z);`| Yes | |
| |`long double complex cacosl(long double complex z);`| Yes | |
| |`double complex casin(double complex z);`| Yes | |
| |`float complex casinf(float complex z);`| Yes | |
| |`long double complex casinl(long double complex z);`| Yes | |
| |`double complex catan(double complex z);`| Yes | |
| |`float complex catanf(float complex z);`| Yes | |
| |`long double complex catanl(long double complex z);`| Yes | |
| |`double complex ccos(double complex z);`| Yes | |
| |`float complex ccosf(float complex z);`| Yes | |
| |`long double complex ccosl(long double complex z);`| Yes | |
| |`double complex csin(double complex z);`| Yes | |
| |`float complex csinf(float complex z);`| Yes | |
| |`long double complex csinl(long double complex z);`| Yes | |
| |`double complex ctan(double complex z);`| Yes | |
| |`float complex ctanf(float complex z);`| Yes | |
| |`long double complex ctanl(long double complex z);`| Yes | |
| |`double complex cacosh(double complex z);`| Yes | |
| |`float complex cacoshf(float complex z);`| Yes | |
| |`long double complex cacoshl(long double complex z);`| Yes | |
| |`double complex casinh(double complex z);`| Yes | |
| |`float complex casinhf(float complex z);`| Yes | |
| |`long double complex casinhl(long double complex z);`| Yes | |
| |`double complex catanh(double complex z);`| Yes | |
| |`float complex catanhf(float complex z);`| Yes | |
| |`long double complex catanhl(long double complex z);`| Yes | |
| |`double complex ccosh(double complex z);`| Yes | |
| |`float complex ccoshf(float complex z);`| Yes | |
| |`long double complex ccoshl(long double complex z);`| Yes | |
| |`double complex csinh(double complex z);`| Yes | |
| |`float complex csinhf(float complex z);`| Yes | |
| |`long double complex csinhl(long double complex z);`| Yes | |
| |`double complex ctanh(double complex z);`| Yes | |
| |`float complex ctanhf(float complex z);`| Yes | |
| |`long double complex ctanhl(long double complex z);`| Yes | |
| |`double complex cexp(double complex z);`| Yes | |
| |`float complex cexpf(float complex z);`| Yes | |
| |`long double complex cexpl(long double complex z);`| Yes | |
| |`double complex clog(double complex z);`| Yes | |
| |`float complex clogf(float complex z);`| Yes | |
| |`long double complex clogl(long double complex z);`| Yes | |
| |`double cabs(double complex z);`| Yes | |
| |`float cabsf(float complex z);`| Yes | |
| |`long double cabsl(long double complex z);`| Yes | |
| |`double complex cpow(double complex x, double complex y);`| Yes | |
| |`float complex cpowf(float complex x, float complex y);`| Yes | |
| |`long double complex cpowl(long double complex x, long double complex y);`| Yes | |
| |`double complex csqrt(double complex z);`| Yes | |
| |`float complex csqrtf(float complex z);`| Yes | |
| |`long double complex csqrtl(long double complex z);`| Yes | |
| |`double carg(double complex z);`| Yes | |
| |`float cargf(float complex z);`| Yes | |
| |`long double cargl(long double complex z);`| Yes | |
| |`double cimag(double complex z);`| Yes | |
| |`float cimagf(float complex z);`| Yes | |
| |`long double cimagl(long double complex z);`| Yes | |
| |`double complex CMPLX(double x, double y);`| No | |
| |`float complex CMPLXF(float x, float y);`| No | |
| |`long double complex CMPLXL(long double x, long double y);`| No | |
| |`double complex conj(double complex z);`| Yes | |
| |`float complex conjf(float complex z);`| Yes | |
| |`long double complex conjl(long double complex z);`| Yes | |
| |`double complex cproj(double complex z);`| Yes | |
| |`float complex cprojf(float complex z);`| Yes | |
| |`long double complex cprojl(long double complex z);`| Yes | |
| |`double creal(double complex z);`| Yes | |
| |`float crealf(float complex z);`| Yes | |
| |`long double creall(long double complex z);`| Yes | |
| |
| ## B.3 Character handling <ctype.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`int isalnum(int c);`| Yes | |
| |`int isalpha(int c);`| Yes | |
| |`int isblank(int c);`| Yes | |
| |`int iscntrl(int c);`| Yes | |
| |`int isdigit(int c);`| Yes | |
| |`int isgraph(int c);`| Yes | |
| |`int islower(int c);`| Yes | |
| |`int isprint(int c);`| Yes | |
| |`int ispunct(int c);`| Yes | |
| |`int isspace(int c);`| Yes | |
| |`int isupper(int c);`| Yes | |
| |`int isxdigit(int c);`| Yes | |
| |`int tolower(int c);`| Yes | |
| |`int toupper(int c);`| Yes | |
| |
| ## B.4 Errors <errno.h> |
| | Function | Supported | |
| |----------|-----------| |
| |
| ## B.5 Floating-point environment <fenv.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`int feclearexcept(int excepts);`| No | |
| |`int fegetexceptflag(fexcept_t *flagp, int excepts);`| No | |
| |`int feraiseexcept(int excepts);`| No | |
| |`int fesetexceptflag(const fexcept_t *flagp, int excepts);`| No | |
| |`int fetestexcept(int excepts);`| No | |
| |`int fegetround(void);`| Yes | |
| |`int fesetround(int round);`| Yes | |
| |`int fegetenv(fenv_t *envp);`| No | |
| |`int feholdexcept(fenv_t *envp);`| No | |
| |`int fesetenv(const fenv_t *envp);`| No | |
| |`int feupdateenv(const fenv_t *envp);`| No | |
| |
| ## B.6 Characteristics of floating types <float.h> |
| | Function | Supported | |
| |----------|-----------| |
| |
| ## B.7 Format conversion of integer types <inttypes.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`intmax_t imaxabs(intmax_t j);`| Yes | |
| |`imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);`| No | |
| |`intmax_t strtoimax(const char * restrict nptr, char ** restrict endptr, int base);`| Yes | |
| |`uintmax_t strtoumax(const char * restrict nptr, char ** restrict endptr, int base);`| Yes | |
| |`intmax_t wcstoimax(const wchar_t * restrict nptr, wchar_t ** restrict endptr, int base);`| No | |
| |`uintmax_t wcstoumax(const wchar_t * restrict nptr, wchar_t ** restrict endptr, int base);`| No | |
| |
| ## B.8 Alternative spellings <iso646.h> |
| | Function | Supported | |
| |----------|-----------| |
| |
| ## B.9 Sizes of integer types <limits.h> |
| | Function | Supported | |
| |----------|-----------| |
| |
| ## B.10 Localization <locale.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`char *setlocale(int category, const char *locale);`| Yes | |
| |`struct lconv *localeconv(void);`| Yes | |
| |
| ## B.11 Mathematics <math.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`int fpclassify(real-floating x);`| Yes | |
| |`int isfinite(real-floating x);`| Yes | |
| |`int isinf(real-floating x);`| Yes | |
| |`int isnan(real-floating x);`| Yes | |
| |`int isnormal(real-floating x);`| Yes | |
| |`int signbit(real-floating x);`| Yes | |
| |`double acos(double x);`| Yes | |
| |`float acosf(float x);`| Yes | |
| |`long double acosl(long double x);`| Yes | |
| |`double asin(double x);`| Yes | |
| |`float asinf(float x);`| Yes | |
| |`long double asinl(long double x);`| Yes | |
| |`double atan(double x);`| Yes | |
| |`float atanf(float x);`| Yes | |
| |`long double atanl(long double x);`| Yes | |
| |`double atan2(double y, double x);`| Yes | |
| |`float atan2f(float y, float x);`| Yes | |
| |`long double atan2l(long double y, long double x);`| Yes | |
| |`double cos(double x);`| Yes | |
| |`float cosf(float x);`| Yes | |
| |`long double cosl(long double x);`| Yes | |
| |`double sin(double x);`| Yes | |
| |`float sinf(float x);`| Yes | |
| |`long double sinl(long double x);`| Yes | |
| |`double tan(double x);`| Yes | |
| |`float tanf(float x);`| Yes | |
| |`long double tanl(long double x);`| Yes | |
| |`double acosh(double x);`| Yes | |
| |`float acoshf(float x);`| Yes | |
| |`long double acoshl(long double x);`| Yes | |
| |`double asinh(double x);`| Yes | |
| |`float asinhf(float x);`| Yes | |
| |`long double asinhl(long double x);`| Yes | |
| |`double atanh(double x);`| Yes | |
| |`float atanhf(float x);`| Yes | |
| |`long double atanhl(long double x);`| Yes | |
| |`double cosh(double x);`| Yes | |
| |`float coshf(float x);`| Yes | |
| |`long double coshl(long double x);`| Yes | |
| |`double sinh(double x);`| Yes | |
| |`float sinhf(float x);`| Yes | |
| |`long double sinhl(long double x);`| Yes | |
| |`double tanh(double x);`| Yes | |
| |`float tanhf(float x);`| Yes | |
| |`long double tanhl(long double x);`| Yes | |
| |`double exp(double x);`| Yes | |
| |`float expf(float x);`| Yes | |
| |`long double expl(long double x);`| Yes | |
| |`double exp2(double x);`| Yes | |
| |`float exp2f(float x);`| Yes | |
| |`long double exp2l(long double x);`| Yes | |
| |`double expm1(double x);`| Yes | |
| |`float expm1f(float x);`| Yes | |
| |`long double expm1l(long double x);`| Yes | |
| |`double frexp(double value, int *exp);`| Yes | |
| |`float frexpf(float value, int *exp);`| Yes | |
| |`long double frexpl(long double value, int *exp);`| Yes | |
| |`int ilogb(double x);`| Yes | |
| |`int ilogbf(float x);`| Yes | |
| |`int ilogbl(long double x);`| Yes | |
| |`double ldexp(double x, int exp);`| Yes | |
| |`float ldexpf(float x, int exp);`| Yes | |
| |`long double ldexpl(long double x, int exp);`| Yes | |
| |`double log(double x);`| Yes | |
| |`float logf(float x);`| Yes | |
| |`long double logl(long double x);`| Yes | |
| |`double log10(double x);`| Yes | |
| |`float log10f(float x);`| Yes | |
| |`long double log10l(long double x);`| Yes | |
| |`double log1p(double x);`| Yes | |
| |`float log1pf(float x);`| Yes | |
| |`long double log1pl(long double x);`| Yes | |
| |`double log2(double x);`| Yes | |
| |`float log2f(float x);`| Yes | |
| |`long double log2l(long double x);`| Yes | |
| |`double logb(double x);`| Yes | |
| |`float logbf(float x);`| Yes | |
| |`long double logbl(long double x);`| Yes | |
| |`double modf(double value, double *iptr);`| Yes | |
| |`float modff(float value, float *iptr);`| Yes | |
| |`long double modfl(long double value, long double *iptr);`| Yes | |
| |`double scalbn(double x, int n);`| Yes | |
| |`float scalbnf(float x, int n);`| Yes | |
| |`long double scalbnl(long double x, int n);`| Yes | |
| |`double scalbln(double x, long int n);`| Yes | |
| |`float scalblnf(float x, long int float cbrtf(float x);`| Yes | |
| |`long double cbrtl(long double x);`| Yes | |
| |`double fabs(double x);`| Yes | |
| |`float fabsf(float x);`| Yes | |
| |`long double fabsl(long double x);`| Yes | |
| |`double hypot(double x, double y);`| Yes | |
| |`float hypotf(float x, float y);`| Yes | |
| |`long double hypotl(long double x, long double y);`| Yes | |
| |`double pow(double x, double y);`| Yes | |
| |`float powf(float x, float y);`| Yes | |
| |`long double powl(long double x, long double y);`| Yes | |
| |`double sqrt(double x);`| Yes | |
| |`float sqrtf(float x);`| Yes | |
| |`long double sqrtl(long double x);`| Yes | |
| |`double erf(double x);`| Yes | |
| |`float erff(float x);`| Yes | |
| |`long double erfl(long double x);`| Yes | |
| |`double erfc(double x);`| Yes | |
| |`float erfcf(float x);`| Yes | |
| |`long double erfcl(long double x);`| Yes | |
| |`double lgamma(double x);`| Yes | |
| |`float lgammaf(float x);`| Yes | |
| |`long double lgammal(long double x);`| Yes | |
| |`double tgamma(double x);`| Yes | |
| |`float tgammaf(float x);`| Yes | |
| |`long double tgammal(long double x);`| Yes | |
| |`double ceil(double x);`| Yes | |
| |`float ceilf(float x);`| Yes | |
| |`long double ceill(long double x);`| Yes | |
| |`double floor(double x);`| Yes | |
| |`float floorf(float x);`| Yes | |
| |`long double floorl(long double x);`| Yes | |
| |`double nearbyint(double x);`| Yes | |
| |`float nearbyintf(float x);`| Yes | |
| |`long double nearbyintl(long double x);`| Yes | |
| |`double rint(double x);`| Yes | |
| |`float rintf(float x);`| Yes | |
| |`long double rintl(long double x);`| Yes | |
| |`long int lrint(double x);`| Yes | |
| |`long int lrintf(float x);`| Yes | |
| |`long int lrintl(long double x);`| Yes | |
| |`long long int llrint(double x);`| Yes | |
| |`long long int llrintf(float x);`| Yes | |
| |`long long int llrintl(long double x);`| Yes | |
| |`double round(double x);`| Yes | |
| |`float roundf(float x);`| Yes | |
| |`long double roundl(long double x);`| Yes | |
| |`long int lround(double x);`| Yes | |
| |`long int lroundf(float x);`| Yes | |
| |`long int lroundl(long double x);`| Yes | |
| |`long long int llround(double x);`| Yes | |
| |`long long int llroundf(float x);`| Yes | |
| |`long long int llroundl(long double x);`| Yes | |
| |`double trunc(double x);`| Yes | |
| |`float truncf(float x);`| Yes | |
| |`long double truncl(long double x);`| Yes | |
| |`double fmod(double x, double y);`| Yes | |
| |`float fmodf(float x, float y);`| Yes | |
| |`long double fmodl(long double x, long double y);`| Yes | |
| |`double remainder(double x, double y);`| Yes | |
| |`float remainderf(float x, float y);`| Yes | |
| |`long double remainderl(long double x, long double y);`| Yes | |
| |`double remquo(double x, double y, int *quo);`| Yes | |
| |`float remquof(float x, float y, int *quo);`| Yes | |
| |`long double remquol(long double x, long double y, int *quo);`| Yes | |
| |`double copysign(double x, double y);`| Yes | |
| |`float copysignf(float x, float y);`| Yes | |
| |`long double copysignl(long double x, long double y);`| Yes | |
| |`double nan(const char *tagp);`| Yes | |
| |`float nanf(const char *tagp);`| Yes | |
| |`long double nanl(const char *tagp);`| Yes | |
| |`double nextafter(double x, double y);`| Yes | |
| |`float nextafterf(float x, float y);`| Yes | |
| |`long double nextafterl(long double x, long double y);`| Yes | |
| |`double nexttoward(double x, long double y);`| Yes | |
| |`float nexttowardf(float x, long double y);`| Yes | |
| |`long double nexttowardl(long double x, long double y);`| Yes | |
| |`double fdim(double x, double y);`| Yes | |
| |`float fdimf(float x, float y);`| Yes | |
| |`long double fdiml(long double x, long double y);`| Yes | |
| |`double fmax(double x, double y);`| Yes | |
| |`float fmaxf(float x, float y);`| Yes | |
| |`long double fmaxl(long double x, long double y);`| Yes | |
| |`double fmin(double x, double y);`| Yes | |
| |`float fminf(float x, float y);`| Yes | |
| |`long double fminl(long double x, long double y);`| Yes | |
| |`double fma(double x, double y, double z);`| Yes | |
| |`float fmaf(float x, float y, float z);`| Yes | |
| |`long double fmal(long double x, long double y, long double z);`| Yes | |
| |`int isgreater(real-floating x, real-floating y);`| Yes | |
| |`int isgreaterequal(real-floating x, real-floating y);`| Yes | |
| |`int isless(real-floating x, real-floating y);`| Yes | |
| |`int islessequal(real-floating x, real-floating y);`| Yes | |
| |`int islessgreater(real-floating x, real-floating y);`| Yes | |
| |`int isunordered(real-floating x, real-floating y);`| Yes | |
| |
| ## B.12 Nonlocal jumps <setjmp.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`int setjmp(jmp_buf env);`| Yes | |
| |`_Noreturn void longjmp(jmp_buf env, int val);`| Yes | |
| |
| ## B.13 Signal handling <signal.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`void (*signal(int sig, void (*func)(int)))(int);`| Yes | |
| |`int raise(int sig);`| Yes | |
| |
| ## B.14 Alignment <stdalign.h> |
| | Function | Supported | |
| |----------|-----------| |
| |
| ## B.15 Variable arguments <stdarg.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`type va_arg(va_list ap, type);`| Yes | |
| |`void va_copy(va_list dest, va_list src);`| Yes | |
| |`void va_end(va_list ap);`| Yes | |
| |`void va_start(va_list ap, parmN);`| Yes | |
| |
| ## B.16 Atomics <stdatomic.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`void atomic_init(volatile A *obj, C value);`| Yes | |
| |`type kill_dependency(type y);`| Yes | |
| |`void atomic_thread_fence(memory_order order);`| Yes | |
| |`void atomic_signal_fence(memory_order order);`| Yes | |
| |`_Bool atomic_is_lock_free(const volatile A *obj);`| Yes | |
| |`void atomic_store(volatile A *object, C desired);`| Yes | |
| |`void atomic_store_explicit(volatile A *object, C desired, memory_order order);`| Yes | |
| |`C atomic_load(volatile A *object);`| Yes | |
| |`C atomic_load_explicit(volatile A *object, memory_order order);`| Yes | |
| |`C atomic_exchange(volatile A *object, C desired);`| Yes | |
| |`C atomic_exchange_explicit(volatile A *object, C desired, memory_order order);`| Yes | |
| |`_Bool atomic_compare_exchange_strong(volatile A *object, C *expected, C desired);`| Yes | |
| |`_Bool atomic_compare_exchange_strong_explicit(volatile A *object, C *expected, C desired, memory_order success, memory_order failure);`| Yes | |
| |`_Bool atomic_compare_exchange_weak(volatile A *object, C *expected, C desired);`| Yes | |
| |`_Bool atomic_compare_exchange_weak_explicit(volatile A *object, C *expected, C desired, memory_order success, memory_order failure);`| Yes | |
| |`C atomic_fetch_key(volatile A *object, M operand);`| Yes | |
| |`C atomic_fetch_key_explicit(volatile A *object, M operand, memory_order order);`| Yes | |
| |`_Bool atomic_flag_test_and_set(volatile atomic_flag *object);`| Yes | |
| |`_Bool atomic_flag_test_and_set_explicit(volatile atomic_flag *object, memory_order order);`| Yes | |
| |`void atomic_flag_clear(volatile atomic_flag *object);`| Yes | |
| |`void atomic_flag_clear_explicit(volatile atomic_flag *object, memory_order order);`| Yes | |
| |
| ## B.17 Boolean type and values <stdbool.h> |
| | Function | Supported | |
| |----------|-----------| |
| |
| ## B.18 Common definitions <stddef.h> |
| | Function | Supported | |
| |----------|-----------| |
| |
| ## B.19 Integer types <stdint.h> |
| | Function | Supported | |
| |----------|-----------| |
| |
| ## B.20 Input/output <stdio.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`int remove(const char *filename);`| Yes | |
| |`int rename(const char *old, const char *new);`| Yes | |
| |`FILE *tmpfile(void);`| Yes | |
| |`char *tmpnam(char *s);`| Yes | |
| |`int fclose(FILE *stream);`| Yes | |
| |`int fflush(FILE *stream);`| Yes | |
| |`FILE *fopen(const char * restrict filename, const char * restrict mode);`| Yes | |
| |`FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);`| Yes | |
| |`void setbuf(FILE * restrict stream, char * restrict buf);`| Yes | |
| |`int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size);`| Yes | |
| |`int fprintf(FILE * restrict stream, const char * restrict format, ...);`| Yes | |
| |`int fscanf(FILE * restrict stream, const char * restrict format, ...);`| Yes | |
| |`int printf(const char * restrict format, ...);`| Yes | |
| |`int scanf(const char * restrict format, ...);`| Yes | |
| |`int snprintf(char * restrict s, size_t n, const char * restrict format, ...);`| Yes | |
| |`int sprintf(char * restrict s, const char * restrict format, ...);`| Yes | |
| |`int sscanf(const char * restrict s, const char * restrict format, ...);`| Yes | |
| |`int vfprintf(FILE * restrict stream, const char * restrict format, va_list arg);`| Yes | |
| |`int vfscanf(FILE * restrict stream, const char * restrict format, va_list arg);`| No | |
| |`int vprintf(const char * restrict format, va_list arg);`| Yes | |
| |`int vscanf(const char * restrict format, va_list arg);`| No | |
| |`int vsnprintf(char * restrict s, size_t n, const char * restrict format, va_list arg);`| Yes | |
| |`int vsprintf(char * restrict s, const char * restrict format, va_list arg);`| Yes | |
| |`int vsscanf(const char * restrict s, const char * restrict format, va_list arg);`| Yes | |
| |`int fgetc(FILE *stream);`| Yes | |
| |`char *fgets(char * restrict s, int n, FILE * restrict stream);`| Yes | |
| |`int fputc(int c, FILE *stream);`| Yes | |
| |`int fputs(const char * restrict s, FILE * restrict stream);`| Yes | |
| |`int getc(FILE *stream);`| Yes | |
| |`int getchar(void);`| Yes | |
| |`int putc(int c, FILE *stream);`| Yes | |
| |`int putchar(int c);`| Yes | |
| |`int puts(const char *s);`| Yes | |
| |`int ungetc(int c, FILE *stream);`| Yes | |
| |`size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);`| Yes | |
| |`size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);`| Yes | |
| |`int fgetpos(FILE * restrict stream, fpos_t * restrict pos);`| No | |
| |`int fseek(FILE *stream, long int offset, int whence);`| Yes | |
| |`int fsetpos(FILE *stream, const fpos_t *pos);`| No | |
| |`long int ftell(FILE *stream);`| Yes | |
| |`void rewind(FILE *stream);`| Yes | |
| |`void clearerr(FILE *stream);`| Yes | |
| |`int feof(FILE *stream);`| Yes | |
| |`int ferror(FILE *stream);`| Yes | |
| |`void perror(const char *s);`| Yes | |
| |`errno_t tmpfile_s(FILE * restrict * restrict streamptr);`| No | |
| |`errno_t tmpnam_s(char *s, rsize_t maxsize);`| No | |
| |`errno_t fopen_s(FILE * restrict * restrict streamptr, const char * restrict filename, const char * restrict mode);`| No | |
| |`errno_t freopen_s(FILE * restrict * restrict newstreamptr, const char * restrict filename, const char * restrict mode, FILE * restrict stream);`| No | |
| |`int fprintf_s(FILE * restrict stream, const char * restrict format, ...);`| No | |
| |`int fscanf_s(FILE * restrict stream, const char * restrict format, ...);`| No | |
| |`int printf_s(const char * restrict format, ...);`| No | |
| |`int scanf_s(const char * restrict format, ...);`| No | |
| |`int snprintf_s(char * restrict s, rsize_t n, const char * restrict format, ...);`| No | |
| |`int sprintf_s(char * restrict s, rsize_t n, const char * restrict format, ...);`| No | |
| |`int sscanf_s(const char * restrict s, const char * restrict format, ...);`| No | |
| |`int vfprintf_s(FILE * restrict stream, const char * restrict format, va_list arg);`| No | |
| |`int vfscanf_s(FILE * restrict stream, const char * restrict format, va_list arg);`| No | |
| |`int vprintf_s(const char * restrict format, va_list arg);`| No | |
| |`int vscanf_s(const char * restrict format, va_list arg);`| No | |
| |`int vsnprintf_s(char * restrict s, rsize_t n, const char * restrict format, va_list arg);`| No | |
| |`int vsprintf_s(char * restrict s, rsize_t n, const char * restrict format, va_list arg);`| No | |
| |`int vsscanf_s(const char * restrict s, const char * restrict format, va_list arg);`| No | |
| |`char *gets_s(char *s, rsize_t n);`| No | |
| |
| ## B.21 General utilities <stdlib.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`double atof(const char *nptr);`| Yes | |
| |`int atoi(const char *nptr);`| Yes | |
| |`long int atol(const char *nptr);`| Yes | |
| |`long long int atoll(const char *nptr);`| Yes | |
| |`double strtod(const char * restrict nptr, char ** restrict endptr);`| Yes | |
| |`float strtof(const char * restrict nptr, char ** restrict endptr);`| Yes | |
| |`long double strtold(const char * restrict nptr, char ** restrict endptr);`| Yes | |
| |`long int strtol(const char * restrict nptr, char ** restrict endptr, int base);`| Yes | |
| |`long long int strtoll(const char * restrict nptr, char ** restrict endptr, int base);`| Yes | |
| |`unsigned long int strtoul(const char * restrict nptr, char ** restrict endptr, int base);`| Yes | |
| |`unsigned long long int strtoull(const char * restrict nptr, char ** restrict endptr, int base);`| Yes | |
| |`int rand(void);`| Yes | |
| |`void srand(unsigned int seed);`| Yes | |
| |`void *aligned_alloc(size_t alignment, size_t size);`| Yes | |
| |`void *calloc(size_t nmemb, size_t size);`| Yes | |
| |`void free(void *ptr);`| Yes | |
| |`void *malloc(size_t size);`| Yes | |
| |`void *realloc(void *ptr, size_t size);`| Yes | |
| |`_Noreturn void abort(void);`| Yes | |
| |`int atexit(void (*func)(void));`| Yes | |
| |`int at_quick_exit(void (*func)(void));`| No | |
| |`_Noreturn void exit(int status);`| Yes | |
| |`_Noreturn void _Exit(int status);`| No | |
| |`char *getenv(const char *name);`| Yes | |
| |`_Noreturn void quick_exit(int status);`| No | |
| |`int system(const char *string);`| Yes | |
| |`void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));`| Yes | |
| |`void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));`| Yes | |
| |`int abs(int j);`| Yes | |
| |`long int labs(long int j);`| Yes | |
| |`long long int llabs(long long int j);`| Yes | |
| |`div_t div(int numer, int denom);`| Yes | |
| |`ldiv_t ldiv(long int numer, long int denom);`| Yes | |
| |`lldiv_t lldiv(long long int numer, long long int denom);`| Yes | |
| |`int mblen(const char *s, size_t n);`| Yes | |
| |`int mbtowc(wchar_t * restrict pwc, const char * restrict s, size_t n);`| Yes | |
| |`int wctomb(char *s, wchar_t wchar);`| Yes | |
| |`size_t mbstowcs(wchar_t * restrict pwcs, const char * restrict s, size_t n);`| Yes | |
| |`size_t wcstombs(char * restrict s, const wchar_t * restrict pwcs, size_t n);`| Yes | |
| |`constraint_handler_t set_constraint_handler_s(constraint_handler_t handler);`| No | |
| |`void abort_handler_s(const char * restrict msg, void * restrict ptr, errno_t error);`| No | |
| |`void ignore_handler_s(const char * restrict msg, void * restrict ptr, errno_t error);`| No | |
| |`errno_t getenv_s(size_t * restrict len, char * restrict value, rsize_t maxsize, const char * restrict name);`| No | |
| |`void *bsearch_s(const void *key, const void *base, rsize_t nmemb, rsize_t size, int (*compar)(const void *k, const void *y, void *context), void *context);`| No | |
| |`errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size, int (*compar)(const void *x, const void *y, void *context), void *context);`| No | |
| |`errno_t wctomb_s(int * restrict status, char * restrict s, rsize_t smax, wchar_t wc);`| No | |
| |`errno_t mbstowcs_s(size_t * restrict retval, wchar_t * restrict dst, rsize_t dstmax, const char * restrict src, rsize_t len);`| No | |
| |`errno_t wcstombs_s(size_t * restrict retval, char * restrict dst, rsize_t dstmax, const wchar_t * restrict src, rsize_t len);`| No | |
| |
| ## B.22 _Noreturn <stdnoreturn.h> |
| | Function | Supported | |
| |----------|-----------| |
| |
| ## B.23 String handling <string.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`void *memcpy(void * restrict s1, const void * restrict s2, size_t n);`| Yes | |
| |`void *memmove(void *s1, const void *s2, size_t n);`| Yes | |
| |`char *strcpy(char * restrict s1, const char * restrict s2);`| Yes | |
| |`char *strncpy(char * restrict s1, const char * restrict s2, size_t n);`| Yes | |
| |`char *strcat(char * restrict s1, const char * restrict s2);`| Yes | |
| |`char *strncat(char * restrict s1, const char * restrict s2, size_t n);`| Yes | |
| |`int memcmp(const void *s1, const void *s2, size_t n);`| Yes | |
| |`int strcmp(const char *s1, const char *s2);`| Yes | |
| |`int strcoll(const char *s1, const char *s2);`| Yes | |
| |`int strncmp(const char *s1, const char *s2, size_t n);`| Yes | |
| |`size_t strxfrm(char * restrict s1, const char * restrict s2, size_t n);`| Yes | |
| |`void *memchr(const void *s, int c, size_t n);`| Yes | |
| |`char *strchr(const char *s, int c);`| Yes | |
| |`size_t strcspn(const char *s1, const char *s2);`| Yes | |
| |`char *strpbrk(const char *s1, const char *s2);`| Yes | |
| |`char *strrchr(const char *s, int c);`| Yes | |
| |`size_t strspn(const char *s1, const char *s2);`| Yes | |
| |`char *strstr(const char *s1, const char *s2);`| Yes | |
| |`char *strtok(char * restrict s1, const char * restrict s2);`| Yes | |
| |`void *memset(void *s, int c, size_t n);`| Yes | |
| |`char *strerror(int errnum);`| Yes | |
| |`size_t strlen(const char *s);`| Yes | |
| |`errno_t memcpy_s(void * restrict s1, rsize_t s1max, const void * restrict s2, rsize_t n);`| No | |
| |`errno_t memmove_s(void *s1, rsize_t s1max, const void *s2, rsize_t n);`| No | |
| |`errno_t strcpy_s(char * restrict s1, rsize_t s1max, const char * restrict s2);`| No | |
| |`errno_t strncpy_s(char * restrict s1, rsize_t s1max, const char * restrict s2, rsize_t n);`| No | |
| |`errno_t strcat_s(char * restrict s1, rsize_t s1max, const char * restrict s2);`| No | |
| |`errno_t strncat_s(char * restrict s1, rsize_t s1max, const char * restrict s2, rsize_t n);`| No | |
| |`char *strtok_s(char * restrict s1, rsize_t * restrict s1max, const char * restrict s2, char ** restrict ptr);`| No | |
| |`errno_t memset_s(void *s, rsize_t smax, int c, rsize_t n);`| No | |
| |`errno_t strerror_s(char *s, rsize_t maxsize, errno_t errnum);`| No | |
| |`size_t strerrorlen_s(errno_t errnum);`| No | |
| |`size_t strnlen_s(const char *s, size_t maxsize);`| No | |
| |
| ## B.24 Type-generic math <tgmath.h> |
| | Function | Supported | |
| |----------|-----------| |
| |
| ## B.25 Threads <threads.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`void call_once(once_flag *flag, void (*func)(void));`| No | |
| |`int cnd_broadcast(cnd_t *cond);`| Yes | |
| |`void cnd_destroy(cnd_t *cond);`| Yes | |
| |`int cnd_init(cnd_t *cond);`| Yes | |
| |`int cnd_signal(cnd_t *cond);`| Yes | |
| |`int cnd_timedwait(cnd_t *restrict cond, mtx_t *restrict mtx, const struct timespec *restrict ts);`| Yes | |
| |`int cnd_wait(cnd_t *cond, mtx_t *mtx);`| Yes | |
| |`void mtx_destroy(mtx_t *mtx);`| Yes | |
| |`int mtx_init(mtx_t *mtx, int type);`| Yes | |
| |`int mtx_lock(mtx_t *mtx);`| Yes | |
| |`int mtx_timedlock(mtx_t *restrict mtx, const struct timespec *restrict ts);`| Yes | |
| |`int mtx_trylock(mtx_t *mtx);`| Yes | |
| |`int mtx_unlock(mtx_t *mtx);`| Yes | |
| |`int thrd_create(thrd_t *thr, thrd_start_t func, void *arg);`| Yes | |
| |`thrd_t thrd_current(void);`| Yes | |
| |`int thrd_detach(thrd_t thr);`| Yes | |
| |`int thrd_equal(thrd_t thr0, thrd_t thr1);`| No | |
| |`_Noreturn void thrd_exit(int res);`| No | |
| |`int thrd_join(thrd_t thr, int *res);`| Yes | |
| |`int thrd_sleep(const struct timespec *duration, struct timespec *remaining);`| No | |
| |`void thrd_yield(void);`| Yes | |
| |`int tss_create(tss_t *key, tss_dtor_t dtor);`| No | |
| |`void tss_delete(tss_t key);`| No | |
| |`void *tss_get(tss_t key);`| No | |
| |`int tss_set(tss_t key, void *val);`| No | |
| |
| ## B.26 Date and time <time.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`clock_t clock(void);`| Yes | |
| |`double difftime(time_t time1, time_t time0);`| Yes | |
| |`time_t mktime(struct tm *timeptr);`| Yes | |
| |`time_t time(time_t *timer);`| Yes | |
| |`int timespec_get(timespec *ts, int base);`| Yes | |
| |`char *asctime(const struct tm *timeptr);`| No | |
| |`char *ctime(const time_t *timer);`| Yes | |
| |`struct tm *gmtime(const time_t *timer);`| Yes | |
| |`struct tm *localtime(const time_t *timer);`| Yes | |
| |`size_t strftime(char * restrict s, size_t maxsize, const char * restrict format, const struct tm * restrict timeptr);`| Yes | |
| |`errno_t asctime_s(char *s, rsize_t maxsize, const struct tm *timeptr);`| No | |
| |`errno_t ctime_s(char *s, rsize_t maxsize, const time_t *timer);`| No | |
| |`struct tm *gmtime_s(const time_t * restrict timer, struct tm * restrict result);`| No | |
| |`struct tm *localtime_s(const time_t * restrict timer, struct tm * restrict result);`| No | |
| |
| ## B.27 Unicode utilities <uchar.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`size_t mbrtoc16(char16_t * restrict pc16, const char * restrict s, size_t n, mbstate_t * restrict ps);`| No | |
| |`size_t c16rtomb(char * restrict s, char16_t c16, mbstate_t * restrict ps);`| No | |
| |`size_t mbrtoc32(char32_t * restrict pc32, const char * restrict s, size_t n, mbstate_t * restrict ps);`| No | |
| |`size_t c32rtomb(char * restrict s, char32_t c32, mbstate_t * restrict ps);`| No | |
| |
| ## B.28 Extended multibyte/wide character utilities <wchar.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`int fwprintf(FILE * restrict stream, const wchar_t * restrict format, ...);`| No | |
| |`int fwscanf(FILE * restrict stream, const wchar_t * restrict format, ...);`| No | |
| |`int swprintf(wchar_t * restrict s, size_t n, const wchar_t * restrict format, ...);`| Yes | |
| |`int swscanf(const wchar_t * restrict s, const wchar_t * restrict format, ...);`| No | |
| |`int vfwprintf(FILE * restrict stream, const wchar_t * restrict format, va_list arg);`| No | |
| |`int vfwscanf(FILE * restrict stream, const wchar_t * restrict format, va_list arg);`| No | |
| |`int vswprintf(wchar_t * restrict s, size_t n, const wchar_t * restrict format, va_list arg);`| No | |
| |`int vswscanf(const wchar_t * restrict s, const wchar_t * restrict format, va_list arg);`| No | |
| |`int vwprintf(const wchar_t * restrict format, va_list arg);`| No | |
| |`int vwscanf(const wchar_t * restrict format, va_list arg);`| No | |
| |`int wprintf(const wchar_t * restrict format, ...);`| No | |
| |`int wscanf(const wchar_t * restrict format, ...);`| No | |
| |`wint_t fgetwc(FILE *stream);`| Yes | |
| |`wchar_t *fgetws(wchar_t * restrict s, int n, FILE * restrict stream);`| No | |
| |`wint_t fputwc(wchar_t c, FILE *stream);`| No | |
| |`int fputws(const wchar_t * restrict s, FILE * restrict stream);`| No | |
| |`int fwide(FILE *stream, int mode);`| No | |
| |`wint_t getwc(FILE *stream);`| No | |
| |`wint_t getwchar(void);`| No | |
| |`wint_t putwc(wchar_t c, FILE *stream);`| No | |
| |`wint_t putwchar(wchar_t c);`| No | |
| |`wint_t ungetwc(wint_t c, FILE *stream);`| No | |
| |`double wcstod(const wchar_t * restrict nptr, wchar_t ** restrict endptr);`| Yes | |
| |`float wcstof(const wchar_t * restrict nptr, wchar_t ** restrict endptr);`| Yes | |
| |`long double wcstold(const wchar_t * restrict nptr, wchar_t ** restrict endptr);`| Yes | |
| |`long int wcstol(const wchar_t * restrict nptr, wchar_t ** restrict endptr, int base);`| Yes | |
| |`long long int wcstoll(const wchar_t * restrict nptr, wchar_t ** restrict endptr, int base);`| Yes | |
| |`unsigned long int wcstoul(const wchar_t * restrict nptr, wchar_t ** restrict endptr, int base);`| Yes | |
| |`unsigned long long int wcstoull(const wchar_t * restrict nptr, wchar_t ** restrict endptr, int base);`| Yes | |
| |`wchar_t *wcscpy(wchar_t * restrict s1, const wchar_t * restrict s2);`| Yes | |
| |`wchar_t *wcsncpy(wchar_t * restrict s1, const wchar_t * restrict s2, size_t n);`| Yes | |
| |`wchar_t *wmemcpy(wchar_t * restrict s1, const wchar_t * restrict s2, size_t n);`| Yes | |
| |`wchar_t *wmemmove(wchar_t *s1, const wchar_t *s2, size_t n);`| Yes | |
| |`wchar_t *wcscat(wchar_t * restrict s1, const wchar_t * restrict s2);`| Yes | |
| |`wchar_t *wcsncat(wchar_t * restrict s1, const wchar_t * restrict s2, size_t n);`| Yes | |
| |`int wcscmp(const wchar_t *s1, const wchar_t *s2);`| Yes | |
| |`int wcscoll(const wchar_t *s1, const wchar_t *s2);`| Yes | |
| |`int wcsncmp(const wchar_t *s1, const wchar_t *s2, size_t n);`| Yes | |
| |`size_t wcsxfrm(wchar_t * restrict s1, const wchar_t * restrict s2, size_t n);`| Yes | |
| |`int wmemcmp(const wchar_t *s1, const wchar_t *s2, size_t n);`| Yes | |
| |`wchar_t *wcschr(const wchar_t *s, wchar_t c);`| Yes | |
| |`size_t wcscspn(const wchar_t *s1, const wchar_t *s2);`| Yes | |
| |`wchar_t *wcspbrk(const wchar_t *s1, const wchar_t *s2);`| Yes | |
| |`wchar_t *wcsrchr(const wchar_t *s, wchar_t c);`| Yes | |
| |`size_t wcsspn(const wchar_t *s1, const wchar_t *s2);`| Yes | |
| |`wchar_t *wcsstr(const wchar_t *s1, const wchar_t *s2);`| Yes | |
| |`wchar_t *wcstok(wchar_t * restrict s1, const wchar_t * restrict s2, wchar_t ** restrict ptr);`| Yes | |
| |`wchar_t *wmemchr(const wchar_t *s, wchar_t c, size_t n);`| Yes | |
| |`size_t wcslen(const wchar_t *s);`| Yes | |
| |`wchar_t *wmemset(wchar_t *s, wchar_t c, size_t n);`| Yes | |
| |`size_t wcsftime(wchar_t * restrict s, size_t maxsize, const wchar_t * restrict format, const struct tm * restrict timeptr);`| No | |
| |`wint_t btowc(int c);`| Yes | |
| |`int wctob(wint_t c);`| Yes | |
| |`int mbsinit(const mbstate_t *ps);`| Yes | |
| |`size_t mbrlen(const char * restrict s, size_t n, mbstate_t * restrict ps);`| Yes | |
| |`size_t mbrtowc(wchar_t * restrict pwc, const char * restrict s, size_t n, mbstate_t * restrict ps);`| Yes | |
| |`size_t wcrtomb(char * restrict s, wchar_t wc, mbstate_t * restrict ps);`| Yes | |
| |`size_t mbsrtowcs(wchar_t * restrict dst, const char ** restrict src, size_t len, mbstate_t * restrict ps);`| Yes | |
| |`size_t wcsrtombs(char * restrict dst, const wchar_t ** restrict src, size_t len, mbstate_t * restrict ps);`| Yes | |
| |`int fwprintf_s(FILE * restrict stream, const wchar_t * restrict format, ...);`| No | |
| |`int fwscanf_s(FILE * restrict stream, const wchar_t * restrict format, ...);`| No | |
| |`int snwprintf_s(wchar_t * restrict s, rsize_t n, const wchar_t * restrict format, ...);`| No | |
| |`int swprintf_s(wchar_t * restrict s, rsize_t n, const wchar_t * restrict format, ...);`| No | |
| |`int swscanf_s(const wchar_t * restrict s, const wchar_t * restrict format, ...);`| No | |
| |`int vfwprintf_s(FILE * restrict stream, const wchar_t * restrict format, va_list arg);`| No | |
| |`int vfwscanf_s(FILE * restrict stream, const wchar_t * restrict format, va_list arg);`| No | |
| |`int vsnwprintf_s(wchar_t * restrict s, rsize_t n, const wchar_t * restrict format, va_list arg);`| No | |
| |`int vswprintf_s(wchar_t * restrict s, rsize_t n, const wchar_t * restrict format, va_list arg);`| No | |
| |`int vswscanf_s(const wchar_t * restrict s, const wchar_t * restrict format, va_list arg);`| No | |
| |`int vwprintf_s(const wchar_t * restrict format, va_list arg);`| No | |
| |`int vwscanf_s(const wchar_t * restrict format, va_list arg);`| No | |
| |`int wprintf_s(const wchar_t * restrict format, ...);`| No | |
| |`int wscanf_s(const wchar_t * restrict format, ...);`| No | |
| |`errno_t wcscpy_s(wchar_t * restrict s1, rsize_t s1max, const wchar_t * restrict s2);`| No | |
| |`errno_t wcsncpy_s(wchar_t * restrict s1, rsize_t s1max, const wchar_t * restrict s2, rsize_t n);`| No | |
| |`errno_t wmemcpy_s(wchar_t * restrict s1, rsize_t s1max, const wchar_t * restrict s2, rsize_t n);`| No | |
| |`errno_t wmemmove_s(wchar_t *s1, rsize_t s1max, const wchar_t *s2, rsize_t n);`| No | |
| |`errno_t wcscat_s(wchar_t * restrict s1, rsize_t s1max, const wchar_t * restrict s2);`| No | |
| |`errno_t wcsncat_s(wchar_t * restrict s1, rsize_t s1max, const wchar_t * restrict s2, rsize_t n);`| No | |
| |`wchar_t *wcstok_s(wchar_t * restrict s1, rsize_t * restrict s1max, const wchar_t * restrict s2, wchar_t ** restrict ptr);`| No | |
| |`size_t wcsnlen_s(const wchar_t *s, size_t maxsize);`| No | |
| |`errno_t wcrtomb_s(size_t * restrict retval, char * restrict s, rsize_t smax, wchar_t wc, mbstate_t * restrict ps);`| No | |
| |`errno_t mbsrtowcs_s(size_t * restrict retval, wchar_t * restrict dst, rsize_t dstmax, const char ** restrict src, rsize_t len, mbstate_t * restrict ps);`| No | |
| |`errno_t wcsrtombs_s(size_t * restrict retval, char * restrict dst, rsize_t dstmax, const wchar_t ** restrict src, rsize_t len, mbstate_t * restrict ps);`| No | |
| |
| ## B.29 Wide character classification and mapping utilities <wctype.h> |
| | Function | Supported | |
| |----------|-----------| |
| |`int iswalnum(wint_t wc);`| No | |
| |`int iswalpha(wint_t wc);`| Yes | |
| |`int iswblank(wint_t wc);`| Yes | |
| |`int iswcntrl(wint_t wc);`| Yes | |
| |`int iswdigit(wint_t wc);`| Yes | |
| |`int iswgraph(wint_t wc);`| No | |
| |`int iswlower(wint_t wc);`| Yes | |
| |`int iswprint(wint_t wc);`| Yes | |
| |`int iswpunct(wint_t wc);`| Yes | |
| |`int iswspace(wint_t wc);`| Yes | |
| |`int iswupper(wint_t wc);`| Yes | |
| |`int iswxdigit(wint_t wc);`| Yes | |
| |`int iswctype(wint_t wc, wctype_t desc);`| No | |
| |`wctype_t wctype(const char *property);`| No | |
| |`wint_t towlower(wint_t wc);`| Yes | |
| |`wint_t towupper(wint_t wc);`| Yes | |
| |`wint_t towctrans(wint_t wc, wctrans_t desc);`| No | |
| |`wctrans_t wctrans(const char *property);`| No | |
| |
| [c11]: https://en.wikipedia.org/wiki/C11_(C_standard_revision) |