diff options
author | Jonathan Nieder <jrnieder@gmail.com> | 2011-03-08 02:33:44 -0600 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-03-08 12:02:31 -0800 |
commit | 26db0f2e3afc043e184a5e0ce5eb7c53aeb1f644 (patch) | |
tree | 2a3fb0dcbfac0afb11ed2e23b39c3f88a2f5cac4 | |
parent | ebeb60900fbab569ed14f710a0a1abb1637ec792 (diff) | |
download | git-26db0f2e3afc043e184a5e0ce5eb7c53aeb1f644.tar.gz git-26db0f2e3afc043e184a5e0ce5eb7c53aeb1f644.tar.xz |
compat: fall back on __va_copy if available
Since an obvious implementation of va_list is to make it a pointer
into the stack frame, implementing va_copy as "dst = src" will work on
many systems. Platforms that use something different (e.g., a size-1
array of structs, to be assigned with *(dst) = *(src)) will need some
other compatibility macro, though.
Luckily, as the glibc manual hints, such systems tend to provide the
__va_copy macro (introduced in GCC in March, 1997). By using that if
it is available, we can cover our bases pretty well.
Discovered by building with CC="gcc -std=c89" on an amd64 machine:
$ make CC=c89 strbuf.o
[...]
strbuf.c: In function 'strbuf_vaddf':
strbuf.c:211:2: error: incompatible types when assigning to type 'va_list'
from type 'struct __va_list_tag *'
make: *** [strbuf.o] Error 1
Explained-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | git-compat-util.h | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/git-compat-util.h b/git-compat-util.h index 00d41e4f0..f4cb0a9b0 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -536,7 +536,16 @@ void git_qsort(void *base, size_t nmemb, size_t size, #endif #ifndef va_copy -#define va_copy(dst,src) (dst) = (src) +/* + * Since an obvious implementation of va_list would be to make it a + * pointer into the stack frame, a simple assignment will work on + * many systems. But let's try to be more portable. + */ +#ifdef __va_copy +#define va_copy(dst, src) __va_copy(dst, src) +#else +#define va_copy(dst, src) ((dst) = (src)) +#endif #endif /* |