void sml_proc_par_value_free(sml_proc_par_value *ppv) { if (ppv) { if (ppv->tag) { switch (*(ppv->tag)) { case SML_PROC_PAR_VALUE_TAG_VALUE: sml_value_free(ppv->data.value); break; case SML_PROC_PAR_VALUE_TAG_PERIOD_ENTRY: sml_period_entry_free(ppv->data.period_entry); break; case SML_PROC_PAR_VALUE_TAG_TUPEL_ENTRY: sml_tupel_entry_free(ppv->data.tupel_entry); break; case SML_PROC_PAR_VALUE_TAG_TIME: sml_time_free(ppv->data.time); break; default: if (ppv->data.value) { free(ppv->data.value); } } sml_number_free(ppv->tag); } else { // Without the tag, there might be a memory leak. if (ppv->data.value) { free(ppv->data.value); } } free(ppv); } }
TEST(sml_value, parse_optional) { hex2binary("01", sml_buf_get_current_buf(buf)); sml_value *v = sml_value_parse(buf); TEST_ASSERT_NULL(v); TEST_ASSERT_EQUAL(1, buf->cursor); sml_value_free( v ); }
TEST(sml_value, parse_integer64_fewer_bytes) { hex2binary("58FFFFFFFFFFFF0F", sml_buf_get_current_buf(buf)); sml_value *v = sml_value_parse(buf); TEST_ASSERT_EQUAL(-241, *(v->data.int64)); TEST_ASSERT_EQUAL((SML_TYPE_INTEGER | SML_TYPE_NUMBER_64), v->type); sml_value_free( v ); }
TEST(sml_value, write_octet_string) { sml_value *v = sml_value_init(); v->type = SML_TYPE_OCTET_STRING; v->data.bytes = sml_octet_string_init((unsigned char *)"Hallo", 5); sml_value_write(v, buf); expected_buf(buf, "0648616C6C6F", 6); sml_value_free( v ); }
TEST(sml_value, parse_boolean) { hex2binary("4200", sml_buf_get_current_buf(buf)); sml_value *v = sml_value_parse(buf); TEST_ASSERT_NOT_NULL(v); TEST_ASSERT_EQUAL(SML_TYPE_BOOLEAN, v->type); TEST_ASSERT_FALSE(*(v->data.boolean)); sml_value_free( v ); }
TEST(sml_value, parse_octet_string) { hex2binary("0648616C6C6F", sml_buf_get_current_buf(buf)); sml_value *v = sml_value_parse(buf); TEST_ASSERT_NOT_NULL(v); TEST_ASSERT_EQUAL(SML_TYPE_OCTET_STRING, v->type); expected_octet_string(v->data.bytes, "Hallo", 5); sml_value_free( v ); }
TEST(sml_value, write_integer16) { sml_value *v = sml_value_init(); v->type = SML_TYPE_INTEGER | SML_TYPE_NUMBER_16; v->data.int16 = sml_i16_init(-5); sml_value_write(v, buf); expected_buf(buf, "53FFFB", 3); sml_value_free( v ); }
TEST(sml_value, write_unsigned32) { sml_value *v = sml_value_init(); v->type = SML_TYPE_UNSIGNED | SML_TYPE_NUMBER_32; v->data.uint32 = sml_u32_init(42); sml_value_write(v, buf); expected_buf(buf, "650000002A", 5); sml_value_free( v ); }
TEST(sml_value, write_boolean) { sml_value *v = sml_value_init(); v->type = SML_TYPE_BOOLEAN; v->data.boolean = sml_boolean_init(SML_BOOLEAN_FALSE); sml_value_write(v, buf); expected_buf(buf, "4200", 2); sml_value_free( v ); }
static void sml_value_entry_free_( void * p ) { sml_value_entry * entry = p; if (entry) { sml_value_free(entry->value); sml_signature_free(entry->value_signature); free(entry); } }
TEST(sml_value, parse_unsigned32) { hex2binary("6500000001", sml_buf_get_current_buf(buf)); sml_value *v = sml_value_parse(buf); TEST_ASSERT_NOT_NULL(v); TEST_ASSERT_EQUAL(1, *(v->data.uint32)); TEST_ASSERT_EQUAL((SML_TYPE_UNSIGNED | SML_TYPE_NUMBER_32), v->type); TEST_ASSERT_EQUAL(5, buf->cursor); sml_value_free( v ); }
void sml_period_entry_free(sml_period_entry *period) { if (period) { sml_octet_string_free(period->obj_name); sml_unit_free(period->unit); sml_number_free(period->scaler); sml_value_free(period->value); sml_octet_string_free(period->value_signature); free(period); } }
sml_value *sml_value_parse(sml_buffer *buf) { if (sml_buf_optional_is_skipped(buf)) { return 0; } int max = 1; int type = sml_buf_get_next_type(buf); unsigned char byte = sml_buf_get_current_byte(buf); sml_value *value = sml_value_init(); value->type = type; switch (type) { case SML_TYPE_OCTET_STRING: value->data.bytes = sml_octet_string_parse(buf); break; case SML_TYPE_BOOLEAN: value->data.boolean = sml_boolean_parse(buf); break; case SML_TYPE_UNSIGNED: case SML_TYPE_INTEGER: // get maximal size, if not all bytes are used (example: only 6 bytes for a u64) while (max < ((byte & SML_LENGTH_FIELD) - 1)) { max <<= 1; } value->data.uint8 = sml_number_parse(buf, type, max); value->type |= max; break; default: buf->error = 1; break; } if (sml_buf_has_errors(buf)) { sml_value_free(value); return 0; } return value; }
TEST(sml_value, init) { sml_value *v = sml_value_init(); TEST_ASSERT_NOT_NULL(v); sml_value_free( v ); }