X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=lib%2Fmath.in.h;h=4e21cf95cb6fc346b30e2b1ebe6b5820f60ad772;hb=d06e0288c7f44218ba9a4175faedeed0b5b2a8e8;hp=1778e6e9187a63d7e663b830721e5302ce3ba2a3;hpb=c7e61475680fa226bd9b8bdd469cd66914e630f5;p=debian%2Fgzip diff --git a/lib/math.in.h b/lib/math.in.h index 1778e6e..4e21cf9 100644 --- a/lib/math.in.h +++ b/lib/math.in.h @@ -1,6 +1,6 @@ /* A GNU-like . - Copyright (C) 2002-2003, 2007-2009 Free Software Foundation, Inc. + Copyright (C) 2002-2003, 2007-2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +30,39 @@ /* The definition of GL_LINK_WARNING is copied here. */ +/* The definition of _GL_ARG_NONNULL is copied here. */ + +/* Helper macros to define a portability warning for the + classification macro FUNC called with VALUE. POSIX declares the + classification macros with an argument of real-floating (that is, + one of float, double, or long double). */ +#define _GL_WARN_REAL_FLOATING_DECL(func) \ +static inline int \ +rpl_ ## func ## f (float f) \ +{ \ + return func (f); \ +} \ +static inline int \ +rpl_ ## func ## d (double d) \ +{ \ + return func (d); \ +} \ +static inline int \ +rpl_ ## func ## l (long double l) \ +{ \ + return func (l); \ +} \ +_GL_WARN_ON_USE (rpl_ ## func ## f, #func " is unportable - " \ + "use gnulib module " #func " for portability"); \ +_GL_WARN_ON_USE (rpl_ ## func ## d, #func " is unportable - " \ + "use gnulib module " #func " for portability"); \ +_GL_WARN_ON_USE (rpl_ ## func ## l, #func " is unportable - " \ + "use gnulib module " #func " for portability") +#define _GL_WARN_REAL_FLOATING_IMPL(func, value) \ + (sizeof (value) == sizeof (float) ? rpl_ ## func ## f (value) \ + : sizeof (value) == sizeof (double) ? rpl_ ## func ## d (value) \ + : rpl_ ## func ## l (value)) + #ifdef __cplusplus extern "C" { @@ -74,7 +107,7 @@ _NaN () #if @GNULIB_FREXP@ # if @REPLACE_FREXP@ # define frexp rpl_frexp -extern double frexp (double x, int *expptr); +extern double frexp (double x, int *expptr) _GL_ARG_NONNULL ((2)); # endif #elif defined GNULIB_POSIXCHECK # undef frexp @@ -85,10 +118,11 @@ extern double frexp (double x, int *expptr); #endif -#if @GNULIB_MATHL@ || !@HAVE_DECL_ACOSL@ +#if @GNULIB_ACOSL@ +# if !@HAVE_ACOSL@ || !@HAVE_DECL_ACOSL@ extern long double acosl (long double x); -#endif -#if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK +# endif +#elif defined GNULIB_POSIXCHECK # undef acosl # define acosl(x) \ (GL_LINK_WARNING ("acosl is unportable - " \ @@ -97,10 +131,11 @@ extern long double acosl (long double x); #endif -#if @GNULIB_MATHL@ || !@HAVE_DECL_ASINL@ +#if @GNULIB_ASINL@ +# if !@HAVE_ASINL@ || !@HAVE_DECL_ASINL@ extern long double asinl (long double x); -#endif -#if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK +# endif +#elif defined GNULIB_POSIXCHECK # undef asinl # define asinl(x) \ (GL_LINK_WARNING ("asinl is unportable - " \ @@ -109,10 +144,11 @@ extern long double asinl (long double x); #endif -#if @GNULIB_MATHL@ || !@HAVE_DECL_ATANL@ +#if @GNULIB_ATANL@ +# if !@HAVE_ATANL@ || !@HAVE_DECL_ATANL@ extern long double atanl (long double x); -#endif -#if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK +# endif +#elif defined GNULIB_POSIXCHECK # undef atanl # define atanl(x) \ (GL_LINK_WARNING ("atanl is unportable - " \ @@ -148,11 +184,15 @@ extern long double ceill (long double x); #endif -#if @GNULIB_MATHL@ || (!@HAVE_DECL_COSL@ && !defined cosl) -# undef cosl +#if @GNULIB_COSL@ +# if !@HAVE_COSL@ +# undef cosl +# define cosl rpl_cosl +# endif +# if !@HAVE_COSL@ || !@HAVE_DECL_COSL@ extern long double cosl (long double x); -#endif -#if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK +# endif +#elif defined GNULIB_POSIXCHECK # undef cosl # define cosl(x) \ (GL_LINK_WARNING ("cosl is unportable - " \ @@ -161,10 +201,11 @@ extern long double cosl (long double x); #endif -#if @GNULIB_MATHL@ || !@HAVE_DECL_EXPL@ +#if @GNULIB_EXPL@ +# if !@HAVE_EXPL@ || !@HAVE_DECL_EXPL@ extern long double expl (long double x); -#endif -#if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK +# endif +#elif defined GNULIB_POSIXCHECK # undef expl # define expl(x) \ (GL_LINK_WARNING ("expl is unportable - " \ @@ -211,7 +252,7 @@ extern long double floorl (long double x); # define frexpl rpl_frexpl #endif #if (@GNULIB_FREXPL@ && @REPLACE_FREXPL@) || !@HAVE_DECL_FREXPL@ -extern long double frexpl (long double x, int *expptr); +extern long double frexpl (long double x, int *expptr) _GL_ARG_NONNULL ((2)); #endif #if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK # undef frexpl @@ -238,11 +279,15 @@ extern long double ldexpl (long double x, int exp); #endif -#if @GNULIB_MATHL@ || (!@HAVE_DECL_LOGL@ && !defined logl) -# undef logl +#if @GNULIB_LOGL@ +# if !@HAVE_LOGL@ +# undef logl +# define logl rpl_logl +# endif +# if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@ extern long double logl (long double x); -#endif -#if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK +# endif +#elif defined GNULIB_POSIXCHECK # undef logl # define logl(x) \ (GL_LINK_WARNING ("logl is unportable - " \ @@ -294,11 +339,15 @@ extern long double roundl (long double x); #endif -#if @GNULIB_MATHL@ || (!@HAVE_DECL_SINL@ && !defined sinl) -# undef sinl +#if @GNULIB_SINL@ +# if !@HAVE_SINL@ +# undef sinl +# define sinl rpl_sinl +# endif +# if !@HAVE_SINL@ || !@HAVE_DECL_SINL@ extern long double sinl (long double x); -#endif -#if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK +# endif +#elif defined GNULIB_POSIXCHECK # undef sinl # define sinl(x) \ (GL_LINK_WARNING ("sinl is unportable - " \ @@ -307,10 +356,11 @@ extern long double sinl (long double x); #endif -#if @GNULIB_MATHL@ || !@HAVE_DECL_SQRTL@ +#if @GNULIB_SQRTL@ +# if !@HAVE_SQRTL@ || !@HAVE_DECL_SQRTL@ extern long double sqrtl (long double x); -#endif -#if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK +# endif +#elif defined GNULIB_POSIXCHECK # undef sqrtl # define sqrtl(x) \ (GL_LINK_WARNING ("sqrtl is unportable - " \ @@ -319,10 +369,11 @@ extern long double sqrtl (long double x); #endif -#if @GNULIB_MATHL@ || !@HAVE_DECL_TANL@ +#if @GNULIB_TANL@ +# if !@HAVE_TANL@ || !@HAVE_DECL_TANL@ extern long double tanl (long double x); -#endif -#if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK +# endif +#elif defined GNULIB_POSIXCHECK # undef tanl # define tanl(x) \ (GL_LINK_WARNING ("tanl is unportable - " \ @@ -384,7 +435,11 @@ extern int gl_isfinitel (long double x); gl_isfinitef (x)) # endif #elif defined GNULIB_POSIXCHECK - /* How to override a macro? */ +# if defined isfinite +_GL_WARN_REAL_FLOATING_DECL (isfinite); +# undef isfinite +# define isfinite(x) _GL_WARN_REAL_FLOATING_IMPL (isfinite, x) +# endif #endif @@ -400,7 +455,11 @@ extern int gl_isinfl (long double x); gl_isinff (x)) # endif #elif defined GNULIB_POSIXCHECK - /* How to override a macro? */ +# if defined isinf +_GL_WARN_REAL_FLOATING_DECL (isinf); +# undef isinf +# define isinf(x) _GL_WARN_REAL_FLOATING_IMPL (isinf, x) +# endif #endif @@ -409,7 +468,6 @@ extern int gl_isinfl (long double x); # if @HAVE_ISNANF@ /* The original included above provides a declaration of isnan macro or (older) isnanf function. */ -# include # if __GNUC__ >= 4 /* GCC 4.0 and newer provides three built-ins for isnan. */ # undef isnanf @@ -432,7 +490,6 @@ extern int isnanf (float x); to 'double' numbers earlier but now is a type-generic macro. */ # if @HAVE_ISNAND@ /* The original included above provides a declaration of isnan macro. */ -# include # if __GNUC__ >= 4 /* GCC 4.0 and newer provides three built-ins for isnan. */ # undef isnand @@ -453,7 +510,6 @@ extern int isnand (double x); /* Test for NaN for 'long double' numbers. */ # if @HAVE_ISNANL@ /* The original included above provides a declaration of isnan macro or (older) isnanl function. */ -# include # if __GNUC__ >= 4 /* GCC 4.0 and newer provides three built-ins for isnan. */ # undef isnanl @@ -502,7 +558,11 @@ extern int rpl_isnanl (long double x); gl_isnan_f (x)) # endif #elif defined GNULIB_POSIXCHECK - /* How to override a macro? */ +# if defined isnan +_GL_WARN_REAL_FLOATING_DECL (isnan); +# undef isnan +# define isnan(x) _GL_WARN_REAL_FLOATING_IMPL (isnan, x) +# endif #endif @@ -524,31 +584,31 @@ extern int gl_signbitl (long double arg); # if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf # define gl_signbitf_OPTIMIZED_MACRO # define gl_signbitf(arg) \ - ({ union { float _value; \ + ({ union { float _value; \ unsigned int _word[(sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ - } _m; \ - _m._value = (arg); \ - (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \ + } _m; \ + _m._value = (arg); \ + (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \ }) # endif # if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd # define gl_signbitd_OPTIMIZED_MACRO # define gl_signbitd(arg) \ - ({ union { double _value; \ + ({ union { double _value; \ unsigned int _word[(sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ - } _m; \ - _m._value = (arg); \ - (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \ + } _m; \ + _m._value = (arg); \ + (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \ }) # endif # if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT && !defined gl_signbitl # define gl_signbitl_OPTIMIZED_MACRO # define gl_signbitl(arg) \ - ({ union { long double _value; \ + ({ union { long double _value; \ unsigned int _word[(sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ - } _m; \ - _m._value = (arg); \ - (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \ + } _m; \ + _m._value = (arg); \ + (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \ }) # endif # endif @@ -558,7 +618,11 @@ extern int gl_signbitl (long double arg); gl_signbitf (x)) # endif #elif defined GNULIB_POSIXCHECK - /* How to override a macro? */ +# if defined signbit +_GL_WARN_REAL_FLOATING_DECL (signbit); +# undef signbit +# define signbit(x) _GL_WARN_REAL_FLOATING_IMPL (signbit, x) +# endif #endif