]> 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 982cf06f221899aef721aaad14f5c8f80a2ecfdf..d41bc801a03f2669f9442d3eb2446f3d237bc13f 100644 (file)
 //
 // 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" 
@@ -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( (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 ;
     }
 }
@@ -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 ;
     }
 }
@@ -103,7 +115,7 @@ void sgReadUInt ( gzFile fd, unsigned int *var )
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned int*)var);
+        sgEndianSwap( (uint32_t *)var);
     }
 }
 
@@ -111,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) )
@@ -127,7 +139,7 @@ void sgReadInt ( gzFile fd, int *var )
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned int*)var);
+        sgEndianSwap( (uint32_t *)var);
     }
 }
 
@@ -135,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 ;
@@ -149,7 +161,7 @@ void sgReadLong ( gzFile fd, int32_t *var )
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned int*)var);
+        sgEndianSwap( (uint32_t *)var);
     }
 }
 
@@ -157,7 +169,7 @@ void sgReadLong ( gzFile fd, int32_t *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(int32_t) )
          != sizeof(int32_t) )
@@ -173,7 +185,7 @@ void sgReadLongLong ( gzFile fd, int64_t *var )
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (uint64_t*)var);
+        sgEndianSwap( (uint64_t *)var);
     }
 }
 
@@ -181,7 +193,7 @@ void sgReadLongLong ( gzFile fd, int64_t *var )
 void sgWriteLongLong ( gzFile fd, const int64_t var )
 {
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (uint64_t*)&var);
+        sgEndianSwap( (uint64_t *)&var);
     }
     if ( gzwrite ( fd, (void *)(&var), sizeof(int64_t) )
          != sizeof(int64_t) )
@@ -197,7 +209,7 @@ void sgReadUShort ( gzFile fd, unsigned short *var )
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned short int*)var);
+        sgEndianSwap( (uint16_t *)var);
     }
 }
 
@@ -205,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) )
@@ -221,7 +233,7 @@ void sgReadShort ( gzFile fd, short *var )
         read_error = true ;
     }
     if ( sgIsBigEndian() ) {
-        sgEndianSwap( (unsigned short int*)var);
+        sgEndianSwap( (uint16_t *)var);
     }
 }
 
@@ -229,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 ;
@@ -244,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++);
         }
     }
 }
@@ -257,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;
     }
@@ -275,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_t*)var++);
+            sgEndianSwap( (uint64_t *)var++);
         }
     }
 }
@@ -288,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_t*)ptr++);
+            sgEndianSwap( (uint64_t *)ptr++);
         }
         var = swab;
     }
@@ -325,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++);
         }
     }
 }
@@ -338,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;
     }
@@ -360,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++);
         }
     }
 }
@@ -373,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;
     }
@@ -394,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++);
         }
     }
 }
@@ -407,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;
     }
@@ -429,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++);
         }
     }
 }
@@ -442,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;
     }