From: Pierre Ynard Date: Mon, 9 Mar 2009 11:18:14 +0000 (+0100) Subject: Win64: properly work around %z modifiers X-Git-Tag: 1.0.0-pre1~150 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=0cca872b95aff09b9c12d0b871fd4a56d422a6d1;p=vlc Win64: properly work around %z modifiers size_t are 64-bit long on Win64, adapt the wrapper for it Signed-off-by: RĂ©mi Denis-Courmont --- diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h index f685806c03..e6906e9d1f 100644 --- a/include/vlc_fixups.h +++ b/include/vlc_fixups.h @@ -42,9 +42,40 @@ static inline char *strdup (const char *str) /* Windows' printf doesn't support %z modifiers, thus we need to rewrite * the format string in a wrapper. */ # include +# include static inline char *vlc_fix_format_string (const char *format) { - char *fmt, *f; + char *fmt; +# ifdef WIN64 + const char *src = format, *tmp; + char *dst; + size_t n = 0; + while ((tmp = strstr (src, "%z")) != NULL) + { + n++; + src = tmp + 2; + } + if (n == 0) + return NULL; + + fmt = (char*)malloc (strlen (format) + n + 1); + if (fmt == NULL) + return NULL; + + src = format; + dst = fmt; + while ((tmp = strstr (src, "%z")) != NULL) + { + size_t d = tmp - src; + memcpy (dst, src, d); + dst += d; + memcpy (dst, "%ll", 3); + dst += 3; + src = tmp + 2; + } + strcpy (dst, src); +# else + char *f; if (strstr (format, "%z") == NULL) return NULL; @@ -56,10 +87,10 @@ static inline char *vlc_fix_format_string (const char *format) { f[1] = 'l'; } +# endif return fmt; } -# include # include # include