Skip to content

Commit bbc109a

Browse files
committed
Build on big-endian systems again.
On big endian, fn_le32() is actually a function, not an empty preprocessor macro, so we can't take the address of its return value when doing the C equivalent of reinterpret_cast. Signed-off-by: Drew Fisher <drew.m.fisher@gmail.com>
1 parent ac6721a commit bbc109a

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

src/cameras.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -910,10 +910,15 @@ static int freenect_fetch_zero_plane_info(freenect_device *dev)
910910
}
911911

912912
memcpy(&(dev->registration.zero_plane_info), reply + 94, sizeof(dev->registration.zero_plane_info));
913-
dev->registration.zero_plane_info.dcmos_emitter_dist = *((float*)(&fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.dcmos_emitter_dist)))));
914-
dev->registration.zero_plane_info.dcmos_rcmos_dist = *((float*)(&fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.dcmos_rcmos_dist)))));
915-
dev->registration.zero_plane_info.reference_distance = *((float*)(&fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.reference_distance)))));
916-
dev->registration.zero_plane_info.reference_pixel_size = *((float*)(&fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.reference_pixel_size)))));
913+
uint32_t temp;
914+
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.dcmos_emitter_dist)));
915+
dev->registration.zero_plane_info.dcmos_emitter_dist = *((float*)(&temp));
916+
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.dcmos_rcmos_dist)));
917+
dev->registration.zero_plane_info.dcmos_rcmos_dist = *((float*)(&temp));
918+
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.reference_distance)));
919+
dev->registration.zero_plane_info.reference_distance = *((float*)(&temp));
920+
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.reference_pixel_size)));
921+
dev->registration.zero_plane_info.reference_pixel_size = *((float*)(&temp));
917922

918923
// WTF is all this data? it's way bigger than sizeof(XnFixedParams)...
919924
FN_SPEW("dcmos_emitter_distance: %f\n", dev->registration.zero_plane_info.dcmos_emitter_dist);

src/freenect_internal.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,16 @@ static inline uint32_t fn_le32(uint32_t d)
8989
static inline int16_t fn_le16s(int16_t s)
9090
{
9191
// reinterpret cast to unsigned, use the normal fn_le16, and then reinterpret cast back
92-
return *((int16_t*)(&fn_le16(*((uint16_t*)(&s)))));
92+
uint16_t temp = (*(uint16_t*)(&s));
93+
temp = fn_le16(temp);
94+
return *((int16_t*)(&temp));
9395
}
9496
static inline int32_t fn_le32s(int32_t s)
9597
{
9698
// reinterpret cast to unsigned, use the normal fn_le32, and then reinterpret cast back
97-
return *((int32_t*)(&fn_le32(*((uint32_t*)(&s)))));
99+
uint32_t temp = (*(uint32_t*)(&s));
100+
temp = fn_le32(temp);
101+
return *((int32_t*)(&temp));
98102
}
99103
#else
100104
#define fn_le16(x) (x)

0 commit comments

Comments
 (0)