Print this page
2964 need POSIX 2008 locale object support

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libc/port/locale/lnumeric.c
          +++ new/usr/src/lib/libc/port/locale/lnumeric.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 ↓ 8 lines elided ↑ open up ↑
  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 "ldpart.h"
  31   36  #include "lnumeric.h"
  32   37  #include "../i18n/_locale.h"
  33   38  
  34      -extern int __nlocale_changed;
  35   39  extern const char *__fix_locale_grouping_str(const char *);
  36   40  
  37   41  #define LCNUMERIC_SIZE (sizeof (struct lc_numeric_T) / sizeof (char *))
  38   42  
  39   43  static char     numempty[] = { CHAR_MAX, '\0' };
  40   44  
  41   45  static const struct lc_numeric_T _C_numeric_locale = {
  42   46          ".",            /* decimal_point */
  43   47          "",             /* thousands_sep */
  44   48          numempty        /* grouping */
  45   49  };
  46   50  
  47      -static struct lc_numeric_T _numeric_locale;
  48      -static int      _numeric_using_locale;
  49      -static char     *_numeric_locale_buf;
  50      -
  51      -int
  52      -__numeric_load_locale(const char *name)
       51 +static void
       52 +destruct_numeric(void *v)
  53   53  {
  54      -        const struct lc_numeric_T *leg = &_C_numeric_locale;
       54 +        struct xlocale_numeric *l = v;
       55 +
       56 +        if (l->buffer != NULL)
       57 +                free(l->buffer);
  55   58  
       59 +        free(l);
       60 +}
       61 +
       62 +struct xlocale_numeric __xlocale_global_numeric;
       63 +
       64 +static int
       65 +numeric_load_locale(struct xlocale_numeric *loc, int *using_locale,
       66 +    int *changed, const char *name)
       67 +{
       68 +        int leg;
  56   69          int ret;
       70 +        struct lc_numeric_T *l = &loc->locale;
  57   71  
  58      -        ret = __part_load_locale(name, &_numeric_using_locale,
  59      -            &_numeric_locale_buf, "LC_NUMERIC", LCNUMERIC_SIZE, LCNUMERIC_SIZE,
  60      -            (const char **)&_numeric_locale);
  61      -        if (ret == _LDP_ERROR)
  62      -                return (_LDP_ERROR);
       72 +        ret = __part_load_locale(name, using_locale,
       73 +            &loc->buffer, "LC_NUMERIC",
       74 +            LCNUMERIC_SIZE, LCNUMERIC_SIZE,
       75 +            (const char **)l);
       76 +        if (ret != _LDP_ERROR)
       77 +                *changed = 1;
  63   78  
  64      -        __nlocale_changed = 1;
  65   79          if (ret == _LDP_LOADED) {
  66   80                  /* Can't be empty according to C99 */
  67      -                if (*_numeric_locale.decimal_point == '\0')
  68      -                        _numeric_locale.decimal_point =
       81 +                if (*l->decimal_point == '\0')
       82 +                        l->decimal_point =
  69   83                              _C_numeric_locale.decimal_point;
  70      -                _numeric_locale.grouping =
  71      -                    __fix_locale_grouping_str(_numeric_locale.grouping);
  72      -                leg = (const struct lc_numeric_T *)&_numeric_locale;
       84 +                l->grouping =
       85 +                    __fix_locale_grouping_str(l->grouping);
       86 +                // XXX leg = (const struct lc_numeric_T *)&_numeric_locale;
  73   87          }
  74   88          /* This is Solaris legacy, required for ABI compatability */
  75      -        _numeric[0] = *leg->decimal_point;
  76      -        _numeric[1] = *leg->grouping;
       89 +        // _numeric[0] = *leg->decimal_point;
       90 +        // _numeric[1] = *leg->grouping;
  77   91          return (ret);
  78   92  }
  79   93  
       94 +int
       95 +__numeric_load_locale(const char *name)
       96 +{
       97 +        return (numeric_load_locale(&__xlocale_global_numeric,
       98 +            &__xlocale_global_locale.using_numeric_locale,
       99 +            &__xlocale_global_locale.numeric_locale_changed, name));
      100 +}
      101 +
      102 +void *
      103 +__numeric_load(const char *name, locale_t l)
      104 +{
      105 +        struct xlocale_numeric *new;
      106 +
      107 +        new = calloc(sizeof(struct xlocale_numeric), 1);
      108 +        if (new == NULL)
      109 +                return (NULL);
      110 +
      111 +        new->header.header.destructor = destruct_numeric;
      112 +        if (numeric_load_locale(new, &l->using_numeric_locale,
      113 +            &l->numeric_locale_changed, name) == _LDP_ERROR) {
      114 +                xlocale_release(new);
      115 +                return (NULL);
      116 +        }
      117 +
      118 +        return (new);
      119 +}
      120 +
  80  121  struct lc_numeric_T *
  81      -__get_current_numeric_locale(void)
      122 +__get_current_numeric_locale(locale_t loc)
  82  123  {
  83      -        return (_numeric_using_locale ? &_numeric_locale :
  84      -            (struct lc_numeric_T *)&_C_numeric_locale);
      124 +        return (loc->using_numeric_locale
      125 +            ? &((struct xlocale_numeric *)loc->components[XLC_NUMERIC])->locale
      126 +            : (struct lc_numeric_T *)&_C_numeric_locale);
  85  127  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX