diff options
author | Junio C Hamano <gitster@pobox.com> | 2015-02-11 13:42:00 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-02-11 13:42:00 -0800 |
commit | b19aab58f1bc44e9a6715f26ba32b8c9cda3b1fa (patch) | |
tree | 9d635234f5f32ffcb4524dcdeb0373c4476f2427 | |
parent | 1c4ebbc3ad25943c231db14e7e4fd757590fbfa9 (diff) | |
parent | 290c8e7a3fe182ff64c3e6b76fbbbc6dcff4727c (diff) | |
download | git-b19aab58f1bc44e9a6715f26ba32b8c9cda3b1fa.tar.gz |
Merge branch 'km/gettext-n'
* km/gettext-n:
gettext.h: add parentheses around N_ expansion if supported
-rw-r--r-- | Makefile | 17 | ||||
-rw-r--r-- | gettext.h | 24 | ||||
-rw-r--r-- | git-compat-util.h | 4 |
3 files changed, 45 insertions, 0 deletions
@@ -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) @@ -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 diff --git a/git-compat-util.h b/git-compat-util.h index 553fc01762..68c07af9d4 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -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 |