Branch
Hash :
226b0092
Author :
Date :
2025-09-13T13:01:00
endian: port to Solaris 11.4 and macOS 15 Problem reported by Bruno Haible in: https://lists.gnu.org/r/bug-gnulib/2025-09/msg00174.html * lib/byteswap.in.h (_GL_BYTESWAP_INLINE): Define before including stdint.h. * lib/endian.in.h (bswap_16, bswap_32, bswap_64): Declare as _GL_BYTESWAP_INLINE rather than as extern. Conditionalize these decls with _GL_BYTESWAP_INLINE rather than with _GL_BYTESWAP_H.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
/* endian.h - Byte order macros
Copyright 2024-2025 Free Software Foundation, Inc.
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
/* Written by Collin Funk. */
#ifndef _@GUARD_PREFIX@_ENDIAN_H
#if __GNUC__ >= 3
@PRAGMA_SYSTEM_HEADER@
#endif
@PRAGMA_COLUMNS@
#if @HAVE_ENDIAN_H@
/* The include_next requires a split double-inclusion guard. */
# @INCLUDE_NEXT@ @NEXT_ENDIAN_H@
#elif @HAVE_SYS_ENDIAN_H@
# include <sys/endian.h>
#endif
/* glibc defines all macros and functions but is missing types from
stdint.h. */
#if @ENDIAN_H_JUST_MISSING_STDINT@
# include <stdint.h>
#else
/* Others platforms. */
#ifndef _@GUARD_PREFIX@_ENDIAN_H
#define _@GUARD_PREFIX@_ENDIAN_H 1
/* This file uses _GL_INLINE, WORDS_BIGENDIAN. */
#if !_GL_CONFIG_H_INCLUDED
#error "Please include config.h first."
#endif
/* Define uint16_t and uint32_t.
Define uint64_t if it is available. */
#include <stdint.h>
/* Byteswap functions. */
#include <byteswap.h>
_GL_INLINE_HEADER_BEGIN
#ifndef _GL_ENDIAN_INLINE
# define _GL_ENDIAN_INLINE _GL_INLINE
#endif
#define LITTLE_ENDIAN 1234
#define BIG_ENDIAN 4321
#define PDP_ENDIAN 3412
#ifdef WORDS_BIGENDIAN
# define BYTE_ORDER BIG_ENDIAN
#else
# define BYTE_ORDER LITTLE_ENDIAN
#endif
#if @HAVE_ENDIAN_H@ || @HAVE_SYS_ENDIAN_H@
/* Make sure we don't have any system definitions. */
# undef be16toh
# undef be32toh
# undef be64toh
# undef htobe16
# undef htobe32
# undef htobe64
# undef le16toh
# undef le32toh
# undef le64toh
# undef htole16
# undef htole32
# undef htole64
/* Define our own. */
# define be16toh rpl_endian_be16toh
# define be32toh rpl_endian_be32toh
# define be64toh rpl_endian_be64toh
# define htobe16 rpl_endian_htobe16
# define htobe32 rpl_endian_htobe32
# define htobe64 rpl_endian_htobe64
# define le16toh rpl_endian_le16toh
# define le32toh rpl_endian_le32toh
# define le64toh rpl_endian_le64toh
# define htole16 rpl_endian_htole16
# define htole32 rpl_endian_htole32
# define htole64 rpl_endian_htole64
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* These declarations are needed if Gnulib byteswap.h -> stdint.h ->
sys/types.h -> endian.h -> Gnulib byteswap.h, the last of which is blocked
by its include guard so the functions are not yet declared. */
#ifdef _GL_BYTESWAP_INLINE
_GL_BYTESWAP_INLINE uint_least16_t bswap_16 (uint_least16_t);
_GL_BYTESWAP_INLINE uint_least32_t bswap_32 (uint_least32_t);
_GL_BYTESWAP_INLINE uint_least64_t bswap_64 (uint_least64_t);
#endif
/* Big endian to host. */
_GL_ENDIAN_INLINE uint16_t
be16toh (uint16_t x)
{
#if BYTE_ORDER == BIG_ENDIAN
return x;
#else
return bswap_16 (x);
#endif
}
_GL_ENDIAN_INLINE uint32_t
be32toh (uint32_t x)
{
#if BYTE_ORDER == BIG_ENDIAN
return x;
#else
return bswap_32 (x);
#endif
}
#ifdef UINT64_MAX
_GL_ENDIAN_INLINE uint64_t
be64toh (uint64_t x)
{
# if BYTE_ORDER == BIG_ENDIAN
return x;
# else
return bswap_64 (x);
# endif
}
#endif
/* Host to big endian. */
_GL_ENDIAN_INLINE uint16_t
htobe16 (uint16_t x)
{
#if BYTE_ORDER == BIG_ENDIAN
return x;
#else
return bswap_16 (x);
#endif
}
_GL_ENDIAN_INLINE uint32_t
htobe32 (uint32_t x)
{
#if BYTE_ORDER == BIG_ENDIAN
return x;
#else
return bswap_32 (x);
#endif
}
#ifdef UINT64_MAX
_GL_ENDIAN_INLINE uint64_t
htobe64 (uint64_t x)
{
# if BYTE_ORDER == BIG_ENDIAN
return x;
# else
return bswap_64 (x);
# endif
}
#endif
/* Little endian to host. */
_GL_ENDIAN_INLINE uint16_t
le16toh (uint16_t x)
{
#if BYTE_ORDER == BIG_ENDIAN
return bswap_16 (x);
#else
return x;
#endif
}
_GL_ENDIAN_INLINE uint32_t
le32toh (uint32_t x)
{
#if BYTE_ORDER == BIG_ENDIAN
return bswap_32 (x);
#else
return x;
#endif
}
#ifdef UINT64_MAX
_GL_ENDIAN_INLINE uint64_t
le64toh (uint64_t x)
{
# if BYTE_ORDER == BIG_ENDIAN
return bswap_64 (x);
# else
return x;
# endif
}
#endif
/* Host to little endian. */
_GL_ENDIAN_INLINE uint16_t
htole16 (uint16_t x)
{
#if BYTE_ORDER == BIG_ENDIAN
return bswap_16 (x);
#else
return x;
#endif
}
_GL_ENDIAN_INLINE uint32_t
htole32 (uint32_t x)
{
#if BYTE_ORDER == BIG_ENDIAN
return bswap_32 (x);
#else
return x;
#endif
}
#ifdef UINT64_MAX
_GL_ENDIAN_INLINE uint64_t
htole64 (uint64_t x)
{
# if BYTE_ORDER == BIG_ENDIAN
return bswap_64 (x);
# else
return x;
# endif
}
#endif
#ifdef __cplusplus
}
#endif
_GL_INLINE_HEADER_END
#endif /* @ENDIAN_H_JUST_MISSING_STDINT@ */
#endif /* _@GUARD_PREFIX@_ENDIAN_H */
#endif /* _@GUARD_PREFIX@_ENDIAN_H */