summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2002-02-05 13:01:04 +0000
committerBruno Haible <bruno@clisp.org>2009-06-22 01:15:52 +0200
commit9330dd140aba25cbff40f17bb447c2283a0e754a (patch)
treeaec5bb55ce724127a43bb034de7a1aac55c365b7
parent3a28345323eaf54471af4ba5f8e40c67d1de9451 (diff)
downloadexternal_gettext-9330dd140aba25cbff40f17bb447c2283a0e754a.zip
external_gettext-9330dd140aba25cbff40f17bb447c2283a0e754a.tar.gz
external_gettext-9330dd140aba25cbff40f17bb447c2283a0e754a.tar.bz2
Improved handling of plural forms in header entry.
-rw-r--r--src/ChangeLog5
-rw-r--r--src/xgettext.c60
2 files changed, 65 insertions, 0 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 0253fd3..1a2007f 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,10 @@
2002-02-03 Bruno Haible <bruno@clisp.org>
+ * xgettext.c (finalize_header): New function.
+ (main): Call it.
+
+2002-02-03 Bruno Haible <bruno@clisp.org>
+
* msginit.c (fill_header): Also replace "PACKAGE" in the comment.
2002-02-02 Bruno Haible <bruno@clisp.org>
diff --git a/src/xgettext.c b/src/xgettext.c
index 7d766bd..a973f56 100644
--- a/src/xgettext.c
+++ b/src/xgettext.c
@@ -174,6 +174,7 @@ static void extract_from_file PARAMS ((const char *file_name,
extractor_func extractor,
msgdomain_list_ty *mdlp));
static message_ty *construct_header PARAMS ((void));
+static void finalize_header PARAMS ((msgdomain_list_ty *mdlp));
static extractor_func language_to_extractor PARAMS ((const char *name));
static const char *extension_to_language PARAMS ((const char *extension));
@@ -486,6 +487,10 @@ warning: file `%s' extension `%s' is unknown; will try C"), fname, extension);
}
string_list_free (file_list);
+ /* Finalize the constructed header. */
+ if (!xgettext_omit_header)
+ finalize_header (mdlp);
+
/* Sorting the list of messages. */
if (sort_by_filepos)
msgdomain_list_sort_by_filepos (mdlp);
@@ -1163,6 +1168,61 @@ FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n");
return mp;
}
+static void
+finalize_header (mdlp)
+ msgdomain_list_ty *mdlp;
+{
+ /* If the generated PO file has plural forms, add a Plural-Forms template
+ to the constructed header. */
+ bool has_plural;
+ size_t i, j;
+
+ has_plural = false;
+ for (i = 0; i < mdlp->nitems; i++)
+ {
+ message_list_ty *mlp = mdlp->item[i]->messages;
+
+ for (j = 0; j < mlp->nitems; j++)
+ {
+ message_ty *mp = mlp->item[j];
+
+ if (mp->msgid_plural != NULL)
+ {
+ has_plural = true;
+ break;
+ }
+ }
+ if (has_plural)
+ break;
+ }
+
+ if (has_plural)
+ {
+ message_ty *header = message_list_search (mdlp->item[0]->messages, "");
+ if (header != NULL
+ && strstr (header->msgstr, "Plural-Forms:") == NULL)
+ {
+ size_t insertpos = strlen (header->msgstr);
+ const char *suffix;
+ size_t suffix_len;
+ char *new_msgstr;
+
+ suffix = "\nPlural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n";
+ if (insertpos == 0 || header->msgstr[insertpos-1] == '\n')
+ suffix++;
+ suffix_len = strlen (suffix);
+ new_msgstr = (char *) xmalloc (header->msgstr_len + suffix_len);
+ memcpy (new_msgstr, header->msgstr, insertpos);
+ memcpy (new_msgstr + insertpos, suffix, suffix_len);
+ memcpy (new_msgstr + insertpos + suffix_len,
+ header->msgstr + insertpos,
+ header->msgstr_len - insertpos);
+ header->msgstr = new_msgstr;
+ header->msgstr_len = header->msgstr_len + suffix_len;
+ }
+ }
+}
+
#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
#define ENDOF(a) ((a) + SIZEOF(a))