Commit 401456fd authored by David Flynn's avatar David Flynn Committed by Jean-Baptiste Kempf

win32: delete old *printf fixup code.

mingw provides this all for free and is better.
Signed-off-by: default avatarDavid Flynn <davidf@rd.bbc.co.uk>
Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent b8f6df75
...@@ -51,202 +51,18 @@ static inline char *strdup (const char *str) ...@@ -51,202 +51,18 @@ static inline char *strdup (const char *str)
} }
#endif #endif
#ifdef WIN32
/* Windows' printf doesn't support %z modifiers, thus we need to rewrite
* the format string in a wrapper. */
# include <string.h>
# include <stdlib.h>
static inline char *vlc_fix_format_string (const char *format)
{
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;
fmt = strdup (format);
if (fmt == NULL)
return NULL;
while ((f = strstr (fmt, "%z")) != NULL)
{
f[1] = 'l';
}
# endif
return fmt;
}
# include <stdio.h>
# include <stdarg.h>
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
#if 0
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
#endif
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 #ifndef HAVE_VASPRINTF
# include <stdio.h> # include <stdio.h>
# include <stdlib.h> # include <stdlib.h>
# include <stdarg.h> # include <stdarg.h>
static inline int vasprintf (char **strp, const char *fmt, va_list ap) static inline int vasprintf (char **strp, const char *fmt, va_list ap)
{ {
#ifndef UNDER_CE
int len = vsnprintf (NULL, 0, fmt, ap) + 1; int len = vsnprintf (NULL, 0, fmt, ap) + 1;
char *res = (char *)malloc (len); char *res = (char *)malloc (len);
if (res == NULL) if (res == NULL)
return -1; return -1;
*strp = res; *strp = res;
return vsnprintf (res, len, fmt, ap); return vsnprintf (res, len, fmt, ap);
#else
/* HACK: vsnprintf in the WinCE API behaves like
* the one in glibc 2.0 and doesn't return the number of characters
* it needed to copy the string.
* cf http://msdn.microsoft.com/en-us/library/1kt27hek.aspx
* and cf the man page of vsnprintf
*
Guess we need no more than 50 bytes. */
int n, size = 50;
char *res, *np;
if ((res = (char *) malloc (size)) == NULL)
return -1;
while (1)
{
n = vsnprintf (res, size, fmt, ap);
/* If that worked, return the string. */
if (n > -1 && n < size)
{
*strp = res;
return n;
}
/* Else try again with more space. */
size *= 2; /* twice the old size */
if ((np = (char *) realloc (res, size)) == NULL)
{
free(res);
return -1;
}
else
{
res = np;
}
}
#endif /* UNDER_CE */
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment