1 #ifndef __ACCESSOR_H |
|
2 #define __ACCESSOR_H |
|
3 |
|
4 #define __INITIAL_VALUE(...) __VA_ARGS__ |
|
5 |
|
6 // variable declaration macros |
|
7 #define __DECLARE_VAR(type, name)\ |
|
8 __IEC_##type##_t name; |
|
9 #define __DECLARE_GLOBAL(type, domain, name)\ |
|
10 __IEC_##type##_t domain##__##name;\ |
|
11 static __IEC_##type##_t *GLOBAL__##name = &(domain##__##name);\ |
|
12 void __INIT_GLOBAL_##name(type value) {\ |
|
13 (*GLOBAL__##name).value = value;\ |
|
14 }\ |
|
15 IEC_BYTE __IS_GLOBAL_##name##_FORCED(void) {\ |
|
16 return (*GLOBAL__##name).flags & __IEC_FORCE_FLAG;\ |
|
17 }\ |
|
18 type* __GET_GLOBAL_##name(void) {\ |
|
19 return &((*GLOBAL__##name).value);\ |
|
20 } |
|
21 #define __DECLARE_GLOBAL_FB(type, domain, name)\ |
|
22 type domain##__##name;\ |
|
23 static type *GLOBAL__##name = &(domain##__##name);\ |
|
24 type* __GET_GLOBAL_##name(void) {\ |
|
25 return &(*GLOBAL__##name);\ |
|
26 }\ |
|
27 extern void type##_init__(type* data__, BOOL retain); |
|
28 #define __DECLARE_GLOBAL_LOCATION(type, location)\ |
|
29 extern type *location; |
|
30 #define __DECLARE_GLOBAL_LOCATED(type, resource, name)\ |
|
31 __IEC_##type##_p resource##__##name;\ |
|
32 static __IEC_##type##_p *GLOBAL__##name = &(resource##__##name);\ |
|
33 void __INIT_GLOBAL_##name(type value) {\ |
|
34 *((*GLOBAL__##name).value) = value;\ |
|
35 }\ |
|
36 IEC_BYTE __IS_GLOBAL_##name##_FORCED(void) {\ |
|
37 return (*GLOBAL__##name).flags & __IEC_FORCE_FLAG;\ |
|
38 }\ |
|
39 type* __GET_GLOBAL_##name(void) {\ |
|
40 return (*GLOBAL__##name).value;\ |
|
41 } |
|
42 #define __DECLARE_GLOBAL_PROTOTYPE(type, name)\ |
|
43 extern type* __GET_GLOBAL_##name(void); |
|
44 #define __DECLARE_EXTERNAL(type, name)\ |
|
45 __IEC_##type##_p name; |
|
46 #define __DECLARE_EXTERNAL_FB(type, name)\ |
|
47 type* name; |
|
48 #define __DECLARE_LOCATED(type, name)\ |
|
49 __IEC_##type##_p name; |
|
50 |
|
51 |
|
52 // variable initialization macros |
|
53 #define __INIT_RETAIN(name, retained)\ |
|
54 name.flags |= retained?__IEC_RETAIN_FLAG:0; |
|
55 #define __INIT_VAR(name, initial, retained)\ |
|
56 name.value = initial;\ |
|
57 __INIT_RETAIN(name, retained) |
|
58 #define __INIT_GLOBAL(type, name, initial, retained)\ |
|
59 {\ |
|
60 static const type temp = initial;\ |
|
61 __INIT_GLOBAL_##name(temp);\ |
|
62 __INIT_RETAIN((*GLOBAL__##name), retained)\ |
|
63 } |
|
64 #define __INIT_GLOBAL_FB(type, name, retained)\ |
|
65 type##_init__(&(*GLOBAL__##name), retained); |
|
66 #define __INIT_GLOBAL_LOCATED(domain, name, location, retained)\ |
|
67 domain##__##name.value = location;\ |
|
68 __INIT_RETAIN(domain##__##name, retained) |
|
69 #define __INIT_EXTERNAL(type, global, name, retained)\ |
|
70 {\ |
|
71 name.value = __GET_GLOBAL_##global();\ |
|
72 __INIT_RETAIN(name, retained)\ |
|
73 } |
|
74 #define __INIT_EXTERNAL_FB(type, global, name, retained)\ |
|
75 name = __GET_GLOBAL_##global(); |
|
76 #define __INIT_LOCATED(type, location, name, retained)\ |
|
77 {\ |
|
78 extern type *location;\ |
|
79 name.value = location;\ |
|
80 __INIT_RETAIN(name, retained)\ |
|
81 } |
|
82 #define __INIT_LOCATED_VALUE(name, initial)\ |
|
83 *(name.value) = initial; |
|
84 |
|
85 |
|
86 // variable getting macros |
|
87 #define __GET_VAR(name, ...)\ |
|
88 name.value __VA_ARGS__ |
|
89 #define __GET_EXTERNAL(name, ...)\ |
|
90 ((name.flags & __IEC_FORCE_FLAG) ? name.fvalue __VA_ARGS__ : (*(name.value)) __VA_ARGS__) |
|
91 #define __GET_EXTERNAL_FB(name, ...)\ |
|
92 __GET_VAR(((*name) __VA_ARGS__)) |
|
93 #define __GET_LOCATED(name, ...)\ |
|
94 ((name.flags & __IEC_FORCE_FLAG) ? name.fvalue __VA_ARGS__ : (*(name.value)) __VA_ARGS__) |
|
95 |
|
96 #define __GET_VAR_BY_REF(name, ...)\ |
|
97 ((name.flags & __IEC_FORCE_FLAG) ? &(name.fvalue __VA_ARGS__) : &(name.value __VA_ARGS__)) |
|
98 #define __GET_EXTERNAL_BY_REF(name, ...)\ |
|
99 ((name.flags & __IEC_FORCE_FLAG) ? &(name.fvalue __VA_ARGS__) : &((*(name.value)) __VA_ARGS__)) |
|
100 #define __GET_EXTERNAL_FB_BY_REF(name, ...)\ |
|
101 __GET_EXTERNAL_BY_REF(((*name) __VA_ARGS__)) |
|
102 #define __GET_LOCATED_BY_REF(name, ...)\ |
|
103 ((name.flags & __IEC_FORCE_FLAG) ? &(name.fvalue __VA_ARGS__) : &((*(name.value)) __VA_ARGS__)) |
|
104 |
|
105 #define __GET_VAR_REF(name, ...)\ |
|
106 (&(name.value __VA_ARGS__)) |
|
107 #define __GET_EXTERNAL_REF(name, ...)\ |
|
108 (&((*(name.value)) __VA_ARGS__)) |
|
109 #define __GET_EXTERNAL_FB_REF(name, ...)\ |
|
110 (&(__GET_VAR(((*name) __VA_ARGS__)))) |
|
111 #define __GET_LOCATED_REF(name, ...)\ |
|
112 (&((*(name.value)) __VA_ARGS__)) |
|
113 |
|
114 |
|
115 // variable setting macros |
|
116 #define __SET_VAR(prefix, name, suffix, new_value)\ |
|
117 if (!(prefix name.flags & __IEC_FORCE_FLAG)) prefix name.value suffix = new_value |
|
118 #define __SET_EXTERNAL(prefix, name, suffix, new_value)\ |
|
119 {extern IEC_BYTE __IS_GLOBAL_##name##_FORCED();\ |
|
120 if (!(prefix name.flags & __IEC_FORCE_FLAG || __IS_GLOBAL_##name##_FORCED()))\ |
|
121 (*(prefix name.value)) suffix = new_value;} |
|
122 #define __SET_EXTERNAL_FB(prefix, name, suffix, new_value)\ |
|
123 __SET_VAR((*(prefix name)), suffix, new_value) |
|
124 #define __SET_LOCATED(prefix, name, suffix, new_value)\ |
|
125 if (!(prefix name.flags & __IEC_FORCE_FLAG)) *(prefix name.value) suffix = new_value |
|
126 |
|
127 #endif //__ACCESSOR_H |
|