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
00043 union qore_i8_u {
00044 char buf[8];
00045 int64 i;
00046 double f;
00047
00048 DLLLOCAL void swap(char *ibuf) {
00049 buf[7] = ibuf[0];
00050 buf[6] = ibuf[1];
00051 buf[5] = ibuf[2];
00052 buf[4] = ibuf[3];
00053 buf[3] = ibuf[4];
00054 buf[2] = ibuf[5];
00055 buf[1] = ibuf[6];
00056 buf[0] = ibuf[7];
00057 }
00058 };
00059
00060 static inline int64 swapi8(int64 i) {
00061 char *ibuf = (char *)&i;
00062 qore_i8_u i8;
00063 i8.swap(ibuf);
00064 return i8.i;
00065 }
00066
00067 static inline double swapf8(double f) {
00068 char *ibuf = (char *)&f;
00069 qore_i8_u f8;
00070 f8.swap(ibuf);
00071 return f8.f;
00072 }
00073
00074 union qore_i4_u {
00075 char buf[4];
00076 int i;
00077 float f;
00078
00079 DLLLOCAL void swap(char *ibuf) {
00080 buf[3] = ibuf[0];
00081 buf[2] = ibuf[1];
00082 buf[1] = ibuf[2];
00083 buf[0] = ibuf[3];
00084 }
00085 };
00086
00087 static inline int swapi4(int i) {
00088 char *ibuf = (char *)&i;
00089 qore_i4_u i4;
00090 i4.swap(ibuf);
00091 return i4.i;
00092 }
00093
00094 static inline float swapf4(float f) {
00095 char *ibuf = (char *)&f;
00096 qore_i4_u f4;
00097 f4.swap(ibuf);
00098 return f4.f;
00099 }
00100
00101 union qore_i2_u {
00102 char buf[4];
00103 int i;
00104
00105 DLLLOCAL void swap(char *ibuf) {
00106 buf[1] = ibuf[0];
00107 buf[0] = ibuf[1];
00108 }
00109 };
00110
00111 static inline short swapi2(short i) {
00112 char *ibuf = (char *)&i;
00113 qore_i2_u i2;
00114 i2.swap(ibuf);
00115 return i2.i;
00116 }
00117
00118 #ifdef WORDS_BIGENDIAN
00119 static inline int64 i8LSB(int64 i) {
00120 return swapi8(i);
00121 }
00122
00123 static inline int i4LSB(int i) {
00124 return swapi4(i);
00125 }
00126
00127 static inline short i2LSB(short i) {
00128 return swapi2(i);
00129 }
00130
00131 static inline int64 LSBi8(int64 i) {
00132 return swapi8(i);
00133 }
00134
00135 static inline int LSBi4(int i) {
00136 return swapi4(i);
00137 }
00138
00139 static inline short LSBi2(short i) {
00140 return swapi2(i);
00141 }
00142
00143 static inline int64 i8MSB(int64 i) { return i; }
00144 static inline int64 MSBi8(int64 i) { return i; }
00145
00146 static inline double f8LSB(double f) {
00147 return swapf8(f);
00148 }
00149
00150 static inline float f4LSB(float f) {
00151 return swapf4(f);
00152 }
00153
00154 static inline double LSBf8(double f) {
00155 return swapf8(f);
00156 }
00157
00158 static inline float LSBf4(float f) {
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 return swapi8(i);
00179 }
00180
00181 static inline int64 MSBi8(int64 i) {
00182 return swapi8(i);
00183 }
00184
00185 static inline double f8LSB(double f) { return f; }
00186 static inline float f4LSB(float f) { return f; }
00187
00188 static inline double LSBf8(double f) { return f; }
00189 static inline float LSBf4(float f) { return f; }
00190
00191 static inline double f8MSB(double f) {
00192 return swapf8(f);
00193 }
00194
00195 static inline double MSBf8(double f) {
00196 return swapf8(f);
00197 }
00198
00199 static inline float f4MSB(float f) {
00200 return swapf4(f);
00201 }
00202
00203 static inline float MSBf4(float f) {
00204 return swapf4(f);
00205 }
00206
00207 #endif
00208
00209 #endif