summaryrefslogtreecommitdiff
path: root/intl/bindtextdom.c
diff options
context:
space:
mode:
Diffstat (limited to 'intl/bindtextdom.c')
-rw-r--r--intl/bindtextdom.c92
1 files changed, 31 insertions, 61 deletions
diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c
index c3624961a8..29a1b12e9f 100644
--- a/intl/bindtextdom.c
+++ b/intl/bindtextdom.c
@@ -1,20 +1,18 @@
/* Implementation of the bindtextdomain(3) function
Copyright (C) 1995-2014 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
- The GNU C Library is distributed in the hope that it will be useful,
+ This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -24,29 +22,21 @@
#include <stdlib.h>
#include <string.h>
+#include "gettextP.h"
#ifdef _LIBC
# include <libintl.h>
#else
# include "libgnuintl.h"
#endif
-#include "gettextP.h"
+/* Handle multi-threaded applications. */
#ifdef _LIBC
-/* We have to handle multi-threaded applications. */
# include <bits/libc-lock.h>
+# define gl_rwlock_define __libc_rwlock_define
+# define gl_rwlock_wrlock __libc_rwlock_wrlock
+# define gl_rwlock_unlock __libc_rwlock_unlock
#else
-/* Provide dummy implementation if this is outside glibc. */
-# define __libc_rwlock_define(CLASS, NAME)
-# define __libc_rwlock_wrlock(NAME)
-# define __libc_rwlock_unlock(NAME)
-#endif
-
-/* The internal variables in the standalone libintl.a must have different
- names than the internal variables in GNU libc, otherwise programs
- using libintl.a cannot be linked statically. */
-#if !defined _LIBC
-# define _nl_default_dirname libintl_nl_default_dirname
-# define _nl_domain_bindings libintl_nl_domain_bindings
+# include "lock.h"
#endif
/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
@@ -56,17 +46,8 @@
/* @@ end of prolog @@ */
-/* Contains the default location of the message catalogs. */
-extern const char _nl_default_dirname[];
-#ifdef _LIBC
-libc_hidden_proto (_nl_default_dirname)
-#endif
-
-/* List with bindings of specific domains. */
-extern struct binding *_nl_domain_bindings;
-
/* Lock variable to protect the global data in the gettext implementation. */
-__libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
+gl_rwlock_define (extern, _nl_state_lock attribute_hidden)
/* Names for the libintl functions are a problem. They must not clash
@@ -84,11 +65,6 @@ __libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset
#endif
-/* Prototypes for local functions. */
-static void set_binding_values PARAMS ((const char *domainname,
- const char **dirnamep,
- const char **codesetp));
-
/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP
to be used for the DOMAINNAME message catalog.
If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not
@@ -96,10 +72,8 @@ static void set_binding_values PARAMS ((const char *domainname,
If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither
modified nor returned. */
static void
-set_binding_values (domainname, dirnamep, codesetp)
- const char *domainname;
- const char **dirnamep;
- const char **codesetp;
+set_binding_values (const char *domainname,
+ const char **dirnamep, const char **codesetp)
{
struct binding *binding;
int modified;
@@ -114,7 +88,7 @@ set_binding_values (domainname, dirnamep, codesetp)
return;
}
- __libc_rwlock_wrlock (_nl_state_lock);
+ gl_rwlock_wrlock (_nl_state_lock);
modified = 0;
@@ -158,12 +132,12 @@ set_binding_values (domainname, dirnamep, codesetp)
#else
size_t len = strlen (dirname) + 1;
result = (char *) malloc (len);
- if (__glibc_likely (result != NULL))
+ if (__builtin_expect (result != NULL, 1))
memcpy (result, dirname, len);
#endif
}
- if (__glibc_likely (result != NULL))
+ if (__builtin_expect (result != NULL, 1))
{
if (binding->dirname != _nl_default_dirname)
free (binding->dirname);
@@ -196,11 +170,11 @@ set_binding_values (domainname, dirnamep, codesetp)
#else
size_t len = strlen (codeset) + 1;
result = (char *) malloc (len);
- if (__glibc_likely (result != NULL))
+ if (__builtin_expect (result != NULL, 1))
memcpy (result, codeset, len);
#endif
- if (__glibc_likely (result != NULL))
+ if (__builtin_expect (result != NULL, 1))
{
free (binding->codeset);
@@ -228,7 +202,7 @@ set_binding_values (domainname, dirnamep, codesetp)
struct binding *new_binding =
(struct binding *) malloc (offsetof (struct binding, domainname) + len);
- if (__glibc_unlikely (new_binding == NULL))
+ if (__builtin_expect (new_binding == NULL, 0))
goto failed;
memcpy (new_binding->domainname, domainname, len);
@@ -249,12 +223,12 @@ set_binding_values (domainname, dirnamep, codesetp)
char *result;
#if defined _LIBC || defined HAVE_STRDUP
result = strdup (dirname);
- if (__glibc_unlikely (result == NULL))
+ if (__builtin_expect (result == NULL, 0))
goto failed_dirname;
#else
size_t len = strlen (dirname) + 1;
result = (char *) malloc (len);
- if (__glibc_unlikely (result == NULL))
+ if (__builtin_expect (result == NULL, 0))
goto failed_dirname;
memcpy (result, dirname, len);
#endif
@@ -278,12 +252,12 @@ set_binding_values (domainname, dirnamep, codesetp)
#if defined _LIBC || defined HAVE_STRDUP
result = strdup (codeset);
- if (__glibc_unlikely (result == NULL))
+ if (__builtin_expect (result == NULL, 0))
goto failed_codeset;
#else
size_t len = strlen (codeset) + 1;
result = (char *) malloc (len);
- if (__glibc_unlikely (result == NULL))
+ if (__builtin_expect (result == NULL, 0))
goto failed_codeset;
memcpy (result, codeset, len);
#endif
@@ -335,15 +309,13 @@ set_binding_values (domainname, dirnamep, codesetp)
if (modified)
++_nl_msg_cat_cntr;
- __libc_rwlock_unlock (_nl_state_lock);
+ gl_rwlock_unlock (_nl_state_lock);
}
/* Specify that the DOMAINNAME message catalog will be found
in DIRNAME rather than in the system locale data base. */
char *
-BINDTEXTDOMAIN (domainname, dirname)
- const char *domainname;
- const char *dirname;
+BINDTEXTDOMAIN (const char *domainname, const char *dirname)
{
set_binding_values (domainname, &dirname, NULL);
return (char *) dirname;
@@ -352,9 +324,7 @@ BINDTEXTDOMAIN (domainname, dirname)
/* Specify the character encoding in which the messages from the
DOMAINNAME message catalog will be returned. */
char *
-BIND_TEXTDOMAIN_CODESET (domainname, codeset)
- const char *domainname;
- const char *codeset;
+BIND_TEXTDOMAIN_CODESET (const char *domainname, const char *codeset)
{
set_binding_values (domainname, NULL, &codeset);
return (char *) codeset;