From b1d3536ba805bbb65cf7de4de04610004f1d45e2 Mon Sep 17 00:00:00 2001 From: Juri Glass Date: Mon, 11 Jul 2011 13:16:50 +0200 Subject: [PATCH] number init and number write with optionals --- sml/include/sml/sml_number.h | 23 ++++++++++++++++- sml/src/sml_number.c | 23 +++++++++++++++++ test/src/sml_number_test.c | 43 +++++++++++++++++++++++++++++++- test/src/sml_octet_string_test.c | 6 ++--- 4 files changed, 90 insertions(+), 5 deletions(-) diff --git a/sml/include/sml/sml_number.h b/sml/include/sml/sml_number.h index 1f93762..b7675a4 100644 --- a/sml/include/sml/sml_number.h +++ b/sml/include/sml/sml_number.h @@ -27,11 +27,25 @@ extern "C" { #endif +void *sml_number_init(u64 number, unsigned char type, int size); + // Parses a number. Identified by type (SML_TYPE_INTEGER or SML_TYPE_UNSIGNED) // and maximal number of bytes (SML_TYPE_NUMBER_8, SML_TYPE_NUMBER_16, // SML_TYPE_NUMBER_32, SML_TYPE_NUMBER_64) void *sml_number_parse(sml_buffer *buf, unsigned char type, int max_size); +void sml_number_write(unsigned char type, int size, u64 value, sml_buffer *buf); +void sml_number_write_new(void *np, unsigned char type, int size, sml_buffer *buf); + +#define sml_u8_init(n) (u8 *) sml_number_init(n, SML_TYPE_UNSIGNED, SML_TYPE_NUMBER_8) +#define sml_u16_init(n) (u16 *) sml_number_init(n, SML_TYPE_UNSIGNED, SML_TYPE_NUMBER_16) +#define sml_u32_init(n) (u32 *) sml_number_init(n, SML_TYPE_UNSIGNED, SML_TYPE_NUMBER_32) +#define sml_u64_init(n) (u64 *) sml_number_init(n, SML_TYPE_UNSIGNED, SML_TYPE_NUMBER_64) +#define sml_i8_init(n) (i8 *) sml_number_init(n, SML_TYPE_INTEGER, SML_TYPE_NUMBER_8) +#define sml_i16_init(n) (i16 *) sml_number_init(n, SML_TYPE_INTEGER, SML_TYPE_NUMBER_16) +#define sml_i32_init(n) (i32 *) sml_number_init(n, SML_TYPE_INTEGER, SML_TYPE_NUMBER_32) +#define sml_i64_init(n) (i64 *) sml_number_init(n, SML_TYPE_INTEGER, SML_TYPE_NUMBER_64) + #define sml_u8_parse(buf) (u8 *) sml_number_parse(buf, SML_TYPE_UNSIGNED, SML_TYPE_NUMBER_8) #define sml_u16_parse(buf) (u16 *) sml_number_parse(buf, SML_TYPE_UNSIGNED, SML_TYPE_NUMBER_16) #define sml_u32_parse(buf) (u32 *) sml_number_parse(buf, SML_TYPE_UNSIGNED, SML_TYPE_NUMBER_32) @@ -41,7 +55,14 @@ void *sml_number_parse(sml_buffer *buf, unsigned char type, int max_size); #define sml_i32_parse(buf) (i32 *) sml_number_parse(buf, SML_TYPE_INTEGER, SML_TYPE_NUMBER_32) #define sml_i64_parse(buf) (i64 *) sml_number_parse(buf, SML_TYPE_INTEGER, SML_TYPE_NUMBER_64) -void sml_number_write(unsigned char type, int size, u64 value, sml_buffer *buf); +#define sml_u8_write(n, buf) sml_number_write_new(n, SML_TYPE_UNSIGNED, SML_TYPE_NUMBER_8, buf) +#define sml_u16_write(n, buf) sml_number_write_new(n, SML_TYPE_UNSIGNED, SML_TYPE_NUMBER_16, buf) +#define sml_u32_write(n, buf) sml_number_write_new(n, SML_TYPE_UNSIGNED, SML_TYPE_NUMBER_32, buf) +#define sml_u64_write(n, buf) sml_number_write_new(n, SML_TYPE_UNSIGNED, SML_TYPE_NUMBER_64, buf) +#define sml_i8_write(n, buf) sml_number_write_new(n, SML_TYPE_INTEGER, SML_TYPE_NUMBER_8, buf) +#define sml_i16_write(n, buf) sml_number_write_new(n, SML_TYPE_INTEGER, SML_TYPE_NUMBER_16, buf) +#define sml_i32_write(n, buf) sml_number_write_new(n, SML_TYPE_INTEGER, SML_TYPE_NUMBER_32, buf) +#define sml_i64_write(n, buf) sml_number_write_new(n, SML_TYPE_INTEGER, SML_TYPE_NUMBER_64, buf) typedef u8 sml_unit; diff --git a/sml/src/sml_number.c b/sml/src/sml_number.c index 04ee4f3..14de116 100644 --- a/sml/src/sml_number.c +++ b/sml/src/sml_number.c @@ -27,6 +27,13 @@ int sml_number_endian(); void sml_number_byte_swap(unsigned char *bytes, int bytes_len); +void *sml_number_init(u64 number, unsigned char type, int size) { + unsigned char *np = malloc(size); + memset(np, 0, size); + memcpy(np, &number, size); + return np; +} + void *sml_number_parse(sml_buffer *buf, unsigned char type, int max_size) { if (sml_buf_optional_is_skipped(buf)) { return 0; @@ -84,6 +91,22 @@ void sml_number_write(unsigned char type, int size, u64 value, sml_buffer *buf) buf->cursor += size; } +void sml_number_write_new(void *np, unsigned char type, int size, sml_buffer *buf) { + if (np == 0) { + sml_buf_optional_write(buf); + return; + } + + sml_buf_set_type_and_length(buf, type, size); + memcpy(sml_buf_get_current_buf(buf), np, size); + + if (!(sml_number_endian() == SML_BIG_ENDIAN)) { + sml_number_byte_swap(sml_buf_get_current_buf(buf), size); + } + + sml_buf_update_bytes_read(buf, size); +} + void sml_number_byte_swap(unsigned char *bytes, int bytes_len) { int i; unsigned char ob[bytes_len]; diff --git a/test/src/sml_number_test.c b/test/src/sml_number_test.c index e24a343..4ee4ace 100644 --- a/test/src/sml_number_test.c +++ b/test/src/sml_number_test.c @@ -25,12 +25,31 @@ TEST_GROUP(sml_number); sml_buffer *buf; +void sml_number_test_expected_buf(char *hex, int len) { + unsigned char expected_buf[len]; + hex2binary(hex, expected_buf); + TEST_ASSERT_EQUAL_MEMORY(expected_buf, buf->buffer, len); + TEST_ASSERT_EQUAL(len, buf->cursor); +} + TEST_SETUP(sml_number) { buf = sml_buffer_init(512); } TEST_TEAR_DOWN(sml_number) {} +TEST(sml_number, init_unsigned8) { + u8 *n = sml_u8_init(1); + TEST_ASSERT_NOT_NULL(n); + TEST_ASSERT_EQUAL(1, *n); +} + +TEST(sml_number, init_integer16) { + i16 *n = sml_i16_init(-1); + TEST_ASSERT_NOT_NULL(n); + TEST_ASSERT_EQUAL(-1, *n); +} + TEST(sml_number, parse_unsigned8) { hex2binary("6201", sml_buf_get_current_buf(buf)); u8 *n = sml_u8_parse(buf); @@ -64,7 +83,6 @@ TEST(sml_number, parse_unsigned32_optional) { TEST(sml_number, parse_unsigned64) { hex2binary("690000000000000001", sml_buf_get_current_buf(buf)); - //u64 *n = sml_u64_parse(buf); u64 *n = sml_u64_parse(buf); TEST_ASSERT_EQUAL(1, *n); } @@ -105,7 +123,27 @@ TEST(sml_number, parse_int64_fewer_bytes) { TEST_ASSERT_EQUAL(-5000, *n); } +TEST(sml_number, write_unsigned8) { + u8 *n = sml_u8_init(1); + sml_u8_write(n, buf); + sml_number_test_expected_buf("6201", 2); +} + +TEST(sml_number, write_integer32) { + i32 *n = sml_i32_init(-5000); + sml_i32_write(n, buf); + sml_number_test_expected_buf("55FFFFEC78", 5); +} + +TEST(sml_number, write_integer8_optional) { + sml_i8_write(0, buf); + sml_number_test_expected_buf("01", 1); +} + TEST_GROUP_RUNNER(sml_number) { + RUN_TEST_CASE(sml_number, init_unsigned8); + RUN_TEST_CASE(sml_number, init_integer16); + RUN_TEST_CASE(sml_number, parse_unsigned8); RUN_TEST_CASE(sml_number, parse_unsigned16); RUN_TEST_CASE(sml_number, parse_unsigned32); @@ -119,6 +157,9 @@ TEST_GROUP_RUNNER(sml_number) { RUN_TEST_CASE(sml_number, parse_int64); RUN_TEST_CASE(sml_number, parse_int64_fewer_bytes); + RUN_TEST_CASE(sml_number, write_unsigned8); + RUN_TEST_CASE(sml_number, write_integer32); + RUN_TEST_CASE(sml_number, write_integer8_optional); } diff --git a/test/src/sml_octet_string_test.c b/test/src/sml_octet_string_test.c index 5e8e61c..cb5c633 100644 --- a/test/src/sml_octet_string_test.c +++ b/test/src/sml_octet_string_test.c @@ -30,7 +30,7 @@ void expected_octet_string(octet_string *str, char *content, int len) { TEST_ASSERT_EQUAL_MEMORY(content, str->str, len); } -void expected_buf(char *hex, int len) { +void sml_octet_string_expected_buf(char *hex, int len) { unsigned char expected_buf[len]; hex2binary(hex, expected_buf); TEST_ASSERT_EQUAL_MEMORY(expected_buf, buf->buffer, len); @@ -75,12 +75,12 @@ TEST(sml_octet_string, parse_optional) { TEST(sml_octet_string, write) { octet_string *str = sml_octet_string_init((unsigned char *)"Hallo", 5); sml_octet_string_write(str, buf); - expected_buf("0648616C6C6F", 6); + sml_octet_string_expected_buf("0648616C6C6F", 6); } TEST(sml_octet_string, write_optional) { sml_octet_string_write(0, buf); - expected_buf("01", 1); + sml_octet_string_expected_buf("01", 1); } TEST_GROUP_RUNNER(sml_octet_string) {