1 #![cfg(all(
2     feature = "with-system-locale",
3     unix,
4     not(any(
5         target_os = "dragonfly",
6         target_os = "freebsd",
7         target_os = "ios",
8         target_os = "macos",
9         target_os = "openbsd",
10         target_os = "netbsd"
11     ))
12 ))]
13 
14 use std::env;
15 
16 use libc::{c_char, c_void};
17 
18 use crate::error::Error;
19 use crate::system_locale::unix::{Encoding, Lconv, StaticCString, UTF_8};
20 
21 extern "C" {
localeconv() -> *const libc::lconv22     fn localeconv() -> *const libc::lconv;
nl_langinfo(item: libc::nl_item) -> *const c_char23     fn nl_langinfo(item: libc::nl_item) -> *const c_char;
24 }
25 
get_encoding(_locale: *const c_void) -> Result<Encoding, Error>26 pub(crate) fn get_encoding(_locale: *const c_void) -> Result<Encoding, Error> {
27     let encoding_ptr = unsafe { nl_langinfo(libc::CODESET) };
28     let encoding_static_c_string = StaticCString::new(encoding_ptr, *UTF_8, "nl_langinfo")?;
29     let encoding_string = encoding_static_c_string.to_string()?;
30     let encoding = Encoding::from_bytes(encoding_string.as_bytes())?;
31     Ok(encoding)
32 }
33 
get_lconv(_locale: *const c_void, encoding: Encoding) -> Result<Lconv, Error>34 pub(crate) fn get_lconv(_locale: *const c_void, encoding: Encoding) -> Result<Lconv, Error> {
35     let lconv_ptr = unsafe { localeconv() };
36     if lconv_ptr.is_null() {
37         return Err(Error::system_invalid_return(
38             "localeconv_l",
39             "localeconv_l unexpectedly returned a null pointer.",
40         ));
41     }
42     let lconv: &libc::lconv = unsafe { lconv_ptr.as_ref() }.unwrap();
43     let lconv = Lconv::new(lconv, encoding)?;
44     Ok(lconv)
45 }
46 
get_name(_locale: *const c_void, _encoding: Encoding) -> Result<String, Error>47 pub(crate) fn get_name(_locale: *const c_void, _encoding: Encoding) -> Result<String, Error> {
48     if let Ok(name) = env::var("LC_ALL") {
49         return Ok(name);
50     }
51     if let Ok(name) = env::var("LC_NUMERIC") {
52         return Ok(name);
53     }
54     if let Ok(name) = env::var("LC_MONETARY") {
55         return Ok(name);
56     }
57     if let Ok(name) = env::var("LANG") {
58         return Ok(name);
59     }
60     Ok("C".to_string())
61 }
62