Main Page   Class Hierarchy   Compound List   File List   Compound Members  

ByteOrder.h

00001 //
00002 // ByteOrder.h
00003 //
00004 // Copyright (c) 2001 Virtual Terrain Project
00005 // Free for all uses, see license.txt for details.
00006 //
00007 
00008 #ifndef BYTEORDERH
00009 #define BYTEORDERH
00010 
00011 #include <stdio.h>
00012 #include <assert.h>
00013 
00014 enum ByteOrder 
00015 {
00016     BO_LITTLE_ENDIAN,                   /*  Intel  */
00017     BO_BIG_ENDIAN,                      /*  Motorola, MIPS, Sun, etc.  */
00018     BO_MACHINE,
00019   BO_LE  = BO_LITTLE_ENDIAN,
00020   BO_BE  = BO_BIG_ENDIAN,
00021   BO_CPU = BO_MACHINE
00022 };
00023 
00024 enum DataType 
00025 {
00026     DT_SHORT, DT_INT, DT_LONG, DT_FLOAT, DT_DOUBLE
00027 };
00028 
00032 inline ByteOrder NativeByteOrder( void ) 
00033 {
00034     static int iByteOrderTest = 0x1;
00035 
00036     if ( *((char *) &iByteOrderTest) == 0x1 )
00037         return BO_LITTLE_ENDIAN;
00038     else
00039         return BO_BIG_ENDIAN;
00040 }
00041 
00042 /*
00043  * Various macros that always swap byte order.  Expanded in-line for
00044  *   maximum speed when processing arrays.
00045  * 
00046  */
00047 inline short SwapShort( short data )
00048 {
00049     assert( sizeof(short) == 2 );
00050     return (data << 8) | (data >> 8);
00051 }
00052 inline long SwapLong( long data )
00053 {
00054     assert( sizeof(long) == 4 );
00055     return ( data << 24 )                 | (( data << 8 ) & 0x00FF0000 ) |
00056            (( data >> 24 ) & 0x000000FF ) | (( data >> 8 ) & 0x0000FF00 );
00057 }
00058 inline int SwapInt( int data )
00059 {
00060     assert( sizeof(int) == sizeof(short) || sizeof(int) == sizeof(long) );
00061     if ( sizeof(int) == sizeof(short) )
00062         return SwapShort( (short)data );
00063     else
00064         return SwapLong( (long)data );
00065 }
00066 inline float SwapFloat( float data )
00067 {
00068     assert( sizeof(float) == sizeof(long) );
00069     long s = SwapLong( *((long *)&data) );
00070     return *((float *)&s);
00071 }
00072 inline double SwapDouble( double data )
00073 {
00074     assert( sizeof(double) == 2*sizeof(long) );
00075     char *p  = (char *)&data;
00076     long  l1 = *((long *)( p + 0            )), 
00077           l2 = *((long *)( p + sizeof(long) )); 
00078     *((long *)( p + 0            )) = SwapLong( l2 );
00079     *((long *)( p + sizeof(long) )) = SwapLong( l1 );
00080     return data;
00081 }
00082 
00091 inline short SwapBytes( short     data, 
00092                         ByteOrder data_order,   
00093                         ByteOrder desired_order )
00094 {
00095     if ( data_order    == BO_MACHINE ) data_order    = NativeByteOrder();
00096     if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
00097     if ( data_order == desired_order ) 
00098         return data;
00099     else
00100         return SwapShort( data );
00101 }
00102 
00103 inline long SwapBytes( long      data, 
00104                        ByteOrder data_order,   
00105                        ByteOrder desired_order )
00106 {
00107     if ( data_order    == BO_MACHINE ) data_order    = NativeByteOrder();
00108     if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
00109     if ( data_order == desired_order )
00110         return data;
00111     else
00112         return SwapLong( data );
00113 }
00114 
00115 inline int SwapBytes( int        data, 
00116                       ByteOrder data_order,   
00117                       ByteOrder desired_order )
00118 {
00119     if ( data_order    == BO_MACHINE ) data_order    = NativeByteOrder();
00120     if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
00121     if ( data_order == desired_order )
00122         return data;
00123     else
00124         return SwapInt( data );
00125 }
00126 
00127 inline float SwapBytes( float     data, 
00128                         ByteOrder data_order,   
00129                         ByteOrder desired_order )
00130 {
00131     if ( data_order    == BO_MACHINE ) data_order    = NativeByteOrder();
00132     if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
00133     if ( data_order == desired_order )
00134         return data;
00135     else
00136         return SwapFloat( data );
00137 }
00138 
00139 inline double SwapBytes( double    data, 
00140                          ByteOrder data_order,   
00141                          ByteOrder desired_order )
00142 {
00143     if ( data_order    == BO_MACHINE ) data_order    = NativeByteOrder();
00144     if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
00145     if ( data_order == desired_order )
00146         return data;
00147     else
00148         return SwapDouble( data );
00149 }
00150 
00163 void SwapMemBytes( void *items, DataType type, size_t count,
00164                    ByteOrder file_order, ByteOrder desired_order );
00165 
00179 size_t FRead( void *ptr, DataType type, size_t nitems, FILE *stream,
00180               ByteOrder file_order, ByteOrder desired_order = BO_MACHINE );
00181 
00182 #endif

Generated at Fri Aug 17 14:40:42 2001 for vtdata library by doxygen1.2.4 written by Dimitri van Heesch, © 1997-2000