Implemented variable_set_from()
This commit is contained in:
parent
aae034336a
commit
c0b190cb16
232
src/variable.c
232
src/variable.c
|
@ -64,126 +64,14 @@ static const size_t _variable_sizes[VT_COUNT] = { 0, 1,
|
||||||
Variable * variable_new(VariableType type, void * value)
|
Variable * variable_new(VariableType type, void * value)
|
||||||
{
|
{
|
||||||
Variable * variable;
|
Variable * variable;
|
||||||
int8_t * i8;
|
|
||||||
uint8_t * u8;
|
|
||||||
int16_t * i16;
|
|
||||||
uint16_t * u16;
|
|
||||||
int32_t * i32;
|
|
||||||
uint32_t * u32;
|
|
||||||
int64_t * i64;
|
|
||||||
uint64_t * u64;
|
|
||||||
float * f;
|
|
||||||
double * d;
|
|
||||||
Buffer * b;
|
|
||||||
char const * s;
|
|
||||||
|
|
||||||
if((variable = object_new(sizeof(*variable))) == NULL)
|
if((variable = object_new(sizeof(*variable))) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
memset(&variable->u, 0, sizeof(variable->u));
|
if(variable_set_from(variable, type, value) != 0)
|
||||||
if(value == NULL)
|
{
|
||||||
variable->type = VT_NULL;
|
object_delete(variable);
|
||||||
else
|
return NULL;
|
||||||
switch((variable->type = type))
|
}
|
||||||
{
|
|
||||||
case VT_NULL:
|
|
||||||
break;
|
|
||||||
case VT_BOOL:
|
|
||||||
u8 = value;
|
|
||||||
variable->u.uint8 = (*u8 != 0) ? 1 : 0;
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s(%u)\n", __func__,
|
|
||||||
variable->u.uint8);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case VT_INT8:
|
|
||||||
i8 = value;
|
|
||||||
variable->u.int8 = *i8;
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s(%d)\n", __func__,
|
|
||||||
variable->u.int8);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case VT_UINT8:
|
|
||||||
u8 = value;
|
|
||||||
variable->u.uint8 = *u8;
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s(%u)\n", __func__,
|
|
||||||
variable->u.uint8);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case VT_INT16:
|
|
||||||
i16 = value;
|
|
||||||
variable->u.int16 = *i16;
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s(%d)\n", __func__,
|
|
||||||
*i16);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case VT_UINT16:
|
|
||||||
u16 = value;
|
|
||||||
variable->u.uint16 = *u16;
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s(%u)\n", __func__,
|
|
||||||
*u16);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case VT_INT32:
|
|
||||||
i32 = value;
|
|
||||||
variable->u.int32 = *i32;
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s(%d)\n", __func__,
|
|
||||||
*i32);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case VT_UINT32:
|
|
||||||
u32 = value;
|
|
||||||
variable->u.uint32 = *u32;
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s(%u)\n", __func__,
|
|
||||||
*u32);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case VT_INT64:
|
|
||||||
i64 = value;
|
|
||||||
variable->u.int64 = *i64;
|
|
||||||
break;
|
|
||||||
case VT_UINT64:
|
|
||||||
u64 = value;
|
|
||||||
variable->u.uint64 = *u64;
|
|
||||||
break;
|
|
||||||
case VT_FLOAT:
|
|
||||||
f = value;
|
|
||||||
variable->u.f = *f;
|
|
||||||
break;
|
|
||||||
case VT_DOUBLE:
|
|
||||||
d = value;
|
|
||||||
variable->u.d = *d;
|
|
||||||
break;
|
|
||||||
case VT_BUFFER:
|
|
||||||
if((b = buffer_new_copy(value)) == NULL)
|
|
||||||
{
|
|
||||||
object_delete(variable);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
variable->u.buffer = b;
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s(%p)\n", __func__,
|
|
||||||
(void *)b);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case VT_STRING:
|
|
||||||
s = value;
|
|
||||||
if((variable->u.string = string_new(s)) == NULL)
|
|
||||||
{
|
|
||||||
object_delete(variable);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__,
|
|
||||||
s);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return variable;
|
return variable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -655,8 +543,114 @@ VariableType variable_get_type(Variable * variable)
|
||||||
/* variable_set_from */
|
/* variable_set_from */
|
||||||
int variable_set_from(Variable * variable, VariableType type, void * value)
|
int variable_set_from(Variable * variable, VariableType type, void * value)
|
||||||
{
|
{
|
||||||
/* FIXME implement */
|
int8_t * i8;
|
||||||
return -1;
|
uint8_t * u8;
|
||||||
|
int16_t * i16;
|
||||||
|
uint16_t * u16;
|
||||||
|
int32_t * i32;
|
||||||
|
uint32_t * u32;
|
||||||
|
int64_t * i64;
|
||||||
|
uint64_t * u64;
|
||||||
|
float * f;
|
||||||
|
double * d;
|
||||||
|
Buffer * b;
|
||||||
|
char const * s;
|
||||||
|
|
||||||
|
memset(&variable->u, 0, sizeof(variable->u));
|
||||||
|
if(value == NULL)
|
||||||
|
type = VT_NULL;
|
||||||
|
switch((variable->type = type))
|
||||||
|
{
|
||||||
|
case VT_NULL:
|
||||||
|
break;
|
||||||
|
case VT_BOOL:
|
||||||
|
u8 = value;
|
||||||
|
variable->u.uint8 = (*u8 != 0) ? 1 : 0;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(%u)\n", __func__,
|
||||||
|
variable->u.uint8);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case VT_INT8:
|
||||||
|
i8 = value;
|
||||||
|
variable->u.int8 = *i8;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(%d)\n", __func__,
|
||||||
|
variable->u.int8);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case VT_UINT8:
|
||||||
|
u8 = value;
|
||||||
|
variable->u.uint8 = *u8;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(%u)\n", __func__,
|
||||||
|
variable->u.uint8);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case VT_INT16:
|
||||||
|
i16 = value;
|
||||||
|
variable->u.int16 = *i16;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(%d)\n", __func__, *i16);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case VT_UINT16:
|
||||||
|
u16 = value;
|
||||||
|
variable->u.uint16 = *u16;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(%u)\n", __func__, *u16);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case VT_INT32:
|
||||||
|
i32 = value;
|
||||||
|
variable->u.int32 = *i32;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(%d)\n", __func__, *i32);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case VT_UINT32:
|
||||||
|
u32 = value;
|
||||||
|
variable->u.uint32 = *u32;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(%u)\n", __func__, *u32);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case VT_INT64:
|
||||||
|
i64 = value;
|
||||||
|
variable->u.int64 = *i64;
|
||||||
|
break;
|
||||||
|
case VT_UINT64:
|
||||||
|
u64 = value;
|
||||||
|
variable->u.uint64 = *u64;
|
||||||
|
break;
|
||||||
|
case VT_FLOAT:
|
||||||
|
f = value;
|
||||||
|
variable->u.f = *f;
|
||||||
|
break;
|
||||||
|
case VT_DOUBLE:
|
||||||
|
d = value;
|
||||||
|
variable->u.d = *d;
|
||||||
|
break;
|
||||||
|
case VT_BUFFER:
|
||||||
|
if((b = buffer_new_copy(value)) == NULL)
|
||||||
|
return -1;
|
||||||
|
variable->u.buffer = b;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(%p)\n", __func__, (void *)b);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case VT_STRING:
|
||||||
|
s = value;
|
||||||
|
if((variable->u.string = string_new(s)) == NULL)
|
||||||
|
return -1;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, s);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user