xref: /haiku/src/kits/support/ByteOrder.cpp (revision 5232a619c1cd894960e10a8b5cdf4d5828822388)
12397827aSAxel Dörfler /*
2*5232a619SAxel Dörfler  * Copyright 2004-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3*5232a619SAxel 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
132397827aSAxel Dörfler swap_data(type_code type, void *_data, size_t length, swap_action action)
1452a38012Sejakowatz {
1547550b1eSAxel Dörfler 	if (_data == NULL || length == 0)
1647550b1eSAxel Dörfler 		return B_BAD_VALUE;
1747550b1eSAxel Dörfler 
1847550b1eSAxel Dörfler 	switch (type) {
1947550b1eSAxel Dörfler 		// allowed types
2047550b1eSAxel Dörfler 		case B_INT16_TYPE:
2147550b1eSAxel Dörfler 		case B_UINT16_TYPE:
2247550b1eSAxel Dörfler 		case B_FLOAT_TYPE:
2347550b1eSAxel Dörfler 		case B_INT32_TYPE:
2447550b1eSAxel Dörfler 		case B_UINT32_TYPE:
2547550b1eSAxel Dörfler 		case B_SIZE_T_TYPE:
2647550b1eSAxel Dörfler 		case B_SSIZE_T_TYPE:
2747550b1eSAxel Dörfler 		case B_TIME_TYPE:
2847550b1eSAxel Dörfler 		case B_POINTER_TYPE:
2947550b1eSAxel Dörfler 		case B_RECT_TYPE:
3047550b1eSAxel Dörfler 		case B_POINT_TYPE:
3147550b1eSAxel Dörfler 		case B_DOUBLE_TYPE:
3247550b1eSAxel Dörfler 		case B_INT64_TYPE:
3347550b1eSAxel Dörfler 		case B_UINT64_TYPE:
3447550b1eSAxel Dörfler 		case B_OFF_T_TYPE:
3547550b1eSAxel Dörfler 		case B_MESSENGER_TYPE:
3647550b1eSAxel Dörfler 			break;
3747550b1eSAxel Dörfler 
3847550b1eSAxel Dörfler 		default:
3947550b1eSAxel Dörfler 			// not swappable or recognized type!
4047550b1eSAxel Dörfler 			return B_BAD_VALUE;
4147550b1eSAxel Dörfler 	}
4247550b1eSAxel Dörfler 
432397827aSAxel Dörfler 	// is there anything to do?
442397827aSAxel Dörfler #if B_HOST_IS_LENDIAN
452397827aSAxel Dörfler 	if (action == B_SWAP_HOST_TO_LENDIAN || action == B_SWAP_LENDIAN_TO_HOST)
462397827aSAxel Dörfler 		return B_OK;
472397827aSAxel Dörfler #else
482397827aSAxel Dörfler 	if (action == B_SWAP_HOST_TO_BENDIAN || action == B_SWAP_BENDIAN_TO_HOST)
492397827aSAxel Dörfler 		return B_OK;
502397827aSAxel Dörfler #endif
512397827aSAxel Dörfler 
522397827aSAxel Dörfler 	switch (type) {
532397827aSAxel Dörfler 		// 16 bit types
542397827aSAxel Dörfler 		case B_INT16_TYPE:
552397827aSAxel Dörfler 		case B_UINT16_TYPE:
562397827aSAxel Dörfler 		{
572397827aSAxel Dörfler 			uint16 *data = (uint16 *)_data;
582397827aSAxel Dörfler 			uint16 *end = (uint16 *)((addr_t)_data + length);
592397827aSAxel Dörfler 
602397827aSAxel Dörfler 			while (data < end) {
612397827aSAxel Dörfler 				*data = __swap_int16(*data);
622397827aSAxel Dörfler 				data++;
632397827aSAxel Dörfler 			}
642397827aSAxel Dörfler 			break;
6552a38012Sejakowatz 		}
6652a38012Sejakowatz 
672397827aSAxel Dörfler 		// 32 bit types
682397827aSAxel Dörfler 		case B_FLOAT_TYPE:
692397827aSAxel Dörfler 		case B_INT32_TYPE:
702397827aSAxel Dörfler 		case B_UINT32_TYPE:
712397827aSAxel Dörfler 		case B_SIZE_T_TYPE:
722397827aSAxel Dörfler 		case B_SSIZE_T_TYPE:
732397827aSAxel Dörfler 		case B_TIME_TYPE:
742397827aSAxel Dörfler 		case B_POINTER_TYPE:
752397827aSAxel Dörfler 		case B_RECT_TYPE:
762397827aSAxel Dörfler 		case B_POINT_TYPE:
772397827aSAxel Dörfler 		{
782397827aSAxel Dörfler 			// ToDo: some of these types may not be 32-bit on 64-bit platforms!
792397827aSAxel Dörfler 			uint32 *data = (uint32 *)_data;
802397827aSAxel Dörfler 			uint32 *end = (uint32 *)((addr_t)_data + length);
812397827aSAxel Dörfler 
822397827aSAxel Dörfler 			while (data < end) {
832397827aSAxel Dörfler 				*data = __swap_int32(*data);
842397827aSAxel Dörfler 				data++;
852397827aSAxel Dörfler 			}
862397827aSAxel Dörfler 			break;
872397827aSAxel Dörfler 		}
882397827aSAxel Dörfler 
892397827aSAxel Dörfler 		// 64 bit types
902397827aSAxel Dörfler 		case B_DOUBLE_TYPE:
912397827aSAxel Dörfler 		case B_INT64_TYPE:
922397827aSAxel Dörfler 		case B_UINT64_TYPE:
932397827aSAxel Dörfler 		case B_OFF_T_TYPE:
942397827aSAxel Dörfler 		{
952397827aSAxel Dörfler 			uint64 *data = (uint64 *)_data;
962397827aSAxel Dörfler 			uint64 *end = (uint64 *)((addr_t)_data + length);
972397827aSAxel Dörfler 
982397827aSAxel Dörfler 			while (data < end) {
992397827aSAxel Dörfler 				*data = __swap_int64(*data);
1002397827aSAxel Dörfler 				data++;
1012397827aSAxel Dörfler 			}
1022397827aSAxel Dörfler 			break;
1032397827aSAxel Dörfler 		}
1042397827aSAxel Dörfler 
1052397827aSAxel Dörfler 		// special types
1062397827aSAxel Dörfler 		case B_MESSENGER_TYPE:
1072397827aSAxel Dörfler 		{
1082397827aSAxel Dörfler 			BMessenger *messenger = (BMessenger *)_data;
1092397827aSAxel Dörfler 			BMessenger *end = (BMessenger *)((addr_t)_data + length);
1102397827aSAxel Dörfler 
1112397827aSAxel Dörfler 			while (messenger < end) {
1124b8aafeaSIngo Weinhold 				BMessenger::Private messengerPrivate(messenger);
1132397827aSAxel Dörfler 				// ToDo: if the additional fields change, this function has to be updated!
1144b8aafeaSIngo Weinhold 				messengerPrivate.SetTo(
1154b8aafeaSIngo Weinhold 					__swap_int32(messengerPrivate.Team()),
1164b8aafeaSIngo Weinhold 					__swap_int32(messengerPrivate.Port()),
117*5232a619SAxel Dörfler 					__swap_int32(messengerPrivate.Token()));
1182397827aSAxel Dörfler 				messenger++;
1192397827aSAxel Dörfler 			}
1202397827aSAxel Dörfler 			break;
1212397827aSAxel Dörfler 		}
1222397827aSAxel Dörfler 	}
1232397827aSAxel Dörfler 
1242397827aSAxel Dörfler 	return B_OK;
1252397827aSAxel Dörfler }
1262397827aSAxel Dörfler 
1272397827aSAxel Dörfler 
12852a38012Sejakowatz bool
12952a38012Sejakowatz is_type_swapped(type_code type)
13052a38012Sejakowatz {
1312397827aSAxel Dörfler 	// Returns true when the type is in the host's native format
1322397827aSAxel Dörfler 	// Looks like a pretty strange function to me :)
1332397827aSAxel Dörfler 
1342397827aSAxel Dörfler 	switch (type) {
1352397827aSAxel Dörfler 		case B_ANY_TYPE:
1362397827aSAxel Dörfler 		case B_BOOL_TYPE:
1372397827aSAxel Dörfler 		case B_CHAR_TYPE:
1382397827aSAxel Dörfler 		case B_COLOR_8_BIT_TYPE:
1392397827aSAxel Dörfler 		case B_DOUBLE_TYPE:
1402397827aSAxel Dörfler 		case B_FLOAT_TYPE:
1412397827aSAxel Dörfler 		case B_GRAYSCALE_8_BIT_TYPE:
1422397827aSAxel Dörfler 		case B_INT64_TYPE:
1432397827aSAxel Dörfler 		case B_INT32_TYPE:
1442397827aSAxel Dörfler 		case B_INT16_TYPE:
1452397827aSAxel Dörfler 		case B_INT8_TYPE:
1462397827aSAxel Dörfler 		case B_MESSAGE_TYPE:
1472397827aSAxel Dörfler 		case B_MESSENGER_TYPE:
1482397827aSAxel Dörfler 		case B_MIME_TYPE:
1492397827aSAxel Dörfler 		case B_MONOCHROME_1_BIT_TYPE:
1502397827aSAxel Dörfler 		case B_OBJECT_TYPE:
1512397827aSAxel Dörfler 		case B_OFF_T_TYPE:
1522397827aSAxel Dörfler 		case B_PATTERN_TYPE:
1532397827aSAxel Dörfler 		case B_POINTER_TYPE:
1542397827aSAxel Dörfler 		case B_POINT_TYPE:
1552397827aSAxel Dörfler 		case B_RAW_TYPE:
1562397827aSAxel Dörfler 		case B_RECT_TYPE:
1572397827aSAxel Dörfler 		case B_REF_TYPE:
1582397827aSAxel Dörfler 		case B_RGB_32_BIT_TYPE:
1592397827aSAxel Dörfler 		case B_RGB_COLOR_TYPE:
1602397827aSAxel Dörfler 		case B_SIZE_T_TYPE:
1612397827aSAxel Dörfler 		case B_SSIZE_T_TYPE:
1622397827aSAxel Dörfler 		case B_STRING_TYPE:
1632397827aSAxel Dörfler 		case B_TIME_TYPE:
1642397827aSAxel Dörfler 		case B_UINT64_TYPE:
1652397827aSAxel Dörfler 		case B_UINT32_TYPE:
1662397827aSAxel Dörfler 		case B_UINT16_TYPE:
1672397827aSAxel Dörfler 		case B_UINT8_TYPE:
1682397827aSAxel Dörfler 		case B_MEDIA_PARAMETER_TYPE:
1692397827aSAxel Dörfler 		case B_MEDIA_PARAMETER_WEB_TYPE:
1702397827aSAxel Dörfler 		case B_MEDIA_PARAMETER_GROUP_TYPE:
1712397827aSAxel Dörfler 			return true;
1722397827aSAxel Dörfler 	}
1732397827aSAxel Dörfler 
1742397827aSAxel Dörfler 	return false;
17552a38012Sejakowatz }
17652a38012Sejakowatz 
177