Changeset View
Changeset View
Standalone View
Standalone View
lib/libc/locale/localeconv.c
Show First 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | |||||
* Return the current locale conversion. | * Return the current locale conversion. | ||||
*/ | */ | ||||
struct lconv * | struct lconv * | ||||
localeconv_l(locale_t loc) | localeconv_l(locale_t loc) | ||||
{ | { | ||||
FIX_LOCALE(loc); | FIX_LOCALE(loc); | ||||
struct lconv *ret = &loc->lconv; | struct lconv *ret = &loc->lconv; | ||||
if (loc->monetary_locale_changed) { | if (atomic_load_acq_int(&loc->monetary_locale_changed) != 0) { | ||||
/* LC_MONETARY part */ | /* LC_MONETARY part */ | ||||
struct lc_monetary_T * mptr; | struct lc_monetary_T * mptr; | ||||
#define M_ASSIGN_STR(NAME) (ret->NAME = (char*)mptr->NAME) | #define M_ASSIGN_STR(NAME) (ret->NAME = (char*)mptr->NAME) | ||||
#define M_ASSIGN_CHAR(NAME) (ret->NAME = mptr->NAME[0]) | #define M_ASSIGN_CHAR(NAME) (ret->NAME = mptr->NAME[0]) | ||||
mptr = __get_current_monetary_locale(loc); | mptr = __get_current_monetary_locale(loc); | ||||
M_ASSIGN_STR(int_curr_symbol); | M_ASSIGN_STR(int_curr_symbol); | ||||
Show All 12 Lines | #define M_ASSIGN_CHAR(NAME) (ret->NAME = mptr->NAME[0]) | ||||
M_ASSIGN_CHAR(p_sign_posn); | M_ASSIGN_CHAR(p_sign_posn); | ||||
M_ASSIGN_CHAR(n_sign_posn); | M_ASSIGN_CHAR(n_sign_posn); | ||||
M_ASSIGN_CHAR(int_p_cs_precedes); | M_ASSIGN_CHAR(int_p_cs_precedes); | ||||
M_ASSIGN_CHAR(int_n_cs_precedes); | M_ASSIGN_CHAR(int_n_cs_precedes); | ||||
M_ASSIGN_CHAR(int_p_sep_by_space); | M_ASSIGN_CHAR(int_p_sep_by_space); | ||||
M_ASSIGN_CHAR(int_n_sep_by_space); | M_ASSIGN_CHAR(int_n_sep_by_space); | ||||
M_ASSIGN_CHAR(int_p_sign_posn); | M_ASSIGN_CHAR(int_p_sign_posn); | ||||
M_ASSIGN_CHAR(int_n_sign_posn); | M_ASSIGN_CHAR(int_n_sign_posn); | ||||
loc->monetary_locale_changed = 0; | atomic_store_int(&loc->monetary_locale_changed, 0); | ||||
} | } | ||||
if (loc->numeric_locale_changed) { | if (atomic_load_acq_int(&loc->numeric_locale_changed) != 0) { | ||||
/* LC_NUMERIC part */ | /* LC_NUMERIC part */ | ||||
struct lc_numeric_T * nptr; | struct lc_numeric_T * nptr; | ||||
#define N_ASSIGN_STR(NAME) (ret->NAME = (char*)nptr->NAME) | #define N_ASSIGN_STR(NAME) (ret->NAME = (char*)nptr->NAME) | ||||
nptr = __get_current_numeric_locale(loc); | nptr = __get_current_numeric_locale(loc); | ||||
N_ASSIGN_STR(decimal_point); | N_ASSIGN_STR(decimal_point); | ||||
N_ASSIGN_STR(thousands_sep); | N_ASSIGN_STR(thousands_sep); | ||||
N_ASSIGN_STR(grouping); | N_ASSIGN_STR(grouping); | ||||
loc->numeric_locale_changed = 0; | atomic_store_int(&loc->numeric_locale_changed, 0); | ||||
} | } | ||||
return ret; | return ret; | ||||
} | } | ||||
struct lconv * | struct lconv * | ||||
localeconv(void) | localeconv(void) | ||||
{ | { | ||||
return localeconv_l(__get_locale()); | return localeconv_l(__get_locale()); | ||||
} | } |