From 45775f8d527096a65f4983480b9e21e727690c05 Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Mon, 21 Oct 2024 08:14:36 +0200 Subject: [PATCH 1/9] fix minor style issues Signed-off-by: Moritz Barsnick --- .../code_templates/c/static_code/exi_basetypes.c.jinja | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja index 6e4eb10..260eda0 100644 --- a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja +++ b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja @@ -21,7 +21,7 @@ int exi_basetypes_convert_to_unsigned(exi_unsigned_t* exi_unsigned, uint32_t val exi_unsigned->octets_count++; *current_octet = (uint8_t)(dummy & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK); - dummy = dummy >> 7u; + dummy >>= 7u; if (dummy == 0) { break; @@ -45,7 +45,7 @@ int exi_basetypes_convert_64_to_unsigned(exi_unsigned_t* exi_unsigned, uint64_t exi_unsigned->octets_count++; *current_octet = (uint8_t)(dummy & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK); - dummy = dummy >> 7u; + dummy >>= 7u; if (dummy == 0) { break; @@ -186,7 +186,7 @@ int exi_basetypes_convert_bytes_to_unsigned(exi_unsigned_t* exi_unsigned, const *current_octet |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK; } if (dummy_count > 0) { - *(current_octet-1) |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK; + *(current_octet - 1) |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK; exi_unsigned->octets_count++; *current_octet = (uint8_t)(dummy & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK); } From 235b87827315efda2d492f5486f2a35f47d16aa8 Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Mon, 21 Oct 2024 08:15:00 +0200 Subject: [PATCH 2/9] comment on size decision Signed-off-by: Moritz Barsnick --- src/input/code_templates/c/static_code/exi_basetypes.h.jinja | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/input/code_templates/c/static_code/exi_basetypes.h.jinja b/src/input/code_templates/c/static_code/exi_basetypes.h.jinja index 1ba195a..92f8e3d 100644 --- a/src/input/code_templates/c/static_code/exi_basetypes.h.jinja +++ b/src/input/code_templates/c/static_code/exi_basetypes.h.jinja @@ -16,6 +16,8 @@ #define EXI_STRING_MAX_LEN 64 #define EXI_BYTE_ARRAY_MAX_LEN 350 +// To support EXI integer 8/7 coding, this needs to be 8/7 of the desired +// size of 25 for EXI representation #define EXI_BASETYPES_MAX_OCTETS_SUPPORTED 29 #define EXI_BASETYPES_OCTET_SEQ_FLAG_MASK 0x80 From 89f70bcf7e98b3b8d9cdb7286d0764162c3bf229 Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Mon, 21 Oct 2024 08:16:04 +0200 Subject: [PATCH 3/9] signed decoder: convert EXI raw 7 bit integer octet array to 8 bit octet array Signed-off-by: Moritz Barsnick --- .../c/static_code/exi_basetypes_decoder.c.jinja | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/input/code_templates/c/static_code/exi_basetypes_decoder.c.jinja b/src/input/code_templates/c/static_code/exi_basetypes_decoder.c.jinja index 806cb3f..45a0cc6 100644 --- a/src/input/code_templates/c/static_code/exi_basetypes_decoder.c.jinja +++ b/src/input/code_templates/c/static_code/exi_basetypes_decoder.c.jinja @@ -357,7 +357,13 @@ int exi_basetypes_decoder_signed(exi_bitstream_t* stream, exi_signed_t* value) } value->is_negative = (sign == 0) ? 0 : 1; - error = exi_basetypes_decoder_unsigned(stream, &value->data); + exi_unsigned_t raw_value; + error = exi_basetypes_decoder_unsigned(stream, &raw_value); + if (error != EXI_ERROR__NO_ERROR) + { + return error; + } + error = exi_basetypes_convert_bytes_from_unsigned(&raw_value, value->data.octets, &value->data.octets_count, sizeof(raw_value.octets)); return error; } From 9b4171da3a2d6f77d9172ab3449171acd7bfef3c Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Mon, 21 Oct 2024 08:16:26 +0200 Subject: [PATCH 4/9] signed encoder: convert 8 bit octet array to EXI raw 7 bit integer octet array Signed-off-by: Moritz Barsnick --- .../c/static_code/exi_basetypes_encoder.c.jinja | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/input/code_templates/c/static_code/exi_basetypes_encoder.c.jinja b/src/input/code_templates/c/static_code/exi_basetypes_encoder.c.jinja index 8c43da1..95fb76f 100644 --- a/src/input/code_templates/c/static_code/exi_basetypes_encoder.c.jinja +++ b/src/input/code_templates/c/static_code/exi_basetypes_encoder.c.jinja @@ -175,7 +175,16 @@ int exi_basetypes_encoder_uint_64(exi_bitstream_t* stream, uint64_t value) int exi_basetypes_encoder_unsigned(exi_bitstream_t* stream, const exi_unsigned_t* value) { - return exi_basetypes_encoder_write_unsigned(stream, value); + int error; + exi_unsigned_t raw_exi_unsigned; + + error = exi_basetypes_convert_bytes_from_unsigned(value, raw_exi_unsigned.octets, &raw_exi_unsigned.octets_count, sizeof(value->octets)); + if (error != EXI_ERROR__NO_ERROR) + { + return error; + } + + return exi_basetypes_encoder_write_unsigned(stream, &raw_exi_unsigned); } /***************************************************************************** From cc31c50551044b317756f45b8e65daf058faccdb Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Thu, 24 Oct 2024 13:39:03 +0200 Subject: [PATCH 5/9] fix minor style issues For code readability. Signed-off-by: Moritz Barsnick --- .../code_templates/c/static_code/exi_basetypes.c.jinja | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja index 260eda0..edd47e9 100644 --- a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja +++ b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja @@ -145,20 +145,22 @@ int exi_basetypes_convert_bytes_from_unsigned(const exi_unsigned_t* exi_unsigned temp += ((uint16_t)(*current_octet & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK) << total_offset); total_offset += 7; if (total_offset >= 8) { - if (data_size == *data_len) { + if (*data_len >= data_size) { return EXI_ERROR__ENCODED_INTEGER_SIZE_LARGER_THAN_DESTINATION; } total_offset -= 8; - data[(*data_len)++] = temp & 0xFF; + data[*data_len] = temp & 0xFF; + (*data_len)++; temp >>= 8; } current_octet++; } if (total_offset != 0) { - if (data_size == *data_len) { + if (*data_len >= data_size) { return EXI_ERROR__ENCODED_INTEGER_SIZE_LARGER_THAN_DESTINATION; } - data[(*data_len)++] = temp & 0xFF; + data[*data_len] = temp & 0xFF; + (*data_len)++; } return EXI_ERROR__NO_ERROR; } From 57bdd1a33055e93ca22b3312a256d59535a04ad0 Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Thu, 24 Oct 2024 14:38:36 +0200 Subject: [PATCH 6/9] avoid adding zero bytes/octets at the ends of the sequences When adding the final byte or octet, skip it when its value is zero. Trailing 0-octets are meaningless in both cases and shouldn't be provided. Signed-off-by: Moritz Barsnick --- src/input/code_templates/c/static_code/exi_basetypes.c.jinja | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja index edd47e9..2d07432 100644 --- a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja +++ b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja @@ -155,7 +155,7 @@ int exi_basetypes_convert_bytes_from_unsigned(const exi_unsigned_t* exi_unsigned } current_octet++; } - if (total_offset != 0) { + if (total_offset != 0 && (temp & 0xFF) != 0) { if (*data_len >= data_size) { return EXI_ERROR__ENCODED_INTEGER_SIZE_LARGER_THAN_DESTINATION; } @@ -187,7 +187,7 @@ int exi_basetypes_convert_bytes_to_unsigned(exi_unsigned_t* exi_unsigned, const *current_octet |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK; } - if (dummy_count > 0) { + if (dummy_count > 0 && dummy != 0) { *(current_octet - 1) |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK; exi_unsigned->octets_count++; *current_octet = (uint8_t)(dummy & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK); From f5e6d0d164f13161a3e5526e385592e8b25891f2 Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Thu, 24 Oct 2024 14:41:28 +0200 Subject: [PATCH 7/9] drop dead code Found by review, confirmed by cppcheck. Also reorder the code lines to a more logical order. Signed-off-by: Moritz Barsnick --- .../code_templates/c/static_code/exi_basetypes.c.jinja | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja index 2d07432..88d6a8c 100644 --- a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja +++ b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja @@ -178,14 +178,10 @@ int exi_basetypes_convert_bytes_to_unsigned(exi_unsigned_t* exi_unsigned, const } exi_unsigned->octets_count++; *current_octet = (uint8_t)(dummy & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK); + *current_octet |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK; dummy >>= 7u; dummy_count -= 7; - if (n == data_len) { - break; - } - - *current_octet |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK; } if (dummy_count > 0 && dummy != 0) { *(current_octet - 1) |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK; From 95251387488b4c940de13426105b0f024d90dc1e Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Thu, 24 Oct 2024 14:59:54 +0200 Subject: [PATCH 8/9] implement array reversal function Signed-off-by: Moritz Barsnick --- .../c/static_code/exi_basetypes.c.jinja | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja index 88d6a8c..bd7be79 100644 --- a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja +++ b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja @@ -134,6 +134,24 @@ int exi_basetypes_convert_64_from_signed(const exi_signed_t* exi_signed, int64_t return res; } +static void _reverse_array(uint8_t* data, size_t data_size) +{ + if (!data || !data_size) + { + return; + } + + size_t i = 0; + size_t j = data_size - 1; + while (i < j) { + const uint8_t temp = data[i]; + data[i] = data[j]; + data[j] = temp; + i++; + j--; + } +} + int exi_basetypes_convert_bytes_from_unsigned(const exi_unsigned_t* exi_unsigned, uint8_t* data, size_t* data_len, size_t data_size) { const uint8_t* current_octet = exi_unsigned->octets; From 98e3fd33e0d946f82c7e3d1aae809703ed142d56 Mon Sep 17 00:00:00 2001 From: Moritz Barsnick Date: Thu, 24 Oct 2024 15:07:33 +0200 Subject: [PATCH 9/9] reverse the byte orders of the raw large integer byte arrays Signed-off-by: Moritz Barsnick --- src/input/code_templates/c/static_code/exi_basetypes.c.jinja | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja index bd7be79..c70d006 100644 --- a/src/input/code_templates/c/static_code/exi_basetypes.c.jinja +++ b/src/input/code_templates/c/static_code/exi_basetypes.c.jinja @@ -180,6 +180,7 @@ int exi_basetypes_convert_bytes_from_unsigned(const exi_unsigned_t* exi_unsigned data[*data_len] = temp & 0xFF; (*data_len)++; } + _reverse_array(data, *data_len); return EXI_ERROR__NO_ERROR; } @@ -189,9 +190,9 @@ int exi_basetypes_convert_bytes_to_unsigned(exi_unsigned_t* exi_unsigned, const uint16_t dummy = 0; uint8_t dummy_count = 0; - for (size_t n = 0; n != data_len; n++, current_octet++) { + for (size_t n = 0; n < data_len; n++, current_octet++) { if (dummy_count <= 8) { - dummy |= (data[n] << dummy_count); + dummy |= (data[data_len - n - 1] << dummy_count); dummy_count += 8; } exi_unsigned->octets_count++;