]> git.deb.at Git - pkg/abook.git/blobdiff - intl/log.c
Autotools update to autoconf-2.68 / automake-1.11 / gettextize 0.18.1.
[pkg/abook.git] / intl / log.c
index cb6076e80f7607d0f4f9bf23658c77e2d4f9d4ac..a3e4b27263e9573791c0ebf698555d8e8e619959 100644 (file)
@@ -1,5 +1,5 @@
 /* Log file output.
-   Copyright (C) 2003 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
@@ -13,7 +13,7 @@
 
    You should have received a copy of the GNU Library General Public
    License along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
    USA.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>.  */
 #include <stdlib.h>
 #include <string.h>
 
+/* Handle multi-threaded applications.  */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+#else
+# 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')
-         return;
-       fputs ("\n\"", stream);
+        fputs ("\\n\"", stream);
+        if (str + 1 == str_end)
+          return;
+        fputs ("\n\"", stream);
       }
     else
       {
-       if (*str == '"' || *str == '\\')
-         putc ('\\', stream);
-       putc (*str, stream);
+        if (*str == '"' || *str == '\\')
+          putc ('\\', stream);
+        putc (*str, stream);
       }
   putc ('"', stream);
 }
 
-/* Add to the log file an entry denoting a failed translation.  */
-void
-_nl_log_untranslated (const char *logfilename, const char *domainname,
-                     const char *msgid1, const char *msgid2, int plural)
+static char *last_logfilename = NULL;
+static FILE *last_logfile = NULL;
+__libc_lock_define_initialized (static, lock)
+
+static inline void
+_nl_log_untranslated_locked (const char *logfilename, const char *domainname,
+                             const char *msgid1, const char *msgid2, int plural)
 {
-  static char *last_logfilename = NULL;
-  static FILE *last_logfile = NULL;
   FILE *logfile;
+  const char *separator;
 
   /* Can we reuse the last opened logfile?  */
   if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0)
     {
       /* Close the last used logfile.  */
       if (last_logfilename != NULL)
-       {
-         if (last_logfile != NULL)
-           {
-             fclose (last_logfile);
-             last_logfile = NULL;
-           }
-         free (last_logfilename);
-         last_logfilename = NULL;
-       }
+        {
+          if (last_logfile != NULL)
+            {
+              fclose (last_logfile);
+              last_logfile = NULL;
+            }
+          free (last_logfilename);
+          last_logfilename = NULL;
+        }
       /* Open the logfile.  */
       last_logfilename = (char *) malloc (strlen (logfilename) + 1);
       if (last_logfilename == NULL)
-       return;
+        return;
       strcpy (last_logfilename, logfilename);
       last_logfile = fopen (logfilename, "a");
       if (last_logfile == NULL)
-       return;
+        return;
     }
   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
     fprintf (logfile, "\nmsgstr \"\"\n");
   putc ('\n', logfile);
 }
+
+/* Add to the log file an entry denoting a failed translation.  */
+void
+_nl_log_untranslated (const char *logfilename, const char *domainname,
+                      const char *msgid1, const char *msgid2, int plural)
+{
+  __libc_lock_lock (lock);
+  _nl_log_untranslated_locked (logfilename, domainname, msgid1, msgid2, plural);
+  __libc_lock_unlock (lock);
+}