FreeRDP
endian.h
1 /*
2  * WinPR: Windows Portable Runtime
3  * Endianness Macros
4  *
5  * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 
20 #ifndef WINPR_ENDIAN_H
21 #define WINPR_ENDIAN_H
22 
23 #include <winpr/winpr.h>
24 #include <winpr/wtypes.h>
25 #include <winpr/platform.h>
26 
27 #ifdef __cplusplus
28 extern "C"
29 {
30 #endif
31 
32 #define Data_Read_UINT8_NE(_d, _v) \
33  do \
34  { \
35  _v = *((const BYTE*)_d); \
36  } while (0)
37 
38 #define Data_Read_UINT8(_d, _v) \
39  do \
40  { \
41  _v = *((const BYTE*)_d); \
42  } while (0)
43 
44 #define Data_Read_UINT16_NE(_d, _v) \
45  do \
46  { \
47  _v = *((const UINT16*)_d); \
48  } while (0)
49 
50 #define Data_Read_UINT16(_d, _v) \
51  do \
52  { \
53  _v = (UINT16)(*((const BYTE*)_d)) + (UINT16)(((UINT16)(*((const BYTE*)_d + 1))) << 8); \
54  } while (0)
55 
56 #define Data_Read_UINT16_BE(_d, _v) \
57  do \
58  { \
59  _v = (((UINT16)(*(const BYTE*)_d)) << 8) + (UINT16)(*((const BYTE*)_d + 1)); \
60  } while (0)
61 
62 #define Data_Read_UINT32_NE(_d, _v) \
63  do \
64  { \
65  _v = *((UINT32*)_d); \
66  } while (0)
67 
68 #define Data_Read_UINT32(_d, _v) \
69  do \
70  { \
71  _v = (UINT32)(*((const BYTE*)_d)) + (((UINT32)(*((const BYTE*)_d + 1))) << 8) + \
72  (((UINT32)(*((const BYTE*)_d + 2))) << 16) + \
73  (((UINT32)(*((const BYTE*)_d + 3))) << 24); \
74  } while (0)
75 
76 #define Data_Read_UINT32_BE(_d, _v) \
77  do \
78  { \
79  _v = (((UINT32)(*((const BYTE*)_d))) << 24) + (((UINT32)(*((const BYTE*)_d + 1))) << 16) + \
80  (((UINT32)(*((const BYTE*)_d + 2))) << 8) + (((UINT32)(*((const BYTE*)_d + 3)))); \
81  } while (0)
82 
83 #define Data_Read_UINT64_NE(_d, _v) \
84  do \
85  { \
86  _v = *((UINT64*)_d); \
87  } while (0)
88 
89 #define Data_Read_UINT64(_d, _v) \
90  do \
91  { \
92  _v = (UINT64)(*((const BYTE*)_d)) + (((UINT64)(*((const BYTE*)_d + 1))) << 8) + \
93  (((UINT64)(*((const BYTE*)_d + 2))) << 16) + \
94  (((UINT64)(*((const BYTE*)_d + 3))) << 24) + \
95  (((UINT64)(*((const BYTE*)_d + 4))) << 32) + \
96  (((UINT64)(*((const BYTE*)_d + 5))) << 40) + \
97  (((UINT64)(*((const BYTE*)_d + 6))) << 48) + \
98  (((UINT64)(*((const BYTE*)_d + 7))) << 56); \
99  } while (0)
100 
101 #define Data_Read_UINT64_BE(_d, _v) \
102  do \
103  { \
104  _v = (((UINT64)(*((const BYTE*)_d))) << 56) + (((UINT64)(*((const BYTE*)_d + 1))) << 48) + \
105  (((UINT64)(*((const BYTE*)_d + 2))) << 40) + \
106  (((UINT64)(*((const BYTE*)_d + 3))) << 32) + \
107  (((UINT64)(*((const BYTE*)_d + 4))) << 24) + \
108  (((UINT64)(*((const BYTE*)_d + 5))) << 16) + \
109  (((UINT64)(*((const BYTE*)_d + 6))) << 8) + (((UINT64)(*((const BYTE*)_d + 7)))); \
110  } while (0)
111 
112 #define Data_Write_UINT8_NE(_d, _v) \
113  do \
114  { \
115  *((UINT8*)_d) = v; \
116  } while (0)
117 
118 #define Data_Write_UINT8(_d, _v) \
119  do \
120  { \
121  *_d = (UINT8)(_v); \
122  } while (0)
123 
124 #define Data_Write_UINT16_NE(_d, _v) \
125  do \
126  { \
127  *((UINT16*)_d) = _v; \
128  } while (0)
129 
130 #define Data_Write_UINT16(_d, _v) \
131  do \
132  { \
133  *((BYTE*)_d) = (_v)&0xFF; \
134  *((BYTE*)_d + 1) = ((_v) >> 8) & 0xFF; \
135  } while (0)
136 
137 #define Data_Write_UINT16_BE(_d, _v) \
138  do \
139  { \
140  *((BYTE*)_d) = ((_v) >> 8) & 0xFF; \
141  *((BYTE*)_d + 1) = (_v)&0xFF; \
142  } while (0)
143 
144 #define Data_Write_UINT32_NE(_d, _v) \
145  do \
146  { \
147  *((UINT32*)_d) = _v; \
148  } while (0)
149 
150 #define Data_Write_UINT32(_d, _v) \
151  do \
152  { \
153  *((BYTE*)_d) = (_v)&0xFF; \
154  *((BYTE*)_d + 1) = ((_v) >> 8) & 0xFF; \
155  *((BYTE*)_d + 2) = ((_v) >> 16) & 0xFF; \
156  *((BYTE*)_d + 3) = ((_v) >> 24) & 0xFF; \
157  } while (0)
158 
159 #define Data_Write_UINT32_BE(_d, _v) \
160  do \
161  { \
162  Data_Write_UINT16_BE((BYTE*)_d, ((_v) >> 16 & 0xFFFF)); \
163  Data_Write_UINT16_BE((BYTE*)_d + 2, ((_v)&0xFFFF)); \
164  } while (0)
165 
166 #define Data_Write_UINT64_NE(_d, _v) \
167  do \
168  { \
169  *((UINT64*)_d) = _v; \
170  } while (0)
171 
172 #define Data_Write_UINT64(_d, _v) \
173  do \
174  { \
175  *((BYTE*)_d) = (UINT64)(_v)&0xFF; \
176  *((BYTE*)_d + 1) = ((UINT64)(_v) >> 8) & 0xFF; \
177  *((BYTE*)_d + 2) = ((UINT64)(_v) >> 16) & 0xFF; \
178  *((BYTE*)_d + 3) = ((UINT64)(_v) >> 24) & 0xFF; \
179  *((BYTE*)_d + 4) = ((UINT64)(_v) >> 32) & 0xFF; \
180  *((BYTE*)_d + 5) = ((UINT64)(_v) >> 40) & 0xFF; \
181  *((BYTE*)_d + 6) = ((UINT64)(_v) >> 48) & 0xFF; \
182  *((BYTE*)_d + 7) = ((UINT64)(_v) >> 56) & 0xFF; \
183  } while (0)
184 
185 #define Data_Write_UINT64_BE(_d, _v) \
186  do \
187  { \
188  Data_Write_UINT32_BE((BYTE*)_d, ((_v) >> 32 & 0xFFFFFFFF)); \
189  Data_Write_UINT32_BE((BYTE*)_d + 4, ((_v)&0xFFFFFFFF)); \
190  } while (0)
191 
192 #ifdef __cplusplus
193 }
194 #endif
195 
196 #endif /* WINPR_ENDIAN_H */