Print this page
2964 need POSIX 2008 locale object support

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libc/port/locale/lmonetary.c
          +++ new/usr/src/lib/libc/port/locale/lmonetary.c
   1    1  /*
   2    2   * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
   3    3   * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
   4    4   * All rights reserved.
   5    5   *
        6 + * Copyright (c) 2011 The FreeBSD Foundation
        7 + * All rights reserved.
        8 + * Portions of this software were developed by David Chisnall
        9 + * under sponsorship from the FreeBSD Foundation.
       10 + *
   6   11   * Redistribution and use in source and binary forms, with or without
   7   12   * modification, are permitted provided that the following conditions
   8   13   * are met:
   9   14   * 1. Redistributions of source code must retain the above copyright
  10   15   *    notice, this list of conditions and the following disclaimer.
  11   16   * 2. Redistributions in binary form must reproduce the above copyright
  12   17   *    notice, this list of conditions and the following disclaimer in the
  13   18   *    documentation and/or other materials provided with the distribution.
  14   19   *
  15   20   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
↓ open down ↓ 6 lines elided ↑ open up ↑
  22   27   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23   28   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24   29   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25   30   * SUCH DAMAGE.
  26   31   */
  27   32  
  28   33  #include "lint.h"
  29   34  #include <limits.h>
  30   35  #include <stddef.h>
  31   36  #include <stdlib.h>
       37 +
  32   38  #include "ldpart.h"
  33   39  #include "lmonetary.h"
  34   40  
  35      -extern int __mlocale_changed;
  36   41  extern const char *__fix_locale_grouping_str(const char *);
  37   42  
  38   43  #define LCMONETARY_SIZE_FULL (sizeof (struct lc_monetary_T) / sizeof (char *))
  39   44  #define LCMONETARY_SIZE_MIN \
  40   45          (offsetof(struct lc_monetary_T, int_p_cs_precedes) / sizeof (char *))
  41   46  
  42   47  static char     empty[] = "";
  43   48  static char     numempty[] = { CHAR_MAX, '\0' };
  44   49  
  45   50  static const struct lc_monetary_T _C_monetary_locale = {
↓ open down ↓ 17 lines elided ↑ open up ↑
  63   68          numempty,       /* int_p_sep_by_space */
  64   69          numempty,       /* int_n_sep_by_space */
  65   70          numempty,       /* int_p_sign_posn */
  66   71          numempty        /* int_n_sign_posn */
  67   72  };
  68   73  
  69   74  static struct lc_monetary_T _monetary_locale;
  70   75  static int      _monetary_using_locale;
  71   76  static char     *_monetary_locale_buf;
  72   77  
       78 +struct xlocale_monetary __xlocale_global_monetary;
       79 +
  73   80  static char
  74   81  cnv(const char *str)
  75   82  {
  76   83          int i = strtol(str, NULL, 10);
  77   84  
  78   85          if (i == -1)
  79   86                  i = CHAR_MAX;
  80   87          return ((char)i);
  81   88  }
  82   89  
  83      -int
  84      -__monetary_load_locale(const char *name)
       90 +static void
       91 +destruct_monetary(void *v)
       92 +{
       93 +        struct xlocale_monetary *l = v;
       94 +
       95 +        if (l->buffer != NULL)
       96 +                free(l->buffer);
       97 +
       98 +        free(l);
       99 +}
      100 +
      101 +static int
      102 +monetary_load_locale_l(struct xlocale_monetary *loc, int *using_locale,
      103 +    int *changed, const char *name)
  85  104  {
  86  105          int ret;
      106 +        struct lc_monetary_T *l = &loc->locale;
  87  107  
  88      -        ret = __part_load_locale(name, &_monetary_using_locale,
  89      -            &_monetary_locale_buf, "LC_MONETARY",
      108 +        ret = __part_load_locale(name, using_locale,
      109 +            &loc->buffer, "LC_MONETARY",
  90  110              LCMONETARY_SIZE_FULL, LCMONETARY_SIZE_MIN,
  91      -            (const char **)&_monetary_locale);
      111 +            (const char **)l);
  92  112          if (ret != _LDP_ERROR)
  93      -                __mlocale_changed = 1;
      113 +                *changed = 1;
  94  114          if (ret == _LDP_LOADED) {
  95      -                _monetary_locale.mon_grouping =
  96      -                    __fix_locale_grouping_str(_monetary_locale.mon_grouping);
      115 +                l->mon_grouping =
      116 +                    __fix_locale_grouping_str(l->mon_grouping);
  97  117  
  98  118  #define M_ASSIGN_CHAR(NAME) \
  99      -                (((char *)_monetary_locale.NAME)[0] = \
 100      -                        cnv(_monetary_locale.NAME))
      119 +                (((char *)l->NAME)[0] = \
      120 +                        cnv(l->NAME))
 101  121  
 102  122                  M_ASSIGN_CHAR(int_frac_digits);
 103  123                  M_ASSIGN_CHAR(frac_digits);
 104  124                  M_ASSIGN_CHAR(p_cs_precedes);
 105  125                  M_ASSIGN_CHAR(p_sep_by_space);
 106  126                  M_ASSIGN_CHAR(n_cs_precedes);
 107  127                  M_ASSIGN_CHAR(n_sep_by_space);
 108  128                  M_ASSIGN_CHAR(p_sign_posn);
 109  129                  M_ASSIGN_CHAR(n_sign_posn);
 110  130  
 111  131                  /*
 112  132                   * The six additional C99 international monetary formatting
 113  133                   * parameters default to the national parameters when
 114  134                   * reading FreeBSD LC_MONETARY data files.
 115  135                   */
 116  136  #define M_ASSIGN_ICHAR(NAME)                                    \
 117      -                if (_monetary_locale.int_##NAME == NULL)        \
 118      -                        _monetary_locale.int_##NAME =           \
 119      -                            _monetary_locale.NAME;              \
 120      -                else                                            \
 121      -                        M_ASSIGN_CHAR(int_##NAME);
      137 +                do {                                            \
      138 +                        if (l->int_##NAME == NULL)              \
      139 +                                l->int_##NAME =                 \
      140 +                                    l->NAME;                    \
      141 +                        else                                    \
      142 +                                M_ASSIGN_CHAR(int_##NAME);      \
      143 +                } while (0)
 122  144  
 123  145                  M_ASSIGN_ICHAR(p_cs_precedes);
 124  146                  M_ASSIGN_ICHAR(n_cs_precedes);
 125  147                  M_ASSIGN_ICHAR(p_sep_by_space);
 126  148                  M_ASSIGN_ICHAR(n_sep_by_space);
 127  149                  M_ASSIGN_ICHAR(p_sign_posn);
 128  150                  M_ASSIGN_ICHAR(n_sign_posn);
 129  151          }
 130  152          return (ret);
 131  153  }
 132  154  
      155 +int
      156 +__monetary_load_locale(const char *name)
      157 +{
      158 +        return (monetary_load_locale_l(&__xlocale_global_monetary,
      159 +            &__xlocale_global_locale.using_monetary_locale,
      160 +            &__xlocale_global_locale.monetary_locale_changed, name));
      161 +}
      162 +
      163 +void *
      164 +__monetary_load(const char *name, locale_t loc)
      165 +{
      166 +        struct xlocale_monetary *new;
      167 +
      168 +        new = calloc(sizeof(struct xlocale_monetary), 1);
      169 +        if (new == NULL)
      170 +                return (NULL);
      171 +
      172 +        new->header.header.destructor = destruct_monetary;
      173 +        if (monetary_load_locale_l(new, &loc->using_monetary_locale,
      174 +            &loc->monetary_locale_changed, name) == _LDP_ERROR) {
      175 +                xlocale_release(new);
      176 +                return (NULL);
      177 +        }
      178 +
      179 +        return (NULL);
      180 +}
      181 +
 133  182  struct lc_monetary_T *
 134      -__get_current_monetary_locale(void)
      183 +__get_current_monetary_locale(locale_t loc)
 135  184  {
 136      -        return (_monetary_using_locale ? &_monetary_locale :
 137      -            (struct lc_monetary_T *)&_C_monetary_locale);
      185 +        return (loc->using_monetary_locale
      186 +            ? &((struct xlocale_monetary*)loc->components[XLC_MONETARY])->locale
      187 +            : (struct lc_monetary_T *)&_C_monetary_locale);
 138  188  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX