-
Notifications
You must be signed in to change notification settings - Fork 0
/
struct_union.h
381 lines (342 loc) · 8.84 KB
/
struct_union.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
// struct_union.h
#pragma once
#include "timeX.h" // time x_definitions
#include <stdarg.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
// ########################################### Macros ##############################################
// ######################################## enumerations ###########################################
typedef enum {
epSCALE_NANO = -3,
epSCALE_MICRO = -2,
epSCALE_MILLI = -1,
epSCALE_NONE = 0,
epSCALE_KILO = 1,
epSCALE_MEGA = 2,
epSCALE_GIGA = 3,
} ep_scale_t;
enum { // {flags}{counter}
maskCOUNT = 0x007FFFFF, // counter value or mask
mfbCOUNT = (1 << 23), // Prefix 23x LSB uCount
mfbCOLOR = (1 << 24), // Use colours where applicable
mfbPRIOX = (1 << 25),
mfbSTATE = (1 << 26),
mfbSTACK = (1 << 27),
mfbCORE = (1 << 28),
mfbXTRAS = (1 << 29),
mfbNL = (1 << 30), // PostFix 'n'
mfbRT = (1 << 31), // prefix RunTime
};
// ############################# common complex data types/ structures #############################
// See http://www.catb.org/esr/structure-packing/
// Also http://c0x.coding-guidelines.com/6.7.2.1.html
typedef union u64rt_t { struct { u32_t LSW, MSW; }; u64_t U64val; } u64rt_t; // LSW then MSW sequence critical
typedef union va_fake_t { char * pa; va_list va; } va_fake_t;
typedef union mac_addr_t {
struct __attribute__((packed)) { u8_t str6hex[6], filler1[2]; };
struct __attribute__((packed)) { u64_t value:48; u16_t filler2:16; };
} mac_addr_t;
DUMB_STATIC_ASSERT(sizeof(mac_addr_t) == 8);
typedef union ver_t { // Version numbers
struct __attribute__((packed)) {
u8_t rev; // Revision of Sub
u8_t sub; // Sub version
u8_t min; // Minor version
u8_t maj; // Major version
};
u32_t val;
} ver_t;
DUMB_STATIC_ASSERT(sizeof(ver_t) == 4);
typedef struct __attribute__((packed)) ioset_t { // 1/2/3/4/8 bit option variables
union { // 1-bit option variables
struct __attribute__((packed)) {
u8_t B1_0 : 1 ;
u8_t B1_1 : 1 ;
u8_t B1_2 : 1 ;
u8_t B1_3 : 1 ;
u8_t B1_4 : 1 ;
u8_t B1_5 : 1 ;
u8_t B1_6 : 1 ;
u8_t B1_7 : 1 ;
u8_t B1_8 : 1 ;
u8_t B1_9 : 1 ;
u8_t B1_10 : 1 ;
u8_t B1_11 : 1 ;
u8_t B1_12 : 1 ;
u8_t B1_13 : 1 ;
u8_t B1_14 : 1 ;
u8_t B1_15 : 1 ;
u8_t B1_16 : 1 ;
u8_t B1_17 : 1 ;
u8_t B1_18 : 1 ;
u8_t B1_19 : 1 ;
u8_t B1_20 : 1 ;
u8_t B1_21 : 1 ;
u8_t B1_22 : 1 ;
u8_t B1_23 : 1 ;
u8_t B1_24 : 1 ;
u8_t B1_25 : 1 ;
u8_t B1_26 : 1 ;
u8_t B1_27 : 1 ;
u8_t B1_28 : 1 ;
u8_t B1_29 : 1 ;
u8_t B1_30 : 1 ;
u8_t B1_31 : 1 ;
u8_t B1_32 : 1 ;
u8_t B1_33 : 1 ;
u8_t B1_34 : 1 ;
u8_t B1_35 : 1 ;
u8_t B1_36 : 1 ;
u8_t B1_37 : 1 ;
u8_t B1_38 : 1 ;
u8_t B1_39 : 1 ;
u8_t B1_40 : 1 ;
u8_t B1_41 : 1 ;
u8_t B1_42 : 1 ;
u8_t B1_43 : 1 ;
u8_t B1_44 : 1 ;
u8_t B1_45 : 1 ;
u8_t B1_46 : 1 ;
u8_t B1_47 : 1 ;
u8_t B1_48 : 1 ;
u8_t B1_49 : 1 ;
u8_t B1_50 : 1 ;
u8_t B1_51 : 1 ;
u8_t B1_52 : 1 ;
u8_t B1_53 : 1 ;
u8_t B1_54 : 1 ;
u8_t B1_55 : 1 ;
u8_t B1_56 : 1 ;
u8_t B1_57 : 1 ;
u8_t B1_58 : 1 ;
u8_t B1_59 : 1 ;
u8_t B1_60 : 1 ;
u8_t B1_61 : 1 ;
u8_t B1_62 : 1 ;
u8_t B1_63 : 1 ;
};
u64_t ioB1;
};
union { // 2-bit option variables
struct __attribute__((packed)) {
u8_t B2_0 : 2 ;
u8_t B2_1 : 2 ;
u8_t B2_2 : 2 ;
u8_t B2_3 : 2 ;
u8_t B2_4 : 2 ;
u8_t B2_5 : 2 ;
u8_t B2_6 : 2 ;
u8_t B2_7 : 2 ;
u8_t B2_8 : 2 ;
u8_t B2_9 : 2 ;
u8_t B2_10 : 2 ;
u8_t B2_11 : 2 ;
u8_t B2_12 : 2 ;
u8_t B2_13 : 2 ;
u8_t B2_14 : 2 ;
u8_t B2_15 : 2 ;
u8_t B2_16 : 2 ;
u8_t B2_17 : 2 ;
u8_t B2_18 : 2 ;
u8_t B2_19 : 2 ;
u8_t B2_20 : 2 ;
u8_t B2_21 : 2 ;
u8_t B2_22 : 2 ;
u8_t B2_23 : 2 ;
u8_t B2_24 : 2 ;
u8_t B2_25 : 2 ;
u8_t B2_26 : 2 ;
u8_t B2_27 : 2 ;
u8_t B2_28 : 2 ;
u8_t B2_29 : 2 ;
u8_t B2_30 : 2 ;
u8_t B2_31 : 2 ;
};
u64_t ioB2;
};
union { // 3-bit option variables
struct __attribute__((packed)) {
u16_t B3_0 : 3 ;
u16_t B3_1 : 3 ;
u16_t B3_2 : 3 ;
u16_t B3_3 : 3 ;
u16_t B3_4 : 3 ;
u16_t B3_5 : 3 ;
u16_t B3_6 : 3 ;
u16_t B3_7 : 3 ;
u16_t B3_8 : 3 ;
u16_t B3_9 : 3 ;
u16_t B3_10 : 3 ;
u16_t B3_11 : 3 ;
u16_t B3_12 : 3 ;
u16_t B3_13 : 3 ;
u16_t B3_14 : 3 ;
u16_t B3_15 : 3 ;
u16_t B3_16 : 3 ;
u16_t B3_17 : 3 ;
u16_t B3_18 : 3 ;
u16_t B3_19 : 3 ;
u16_t B3_20 : 3 ;
u16_t B3_xx : 1 ;
};
u64_t ioB3;
};
union { // 4-bit option variables
struct __attribute__((packed)) {
u8_t B4_0 : 4 ;
u8_t B4_1 : 4 ;
u8_t B4_2 : 4 ;
u8_t B4_3 : 4 ;
u8_t B4_4 : 4 ;
u8_t B4_5 : 4 ;
u8_t B4_6 : 4 ;
u8_t B4_7 : 4 ;
u8_t B4_8 : 4 ;
u8_t B4_9 : 4 ;
u8_t B4_10 : 4 ;
u8_t B4_11 : 4 ;
u8_t B4_12 : 4 ;
u8_t B4_13 : 4 ;
u8_t B4_14 : 4 ;
u8_t B4_15 : 4 ;
};
u64_t ioB4;
};
union { // 8-bit option variables (added at end)
struct __attribute__((packed)) {
u8_t B8_0;
u8_t B8_1;
u8_t B8_2;
u8_t B8_3;
u8_t B8_4;
u8_t B8_5;
u8_t B8_6;
u8_t B8_7;
};
u64_t ioB8;
};
} ioset_t;
DUMB_STATIC_ASSERT(sizeof(ioset_t) == 40);
//#pragma GCC diagnostic ignored "-Wpacked-bitfield-compat"
//#pragma GCC diagnostic pop
// ######################################### 8 bit types ###########################################
typedef union { u8_t u8; s8_t s8; i8_t i8; char c8; } x8_t;
DUMB_STATIC_ASSERT(sizeof(x8_t) == 1);
// ######################################### 16 bit types ##########################################
typedef union { u16_t u16; i16_t i16; x8_t x8[2]; } x16_t;
DUMB_STATIC_ASSERT(sizeof(x16_t) == 2);
// ######################################### 24 bit types ##########################################
typedef union __attribute__((packed)) u24_t { u32_t u24:24; } u24_t;
DUMB_STATIC_ASSERT(sizeof(u24_t) == 3);
typedef union __attribute__((packed)) i24_t { i32_t i24:24; } i24_t;
DUMB_STATIC_ASSERT(sizeof(i24_t) == 3);
typedef union __attribute__((packed)) x24_t {
u32_t u24:24;
i32_t i24:24;
x8_t x8[3];
struct __attribute__((packed)) { u16_t u16; u8_t u8a; };
struct __attribute__((packed)) { i16_t i16; u8_t u8b; };
} x24_t;
DUMB_STATIC_ASSERT(sizeof(x24_t) == 3);
// ########################################## x32 types ############################################
typedef union __attribute__((packed)) x32_t {
int iX;
u32_t u32;
i32_t i32;
f32_t f32;
x16_t x16[2];
x8_t x8[4];
struct __attribute__((packed)) { x24_t x24; x8_t X8val; };
struct __attribute__((packed)) { u24_t u24; x8_t U8val; };
struct __attribute__((packed)) { i24_t i24; x8_t I8val; };
} x32_t;
DUMB_STATIC_ASSERT(sizeof(x32_t) == 4);
// ########################################## x64 types ############################################
typedef union __attribute__((packed)) x64_t {
u64_t u64;
i64_t i64;
f64_t f64;
x32_t x32[2];
x16_t x16[4];
x8_t x8[8];
} x64_t;
DUMB_STATIC_ASSERT(sizeof(x64_t) == 8);
// ########################################## Other types ##########################################
typedef struct __attribute__((packed)) Q8dot4_t {
int res1 : 4; // LSB
int fract : 4;
int integ : 8;
} Q8dot4_t;
typedef struct __attribute__((packed)) Q18dot2_t {
int res1 : 4; // LSB
int fract : 2;
int integ : 18;
} Q18dot2_t;
// ###################################### px (32/64) pointer types #################################
typedef union px_t {
void * pv;
void * * ppv;
int * piX;
x64_t * px64; // pointers to x64
u64_t * pu64;
i64_t * pi64;
double * pf64;
x32_t * px32; // pointers to x32
u32_t * pu32;
i32_t * pi32;
float * pf32;
x24_t * px24; // pointers to x24
u24_t * pu24;
i24_t * pi24;
x16_t * px16; // pointer to x16
u16_t * pu16;
i16_t * pi16;
x8_t * px8; // pointers to x08
u8_t * pu8;
s8_t * pi8;
char * pc8;
char ** ppc8;
const char *pcc8;
seconds_t * psec;
} px_t;
DUMB_STATIC_ASSERT(sizeof(px_t) == sizeof(void *));
// ################################## Structure pointer container ##################################
struct epw_t;
struct x32mma_t;
struct x32mmab_t;
struct x32stat_t;
struct pcnt_t;
struct tsz_t;
struct vt_enum_t;
union ow_rom_t;
struct mb_srv_t;
union vd_t;
struct v32_t;
struct v64_t;
typedef union ps_t {
struct epw_t * psEPW;
struct x32mma_t * pMMA;
struct x32mmab_t * pMMAB;
struct x32stat_t * pSTAT;
struct pcnt_t * psPCNT;
struct tsz_t * pTSZ;
const struct vt_enum_t * psCX;
union ow_rom_t * pOW_ROM;
struct mb_srv_t * psMBSrv;
union vd_t * psVD;
struct v32_t * psV32;
struct v64_t * psV64;
px_t pX;
void * pV;
} ps_t;
DUMB_STATIC_ASSERT(sizeof(ps_t) == sizeof(void *));
// #################################### All-In-One container #######################################
typedef union z32_t { x32_t x32; px_t px; ps_t ps; } z32_t;
DUMB_STATIC_ASSERT(sizeof(z32_t) == 4);
typedef union z64_t { x64_t x64; px_t px; ps_t ps; } z64_t;
DUMB_STATIC_ASSERT(sizeof(z64_t) == 8);
#ifdef __cplusplus
}
#endif