Umasoft
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
ByteOrder.h
1 //
2 // ByteOrder.h
3 //
4 // Copyright (c) 2001 Virtual Terrain Project
5 // Free for all uses, see license.txt for details.
6 //
7 
8 #ifndef BYTEORDERH
9 #define BYTEORDERH
10 
11 #include <stdio.h>
12 #include <assert.h>
13 #include <zlib.h>
14 
15 enum ByteOrder
16 {
17  BO_LITTLE_ENDIAN, /* Intel */
18  BO_BIG_ENDIAN, /* Motorola, MIPS, Sun, etc. */
19  BO_MACHINE,
20  BO_LE = BO_LITTLE_ENDIAN,
21  BO_BE = BO_BIG_ENDIAN,
22  BO_CPU = BO_MACHINE
23 };
24 
25 enum DataType
26 {
27  DT_SHORT, DT_INT, DT_LONG, DT_FLOAT, DT_DOUBLE
28 };
29 
33 inline ByteOrder NativeByteOrder( void )
34 {
35  static int iByteOrderTest = 0x1;
36 
37  if ( *((char *) &iByteOrderTest) == 0x1 )
38  return BO_LITTLE_ENDIAN;
39  else
40  return BO_BIG_ENDIAN;
41 }
42 
43 /*
44  * Various macros that always swap byte order. Expanded in-line for
45  * maximum speed when processing arrays.
46  *
47  */
48 inline short SwapShort( short data )
49 {
50  return (data << 8) | ((data >> 8) & 0x00ff);
51 }
52 inline long SwapLong( long data )
53 {
54  assert( sizeof(long) == 4 );
55  return ( data << 24 ) | (( data << 8 ) & 0x00FF0000 ) |
56  (( data >> 24 ) & 0x000000FF ) | (( data >> 8 ) & 0x0000FF00 );
57 }
58 inline int SwapInt( int data )
59 {
60  // we don't need to support any ancient compilers where int==short
61 // assert( sizeof(int) == sizeof(short) || sizeof(int) == sizeof(long) );
62 // if ( sizeof(int) == sizeof(short) )
63 // return SwapShort( (short)data );
64 // else
65  return SwapLong( (long)data );
66 }
67 inline float SwapFloat( float data )
68 {
69  assert( sizeof(float) == sizeof(long) );
70  long s = SwapLong( *((long *)&data) );
71  return *((float *)&s);
72 }
73 inline double SwapDouble( double data )
74 {
75  assert( sizeof(double) == 2*sizeof(long) );
76  char *p = (char *)&data;
77  long l1 = *((long *)( p + 0 )),
78  l2 = *((long *)( p + sizeof(long) ));
79  *((long *)( p + 0 )) = SwapLong( l2 );
80  *((long *)( p + sizeof(long) )) = SwapLong( l1 );
81  return data;
82 }
83 
92 inline short SwapBytes( short data,
93  ByteOrder data_order,
94  ByteOrder desired_order )
95 {
96  if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
97  if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
98  if ( data_order == desired_order )
99  return data;
100  else
101  return SwapShort( data );
102 }
103 
104 inline long SwapBytes( long data,
105  ByteOrder data_order,
106  ByteOrder desired_order )
107 {
108  if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
109  if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
110  if ( data_order == desired_order )
111  return data;
112  else
113  return SwapLong( data );
114 }
115 
116 inline int SwapBytes( int data,
117  ByteOrder data_order,
118  ByteOrder desired_order )
119 {
120  if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
121  if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
122  if ( data_order == desired_order )
123  return data;
124  else
125  return SwapInt( data );
126 }
127 
128 inline float SwapBytes( float data,
129  ByteOrder data_order,
130  ByteOrder desired_order )
131 {
132  if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
133  if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
134  if ( data_order == desired_order )
135  return data;
136  else
137  return SwapFloat( data );
138 }
139 
140 inline double SwapBytes( double data,
141  ByteOrder data_order,
142  ByteOrder desired_order )
143 {
144  if ( data_order == BO_MACHINE ) data_order = NativeByteOrder();
145  if ( desired_order == BO_MACHINE ) desired_order = NativeByteOrder();
146  if ( data_order == desired_order )
147  return data;
148  else
149  return SwapDouble( data );
150 }
151 
152 void SwapMemBytes( void *items, DataType type, size_t count,
153  ByteOrder file_order, ByteOrder desired_order );
154 
155 size_t FRead( void *ptr, DataType type, size_t nitems, FILE *stream,
156  ByteOrder file_order, ByteOrder desired_order = BO_MACHINE );
157 
158 size_t GZFRead( void *ptr, DataType type, size_t nitems, gzFile gzstream,
159  ByteOrder file_order, ByteOrder desired_order = BO_MACHINE );
160 
161 size_t FWrite( void *ptr, DataType type, size_t nitems, FILE *stream,
162  ByteOrder file_order, ByteOrder data_order = BO_MACHINE );
163 
164 size_t GZFWrite( void *ptr, DataType type, size_t nitems, gzFile gzstream,
165  ByteOrder file_order, ByteOrder data_order = BO_MACHINE );
166 
167 #endif