diff options
author | Bruno Haible <bruno@clisp.org> | 2001-11-30 13:04:09 +0000 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2009-06-21 23:29:38 +0200 |
commit | 28643aae6fd21c87317f0e77cd052f49a6ed0c0e (patch) | |
tree | 99f644436656c8cdbbe69dd698405b24176a979b | |
parent | fd737ee7e18b4c1c8282a2eb2d0ed56cf975402e (diff) | |
download | external_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/ChangeLog | 8 | ||||
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/message.c | 13 | ||||
-rw-r--r-- | src/msgmerge.c | 81 | ||||
-rw-r--r-- | tests/ChangeLog | 7 | ||||
-rw-r--r-- | tests/Makefile.am | 3 | ||||
-rwxr-xr-x | tests/msgmerge-17 | 92 | ||||
-rwxr-xr-x | tests/msgmerge-18 | 98 | ||||
-rwxr-xr-x | tests/msgmerge-19 | 90 |
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 |