libsml/sml/src/sml_value.c
Juri Glass 8bde857aee initial commit
basic functionalities are in, though some parts 
are missing
2011-06-16 12:41:21 +02:00

108 lines
2.9 KiB
C

#include <sml/sml_value.h>
#include <stdio.h>
sml_value *sml_value_parse(sml_buffer *buf) {
int type = mc_sml_buf_get_current_type(buf);
unsigned char byte = mc_sml_buf_get_current_byte(buf);
sml_value *value = (sml_value *) malloc(sizeof(sml_value));
value->type = type;
switch (type) {
case SML_TYPE_OCTET_STRING:
value->data.bytes = sml_octet_string_parse(buf);
break;
case SML_TYPE_UNSIGNED:
switch (byte & SML_LENGTH_FIELD) {
case SML_TYPE_NUMBER_8:
value->data.uint8 = mc_sml_parse_u8(buf);
value->type |= SML_TYPE_NUMBER_8;
break;
case SML_TYPE_NUMBER_16:
value->data.uint16 = mc_sml_parse_u16(buf);
value->type |= SML_TYPE_NUMBER_16;
break;
case SML_TYPE_NUMBER_16 + 1:
case SML_TYPE_NUMBER_32:
value->data.uint32 = mc_sml_parse_u32(buf);
value->type |= SML_TYPE_NUMBER_32;
break;
case SML_TYPE_NUMBER_32 + 1:
case SML_TYPE_NUMBER_32 + 2:
case SML_TYPE_NUMBER_32 + 3:
case SML_TYPE_NUMBER_64:
value->data.uint64 = mc_sml_parse_u64(buf);
value->type |= SML_TYPE_NUMBER_64;
break;
default:
buf->error = 1;
break;
}
break;
case SML_TYPE_INTEGER:
//switch (byte & SML_LENGTH_FIELD) {
// Integer 59 00 00 00 00 00 01 20 09 could'nt be evaluated cause (byte & SML_LENGTH_FIELD)=9
// but 8 is maximum :( -> now it's working
// TODO: check if same problem exists for other SML_TYPEs too
switch ((byte & SML_LENGTH_FIELD)-1) {
case SML_TYPE_NUMBER_8:
value->data.int8 = mc_sml_parse_i8(buf);
value->type |= SML_TYPE_NUMBER_8;
break;
case SML_TYPE_NUMBER_16:
value->data.int16 = mc_sml_parse_i16(buf);
value->type |= SML_TYPE_NUMBER_16;
break;
case SML_TYPE_NUMBER_16 + 1:
case SML_TYPE_NUMBER_32:
value->data.int32 = mc_sml_parse_i32(buf);
value->type |= SML_TYPE_NUMBER_32;
break;
case SML_TYPE_NUMBER_32 + 1:
case SML_TYPE_NUMBER_32 + 2:
case SML_TYPE_NUMBER_32 + 3:
case SML_TYPE_NUMBER_64:
value->data.int64 = mc_sml_parse_i64(buf);
value->type |= SML_TYPE_NUMBER_64;
break;
default:
buf->error = 1;
break;
}
break;
default:
buf->error = 1;
break;
}
if (mc_sml_buf_has_errors(buf)) {
free(value);
return 0;
}
return value;
}
void sml_value_write(sml_value *value, sml_buffer *buf) {
if (value->type == SML_TYPE_BOOLEAN) {
sml_boolean_write(value->data.boolean, buf);
}
}
sml_value *sml_value_init() {
sml_value *value = (sml_value *) malloc(sizeof(sml_value));
memset(value, 0, sizeof(value));
return value;
}
void sml_value_free(sml_value *value) {
if (value) {
if (value->type == SML_TYPE_OCTET_STRING) {
sml_octet_string_free(value->data.bytes);
}
free(value);
}
}