On Wed, 2012-08-01 at 21:34 +0100, Måns Rullgård wrote:
> Uoti Urpala <uoti.urp...@pp1.inet.fi> writes:
> >> +    ret = vsnprintf(buffer, bufsize-1, fmt, ap);
> >
> > IIRC MSVC (or the C library) does not support all standard format
> > modifiers, so unless this vsnprintf comes from elsewhere, you need more
> > to get fully working printf formatting.
> >
> > I'm not sure if this is working in current MinGW-compiled Libav either -
> > you need to set __USE_MINGW_ANSI_STDIO at least; the problem cases
> > probably occur rarely enough that problems may go unnoticed.
> >
> >> +    if (ret < 0) {
> >> +        buffer[bufsize - 1] = '\0';
> >> +        ret = bufsize - 1;
> >
> > Wrong return value. It's supposed to be the number of bytes the output
> > would take without restriction. The following pattern is supposed to
> > work:
> >
> > int r = snprintf(NULL, 0, ...);
> > if (r < 0) return -1;
> > char *p = malloc(r + 1);
> > snprintf(p, r, ...);
> 
> It is not possible to get those semantics using the regular Windows
> functions.

Of course it is, with enough workarounds (this is already an attempt at
a workaround, getting it right would just require more code). I think
there are rather obvious ways to fix both issues (besides the most
obvious but more work-requiring alternative of writing correct snprintf
from scratch): rewrite the format string with different modifiers for
the first, try printing the string into temporary storage and double its
size until you succeed for the second.


_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to