ngettext support

binutils has lacked proper pluralization of output messages for a long
time, for example, readelf will display information about a section
that "contains 1 entries" or "There are 1 section headers".  Fixing
this properly requires us to use ngettext, because other languages
have different rules to English.

This patch defines macros for ngettext and friends to handle builds
with --disable-nls, and tidies the existing nls support.  I've
redefined gettext rather than just defining "_" as dgettext in bfd and
opcodes in case someone wants to use gettext there (which might
conceivably happen with generated code).

bfd/
	* sysdep.h: Formatting, comment fixes.
	(gettext, ngettext): Redefine when ENABLE_NLS.
	(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
	(_): Define using gettext.
	(textdomain, bindtextdomain): Use safer "do nothing".
	* hosts/alphavms.h (textdomain, bindtextdomain): Likewise.
	(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
opcodes/
	* opintl.h: Formatting, comment fixes.
	(gettext, ngettext): Redefine when ENABLE_NLS.
	(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
	(_): Define using gettext.
	(textdomain, bindtextdomain): Use safer "do nothing".
binutils/
	* sysdep.h (textdomain, bindtextdomain): Use safer "do nothing".
	(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
gas/
	* asintl.h (textdomain, bindtextdomain): Use safer "do nothing".
	(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
gold/
	* system.h (textdomain, bindtextdomain): Use safer "do nothing".
	(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
ld/
	* ld.h (textdomain, bindtextdomain): Use safer "do nothing".
	(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
This commit is contained in:
Alan Modra 2017-11-06 15:20:00 +10:30
parent 84d5321fdf
commit 6003e27e76
13 changed files with 134 additions and 43 deletions

View File

@ -1,3 +1,13 @@
2017-11-07 Alan Modra <amodra@gmail.com>
* sysdep.h: Formatting, comment fixes.
(gettext, ngettext): Redefine when ENABLE_NLS.
(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
(_): Define using gettext.
(textdomain, bindtextdomain): Use safer "do nothing".
* hosts/alphavms.h (textdomain, bindtextdomain): Likewise.
(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
2017-11-05 Alan Modra <amodra@gmail.com>
PR 22397

View File

@ -56,7 +56,13 @@ extern char *stpcpy (char *, const char *);
#define gettext(Msgid) (Msgid)
#define dgettext(Domainname, Msgid) (Msgid)
#define dcgettext(Domainname, Msgid, Category) (Msgid)
#define textdomain(Domainname) while (0) /* nothing */
#define bindtextdomain(Domainname, Dirname) while (0) /* nothing */
#define ngettext(Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
#define dngettext(Domainname, Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
#define dcngettext(Domainname, Msgid1, Msgid2, n, Category) \
(n == 1 ? Msgid1 : Msgid2)
#define textdomain(Domainname) do {} while (0)
#define bindtextdomain(Domainname, Dirname) do {} while (0)
#define _(String) (String)
#define N_(String) (String)

View File

@ -181,31 +181,43 @@ size_t strnlen (const char *, size_t);
#endif
#ifdef ENABLE_NLS
#include <libintl.h>
/* Note the use of dgetext() and PACKAGE here, rather than gettext().
# include <libintl.h>
/* Note the redefinition of gettext and ngettext here to use PACKAGE.
This is because the code in this directory is used to build a library which
will be linked with code in other directories to form programs. We want to
maintain a seperate translation file for this directory however, rather
than being forced to merge it with that of any program linked to libbfd.
This is a library, so it cannot depend on the catalog currently loaded.
This is because the code in this directory is used to build a
library which will be linked with code in other directories to form
programs. We want to maintain a seperate translation file for this
directory however, rather than being forced to merge it with that
of any program linked to libbfd. This is a library, so it cannot
depend on the catalog currently loaded.
In order to do this, we have to make sure that when we extract messages we
use the OPCODES domain rather than the domain of the program that included
the bfd library, (eg OBJDUMP). Hence we use dgettext (PACKAGE, String)
and define PACKAGE to be 'bfd'. (See the code in configure). */
#define _(String) dgettext (PACKAGE, String)
#ifdef gettext_noop
#define N_(String) gettext_noop (String)
#else
#define N_(String) (String)
#endif
In order to do this, we have to make sure that when we extract
messages we use the BFD domain rather than the domain of the
program that included the bfd library, (eg OBJDUMP). Hence we use
dgettext (PACKAGE, String) and define PACKAGE to be 'bfd'.
(See the code in configure). */
# undef gettext
# define gettext(Msgid) dgettext (PACKAGE, Msgid)
# undef ngettext
# define ngettext(Msgid1, Msgid2, n) dngettext (PACKAGE, Msgid1, Msgid2, n)
# define _(String) gettext (String)
# ifdef gettext_noop
# define N_(String) gettext_noop (String)
# else
# define N_(String) (String)
# endif
#else
# define gettext(Msgid) (Msgid)
# define dgettext(Domainname, Msgid) (Msgid)
# define dcgettext(Domainname, Msgid, Category) (Msgid)
# define textdomain(Domainname) while (0) /* nothing */
# define bindtextdomain(Domainname, Dirname) while (0) /* nothing */
# define ngettext(Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dngettext(Domainname, Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dcngettext(Domainname, Msgid1, Msgid2, n, Category) \
(n == 1 ? Msgid1 : Msgid2)
# define textdomain(Domainname) do {} while (0)
# define bindtextdomain(Domainname, Dirname) do {} while (0)
# define _(String) (String)
# define N_(String) (String)
#endif

View File

@ -1,3 +1,8 @@
2017-11-07 Alan Modra <amodra@gmail.com>
* sysdep.h (textdomain, bindtextdomain): Use safer "do nothing".
(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
2017-11-03 Claudiu Zissulescu <claziss@synopsys.com>
* doc/binutils.texi (ARC): Update disassembler options.

View File

@ -159,8 +159,14 @@ size_t strnlen (const char *, size_t);
# define gettext(Msgid) (Msgid)
# define dgettext(Domainname, Msgid) (Msgid)
# define dcgettext(Domainname, Msgid, Category) (Msgid)
# define textdomain(Domainname) while (0) /* nothing */
# define bindtextdomain(Domainname, Dirname) while (0) /* nothing */
# define ngettext(Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dngettext(Domainname, Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dcngettext(Domainname, Msgid1, Msgid2, n, Category) \
(n == 1 ? Msgid1 : Msgid2)
# define textdomain(Domainname) do {} while (0)
# define bindtextdomain(Domainname, Dirname) do {} while (0)
# define _(String) (String)
# define N_(String) (String)
#endif

View File

@ -1,3 +1,8 @@
2017-11-07 Alan Modra <amodra@gmail.com>
* asintl.h (textdomain, bindtextdomain): Use safer "do nothing".
(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
2017-11-03 Siddhesh Poyarekar <siddhesh.poyarekar@linaro.org>
Jim Wilson <jim.wilson@linaro.org>

View File

@ -45,8 +45,14 @@
# define gettext(Msgid) (Msgid)
# define dgettext(Domainname, Msgid) (Msgid)
# define dcgettext(Domainname, Msgid, Category) (Msgid)
# define textdomain(Domainname) while (0) /* nothing */
# define bindtextdomain(Domainname, Dirname) while (0) /* nothing */
# define ngettext(Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dngettext(Domainname, Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dcngettext(Domainname, Msgid1, Msgid2, n, Category) \
(n == 1 ? Msgid1 : Msgid2)
# define textdomain(Domainname) do {} while (0)
# define bindtextdomain(Domainname, Dirname) do {} while (0)
# define _(String) (String)
# define N_(String) (String)
#endif

View File

@ -1,3 +1,8 @@
2017-11-07 Alan Modra <amodra@gmail.com>
* system.h (textdomain, bindtextdomain): Use safer "do nothing".
(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
2017-10-25 Alan Modra <amodra@gmail.com>
* symtab.cc (Symbol_table::add_from_relobj): Match "__gnu_lto_slim"

View File

@ -49,8 +49,14 @@
# define gettext(Msgid) (Msgid)
# define dgettext(Domainname, Msgid) (Msgid)
# define dcgettext(Domainname, Msgid, Category) (Msgid)
# define textdomain(Domainname) do {} while (0) /* nothing */
# define bindtextdomain(Domainname, Dirname) do {} while (0) /* nothing */
# define ngettext(Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dngettext(Domainname, Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dcngettext(Domainname, Msgid1, Msgid2, n, Category) \
(n == 1 ? Msgid1 : Msgid2)
# define textdomain(Domainname) do {} while (0)
# define bindtextdomain(Domainname, Dirname) do {} while (0)
# define _(String) (String)
# define N_(String) (String)
#endif

View File

@ -1,3 +1,8 @@
2017-11-07 Alan Modra <amodra@gmail.com>
* ld.h (textdomain, bindtextdomain): Use safer "do nothing".
(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
2017-11-01 Alan Modra <amodra@gmail.com>
* testsuite/ld-powerpc/ambiguousv2.d: Remove FIXME.

10
ld/ld.h
View File

@ -55,8 +55,14 @@
# define gettext(Msgid) (Msgid)
# define dgettext(Domainname, Msgid) (Msgid)
# define dcgettext(Domainname, Msgid, Category) (Msgid)
# define textdomain(Domainname) while (0) /* nothing */
# define bindtextdomain(Domainname, Dirname) while (0) /* nothing */
# define ngettext(Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dngettext(Domainname, Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dcngettext(Domainname, Msgid1, Msgid2, n, Category) \
(n == 1 ? Msgid1 : Msgid2)
# define textdomain(Domainname) do {} while (0)
# define bindtextdomain(Domainname, Dirname) do {} while (0)
# define _(String) (String)
# define N_(String) (String)
#endif

View File

@ -1,3 +1,11 @@
2017-11-07 Alan Modra <amodra@gmail.com>
* opintl.h: Formatting, comment fixes.
(gettext, ngettext): Redefine when ENABLE_NLS.
(ngettext, dngettext, dcngettext): Define when !ENABLE_NLS.
(_): Define using gettext.
(textdomain, bindtextdomain): Use safer "do nothing".
2017-11-03 Claudiu Zissulescu <claziss@synopsys.com>
* arc-dis.c (print_hex): New variable.

View File

@ -22,20 +22,25 @@
#ifdef ENABLE_NLS
# include <libintl.h>
/* Note the use of dgetext() and PACKAGE here, rather than gettext().
/* Note the redefinition of gettext and ngettext here to use PACKAGE.
This is because the code in this directory is used to build a library which
will be linked with code in other directories to form programs. We want to
maintain a seperate translation file for this directory however, rather
than being forced to merge it with that of any program linked to
libopcodes. This is a library, so it cannot depend on the catalog
currently loaded.
This is because the code in this directory is used to build a
library which will be linked with code in other directories to form
programs. We want to maintain a seperate translation file for this
directory however, rather than being forced to merge it with that
of any program linked to libopcodes. This is a library, so it
cannot depend on the catalog currently loaded.
In order to do this, we have to make sure that when we extract messages we
use the OPCODES domain rather than the domain of the program that included
the opcodes library, (eg OBJDUMP). Hence we use dgettext (PACKAGE, String)
and define PACKAGE to be 'opcodes'. (See the code in configure). */
# define _(String) dgettext (PACKAGE, String)
In order to do this, we have to make sure that when we extract
messages we use the OPCODES domain rather than the domain of the
program that included the opcodes library, (eg OBJDUMP). Hence we
use dgettext (PACKAGE, String) and define PACKAGE to be 'opcodes'.
(See the code in configure). */
# undef gettext
# define gettext(Msgid) dgettext (PACKAGE, Msgid)
# undef ngettext
# define ngettext(Msgid1, Msgid2, n) dngettext (PACKAGE, Msgid1, Msgid2, n)
# define _(String) gettext (String)
# ifdef gettext_noop
# define N_(String) gettext_noop (String)
# else
@ -45,8 +50,14 @@
# define gettext(Msgid) (Msgid)
# define dgettext(Domainname, Msgid) (Msgid)
# define dcgettext(Domainname, Msgid, Category) (Msgid)
# define textdomain(Domainname) while (0) /* nothing */
# define bindtextdomain(Domainname, Dirname) while (0) /* nothing */
# define ngettext(Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dngettext(Domainname, Msgid1, Msgid2, n) \
(n == 1 ? Msgid1 : Msgid2)
# define dcngettext(Domainname, Msgid1, Msgid2, n, Category) \
(n == 1 ? Msgid1 : Msgid2)
# define textdomain(Domainname) do {} while (0)
# define bindtextdomain(Domainname, Dirname) do {} while (0)
# define _(String) (String)
# define N_(String) (String)
#endif