Qore Programming Language
0.8.7
Main Page
Related Pages
Modules
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
qore
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