X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fio%2Flowlevel.cxx;h=d41bc801a03f2669f9442d3eb2446f3d237bc13f;hb=8ddf922005fb0fea39964fb7d6ad6fae9f27cbd2;hp=fd90c717b3963047625d0148df94b76ee720fc47;hpb=ac9716f193d91790f6280ee747e4c691fa6664e9;p=simgear.git diff --git a/simgear/io/lowlevel.cxx b/simgear/io/lowlevel.cxx index fd90c717..d41bc801 100644 --- a/simgear/io/lowlevel.cxx +++ b/simgear/io/lowlevel.cxx @@ -18,11 +18,15 @@ // // 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 +#endif + #include // 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 ; } }