number init and number write with optionals

This commit is contained in:
Juri Glass 2011-07-11 13:16:50 +02:00
parent 268bfe423c
commit b1d3536ba8
4 changed files with 90 additions and 5 deletions

View file

@ -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;

View file

@ -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];

View file

@ -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);
}

View file

@ -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) {