// -*- C++ -*-
//===------------------- support/android/locale_bionic.h ------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP_SUPPORT_ANDROID_LOCALE_BIONIC_H
#define _LIBCPP_SUPPORT_ANDROID_LOCALE_BIONIC_H

#if defined(__ANDROID__)

#ifdef __cplusplus
extern "C" {
#endif

#include <stdlib.h>
#include <xlocale.h>

static inline int isalnum_l(int c, locale_t) {
  return isalnum(c);
}

static inline int isalpha_l(int c, locale_t) {
  return isalpha(c);
}

static inline int isblank_l(int c, locale_t) {
  return isblank(c);
}

static inline int iscntrl_l(int c, locale_t) {
  return iscntrl(c);
}

static inline int isdigit_l(int c, locale_t) {
  return isdigit(c);
}

static inline int isgraph_l(int c, locale_t) {
  return isgraph(c);
}

static inline int islower_l(int c, locale_t) {
  return islower(c);
}

static inline int isprint_l(int c, locale_t) {
  return isprint(c);
}

static inline int ispunct_l(int c, locale_t) {
  return ispunct(c);
}

static inline int isspace_l(int c, locale_t) {
  return isspace(c);
}

static inline int isupper_l(int c, locale_t) {
  return isupper(c);
}

static inline int isxdigit_l(int c, locale_t) {
  return isxdigit(c);
}

static inline int iswalnum_l(wint_t c, locale_t) {
  return iswalnum(c);
}

static inline int iswalpha_l(wint_t c, locale_t) {
  return iswalpha(c);
}

static inline int iswblank_l(wint_t c, locale_t) {
  return iswblank(c);
}

static inline int iswcntrl_l(wint_t c, locale_t) {
  return iswcntrl(c);
}

static inline int iswdigit_l(wint_t c, locale_t) {
  return iswdigit(c);
}

static inline int iswgraph_l(wint_t c, locale_t) {
  return iswgraph(c);
}

static inline int iswlower_l(wint_t c, locale_t) {
  return iswlower(c);
}

static inline int iswprint_l(wint_t c, locale_t) {
  return iswprint(c);
}

static inline int iswpunct_l(wint_t c, locale_t) {
  return iswpunct(c);
}

static inline int iswspace_l(wint_t c, locale_t) {
  return iswspace(c);
}

static inline int iswupper_l(wint_t c, locale_t) {
  return iswupper(c);
}

static inline int iswxdigit_l(wint_t c, locale_t) {
  return iswxdigit(c);
}

static inline int toupper_l(int c, locale_t) {
  return toupper(c);
}

static inline int tolower_l(int c, locale_t) {
  return tolower(c);
}

static inline int towupper_l(int c, locale_t) {
  return towupper(c);
}

static inline int towlower_l(int c, locale_t) {
  return towlower(c);
}

static inline int strcoll_l(const char *s1, const char *s2, locale_t) {
  return strcoll(s1, s2);
}

static inline size_t strxfrm_l(char *dest, const char *src, size_t n,
                               locale_t) {
  return strxfrm(dest, src, n);
}

static inline size_t strftime_l(char *s, size_t max, const char *format,
                                const struct tm *tm, locale_t) {
  return strftime(s, max, format, tm);
}

static inline int wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t) {
  return wcscoll(ws1, ws2);
}

static inline size_t wcsxfrm_l(wchar_t *dest, const wchar_t *src, size_t n,
                               locale_t) {
  return wcsxfrm(dest, src, n);
}

static inline long double strtold_l(const char *nptr, char **endptr, locale_t) {
  return strtold(nptr, endptr);
}

static inline long long strtoll_l(const char *nptr, char **endptr, size_t base,
                                  locale_t) {
  return strtoll(nptr, endptr, base);
}

static inline unsigned long long strtoull_l(const char *nptr, char **endptr,
                                            size_t base, locale_t) {
  return strtoull(nptr, endptr, base);
}

static inline long long wcstoll_l(const wchar_t *nptr, wchar_t **endptr,
                                  size_t base, locale_t) {
  return wcstoll(nptr, endptr, base);
}

static inline unsigned long long wcstoull_l(const wchar_t *nptr,
                                            wchar_t **endptr, size_t base,
                                            locale_t) {
  return wcstoull(nptr, endptr, base);
}

static inline long double wcstold_l(const wchar_t *nptr, wchar_t **endptr,
                                    locale_t) {
  return wcstold(nptr, endptr);
}

#ifdef __cplusplus
}
#endif
#endif // defined(__ANDROID__)
#endif // _LIBCPP_SUPPORT_ANDROID_LOCALE_BIONIC_H
