MI_Boolean Identical()

in LCM/codec/mof/parser/types.c [2881:3016]


MI_Boolean Identical(
    void * mofstate,
    const void* v1, const void* v2, MI_Type type)
{
    MOF_State * state = (MOF_State *)mofstate;

    if (v1 == NULL && v2 == NULL)
        return 1;

    if (v1  == NULL && v2 != NULL)
        return 0;

    if (v1 != NULL && v2 == NULL)
        return 0;

    switch (type)
    {
        case MI_BOOLEAN:
            return *((MI_Boolean*)v1) == *((MI_Boolean*)v2);
        case MI_UINT8:
            return *((MI_Uint8*)v1) == *((MI_Uint8*)v2);
        case MI_SINT8:
            return *((MI_Sint8*)v1) == *((MI_Sint8*)v2);
        case MI_UINT16:
            return *((MI_Uint16*)v1) == *((MI_Uint16*)v2);
        case MI_SINT16:
            return *((MI_Sint16*)v1) == *((MI_Sint16*)v2);
        case MI_UINT32:
            return *((MI_Uint32*)v1) == *((MI_Uint32*)v2);
        case MI_SINT32:
            return *((MI_Sint32*)v1) == *((MI_Sint32*)v2);
        case MI_UINT64:
            return *((MI_Uint64*)v1) == *((MI_Uint64*)v2);
        case MI_SINT64:
            return *((MI_Sint64*)v1) == *((MI_Sint64*)v2);
        case MI_REAL32:
            return *((MI_Real32*)v1) == *((MI_Real32*)v2);
        case MI_REAL64:
            return *((MI_Real64*)v1) == *((MI_Real64*)v2);
        case MI_CHAR16:
            return *((MI_Char16*)v1) == *((MI_Char16*)v2);
        case MI_DATETIME:
            return memcmp((MI_Datetime*)v1, (MI_Datetime*)v2, 
                sizeof(MI_Datetime)) == 0;
        case MI_STRING:
            return Tcscmp(*(MI_Char**)v1, *(MI_Char**)v2) == 0;
        case MI_BOOLEANA:
        case MI_UINT8A:
        case MI_SINT8A:
        case MI_UINT16A:
        case MI_SINT16A:
        case MI_UINT32A:
        case MI_SINT32A:
        case MI_UINT64A:
        case MI_SINT64A:
        case MI_CHAR16A:
        case MI_DATETIMEA:
        {
            MI_BooleanA* a1 = (MI_BooleanA*)v1;
            MI_BooleanA* a2 = (MI_BooleanA*)v2;
#ifdef _PREFAST_
    #pragma prefast (push)
    #pragma prefast (disable: 26014)
#endif          
            MI_Uint32 elementSize = (MI_Uint32)_typeSizes[type & ~MI_ARRAY_BIT];
#ifdef _PREFAST_
    #pragma prefast (pop)
#endif          

            if (a1->size != a2->size)
                return 0;

            if (memcmp(a1->data, a2->data, a1->size * elementSize) != 0)
                return 0;

            return 1;
        }
        case MI_REAL32A:
        {
            MI_Real32A* a1 = (MI_Real32A*)v1;
            MI_Real32A* a2 = (MI_Real32A*)v2;
            MI_Uint32 i;

            if (a1->size != a2->size)
                return 0;

            for (i = 0; i < a1->size; i++)
            {
                if (a1->data[i] != a2->data[i])
                    return 0;
            }

            return 1;
        }
        case MI_REAL64A:
        {
            MI_Real64A* a1 = (MI_Real64A*)v1;
            MI_Real64A* a2 = (MI_Real64A*)v2;
            MI_Uint32 i;

            if (a1->size != a2->size)
                return 0;

            for (i = 0; i < a1->size; i++)
            {
                if (a1->data[i] != a2->data[i])
                    return 0;
            }

            return 1;
        }
        case MI_STRINGA:
        {
            MI_StringA* a1 = (MI_StringA*)v1;
            MI_StringA* a2 = (MI_StringA*)v2;
            MI_Uint32 i;

            if (a1->size != a2->size)
                return 0;

            for (i = 0; i < a1->size; i++)
            {
                if (Tcscmp(a1->data[i], a2->data[i]) != 0)
                    return 0;
            }

            return 1;
        }
        default:
        {
            yyerrorf(state->errhandler, ID_INTERNAL_ERROR, "internal error: %s(%u)",
                __FILE__, __LINE__);
            return 0;
        }
    }
}