This helps reproducible builds.
Reported at <https://savannah.gnu.org/bugs/?49654>.
* gettext-tools/src/msgl-header.h (message_list_delete_header_field): New
declaration.
* gettext-tools/src/msgl-header.c (known_fields): New variable, extracted from
msgdomain_list_set_header_field.
(message_list_delete_header_field): New function.
* gettext-tools/src/write-mo.c: Include msgl-header.h.
(msgdomain_write_mo): Delete the POT-Creation-Date field.
* gettext-tools/src/write-java.c: Include msgl-header.h.
(msgdomain_write_java): Delete the POT-Creation-Date field.
* gettext-tools/src/write-csharp.c: Include msgl-header.h.
(msgdomain_write_csharp): Delete the POT-Creation-Date field.
* gettext-tools/src/write-resources.c: Include msgl-header.h.
(msgdomain_write_csharp_resources): Delete the POT-Creation-Date field.
* gettext-tools/src/write-tcl.c: Include msgl-header.h.
(msgdomain_write_tcl): Delete the POT-Creation-Date field.
* gettext-tools/src/write-qt.c: Include msgl-header.h.
(msgdomain_write_qt): Delete the POT-Creation-Date field.
* gettext-tools/src/write-desktop.c: Include msgl-header.h.
(msgdomain_write_desktop): Delete the POT-Creation-Date field.
* gettext-tools/src/write-xml.c: Include msgl-header.h.
(msgdomain_write_xml): Delete the POT-Creation-Date field.
* gettext-tools/tests/msgfmt-19: New file, based on
gettext-tools/tests/msgfmt-18.
* gettext-tools/tests/Makefile.am (TESTS): Add it.
#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
-void
-msgdomain_list_set_header_field (msgdomain_list_ty *mdlp,
- const char *field, const char *value)
+/* The known fields in their usual order. */
+static const struct
{
- /* The known fields in their usual order. */
- static const struct
- {
- const char *name;
- size_t len;
- }
+ const char *name;
+ size_t len;
+}
known_fields[] =
{
{ "Project-Id-Version:", sizeof ("Project-Id-Version:") - 1 },
{ "Content-Transfer-Encoding:",
sizeof ("Content-Transfer-Encoding:") - 1 }
};
+
+void
+msgdomain_list_set_header_field (msgdomain_list_ty *mdlp,
+ const char *field, const char *value)
+{
size_t field_len;
int field_index;
size_t k, i;
}
}
}
+
+
+void
+message_list_delete_header_field (message_list_ty *mlp,
+ const char *field)
+{
+ size_t j;
+ int field_index;
+ size_t k;
+
+ /* Search the field in known_fields[]. */
+ field_index = -1;
+ for (k = 0; k < SIZEOF (known_fields); k++)
+ if (strcmp (known_fields[k].name, field) == 0)
+ {
+ field_index = k;
+ break;
+ }
+
+ size_t field_len;
+ field_len = strlen (field);
+
+ /* Search the header entry. */
+ for (j = 0; j < mlp->nitems; j++)
+ if (is_header (mlp->item[j]) && !mlp->item[j]->obsolete)
+ {
+ message_ty *mp = mlp->item[j];
+
+ /* Modify the header entry. */
+ const char *header = mp->msgstr;
+ char *new_header =
+ XCALLOC (strlen (header) + 1,
+ char);
+
+ /* Test whether the field already occurs in the header entry. */
+ const char *h;
+
+ for (h = header; *h != '\0'; )
+ {
+ if (strncmp (h, field, field_len) == 0)
+ break;
+ h = strchr (h, '\n');
+ if (h == NULL)
+ break;
+ h++;
+ }
+ if (h != NULL && *h != '\0')
+ {
+ /* Replace the field. */
+ char *p = new_header;
+ memcpy (p, header, h - header);
+ p += h - header;
+ h = strchr (h, '\n');
+ if (h != NULL)
+ {
+ h++;
+ stpcpy (p, h);
+ }
+ }
+ else
+ {
+ char *p = new_header;
+ p = stpcpy (p, header);
+ }
+
+ mp->msgstr = new_header;
+ }
+}
msgdomain_list_set_header_field (msgdomain_list_ty *mdlp,
const char *field, const char *value);
+extern void
+ message_list_delete_header_field (message_list_ty *mlp, const char *field);
+
#ifdef __cplusplus
}
#include "message.h"
#include "msgfmt.h"
#include "msgl-iconv.h"
+#include "msgl-header.h"
#include "plural-exp.h"
#include "po-charset.h"
#include "xalloc.h"
/* Convert the messages to Unicode. */
iconv_message_list (mlp, canon_encoding, po_charset_utf8, NULL);
+ message_list_delete_header_field (mlp, "POT-Creation-Date:");
+
/* Create a temporary directory where we can put the C# file.
A simple temporary file would also be possible but would require us to
define our own variant of mkstemp(): On one hand the functions mktemp(),
#include <stdio.h>
#include "error.h"
#include "msgl-iconv.h"
+#include "msgl-header.h"
#include "po-charset.h"
#include "read-catalog.h"
#include "read-po.h"
/* Convert the messages to Unicode. */
iconv_message_list (mlp, canon_encoding, po_charset_utf8, NULL);
+ message_list_delete_header_field (mlp, "POT-Creation-Date:");
+
/* Create a single-element operands and run the bulk operation on it. */
operand.language = (char *) locale_name;
operand.mlp = mlp;
#include "message.h"
#include "msgfmt.h"
#include "msgl-iconv.h"
+#include "msgl-header.h"
#include "plural-exp.h"
#include "po-charset.h"
#include "xalloc.h"
/* Convert the messages to Unicode. */
iconv_message_list (mlp, canon_encoding, po_charset_utf8, NULL);
+ message_list_delete_header_field (mlp, "POT-Creation-Date:");
+
if (output_source)
{
tmpdir = NULL;
#include "binary-io.h"
#include "fwriteerror.h"
#include "gettext.h"
+#include "read-catalog.h"
+#include "read-stringtable.h"
+#include "msgl-header.h"
#define _(str) gettext (str)
if (output_file != NULL)
{
+ message_list_delete_header_field (mlp, "POT-Creation-Date:");
write_table (output_file, mlp);
/* Make sure nothing went wrong. */
#include "message.h"
#include "po-charset.h"
#include "msgl-iconv.h"
+#include "msgl-header.h"
#include "hash-string.h"
#include "unistr.h"
#include "xalloc.h"
if (output_file != NULL)
{
+ message_list_delete_header_field (mlp, "POT-Creation-Date:");
write_qm (output_file, mlp);
/* Make sure nothing went wrong. */
#include "message.h"
#include "msgfmt.h"
#include "msgl-iconv.h"
+#include "msgl-header.h"
#include "po-charset.h"
#include "xalloc.h"
#include "concat-filename.h"
const char *domain_name,
const char *file_name)
{
+ message_list_delete_header_field (mlp, "POT-Creation-Date:");
+
/* If no entry for this domain don't even create the file. */
if (mlp->nitems != 0)
{
#include "xerror.h"
#include "message.h"
#include "msgl-iconv.h"
+#include "msgl-header.h"
#include "po-charset.h"
#include "xalloc.h"
#include "xmalloca.h"
return 1;
}
+ message_list_delete_header_field (mlp, "POT-Creation-Date:");
write_msg (output_file, mlp, frobbed_locale_name);
/* Make sure nothing went wrong. */
#include <stdio.h>
#include "error.h"
#include "msgl-iconv.h"
+#include "msgl-header.h"
#include "po-charset.h"
#include "read-catalog.h"
#include "read-po.h"
/* Convert the messages to Unicode. */
iconv_message_list (mlp, canon_encoding, po_charset_utf8, NULL);
+ message_list_delete_header_field (mlp, "POT-Creation-Date:");
+
/* Create a single-element operands and run the bulk operation on it. */
operand.language = (char *) locale_name;
operand.mlp = mlp;
msgfilter-sr-latin-1 msgfilter-quote-1 \
msgfmt-1 msgfmt-2 msgfmt-3 msgfmt-4 msgfmt-5 msgfmt-6 msgfmt-7 \
msgfmt-8 msgfmt-9 msgfmt-10 msgfmt-11 msgfmt-12 msgfmt-13 msgfmt-14 \
- msgfmt-15 msgfmt-16 msgfmt-17 msgfmt-18 \
+ msgfmt-15 msgfmt-16 msgfmt-17 msgfmt-18 msgfmt-19 \
msgfmt-properties-1 \
msgfmt-qt-1 msgfmt-qt-2 \
msgfmt-desktop-1 msgfmt-desktop-2 \
--- /dev/null
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test accelerators.
+
+cat <<\EOF > mf-19-1.po
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU bison\n"
+"POT-Creation-Date: 2017-04-05 19:47+0200\n"
+"PO-Revision-Date: 2017-06-07 09:07+0000\n"
+"Last-Translator: ABC DEF <abc@gnu.uucp>\n"
+"Language-Team: test <test@li.org>\n"
+"Language: test\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "pen &File"
+msgstr "pen File"
+
+msgid "how _Help"
+msgstr "how Help"
+EOF
+
+
+cat <<\EOF > mf-19-2.po
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU bison\n"
+"POT-Creation-Date: 2016-03-04 18:46+0100\n"
+"PO-Revision-Date: 2017-06-07 09:07+0000\n"
+"Last-Translator: ABC DEF <abc@gnu.uucp>\n"
+"Language-Team: test <test@li.org>\n"
+"Language: test\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "pen &File"
+msgstr "pen File"
+
+msgid "how _Help"
+msgstr "how Help"
+EOF
+
+
+: ${MSGFMT=msgfmt}
+${MSGFMT} -o mf-19-1.mo mf-19-1.po 2>/dev/null
+test $? = 0 || { Exit 1; }
+
+: ${MSGFMT=msgfmt}
+${MSGFMT} -o mf-19-2.mo mf-19-2.po 2>/dev/null
+test $? = 0 || { Exit 1; }
+
+: ${DIFF=diff}
+${DIFF} mf-19-1.mo mf-19-2.mo
+test $? = 0 || { Exit 1; }