]> git.mxchange.org Git - simgear.git/blobdiff - simgear/io/lowlevel.cxx
Unit test for SGBinObj, and fix a bug in large-indice handling the test revealed.
[simgear.git] / simgear / io / lowlevel.cxx
index 19909b7d5e9d2d2f07f329e846f54e30427728ba..d41bc801a03f2669f9442d3eb2446f3d237bc13f 100644 (file)
 // $Id$
 
 
+#ifdef HAVE_CONFIG_H
+#  include <simgear_config.h>
+#endif
+
 #include <string.h>            // for memcpy()
 
 #include "lowlevel.hxx" 
@@ -55,21 +59,25 @@ void sgWriteChar ( gzFile fd, const char var )
 
 void sgReadFloat ( gzFile fd, float *var )
 {
-    if ( gzread ( fd, var, sizeof(float) ) != sizeof(float) ) {
+    union { float v; uint32_t u; } buf;
+    if ( gzread ( fd, &buf.u, sizeof(float) ) != sizeof(float) ) {
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (uint32_t *)var);
+        sgEndianSwap( &buf.u );
     }
+    *var = buf.v;
 }
 
 
 void sgWriteFloat ( gzFile fd, const float var )
 {
+    union { float v; uint32_t u; } buf;
+    buf.v = var;
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (uint32_t *)&var);
+        sgEndianSwap( &buf.u );
     }
-    if ( gzwrite ( fd, (void *)(&var), sizeof(float) ) != sizeof(float) ) {
+    if ( gzwrite ( fd, (void *)(&buf.u), sizeof(float) ) != sizeof(float) ) {
         write_error = true ;
     }
 }
@@ -77,21 +85,25 @@ void sgWriteFloat ( gzFile fd, const float var )
 
 void sgReadDouble ( gzFile fd, double *var )
 {
-    if ( gzread ( fd, var, sizeof(double) ) != sizeof(double) ) {
+    union { double v; uint64_t u; } buf;
+    if ( gzread ( fd, &buf.u, sizeof(double) ) != sizeof(double) ) {
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (uint64_t *)var);
+        sgEndianSwap( &buf.u );
     }
+    *var = buf.v;
 }
 
 
 void sgWriteDouble ( gzFile fd, const double var )
 {
+    union { double v; uint64_t u; } buf;
+    buf.v = var;
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (uint64_t *)&var);
+        sgEndianSwap( &buf.u );
     }
-    if ( gzwrite ( fd, (void *)(&var), sizeof(double) ) != sizeof(double) ) {
+    if ( gzwrite ( fd, (void *)(&buf.u), sizeof(double) ) != sizeof(double) ) {
         write_error = true ;
     }
 }