--- 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::(); + } + + 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::(); + let Some(loc) = (unsafe { loc.as_ref() }) else { + return ptr::null(); + }; + loc.name.as_ptr() +} + /// See . #[unsafe(no_mangle)] pub unsafe extern "C" fn newlocale(mask: c_int, locale: *const c_char, base: locale_t) -> locale_t {