Revert "Rename "libside" to "libtgif""
[libside.git] / include / side / endian.h
1 // SPDX-License-Identifier: MIT
2 /*
3 *
4 * Copyright (C) 2012,2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 */
6
7 /*
8 * This header defines the following endian macros based on the current
9 * platform endian headers:
10 *
11 * BYTE_ORDER this macro shall have a value equal to one
12 * of the *_ENDIAN macros in this header.
13 * FLOAT_WORD_ORDER this macro shall have a value equal to one
14 * of the *_ENDIAN macros in this header.
15 * LITTLE_ENDIAN if BYTE_ORDER == LITTLE_ENDIAN, the host
16 * byte order is from least significant to
17 * most significant.
18 * BIG_ENDIAN if BYTE_ORDER == BIG_ENDIAN, the host byte
19 * order is from most significant to least
20 * significant.
21 *
22 * Direct byte swapping interfaces:
23 *
24 * uint16_t bswap_16(uint16_t x); (* swap bytes 16-bit word *)
25 * uint32_t bswap_32(uint32_t x); (* swap bytes 32-bit word *)
26 * uint64_t bswap_64(uint32_t x); (* swap bytes 64-bit word *)
27 */
28
29 #ifndef _SIDE_ENDIAN_H
30 #define _SIDE_ENDIAN_H
31
32 #include <side/macros.h>
33 #include <math.h>
34
35 #if (defined(__linux__) || defined(__CYGWIN__))
36 #include <endian.h>
37 #include <byteswap.h>
38
39 #define side_bswap_16(x) bswap_16(x)
40 #define side_bswap_32(x) bswap_32(x)
41 #define side_bswap_64(x) bswap_64(x)
42
43 #define SIDE_BYTE_ORDER __BYTE_ORDER
44 #define SIDE_LITTLE_ENDIAN __LITTLE_ENDIAN
45 #define SIDE_BIG_ENDIAN __BIG_ENDIAN
46
47 #ifdef __FLOAT_WORD_ORDER
48 #define SIDE_FLOAT_WORD_ORDER __FLOAT_WORD_ORDER
49 #else /* __FLOAT_WORD_ORDER */
50 #define SIDE_FLOAT_WORD_ORDER __BYTE_ORDER
51 #endif /* __FLOAT_WORD_ORDER */
52
53 #elif defined(__FreeBSD__)
54
55 #include <sys/endian.h>
56
57 #define side_bswap_16(x) bswap16(x)
58 #define side_bswap_32(x) bswap32(x)
59 #define side_bswap_64(x) bswap64(x)
60
61 #define SIDE_BYTE_ORDER BYTE_ORDER
62 #define SIDE_LITTLE_ENDIAN LITTLE_ENDIAN
63 #define SIDE_BIG_ENDIAN BIG_ENDIAN
64 #define SIDE_FLOAT_WORD_ORDER BYTE_ORDER
65
66 #else
67 #error "Please add support for your OS."
68 #endif
69
70 #ifdef __cplusplus
71 extern "C" {
72 #endif
73
74 #ifdef __HAVE_FLOAT128
75 static inline
76 void side_bswap_128p(char *p)
77 {
78 int i;
79
80 for (i = 0; i < 8; i++)
81 p[i] = p[15 - i];
82 }
83 #endif
84
85 #ifdef __cplusplus
86 }
87 #endif
88
89 #if SIDE_BITS_PER_LONG == 64
90 # define side_bswap_pointer(x) side_bswap_64(x)
91 #else
92 # define side_bswap_pointer(x) side_bswap_32(x)
93 #endif
94
95 #endif /* _SIDE_ENDIAN_H */
This page took 0.03053 seconds and 4 git commands to generate.