[This is a first of a series of 11 proposed patches to improve the use of 'inline' in gnulib modules, to take advantage of C99 'inline' semantics when available. There is one patch per module in this series.]
* lib/bitrotate.c: New file. * lib/bitrotate.h (BITROTATE_INLINE): New macros. Replace all uses of 'static inline' with them. Use _GL_INLINE_HEADER_BEGIN, _GL_INLINE_HEADER_END. * modules/bitrotate (Files, lib_SOURCES): Add lib/bitrotate.c. (Depends-on): Add extern-inline. (configure.ac): Do not require AC_C_INLINE. --- ChangeLog | 12 ++++++++++++ lib/bitrotate.c | 3 +++ lib/bitrotate.h | 27 +++++++++++++++++---------- modules/bitrotate | 5 +++-- 4 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 lib/bitrotate.c diff --git a/ChangeLog b/ChangeLog index a379c32..f336149 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2012-10-28 Paul Eggert <[email protected]> + + bitrotate: better 'inline' + * lib/bitrotate.c: New file. + * lib/bitrotate.h (BITROTATE_INLINE): + New macros. + Replace all uses of 'static inline' with them. + Use _GL_INLINE_HEADER_BEGIN, _GL_INLINE_HEADER_END. + * modules/bitrotate (Files, lib_SOURCES): Add lib/bitrotate.c. + (Depends-on): Add extern-inline. + (configure.ac): Do not require AC_C_INLINE. + 2012-10-26 Eric Blake <[email protected]> maint.mk: let packages tweak sc_po_check pattern diff --git a/lib/bitrotate.c b/lib/bitrotate.c new file mode 100644 index 0000000..a8f6028 --- /dev/null +++ b/lib/bitrotate.c @@ -0,0 +1,3 @@ +#include <config.h> +#define BITROTATE_INLINE _GL_EXTERN_INLINE +#include "bitrotate.h" diff --git a/lib/bitrotate.h b/lib/bitrotate.h index 5fb8f9b..8a67558 100644 --- a/lib/bitrotate.h +++ b/lib/bitrotate.h @@ -23,11 +23,16 @@ #include <stdint.h> #include <sys/types.h> +_GL_INLINE_HEADER_BEGIN +#ifndef BITROTATE_INLINE +# define BITROTATE_INLINE _GL_INLINE +#endif + #ifdef UINT64_MAX /* Given an unsigned 64-bit argument X, return the value corresponding to rotating the bits N steps to the left. N must be between 1 and 63 inclusive. */ -static inline uint64_t +BITROTATE_INLINE uint64_t rotl64 (uint64_t x, int n) { return ((x << n) | (x >> (64 - n))) & UINT64_MAX; @@ -36,7 +41,7 @@ rotl64 (uint64_t x, int n) /* Given an unsigned 64-bit argument X, return the value corresponding to rotating the bits N steps to the right. N must be between 1 to 63 inclusive.*/ -static inline uint64_t +BITROTATE_INLINE uint64_t rotr64 (uint64_t x, int n) { return ((x >> n) | (x << (64 - n))) & UINT64_MAX; @@ -46,7 +51,7 @@ rotr64 (uint64_t x, int n) /* Given an unsigned 32-bit argument X, return the value corresponding to rotating the bits N steps to the left. N must be between 1 and 31 inclusive. */ -static inline uint32_t +BITROTATE_INLINE uint32_t rotl32 (uint32_t x, int n) { return ((x << n) | (x >> (32 - n))) & UINT32_MAX; @@ -55,7 +60,7 @@ rotl32 (uint32_t x, int n) /* Given an unsigned 32-bit argument X, return the value corresponding to rotating the bits N steps to the right. N must be between 1 to 31 inclusive.*/ -static inline uint32_t +BITROTATE_INLINE uint32_t rotr32 (uint32_t x, int n) { return ((x >> n) | (x << (32 - n))) & UINT32_MAX; @@ -64,7 +69,7 @@ rotr32 (uint32_t x, int n) /* Given a size_t argument X, return the value corresponding to rotating the bits N steps to the left. N must be between 1 and (CHAR_BIT * sizeof (size_t) - 1) inclusive. */ -static inline size_t +BITROTATE_INLINE size_t rotl_sz (size_t x, int n) { return ((x << n) | (x >> ((CHAR_BIT * sizeof x) - n))) & SIZE_MAX; @@ -73,7 +78,7 @@ rotl_sz (size_t x, int n) /* Given a size_t argument X, return the value corresponding to rotating the bits N steps to the right. N must be between 1 to (CHAR_BIT * sizeof (size_t) - 1) inclusive. */ -static inline size_t +BITROTATE_INLINE size_t rotr_sz (size_t x, int n) { return ((x >> n) | (x << ((CHAR_BIT * sizeof x) - n))) & SIZE_MAX; @@ -84,7 +89,7 @@ rotr_sz (size_t x, int n) 15 inclusive, but on most relevant targets N can also be 0 and 16 because 'int' is at least 32 bits and the arguments must widen before shifting. */ -static inline uint16_t +BITROTATE_INLINE uint16_t rotl16 (uint16_t x, int n) { return ((x << n) | (x >> (16 - n))) & UINT16_MAX; @@ -95,7 +100,7 @@ rotl16 (uint16_t x, int n) inclusive, but on most relevant targets N can also be 0 and 16 because 'int' is at least 32 bits and the arguments must widen before shifting. */ -static inline uint16_t +BITROTATE_INLINE uint16_t rotr16 (uint16_t x, int n) { return ((x >> n) | (x << (16 - n))) & UINT16_MAX; @@ -106,7 +111,7 @@ rotr16 (uint16_t x, int n) inclusive, but on most relevant targets N can also be 0 and 8 because 'int' is at least 32 bits and the arguments must widen before shifting. */ -static inline uint8_t +BITROTATE_INLINE uint8_t rotl8 (uint8_t x, int n) { return ((x << n) | (x >> (8 - n))) & UINT8_MAX; @@ -117,10 +122,12 @@ rotl8 (uint8_t x, int n) inclusive, but on most relevant targets N can also be 0 and 8 because 'int' is at least 32 bits and the arguments must widen before shifting. */ -static inline uint8_t +BITROTATE_INLINE uint8_t rotr8 (uint8_t x, int n) { return ((x >> n) | (x << (8 - n))) & UINT8_MAX; } +_GL_INLINE_HEADER_END + #endif /* _GL_BITROTATE_H */ diff --git a/modules/bitrotate b/modules/bitrotate index 63124a8..97cd8dd 100644 --- a/modules/bitrotate +++ b/modules/bitrotate @@ -3,15 +3,16 @@ Rotate bits in unsigned 8, 16, and 32 bit integers. Files: lib/bitrotate.h +lib/bitrotate.c Depends-on: +extern-inline stdint configure.ac: -AC_REQUIRE([AC_C_INLINE]) Makefile.am: -lib_SOURCES += bitrotate.h +lib_SOURCES += bitrotate.h bitrotate.c Include: "bitrotate.h" -- 1.7.11.7
