@@ -550,37 +550,53 @@ #else # define OF_BSWAP16(i) OF_BSWAP16_CONST(i) # define OF_BSWAP32(i) OF_BSWAP32_CONST(i) # define OF_BSWAP64(i) OF_BSWAP64_CONST(i) #endif + +static OF_INLINE uint32_t +OF_FLOAT_TO_INT_RAW(float f) +{ + uint32_t ret; + memcpy(&ret, &f, 4); + return ret; +} + +static OF_INLINE float +OF_INT_TO_FLOAT_RAW(uint32_t u32) +{ + float ret; + memcpy(&ret, &u32, 4); + return ret; +} + +static OF_INLINE uint64_t +OF_DOUBLE_TO_INT_RAW(double d) +{ + uint64_t ret; + memcpy(&ret, &d, 8); + return ret; +} + +static OF_INLINE double +OF_INT_TO_DOUBLE_RAW(uint64_t u64) +{ + double ret; + memcpy(&ret, &u64, 8); + return ret; +} static OF_INLINE float OF_CONST_FUNC OF_BSWAP_FLOAT(float f) { - union { - float f; - uint32_t i; - } u; - - u.f = f; - u.i = OF_BSWAP32(u.i); - - return u.f; + return OF_INT_TO_FLOAT_RAW(OF_BSWAP32(OF_FLOAT_TO_INT_RAW(f))); } static OF_INLINE double OF_CONST_FUNC OF_BSWAP_DOUBLE(double d) { - union { - double d; - uint64_t i; - } u; - - u.d = d; - u.i = OF_BSWAP64(u.i); - - return u.d; + return OF_INT_TO_DOUBLE_RAW(OF_BSWAP64(OF_DOUBLE_TO_INT_RAW(d))); } #ifdef OF_BIG_ENDIAN # define OF_BSWAP16_IF_BE(i) OF_BSWAP16(i) # define OF_BSWAP32_IF_BE(i) OF_BSWAP32(i)