示例#1
0
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);
	}
}
示例#2
0
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 );
}
示例#3
0
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 );
}
示例#4
0
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 );
}
示例#5
0
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 );
}
示例#6
0
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 );
}
示例#7
0
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 );
}
示例#8
0
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 );
}
示例#9
0
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);
	}
}
示例#11
0
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 );
}
示例#12
0
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);
	}
}
示例#13
0
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;
}
示例#14
0
TEST(sml_value, init) {
	sml_value *v = sml_value_init();
	TEST_ASSERT_NOT_NULL(v);
	sml_value_free( v );
}