• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Writing XML files.
2    Copyright (C) 1995-1998, 2000-2003, 2005-2006, 2008-2009, 2014-2016 Free
3    Software Foundation, Inc.
4    This file was written by Daiki Ueno <ueno@gnu.org>.
5 
6    This program is free software: you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
18 
19 #ifdef HAVE_CONFIG_H
20 # include <config.h>
21 #endif
22 
23 /* Specification.  */
24 #include "write-xml.h"
25 
26 #include <assert.h>
27 #include <errno.h>
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include "error.h"
31 #include "msgl-iconv.h"
32 #include "msgl-header.h"
33 #include "po-charset.h"
34 #include "read-catalog.h"
35 #include "read-po.h"
36 #include "fwriteerror.h"
37 #include "xalloc.h"
38 #include "gettext.h"
39 
40 #define _(str) gettext (str)
41 
42 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)43 msgdomain_write_xml_bulk (msgfmt_operand_list_ty *operands,
44                           const char *template_file_name,
45                           its_rule_list_ty *its_rules,
46                           const char *file_name)
47 {
48   its_merge_context_ty *context;
49   size_t i;
50   FILE *fp;
51 
52   if (strcmp (file_name, "-") == 0)
53     fp = stdout;
54   else
55     {
56       fp = fopen (file_name, "wb");
57       if (fp == NULL)
58         {
59           error (0, errno, _("cannot create output file \"%s\""),
60                  file_name);
61           return 1;
62         }
63     }
64 
65   context = its_merge_context_alloc (its_rules, template_file_name);
66   for (i = 0; i < operands->nitems; i++)
67     its_merge_context_merge (context,
68                              operands->items[i].language,
69                              operands->items[i].mlp);
70   its_merge_context_write (context, fp);
71   its_merge_context_free (context);
72 
73   /* Make sure nothing went wrong.  */
74   if (fwriteerror (fp))
75     {
76       error (0, errno, _("error while writing \"%s\" file"),
77              file_name);
78       return 1;
79     }
80 
81   return 0;
82 }
83 
84 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)85 msgdomain_write_xml (message_list_ty *mlp,
86                      const char *canon_encoding,
87                      const char *locale_name,
88                      const char *template_file_name,
89                      its_rule_list_ty *its_rules,
90                      const char *file_name)
91 {
92   msgfmt_operand_ty operand;
93   msgfmt_operand_list_ty operands;
94 
95   /* Convert the messages to Unicode.  */
96   iconv_message_list (mlp, canon_encoding, po_charset_utf8, NULL);
97 
98   /* Support for "reproducible builds": Delete information that may vary
99      between builds in the same conditions.  */
100   message_list_delete_header_field (mlp, "POT-Creation-Date:");
101 
102   /* Create a single-element operands and run the bulk operation on it.  */
103   operand.language = (char *) locale_name;
104   operand.mlp = mlp;
105   operands.nitems = 1;
106   operands.items = &operand;
107 
108   return msgdomain_write_xml_bulk (&operands,
109                                    template_file_name,
110                                    its_rules,
111                                    file_name);
112 }
113