Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libc/port/locale/lmessages.c
          +++ new/usr/src/lib/libc/port/locale/lmessages.c
   1    1  /*
        2 + * Copyright 2014 Garrett D'Amore <garrett@damore.org>
   2    3   * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
   3    4   * Copyright (c) 2001 Alexey Zelkin <phantom@FreeBSD.org>
   4    5   * All rights reserved.
   5    6   *
   6    7   * Redistribution and use in source and binary forms, with or without
   7    8   * modification, are permitted provided that the following conditions
   8    9   * are met:
   9   10   * 1. Redistributions of source code must retain the above copyright
  10   11   *    notice, this list of conditions and the following disclaimer.
  11   12   * 2. Redistributions in binary form must reproduce the above copyright
↓ open down ↓ 8 lines elided ↑ open up ↑
  20   21   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21   22   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22   23   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23   24   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24   25   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25   26   * SUCH DAMAGE.
  26   27   */
  27   28  
  28   29  #include "lint.h"
  29   30  #include <stddef.h>
       31 +#include <errno.h>
  30   32  #include "ldpart.h"
  31   33  #include "lmessages.h"
       34 +#include "localeimpl.h"
  32   35  
  33      -#define LCMESSAGES_SIZE_FULL (sizeof (struct lc_messages_T) / sizeof (char *))
       36 +#define LCMESSAGES_SIZE_FULL (sizeof (struct lc_messages) / sizeof (char *))
  34   37  #define LCMESSAGES_SIZE_MIN \
  35      -        (offsetof(struct lc_messages_T, yesstr) / sizeof (char *))
       38 +        (offsetof(struct lc_messages, yesstr) / sizeof (char *))
  36   39  
  37   40  static char empty[] = "";
  38   41  
  39      -static const struct lc_messages_T _C_messages_locale = {
       42 +struct lc_messages lc_messages_posix = {
  40   43          "^[yY]",        /* yesexpr */
  41   44          "^[nN]",        /* noexpr */
  42   45          "yes",          /* yesstr */
  43   46          "no"            /* nostr */
  44   47  };
  45   48  
  46      -static struct lc_messages_T _messages_locale;
  47      -static int      _messages_using_locale;
  48      -static char     *_messages_locale_buf;
       49 +struct locdata __posix_messages_locdata = {
       50 +        .l_lname = "C",
       51 +        .l_refcnt = (uint32_t)-1,
       52 +        .l_data = { &lc_messages_posix }
       53 +};
  49   54  
  50      -int
  51      -__messages_load_locale(const char *name)
       55 +struct locdata *
       56 +__lc_messages_load(const char *name)
  52   57  {
       58 +        struct locdata *ldata;
       59 +        struct lc_messages *lmsgs;
  53   60          int ret;
  54   61  
  55      -        ret = __part_load_locale(name, &_messages_using_locale,
  56      -            &_messages_locale_buf, "LC_MESSAGES",
  57      -            LCMESSAGES_SIZE_FULL, LCMESSAGES_SIZE_MIN,
  58      -            (const char **)&_messages_locale);
  59      -        if (ret == _LDP_LOADED) {
  60      -                if (_messages_locale.yesstr == NULL)
  61      -                        _messages_locale.yesstr = empty;
  62      -                if (_messages_locale.nostr == NULL)
  63      -                        _messages_locale.nostr = empty;
       62 +        if ((ldata = __locdata_alloc(name, sizeof (*lmsgs))) == NULL)
       63 +                return (NULL);
       64 +        lmsgs = ldata->l_data[0];
       65 +
       66 +        ret = __part_load_locale(name, (char **)&ldata->l_data[1],
       67 +            "LC_MESSAGES", LCMESSAGES_SIZE_FULL, LCMESSAGES_SIZE_MIN,
       68 +            (const char **)lmsgs);
       69 +
       70 +        if (ret != _LDP_LOADED) {
       71 +                __locdata_release(ldata);
       72 +                errno = EINVAL;
       73 +                return (NULL);
  64   74          }
  65      -        return (ret);
  66      -}
  67   75  
  68      -struct lc_messages_T *
  69      -__get_current_messages_locale(void)
  70      -{
  71      -        return (_messages_using_locale ? &_messages_locale :
  72      -            (struct lc_messages_T *)&_C_messages_locale);
       76 +        if (lmsgs->yesstr == NULL)
       77 +                lmsgs->yesstr = empty;
       78 +        if (lmsgs->nostr == NULL)
       79 +                lmsgs->nostr = empty;
       80 +
       81 +        return (ldata);
  73   82  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX