From a925bea47745320bfc6e092ed4e4e07db7155470 Mon Sep 17 00:00:00 2001 From: Dennis Heimbigner <dmh@unidata.ucar.edu> Date: Fri, 16 Mar 2012 22:32:54 +0000 Subject: [PATCH] missing big-endian code --- oc/xxdr.c | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/oc/xxdr.c b/oc/xxdr.c index 8bee1322c..22c276d12 100644 --- a/oc/xxdr.c +++ b/oc/xxdr.c @@ -418,7 +418,7 @@ xxdr_float(XXDR* xdr, float* fp) return status; } -/* get a double from underlying stream*/ +/* Get a double from underlying stream */ int xxdr_double(XXDR* xdr, double* dp) { @@ -436,34 +436,19 @@ xxdr_double(XXDR* xdr, double* dp) void xxdrntohdouble(char* c8, double* dp) { - union { - char c[2*XDRUNIT]; - double d; - }u; - char* src = (char*)&u.d; - char dst[8]; - - memcpy(u.c,c8,2*XDRUNIT); - if(xxdr_big_endian) { - dst[0] = src[3]; - dst[1] = src[2]; - dst[2] = src[1]; - dst[3] = src[0]; - dst[4] = src[7]; - dst[5] = src[6]; - dst[6] = src[5]; - dst[7] = src[4]; - } else { - dst[0] = src[7]; - dst[1] = src[6]; - dst[2] = src[5]; - dst[3] = src[4]; - dst[4] = src[3]; - dst[5] = src[2]; - dst[6] = src[1]; - dst[7] = src[0]; + unsigned int ii[2]; + memcpy(ii,c8,2*XDRUNIT); + if(!xxdr_big_endian) { + unsigned int tmp; + /* reverse byte order */ + swapinline32(&ii[0]); + swapinline32(&ii[1]); + /* interchange ii[0] and ii[1] */ + tmp = ii[0]; + ii[0] = ii[1]; + ii[1] = tmp; } - if(dp) *dp = *(double*)dst; + if(dp) *dp = *(double*)ii; } void @@ -474,5 +459,4 @@ xxdr_init() char *byte = (char *)&testint; xxdr_big_endian = (byte[0] == 0 ? 1 : 0); xxdr_network_order = xxdr_big_endian; - }