X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=include%2Fvlc_fixups.h;h=9992cd5a5b66245380f2e6f9032de0d04a71b388;hb=b8525bc7b21f2e2dce05c94077c4c555068b9ea2;hp=c74069f67b14176c05612126555ebeb132552f8d;hpb=6735066be8d56613d936e7a46c41f94456f84090;p=vlc diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h index c74069f67b..9992cd5a5b 100644 --- a/include/vlc_fixups.h +++ b/include/vlc_fixups.h @@ -44,12 +44,54 @@ static inline char *strdup (const char *str) # include static inline int vasprintf (char **strp, const char *fmt, va_list ap) { +#ifndef UNDER_CE int len = vsnprintf (NULL, 0, fmt, ap) + 1; char *res = (char *)malloc (len); if (res == NULL) return -1; *strp = res; return vsprintf (res, 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. */ + if (n == -1) + size *= 2; /* twice the old size */ + + if ((np = (char *) realloc (res, size)) == NULL) + { + free(res); + return -1; + } + else + { + res = np; + } + + } +#endif /* UNDER_CE */ } #endif @@ -239,4 +281,12 @@ typedef void *locale_t; #define N_(str) gettext_noop (str) #define gettext_noop(str) (str) +#ifdef UNDER_CE +static inline void rewind ( FILE *stream ) +{ + fseek(stream, 0L, SEEK_SET); + clearerr(stream); +} +#endif + #endif /* !LIBVLC_FIXUPS_H */