Add uint256_to_decimal to replace tostring256
TODO: replace tostring256 everywhere
This commit is contained in:
29
src/utils.c
29
src/utils.c
@@ -72,16 +72,39 @@ uint32_t u32_from_BE(uint8_t *in, uint8_t size, bool strict) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool uint256_to_decimal(const uint8_t *value, char *out, size_t out_len) {
|
||||||
|
uint16_t n[16];
|
||||||
|
uint16_t *p = (uint16_t *) value;
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
n[i] = __builtin_bswap16(*p++);
|
||||||
|
}
|
||||||
|
int pos = out_len;
|
||||||
|
while (!allzeroes(n, sizeof(n))) {
|
||||||
|
if (pos == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
pos -= 1;
|
||||||
|
int carry = 0;
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
int rem = ((carry << 16) | n[i]) % 10;
|
||||||
|
n[i] = ((carry << 16) | n[i]) / 10;
|
||||||
|
carry = rem;
|
||||||
|
}
|
||||||
|
out[pos] = '0' + carry;
|
||||||
|
}
|
||||||
|
memmove(out, out + pos, out_len - pos);
|
||||||
|
out[out_len - pos] = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void amountToString(uint8_t *amount,
|
void amountToString(uint8_t *amount,
|
||||||
uint8_t amount_size,
|
uint8_t amount_size,
|
||||||
uint8_t decimals,
|
uint8_t decimals,
|
||||||
char *ticker,
|
char *ticker,
|
||||||
char *out_buffer,
|
char *out_buffer,
|
||||||
uint8_t out_buffer_size) {
|
uint8_t out_buffer_size) {
|
||||||
uint256_t amount_256;
|
|
||||||
char tmp_buffer[100];
|
char tmp_buffer[100];
|
||||||
convertUint256BE(amount, amount_size, &amount_256);
|
uint256_to_decimal(amount, tmp_buffer, 100);
|
||||||
tostring256(&amount_256, 10, tmp_buffer, 100);
|
|
||||||
|
|
||||||
uint8_t amount_len = strnlen(tmp_buffer, sizeof(tmp_buffer));
|
uint8_t amount_len = strnlen(tmp_buffer, sizeof(tmp_buffer));
|
||||||
uint8_t ticker_len = strnlen(ticker, MAX_TICKER_LEN);
|
uint8_t ticker_len = strnlen(ticker, MAX_TICKER_LEN);
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ int local_strchr(char* string, char ch);
|
|||||||
// throw if the size is > 4.
|
// throw if the size is > 4.
|
||||||
uint32_t u32_from_BE(uint8_t* in, uint8_t size, bool strict);
|
uint32_t u32_from_BE(uint8_t* in, uint8_t size, bool strict);
|
||||||
|
|
||||||
|
bool uint256_to_decimal(const uint8_t *value, char *out, size_t out_len);
|
||||||
|
|
||||||
void amountToString(uint8_t* amount,
|
void amountToString(uint8_t* amount,
|
||||||
uint8_t amount_len,
|
uint8_t amount_len,
|
||||||
uint8_t decimals,
|
uint8_t decimals,
|
||||||
|
|||||||
Reference in New Issue
Block a user