in Unix/mof/types.c [485:949]
static int _PromoteValue(
MI_Uint32 sourceType,
MI_Uint32 destType,
void** value)
{
MI_Uint32 i;
/* Nothing to do if value is null */
if (*value == NULL)
return 0;
/* Convert from sourceType to destType */
switch (sourceType)
{
case MI_BOOLEAN:
{
if (destType != sourceType)
{
return -1;
}
return 0;
}
case MI_SINT64:
{
const MI_Sint64* p = *((const MI_Sint64**)value);
switch (destType)
{
case MI_UINT8:
{
MI_Uint8* q = MALLOC_T(MI_Uint8, 1);
MI_Sint64 x = *p;
if (_CheckRange(x, MI_UINT8) != 0)
return -1;
*q = (MI_Uint8)x;
*value = q;
return 0;
}
case MI_SINT8:
{
MI_Sint8* q = MALLOC_T(MI_Sint8, 1);
MI_Sint64 x = *p;
if (_CheckRange(x, MI_SINT8) != 0)
return -1;
*q = (MI_Sint8)x;
*value = q;
return 0;
}
case MI_UINT16:
{
MI_Uint16* q = MALLOC_T(MI_Uint16, 1);
MI_Sint64 x = *p;
if (_CheckRange(x, MI_UINT16) != 0)
return -1;
*q = (MI_Uint16)x;
*value = q;
return 0;
}
case MI_SINT16:
{
MI_Sint16* q = MALLOC_T(MI_Sint16, 1);
MI_Sint64 x = *p;
if (_CheckRange(x, MI_SINT16) != 0)
return -1;
*q = (MI_Sint16)x;
*value = q;
return 0;
}
case MI_UINT32:
{
MI_Uint32* q = MALLOC_T(MI_Uint32, 1);
MI_Sint64 x = *p;
if (_CheckRange(x, MI_UINT32) != 0)
return -1;
*q = (MI_Uint32)x;
*value = q;
return 0;
}
case MI_SINT32:
{
MI_Sint32* q = MALLOC_T(MI_Sint32, 1);
MI_Sint64 x = *p;
if (_CheckRange(x, MI_SINT32) != 0)
return -1;
*q = (MI_Sint32)x;
*value = q;
return 0;
}
case MI_UINT64:
{
MI_Uint64* q = MALLOC_T(MI_Uint64, 1);
MI_Sint64 x = *p;
if (_CheckRange(x, MI_UINT64) != 0)
return -1;
*q = (MI_Uint64)x;
*value = q;
return 0;
}
case MI_SINT64:
{
return 0;
}
case MI_STRING:
{
char Buf[24];
MI_Char* q;
MI_Sint64 x = *p;
if (x < 0)
{
sprintf(Buf, "%ld", (long)x);
}
else
{
sprintf(Buf, "%lu", (unsigned long)x);
}
q = MALLOC_T(MI_Char, strlen(Buf) + 1);
strcpy(q, Buf);
*value = q;
return 0;
}
default:
{
return -1;
}
}
}
case MI_REAL64:
{
const MI_Real64* p = *((const MI_Real64**)value);
switch (destType)
{
case MI_REAL32:
{
MI_Real32* q = MALLOC_T(MI_Real32, 1);
*q = (MI_Real32)*p;
*value = q;
return 0;
}
case MI_REAL64:
{
return 0;
}
case MI_STRING:
{
char Buf[24];
MI_Char* q;
MI_Real64 x = *p;
sprintf(Buf, "%f", x);
q = MALLOC_T(MI_Char, strlen(Buf) + 1);
strcpy(q, Buf);
*value = q;
return 0;
}
default:
{
return -1;
}
}
}
case MI_CHAR16:
{
if (destType != sourceType)
return -1;
return 0;
}
case MI_STRING:
{
const char* p = *((const char**)value);
switch (destType)
{
case MI_STRING:
case MI_INSTANCE:
case MI_REFERENCE:
{
return 0;
}
case MI_DATETIME:
{
MI_Datetime* q = MALLOC_T(MI_Datetime, 1);
if (_StrToDatetime(p, q) != 0)
return -1;
*value = q;
return 0;
}
default:
{
return -1;
}
}
}
case MI_BOOLEANA:
{
if (destType != sourceType)
return -1;
return 0;
}
case MI_SINT64A:
{
const MI_Sint64A* p = *((const MI_Sint64A**)value);
switch (destType)
{
case MI_UINT8A:
{
MI_Uint8A* q;
NEW_ARRAY_T(q, MI_Uint8, p->size);
for (i = 0; i < p->size; i++)
{
MI_Sint64 x = p->data[i];
if (_CheckRange(x, MI_UINT8) != 0)
return -1;
q->data[i] = (MI_Uint8)x;
}
*value = q;
return 0;
}
case MI_SINT8A:
{
MI_Sint8A* q;
NEW_ARRAY_T(q, MI_Sint8, p->size);
for (i = 0; i < p->size; i++)
{
MI_Sint64 x = p->data[i];
if (_CheckRange(x, MI_SINT8) != 0)
return -1;
q->data[i] = (MI_Sint8)x;
}
*value = q;
return 0;
}
case MI_UINT16A:
{
MI_Uint16A* q;
NEW_ARRAY_T(q, MI_Uint16, p->size);
for (i = 0; i < p->size; i++)
{
MI_Sint64 x = p->data[i];
if (_CheckRange(x, MI_UINT16) != 0)
return -1;
q->data[i] = (MI_Uint16)x;
}
*value = q;
return 0;
}
case MI_SINT16A:
{
MI_Sint16A* q;
NEW_ARRAY_T(q, MI_Sint16, p->size);
for (i = 0; i < p->size; i++)
{
MI_Sint64 x = p->data[i];
if (_CheckRange(x, MI_SINT16) != 0)
return -1;
q->data[i] = (MI_Sint16)x;
}
*value = q;
return 0;
}
case MI_UINT32A:
{
MI_Uint32A* q;
NEW_ARRAY_T(q, MI_Uint32, p->size);
for (i = 0; i < p->size; i++)
{
MI_Sint64 x = p->data[i];
if (_CheckRange(x, MI_UINT32) != 0)
return -1;
q->data[i] = (MI_Uint32)x;
}
*value = q;
return 0;
}
case MI_SINT32A:
{
MI_Sint32A* q;
NEW_ARRAY_T(q, MI_Sint32, p->size);
for (i = 0; i < p->size; i++)
{
MI_Sint64 x = p->data[i];
if (_CheckRange(x, MI_SINT32) != 0)
return -1;
q->data[i] = (MI_Sint32)x;
}
*value = q;
return 0;
}
case MI_UINT64A:
{
MI_Uint64A* q;
NEW_ARRAY_T(q, MI_Uint64, p->size);
for (i = 0; i < p->size; i++)
{
MI_Sint64 x = p->data[i];
if (_CheckRange(x, MI_UINT64) != 0)
return -1;
q->data[i] = (MI_Uint64)x;
}
*value = q;
return 0;
}
case MI_SINT64A:
{
return 0;
}
case MI_STRINGA:
{
char Buf[24];
MI_StringA* q;
NEW_ARRAY_T(q, MI_String, p->size);
for (i = 0; i < p->size; i++)
{
MI_Sint64 x = p->data[i];
if (x < 0)
{
sprintf(Buf, "%ld", (long)x);
}
else
{
sprintf(Buf, "%lu", (unsigned long)x);
}
strcpy(q->data[i], Buf);
}
*value = q;
return 0;
}
default:
return -1;
}
}
case MI_REAL64A:
{
const MI_Real64A* p = *((const MI_Real64A**)value);
switch (destType)
{
case MI_REAL64A:
{
return 0;
}
case MI_REAL32A:
{
MI_Real32A* q;
NEW_ARRAY_T(q, MI_Real32, p->size);
for (i = 0; i < p->size; i++)
{
q->data[i] = (MI_Real32)p->data[i];
}
*value = q;
return 0;
}
case MI_STRINGA:
{
char Buf[24];
MI_StringA* q;
NEW_ARRAY_T(q, MI_String, p->size);
for (i = 0; i < p->size; i++)
{
MI_Real64 x = p->data[i];
sprintf(Buf, "%f", x);
strcpy(q->data[i], Buf);
}
*value = q;
return 0;
}
default:
return -1;
}
}
case MI_CHAR16A:
{
if (destType != sourceType)
return -1;
return 0;
}
case MI_STRINGA:
{
const MI_StringA* p = *((const MI_StringA**)value);
switch (destType)
{
case MI_STRINGA:
case MI_INSTANCEA:
case MI_REFERENCEA:
{
return 0;
}
case MI_DATETIMEA:
{
MI_DatetimeA* q;
NEW_ARRAY_T(q, MI_Datetime, p->size);
for (i = 0; i < p->size; i++)
{
if (_StrToDatetime(p->data[i], &q->data[i]) != 0)
return -1;
}
*value = q;
return 0;
}
default:
return -1;
}
}
default:
break;
}
return -1;
}