Skip to content

Commit 272dee6

Browse files
author
Siebren Weertman
committed
add conversion for byte to/from unsigned (bigint) datatype
Signed-off-by: Siebren Weertman <[email protected]> const correctness and remove log Signed-off-by: Siebren Weertman <[email protected]>
1 parent 5d23b71 commit 272dee6

File tree

2 files changed

+73
-10
lines changed

2 files changed

+73
-10
lines changed

src/input/code_templates/c/static_code/exi_basetypes.c.jinja

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,14 @@ int exi_basetypes_convert_64_to_signed(exi_signed_t* exi_signed, int64_t value)
7878
return exi_basetypes_convert_64_to_unsigned(&exi_signed->data, value);
7979
}
8080

81-
int exi_basetypes_convert_from_unsigned(exi_unsigned_t* exi_unsigned, uint32_t* value, size_t max_octets)
81+
int exi_basetypes_convert_from_unsigned(const exi_unsigned_t* exi_unsigned, uint32_t* value, size_t max_octets)
8282
{
8383
if (exi_unsigned->octets_count > max_octets)
8484
{
8585
return EXI_ERROR__OCTET_COUNT_LARGER_THAN_TYPE_SUPPORTS;
8686
}
8787

88-
uint8_t* current_octet = exi_unsigned->octets;
88+
const uint8_t* current_octet = exi_unsigned->octets;
8989
*value = 0;
9090

9191
for (size_t n = 0; n < exi_unsigned->octets_count; n++)
@@ -98,14 +98,14 @@ int exi_basetypes_convert_from_unsigned(exi_unsigned_t* exi_unsigned, uint32_t*
9898
return EXI_ERROR__NO_ERROR;
9999
}
100100

101-
int exi_basetypes_convert_64_from_unsigned(exi_unsigned_t* exi_unsigned, uint64_t* value)
101+
int exi_basetypes_convert_64_from_unsigned(const exi_unsigned_t* exi_unsigned, uint64_t* value)
102102
{
103103
if (exi_unsigned->octets_count > EXI_BASETYPES_UINT64_MAX_OCTETS)
104104
{
105105
return EXI_ERROR__OCTET_COUNT_LARGER_THAN_TYPE_SUPPORTS;
106106
}
107107

108-
uint8_t* current_octet = exi_unsigned->octets;
108+
const uint8_t* current_octet = exi_unsigned->octets;
109109
*value = 0;
110110

111111
for (size_t n = 0; n < exi_unsigned->octets_count; n++)
@@ -118,19 +118,79 @@ int exi_basetypes_convert_64_from_unsigned(exi_unsigned_t* exi_unsigned, uint64_
118118
return EXI_ERROR__NO_ERROR;
119119
}
120120

121-
int exi_basetypes_convert_from_signed(exi_signed_t* exi_signed, int32_t* value, size_t max_octets)
121+
int exi_basetypes_convert_from_signed(const exi_signed_t* exi_signed, int32_t* value, size_t max_octets)
122122
{
123123
uint32_t uValue = 0;
124124
int res = exi_basetypes_convert_from_unsigned(&exi_signed->data, &uValue, max_octets);
125125
*value = (exi_signed->is_negative == 0) ? uValue : -uValue;
126126
return res;
127127
}
128128

129-
int exi_basetypes_convert_64_from_signed(exi_signed_t* exi_signed, int64_t* value)
129+
int exi_basetypes_convert_64_from_signed(const exi_signed_t* exi_signed, int64_t* value)
130130
{
131131
uint64_t uValue = 0;
132132
int res = exi_basetypes_convert_64_from_unsigned(&exi_signed->data, &uValue);
133133
*value = (exi_signed->is_negative == 0) ? uValue : -uValue;
134134
return res;
135135
}
136+
137+
int exi_basetypes_convert_bytes_from_unsigned(const exi_unsigned_t* exi_unsigned, uint8_t* data, size_t* data_len, size_t data_size)
138+
{
139+
const uint8_t* current_octet = exi_unsigned->octets;
140+
uint16_t temp = 0;
141+
*data_len = 0;
142+
size_t total_offset = 0;
143+
144+
for (size_t n = 0; n < exi_unsigned->octets_count; n++) {
145+
temp = temp + ((uint16_t)(*current_octet & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK) << (total_offset));
146+
total_offset += 7;
147+
if (total_offset >= 8) {
148+
if (data_size == *data_len) {
149+
return -1;
150+
}
151+
total_offset -= 8;
152+
data[(*data_len)++] = temp & 0xFF;
153+
temp >>= 8;
154+
}
155+
current_octet++;
156+
}
157+
if (total_offset != 0) {
158+
if (data_size == *data_len) {
159+
return -1;
160+
}
161+
data[(*data_len)++] = temp & 0xFF;
162+
}
163+
return 0;
164+
}
165+
166+
int exi_basetypes_convert_bytes_to_unsigned(exi_unsigned_t* exi_unsigned, const uint8_t* data, size_t data_len)
167+
{
168+
uint8_t *current_octet = &exi_unsigned->octets[0];
169+
uint16_t dummy;
170+
uint8_t dummy_count = 0;
171+
172+
for (size_t n = 0; n != data_len; n++, current_octet++) {
173+
if (dummy_count <= 8) {
174+
dummy = dummy | ((data[n]) << dummy_count);
175+
dummy_count += 8;
176+
}
177+
exi_unsigned->octets_count++;
178+
*current_octet = (uint8_t)(dummy & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK);
179+
180+
dummy = dummy >> 7u;
181+
dummy_count -= 7;
182+
if (n == data_len) {
183+
break;
184+
}
185+
186+
*current_octet |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK;
187+
}
188+
if (dummy_count > 0) {
189+
*(current_octet-1) |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK;
190+
exi_unsigned->octets_count++;
191+
*current_octet = (uint8_t)(dummy & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK);
192+
}
193+
return 0;
194+
}
195+
136196
{% endblock %}

src/input/code_templates/c/static_code/exi_basetypes.h.jinja

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,15 @@ typedef char exi_character_t;
5151
int exi_basetypes_convert_to_unsigned(exi_unsigned_t* exi_unsigned, uint32_t value, size_t max_octets);
5252
int exi_basetypes_convert_64_to_unsigned(exi_unsigned_t* exi_unsigned, uint64_t value);
5353

54-
int exi_basetypes_convert_from_unsigned(exi_unsigned_t* exi_unsigned, uint32_t* value, size_t max_octets);
55-
int exi_basetypes_convert_64_from_unsigned(exi_unsigned_t* exi_unsigned, uint64_t* value);
54+
int exi_basetypes_convert_from_unsigned(const exi_unsigned_t* exi_unsigned, uint32_t* value, size_t max_octets);
55+
int exi_basetypes_convert_64_from_unsigned(const exi_unsigned_t* exi_unsigned, uint64_t* value);
5656

5757
int exi_basetypes_convert_to_signed(exi_signed_t* exi_signed, int32_t value, size_t max_octets);
5858
int exi_basetypes_convert_64_to_signed(exi_signed_t* exi_signed, int64_t value);
5959

60-
int exi_basetypes_convert_from_signed(exi_signed_t* exi_unsigned, int32_t* value, size_t max_octets);
61-
int exi_basetypes_convert_64_from_signed(exi_signed_t* exi_unsigned, int64_t* value);
60+
int exi_basetypes_convert_from_signed(const exi_signed_t* exi_unsigned, int32_t* value, size_t max_octets);
61+
int exi_basetypes_convert_64_from_signed(const exi_signed_t* exi_unsigned, int64_t* value);
62+
63+
int exi_basetypes_convert_bytes_from_unsigned(const exi_unsigned_t* exi_unsigned, uint8_t* data, size_t* data_len, size_t data_size);
64+
int exi_basetypes_convert_bytes_to_unsigned(exi_unsigned_t* exi_unsigned, const uint8_t* data, size_t data_len);
6265
{% endblock %}

0 commit comments

Comments
 (0)