mirror of
https://github.com/claunia/flac.git
synced 2025-12-16 18:54:26 +00:00
Add file src/share/grabbag/snprintf.c to grabbag library.
Define function flac_snprintf() which has ISO C99 snprintf() behavior even when compiling with Microsoft Visual Studio, by wrapping the MSVS snprintf_s() function.
This commit is contained in:
@@ -143,4 +143,14 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif /* defined _MSC_VER */
|
#endif /* defined _MSC_VER */
|
||||||
|
|
||||||
|
|
||||||
|
/* FLAC needs to compile and work correctly on systems with a norrmal ISO C99
|
||||||
|
* snprintf as well as Microsoft Visual Studio which has an non-standards
|
||||||
|
* conformant snprint_s function.
|
||||||
|
*
|
||||||
|
* This function wraps the MS version to behave more like the the ISO version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int flac_snprintf(char *str, size_t size, const char *fmt, ...);
|
||||||
|
|
||||||
#endif /* FLAC__SHARE__COMPAT_H */
|
#endif /* FLAC__SHARE__COMPAT_H */
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ libgrabbag_la_SOURCES = \
|
|||||||
file.c \
|
file.c \
|
||||||
picture.c \
|
picture.c \
|
||||||
replaygain.c \
|
replaygain.c \
|
||||||
seektable.c
|
seektable.c \
|
||||||
|
snprintf.c
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
Makefile.lite \
|
Makefile.lite \
|
||||||
|
|||||||
@@ -186,6 +186,10 @@
|
|||||||
RelativePath=".\seektable.c"
|
RelativePath=".\seektable.c"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\snprintf.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Public Header Files"
|
Name="Public Header Files"
|
||||||
|
|||||||
73
src/share/grabbag/snprintf.c
Normal file
73
src/share/grabbag/snprintf.c
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2013 Xiph.org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "share/compat.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC needs to compile and work correctly on systems with a norrmal ISO C99
|
||||||
|
* snprintf as well as Microsoft Visual Studio which has an non-standards
|
||||||
|
* conformant snprint_s function.
|
||||||
|
*
|
||||||
|
* The important difference occurs when the resultant string (plus string
|
||||||
|
* terminator) would have been longer than the supplied size parameter. When
|
||||||
|
* this happens, ISO C's snprintf returns the length of resultant string, but
|
||||||
|
* does not over-write the end of the buffer. MS's snprintf_s in this case
|
||||||
|
* returns -1.
|
||||||
|
*
|
||||||
|
* The _MSC_VER code below attempts to modify the return code for snprintf_s
|
||||||
|
* to something that is more compatible with the behaviour of the ISO C version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
flac_snprintf(char *str, size_t size, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list va;
|
||||||
|
int rc ;
|
||||||
|
|
||||||
|
va_start (va, fmt);
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
rc = vsnprintf_s (str, size, fmt, va);
|
||||||
|
rc = (rc > 0) ? rc : (size == 0 ? 1024 : size * 2);
|
||||||
|
#else
|
||||||
|
rc = vsnprintf (str, size, fmt, va);
|
||||||
|
#endif
|
||||||
|
va_end (va);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user