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