aboutsummaryrefslogtreecommitdiff
path: root/intl
diff options
context:
space:
mode:
Diffstat (limited to 'intl')
-rw-r--r--intl/bindtextdom.c92
-rw-r--r--intl/dcgettext.c25
-rw-r--r--intl/dcigettext.c851
-rw-r--r--intl/dcngettext.c29
-rw-r--r--intl/dgettext.c27
-rw-r--r--intl/dngettext.c30
-rw-r--r--intl/eval-plural.h (renamed from intl/plural-eval.c)44
-rw-r--r--intl/explodename.c44
-rw-r--r--intl/finddomain.c75
-rw-r--r--intl/gettext.c23
-rw-r--r--intl/gettextP.h235
-rw-r--r--intl/gmo.h39
-rw-r--r--intl/hash-string.c8
-rw-r--r--intl/hash-string.h41
-rw-r--r--intl/l10nflist.c108
-rw-r--r--intl/loadinfo.h116
-rw-r--r--intl/loadmsgcat.c20
-rw-r--r--intl/localealias.c186
-rw-r--r--intl/ngettext.c25
-rw-r--r--intl/plural-exp.c30
-rw-r--r--intl/plural-exp.h104
-rw-r--r--intl/plural.c190
-rw-r--r--intl/plural.y98
-rw-r--r--intl/textdomain.c55
24 files changed, 1366 insertions, 1129 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;
diff --git a/intl/dcgettext.c b/intl/dcgettext.c
index 4daae557f1..95dccad9d2 100644
--- a/intl/dcgettext.c
+++ b/intl/dcgettext.c
@@ -1,20 +1,18 @@
/* Implementation of the dcgettext(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>
@@ -44,10 +42,7 @@
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
locale. */
char *
-DCGETTEXT (domainname, msgid, category)
- const char *domainname;
- const char *msgid;
- int category;
+DCGETTEXT (const char *domainname, const char *msgid, int category)
{
return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category);
}
diff --git a/intl/dcigettext.c b/intl/dcigettext.c
index 723dd7ef46..7af4a76410 100644
--- a/intl/dcigettext.c
+++ b/intl/dcigettext.c
@@ -1,20 +1,18 @@
/* Implementation of the internal dcigettext 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/>. */
/* Tell glibc's <string.h> to provide a prototype for mempcpy().
This must come before <config.h> because <config.h> may include
@@ -33,14 +31,19 @@
# define alloca __builtin_alloca
# define HAVE_ALLOCA 1
#else
-# if defined HAVE_ALLOCA_H || defined _LIBC
-# include <alloca.h>
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
# else
-# ifdef _AIX
- #pragma alloca
+# if defined HAVE_ALLOCA_H || defined _LIBC
+# include <alloca.h>
# else
-# ifndef alloca
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca
char *alloca ();
+# endif
# endif
# endif
# endif
@@ -64,30 +67,49 @@ extern int errno;
#include <locale.h>
+#ifdef _LIBC
+ /* Guess whether integer division by zero raises signal SIGFPE.
+ Set to 1 only if you know for sure. In case of doubt, set to 0. */
+# if defined __alpha__ || defined __arm__ || defined __i386__ \
+ || defined __m68k__ || defined __s390__
+# define INTDIV0_RAISES_SIGFPE 1
+# else
+# define INTDIV0_RAISES_SIGFPE 0
+# endif
+#endif
+#if !INTDIV0_RAISES_SIGFPE
+# include <signal.h>
+#endif
+
#if defined HAVE_SYS_PARAM_H || defined _LIBC
# include <sys/param.h>
#endif
+#if !defined _LIBC
+# include "localcharset.h"
+#endif
+
#include "gettextP.h"
#include "plural-exp.h"
#ifdef _LIBC
# include <libintl.h>
#else
+# ifdef IN_LIBGLOCALE
+# include <libintl.h>
+# endif
# include "libgnuintl.h"
#endif
#include "hash-string.h"
-/* Thread safetyness. */
+/* Handle multi-threaded applications. */
#ifdef _LIBC
# include <bits/libc-lock.h>
+# define gl_rwlock_define_initialized __libc_rwlock_define_initialized
+# define gl_rwlock_rdlock __libc_rwlock_rdlock
+# 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_lock_define_initialized(CLASS, NAME)
-# define __libc_lock_lock(NAME)
-# define __libc_lock_unlock(NAME)
-# define __libc_rwlock_define_initialized(CLASS, NAME)
-# define __libc_rwlock_rdlock(NAME)
-# define __libc_rwlock_unlock(NAME)
+# include "lock.h"
#endif
/* Alignment of types. */
@@ -98,16 +120,6 @@ extern int errno;
((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2)
#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_default_domain libintl_nl_default_default_domain
-# define _nl_current_default_domain libintl_nl_current_default_domain
-# define _nl_default_dirname libintl_nl_default_dirname
-# define _nl_domain_bindings libintl_nl_domain_bindings
-#endif
-
/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
#ifndef offsetof
# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
@@ -129,16 +141,36 @@ extern int errno;
char *getwd ();
# define getcwd(buf, max) getwd (buf)
# else
+# if VMS
+# define getcwd(buf, max) (getcwd) (buf, max, 0)
+# else
char *getcwd ();
+# endif
# endif
# ifndef HAVE_STPCPY
-static char *stpcpy PARAMS ((char *dest, const char *src));
+static char *stpcpy (char *dest, const char *src);
# endif
# ifndef HAVE_MEMPCPY
-static void *mempcpy PARAMS ((void *dest, const void *src, size_t n));
+static void *mempcpy (void *dest, const void *src, size_t n);
# endif
#endif
+/* Use a replacement if the system does not provide the `tsearch' function
+ family. */
+#if defined HAVE_TSEARCH || defined _LIBC
+# include <search.h>
+#else
+# define tsearch libintl_tsearch
+# define tfind libintl_tfind
+# define tdelete libintl_tdelete
+# define twalk libintl_twalk
+# include "tsearch.h"
+#endif
+
+#ifdef _LIBC
+# define tsearch __tsearch
+#endif
+
/* Amount to increase buffer size by in each try. */
#define PATH_INCR 32
@@ -171,8 +203,30 @@ static void *mempcpy PARAMS ((void *dest, const void *src, size_t n));
# define PATH_MAX _POSIX_PATH_MAX
#endif
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not,
+ it may be concatenated to a directory pathname.
+ IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+ && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+# define IS_PATH_WITH_DIR(P) \
+ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+#endif
+
/* Whether to support different locales in different threads. */
-#if defined _LIBC || HAVE_NL_LOCALE_NAME
+#if defined _LIBC || HAVE_USELOCALE || defined IN_LIBGLOCALE
# define HAVE_PER_THREAD_LOCALE
#endif
@@ -191,6 +245,11 @@ struct known_translation_t
const char *localename;
#endif
+#ifdef IN_LIBGLOCALE
+ /* The character encoding. */
+ const char *encoding;
+#endif
+
/* State of the catalog counter at the point the string was found. */
int counter;
@@ -210,23 +269,14 @@ struct known_translation_t
msgid;
};
-/* Root of the search tree with known translations. We can use this
- only if the system provides the `tsearch' function family. */
-#if defined HAVE_TSEARCH || defined _LIBC
-# include <search.h>
+gl_rwlock_define_initialized (static, tree_lock)
+/* Root of the search tree with known translations. */
static void *root;
-# ifdef _LIBC
-# define tsearch __tsearch
-# endif
-
/* Function to compare two entries in the table of known translations. */
-static int transcmp PARAMS ((const void *p1, const void *p2));
static int
-transcmp (p1, p2)
- const void *p1;
- const void *p2;
+transcmp (const void *p1, const void *p2)
{
const struct known_translation_t *s1;
const struct known_translation_t *s2;
@@ -246,59 +296,83 @@ transcmp (p1, p2)
result = strcmp (s1->localename, s2->localename);
if (result == 0)
#endif
- /* We compare the ca