diff options
Diffstat (limited to 'lib/libavb/avb_util.c')
| -rw-r--r-- | lib/libavb/avb_util.c | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/lib/libavb/avb_util.c b/lib/libavb/avb_util.c index 8719ede15a7..25af46075a7 100644 --- a/lib/libavb/avb_util.c +++ b/lib/libavb/avb_util.c @@ -4,11 +4,17 @@ */ #include "avb_util.h" -#include <log.h> -#include <malloc.h> #include <stdarg.h> +uint16_t avb_be16toh(uint16_t in) { + uint8_t* d = (uint8_t*)∈ + uint16_t ret; + ret = ((uint16_t)d[0]) << 8; + ret |= ((uint16_t)d[1]); + return ret; +} + uint32_t avb_be32toh(uint32_t in) { uint8_t* d = (uint8_t*)∈ uint32_t ret; @@ -33,6 +39,17 @@ uint64_t avb_be64toh(uint64_t in) { return ret; } +/* Converts a 16-bit unsigned integer from host to big-endian byte order. */ +uint16_t avb_htobe16(uint16_t in) { + union { + uint16_t word; + uint8_t bytes[2]; + } ret; + ret.bytes[0] = (in >> 8) & 0xff; + ret.bytes[1] = in & 0xff; + return ret.word; +} + /* Converts a 32-bit unsigned integer from host to big-endian byte order. */ uint32_t avb_htobe32(uint32_t in) { union { @@ -159,6 +176,12 @@ bool avb_str_concat(char* buf, size_t str2_len) { uint64_t combined_len; + // Doesn't make sense to pass 0 for buf_size since there's + // no room for the terminating NUL byte. + if (buf_size == 0) { + return false; + } + if (!avb_safe_add(&combined_len, str1_len, str2_len)) { avb_error("Overflow when adding string sizes.\n"); return false; @@ -411,3 +434,22 @@ char* avb_bin2hex(const uint8_t* data, size_t data_len) { hex_data[n * 2] = '\0'; return hex_data; } + +size_t avb_uint64_to_base10(uint64_t value, + char digits[AVB_MAX_DIGITS_UINT64]) { + char rev_digits[AVB_MAX_DIGITS_UINT64]; + size_t n, num_digits; + + for (num_digits = 0; num_digits < AVB_MAX_DIGITS_UINT64 - 1;) { + rev_digits[num_digits++] = avb_div_by_10(&value) + '0'; + if (value == 0) { + break; + } + } + + for (n = 0; n < num_digits; n++) { + digits[n] = rev_digits[num_digits - 1 - n]; + } + digits[n] = '\0'; + return n; +} |
