Print this page
2964 need POSIX 2008 locale object support

*** 1,10 **** --- 1,15 ---- /* * Copyright 2010 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org> * All rights reserved. * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * Portions of this software were developed by David Chisnall + * under sponsorship from the FreeBSD Foundation. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer.
*** 27,40 **** #include "lint.h" #include <limits.h> #include <stddef.h> #include <stdlib.h> #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 *)) #define LCMONETARY_SIZE_MIN \ (offsetof(struct lc_monetary_T, int_p_cs_precedes) / sizeof (char *)) --- 32,45 ---- #include "lint.h" #include <limits.h> #include <stddef.h> #include <stdlib.h> + #include "ldpart.h" #include "lmonetary.h" extern const char *__fix_locale_grouping_str(const char *); #define LCMONETARY_SIZE_FULL (sizeof (struct lc_monetary_T) / sizeof (char *)) #define LCMONETARY_SIZE_MIN \ (offsetof(struct lc_monetary_T, int_p_cs_precedes) / sizeof (char *))
*** 68,105 **** static struct lc_monetary_T _monetary_locale; static int _monetary_using_locale; static char *_monetary_locale_buf; static char cnv(const char *str) { int i = strtol(str, NULL, 10); if (i == -1) i = CHAR_MAX; return ((char)i); } ! int ! __monetary_load_locale(const char *name) { int ret; ! ret = __part_load_locale(name, &_monetary_using_locale, ! &_monetary_locale_buf, "LC_MONETARY", LCMONETARY_SIZE_FULL, LCMONETARY_SIZE_MIN, ! (const char **)&_monetary_locale); if (ret != _LDP_ERROR) ! __mlocale_changed = 1; if (ret == _LDP_LOADED) { ! _monetary_locale.mon_grouping = ! __fix_locale_grouping_str(_monetary_locale.mon_grouping); #define M_ASSIGN_CHAR(NAME) \ ! (((char *)_monetary_locale.NAME)[0] = \ ! cnv(_monetary_locale.NAME)) M_ASSIGN_CHAR(int_frac_digits); M_ASSIGN_CHAR(frac_digits); M_ASSIGN_CHAR(p_cs_precedes); M_ASSIGN_CHAR(p_sep_by_space); --- 73,125 ---- static struct lc_monetary_T _monetary_locale; static int _monetary_using_locale; static char *_monetary_locale_buf; + struct xlocale_monetary __xlocale_global_monetary; + static char cnv(const char *str) { int i = strtol(str, NULL, 10); if (i == -1) i = CHAR_MAX; return ((char)i); } ! static void ! destruct_monetary(void *v) ! { ! struct xlocale_monetary *l = v; ! ! if (l->buffer != NULL) ! free(l->buffer); ! ! free(l); ! } ! ! static int ! monetary_load_locale_l(struct xlocale_monetary *loc, int *using_locale, ! int *changed, const char *name) { int ret; + struct lc_monetary_T *l = &loc->locale; ! ret = __part_load_locale(name, using_locale, ! &loc->buffer, "LC_MONETARY", LCMONETARY_SIZE_FULL, LCMONETARY_SIZE_MIN, ! (const char **)l); if (ret != _LDP_ERROR) ! *changed = 1; if (ret == _LDP_LOADED) { ! l->mon_grouping = ! __fix_locale_grouping_str(l->mon_grouping); #define M_ASSIGN_CHAR(NAME) \ ! (((char *)l->NAME)[0] = \ ! cnv(l->NAME)) M_ASSIGN_CHAR(int_frac_digits); M_ASSIGN_CHAR(frac_digits); M_ASSIGN_CHAR(p_cs_precedes); M_ASSIGN_CHAR(p_sep_by_space);
*** 112,126 **** * The six additional C99 international monetary formatting * parameters default to the national parameters when * reading FreeBSD LC_MONETARY data files. */ #define M_ASSIGN_ICHAR(NAME) \ ! if (_monetary_locale.int_##NAME == NULL) \ ! _monetary_locale.int_##NAME = \ ! _monetary_locale.NAME; \ else \ ! M_ASSIGN_CHAR(int_##NAME); M_ASSIGN_ICHAR(p_cs_precedes); M_ASSIGN_ICHAR(n_cs_precedes); M_ASSIGN_ICHAR(p_sep_by_space); M_ASSIGN_ICHAR(n_sep_by_space); --- 132,148 ---- * The six additional C99 international monetary formatting * parameters default to the national parameters when * reading FreeBSD LC_MONETARY data files. */ #define M_ASSIGN_ICHAR(NAME) \ ! do { \ ! if (l->int_##NAME == NULL) \ ! l->int_##NAME = \ ! l->NAME; \ else \ ! M_ASSIGN_CHAR(int_##NAME); \ ! } while (0) M_ASSIGN_ICHAR(p_cs_precedes); M_ASSIGN_ICHAR(n_cs_precedes); M_ASSIGN_ICHAR(p_sep_by_space); M_ASSIGN_ICHAR(n_sep_by_space);
*** 128,138 **** M_ASSIGN_ICHAR(n_sign_posn); } return (ret); } struct lc_monetary_T * ! __get_current_monetary_locale(void) { ! return (_monetary_using_locale ? &_monetary_locale : ! (struct lc_monetary_T *)&_C_monetary_locale); } --- 150,188 ---- M_ASSIGN_ICHAR(n_sign_posn); } return (ret); } + int + __monetary_load_locale(const char *name) + { + return (monetary_load_locale_l(&__xlocale_global_monetary, + &__xlocale_global_locale.using_monetary_locale, + &__xlocale_global_locale.monetary_locale_changed, name)); + } + + void * + __monetary_load(const char *name, locale_t loc) + { + struct xlocale_monetary *new; + + new = calloc(sizeof(struct xlocale_monetary), 1); + if (new == NULL) + return (NULL); + + new->header.header.destructor = destruct_monetary; + if (monetary_load_locale_l(new, &loc->using_monetary_locale, + &loc->monetary_locale_changed, name) == _LDP_ERROR) { + xlocale_release(new); + return (NULL); + } + + return (NULL); + } + struct lc_monetary_T * ! __get_current_monetary_locale(locale_t loc) { ! return (loc->using_monetary_locale ! ? &((struct xlocale_monetary*)loc->components[XLC_MONETARY])->locale ! : (struct lc_monetary_T *)&_C_monetary_locale); }