number init and number write with optionals
This commit is contained in:
parent
268bfe423c
commit
b1d3536ba8
4 changed files with 90 additions and 5 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue