]> 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 0015bff3b5d745f844eff1a9ee6b6556c7831f03..d41bc801a03f2669f9442d3eb2446f3d237bc13f 100644 (file)
@@ -4,7 +4,7 @@
 // Shamelessly adapted from plib (plib.sourceforge.net) January 2001
 //
 // Original version Copyright (C) 2000  the plib team
-// Local changes Copyright (C) 2000  Curtis L. Olson  - curt@flightgear.org
+// Local changes Copyright (C) 2000  Curtis L. Olson  - http://www.flightgear.org/~curt
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
 //
 // You should have received a copy of the GNU General Public License
 // along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
 
+#ifdef HAVE_CONFIG_H
+#  include <simgear_config.h>
+#endif
+
+#include <string.h>            // for memcpy()
+
 #include "lowlevel.hxx" 
 
 
@@ -53,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( (unsigned int*)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( (unsigned int*)&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 ;
     }
 }
@@ -75,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*)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*)&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 ;
     }
 }
@@ -101,7 +115,7 @@ void sgReadUInt ( gzFile fd, unsigned int *var )
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned int*)var);
+        sgEndianSwap( (uint32_t *)var);
     }
 }
 
@@ -109,7 +123,7 @@ void sgReadUInt ( gzFile fd, unsigned int *var )
 void sgWriteUInt ( gzFile fd, const unsigned int var )
 {
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned int*)&var);
+        sgEndianSwap( (uint32_t *)&var);
     }
     if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned int) )
         != sizeof(unsigned int) )
@@ -125,7 +139,7 @@ void sgReadInt ( gzFile fd, int *var )
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned int*)var);
+        sgEndianSwap( (uint32_t *)var);
     }
 }
 
@@ -133,7 +147,7 @@ void sgReadInt ( gzFile fd, int *var )
 void sgWriteInt ( gzFile fd, const int var )
 {
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned int*)&var);
+        sgEndianSwap( (uint32_t *)&var);
     }
     if ( gzwrite ( fd, (void *)(&var), sizeof(int) ) != sizeof(int) ) {
         write_error = true ;
@@ -141,48 +155,48 @@ void sgWriteInt ( gzFile fd, const int var )
 }
 
 
-void sgReadLong ( gzFile fd, long int *var )
+void sgReadLong ( gzFile fd, int32_t *var )
 {
-    if ( gzread ( fd, var, sizeof(long int) ) != sizeof(long int) ) {
+    if ( gzread ( fd, var, sizeof(int32_t) ) != sizeof(int32_t) ) {
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned int*)var);
+        sgEndianSwap( (uint32_t *)var);
     }
 }
 
 
-void sgWriteLong ( gzFile fd, const long int var )
+void sgWriteLong ( gzFile fd, const int32_t var )
 {
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned int*)&var);
+        sgEndianSwap( (uint32_t *)&var);
     }
-    if ( gzwrite ( fd, (void *)(&var), sizeof(long int) )
-         != sizeof(long int) )
+    if ( gzwrite ( fd, (void *)(&var), sizeof(int32_t) )
+         != sizeof(int32_t) )
     {
         write_error = true ;
     }
 }
 
 
-void sgReadLongLong ( gzFile fd, int64 *var )
+void sgReadLongLong ( gzFile fd, int64_t *var )
 {
-    if ( gzread ( fd, var, sizeof(int64) ) != sizeof(int64) ) {
+    if ( gzread ( fd, var, sizeof(int64_t) ) != sizeof(int64_t) ) {
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (uint64*)var);
+        sgEndianSwap( (uint64_t *)var);
     }
 }
 
 
-void sgWriteLongLong ( gzFile fd, const int64 var )
+void sgWriteLongLong ( gzFile fd, const int64_t var )
 {
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (uint64*)&var);
+        sgEndianSwap( (uint64_t *)&var);
     }
-    if ( gzwrite ( fd, (void *)(&var), sizeof(int64) )
-         != sizeof(int64) )
+    if ( gzwrite ( fd, (void *)(&var), sizeof(int64_t) )
+         != sizeof(int64_t) )
     {
         write_error = true ;
     }
@@ -195,7 +209,7 @@ void sgReadUShort ( gzFile fd, unsigned short *var )
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned short int*)var);
+        sgEndianSwap( (uint16_t *)var);
     }
 }
 
@@ -203,7 +217,7 @@ void sgReadUShort ( gzFile fd, unsigned short *var )
 void sgWriteUShort ( gzFile fd, const unsigned short var )
 {
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned short*)&var);
+        sgEndianSwap( (uint16_t *)&var);
     }
     if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned short) )
         != sizeof(unsigned short) )
@@ -219,7 +233,7 @@ void sgReadShort ( gzFile fd, short *var )
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned short int*)var);
+        sgEndianSwap( (uint16_t *)var);
     }
 }
 
@@ -227,7 +241,7 @@ void sgReadShort ( gzFile fd, short *var )
 void sgWriteShort ( gzFile fd, const short var )
 {
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned short*)&var);
+        sgEndianSwap( (uint16_t *)&var);
     }
     if ( gzwrite ( fd, (void *)(&var), sizeof(short) ) != sizeof(short) ) {
         write_error = true ;
@@ -242,7 +256,7 @@ void sgReadFloat ( gzFile fd, const unsigned int n, float *var )
     }
     if ( sgIsBigEndian() ) {
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (unsigned int*)var++);
+            sgEndianSwap( (uint32_t *)var++);
         }
     }
 }
@@ -255,7 +269,7 @@ void sgWriteFloat ( gzFile fd, const unsigned int n, const float *var )
         float *ptr = swab;
         memcpy( swab, var, sizeof(float) * n );
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (unsigned int*)ptr++);
+            sgEndianSwap( (uint32_t *)ptr++);
         }
         var = swab;
     }
@@ -273,7 +287,7 @@ void sgReadDouble ( gzFile fd, const unsigned int n, double *var )
     }
     if ( sgIsBigEndian() ) {
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (uint64*)var++);
+            sgEndianSwap( (uint64_t *)var++);
         }
     }
 }
@@ -286,7 +300,7 @@ void sgWriteDouble ( gzFile fd, const unsigned int n, const double *var )
         double *ptr = swab;
         memcpy( swab, var, sizeof(double) * n );
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (uint64*)ptr++);
+            sgEndianSwap( (uint64_t *)ptr++);
         }
         var = swab;
     }
@@ -323,7 +337,7 @@ void sgReadUShort ( gzFile fd, const unsigned int n, unsigned short *var )
     }
     if ( sgIsBigEndian() ) {
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (unsigned short int*)var++);
+            sgEndianSwap( (uint16_t *)var++);
         }
     }
 }
@@ -336,7 +350,7 @@ void sgWriteUShort ( gzFile fd, const unsigned int n, const unsigned short *var
         unsigned short *ptr = swab;
         memcpy( swab, var, sizeof(unsigned short) * n );
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (unsigned short*)ptr++);
+            sgEndianSwap( (uint16_t *)ptr++);
         }
         var = swab;
     }
@@ -358,7 +372,7 @@ void sgReadShort ( gzFile fd, const unsigned int n, short *var )
     }
     if ( sgIsBigEndian() ) {
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (unsigned short int*)var++);
+            sgEndianSwap( (uint16_t *)var++);
         }
     }
 }
@@ -371,7 +385,7 @@ void sgWriteShort ( gzFile fd, const unsigned int n, const short *var )
         short *ptr = swab;
         memcpy( swab, var, sizeof(short) * n );
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (unsigned short*)ptr++);
+            sgEndianSwap( (uint16_t *)ptr++);
         }
         var = swab;
     }
@@ -392,7 +406,7 @@ void sgReadUInt ( gzFile fd, const unsigned int n, unsigned int *var )
     }
     if ( sgIsBigEndian() ) {
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (unsigned int*)var++);
+            sgEndianSwap( (uint32_t *)var++);
         }
     }
 }
@@ -405,7 +419,7 @@ void sgWriteUInt ( gzFile fd, const unsigned int n, const unsigned int *var )
         unsigned int *ptr = swab;
         memcpy( swab, var, sizeof(unsigned int) * n );
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (unsigned int*)ptr++);
+            sgEndianSwap( (uint32_t *)ptr++);
         }
         var = swab;
     }
@@ -427,7 +441,7 @@ void sgReadInt ( gzFile fd, const unsigned int n, int *var )
     }
     if ( sgIsBigEndian() ) {
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (unsigned int*)var++);
+            sgEndianSwap( (uint32_t *)var++);
         }
     }
 }
@@ -440,7 +454,7 @@ void sgWriteInt ( gzFile fd, const unsigned int n, const int *var )
         int *ptr = swab;
         memcpy( swab, var, sizeof(int) * n );
         for ( unsigned int i = 0; i < n; ++i ) {
-            sgEndianSwap( (unsigned int*)ptr++);
+            sgEndianSwap( (uint32_t *)ptr++);
         }
         var = swab;
     }