targets/var_access.c
branchRuntimeLists
changeset 3395 93ad018fb602
parent 2710 aaa1dc426213
equal deleted inserted replaced
3394:9ea29ac18837 3395:93ad018fb602
     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