Print this page
2964 need POSIX 2008 locale object support

*** 1,10 **** --- 1,15 ---- /* * Copyright 2010 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2001 Alexey Zelkin <phantom@FreeBSD.org> * All rights reserved. * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * Portions of this software were developed by David Chisnall + * under sponsorship from the FreeBSD Foundation. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer.
*** 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); } --- 30,116 ---- * SUCH DAMAGE. */ #include "lint.h" #include <stddef.h> + #include <stdlib.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 *)) + struct xlocale_messages __xlocale_global_messages; + static char empty[] = ""; static const struct lc_messages_T _C_messages_locale = { "^[yY]", /* yesexpr */ "^[nN]", /* noexpr */ "yes", /* yesstr */ "no" /* nostr */ }; ! static void ! destruct_messages(void *v) ! { ! struct xlocale_messages *l = v; ! if (l->buffer != NULL) ! free(l->buffer); ! ! free(l); ! } ! ! static int ! messages_load_locale(struct xlocale_messages *loc, int *using_locale, ! const char *name) { int ret; + struct lc_messages_T *l = &loc->locale; ! ret = __part_load_locale(name, using_locale, ! &loc->buffer, "LC_MESSAGES", LCMESSAGES_SIZE_FULL, LCMESSAGES_SIZE_MIN, ! (const char **)l); if (ret == _LDP_LOADED) { ! if (l->yesstr == NULL) ! l->yesstr = empty; ! if (l->nostr == NULL) ! l->nostr = empty; } + return (ret); } + int + __messages_load_locale(const char *name) + { + return (messages_load_locale(&__xlocale_global_messages, + &__xlocale_global_locale.using_messages_locale, name)); + } + + void * + __messages_load(const char *name, locale_t l) + { + struct xlocale_messages *new; + + new = calloc(sizeof(struct xlocale_messages), 1); + /* XXX */ + new->header.header.destructor = destruct_messages; + if (messages_load_locale(new, &l->using_messages_locale, name) == + _LDP_ERROR) { + xlocale_release(new); + return (NULL); + } + + return (new); + } + struct lc_messages_T * ! __get_current_messages_locale(locale_t loc) { ! return (loc->using_messages_locale ! ? &((struct xlocale_messages *)loc->components[XLC_MESSAGES])->locale ! : (struct lc_messages_T *)&_C_messages_locale); }