1 /* Writing C# .resources files.
2 Copyright (C) 2003, 2005 Free Software Foundation, Inc.
3 Written by Bruno Haible <bruno@clisp.org>, 2003.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software Foundation,
17 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24 #include "write-resources.h"
34 #include "relocatable.h"
35 #include "csharpexec.h"
37 #include "wait-process.h"
40 #include "msgl-iconv.h"
41 #include "po-charset.h"
44 #include "fwriteerror.h"
48 #define _(str) gettext (str)
51 /* A .resources file has such a complex format that it's most easily generated
52 through the C# class ResourceWriter. So we start a C# process to execute
53 the WriteResource program, sending it the msgid/msgstr pairs as
54 NUL-terminated UTF-8 encoded strings. */
63 execute_writing_input (const char *progname
,
64 const char *prog_path
, char **prog_argv
,
67 struct locals
*l
= (struct locals
*) private_data
;
73 /* Open a pipe to the C# execution engine. */
74 child
= create_pipe_out (progname
, prog_path
, prog_argv
, NULL
, false,
77 fp
= fdopen (fd
[0], "wb");
79 error (EXIT_FAILURE
, errno
, _("fdopen() failed"));
81 /* Write the message list. */
83 message_list_ty
*mlp
= l
->mlp
;
86 for (j
= 0; j
< mlp
->nitems
; j
++)
88 message_ty
*mp
= mlp
->item
[j
];
90 fwrite (mp
->msgid
, 1, strlen (mp
->msgid
) + 1, fp
);
91 fwrite (mp
->msgstr
, 1, strlen (mp
->msgstr
) + 1, fp
);
96 error (EXIT_FAILURE
, 0, _("error while writing to %s subprocess"),
99 /* Remove zombie process from process list, and retrieve exit status. */
100 /* He we can ignore SIGPIPE because WriteResource either writes to a file
101 - then it never gets SIGPIPE - or to standard output, and in the latter
102 case it has no side effects other than writing to standard output. */
103 exitstatus
= wait_subprocess (child
, progname
, true, false, true, true);
105 error (EXIT_FAILURE
, 0, _("%s subprocess failed with exit code %d"),
106 progname
, exitstatus
);
112 msgdomain_write_csharp_resources (message_list_ty
*mlp
,
113 const char *canon_encoding
,
114 const char *domain_name
,
115 const char *file_name
)
117 /* If no entry for this domain don't even create the file. */
118 if (mlp
->nitems
!= 0)
120 /* Determine whether mlp has plural entries. */
126 for (j
= 0; j
< mlp
->nitems
; j
++)
127 if (mlp
->item
[j
]->msgid_plural
!= NULL
)
131 multiline_error (xstrdup (""),
133 message catalog has plural form translations\n\
134 but the C# .resources format doesn't support plural handling\n")));
139 /* Convert the messages to Unicode. */
140 iconv_message_list (mlp
, canon_encoding
, po_charset_utf8
, NULL
);
142 /* Execute the WriteResource program. */
145 const char *gettextexedir
;
147 struct locals locals
;
149 /* Prepare arguments. */
153 /* Make it possible to override the .exe location. This is
154 necessary for running the testsuite before "make install". */
155 gettextexedir
= getenv ("GETTEXTCSHARPEXEDIR");
156 if (gettextexedir
== NULL
|| gettextexedir
[0] == '\0')
157 gettextexedir
= relocate (LIBDIR
"/gettext");
160 concatenated_pathname (gettextexedir
, "msgfmt.net", ".exe");
164 if (execute_csharp_program (assembly_path
, NULL
, 0,
167 execute_writing_input
, &locals
))
168 /* An error message should already have been provided. */
171 free (assembly_path
);