xref: /haiku/headers/os/support/ByteOrder.h (revision 7d9ef5af202a6fca99b624ea179fa129324bcaee)
152a38012Sejakowatz // Modified BeOS header. Just here to be able to compile and test BResources.
252a38012Sejakowatz // To be replaced by the OpenBeOS version to be provided by the IK Team.
352a38012Sejakowatz 
452a38012Sejakowatz #ifndef _sk_byte_order_h_
552a38012Sejakowatz #define _sk_byte_order_h_
652a38012Sejakowatz 
752a38012Sejakowatz #include <BeBuild.h>
852a38012Sejakowatz #include <endian.h>
952a38012Sejakowatz #include <SupportDefs.h>
1052a38012Sejakowatz #include <TypeConstants.h>	/* For convenience */
1152a38012Sejakowatz 
1252a38012Sejakowatz #ifdef __cplusplus
1352a38012Sejakowatz extern "C" {
1452a38012Sejakowatz #endif
1552a38012Sejakowatz 
1652a38012Sejakowatz /*----------------------------------------------------------------------*/
1752a38012Sejakowatz /*------- Swap-direction constants, and swapping functions -------------*/
1852a38012Sejakowatz 
1952a38012Sejakowatz typedef enum {
2052a38012Sejakowatz 	B_SWAP_HOST_TO_LENDIAN,
2152a38012Sejakowatz 	B_SWAP_HOST_TO_BENDIAN,
2252a38012Sejakowatz 	B_SWAP_LENDIAN_TO_HOST,
2352a38012Sejakowatz 	B_SWAP_BENDIAN_TO_HOST,
2452a38012Sejakowatz 	B_SWAP_ALWAYS
2552a38012Sejakowatz } swap_action;
2652a38012Sejakowatz 
2752a38012Sejakowatz extern status_t swap_data(type_code type, void *data, size_t length,
2852a38012Sejakowatz 						  swap_action action);
2952a38012Sejakowatz 
3052a38012Sejakowatz extern bool is_type_swapped(type_code type);
3152a38012Sejakowatz 
3252a38012Sejakowatz 
3352a38012Sejakowatz /*-----------------------------------------------------------------------*/
3452a38012Sejakowatz /*----- Private implementations -----------------------------------------*/
3552a38012Sejakowatz extern double __swap_double(double arg);
3652a38012Sejakowatz extern float  __swap_float(float arg);
3752a38012Sejakowatz extern uint64 __swap_int64(uint64 uarg);
3852a38012Sejakowatz extern uint32 __swap_int32(uint32 uarg);
3952a38012Sejakowatz extern uint16 __swap_int16(uint16 uarg);
4052a38012Sejakowatz /*-------------------------------------------------------------*/
4152a38012Sejakowatz 
4252a38012Sejakowatz 
4352a38012Sejakowatz /*-------------------------------------------------------------*/
4452a38012Sejakowatz /*--------- Host is Little  --------------------------------------*/
4552a38012Sejakowatz 
4652a38012Sejakowatz #if BYTE_ORDER == __LITTLE_ENDIAN
4752a38012Sejakowatz #define B_HOST_IS_LENDIAN 1
4852a38012Sejakowatz #define B_HOST_IS_BENDIAN 0
4952a38012Sejakowatz 
5052a38012Sejakowatz /*--------- Host Native -> Little  --------------------*/
5152a38012Sejakowatz 
5252a38012Sejakowatz #define B_HOST_TO_LENDIAN_DOUBLE(arg)	(double)(arg)
5352a38012Sejakowatz #define B_HOST_TO_LENDIAN_FLOAT(arg)	(float)(arg)
5452a38012Sejakowatz #define B_HOST_TO_LENDIAN_INT64(arg)	(uint64)(arg)
5552a38012Sejakowatz #define B_HOST_TO_LENDIAN_INT32(arg)	(uint32)(arg)
5652a38012Sejakowatz #define B_HOST_TO_LENDIAN_INT16(arg)	(uint16)(arg)
5752a38012Sejakowatz 
5852a38012Sejakowatz /*--------- Host Native -> Big  ------------------------*/
5952a38012Sejakowatz #define B_HOST_TO_BENDIAN_DOUBLE(arg)	__swap_double(arg)
6052a38012Sejakowatz #define B_HOST_TO_BENDIAN_FLOAT(arg)	__swap_float(arg)
6152a38012Sejakowatz #define B_HOST_TO_BENDIAN_INT64(arg)	__swap_int64(arg)
6252a38012Sejakowatz #define B_HOST_TO_BENDIAN_INT32(arg)	__swap_int32(arg)
6352a38012Sejakowatz #define B_HOST_TO_BENDIAN_INT16(arg)	__swap_int16(arg)
6452a38012Sejakowatz 
6552a38012Sejakowatz /*--------- Little -> Host Native ---------------------*/
6652a38012Sejakowatz #define B_LENDIAN_TO_HOST_DOUBLE(arg)	(double)(arg)
6752a38012Sejakowatz #define B_LENDIAN_TO_HOST_FLOAT(arg)	(float)(arg)
6852a38012Sejakowatz #define B_LENDIAN_TO_HOST_INT64(arg)	(uint64)(arg)
6952a38012Sejakowatz #define B_LENDIAN_TO_HOST_INT32(arg)	(uint32)(arg)
7052a38012Sejakowatz #define B_LENDIAN_TO_HOST_INT16(arg)	(uint16)(arg)
7152a38012Sejakowatz 
7252a38012Sejakowatz /*--------- Big -> Host Native ------------------------*/
7352a38012Sejakowatz #define B_BENDIAN_TO_HOST_DOUBLE(arg)	__swap_double(arg)
7452a38012Sejakowatz #define B_BENDIAN_TO_HOST_FLOAT(arg)	__swap_float(arg)
7552a38012Sejakowatz #define B_BENDIAN_TO_HOST_INT64(arg)	__swap_int64(arg)
7652a38012Sejakowatz #define B_BENDIAN_TO_HOST_INT32(arg)	__swap_int32(arg)
7752a38012Sejakowatz #define B_BENDIAN_TO_HOST_INT16(arg)	__swap_int16(arg)
7852a38012Sejakowatz 
7952a38012Sejakowatz #else /* __LITTLE_ENDIAN */
8052a38012Sejakowatz 
8152a38012Sejakowatz 
8252a38012Sejakowatz /*-------------------------------------------------------------*/
8352a38012Sejakowatz /*--------- Host is Big  --------------------------------------*/
8452a38012Sejakowatz 
8552a38012Sejakowatz #define B_HOST_IS_LENDIAN 0
8652a38012Sejakowatz #define B_HOST_IS_BENDIAN 1
8752a38012Sejakowatz 
8852a38012Sejakowatz /*--------- Host Native -> Little  -------------------*/
8952a38012Sejakowatz #define B_HOST_TO_LENDIAN_DOUBLE(arg)	__swap_double(arg)
9052a38012Sejakowatz #define B_HOST_TO_LENDIAN_FLOAT(arg)	__swap_float(arg)
9152a38012Sejakowatz #define B_HOST_TO_LENDIAN_INT64(arg)	__swap_int64(arg)
9252a38012Sejakowatz #define B_HOST_TO_LENDIAN_INT32(arg)	__swap_int32(arg)
9352a38012Sejakowatz #define B_HOST_TO_LENDIAN_INT16(arg)	__swap_int16(arg)
9452a38012Sejakowatz 
9552a38012Sejakowatz /*--------- Host Native -> Big  ------------------------*/
9652a38012Sejakowatz #define B_HOST_TO_BENDIAN_DOUBLE(arg)	(double)(arg)
9752a38012Sejakowatz #define B_HOST_TO_BENDIAN_FLOAT(arg)	(float)(arg)
9852a38012Sejakowatz #define B_HOST_TO_BENDIAN_INT64(arg)	(uint64)(arg)
9952a38012Sejakowatz #define B_HOST_TO_BENDIAN_INT32(arg)	(uint32)(arg)
10052a38012Sejakowatz #define B_HOST_TO_BENDIAN_INT16(arg)	(uint16)(arg)
10152a38012Sejakowatz 
10252a38012Sejakowatz /*--------- Little -> Host Native ----------------------*/
10352a38012Sejakowatz #define B_LENDIAN_TO_HOST_DOUBLE(arg)	__swap_double(arg)
10452a38012Sejakowatz #define B_LENDIAN_TO_HOST_FLOAT(arg)	__swap_float(arg)
10552a38012Sejakowatz #define B_LENDIAN_TO_HOST_INT64(arg)	__swap_int64(arg)
10652a38012Sejakowatz #define B_LENDIAN_TO_HOST_INT32(arg)	__swap_int32(arg)
10752a38012Sejakowatz #define B_LENDIAN_TO_HOST_INT16(arg)	__swap_int16(arg)
10852a38012Sejakowatz 
10952a38012Sejakowatz /*--------- Big -> Host Native -------------------------*/
11052a38012Sejakowatz #define B_BENDIAN_TO_HOST_DOUBLE(arg)	(double)(arg)
11152a38012Sejakowatz #define B_BENDIAN_TO_HOST_FLOAT(arg)	(float)(arg)
11252a38012Sejakowatz #define B_BENDIAN_TO_HOST_INT64(arg)	(uint64)(arg)
11352a38012Sejakowatz #define B_BENDIAN_TO_HOST_INT32(arg)	(uint32)(arg)
11452a38012Sejakowatz #define B_BENDIAN_TO_HOST_INT16(arg)	(uint16)(arg)
11552a38012Sejakowatz 
11652a38012Sejakowatz #endif /* __LITTLE_ENDIAN */
11752a38012Sejakowatz 
11852a38012Sejakowatz 
11952a38012Sejakowatz /*-------------------------------------------------------------*/
12052a38012Sejakowatz /*--------- Just-do-it macros ---------------------------------*/
12152a38012Sejakowatz #define B_SWAP_DOUBLE(arg)   __swap_double(arg)
12252a38012Sejakowatz #define B_SWAP_FLOAT(arg)    __swap_float(arg)
12352a38012Sejakowatz #define B_SWAP_INT64(arg)    __swap_int64(arg)
12452a38012Sejakowatz #define B_SWAP_INT32(arg)    __swap_int32(arg)
12552a38012Sejakowatz #define B_SWAP_INT16(arg)    __swap_int16(arg)
12652a38012Sejakowatz 
12752a38012Sejakowatz 
12852a38012Sejakowatz /*-------------------------------------------------------------*/
12952a38012Sejakowatz /*---------Berkeley macros -----------------------------------*/
130*7d9ef5afSbeveloper #ifndef htonl /* avoid collision with <netinet/in.h> */
13152a38012Sejakowatz   #define htonl(x) B_HOST_TO_BENDIAN_INT32(x)
13252a38012Sejakowatz   #define ntohl(x) B_BENDIAN_TO_HOST_INT32(x)
13352a38012Sejakowatz   #define htons(x) B_HOST_TO_BENDIAN_INT16(x)
13452a38012Sejakowatz   #define ntohs(x) B_BENDIAN_TO_HOST_INT16(x)
135*7d9ef5afSbeveloper #endif
13652a38012Sejakowatz 
13752a38012Sejakowatz #ifdef __cplusplus
13852a38012Sejakowatz }
13952a38012Sejakowatz #endif /* __cplusplus */
14052a38012Sejakowatz 
14152a38012Sejakowatz /*-------------------------------------------------------------*/
14252a38012Sejakowatz /*-------------------------------------------------------------*/
14352a38012Sejakowatz 
14452a38012Sejakowatz #endif	// _sk_byte_order_h_
145