xref: /haiku/headers/os/support/ByteOrder.h (revision 087882c26e81eabf9a459e634a33f8e978d8a66b)
1*087882c2SAxel Dörfler /*
2*087882c2SAxel Dörfler  * Copyright 2007, Haiku, Inc. All Rights Reserved.
3*087882c2SAxel Dörfler  * Distributed under the terms of the MIT License.
4*087882c2SAxel Dörfler  */
5*087882c2SAxel Dörfler #ifndef _BYTEORDER_H
6*087882c2SAxel Dörfler #define _BYTEORDER_H
752a38012Sejakowatz 
852a38012Sejakowatz 
952a38012Sejakowatz #include <BeBuild.h>
1052a38012Sejakowatz #include <endian.h>
1152a38012Sejakowatz #include <SupportDefs.h>
12*087882c2SAxel Dörfler #include <TypeConstants.h>
13*087882c2SAxel Dörfler 	// for convenience
1452a38012Sejakowatz 
1552a38012Sejakowatz 
16*087882c2SAxel Dörfler // swap directions
1752a38012Sejakowatz typedef enum {
1852a38012Sejakowatz 	B_SWAP_HOST_TO_LENDIAN,
1952a38012Sejakowatz 	B_SWAP_HOST_TO_BENDIAN,
2052a38012Sejakowatz 	B_SWAP_LENDIAN_TO_HOST,
2152a38012Sejakowatz 	B_SWAP_BENDIAN_TO_HOST,
2252a38012Sejakowatz 	B_SWAP_ALWAYS
2352a38012Sejakowatz } swap_action;
2452a38012Sejakowatz 
2552a38012Sejakowatz 
26*087882c2SAxel Dörfler // BSD/networking macros
27*087882c2SAxel Dörfler #ifndef htonl
2852a38012Sejakowatz #	define htonl(x) B_HOST_TO_BENDIAN_INT32(x)
2952a38012Sejakowatz #	define ntohl(x) B_BENDIAN_TO_HOST_INT32(x)
3052a38012Sejakowatz #	define htons(x) B_HOST_TO_BENDIAN_INT16(x)
3152a38012Sejakowatz #	define ntohs(x) B_BENDIAN_TO_HOST_INT16(x)
327d9ef5afSbeveloper #endif
3352a38012Sejakowatz 
34*087882c2SAxel Dörfler // always swap macros
35*087882c2SAxel Dörfler #define B_SWAP_DOUBLE(arg)   __swap_double(arg)
36*087882c2SAxel Dörfler #define B_SWAP_FLOAT(arg)    __swap_float(arg)
37*087882c2SAxel Dörfler #define B_SWAP_INT64(arg)    __swap_int64(arg)
38*087882c2SAxel Dörfler #define B_SWAP_INT32(arg)    __swap_int32(arg)
39*087882c2SAxel Dörfler #define B_SWAP_INT16(arg)    __swap_int16(arg)
40*087882c2SAxel Dörfler 
41*087882c2SAxel Dörfler #if BYTE_ORDER == __LITTLE_ENDIAN
42*087882c2SAxel Dörfler // Host is little endian
43*087882c2SAxel Dörfler 
44*087882c2SAxel Dörfler #define B_HOST_IS_LENDIAN 1
45*087882c2SAxel Dörfler #define B_HOST_IS_BENDIAN 0
46*087882c2SAxel Dörfler 
47*087882c2SAxel Dörfler // Host native to little endian
48*087882c2SAxel Dörfler #define B_HOST_TO_LENDIAN_DOUBLE(arg)	(double)(arg)
49*087882c2SAxel Dörfler #define B_HOST_TO_LENDIAN_FLOAT(arg)	(float)(arg)
50*087882c2SAxel Dörfler #define B_HOST_TO_LENDIAN_INT64(arg)	(uint64)(arg)
51*087882c2SAxel Dörfler #define B_HOST_TO_LENDIAN_INT32(arg)	(uint32)(arg)
52*087882c2SAxel Dörfler #define B_HOST_TO_LENDIAN_INT16(arg)	(uint16)(arg)
53*087882c2SAxel Dörfler 
54*087882c2SAxel Dörfler // Little endian to host native
55*087882c2SAxel Dörfler #define B_LENDIAN_TO_HOST_DOUBLE(arg)	(double)(arg)
56*087882c2SAxel Dörfler #define B_LENDIAN_TO_HOST_FLOAT(arg)	(float)(arg)
57*087882c2SAxel Dörfler #define B_LENDIAN_TO_HOST_INT64(arg)	(uint64)(arg)
58*087882c2SAxel Dörfler #define B_LENDIAN_TO_HOST_INT32(arg)	(uint32)(arg)
59*087882c2SAxel Dörfler #define B_LENDIAN_TO_HOST_INT16(arg)	(uint16)(arg)
60*087882c2SAxel Dörfler 
61*087882c2SAxel Dörfler // Host native to big endian
62*087882c2SAxel Dörfler #define B_HOST_TO_BENDIAN_DOUBLE(arg)	__swap_double(arg)
63*087882c2SAxel Dörfler #define B_HOST_TO_BENDIAN_FLOAT(arg)	__swap_float(arg)
64*087882c2SAxel Dörfler #define B_HOST_TO_BENDIAN_INT64(arg)	__swap_int64(arg)
65*087882c2SAxel Dörfler #define B_HOST_TO_BENDIAN_INT32(arg)	__swap_int32(arg)
66*087882c2SAxel Dörfler #define B_HOST_TO_BENDIAN_INT16(arg)	__swap_int16(arg)
67*087882c2SAxel Dörfler 
68*087882c2SAxel Dörfler // Big endian to host native
69*087882c2SAxel Dörfler #define B_BENDIAN_TO_HOST_DOUBLE(arg)	__swap_double(arg)
70*087882c2SAxel Dörfler #define B_BENDIAN_TO_HOST_FLOAT(arg)	__swap_float(arg)
71*087882c2SAxel Dörfler #define B_BENDIAN_TO_HOST_INT64(arg)	__swap_int64(arg)
72*087882c2SAxel Dörfler #define B_BENDIAN_TO_HOST_INT32(arg)	__swap_int32(arg)
73*087882c2SAxel Dörfler #define B_BENDIAN_TO_HOST_INT16(arg)	__swap_int16(arg)
74*087882c2SAxel Dörfler 
75*087882c2SAxel Dörfler #else	// BYTE_ORDER
76*087882c2SAxel Dörfler // Host is big endian
77*087882c2SAxel Dörfler 
78*087882c2SAxel Dörfler #define B_HOST_IS_LENDIAN 0
79*087882c2SAxel Dörfler #define B_HOST_IS_BENDIAN 1
80*087882c2SAxel Dörfler 
81*087882c2SAxel Dörfler // Host native to little endian
82*087882c2SAxel Dörfler #define B_HOST_TO_LENDIAN_DOUBLE(arg)	__swap_double(arg)
83*087882c2SAxel Dörfler #define B_HOST_TO_LENDIAN_FLOAT(arg)	__swap_float(arg)
84*087882c2SAxel Dörfler #define B_HOST_TO_LENDIAN_INT64(arg)	__swap_int64(arg)
85*087882c2SAxel Dörfler #define B_HOST_TO_LENDIAN_INT32(arg)	__swap_int32(arg)
86*087882c2SAxel Dörfler #define B_HOST_TO_LENDIAN_INT16(arg)	__swap_int16(arg)
87*087882c2SAxel Dörfler 
88*087882c2SAxel Dörfler // Little endian to host native
89*087882c2SAxel Dörfler #define B_LENDIAN_TO_HOST_DOUBLE(arg)	__swap_double(arg)
90*087882c2SAxel Dörfler #define B_LENDIAN_TO_HOST_FLOAT(arg)	__swap_float(arg)
91*087882c2SAxel Dörfler #define B_LENDIAN_TO_HOST_INT64(arg)	__swap_int64(arg)
92*087882c2SAxel Dörfler #define B_LENDIAN_TO_HOST_INT32(arg)	__swap_int32(arg)
93*087882c2SAxel Dörfler #define B_LENDIAN_TO_HOST_INT16(arg)	__swap_int16(arg)
94*087882c2SAxel Dörfler 
95*087882c2SAxel Dörfler // Host native to big endian
96*087882c2SAxel Dörfler #define B_HOST_TO_BENDIAN_DOUBLE(arg)	(double)(arg)
97*087882c2SAxel Dörfler #define B_HOST_TO_BENDIAN_FLOAT(arg)	(float)(arg)
98*087882c2SAxel Dörfler #define B_HOST_TO_BENDIAN_INT64(arg)	(uint64)(arg)
99*087882c2SAxel Dörfler #define B_HOST_TO_BENDIAN_INT32(arg)	(uint32)(arg)
100*087882c2SAxel Dörfler #define B_HOST_TO_BENDIAN_INT16(arg)	(uint16)(arg)
101*087882c2SAxel Dörfler 
102*087882c2SAxel Dörfler // Big endian to host native
103*087882c2SAxel Dörfler #define B_BENDIAN_TO_HOST_DOUBLE(arg)	(double)(arg)
104*087882c2SAxel Dörfler #define B_BENDIAN_TO_HOST_FLOAT(arg)	(float)(arg)
105*087882c2SAxel Dörfler #define B_BENDIAN_TO_HOST_INT64(arg)	(uint64)(arg)
106*087882c2SAxel Dörfler #define B_BENDIAN_TO_HOST_INT32(arg)	(uint32)(arg)
107*087882c2SAxel Dörfler #define B_BENDIAN_TO_HOST_INT16(arg)	(uint16)(arg)
108*087882c2SAxel Dörfler 
109*087882c2SAxel Dörfler #endif	// BYTE_ORDER
110*087882c2SAxel Dörfler 
111*087882c2SAxel Dörfler 
112*087882c2SAxel Dörfler #ifdef __cplusplus
113*087882c2SAxel Dörfler extern "C" {
114*087882c2SAxel Dörfler #endif
115*087882c2SAxel Dörfler 
116*087882c2SAxel Dörfler extern status_t swap_data(type_code type, void *data, size_t length,
117*087882c2SAxel Dörfler 	swap_action action);
118*087882c2SAxel Dörfler extern bool is_type_swapped(type_code type);
119*087882c2SAxel Dörfler 
120*087882c2SAxel Dörfler 
121*087882c2SAxel Dörfler // Private implementations
122*087882c2SAxel Dörfler extern double __swap_double(double arg);
123*087882c2SAxel Dörfler extern float  __swap_float(float arg);
124*087882c2SAxel Dörfler extern uint64 __swap_int64(uint64 arg);
125*087882c2SAxel Dörfler extern uint32 __swap_int32(uint32 arg);
126*087882c2SAxel Dörfler extern uint16 __swap_int16(uint16 arg);
127*087882c2SAxel Dörfler 
12852a38012Sejakowatz #ifdef __cplusplus
12952a38012Sejakowatz }
130*087882c2SAxel Dörfler #endif
13152a38012Sejakowatz 
132*087882c2SAxel Dörfler #endif	// _BYTEORDER_H
133