lib/accessor.h
changeset 904 423ea3749212
parent 903 f712705bef65
child 905 31224f8cac32
equal deleted inserted replaced
903:f712705bef65 904:423ea3749212
     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