| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| #ifndef H_ENDIAN_ |
| #define H_ENDIAN_ |
| |
| #include <inttypes.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /* Internal helpers */ |
| #ifndef os_bswap_64 |
| #define os_bswap_64(x) ((uint64_t) \ |
| ((((x) & 0xff00000000000000ull) >> 56) | \ |
| (((x) & 0x00ff000000000000ull) >> 40) | \ |
| (((x) & 0x0000ff0000000000ull) >> 24) | \ |
| (((x) & 0x000000ff00000000ull) >> 8) | \ |
| (((x) & 0x00000000ff000000ull) << 8) | \ |
| (((x) & 0x0000000000ff0000ull) << 24) | \ |
| (((x) & 0x000000000000ff00ull) << 40) | \ |
| (((x) & 0x00000000000000ffull) << 56))) |
| #endif |
| |
| #ifndef os_bswap_32 |
| #define os_bswap_32(x) ((uint32_t) \ |
| ((((x) & 0xff000000) >> 24) | \ |
| (((x) & 0x00ff0000) >> 8) | \ |
| (((x) & 0x0000ff00) << 8) | \ |
| (((x) & 0x000000ff) << 24))) |
| #endif |
| |
| #ifndef os_bswap_16 |
| #define os_bswap_16(x) ((uint16_t) \ |
| ((((x) & 0xff00) >> 8) | \ |
| (((x) & 0x00ff) << 8))) |
| #endif |
| |
| #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ |
| |
| #ifndef ntohll |
| #define ntohll(x) ((uint64_t)(x)) |
| #endif |
| |
| #ifndef htonll |
| #define htonll(x) ((uint64_t)(x)) |
| #endif |
| |
| #ifndef ntohl |
| #define ntohl(x) ((uint32_t)(x)) |
| #endif |
| |
| #ifndef htonl |
| #define htonl(x) ((uint32_t)(x)) |
| #endif |
| |
| #ifndef ntohs |
| #define ntohs(x) ((uint16_t)(x)) |
| #endif |
| |
| #ifndef htons |
| #define htons(x) ((uint16_t)(x)) |
| #endif |
| |
| #ifndef htobe16 |
| #define htobe16(x) ((uint16_t)(x)) |
| #endif |
| |
| #ifndef htole16 |
| #define htole16(x) os_bswap_16 (x) |
| #endif |
| |
| #ifndef be16toh |
| #define be16toh(x) ((uint16_t)(x)) |
| #endif |
| |
| #ifndef le16toh |
| #define le16toh(x) os_bswap_16 (x) |
| #endif |
| |
| #ifndef htobe32 |
| #define htobe32(x) ((uint32_t)(x)) |
| #endif |
| |
| #ifndef htole32 |
| #define htole32(x) os_bswap_32 (x) |
| #endif |
| |
| #ifndef be32toh |
| #define be32toh(x) ((uint32_t)(x)) |
| #endif |
| |
| #ifndef le32toh |
| #define le32toh(x) os_bswap_32 (x) |
| #endif |
| |
| #ifndef htobe64 |
| #define htobe64(x) ((uint64_t)(x)) |
| #endif |
| |
| #ifndef htole64 |
| #define htole64(x) os_bswap_64 (x) |
| #endif |
| |
| #ifndef be64toh |
| #define be64toh(x) ((uint64_t)(x)) |
| #endif |
| |
| #ifndef le64toh |
| #define le64toh(x) os_bswap_64 (x) |
| #endif |
| |
| #else |
| |
| #ifndef ntohll |
| #define ntohll(x) os_bswap_64(x) |
| #endif |
| |
| #ifndef htonll |
| #define htonll ntohll |
| #endif |
| |
| #ifndef ntohl |
| #define ntohl(x) os_bswap_32(x) |
| #endif |
| |
| #ifndef htonl |
| #define htonl ntohl |
| #endif |
| |
| #ifndef htons |
| #define htons(x) os_bswap_16(x) |
| #endif |
| |
| #ifndef ntohs |
| #define ntohs htons |
| #endif |
| |
| #ifndef htobe16 |
| #define htobe16(x) os_bswap_16(x) |
| #endif |
| |
| #ifndef htole16 |
| #define htole16(x) ((uint16_t)(x)) |
| #endif |
| |
| #ifndef be16toh |
| #define be16toh(x) os_bswap_16(x) |
| #endif |
| |
| #ifndef le16toh |
| #define le16toh(x) ((uint16_t)(x)) |
| #endif |
| |
| #ifndef htobe32 |
| #define htobe32(x) os_bswap_32(x) |
| #endif |
| |
| #ifndef htole32 |
| #define htole32(x) ((uint32_t)(x)) |
| #endif |
| |
| #ifndef be32toh |
| #define be32toh(x) os_bswap_32(x) |
| #endif |
| |
| #ifndef le32toh |
| #define le32toh(x) ((uint32_t)(x)) |
| #endif |
| |
| #ifndef htobe64 |
| #define htobe64(x) os_bswap64(x) |
| #endif |
| |
| #ifndef htole64 |
| #define htole64(x) ((uint64_t)(x)) |
| #endif |
| |
| #ifndef be64toh |
| #define be64toh(x) os_bswap64(x) |
| #endif |
| |
| #ifndef le64toh |
| #define le64toh(x) ((uint64_t)(x)) |
| #endif |
| |
| #endif |
| |
| void put_le16(void *buf, uint16_t x); |
| void put_le32(void *buf, uint32_t x); |
| void put_le64(void *buf, uint64_t x); |
| uint16_t get_le16(const void *buf); |
| uint32_t get_le32(const void *buf); |
| uint64_t get_le64(const void *buf); |
| void put_be16(void *buf, uint16_t x); |
| void put_be32(void *buf, uint32_t x); |
| void put_be64(void *buf, uint64_t x); |
| uint16_t get_be16(const void *buf); |
| uint32_t get_be32(const void *buf); |
| uint64_t get_be64(const void *buf); |
| void swap_in_place(void *buf, int len); |
| void swap_buf(uint8_t *dst, const uint8_t *src, int len); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |