@@ -223,19 +223,25 @@ struct lconv* localeconv(void) {
223223 std::string numeric_locale = current_loc->categories [LC_NUMERIC];
224224 std::string monetary_locale = current_loc->categories [LC_MONETARY];
225225
226- if ((numeric_locale == cobalt::kCLocale ||
227- numeric_locale == cobalt::kPosixLocale ) &&
228- (monetary_locale == cobalt::kCLocale ||
229- monetary_locale == cobalt::kPosixLocale )) {
230- current_lconv->ResetToC ();
231- return &(current_lconv->result );
226+ bool is_c_or_posix_numeric_locale = (numeric_locale == cobalt::kCLocale ||
227+ numeric_locale == cobalt::kPosixLocale );
228+ if (is_c_or_posix_numeric_locale) {
229+ current_lconv->ResetNumericToC ();
230+ } else if (!cobalt::UpdateNumericLconv (numeric_locale, current_lconv)) {
231+ SB_LOG (WARNING)
232+ << " Failed to retrieve lconv numeric values. Returning C values." ;
233+ current_lconv->ResetNumericToC ();
232234 }
233235
234- if (!cobalt::UpdateNumericLconv (numeric_locale, current_lconv) ||
235- !cobalt::UpdateMonetaryLconv (monetary_locale, current_lconv)) {
236- SB_LOG (WARNING) << " Failed to properly retrieve the updated lconv struct. "
237- " Returning the C lconv." ;
238- current_lconv->ResetToC ();
236+ bool is_c_or_posix_monetary_locale =
237+ (monetary_locale == cobalt::kCLocale ||
238+ monetary_locale == cobalt::kPosixLocale );
239+ if (is_c_or_posix_monetary_locale) {
240+ current_lconv->ResetMonetaryToC ();
241+ } else if (!cobalt::UpdateMonetaryLconv (monetary_locale, current_lconv)) {
242+ SB_LOG (WARNING)
243+ << " Failed to retrieve lconv monetary values. Returning C values." ;
244+ current_lconv->ResetMonetaryToC ();
239245 }
240246
241247 return &(current_lconv->result );
@@ -268,8 +274,7 @@ char* nl_langinfo_l(nl_item item, locale_t locale) {
268274 case AM_STR:
269275 case PM_STR:
270276 langinfo_buffer = cobalt::GetLocalizedDateSymbol (
271- cur_locale->categories [LC_TIME], cobalt::TimeNameType::kAmPm ,
272- item - AM_STR);
277+ cur_locale->categories [LC_TIME], cobalt::TimeNameType::kAmPm , item);
273278 break ;
274279
275280 // Days
@@ -281,8 +286,7 @@ char* nl_langinfo_l(nl_item item, locale_t locale) {
281286 case DAY_6:
282287 case DAY_7:
283288 langinfo_buffer = cobalt::GetLocalizedDateSymbol (
284- cur_locale->categories [LC_TIME], cobalt::TimeNameType::kDay ,
285- item - DAY_1);
289+ cur_locale->categories [LC_TIME], cobalt::TimeNameType::kDay , item);
286290 break ;
287291
288292 // Abbreviated days
@@ -295,7 +299,7 @@ char* nl_langinfo_l(nl_item item, locale_t locale) {
295299 case ABDAY_7:
296300 langinfo_buffer = cobalt::GetLocalizedDateSymbol (
297301 cur_locale->categories [LC_TIME], cobalt::TimeNameType::kAbbrevDay ,
298- item - ABDAY_1 );
302+ item);
299303 break ;
300304
301305 // Months
@@ -312,8 +316,7 @@ char* nl_langinfo_l(nl_item item, locale_t locale) {
312316 case MON_11:
313317 case MON_12:
314318 langinfo_buffer = cobalt::GetLocalizedDateSymbol (
315- cur_locale->categories [LC_TIME], cobalt::TimeNameType::kMonth ,
316- item - MON_1);
319+ cur_locale->categories [LC_TIME], cobalt::TimeNameType::kMonth , item);
317320 break ;
318321
319322 // Abbreviated months
@@ -331,7 +334,7 @@ char* nl_langinfo_l(nl_item item, locale_t locale) {
331334 case ABMON_12:
332335 langinfo_buffer = cobalt::GetLocalizedDateSymbol (
333336 cur_locale->categories [LC_TIME], cobalt::TimeNameType::kAbbrevMonth ,
334- item - ABMON_1 );
337+ item);
335338 break ;
336339 case RADIXCHAR:
337340 case THOUSEP:
0 commit comments