00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _QORE_BITOPTS_H
00024
00025 #define _QORE_BITOPTS_H
00026
00027 #include <qore/common.h>
00028
00029 #include <arpa/inet.h>
00030
00031 static inline int64 i8LSB(int64 i);
00032 static inline int i4LSB(int i);
00033 static inline short i2LSB(short i);
00034
00035 static inline int64 LSBi8(int64 i);
00036 static inline int LSBi4(int i);
00037 static inline short LSBi2(short i);
00038
00039 static inline int64 i8MSB(int64 i);
00040 static inline int64 MSBi8(int64 i);
00041
00042 static inline int64 swapi8(int64 i)
00043 {
00044 char obuf[8];
00045 char *ibuf = (char *)&i;
00046 obuf[7] = ibuf[0];
00047 obuf[6] = ibuf[1];
00048 obuf[5] = ibuf[2];
00049 obuf[4] = ibuf[3];
00050 obuf[3] = ibuf[4];
00051 obuf[2] = ibuf[5];
00052 obuf[1] = ibuf[6];
00053 obuf[0] = ibuf[7];
00054
00055 return *((int64 *)obuf);
00056 }
00057
00058 static inline double swapf8(double f)
00059 {
00060 char obuf[8];
00061 char *ibuf = (char *)&f;
00062 obuf[7] = ibuf[0];
00063 obuf[6] = ibuf[1];
00064 obuf[5] = ibuf[2];
00065 obuf[4] = ibuf[3];
00066 obuf[3] = ibuf[4];
00067 obuf[2] = ibuf[5];
00068 obuf[1] = ibuf[6];
00069 obuf[0] = ibuf[7];
00070
00071 return *((double *)obuf);
00072 }
00073
00074 static inline int swapi4(int i)
00075 {
00076 char obuf[4];
00077 char *ibuf = (char *)&i;
00078 obuf[3] = ibuf[0];
00079 obuf[2] = ibuf[1];
00080 obuf[1] = ibuf[2];
00081 obuf[0] = ibuf[3];
00082
00083 return *((int *)obuf);
00084 }
00085
00086 static inline float swapf4(float f)
00087 {
00088 char obuf[4];
00089 char *ibuf = (char *)&f;
00090 obuf[3] = ibuf[0];
00091 obuf[2] = ibuf[1];
00092 obuf[1] = ibuf[2];
00093 obuf[0] = ibuf[3];
00094
00095 return *((float *)obuf);
00096 }
00097
00098 static inline short swapi2(short i)
00099 {
00100 char obuf[2];
00101 char *ibuf = (char *)&i;
00102 obuf[1] = ibuf[0];
00103 obuf[0] = ibuf[1];
00104
00105 return *((short *)obuf);
00106 }
00107
00108 #ifdef WORDS_BIGENDIAN
00109 static inline int64 i8LSB(int64 i)
00110 {
00111 return swapi8(i);
00112 }
00113
00114 static inline int i4LSB(int i)
00115 {
00116 return swapi4(i);
00117 }
00118
00119 static inline short i2LSB(short i)
00120 {
00121 return swapi2(i);
00122 }
00123
00124 static inline int64 LSBi8(int64 i)
00125 {
00126 return swapi8(i);
00127 }
00128
00129 static inline int LSBi4(int i)
00130 {
00131 return swapi4(i);
00132 }
00133
00134 static inline short LSBi2(short i)
00135 {
00136 return swapi2(i);
00137 }
00138
00139 static inline int64 i8MSB(int64 i) { return i; }
00140 static inline int64 MSBi8(int64 i) { return i; }
00141
00142 static inline double f8LSB(double f)
00143 {
00144 return swapf8(f);
00145 }
00146
00147 static inline float f4LSB(float f)
00148 {
00149 return swapf4(f);
00150 }
00151
00152 static inline double LSBf8(double f)
00153 {
00154 return swapf8(f);
00155 }
00156
00157 static inline float LSBf4(float f)
00158 {
00159 return swapf4(f);
00160 }
00161
00162 static inline double f8MSB(double f) { return f; }
00163 static inline double MSBf8(double f) { return f; }
00164 static inline float f4MSB(float f) { return f; }
00165 static inline float MSBf4(float f) { return f; }
00166
00167 #else // definitions for little endian machines below
00168
00169 static inline int64 i8LSB(int64 i) { return i; }
00170 static inline int i4LSB(int i) { return i; }
00171 static inline short i2LSB(short i) { return i; }
00172
00173 static inline int64 LSBi8(int64 i) { return i; }
00174 static inline int LSBi4(int i) { return i; }
00175 static inline short LSBi2(short i) { return i; }
00176
00177 static inline int64 i8MSB(int64 i)
00178 {
00179 return swapi8(i);
00180 }
00181
00182 static inline int64 MSBi8(int64 i)
00183 {
00184 return swapi8(i);
00185 }
00186
00187 static inline double f8LSB(double f) { return f; }
00188 static inline float f4LSB(float f) { return f; }
00189
00190 static inline double LSBf8(double f) { return f; }
00191 static inline float LSBf4(float f) { return f; }
00192
00193 static inline double f8MSB(double f)
00194 {
00195 return swapf8(f);
00196 }
00197
00198 static inline double MSBf8(double f)
00199 {
00200 return swapf8(f);
00201 }
00202
00203 static inline float f4MSB(float f)
00204 {
00205 return swapf4(f);
00206 }
00207
00208 static inline float MSBf4(float f)
00209 {
00210 return swapf4(f);
00211 }
00212
00213 #endif
00214
00215 #endif