Files
RedBear-OS/local/patches/relibc/P3-locale-getlocalename-l.patch
T

40 lines
1.2 KiB
Diff

--- a/src/header/locale/mod.rs
+++ b/src/header/locale/mod.rs
@@ -111,6 +111,36 @@ pub unsafe extern "C" fn uselocale(newloc: locale_t) -> locale_t {
old_loc
}
+#[unsafe(no_mangle)]
+pub unsafe extern "C" fn getlocalename_l(category: c_int, loc: locale_t) -> *const c_char {
+ if loc.is_null() {
+ return ptr::null();
+ }
+
+ if loc == LC_GLOBAL_LOCALE {
+ if unsafe { GLOBAL_LOCALE.is_null() } {
+ return (&raw const C_LOCALE).cast::<c_char>();
+ }
+
+ let Some(global) = (unsafe { GLOBAL_LOCALE.as_ref() }) else {
+ return ptr::null();
+ };
+ return global
+ .get_name(category)
+ .map_or(ptr::null(), |name| name.as_ptr());
+ }
+
+ if !(LC_COLLATE..=LC_ALL).contains(&category) {
+ return ptr::null();
+ }
+
+ let loc = loc.cast_const().cast::<LocaleData>();
+ let Some(loc) = (unsafe { loc.as_ref() }) else {
+ return ptr::null();
+ };
+ loc.name.as_ptr()
+}
+
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/newlocale.html>.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn newlocale(mask: c_int, locale: *const c_char, base: locale_t) -> locale_t {