Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

Endian.h

Go to the documentation of this file.
00001 /*
00002  * Endian.h
00003  *
00004  * Part of Fly! Legacy project
00005  *
00006  * Copyright 2005 Chris Wallace
00007  *
00008  * Fly! Legacy is free software; you can redistribute it and/or modify
00009  *   it under the terms of the GNU General Public License as published by
00010  *   the Free Software Foundation; either version 2 of the License, or
00011  *   (at your option) any later version.
00012  *
00013  * Fly! Legacy is distributed in the hope that it will be useful,
00014  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  *   GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  *   along with Fly! Legacy; if not, write to the Free Software
00020  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021  *
00022  */
00023 
00028 #ifndef ENDIAN_H
00029 #define ENDIAN_H
00030 
00031 //
00032 // Local functions to swap specific data sizes regardless of type
00033 //
00034 
00035 static inline void SwapBytes (void *p, unsigned int nBytes)
00036 {
00037   unsigned char *s = (unsigned char*)p;
00038   for (unsigned int i=0; i<(nBytes/2); i++) {
00039     unsigned char temp = s[i];
00040     s[i] = s[nBytes - i - 1];
00041     s[nBytes - i - 1] = temp;
00042   }
00043 }
00044 
00045 // @todo Remove this if generic SwapBytes is sufficient
00046 static inline void Swap16 (void *p)
00047 {
00048   SwapBytes (p, 2);
00049 /*
00050   *p = ((*p << 8) & 0xFF00) |
00051         (*p >> 8) & 0x00FF));
00052 */
00053 }
00054 
00055 static inline void Swap32 (void *p)
00056 {
00057   SwapBytes (p, 4);
00058 /*
00059   *p = ((*p >> 24) & 0x000000FF) | 
00060        ((*p >>  8) & 0x0000FF00) | 
00061        ((*p <<  8) & 0x00FF0000) | 
00062        ((*p << 24) & 0xFF000000);
00063 */
00064 }
00065 
00066 static inline void Swap64 (void *p)
00067 {
00068   SwapBytes (p, 8);
00069 /*
00070   int nBytes = 8;
00071   unsigned char *s = (unsigned char*)p;
00072   for (int i=0; i<(nBytes/2); i++) {
00073     unsigned char temp = s[i];
00074     s[i] = s[nBytes - i - 1];
00075     s[nBytes - i - 1] = temp;
00076   }
00077 */
00078 }
00079 
00080 
00081 //
00082 // Swap Endian-ness of specific data types
00083 //
00084 inline unsigned int  SwapEndian (unsigned int v)
00085 {
00086   SwapBytes (&v, sizeof(unsigned int));
00087   return v;
00088 }
00089 
00090 inline int           SwapEndian (int v)
00091 {
00092   SwapBytes (&v, sizeof(int));
00093   return v;
00094 }
00095 
00096 inline unsigned short  SwapEndian (unsigned short v)
00097 {
00098   Swap16 (&v);
00099   return v;
00100 }
00101 
00102 inline short           SwapEndian (short v)
00103 {
00104   Swap16 (&v);
00105   return v;
00106 }
00107 
00108 inline unsigned long   SwapEndian (unsigned long v)
00109 {
00110   Swap32 (&v);
00111   return v;
00112 }
00113 
00114 inline long            SwapEndian (long v)
00115 {
00116   Swap32 (&v);
00117   return v;
00118 }
00119 
00120 inline float           SwapEndian (float v)
00121 {
00122   Swap32 (&v);
00123   return v;
00124 }
00125 
00126 inline double          SwapEndian (double v)
00127 {
00128   Swap64 (&v);
00129   return v;
00130 }
00131 
00132 
00133 //
00134 // Functions to determine native machine format
00135 //
00136 
00137 static const int EndianTest = 1;
00138 
00139 inline bool IsBigEndian (void)
00140 {
00141   return (*((char *) &EndianTest ) == 0);
00142 }
00143 
00144 inline bool IsLittleEndian (void)
00145 {
00146   return (*((char *) &EndianTest ) != 0);
00147 }
00148 
00149 
00150 //
00151 // Convert little Endian data to native machine format
00152 //
00153 
00154 inline unsigned int  LittleEndian (unsigned int v)
00155 {
00156   if (IsLittleEndian()) {
00157     return v;
00158   } else {
00159     return SwapEndian (v);
00160   }
00161 }
00162 
00163 inline int           LittleEndian (int v)
00164 {
00165   if (IsLittleEndian()) {
00166     return v;
00167   } else {
00168     return SwapEndian (v);
00169   }
00170 }
00171 
00172 inline unsigned short  LittleEndian (unsigned short v)
00173 {
00174   if (IsLittleEndian()) {
00175     return v;
00176   } else {
00177     return SwapEndian (v);
00178   }
00179 }
00180 
00181 inline short           LittleEndian (short v)
00182 {
00183   if (IsLittleEndian()) {
00184     return v;
00185   } else {
00186     return SwapEndian (v);
00187   }
00188 }
00189 
00190 inline unsigned long   LittleEndian (unsigned long v)
00191 {
00192   if (IsLittleEndian()) {
00193     return v;
00194   } else {
00195     return SwapEndian (v);
00196   }
00197 }
00198 
00199 inline long            LittleEndian (long v)
00200 {
00201   if (IsLittleEndian()) {
00202     return v;
00203   } else {
00204     return SwapEndian (v);
00205   }
00206 }
00207 
00208 inline float           LittleEndian (float v)
00209 {
00210   if (IsLittleEndian()) {
00211     return v;
00212   } else {
00213     return SwapEndian (v);
00214   }
00215 }
00216 
00217 inline double          LittleEndian (double v)
00218 {
00219   if (IsLittleEndian()) {
00220     return v;
00221   } else {
00222     return SwapEndian (v);
00223   }
00224 }
00225 
00226 
00227 //
00228 // Convert big Endian data to native machine format
00229 //
00230 
00231 inline unsigned int  BigEndian (unsigned int v)
00232 {
00233   if (IsBigEndian()) {
00234     return v;
00235   } else {
00236     return SwapEndian (v);
00237   }
00238 }
00239 
00240 inline int           BigEndian (int v)
00241 {
00242   if (IsBigEndian()) {
00243     return v;
00244   } else {
00245     return SwapEndian (v);
00246   }
00247 }
00248 
00249 inline unsigned short  BigEndian (const unsigned short v)
00250 {
00251   if (IsBigEndian()) {
00252     return v;
00253   } else {
00254     return SwapEndian (v);
00255   }
00256 }
00257 
00258 inline short           BigEndian (const short v)
00259 {
00260   if (IsBigEndian()) {
00261     return v;
00262   } else {
00263     return SwapEndian (v);
00264   }
00265 }
00266 
00267 inline unsigned long   BigEndian (const unsigned long v)
00268 {
00269   if (IsBigEndian()) {
00270     return v;
00271   } else {
00272     return SwapEndian (v);
00273   }
00274 }
00275 
00276 inline long            BigEndian (const long v)
00277 {
00278   if (IsBigEndian()) {
00279     return v;
00280   } else {
00281     return SwapEndian (v);
00282   }
00283 }
00284 
00285 inline float           BigEndian (const float v)
00286 {
00287   if (IsBigEndian()) {
00288     return v;
00289   } else {
00290     return SwapEndian (v);
00291   }
00292 }
00293 
00294 inline double          BigEndian (const double v)
00295 {
00296   if (IsBigEndian()) {
00297     return v;
00298   } else {
00299     return SwapEndian (v);
00300   }
00301 }
00302 
00303 #endif // ENDIAN_H
SourceForge.net Logo Documentation generated by doxygen