Flag the L_() function with attribute format_arg.
authorWerner Koch <wk@gnupg.org>
Tue, 30 Jun 2015 20:28:41 +0000 (22:28 +0200)
committerWerner Koch <wk@gnupg.org>
Tue, 30 Jun 2015 20:28:41 +0000 (22:28 +0200)
* agent/agent.h (LunderscorePROTO): New.
* common/util.h (GNUPG_GCC_ATTR_FORMAT_ARG): New.
* common/i18n.h (GNUPG_GCC_ATTR_FORMAT_ARG): New. Use for
i18n_localegettext.  Expand LunderscorePROTO.
* agent/genkey.c (check_passphrase_constraints): Use xtryasprintf
again to keep the old translations.
--

Signed-off-by: Werner Koch <wk@gnupg.org>
agent/agent.h
agent/genkey.c
common/i18n.h
common/util.h

index 70d63cf..2948bff 100644 (file)
@@ -301,6 +301,10 @@ typedef int (*lookup_ttl_t)(const char *hexgrip);
    the connection.  The macro LunderscoreIMPL is used by i18n to
    actually define the inline function when needed.  */
 #define L_(a) agent_Lunderscore (ctrl, (a))
+#define LunderscorePROTO                                            \
+  static inline const char *agent_Lunderscore (ctrl_t ctrl,         \
+                                               const char *string)  \
+    GNUPG_GCC_ATTR_FORMAT_ARG(2);
 #define LunderscoreIMPL                                         \
   static inline const char *                                    \
   agent_Lunderscore (ctrl_t ctrl, const char *string)           \
index b5dee8e..df17880 100644 (file)
@@ -271,8 +271,9 @@ check_passphrase_constraints (ctrl_t ctrl, const char *pw,
           goto leave;
         }
 
-      msg3 = xtrystrdup (L_("A passphrase may not be a known term or match%0A"
-                            "certain pattern."));
+      msg3 = xtryasprintf
+        (L_("A passphrase may not be a known term or match%%0A"
+            "certain pattern."));
       if (!msg3)
         {
           err = gpg_error_from_syserror ();
index 8507b8f..45710b2 100644 (file)
 # endif
 #endif /*!USE_SIMPLE_GETTEXT*/
 
+#ifndef GNUPG_GCC_ATTR_FORMAT_ARG
+#if __GNUC__ >= 3 /* Actually 2.8 but testing the major is easier.  */
+# define GNUPG_GCC_ATTR_FORMAT_ARG(a)  __attribute__ ((__format_arg__ (a)))
+#else
+# define GNUPG_GCC_ATTR_FORMAT_ARG(a)
+#endif
+#endif
+
 void i18n_init (void);
 char *i18n_switchto_utf8 (void);
 void i18n_switchback (char *saved_codeset);
 const char *i18n_utf8 (const char *string);
-const char *i18n_localegettext (const char *lc_messages, const char *string);
+const char *i18n_localegettext (const char *lc_messages, const char *string)
+                                GNUPG_GCC_ATTR_FORMAT_ARG(2);
 
 /* If a module wants a local L_() fucntion we define it here.  */
 #ifdef LunderscoreIMPL
+LunderscorePROTO
 LunderscoreIMPL
 #endif
 
index d5ddc1f..b92d78c 100644 (file)
 
 
 /* GCC attributes.  */
+#ifndef GNUPG_GCC_ATTR_FORMAT_ARG
+#if __GNUC__ >= 3 /* Actually 2.8 but testing the major is easier.  */
+# define GNUPG_GCC_ATTR_FORMAT_ARG(a)  __attribute__ ((__format_arg__ (a)))
+#else
+# define GNUPG_GCC_ATTR_FORMAT_ARG(a)
+#endif
+#endif
+
 #if __GNUC__ >= 4
 # define GNUPG_GCC_A_SENTINEL(a) __attribute__ ((sentinel(a)))
 #else