diff options
author | Daiki Ueno <ueno@gnu.org> | 2015-10-05 17:18:41 +0900 |
---|---|---|
committer | Daiki Ueno <ueno@gnu.org> | 2015-10-15 13:09:43 +0900 |
commit | 2d1143a6ac1d52a6d946eefe9ae31cfecc9e371e (patch) | |
tree | 96946aecb67f956fa50f2b1cd1b986089fd4eb09 /gettext-tools/src/write-xml.c | |
parent | 8701164b866f926568dad22eb221fea8438fb9f1 (diff) | |
download | gettext-wip/ueno/its2.tar.gz |
msgfmt: Support XML file mergingwip/ueno/its2
* gettext-tools/src/Makefile.am (noinst_HEADERS): Add write-xml.h.
(msgfmt_SOURCES): Add write-xml.c.
* gettext-tools/src/its.c (its_merge_context_merge_node): New function.
(its_merge_context_merge): New function.
(its_merge_context_alloc): New function.
(its_merge_context_write): New function.
(its_merge_context_free): New function.
* gettext-tools/src/its.h (its_merge_context_ty): New type.
* gettext-tools/src/msgfmt.c: Include "its.h", "locating-rule.h", and
"write-xml.h".
(SIZEOF): New macro.
(xml_mode, xml_locale_name, xml_template_name, xml_base_directory,
xml_language, xml_its_rules): New variable.
(long_options): Add --language and --xml.
(main): Handle new options.
(usage): Document new options.
(msgfmt_xml_bulk): New function.
* gettext-tools/src/write-xml.c: New file.
* gettext-tools/src/write-xml.h: New file.
* gettext-tools/doc/gettext.texi: Mention XML file merging use-case.
* gettext-tools/doc/msgfmt.texi: Mention --xml option.
* gettext-tools/tests/msgfmt-xml-1: New file.
* gettext-tools/tests/msgfmt-xml-2: New file.
* gettext-tools/tests/Makefile.am (TESTS): Add new tests.
Diffstat (limited to 'gettext-tools/src/write-xml.c')
-rw-r--r-- | gettext-tools/src/write-xml.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/gettext-tools/src/write-xml.c b/gettext-tools/src/write-xml.c new file mode 100644 index 000000000..38e319580 --- /dev/null +++ b/gettext-tools/src/write-xml.c @@ -0,0 +1,107 @@ +/* Writing XML files. + Copyright (C) 1995-1998, 2000-2003, 2005-2006, 2008-2009, 2014-2015 + Free Software Foundation, Inc. + This file was written by Daiki Ueno <ueno@gnu.org>. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +/* Specification. */ +#include "write-xml.h" + +#include <assert.h> +#include <errno.h> +#include <stdlib.h> +#include <stdio.h> +#include "error.h" +#include "msgl-iconv.h" +#include "po-charset.h" +#include "read-catalog.h" +#include "read-po.h" +#include "fwriteerror.h" +#include "xalloc.h" +#include "gettext.h" + +#define _(str) gettext (str) + +int +msgdomain_write_xml_bulk (msgfmt_operand_list_ty *operands, + const char *template_file_name, + its_rule_list_ty *its_rules, + const char *file_name) +{ + its_merge_context_ty *context; + size_t i; + FILE *fp; + + if (strcmp (file_name, "-") == 0) + fp = stdout; + else + { + fp = fopen (file_name, "wb"); + if (fp == NULL) + { + error (0, errno, _("cannot create output file \"%s\""), + file_name); + return 1; + } + } + + context = its_merge_context_alloc (its_rules, template_file_name); + for (i = 0; i < operands->nitems; i++) + its_merge_context_merge (context, + operands->items[i].language, + operands->items[i].mlp); + its_merge_context_write (context, fp); + its_merge_context_free (context); + + /* Make sure nothing went wrong. */ + if (fwriteerror (fp)) + { + error (0, errno, _("error while writing \"%s\" file"), + file_name); + return 1; + } + + return 0; +} + +int +msgdomain_write_xml (message_list_ty *mlp, + const char *canon_encoding, + const char *locale_name, + const char *template_file_name, + its_rule_list_ty *its_rules, + const char *file_name) +{ + msgfmt_operand_ty operand; + msgfmt_operand_list_ty operands; + + /* Convert the messages to Unicode. */ + iconv_message_list (mlp, canon_encoding, po_charset_utf8, NULL); + + /* Create a single-element operands and run the bulk operation on it. */ + operand.language = (char *) locale_name; + operand.mlp = mlp; + operands.nitems = 1; + operands.items = &operand; + + return msgdomain_write_xml_bulk (&operands, + template_file_name, + its_rules, + file_name); +} |