40 lines
1.2 KiB
Diff
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 {
|