*
**************************************************************************/
+#include "no_extern_c.h"
+
#ifndef _C99_COMPAT_H_
#define _C99_COMPAT_H_
* MSVC hacks.
*/
#if defined(_MSC_VER)
+
+# if _MSC_VER < 1900
+# error "Microsoft Visual Studio 2015 or higher required"
+# endif
+
/*
- * Visual Studio 2012 will complain if we define the `inline` keyword, but
+ * Visual Studio will complain if we define the `inline` keyword, but
* actually it only supports the keyword on C++.
*
* To avoid this the _ALLOW_KEYWORD_MACROS must be set.
*/
-# if (_MSC_VER >= 1700) && !defined(_ALLOW_KEYWORD_MACROS)
+# if !defined(_ALLOW_KEYWORD_MACROS)
# define _ALLOW_KEYWORD_MACROS
# endif
/* Intel compiler supports inline keyword */
# elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
# define inline __inline
-# elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
- /* C99 supports inline keyword */
# elif (__STDC_VERSION__ >= 199901L)
/* C99 supports inline keyword */
# else
* - http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html
*/
#ifndef restrict
-# if (__STDC_VERSION__ >= 199901L)
- /* C99 */
-# elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
+# if (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus)
/* C99 */
# elif defined(__GNUC__)
# define restrict __restrict__
#ifndef __func__
# if (__STDC_VERSION__ >= 199901L)
/* C99 */
-# elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
- /* C99 */
# elif defined(__GNUC__)
# define __func__ __FUNCTION__
# elif defined(_MSC_VER)
-# if _MSC_VER >= 1300
-# define __func__ __FUNCTION__
-# else
-# define __func__ "<unknown>"
-# endif
+# define __func__ __FUNCTION__
# else
# define __func__ "<unknown>"
# endif
#endif
-#if defined(_MSC_VER)
-
-#if _MSC_VER < 1400 && !defined(__cplusplus)
-
-static INLINE float cosf( float f )
-{
- return (float) cos( (double) f );
-}
-
-static INLINE float sinf( float f )
-{
- return (float) sin( (double) f );
-}
-
-static INLINE float ceilf( float f )
-{
- return (float) ceil( (double) f );
-}
-
-static INLINE float floorf( float f )
-{
- return (float) floor( (double) f );
-}
-
-static INLINE float powf( float f, float g )
-{
- return (float) pow( (double) f, (double) g );
-}
-
-static INLINE float sqrtf( float f )
-{
- return (float) sqrt( (double) f );
-}
-
-static INLINE float fabsf( float f )
-{
- return (float) fabs( (double) f );
-}
-
-static INLINE float logf( float f )
-{
- return (float) log( (double) f );
-}
-
-#else
-/* Work-around an extra semi-colon in VS 2005 logf definition */
-#ifdef logf
-#undef logf
-#define logf(x) ((float)log((double)(x)))
-#endif /* logf */
-
-#if _MSC_VER < 1800
-#define isfinite(x) _finite((double)(x))
-#define isnan(x) _isnan((double)(x))
-#endif /* _MSC_VER < 1800 */
-#endif /* _MSC_VER < 1400 && !defined(__cplusplus) */
-
-#if _MSC_VER < 1800
-static INLINE double log2( double x )
-{
- const double invln2 = 1.442695041;
- return log( x ) * invln2;
-}
-
-static INLINE double
-round(double x)
-{
- return x >= 0.0 ? floor(x + 0.5) : ceil(x - 0.5);
-}
-
-static INLINE float
-roundf(float x)
-{
- return x >= 0.0f ? floorf(x + 0.5f) : ceilf(x - 0.5f);
-}
-#endif
-
-#ifndef INFINITY
-#define INFINITY (DBL_MAX + DBL_MAX)
-#endif
-
-#ifndef NAN
-#define NAN (INFINITY - INFINITY)
-#endif
-
-#endif /* _MSC_VER */
-
+/* Fallback definitions, for scons which doesn't auto-detect these things. */
+#ifdef HAVE_SCONS
-#if __STDC_VERSION__ < 199901L && (!defined(__cplusplus) || defined(_MSC_VER))
-static INLINE long int
-lrint(double d)
-{
- long int rounded = (long int)(d + 0.5);
-
- if (d - floor(d) == 0.5) {
- if (rounded % 2 != 0)
- rounded += (d > 0) ? -1 : 1;
- }
-
- return rounded;
-}
-
-static INLINE long int
-lrintf(float f)
-{
- long int rounded = (long int)(f + 0.5f);
-
- if (f - floorf(f) == 0.5f) {
- if (rounded % 2 != 0)
- rounded += (f > 0) ? -1 : 1;
- }
-
- return rounded;
-}
-
-static INLINE long long int
-llrint(double d)
-{
- long long int rounded = (long long int)(d + 0.5);
+# ifndef _WIN32
+# define HAVE_PTHREAD
+# define HAVE_POSIX_MEMALIGN
+# endif
- if (d - floor(d) == 0.5) {
- if (rounded % 2 != 0)
- rounded += (d > 0) ? -1 : 1;
- }
+# ifdef __GNUC__
+# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
+# error "GCC version 4.2 or higher required"
+# endif
- return rounded;
-}
+ /* https://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Other-Builtins.html */
+# define HAVE___BUILTIN_CLZ 1
+# define HAVE___BUILTIN_CLZLL 1
+# define HAVE___BUILTIN_CTZ 1
+# define HAVE___BUILTIN_EXPECT 1
+# define HAVE___BUILTIN_FFS 1
+# define HAVE___BUILTIN_FFSLL 1
+# define HAVE___BUILTIN_POPCOUNT 1
+# define HAVE___BUILTIN_POPCOUNTLL 1
+ /* https://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Function-Attributes.html */
+# define HAVE_FUNC_ATTRIBUTE_FLATTEN 1
+# define HAVE_FUNC_ATTRIBUTE_UNUSED 1
+# define HAVE_FUNC_ATTRIBUTE_FORMAT 1
+# define HAVE_FUNC_ATTRIBUTE_PACKED 1
+# define HAVE_FUNC_ATTRIBUTE_ALIAS 1
+# define HAVE_FUNC_ATTRIBUTE_NORETURN 1
+
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ /* https://gcc.gnu.org/onlinedocs/gcc-4.3.6/gcc/Other-Builtins.html */
+# define HAVE___BUILTIN_BSWAP32 1
+# define HAVE___BUILTIN_BSWAP64 1
+# endif
-static INLINE long long int
-llrintf(float f)
-{
- long long int rounded = (long long int)(f + 0.5f);
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+# define HAVE___BUILTIN_UNREACHABLE 1
+# endif
- if (f - floorf(f) == 0.5f) {
- if (rounded % 2 != 0)
- rounded += (f > 0) ? -1 : 1;
- }
+# endif /* __GNUC__ */
- return rounded;
-}
-#endif /* C99 */
+#endif /* HAVE_SCONS */
#endif /* _C99_COMPAT_H_ */