From 5b61614c29e2cc6149536ce847b7580ba1151025 Mon Sep 17 00:00:00 2001 From: Pierre Ynard Date: Tue, 10 Mar 2009 10:48:09 +0100 Subject: [PATCH] Win32: wrappers to work around %z printf MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This patch works around unsupported %z modifiers, by using a wrapper around *printf functions that patches the format string on the fly. The format string is duplicated, and "%z"'s are replaced by "%l"'s. Signed-off-by: Rémi Denis-Courmont --- include/vlc_fixups.h | 110 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h index 87626e8f0d..f685806c03 100644 --- a/include/vlc_fixups.h +++ b/include/vlc_fixups.h @@ -38,6 +38,116 @@ static inline char *strdup (const char *str) } #endif +#ifdef WIN32 +/* Windows' printf doesn't support %z modifiers, thus we need to rewrite + * the format string in a wrapper. */ +# include +static inline char *vlc_fix_format_string (const char *format) +{ + char *fmt, *f; + if (strstr (format, "%z") == NULL) + return NULL; + + fmt = strdup (format); + if (fmt == NULL) + return NULL; + + while ((f = strstr (fmt, "%z")) != NULL) + { + f[1] = 'l'; + } + return fmt; +} + +# include +# include +# include + +static inline int vlc_vprintf (const char *format, va_list ap) +{ + char *fmt = vlc_fix_format_string (format); + int ret = vprintf (fmt ? fmt : format, ap); + free (fmt); + return ret; +} +# define vprintf vlc_vprintf + +static inline int vlc_vfprintf (FILE *stream, const char *format, va_list ap) +{ + char *fmt = vlc_fix_format_string (format); + int ret = vfprintf (stream, fmt ? fmt : format, ap); + free (fmt); + return ret; +} +# define vfprintf vlc_vfprintf + +static inline int vlc_vsprintf (char *str, const char *format, va_list ap) +{ + char *fmt = vlc_fix_format_string (format); + int ret = vsprintf (str, fmt ? fmt : format, ap); + free (fmt); + return ret; +} +# define vsprintf vlc_vsprintf + +static inline int vlc_vsnprintf (char *str, size_t size, const char *format, va_list ap) +{ + char *fmt = vlc_fix_format_string (format); + int ret = vsnprintf (str, size, fmt ? fmt : format, ap); + free (fmt); + return ret; +} +# define vsnprintf vlc_vsnprintf + +static inline int vlc_printf (const char *format, ...) +{ + va_list ap; + int ret; + va_start (ap, format); + ret = vprintf (format, ap); + va_end (ap); + return ret; +} +# define printf(...) vlc_printf(__VA_ARGS__) + +static inline int vlc_fprintf (FILE *stream, const char *format, ...) +{ + va_list ap; + int ret; + va_start (ap, format); + ret = vfprintf (stream, format, ap); + va_end (ap); + return ret; +} +# define fprintf vlc_fprintf + +static inline int vlc_sprintf (char *str, const char *format, ...) +{ + va_list ap; + int ret; + va_start (ap, format); + ret = vsprintf (str, format, ap); + va_end (ap); + return ret; +} +# define sprintf vlc_sprintf + +static inline int vlc_snprintf (char *str, size_t size, const char *format, ...) +{ + va_list ap; + int ret; + va_start (ap, format); + ret = vsnprintf (str, size, format, ap); + va_end (ap); + return ret; +} +# define snprintf vlc_snprintf + +/* Make sure we don't use flawed vasprintf or asprintf either */ +# undef HAVE_VASPRINTF +# undef HAVE_ASPRINTF +#endif + #ifndef HAVE_VASPRINTF # include # include -- 2.39.2