X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/3d9156a7a519a5e3aa1b92e9d9d4b991f1aed7ff..15de9d6b4ab2de27ae24b13b7b6c4d55fffe4aef:/locale/FreeBSD/lmonetary.c?ds=inline diff --git a/locale/FreeBSD/lmonetary.c b/locale/FreeBSD/lmonetary.c index e3e7095..24091ea 100644 --- a/locale/FreeBSD/lmonetary.c +++ b/locale/FreeBSD/lmonetary.c @@ -27,14 +27,16 @@ #include __FBSDID("$FreeBSD: src/lib/libc/locale/lmonetary.c,v 1.19 2003/06/26 10:46:16 phantom Exp $"); +#include "xlocale_private.h" + #include #include #include +#include #include "ldpart.h" #include "lmonetary.h" -extern int __mlocale_changed; extern const char * __fix_locale_grouping_str(const char *); #define LCMONETARY_SIZE_FULL (sizeof(struct lc_monetary_T) / sizeof(char *)) @@ -50,7 +52,7 @@ static const struct lc_monetary_T _C_monetary_locale = { empty, /* currency_symbol */ empty, /* mon_decimal_point */ empty, /* mon_thousands_sep */ - numempty, /* mon_grouping */ + empty, /* mon_grouping [C99 7.11.2.1]*/ empty, /* positive_sign */ empty, /* negative_sign */ numempty, /* int_frac_digits */ @@ -69,10 +71,6 @@ static const struct lc_monetary_T _C_monetary_locale = { numempty /* int_n_sign_posn */ }; -static struct lc_monetary_T _monetary_locale; -static int _monetary_using_locale; -static char *_monetary_locale_buf; - static char cnv(const char *str) { @@ -83,23 +81,57 @@ cnv(const char *str) return ((char)i); } -int -__monetary_load_locale(const char *name) +__private_extern__ int +__monetary_load_locale(const char *name, locale_t loc) { int ret; + struct __xlocale_st_monetary *xp; + static struct __xlocale_st_monetary *cache = NULL; + + /* 'name' must be already checked. */ + if (strcmp(name, "C") == 0 || strcmp(name, "POSIX") == 0) { + if (!loc->_monetary_using_locale) + return (_LDP_CACHE); + loc->_monetary_using_locale = 0; + XL_RELEASE(loc->__lc_monetary); + loc->__lc_monetary = NULL; + loc->__mlocale_changed = 1; + return (_LDP_CACHE); + } - ret = __part_load_locale(name, &_monetary_using_locale, - &_monetary_locale_buf, "LC_MONETARY", + if (loc->_monetary_using_locale && strcmp(name, loc->__lc_monetary->_monetary_locale_buf) == 0) + return (_LDP_CACHE); + /* + * If the locale name is the same as our cache, use the cache. + */ + if (cache && cache->_monetary_locale_buf && strcmp(name, cache->_monetary_locale_buf) == 0) { + loc->_monetary_using_locale = 1; + XL_RELEASE(loc->__lc_monetary); + loc->__lc_monetary = cache; + XL_RETAIN(loc->__lc_monetary); + loc->__mlocale_changed = 1; + return (_LDP_CACHE); + } + if ((xp = (struct __xlocale_st_monetary *)malloc(sizeof(*xp))) == NULL) + return _LDP_ERROR; + xp->__refcount = 1; + xp->__free_extra = (__free_extra_t)__ldpart_free_extra; + xp->_monetary_locale_buf = NULL; + + ret = __part_load_locale(name, &loc->_monetary_using_locale, + &xp->_monetary_locale_buf, "LC_MONETARY", LCMONETARY_SIZE_FULL, LCMONETARY_SIZE_MIN, - (const char **)&_monetary_locale); + (const char **)&xp->_monetary_locale); if (ret != _LDP_ERROR) - __mlocale_changed = 1; + loc->__mlocale_changed = 1; + else + free(xp); if (ret == _LDP_LOADED) { - _monetary_locale.mon_grouping = - __fix_locale_grouping_str(_monetary_locale.mon_grouping); + xp->_monetary_locale.mon_grouping = + __fix_locale_grouping_str(xp->_monetary_locale.mon_grouping); -#define M_ASSIGN_CHAR(NAME) (((char *)_monetary_locale.NAME)[0] = \ - cnv(_monetary_locale.NAME)) +#define M_ASSIGN_CHAR(NAME) (((char *)xp->_monetary_locale.NAME)[0] = \ + cnv(xp->_monetary_locale.NAME)) M_ASSIGN_CHAR(int_frac_digits); M_ASSIGN_CHAR(frac_digits); @@ -117,9 +149,9 @@ __monetary_load_locale(const char *name) */ #define M_ASSIGN_ICHAR(NAME) \ do { \ - if (_monetary_locale.int_##NAME == NULL) \ - _monetary_locale.int_##NAME = \ - _monetary_locale.NAME; \ + if (xp->_monetary_locale.int_##NAME == NULL) \ + xp->_monetary_locale.int_##NAME = \ + xp->_monetary_locale.NAME; \ else \ M_ASSIGN_CHAR(int_##NAME); \ } while (0) @@ -130,21 +162,27 @@ __monetary_load_locale(const char *name) M_ASSIGN_ICHAR(n_sep_by_space); M_ASSIGN_ICHAR(p_sign_posn); M_ASSIGN_ICHAR(n_sign_posn); + XL_RELEASE(loc->__lc_monetary); + loc->__lc_monetary = xp; + XL_RELEASE(cache); + cache = xp; + XL_RETAIN(cache); } return (ret); } -struct lc_monetary_T * -__get_current_monetary_locale(void) +__private_extern__ struct lc_monetary_T * +__get_current_monetary_locale(locale_t loc) { - return (_monetary_using_locale - ? &_monetary_locale + return (loc->_monetary_using_locale + ? &loc->__lc_monetary->_monetary_locale : (struct lc_monetary_T *)&_C_monetary_locale); } #ifdef LOCALE_DEBUG void monetdebug() { +locale_t loc = __current_locale(); printf( "int_curr_symbol = %s\n" "currency_symbol = %s\n" "mon_decimal_point = %s\n" @@ -166,27 +204,27 @@ printf( "int_curr_symbol = %s\n" "int_n_sep_by_space = %d\n" "int_p_sign_posn = %d\n" "int_n_sign_posn = %d\n", - _monetary_locale.int_curr_symbol, - _monetary_locale.currency_symbol, - _monetary_locale.mon_decimal_point, - _monetary_locale.mon_thousands_sep, - _monetary_locale.mon_grouping, - _monetary_locale.positive_sign, - _monetary_locale.negative_sign, - _monetary_locale.int_frac_digits[0], - _monetary_locale.frac_digits[0], - _monetary_locale.p_cs_precedes[0], - _monetary_locale.p_sep_by_space[0], - _monetary_locale.n_cs_precedes[0], - _monetary_locale.n_sep_by_space[0], - _monetary_locale.p_sign_posn[0], - _monetary_locale.n_sign_posn[0], - _monetary_locale.int_p_cs_precedes[0], - _monetary_locale.int_p_sep_by_space[0], - _monetary_locale.int_n_cs_precedes[0], - _monetary_locale.int_n_sep_by_space[0], - _monetary_locale.int_p_sign_posn[0], - _monetary_locale.int_n_sign_posn[0] + loc->__lc_monetary->_monetary_locale.int_curr_symbol, + loc->__lc_monetary->_monetary_locale.currency_symbol, + loc->__lc_monetary->_monetary_locale.mon_decimal_point, + loc->__lc_monetary->_monetary_locale.mon_thousands_sep, + loc->__lc_monetary->_monetary_locale.mon_grouping, + loc->__lc_monetary->_monetary_locale.positive_sign, + loc->__lc_monetary->_monetary_locale.negative_sign, + loc->__lc_monetary->_monetary_locale.int_frac_digits[0], + loc->__lc_monetary->_monetary_locale.frac_digits[0], + loc->__lc_monetary->_monetary_locale.p_cs_precedes[0], + loc->__lc_monetary->_monetary_locale.p_sep_by_space[0], + loc->__lc_monetary->_monetary_locale.n_cs_precedes[0], + loc->__lc_monetary->_monetary_locale.n_sep_by_space[0], + loc->__lc_monetary->_monetary_locale.p_sign_posn[0], + loc->__lc_monetary->_monetary_locale.n_sign_posn[0], + loc->__lc_monetary->_monetary_locale.int_p_cs_precedes[0], + loc->__lc_monetary->_monetary_locale.int_p_sep_by_space[0], + loc->__lc_monetary->_monetary_locale.int_n_cs_precedes[0], + loc->__lc_monetary->_monetary_locale.int_n_sep_by_space[0], + loc->__lc_monetary->_monetary_locale.int_p_sign_posn[0], + loc->__lc_monetary->_monetary_locale.int_n_sign_posn[0] ); } #endif /* LOCALE_DEBUG */