aboutsummaryrefslogtreecommitdiff
path: root/intl/dcigettext.c
diff options
context:
space:
mode:
authorArjun Shankar <arjun@redhat.com>2020-09-25 14:47:06 +0200
committerArjun Shankar <arjun@redhat.com>2020-09-25 14:47:06 +0200
commit7d4ec75e111291851620c6aa2c4460647b7fd50d (patch)
tree1692804299aa1634e52cd2cf021ab4dbce2b01c6 /intl/dcigettext.c
parent06e95b93f0bb5943363ad3dcf0cd0fb9d8613b61 (diff)
downloadglibc-7d4ec75e111291851620c6aa2c4460647b7fd50d.zip
glibc-7d4ec75e111291851620c6aa2c4460647b7fd50d.tar.gz
glibc-7d4ec75e111291851620c6aa2c4460647b7fd50d.tar.bz2
intl: Handle translation output codesets with suffixes [BZ #26383]
Commit 91927b7c7643 (Rewrite iconv option parsing [BZ #19519]) did not handle cases where the output codeset for translations (via the `gettext' family of functions) might have a caller specified encoding suffix such as TRANSLIT or IGNORE. This led to a regression where translations did not work when the codeset had a suffix. This commit fixes the above issue by parsing any suffixes passed to __dcigettext and adds two new test-cases to intl/tst-codeset.c to verify correct behaviour. The iconv-internal function __gconv_create_spec and the static iconv-internal function gconv_destroy_spec are now visible internally within glibc and used in intl/dcigettext.c.
Diffstat (limited to 'intl/dcigettext.c')
-rw-r--r--intl/dcigettext.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/intl/dcigettext.c b/intl/dcigettext.c
index 2e7c662..bd332e7 100644
--- a/intl/dcigettext.c
+++ b/intl/dcigettext.c
@@ -1120,15 +1120,18 @@ _nl_find_msg (struct loaded_l10nfile *domain_file,
# ifdef _LIBC
- struct gconv_spec conv_spec
- = { .fromcode = norm_add_slashes (charset, ""),
- .tocode = norm_add_slashes (outcharset, ""),
- /* We always want to use transliteration. */
- .translit = true,
- .ignore = false
- };
+ struct gconv_spec conv_spec;
+
+ __gconv_create_spec (&conv_spec, charset, outcharset);
+
+ /* We always want to use transliteration. */
+ conv_spec.translit = true;
+
int r = __gconv_open (&conv_spec, &convd->conv,
GCONV_AVOID_NOCONV);
+
+ __gconv_destroy_spec (&conv_spec);
+
if (__builtin_expect (r != __GCONV_OK, 0))
{
/* If the output encoding is the same there is