From 6457d2c190f47e2288c08f6a5e0dba412ff62855 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 3 Jun 2024 22:00:58 -0700 Subject: [PATCH] ieee754-h: port to Android NDK r26 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Problem reported by Po Lu in: https://lists.gnu.org/r/bug-gnulib/2024-06/msg00015.html * lib/ieee754.in.h (_IEEE754_BYTE_ORDER, _IEEE754_BIG_ENDIAN) (_IEEE754_LITTLE_ENDIAN, _IEEE754_FLOAT_WORD_ORDER): New macros. All uses of __BYTE_ORDER, __BIG_ENDIAN, __LITTLE_ENDIAN, __FLOAT_WORD_ORDER changed to use these new macros. [!_GL_GNULIB_HEADER]: Include bits/endian.h, not endian.h, as that’s what glibc does now. [_GL_GNULIB_HEADER]: Include endian.h instead of rolling our own. (__BEGIN_DECLS, __END_DECLS): Remove. All uses replaced by definiens. * modules/ieee754-h (Depends-on): Add endian. --- ChangeLog | 16 +++++++++++ lib/ieee754.in.h | 69 +++++++++++++++++++++-------------------------- modules/ieee754-h | 1 + 3 files changed, 48 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index ddc76b5201..bd38e2a79d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2024-06-03 Paul Eggert + + ieee754-h: port to Android NDK r26 + Problem reported by Po Lu in: + https://lists.gnu.org/r/bug-gnulib/2024-06/msg00015.html + * lib/ieee754.in.h (_IEEE754_BYTE_ORDER, _IEEE754_BIG_ENDIAN) + (_IEEE754_LITTLE_ENDIAN, _IEEE754_FLOAT_WORD_ORDER): New macros. + All uses of __BYTE_ORDER, __BIG_ENDIAN, __LITTLE_ENDIAN, + __FLOAT_WORD_ORDER changed to use these new macros. + [!_GL_GNULIB_HEADER]: Include bits/endian.h, not endian.h, + as that’s what glibc does now. + [_GL_GNULIB_HEADER]: Include endian.h instead of rolling our own. + (__BEGIN_DECLS, __END_DECLS): Remove. All uses replaced + by definiens. + * modules/ieee754-h (Depends-on): Add endian. + 2024-06-03 Bruno Haible readlinkat: Work around a Cygwin 3.3.6 bug. diff --git a/lib/ieee754.in.h b/lib/ieee754.in.h index 805048ca9f..4dd0ff55d2 100644 --- a/lib/ieee754.in.h +++ b/lib/ieee754.in.h @@ -16,37 +16,28 @@ . */ #ifndef _IEEE754_H - #define _IEEE754_H 1 #ifndef _GL_GNULIB_HEADER /* Ordinary glibc usage. */ # include -# include +# include +# define _IEEE754_BYTE_ORDER __BYTE_ORDER +# define _IEEE754_BIG_ENDIAN __BIG_ENDIAN +# define _IEEE754_LITTLE_ENDIAN __LITTLE_ENDIAN +# define _IEEE754_FLOAT_WORD_ORDER __FLOAT_WORD_ORDER #else /* Gnulib usage. */ -# ifndef __BEGIN_DECLS -# ifdef __cplusplus -# define __BEGIN_DECLS extern "C" { -# define __END_DECLS } -# else -# define __BEGIN_DECLS -# define __END_DECLS -# endif -# endif -# ifndef __FLOAT_WORD_ORDER -# define __LITTLE_ENDIAN 1234 -# define __BIG_ENDIAN 4321 -# ifdef WORDS_BIGENDIAN -# define __BYTE_ORDER __BIG_ENDIAN -# else -# define __BYTE_ORDER __LITTLE_ENDIAN -# endif -# define __FLOAT_WORD_ORDER __BYTE_ORDER -# endif +# include +# define _IEEE754_BYTE_ORDER BYTE_ORDER +# define _IEEE754_BIG_ENDIAN BIG_ENDIAN +# define _IEEE754_LITTLE_ENDIAN LITTLE_ENDIAN +# define _IEEE754_FLOAT_WORD_ORDER BYTE_ORDER #endif -__BEGIN_DECLS +#ifdef __cplusplus +extern "C" { +#endif union ieee754_float { @@ -55,12 +46,12 @@ union ieee754_float /* This is the IEEE 754 single-precision format. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:8; unsigned int mantissa:23; #endif /* Big endian. */ -#if __BYTE_ORDER == __LITTLE_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_LITTLE_ENDIAN unsigned int mantissa:23; unsigned int exponent:8; unsigned int negative:1; @@ -70,13 +61,13 @@ union ieee754_float /* This format makes it easier to see if a NaN is a signalling NaN. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:8; unsigned int quiet_nan:1; unsigned int mantissa:22; #endif /* Big endian. */ -#if __BYTE_ORDER == __LITTLE_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_LITTLE_ENDIAN unsigned int mantissa:22; unsigned int quiet_nan:1; unsigned int exponent:8; @@ -95,15 +86,15 @@ union ieee754_double /* This is the IEEE 754 double-precision format. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:11; /* Together these comprise the mantissa. */ unsigned int mantissa0:20; unsigned int mantissa1:32; #endif /* Big endian. */ -#if __BYTE_ORDER == __LITTLE_ENDIAN -# if __FLOAT_WORD_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_LITTLE_ENDIAN +# if _IEEE754_FLOAT_WORD_ORDER == _IEEE754_BIG_ENDIAN unsigned int mantissa0:20; unsigned int exponent:11; unsigned int negative:1; @@ -121,7 +112,7 @@ union ieee754_double /* This format makes it easier to see if a NaN is a signalling NaN. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:11; unsigned int quiet_nan:1; @@ -129,7 +120,7 @@ union ieee754_double unsigned int mantissa0:19; unsigned int mantissa1:32; #else -# if __FLOAT_WORD_ORDER == __BIG_ENDIAN +# if _IEEE754_FLOAT_WORD_ORDER == _IEEE754_BIG_ENDIAN unsigned int mantissa0:19; unsigned int quiet_nan:1; unsigned int exponent:11; @@ -157,15 +148,15 @@ union ieee854_long_double /* This is the IEEE 854 double-extended-precision format. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:15; unsigned int empty:16; unsigned int mantissa0:32; unsigned int mantissa1:32; #endif -#if __BYTE_ORDER == __LITTLE_ENDIAN -# if __FLOAT_WORD_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_LITTLE_ENDIAN +# if _IEEE754_FLOAT_WORD_ORDER == _IEEE754_BIG_ENDIAN unsigned int exponent:15; unsigned int negative:1; unsigned int empty:16; @@ -184,7 +175,7 @@ union ieee854_long_double /* This is for NaNs in the IEEE 854 double-extended-precision format. */ struct { -#if __BYTE_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_BIG_ENDIAN unsigned int negative:1; unsigned int exponent:15; unsigned int empty:16; @@ -193,8 +184,8 @@ union ieee854_long_double unsigned int mantissa0:30; unsigned int mantissa1:32; #endif -#if __BYTE_ORDER == __LITTLE_ENDIAN -# if __FLOAT_WORD_ORDER == __BIG_ENDIAN +#if _IEEE754_BYTE_ORDER == _IEEE754_LITTLE_ENDIAN +# if _IEEE754_FLOAT_WORD_ORDER == _IEEE754_BIG_ENDIAN unsigned int exponent:15; unsigned int negative:1; unsigned int empty:16; @@ -217,6 +208,8 @@ union ieee854_long_double #define IEEE854_LONG_DOUBLE_BIAS 0x3fff -__END_DECLS +#ifdef __cplusplus +} +#endif #endif /* ieee754.h */ diff --git a/modules/ieee754-h b/modules/ieee754-h index 4c1b7234d9..cd84128c81 100644 --- a/modules/ieee754-h +++ b/modules/ieee754-h @@ -6,6 +6,7 @@ lib/ieee754.in.h m4/ieee754-h.m4 Depends-on: +endian [$GL_GENERATE_IEEE754_H] gen-header configure.ac: -- 2.39.5