Merge branch 'km/gettext-n'
authorJunio C Hamano <gitster@pobox.com>
Wed, 11 Feb 2015 21:42:00 +0000 (13:42 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 11 Feb 2015 21:42:00 +0000 (13:42 -0800)
* km/gettext-n:
gettext.h: add parentheses around N_ expansion if supported

Makefile
gettext.h
git-compat-util.h
index c44eb3a8511c1d179113c241245f4a0ba8dc2787..e8ce649ca1e2fb536e7de366205666388d8cfdf7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -348,6 +348,15 @@ all::
 #
 # Define NO_HMAC_CTX_CLEANUP if your OpenSSL is version 0.9.6b or earlier to
 # cleanup the HMAC context with the older HMAC_cleanup function.
+#
+# Define USE_PARENS_AROUND_GETTEXT_N to "yes" if your compiler happily
+# compiles the following initialization:
+#
+#   static const char s[] = ("FOO");
+#
+# and define it to "no" if you need to remove the parentheses () around the
+# constant.  The default is "auto", which means to use parentheses if your
+# compiler is detected to support it.
 
 GIT-VERSION-FILE: FORCE
        @$(SHELL_PATH) ./GIT-VERSION-GEN
@@ -955,6 +964,14 @@ ifneq (,$(SOCKLEN_T))
        BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
 endif
 
+ifeq (yes,$(USE_PARENS_AROUND_GETTEXT_N))
+       BASIC_CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=1
+else
+ifeq (no,$(USE_PARENS_AROUND_GETTEXT_N))
+       BASIC_CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=0
+endif
+endif
+
 ifeq ($(uname_S),Darwin)
        ifndef NO_FINK
                ifeq ($(shell test -d /sw/lib && echo y),y)
index 7671d09d04bb87541b11209b5cdbddbb9e4e59b8..dc1722dd4bc6b1aa7d998cb055a40000c05a0b5e 100644 (file)
--- a/gettext.h
+++ b/gettext.h
@@ -63,6 +63,30 @@ const char *Q_(const char *msgid, const char *plu, unsigned long n)
 }
 
 /* Mark msgid for translation but do not translate it. */
+#if !USE_PARENS_AROUND_GETTEXT_N
 #define N_(msgid) msgid
+#else
+/*
+ * Strictly speaking, this will lead to invalid C when
+ * used this way:
+ *     static const char s[] = N_("FOO");
+ * which will expand to
+ *     static const char s[] = ("FOO");
+ * and in valid C, the initializer on the right hand side must
+ * be without the parentheses.  But many compilers do accept it
+ * as a language extension and it will allow us to catch mistakes
+ * like:
+ *     static const char *msgs[] = {
+ *             N_("one")
+ *             N_("two"),
+ *             N_("three"),
+ *             NULL
+ *     };
+ * (notice the missing comma on one of the lines) by forcing
+ * a compilation error, because parenthesised ("one") ("two")
+ * will not get silently turned into ("onetwo").
+ */
+#define N_(msgid) (msgid)
+#endif
 
 #endif
index 553fc017623be771878778c84aca08a4684f6902..68c07af9d465ce92d78b11d347ae0396299a1855 100644 (file)
@@ -875,4 +875,8 @@ struct tm *git_gmtime_r(const time_t *, struct tm *);
 #define gmtime_r git_gmtime_r
 #endif
 
+#if !defined(USE_PARENS_AROUND_GETTEXT_N) && defined(__GNUC__)
+#define USE_PARENS_AROUND_GETTEXT_N 1
+#endif
+
 #endif