1 |
1 |
2 #define __Unpack_case_t(TYPENAME) \ |
2 #define __Unpack_case_t(TYPENAME) \ |
3 case TYPENAME##_ENUM :\ |
3 case TYPENAME##_ENUM : \ |
4 *flags = ((__IEC_##TYPENAME##_t *)varp)->flags;\ |
4 if(flags) *flags = ((__IEC_##TYPENAME##_t *)varp)->flags; \ |
5 forced_value_p = *real_value_p = &((__IEC_##TYPENAME##_t *)varp)->value;\ |
5 if(value_p) *value_p = &((__IEC_##TYPENAME##_t *)varp)->value; \ |
|
6 if(size) *size = sizeof(TYPENAME); \ |
6 break; |
7 break; |
7 |
8 |
8 #define __Unpack_case_p(TYPENAME)\ |
9 #define __Unpack_case_p(TYPENAME) \ |
9 case TYPENAME##_O_ENUM :\ |
10 case TYPENAME##_O_ENUM : \ |
10 *flags = __IEC_OUTPUT_FLAG;\ |
11 case TYPENAME##_P_ENUM : \ |
11 case TYPENAME##_P_ENUM :\ |
12 if(flags) *flags = ((__IEC_##TYPENAME##_p *)varp)->flags; \ |
12 *flags |= ((__IEC_##TYPENAME##_p *)varp)->flags;\ |
13 if(value_p) *value_p = ((__IEC_##TYPENAME##_p *)varp)->value; \ |
13 *real_value_p = ((__IEC_##TYPENAME##_p *)varp)->value;\ |
14 if(size) *size = sizeof(TYPENAME); \ |
14 forced_value_p = &((__IEC_##TYPENAME##_p *)varp)->fvalue;\ |
|
15 break; |
15 break; |
16 |
16 |
17 #define __Is_a_string(dsc) (dsc->type == STRING_ENUM) ||\ |
17 #define __Is_a_string(dsc) (dsc->type == STRING_ENUM) ||\ |
18 (dsc->type == STRING_P_ENUM) ||\ |
18 (dsc->type == STRING_P_ENUM) ||\ |
19 (dsc->type == STRING_O_ENUM) |
19 (dsc->type == STRING_O_ENUM) |
20 |
20 |
21 static void* UnpackVar(__Unpack_desc_type *dsc, void **real_value_p, char *flags) |
21 static int UnpackVar(__Unpack_desc_type *dsc, void **value_p, char *flags, size_t *size) |
22 { |
22 { |
23 void *varp = dsc->ptr; |
23 void *varp = dsc->ptr; |
24 void *forced_value_p = NULL; |
|
25 *flags = 0; |
|
26 /* find data to copy*/ |
24 /* find data to copy*/ |
27 switch(dsc->type){ |
25 switch(dsc->type){ |
28 __ANY(__Unpack_case_t) |
26 __ANY(__Unpack_case_t) |
29 __ANY(__Unpack_case_p) |
27 __ANY(__Unpack_case_p) |
30 default: |
28 default: |
31 break; |
29 return 0; /* should never happen */ |
32 } |
30 } |
33 if (*flags & __IEC_FORCE_FLAG) |
31 return 1; |
34 return forced_value_p; |
|
35 return *real_value_p; |
|
36 } |
32 } |
37 |
33 |