Qore Programming Language  0.8.9
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
qore_bitopts.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  qore_bit_opts.h
4 
5  Qore Programming Language
6 
7  Copyright 2003 - 2013 David Nichols
8 
9  This library is free software; you can redistribute it and/or
10  modify it under the terms of the GNU Lesser General Public
11  License as published by the Free Software Foundation; either
12  version 2.1 of the License, or (at your option) any later version.
13 
14  This library is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public
20  License along with this library; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #ifndef _QORE_BITOPTS_H
25 
26 #define _QORE_BITOPTS_H
27 
28 #include <qore/common.h>
29 
30 static inline int64 i8LSB(int64 i);
31 static inline int i4LSB(int i);
32 static inline short i2LSB(short i);
33 
34 static inline int64 LSBi8(int64 i);
35 static inline int LSBi4(int i);
36 static inline short LSBi2(short i);
37 
38 static inline int64 i8MSB(int64 i);
39 static inline int64 MSBi8(int64 i);
40 
42 union qore_i8_u {
43  char buf[8];
44  int64 i;
45  double f;
46 
47  DLLLOCAL void swap(char *ibuf) {
48  buf[7] = ibuf[0];
49  buf[6] = ibuf[1];
50  buf[5] = ibuf[2];
51  buf[4] = ibuf[3];
52  buf[3] = ibuf[4];
53  buf[2] = ibuf[5];
54  buf[1] = ibuf[6];
55  buf[0] = ibuf[7];
56  }
57 };
58 
60 static inline int64 swapi8(int64 i) {
61  char *ibuf = (char *)&i;
62  qore_i8_u i8;
63  i8.swap(ibuf);
64  return i8.i;
65 }
66 
68 static inline double swapf8(double f) {
69  char *ibuf = (char *)&f;
70  qore_i8_u f8;
71  f8.swap(ibuf);
72  return f8.f;
73 }
74 
76 union qore_i4_u {
77  char buf[4];
78  int i;
79  float f;
80 
81  DLLLOCAL void swap(char *ibuf) {
82  buf[3] = ibuf[0];
83  buf[2] = ibuf[1];
84  buf[1] = ibuf[2];
85  buf[0] = ibuf[3];
86  }
87 };
88 
90 static inline int swapi4(int i) {
91  char *ibuf = (char *)&i;
92  qore_i4_u i4;
93  i4.swap(ibuf);
94  return i4.i;
95 }
96 
98 static inline float swapf4(float f) {
99  char *ibuf = (char *)&f;
100  qore_i4_u f4;
101  f4.swap(ibuf);
102  return f4.f;
103 }
104 
106 union qore_i2_u {
107  char buf[2];
108  short i;
109 
110  DLLLOCAL void swap(char *ibuf) {
111  buf[1] = ibuf[0];
112  buf[0] = ibuf[1];
113  }
114 };
115 
117 static inline short swapi2(short i) {
118  char *ibuf = (char *)&i;
119  qore_i2_u i2;
120  i2.swap(ibuf);
121  return i2.i;
122 }
123 
124 #ifdef WORDS_BIGENDIAN
125 static inline int64 i8LSB(int64 i) {
126  return swapi8(i);
127 }
128 
129 static inline int i4LSB(int i) {
130  return swapi4(i);
131 }
132 
133 static inline short i2LSB(short i) {
134  return swapi2(i);
135 }
136 
137 static inline int64 LSBi8(int64 i) {
138  return swapi8(i);
139 }
140 
141 static inline int LSBi4(int i) {
142  return swapi4(i);
143 }
144 
145 static inline short LSBi2(short i) {
146  return swapi2(i);
147 }
148 
149 static inline int64 i8MSB(int64 i) { return i; }
150 static inline int64 MSBi8(int64 i) { return i; }
151 
152 static inline double f8LSB(double f) {
153  return swapf8(f);
154 }
155 
156 static inline float f4LSB(float f) {
157  return swapf4(f);
158 }
159 
160 static inline double LSBf8(double f) {
161  return swapf8(f);
162 }
163 
164 static inline float LSBf4(float f) {
165  return swapf4(f);
166 }
167 
168 static inline double f8MSB(double f) { return f; }
169 static inline double MSBf8(double f) { return f; }
170 static inline float f4MSB(float f) { return f; }
171 static inline float MSBf4(float f) { return f; }
172 
173 #else // definitions for little endian machines below
174 
175 static inline int64 i8LSB(int64 i) { return i; }
176 static inline int i4LSB(int i) { return i; }
177 static inline short i2LSB(short i) { return i; }
178 
179 static inline int64 LSBi8(int64 i) { return i; }
180 static inline int LSBi4(int i) { return i; }
181 static inline short LSBi2(short i) { return i; }
182 
183 static inline int64 i8MSB(int64 i) {
184  return swapi8(i);
185 }
186 
187 static inline int64 MSBi8(int64 i) {
188  return swapi8(i);
189 }
190 
191 static inline double f8LSB(double f) { return f; }
192 static inline float f4LSB(float f) { return f; }
193 
194 static inline double LSBf8(double f) { return f; }
195 static inline float LSBf4(float f) { return f; }
196 
197 static inline double f8MSB(double f) {
198  return swapf8(f);
199 }
200 
201 static inline double MSBf8(double f) {
202  return swapf8(f);
203 }
204 
205 static inline float f4MSB(float f) {
206  return swapf4(f);
207 }
208 
209 static inline float MSBf4(float f) {
210  return swapf4(f);
211 }
212 
213 #endif
214 
215 #endif
used to swap byte order of 8-byte values
Definition: qore_bitopts.h:42
used to swap 2-byte integers
Definition: qore_bitopts.h:106
used to swap byte order of 4-byte values
Definition: qore_bitopts.h:76