summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2001-11-30 13:04:09 +0000
committerBruno Haible <bruno@clisp.org>2009-06-21 23:29:38 +0200
commit28643aae6fd21c87317f0e77cd052f49a6ed0c0e (patch)
tree99f644436656c8cdbbe69dd698405b24176a979b
parentfd737ee7e18b4c1c8282a2eb2d0ed56cf975402e (diff)
downloadexternal_gettext-28643aae6fd21c87317f0e77cd052f49a6ed0c0e.zip
external_gettext-28643aae6fd21c87317f0e77cd052f49a6ed0c0e.tar.gz
external_gettext-28643aae6fd21c87317f0e77cd052f49a6ed0c0e.tar.bz2
Deal with the case where a message gets or loses the plural form status
during msgmerge.
-rw-r--r--src/ChangeLog8
-rw-r--r--src/Makefile.am4
-rw-r--r--src/message.c13
-rw-r--r--src/msgmerge.c81
-rw-r--r--tests/ChangeLog7
-rw-r--r--tests/Makefile.am3
-rwxr-xr-xtests/msgmerge-1792
-rwxr-xr-xtests/msgmerge-1898
-rwxr-xr-xtests/msgmerge-1990
9 files changed, 393 insertions, 3 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 84dcffd..a6e7080 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,11 @@
+2001-11-30 Bruno Haible <bruno@clisp.org>
+
+ * message.c (message_merge): Determine whether postprocessing is
+ needed.
+ * msgmerge.c (match_domain): Postprocess some problematic cases.
+ * Makefile.am (libgettextsrc_la_SOURCES): Add plural.c.
+ (msgfmt_SOURCES): Remove plural.c.
+
2001-11-29 Bruno Haible <bruno@clisp.org>
* plural-eval.c: Include config.h and plural-exp.h.
diff --git a/src/Makefile.am b/src/Makefile.am
index 1c01150..bf460f9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -72,14 +72,14 @@ format-ycp.c
# libgettextsrc contains all code that is needed by at least two programs.
libgettextsrc_la_SOURCES = \
$(COMMON_SOURCE) read-po.c write-po.c msgl-ascii.c msgl-iconv.c msgl-equal.c \
-msgl-cat.c msgl-english.c file-list.c msgl-charset.c po-time.c \
+msgl-cat.c msgl-english.c file-list.c msgl-charset.c po-time.c plural.c \
$(FORMAT_SOURCE)
# Source dependencies.
gettext_SOURCES = gettext.c
ngettext_SOURCES = ngettext.c
msgcmp_SOURCES = msgcmp.c
-msgfmt_SOURCES = msgfmt.c write-mo.c write-java.c plural.c plural-eval.c
+msgfmt_SOURCES = msgfmt.c write-mo.c write-java.c plural-eval.c
msgmerge_SOURCES = msgmerge.c
msgunfmt_SOURCES = msgunfmt.c read-mo.c read-java.c
xgettext_SOURCES = xgettext.c x-c.c x-po.c x-java.l x-ycp.c x-rst.c
diff --git a/src/message.c b/src/message.c
index 08dbfaf..0f19e20 100644
--- a/src/message.c
+++ b/src/message.c
@@ -420,6 +420,19 @@ message_merge (def, ref)
message_comment_filepos (result, pp->file_name, pp->line_number);
}
+ /* Special postprocessing is needed if the reference message is a
+ plural form and the definition message isn't, or vice versa. */
+ if (ref->msgid_plural != NULL)
+ {
+ if (def->msgid_plural == NULL)
+ result->used = 1;
+ }
+ else
+ {
+ if (def->msgid_plural != NULL)
+ result->used = 2;
+ }
+
/* All done, return the merged message to the caller. */
return result;
}
diff --git a/src/msgmerge.c b/src/msgmerge.c
index 35bac22..a7272ff 100644
--- a/src/msgmerge.c
+++ b/src/msgmerge.c
@@ -34,9 +34,11 @@
#include "message.h"
#include "read-po.h"
#include "write-po.h"
+#include "xmalloc.h"
#include "system.h"
#include "po.h"
#include "msgl-equal.h"
+#include "plural-exp.h"
#include "backupfile.h"
#include "copy-file.h"
#include "libgettext.h"
@@ -577,6 +579,85 @@ this message is used but not defined in %s"), fn1);
}
}
}
+
+ /* Now postprocess the problematic merges. This is needed because we
+ want the result to pass the "msgfmt -c -v" check. */
+ {
+ /* message_merge sets mp->used to 1 or 2, depending on the problem.
+ Compute the bitwise OR of all these. */
+ int problematic = 0;
+
+ for (j = 0; j < resultmlp->nitems; j++)
+ problematic |= resultmlp->item[j]->used;
+
+ if (problematic)
+ {
+ unsigned long int nplurals = 0;
+
+ if (problematic & 1)
+ {
+ /* Need to know nplurals of the result domain. */
+ message_ty *header_entry;
+ struct expression *plural;
+
+ header_entry = message_list_search (resultmlp, "");
+ extract_plural_expression (header_entry
+ ? header_entry->msgstr
+ : NULL,
+ &plural, &nplurals);
+ }
+
+ for (j = 0; j < resultmlp->nitems; j++)
+ {
+ message_ty *mp = resultmlp->item[j];
+
+ if ((mp->used & 1) && (nplurals > 0))
+ {
+ /* ref->msgid_plural != NULL but def->msgid_plural == NULL.
+ Use a copy of def->msgstr for each possible plural form. */
+ size_t new_msgstr_len;
+ char *new_msgstr;
+ char *p;
+ unsigned long i;
+
+ if (verbosity_level > 1)
+ {
+ po_gram_error_at_line (&mp->pos, _("\
+this message should define plural forms"));
+ }
+
+ new_msgstr_len = nplurals * mp->msgstr_len;
+ new_msgstr = (char *) xmalloc (new_msgstr_len);
+ for (i = 0, p = new_msgstr; i < nplurals; i++)
+ {
+ memcpy (p, mp->msgstr, mp->msgstr_len);
+ p += mp->msgstr_len;
+ }
+ mp->msgstr = new_msgstr;
+ mp->msgstr_len = new_msgstr_len;
+ mp->is_fuzzy = true;
+ }
+
+ if ((mp->used & 2) && (mp->msgstr_len > strlen (mp->msgstr) + 1))
+ {
+ /* ref->msgid_plural == NULL but def->msgid_plural != NULL.
+ Use only the first among the plural forms. */
+
+ if (verbosity_level > 1)
+ {
+ po_gram_error_at_line (&mp->pos, _("\
+this message should not define plural forms"));
+ }
+
+ mp->msgstr_len = strlen (mp->msgstr) + 1;
+ mp->is_fuzzy = true;
+ }
+
+ /* Postprocessing of this message is done. */
+ mp->used = 0;
+ }
+ }
+ }
}
static msgdomain_list_ty *
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 6dd2279..70743c8 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,10 @@
+2001-11-30 Bruno Haible <bruno@clisp.org>
+
+ * msgmerge-17: New file.
+ * msgmerge-18: New file.
+ * msgmerge-19: New file.
+ * Makefile.am (TESTS): Add them.
+
2001-11-27 Bruno Haible <bruno@clisp.org>
* Makefile.am (TESTS): Add msgmerge-14, msgmerge-15, msgmerge-16.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0f07ba6..c7a1dfd 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -30,7 +30,8 @@ TESTS = gettext-1 gettext-2 \
msgfmt-8 msgfmt-9 \
msgmerge-1 msgmerge-2 msgmerge-3 msgmerge-4 msgmerge-5 msgmerge-6 \
msgmerge-7 msgmerge-8 msgmerge-9 msgmerge-10 msgmerge-11 msgmerge-12 \
- msgmerge-13 msgmerge-14 msgmerge-15 msgmerge-16 \
+ msgmerge-13 msgmerge-14 msgmerge-15 msgmerge-16 msgmerge-17 \
+ msgmerge-18 msgmerge-19 \
msgunfmt-1 \
msguniq-1 msguniq-2 msguniq-3 \
xgettext-1 xgettext-2 xgettext-3 xgettext-4 xgettext-5 xgettext-6 \
diff --git a/tests/msgmerge-17 b/tests/msgmerge-17
new file mode 100755
index 0000000..d729cb5
--- /dev/null
+++ b/tests/msgmerge-17
@@ -0,0 +1,92 @@
+#! /bin/sh
+
+# Test merging of a message which has plural forms in ref.pot but not
+# in def.po.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mm-test17.po"
+cat <<EOF > mm-test17.po
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-29 22:40+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#:foobar.c:29
+#, c-format
+msgid "%d error"
+msgstr "%d erreur"
+EOF
+
+tmpfiles="$tmpfiles mm-test17.pot"
+cat <<EOF > mm-test17.pot
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#:foobar.c:32
+#, c-format
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] ""
+msgstr[1] ""
+EOF
+
+tmpfiles="$tmpfiles mm-test17.out"
+: ${MSGMERGE=msgmerge}
+${MSGMERGE} -q mm-test17.po mm-test17.pot -o mm-test17.out
+
+tmpfiles="$tmpfiles mm-test17.ok"
+cat <<EOF > mm-test17.ok
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: foobar.c:32
+#, fuzzy, c-format
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] "%d erreur"
+msgstr[1] "%d erreur"
+EOF
+
+: ${DIFF=diff}
+${DIFF} mm-test17.ok mm-test17.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/tests/msgmerge-18 b/tests/msgmerge-18
new file mode 100755
index 0000000..662913c
--- /dev/null
+++ b/tests/msgmerge-18
@@ -0,0 +1,98 @@
+#! /bin/sh
+
+# Test merging of a message which has plural forms in ref.pot but not
+# in def.po.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mm-test18.po"
+cat <<EOF > mm-test18.po
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-29 22:40+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
+"%100==4 ? 2 : 3);\n"
+
+#:foobar.c:29
+#, c-format
+msgid "%d error"
+msgstr "%d erreur"
+EOF
+
+tmpfiles="$tmpfiles mm-test18.pot"
+cat <<EOF > mm-test18.pot
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#:foobar.c:32
+#, c-format
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] ""
+msgstr[1] ""
+EOF
+
+tmpfiles="$tmpfiles mm-test18.out"
+: ${MSGMERGE=msgmerge}
+${MSGMERGE} -q mm-test18.po mm-test18.pot -o mm-test18.out
+
+tmpfiles="$tmpfiles mm-test18.ok"
+cat <<EOF > mm-test18.ok
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
+"%100==4 ? 2 : 3);\n"
+
+#: foobar.c:32
+#, fuzzy, c-format
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] "%d erreur"
+msgstr[1] "%d erreur"
+msgstr[2] "%d erreur"
+msgstr[3] "%d erreur"
+EOF
+
+: ${DIFF=diff}
+${DIFF} mm-test18.ok mm-test18.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/tests/msgmerge-19 b/tests/msgmerge-19
new file mode 100755
index 0000000..6810492
--- /dev/null
+++ b/tests/msgmerge-19
@@ -0,0 +1,90 @@
+#! /bin/sh
+
+# Test merging of a message which has plural forms in def.po but not
+# in ref.pot.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mm-test19.po"
+cat <<EOF > mm-test19.po
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-29 22:40+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#:foobar.c:29
+#, c-format
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] "%d erreur"
+msgstr[1] "%d erreurs"
+EOF
+
+tmpfiles="$tmpfiles mm-test19.pot"
+cat <<EOF > mm-test19.pot
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#:foobar.c:32
+#, c-format
+msgid "%d error"
+msgstr ""
+EOF
+
+tmpfiles="$tmpfiles mm-test19.out"
+: ${MSGMERGE=msgmerge}
+${MSGMERGE} -q mm-test19.po mm-test19.pot -o mm-test19.out
+
+tmpfiles="$tmpfiles mm-test19.ok"
+cat <<EOF > mm-test19.ok
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: foobar.c:32
+#, fuzzy, c-format
+msgid "%d error"
+msgstr "%d erreur"
+EOF
+
+: ${DIFF=diff}
+${DIFF} mm-test19.ok mm-test19.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result