Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Approved by: TBD

@@ -1,6 +1,7 @@
 /*
+ * Copyright 2014 Garrett D'Amore <garrett@damore.org>
  * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
  * Copyright (c) 2001 Alexey Zelkin <phantom@FreeBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without

@@ -25,49 +26,57 @@
  * SUCH DAMAGE.
  */
 
 #include "lint.h"
 #include <stddef.h>
+#include <errno.h>
 #include "ldpart.h"
 #include "lmessages.h"
+#include "localeimpl.h"
 
-#define LCMESSAGES_SIZE_FULL (sizeof (struct lc_messages_T) / sizeof (char *))
+#define LCMESSAGES_SIZE_FULL (sizeof (struct lc_messages) / sizeof (char *))
 #define LCMESSAGES_SIZE_MIN \
-        (offsetof(struct lc_messages_T, yesstr) / sizeof (char *))
+        (offsetof(struct lc_messages, yesstr) / sizeof (char *))
 
 static char empty[] = "";
 
-static const struct lc_messages_T _C_messages_locale = {
+struct lc_messages lc_messages_posix = {
         "^[yY]",        /* yesexpr */
         "^[nN]",        /* noexpr */
         "yes",          /* yesstr */
         "no"            /* nostr */
 };
 
-static struct lc_messages_T _messages_locale;
-static int      _messages_using_locale;
-static char     *_messages_locale_buf;
+struct locdata __posix_messages_locdata = {
+        .l_lname = "C",
+        .l_refcnt = (uint32_t)-1,
+        .l_data = { &lc_messages_posix }
+};
 
-int
-__messages_load_locale(const char *name)
+struct locdata *
+__lc_messages_load(const char *name)
 {
+        struct locdata *ldata;
+        struct lc_messages *lmsgs;
         int ret;
 
-        ret = __part_load_locale(name, &_messages_using_locale,
-            &_messages_locale_buf, "LC_MESSAGES",
-            LCMESSAGES_SIZE_FULL, LCMESSAGES_SIZE_MIN,
-            (const char **)&_messages_locale);
-        if (ret == _LDP_LOADED) {
-                if (_messages_locale.yesstr == NULL)
-                        _messages_locale.yesstr = empty;
-                if (_messages_locale.nostr == NULL)
-                        _messages_locale.nostr = empty;
+        if ((ldata = __locdata_alloc(name, sizeof (*lmsgs))) == NULL)
+                return (NULL);
+        lmsgs = ldata->l_data[0];
+
+        ret = __part_load_locale(name, (char **)&ldata->l_data[1],
+            "LC_MESSAGES", LCMESSAGES_SIZE_FULL, LCMESSAGES_SIZE_MIN,
+            (const char **)lmsgs);
+
+        if (ret != _LDP_LOADED) {
+                __locdata_release(ldata);
+                errno = EINVAL;
+                return (NULL);
         }
-        return (ret);
-}
 
-struct lc_messages_T *
-__get_current_messages_locale(void)
-{
-        return (_messages_using_locale ? &_messages_locale :
-            (struct lc_messages_T *)&_C_messages_locale);
+        if (lmsgs->yesstr == NULL)
+                lmsgs->yesstr = empty;
+        if (lmsgs->nostr == NULL)
+                lmsgs->nostr = empty;
+
+        return (ldata);
 }