diff options
author | Bruno Haible <bruno@clisp.org> | 2002-02-05 13:01:04 +0000 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2009-06-22 01:15:52 +0200 |
commit | 9330dd140aba25cbff40f17bb447c2283a0e754a (patch) | |
tree | aec5bb55ce724127a43bb034de7a1aac55c365b7 | |
parent | 3a28345323eaf54471af4ba5f8e40c67d1de9451 (diff) | |
download | external_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/ChangeLog | 5 | ||||
-rw-r--r-- | src/xgettext.c | 60 |
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)) |