Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
*** 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,73 ****
* SUCH DAMAGE.
*/
#include "lint.h"
#include <stddef.h>
#include "ldpart.h"
#include "lmessages.h"
! #define LCMESSAGES_SIZE_FULL (sizeof (struct lc_messages_T) / sizeof (char *))
#define LCMESSAGES_SIZE_MIN \
! (offsetof(struct lc_messages_T, yesstr) / sizeof (char *))
static char empty[] = "";
! static const struct lc_messages_T _C_messages_locale = {
"^[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;
! int
! __messages_load_locale(const char *name)
{
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;
}
- return (ret);
- }
! struct lc_messages_T *
! __get_current_messages_locale(void)
! {
! return (_messages_using_locale ? &_messages_locale :
! (struct lc_messages_T *)&_C_messages_locale);
}
--- 26,82 ----
* 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) / sizeof (char *))
#define LCMESSAGES_SIZE_MIN \
! (offsetof(struct lc_messages, yesstr) / sizeof (char *))
static char empty[] = "";
! struct lc_messages lc_messages_posix = {
"^[yY]", /* yesexpr */
"^[nN]", /* noexpr */
"yes", /* yesstr */
"no" /* nostr */
};
! struct locdata __posix_messages_locdata = {
! .l_lname = "C",
! .l_refcnt = (uint32_t)-1,
! .l_data = { &lc_messages_posix }
! };
! struct locdata *
! __lc_messages_load(const char *name)
{
+ struct locdata *ldata;
+ struct lc_messages *lmsgs;
int ret;
! 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);
}
! if (lmsgs->yesstr == NULL)
! lmsgs->yesstr = empty;
! if (lmsgs->nostr == NULL)
! lmsgs->nostr = empty;
!
! return (ldata);
}