[libc] Initial support for 'locale.h' in the LLVM libc (#102689)

Summary:
This patch adds the macros and entrypoints associated with the
`locale.h` entrypoints.  These are mostly stubs, as we (for now and the
forseeable future) only expect to support the C and maybe C.UTF-8
locales in the LLVM libc.
This commit is contained in:
Joseph Huber 2024-08-22 12:58:46 -05:00 committed by GitHub
parent 2f4232db0b
commit 78d8ab2ab9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
35 changed files with 788 additions and 0 deletions

View File

@ -233,6 +233,15 @@ set(TARGET_LIBC_ENTRYPOINTS
# wchar.h entrypoints
libc.src.wchar.wctob
# locale.h entrypoints
libc.src.locale.localeconv
libc.src.locale.duplocale
libc.src.locale.freelocale
libc.src.locale.localeconv
libc.src.locale.newlocale
libc.src.locale.setlocale
libc.src.locale.uselocale
# gpu/rpc.h entrypoints
libc.src.gpu.rpc_host_call
)

View File

@ -16,6 +16,7 @@ set(TARGET_PUBLIC_HEADERS
libc.include.wchar
libc.include.uchar
libc.include.features
libc.include.locale
# Header for RPC extensions
libc.include.gpu_rpc

View File

@ -982,6 +982,15 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.time.nanosleep
libc.src.time.time
# locale.h entrypoints
libc.src.locale.localeconv
libc.src.locale.duplocale
libc.src.locale.freelocale
libc.src.locale.localeconv
libc.src.locale.newlocale
libc.src.locale.setlocale
libc.src.locale.uselocale
# unistd.h entrypoints
libc.src.unistd.__llvm_libc_syscall
libc.src.unistd._exit

View File

@ -33,6 +33,7 @@ set(TARGET_PUBLIC_HEADERS
libc.include.unistd
libc.include.wchar
libc.include.uchar
libc.include.locale
libc.include.arpa_inet

View File

@ -162,3 +162,12 @@ add_proxy_header_library(
libc.include.llvm-libc-types.cookie_io_functions_t
libc.include.stdio
)
add_proxy_header_library(
locale_t
HDRS
locale_t.h
FULL_BUILD_DEPENDS
libc.include.llvm-libc-types.locale_t
libc.include.locale
)

22
libc/hdr/types/locale_t.h Normal file
View File

@ -0,0 +1,22 @@
//===-- Definition of macros from locale_t.h ------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_HDR_LOCALE_T_H
#define LLVM_LIBC_HDR_LOCALE_T_H
#ifdef LIBC_FULL_BUILD
#include "include/llvm-libc-types/locale_t.h"
#else // overlay mode
#error "type not available in overlay mode"
#endif // LLVM_LIBC_FULL_BUILD
#endif // LLVM_LIBC_HDR_LOCALE_T_H

View File

@ -719,6 +719,18 @@ add_header_macro(
.llvm-libc-types.wchar_t
)
add_header_macro(
locale
../libc/newhdrgen/yaml/locale.yaml
locale.h.def
locale.h
DEPENDS
.llvm_libc_common_h
.llvm-libc-macros.locale_macros
.llvm-libc-types.locale_t
.llvm-libc-types.struct_lconv
)
if(LIBC_TARGET_OS_IS_GPU)
file(MAKE_DIRECTORY ${LIBC_INCLUDE_DIR}/gpu)

View File

@ -295,3 +295,9 @@ add_macro_header(
HDR
elf-macros.h
)
add_macro_header(
locale_macros
HDR
locale-macros.h
)

View File

@ -0,0 +1,32 @@
//===-- Definition of macros from locale.h --------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_MACROS_LOCALE_MACROS_H
#define LLVM_LIBC_MACROS_LOCALE_MACROS_H
#include "../llvm-libc-types/locale_t.h"
#define LC_CTYPE 0
#define LC_NUMERIC 1
#define LC_TIME 2
#define LC_COLLATE 3
#define LC_MONETARY 4
#define LC_MESSAGES 5
#define LC_ALL 6
#define LC_GLOBAL_LOCALE ((locale_t)(-1))
#define LC_CTYPE_MASK (1 << LC_CTYPE)
#define LC_NUMERIC_MASK (1 << LC_NUMERIC)
#define LC_TIME_MASK (1 << LC_TIME)
#define LC_COLLATE_MASK (1 << LC_COLLATE)
#define LC_MONETARY_MASK (1 << LC_MONETARY)
#define LC_MESSAGES_MASK (1 << LC_MESSAGES)
#define LC_ALL_MASK 0x7fffffff
#endif // LLVM_LIBC_MACROS_LOCALE_MACROS_H

View File

@ -142,3 +142,5 @@ DEPENDS
.fsblkcnt_t
.fsfilcnt_t
)
add_header(locale_t HDR locale_t.h)
add_header(struct_lconv HDR struct_lconv.h)

View File

@ -0,0 +1,22 @@
//===-- Definition of type locale_t ---------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_TYPES_LOCALE_T_H
#define LLVM_LIBC_TYPES_LOCALE_T_H
#define NUM_LOCALE_CATEGORIES 6
struct __locale_data;
struct __locale_t {
struct __locale_data *data[NUM_LOCALE_CATEGORIES];
};
typedef struct __locale_t *locale_t;
#endif // LLVM_LIBC_TYPES_LOCALE_T_H

View File

@ -0,0 +1,39 @@
//===-- Definition of type lconv ------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_TYPES_LCONV_H
#define LLVM_LIBC_TYPES_LCONV_H
struct lconv {
char *decimal_point;
char *thousands_sep;
char *grouping;
char *mon_decimal_point;
char *mon_thousands_sep;
char *mon_grouping;
char *positive_sign;
char *negative_sign;
char *currency_symbol;
char frac_digits;
char p_cs_precedes;
char n_cs_precedes;
char p_sep_by_space;
char n_sep_by_space;
char p_sign_posn;
char n_sign_posn;
char *int_curr_symbol;
char int_frac_digits;
char int_p_cs_precedes;
char int_n_cs_precedes;
char int_p_sep_by_space;
char int_n_sep_by_space;
char int_p_sign_posn;
char int_n_sign_posn;
};
#endif // LLVM_LIBC_TYPES_LCONV_H

20
libc/include/locale.h.def Normal file
View File

@ -0,0 +1,20 @@
//===-- C standard library header locale.h --------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_LOCALE_H
#define LLVM_LIBC_LOCALE_H
#include "__llvm-libc-common.h"
#include "llvm-libc-macros/locale-macros.h"
#include "llvm-libc-types/locale_t.h"
#include "llvm-libc-types/struct_lconv.h"
%%public_api()
#endif // LLVM_LIBC_LOCALE_H

View File

@ -0,0 +1,41 @@
header: locale.h
functions:
- name: localeconv
standards:
- stdc
return_type: struct lconv *
arguments:
- type: void
- name: duplocale
standards:
- stdc
return_type: locale_t
arguments:
- type: locale_t
- name: freelocale
standards:
- stdc
return_type: void
arguments:
- type: locale_t
- name: newlocale
standards:
- stdc
return_type: locale_t
arguments:
- type: int
- type: const char *
- type: locale_t
- name: setlocale
standards:
- stdc
return_type: char *
arguments:
- type: int
- type: const char *
- name: uselocale
standards:
- stdc
return_type: locale_t
arguments:
- type: locale_t

View File

@ -4,6 +4,7 @@ def StdC : StandardSpec<"stdc"> {
PtrType StructTmPtr = PtrType<StructTmType>;
PtrType TimeTTypePtr = PtrType<TimeTType>;
NamedType ClockT = NamedType<"clock_t">;
NamedType LocaleT = NamedType<"locale_t">;
NamedType DivTType = NamedType<"div_t">;
NamedType LDivTType = NamedType<"ldiv_t">;
@ -1591,6 +1592,61 @@ def StdC : StandardSpec<"stdc"> {
]
>;
NamedType StructLconv : NamedType<"struct lconv">;
PtrType StructLconvPtr : PtrType<StructLconv>;
HeaderSpec Locale = HeaderSpec<
"locale.h",
[], // Macros
[LocaleT, StructLconv], // Types
[], // Enumerations
[
FunctionSpec<
"duplocale",
RetValSpec<LocaleT>,
[
ArgSpec<LocaleT>
]
>,
FunctionSpec<
"freelocale",
RetValSpec<VoidType>,
[
ArgSpec<LocaleT>
]
>,
FunctionSpec<
"localeconv",
RetValSpec<StructLconvPtr>,
[]
>,
FunctionSpec<
"newlocale",
RetValSpec<LocaleT>,
[
ArgSpec<IntType>,
ArgSpec<ConstCharPtr>,
ArgSpec<LocaleT>
]
>,
FunctionSpec<
"setlocale",
RetValSpec<CharPtr>,
[
ArgSpec<IntType>,
ArgSpec<ConstCharPtr>
]
>,
FunctionSpec<
"uselocale",
RetValSpec<LocaleT>,
[
ArgSpec<LocaleT>
]
>
] // Functions
>;
let Headers = [
Assert,
@ -1613,5 +1669,6 @@ def StdC : StandardSpec<"stdc"> {
Time,
UChar,
WChar,
Locale,
];
}

View File

@ -40,3 +40,4 @@ add_subdirectory(signal)
add_subdirectory(spawn)
add_subdirectory(threads)
add_subdirectory(time)
add_subdirectory(locale)

View File

@ -0,0 +1,76 @@
add_object_library(
locale
SRCS
locale.cpp
HDRS
locale.h
DEPENDS
libc.include.locale
)
add_entrypoint_object(
localeconv
SRCS
localeconv.cpp
HDRS
localeconv.h
DEPENDS
libc.include.locale
CXX_STANDARD
20 # For designated initializers
)
add_entrypoint_object(
newlocale
SRCS
newlocale.cpp
HDRS
newlocale.h
DEPENDS
libc.include.locale
.locale
)
add_entrypoint_object(
duplocale
SRCS
duplocale.cpp
HDRS
duplocale.h
DEPENDS
libc.include.locale
.locale
)
add_entrypoint_object(
setlocale
SRCS
setlocale.cpp
HDRS
setlocale.h
DEPENDS
libc.include.locale
.locale
)
add_entrypoint_object(
uselocale
SRCS
uselocale.cpp
HDRS
uselocale.h
DEPENDS
libc.include.locale
.locale
)
add_entrypoint_object(
freelocale
SRCS
freelocale.cpp
HDRS
freelocale.h
DEPENDS
libc.include.locale
.locale
)

View File

@ -0,0 +1,21 @@
//===-- Implementation of duplocale ---------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "src/locale/duplocale.h"
#include "include/llvm-libc-macros/locale-macros.h"
#include "src/locale/locale.h"
#include "src/__support/CPP/string_view.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(locale_t, duplocale, (locale_t loc)) { return loc; }
} // namespace LIBC_NAMESPACE_DECL

View File

@ -0,0 +1,22 @@
//===-- Implementation header for duplocale ---------------------*- 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_SRC_LOCALE_DUPLOCALE_H
#define LLVM_LIBC_SRC_LOCALE_DUPLOCALE_H
#include "src/__support/macros/config.h"
#include "hdr/types/locale_t.h"
namespace LIBC_NAMESPACE_DECL {
locale_t duplocale(locale_t loc);
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_LOCALE_DUPLOCALE_H

View File

@ -0,0 +1,21 @@
//===-- Implementation of freelocale --------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "src/locale/freelocale.h"
#include "include/llvm-libc-macros/locale-macros.h"
#include "src/locale/locale.h"
#include "src/__support/CPP/string_view.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(void, freelocale, (locale_t)) {}
} // namespace LIBC_NAMESPACE_DECL

View File

@ -0,0 +1,22 @@
//===-- Implementation header for freelocale --------------------*- 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_SRC_LOCALE_FREELOCALE_H
#define LLVM_LIBC_SRC_LOCALE_FREELOCALE_H
#include "src/__support/macros/config.h"
#include "hdr/types/locale_t.h"
namespace LIBC_NAMESPACE_DECL {
void freelocale(locale_t loc);
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_LOCALE_FREELOCALE_H

View File

@ -0,0 +1,21 @@
//===-- Implementation of locale ------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "src/locale/locale.h"
#include "include/llvm-libc-macros/locale-macros.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
__locale_t c_locale = {nullptr};
locale_t locale = nullptr;
} // namespace LIBC_NAMESPACE_DECL

36
libc/src/locale/locale.h Normal file
View File

@ -0,0 +1,36 @@
//===-- Implementation header for the locale --------------------*- 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_SRC_LOCALE_LOCALECONV_H
#define LLVM_LIBC_SRC_LOCALE_LOCALECONV_H
#include "src/__support/macros/attributes.h"
#include "src/__support/macros/config.h"
#include "hdr/types/locale_t.h"
#include <stddef.h>
namespace LIBC_NAMESPACE_DECL {
// We only support the "C" locale right now.
static constexpr size_t MAX_LOCALE_NAME_SIZE = 2;
struct __locale_data {
char name[MAX_LOCALE_NAME_SIZE];
};
// The pointer to the default "C" locale.
extern __locale_t c_locale;
// The global locale instance.
LIBC_THREAD_LOCAL extern locale_t locale;
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_LOCALE_LOCALECONV_H

View File

@ -0,0 +1,49 @@
//===-- Implementation of localeconv --------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "src/locale/localeconv.h"
#include "src/__support/CPP/limits.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
static char DOT_STRING[] = ".";
static char EMPTY_STRING[] = "";
static struct lconv C_LCONV = {
.decimal_point = DOT_STRING,
.thousands_sep = EMPTY_STRING,
.grouping = EMPTY_STRING,
.mon_decimal_point = EMPTY_STRING,
.mon_thousands_sep = EMPTY_STRING,
.mon_grouping = EMPTY_STRING,
.positive_sign = EMPTY_STRING,
.negative_sign = EMPTY_STRING,
.currency_symbol = EMPTY_STRING,
.frac_digits = CHAR_MAX,
.p_cs_precedes = CHAR_MAX,
.n_cs_precedes = CHAR_MAX,
.p_sep_by_space = CHAR_MAX,
.n_sep_by_space = CHAR_MAX,
.p_sign_posn = CHAR_MAX,
.n_sign_posn = CHAR_MAX,
.int_curr_symbol = EMPTY_STRING,
.int_frac_digits = CHAR_MAX,
.int_p_cs_precedes = CHAR_MAX,
.int_n_cs_precedes = CHAR_MAX,
.int_p_sep_by_space = CHAR_MAX,
.int_n_sep_by_space = CHAR_MAX,
.int_p_sign_posn = CHAR_MAX,
.int_n_sign_posn = CHAR_MAX,
};
LLVM_LIBC_FUNCTION(struct lconv *, localeconv, ()) { return &C_LCONV; }
} // namespace LIBC_NAMESPACE_DECL

View File

@ -0,0 +1,22 @@
//===-- Implementation header for localeconv --------------------*- 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_SRC_LOCALE_LOCALECONV_H
#define LLVM_LIBC_SRC_LOCALE_LOCALECONV_H
#include "src/__support/macros/config.h"
#include "include/llvm-libc-types/struct_lconv.h"
namespace LIBC_NAMESPACE_DECL {
struct lconv *localeconv();
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_LOCALE_LOCALECONV_H

View File

@ -0,0 +1,28 @@
//===-- Implementation of newlocale ---------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "src/locale/newlocale.h"
#include "include/llvm-libc-macros/locale-macros.h"
#include "src/locale/locale.h"
#include "src/__support/CPP/string_view.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(locale_t, newlocale,
(int category_mask, const char *locale_name, locale_t)) {
cpp::string_view name(locale_name);
if (category_mask > LC_ALL || (!name.empty() && name != "C"))
return nullptr;
return &c_locale;
}
} // namespace LIBC_NAMESPACE_DECL

View File

@ -0,0 +1,22 @@
//===-- Implementation header for setlocale ---------------------*- 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_SRC_LOCALE_SETLOCALE_H
#define LLVM_LIBC_SRC_LOCALE_SETLOCALE_H
#include "src/__support/macros/config.h"
#include "hdr/types/locale_t.h"
namespace LIBC_NAMESPACE_DECL {
locale_t newlocale(int category_mask, const char *locale_name, locale_t base);
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_LOCALE_SETLOCALE_H

View File

@ -0,0 +1,28 @@
//===-- Implementation of setlocale ---------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "src/locale/setlocale.h"
#include "include/llvm-libc-macros/locale-macros.h"
#include "src/locale/locale.h"
#include "src/__support/CPP/string_view.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(char *, setlocale, (int category, const char *locale_name)) {
cpp::string_view name(locale_name);
if (category > LC_ALL || (!name.empty() && name != "C"))
return nullptr;
static char locale_str[] = "C";
return locale_str;
}
} // namespace LIBC_NAMESPACE_DECL

View File

@ -0,0 +1,22 @@
//===-- Implementation header for setlocale ---------------------*- 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_SRC_LOCALE_SETLOCALE_H
#define LLVM_LIBC_SRC_LOCALE_SETLOCALE_H
#include "src/__support/macros/config.h"
#include "hdr/types/locale_t.h"
namespace LIBC_NAMESPACE_DECL {
char *setlocale(int category, const char *locale_name);
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_LOCALE_SETLOCALE_H

View File

@ -0,0 +1,23 @@
//===-- Implementation of uselocale ---------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "src/locale/uselocale.h"
#include "src/locale/locale.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(locale_t, uselocale, (locale_t newloc)) {
if (!newloc)
return locale;
return locale = newloc;
}
} // namespace LIBC_NAMESPACE_DECL

View File

@ -0,0 +1,22 @@
//===-- Implementation header for uselocale ---------------------*- 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_SRC_LOCALE_USELOCALE_H
#define LLVM_LIBC_SRC_LOCALE_USELOCALE_H
#include "src/__support/macros/config.h"
#include "hdr/types/locale_t.h"
namespace LIBC_NAMESPACE_DECL {
locale_t uselocale(locale_t newloc);
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_LOCALE_USELOCALE_H

View File

@ -82,6 +82,7 @@ add_subdirectory(setjmp)
add_subdirectory(signal)
add_subdirectory(spawn)
add_subdirectory(time)
add_subdirectory(locale)
if(${LIBC_TARGET_OS} STREQUAL "linux")
add_subdirectory(pthread)

View File

@ -0,0 +1,25 @@
add_custom_target(libc-locale-tests)
add_libc_test(
locale_test
SUITE
libc-locale-tests
SRCS
locale_test.cpp
DEPENDS
libc.include.locale
libc.src.locale.newlocale
libc.src.locale.uselocale
libc.src.locale.freelocale
)
add_libc_test(
localeconv_test
SUITE
libc-locale-tests
SRCS
localeconv_test.cpp
DEPENDS
libc.include.locale
libc.src.locale.localeconv
)

View File

@ -0,0 +1,27 @@
//===-- Unittests for locale ----------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "src/locale/freelocale.h"
#include "src/locale/newlocale.h"
#include "src/locale/uselocale.h"
#include "test/UnitTest/Test.h"
#include "include/llvm-libc-macros/locale-macros.h"
TEST(LlvmLibcLocale, DefaultLocale) {
locale_t new_locale = LIBC_NAMESPACE::newlocale(LC_ALL, "C", nullptr);
EXPECT_NE(new_locale, static_cast<locale_t>(nullptr));
locale_t old_locale = LIBC_NAMESPACE::uselocale(new_locale);
EXPECT_NE(old_locale, static_cast<locale_t>(nullptr));
LIBC_NAMESPACE::freelocale(new_locale);
LIBC_NAMESPACE::uselocale(old_locale);
}

View File

@ -0,0 +1,17 @@
//===-- Unittests for localeconv ------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "include/llvm-libc-macros/locale-macros.h"
#include "src/locale/localeconv.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcLocale, DefaultLocale) {
struct lconv *conv = LIBC_NAMESPACE::localeconv();
EXPECT_STREQ(conv->decimal_point, ".");
}