xref: /haiku/src/kits/support/ByteOrder.cpp (revision fe88ae51ec00581a9c6e41f99de8a7f3b0f5a9d5)
12397827aSAxel Dörfler /*
25232a619SAxel Dörfler  * Copyright 2004-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
35232a619SAxel Dörfler  * Distributed under the terms of the MIT License.
42397827aSAxel Dörfler  */
52397827aSAxel Dörfler 
652a38012Sejakowatz 
752a38012Sejakowatz #include <ByteOrder.h>
82397827aSAxel Dörfler #include <Messenger.h>
94b8aafeaSIngo Weinhold #include <MessengerPrivate.h>
1052a38012Sejakowatz 
1152a38012Sejakowatz 
1252a38012Sejakowatz status_t
swap_data(type_code type,void * _data,size_t length,swap_action action)132397827aSAxel Dörfler swap_data(type_code type, void *_data, size_t length, swap_action action)
1452a38012Sejakowatz {
152397827aSAxel Dörfler 	// is there anything to do?
162397827aSAxel Dörfler #if B_HOST_IS_LENDIAN
172397827aSAxel Dörfler 	if (action == B_SWAP_HOST_TO_LENDIAN || action == B_SWAP_LENDIAN_TO_HOST)
182397827aSAxel Dörfler 		return B_OK;
192397827aSAxel Dörfler #else
202397827aSAxel Dörfler 	if (action == B_SWAP_HOST_TO_BENDIAN || action == B_SWAP_BENDIAN_TO_HOST)
212397827aSAxel Dörfler 		return B_OK;
222397827aSAxel Dörfler #endif
232397827aSAxel Dörfler 
24a156e74aSMichael Lotz 	if (length == 0)
25a156e74aSMichael Lotz 		return B_OK;
26a156e74aSMichael Lotz 
27a156e74aSMichael Lotz 	if (_data == NULL)
28a156e74aSMichael Lotz 		return B_BAD_VALUE;
29a156e74aSMichael Lotz 
30a156e74aSMichael Lotz 	// ToDo: these are not safe. If the length is smaller than the size of
31a156e74aSMichael Lotz 	// the type to be converted, too much data may be read. R5 behaves in the
32a156e74aSMichael Lotz 	// same way though.
332397827aSAxel Dörfler 	switch (type) {
342397827aSAxel Dörfler 		// 16 bit types
352397827aSAxel Dörfler 		case B_INT16_TYPE:
362397827aSAxel Dörfler 		case B_UINT16_TYPE:
372397827aSAxel Dörfler 		{
382397827aSAxel Dörfler 			uint16 *data = (uint16 *)_data;
392397827aSAxel Dörfler 			uint16 *end = (uint16 *)((addr_t)_data + length);
402397827aSAxel Dörfler 
412397827aSAxel Dörfler 			while (data < end) {
422397827aSAxel Dörfler 				*data = __swap_int16(*data);
432397827aSAxel Dörfler 				data++;
442397827aSAxel Dörfler 			}
452397827aSAxel Dörfler 			break;
4652a38012Sejakowatz 		}
4752a38012Sejakowatz 
482397827aSAxel Dörfler 		// 32 bit types
492397827aSAxel Dörfler 		case B_FLOAT_TYPE:
502397827aSAxel Dörfler 		case B_INT32_TYPE:
512397827aSAxel Dörfler 		case B_UINT32_TYPE:
522397827aSAxel Dörfler 		case B_TIME_TYPE:
532397827aSAxel Dörfler 		case B_RECT_TYPE:
542397827aSAxel Dörfler 		case B_POINT_TYPE:
55049d149cSAlex Smith #if B_HAIKU_32_BIT
56049d149cSAlex Smith 		case B_SIZE_T_TYPE:
57049d149cSAlex Smith 		case B_SSIZE_T_TYPE:
58049d149cSAlex Smith 		case B_POINTER_TYPE:
59049d149cSAlex Smith #endif
602397827aSAxel Dörfler 		{
612397827aSAxel Dörfler 			uint32 *data = (uint32 *)_data;
622397827aSAxel Dörfler 			uint32 *end = (uint32 *)((addr_t)_data + length);
632397827aSAxel Dörfler 
642397827aSAxel Dörfler 			while (data < end) {
652397827aSAxel Dörfler 				*data = __swap_int32(*data);
662397827aSAxel Dörfler 				data++;
672397827aSAxel Dörfler 			}
682397827aSAxel Dörfler 			break;
692397827aSAxel Dörfler 		}
702397827aSAxel Dörfler 
712397827aSAxel Dörfler 		// 64 bit types
722397827aSAxel Dörfler 		case B_DOUBLE_TYPE:
732397827aSAxel Dörfler 		case B_INT64_TYPE:
742397827aSAxel Dörfler 		case B_UINT64_TYPE:
752397827aSAxel Dörfler 		case B_OFF_T_TYPE:
76049d149cSAlex Smith #if B_HAIKU_64_BIT
77049d149cSAlex Smith 		case B_SIZE_T_TYPE:
78049d149cSAlex Smith 		case B_SSIZE_T_TYPE:
79049d149cSAlex Smith 		case B_POINTER_TYPE:
80049d149cSAlex Smith #endif
812397827aSAxel Dörfler 		{
822397827aSAxel Dörfler 			uint64 *data = (uint64 *)_data;
832397827aSAxel Dörfler 			uint64 *end = (uint64 *)((addr_t)_data + length);
842397827aSAxel Dörfler 
852397827aSAxel Dörfler 			while (data < end) {
862397827aSAxel Dörfler 				*data = __swap_int64(*data);
872397827aSAxel Dörfler 				data++;
882397827aSAxel Dörfler 			}
892397827aSAxel Dörfler 			break;
902397827aSAxel Dörfler 		}
912397827aSAxel Dörfler 
922397827aSAxel Dörfler 		// special types
932397827aSAxel Dörfler 		case B_MESSENGER_TYPE:
942397827aSAxel Dörfler 		{
952397827aSAxel Dörfler 			BMessenger *messenger = (BMessenger *)_data;
962397827aSAxel Dörfler 			BMessenger *end = (BMessenger *)((addr_t)_data + length);
972397827aSAxel Dörfler 
982397827aSAxel Dörfler 			while (messenger < end) {
994b8aafeaSIngo Weinhold 				BMessenger::Private messengerPrivate(messenger);
1002397827aSAxel Dörfler 				// ToDo: if the additional fields change, this function has to be updated!
1014b8aafeaSIngo Weinhold 				messengerPrivate.SetTo(
1024b8aafeaSIngo Weinhold 					__swap_int32(messengerPrivate.Team()),
1034b8aafeaSIngo Weinhold 					__swap_int32(messengerPrivate.Port()),
1045232a619SAxel Dörfler 					__swap_int32(messengerPrivate.Token()));
1052397827aSAxel Dörfler 				messenger++;
1062397827aSAxel Dörfler 			}
1072397827aSAxel Dörfler 			break;
1082397827aSAxel Dörfler 		}
109a156e74aSMichael Lotz 
110a156e74aSMichael Lotz 		default:
111a156e74aSMichael Lotz 			// not swappable or recognized type!
112a156e74aSMichael Lotz 			return B_BAD_VALUE;
1132397827aSAxel Dörfler 	}
1142397827aSAxel Dörfler 
1152397827aSAxel Dörfler 	return B_OK;
1162397827aSAxel Dörfler }
1172397827aSAxel Dörfler 
1182397827aSAxel Dörfler 
11952a38012Sejakowatz bool
is_type_swapped(type_code type)12052a38012Sejakowatz is_type_swapped(type_code type)
12152a38012Sejakowatz {
1222397827aSAxel Dörfler 	// Returns true when the type is in the host's native format
1232397827aSAxel Dörfler 	// Looks like a pretty strange function to me :)
1242397827aSAxel Dörfler 
1252397827aSAxel Dörfler 	switch (type) {
1262397827aSAxel Dörfler 		case B_BOOL_TYPE:
1272397827aSAxel Dörfler 		case B_CHAR_TYPE:
1282397827aSAxel Dörfler 		case B_COLOR_8_BIT_TYPE:
1292397827aSAxel Dörfler 		case B_DOUBLE_TYPE:
1302397827aSAxel Dörfler 		case B_FLOAT_TYPE:
1312397827aSAxel Dörfler 		case B_GRAYSCALE_8_BIT_TYPE:
1322397827aSAxel Dörfler 		case B_INT64_TYPE:
1332397827aSAxel Dörfler 		case B_INT32_TYPE:
1342397827aSAxel Dörfler 		case B_INT16_TYPE:
1352397827aSAxel Dörfler 		case B_INT8_TYPE:
1362397827aSAxel Dörfler 		case B_MESSAGE_TYPE:
1372397827aSAxel Dörfler 		case B_MESSENGER_TYPE:
1382397827aSAxel Dörfler 		case B_MIME_TYPE:
1392397827aSAxel Dörfler 		case B_MONOCHROME_1_BIT_TYPE:
1402397827aSAxel Dörfler 		case B_OFF_T_TYPE:
1412397827aSAxel Dörfler 		case B_PATTERN_TYPE:
1422397827aSAxel Dörfler 		case B_POINTER_TYPE:
1432397827aSAxel Dörfler 		case B_POINT_TYPE:
1442397827aSAxel Dörfler 		case B_RECT_TYPE:
1452397827aSAxel Dörfler 		case B_REF_TYPE:
146*fe88ae51SJohn Scipione 		case B_NODE_REF_TYPE:
1472397827aSAxel Dörfler 		case B_RGB_32_BIT_TYPE:
1482397827aSAxel Dörfler 		case B_RGB_COLOR_TYPE:
1492397827aSAxel Dörfler 		case B_SIZE_T_TYPE:
1502397827aSAxel Dörfler 		case B_SSIZE_T_TYPE:
1512397827aSAxel Dörfler 		case B_STRING_TYPE:
1522397827aSAxel Dörfler 		case B_TIME_TYPE:
1532397827aSAxel Dörfler 		case B_UINT64_TYPE:
1542397827aSAxel Dörfler 		case B_UINT32_TYPE:
1552397827aSAxel Dörfler 		case B_UINT16_TYPE:
1562397827aSAxel Dörfler 		case B_UINT8_TYPE:
1572397827aSAxel Dörfler 			return true;
1582397827aSAxel Dörfler 	}
1592397827aSAxel Dörfler 
1602397827aSAxel Dörfler 	return false;
16152a38012Sejakowatz }
162