helper: Code cleanup for hexify()
[fw/openocd] / src / helper / binarybuffer.c
index 26aa8ccede30ce7f236da74ecbaf9aadae6095d8..76f657f8df8eb9b88758ff80b29b6370ee092e12 100644 (file)
@@ -45,6 +45,11 @@ static const unsigned char bit_reverse_table256[] = {
        0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
 };
 
+static const char hex_digits[] = {
+       '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+       'a', 'b', 'c', 'd', 'e', 'f'
+};
+
 void *buf_cpy(const void *from, void *_to, unsigned size)
 {
        if (NULL == from || NULL == _to)
@@ -407,18 +412,34 @@ size_t unhexify(uint8_t *bin, const char *hex, size_t count)
        return i / 2;
 }
 
-int hexify(char *hex, const char *bin, int count, int out_maxlen)
+/**
+ * Convert binary data into a string of hexadecimal pairs.
+ *
+ * @param[out] hex Buffer to store string of hexadecimal pairs. The buffer size
+ *                 must be at least @p length.
+ * @param[in] bin Buffer with binary data to convert into hexadecimal pairs.
+ * @param[in] count Number of bytes to convert.
+ * @param[in] length Maximum number of characters, including null-terminator,
+ *                   to store into @p hex.
+ *
+ * @returns The length of the converted string excluding null-terminator.
+ */
+size_t hexify(char *hex, const uint8_t *bin, size_t count, size_t length)
 {
-       int i, cmd_len = 0;
+       size_t i;
+       uint8_t tmp;
 
-       /* May use a length, or a null-terminated string as input. */
-       if (count == 0)
-               count = strlen(bin);
+       if (!length)
+               return 0;
 
-       for (i = 0; i < count; i++)
-               cmd_len += snprintf(hex + cmd_len, out_maxlen - cmd_len, "%02x", bin[i] & 0xff);
+       for (i = 0; i < length - 1 && i < 2 * count; i++) {
+               tmp = (bin[i / 2] >> (4 * ((i + 1) % 2))) & 0x0f;
+               hex[i] = hex_digits[tmp];
+       }
 
-       return cmd_len;
+       hex[i] = 0;
+
+       return i;
 }
 
 void buffer_shr(void *_buf, unsigned buf_len, unsigned count)