endian.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #ifndef __endian_compat_h
  2. #define __endian_compat_h
  3. #if defined(__linux__) || defined(__CYGWIN__)
  4. #include <byteswap.h>
  5. #include_next <endian.h>
  6. #elif defined(__APPLE__)
  7. #include <netinet/in.h>
  8. #include <libkern/OSByteOrder.h>
  9. #define bswap_16(x) OSSwapInt16(x)
  10. #define bswap_32(x) OSSwapInt32(x)
  11. #define bswap_64(x) OSSwapInt64(x)
  12. #elif defined(__FreeBSD__)
  13. #include <sys/endian.h>
  14. #define bswap_16(x) bswap16(x)
  15. #define bswap_32(x) bswap32(x)
  16. #define bswap_64(x) bswap64(x)
  17. #elif defined(__OpenBSD__)
  18. #include <sys/types.h>
  19. #define bswap_16(x) __swap16(x)
  20. #define bswap_32(x) __swap32(x)
  21. #define bswap_64(x) __swap64(x)
  22. #else
  23. #include <machine/endian.h>
  24. #define bswap_16(x) swap16(x)
  25. #define bswap_32(x) swap32(x)
  26. #define bswap_64(x) swap64(x)
  27. #endif
  28. #ifndef __BYTE_ORDER
  29. #define __BYTE_ORDER BYTE_ORDER
  30. #endif
  31. #ifndef __BIG_ENDIAN
  32. #define __BIG_ENDIAN BIG_ENDIAN
  33. #endif
  34. #ifndef __LITTLE_ENDIAN
  35. #define __LITTLE_ENDIAN LITTLE_ENDIAN
  36. #endif
  37. #ifndef __linux__
  38. #if __BYTE_ORDER == __LITTLE_ENDIAN
  39. #define htobe16(x) bswap_16(x)
  40. #define be16toh(x) bswap_16(x)
  41. #define htobe32(x) bswap_32(x)
  42. #define be32toh(x) bswap_32(x)
  43. #define htobe64(x) bswap_64(x)
  44. #define be64toh(x) bswap_64(x)
  45. #define htole16(x) (uint16_t)(x)
  46. #define le16toh(x) (uint16_t)(x)
  47. #define htole32(x) (uint32_t)(x)
  48. #define le32toh(x) (uint32_t)(x)
  49. #define htole64(x) (uint64_t)(x)
  50. #define le64toh(x) (uint64_t)(x)
  51. #else
  52. #define htobe16(x) (uint16_t)(x)
  53. #define be16toh(x) (uint16_t)(x)
  54. #define htobe32(x) (uint32_t)(x)
  55. #define be32toh(x) (uint32_t)(x)
  56. #define htobe64(x) (uint64_t)(x)
  57. #define be64toh(x) (uint64_t)(x)
  58. #define htole16(x) bswap_16(x)
  59. #define le16toh(x) bswap_16(x)
  60. #define htole32(x) bswap_32(x)
  61. #define le32toh(x) bswap_32(x)
  62. #define htole64(x) bswap_64(x)
  63. #define le64toh(x) bswap_64(x)
  64. #endif
  65. #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
  66. #if __BYTE_ORDER == __LITTLE_ENDIAN
  67. #define betoh16(x) bswap_16(x)
  68. #define betoh32(x) bswap_32(x)
  69. #define betoh64(x) bswap_64(x)
  70. #define letoh16(x) (uint16_t)(x)
  71. #define letoh32(x) (uint32_t)(x)
  72. #define letoh64(x) (uint64_t)(x)
  73. #else
  74. #define betoh16(x) (uint16_t)(x)
  75. #define betoh32(x) (uint32_t)(x)
  76. #define betoh64(x) (uint64_t)(x)
  77. #define letoh16(x) bswap_16(x)
  78. #define letoh32(x) bswap_32(x)
  79. #define letoh64(x) bswap_64(x)
  80. #endif
  81. #endif
  82. #endif
  83. #endif