// -*- C++ -*-
//===-----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// These are reimplementations of some extended locale functions ( *_l ) that
// are normally part of POSIX.  This shared implementation provides parts of the
// extended locale support for libc's that normally don't have any (like
// Android's bionic and Newlib).
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP_SUPPORT_XLOCALE_POSIX_L_FALLBACK_H
#define _LIBCPP_SUPPORT_XLOCALE_POSIX_L_FALLBACK_H

#ifdef __cplusplus
extern "C" {
#endif

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

inline _LIBCPP_INLINE_VISIBILITY wint_t towupper_l(wint_t c, locale_t) {
  return ::towupper(c);
}

inline _LIBCPP_INLINE_VISIBILITY wint_t towlower_l(wint_t c, locale_t) {
  return ::towlower(c);
}

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

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

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

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

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

#ifdef __cplusplus
}
#endif

#endif // _LIBCPP_SUPPORT_XLOCALE_POSIX_L_FALLBACK_H
