+2009-01-15 Bruno Haible <bruno@clisp.org>
+
+ * log.c (MSGCTXT_SEPARATOR): New macro.
+ (print_escaped): Add an str_end argument.
+ (_nl_log_untranslated_locked): If msgid1 contains the msgctxt
+ separator, split it into msgctxt and msgid.
+ Reported at <https://savannah.gnu.org/bugs/?25315>.
+
2008-11-10 Ingo Weinhold <ingo_weinhold@gmx.de>
* config.charset: Treat Haiku like BeOS.
/* Log file output.
- Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2005, 2009 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published
# include "lock.h"
#endif
+/* Separator between msgctxt and msgid in .mo files. */
+#define MSGCTXT_SEPARATOR '\004' /* EOT */
+
/* Print an ASCII string with quotes and escape sequences where needed. */
static void
-print_escaped (FILE *stream, const char *str)
+print_escaped (FILE *stream, const char *str, const char *str_end)
{
putc ('"', stream);
- for (; *str != '\0'; str++)
+ for (; str != str_end; str++)
if (*str == '\n')
{
fputs ("\\n\"", stream);
- if (str[1] == '\0')
+ if (str + 1 == str_end)
return;
fputs ("\n\"", stream);
}
const char *msgid1, const char *msgid2, int plural)
{
FILE *logfile;
+ const char *separator;
/* Can we reuse the last opened logfile? */
if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0)
logfile = last_logfile;
fprintf (logfile, "domain ");
- print_escaped (logfile, domainname);
+ print_escaped (logfile, domainname, domainname + strlen (domainname));
+ separator = strchr (msgid1, MSGCTXT_SEPARATOR);
+ if (separator != NULL)
+ {
+ /* The part before the MSGCTXT_SEPARATOR is the msgctxt. */
+ fprintf (logfile, "\nmsgctxt ");
+ print_escaped (logfile, msgid1, separator);
+ msgid1 = separator + 1;
+ }
fprintf (logfile, "\nmsgid ");
- print_escaped (logfile, msgid1);
+ print_escaped (logfile, msgid1, msgid1 + strlen (msgid1));
if (plural)
{
fprintf (logfile, "\nmsgid_plural ");
- print_escaped (logfile, msgid2);
+ print_escaped (logfile, msgid2, msgid2 + strlen (msgid2));
fprintf (logfile, "\nmsgstr[0] \"\"\n");
}
else