helper: Code cleanup for hexify() 93/3793/4
authorMarc Schink <openocd-dev@marcschink.de>
Sun, 22 May 2016 18:35:34 +0000 (20:35 +0200)
committerPaul Fertser <fercerpav@gmail.com>
Thu, 8 Dec 2016 12:34:53 +0000 (12:34 +0000)
Simplify hexify() and do not longer use 0 as special case for the
parameter 'count' to determine the string length of the binary input.
Instead, use strlen() outside of the function if needed.
Additionally, fix the return value and return the length of the
converted string. The old function always returned 2 * count.

Also, use more appropriate data types for the function parameters and
add a small documentation.

Change-Id: I133a8ab786b8f7c1296afcaf9c0a0b43881e5112
Signed-off-by: Marc Schink <openocd-dev@marcschink.de>
Reviewed-on: http://openocd.zylin.com/3793
Tested-by: jenkins
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
src/helper/binarybuffer.c
src/helper/binarybuffer.h
src/jtag/drivers/ti_icdi_usb.c
src/rtos/linux.c
src/rtos/rtos.c
src/server/gdb_server.c
src/server/tcl_server.c
src/target/smp.c

index 26aa8cc..76f657f 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)
index b035779..f1da8c4 100644 (file)
@@ -235,7 +235,7 @@ void bit_copy_discard(struct bit_copy_queue *q);
 /* functions to convert to/from hex encoded buffer
  * used in ti-icdi driver and gdb server */
 size_t unhexify(uint8_t *bin, const char *hex, size_t count);
-int hexify(char *hex, const char *bin, int count, int out_maxlen);
+size_t hexify(char *hex, const uint8_t *bin, size_t count, size_t out_maxlen);
 void buffer_shr(void *_buf, unsigned buf_len, unsigned count);
 
 #endif /* OPENOCD_HELPER_BINARYBUFFER_H */
index 7a6272f..171ac66 100644 (file)
@@ -242,7 +242,8 @@ static int icdi_send_remote_cmd(void *handle, const char *data)
        struct icdi_usb_handle_s *h = handle;
 
        size_t cmd_len = sprintf(h->write_buffer, PACKET_START "qRcmd,");
-       cmd_len += hexify(h->write_buffer + cmd_len, data, 0, h->max_packet - cmd_len);
+       cmd_len += hexify(h->write_buffer + cmd_len, (const uint8_t *)data,
+               strlen(data), h->max_packet - cmd_len);
 
        return icdi_send_packet(handle, cmd_len);
 }
@@ -512,7 +513,7 @@ static int icdi_usb_write_reg(void *handle, int num, uint32_t val)
        h_u32_to_le(buf, val);
 
        int cmd_len = snprintf(cmd, sizeof(cmd), "P%x=", num);
-       hexify(cmd + cmd_len, (const char *)buf, 4, sizeof(cmd));
+       hexify(cmd + cmd_len, buf, 4, sizeof(cmd));
 
        result = icdi_send_cmd(handle, cmd);
        if (result != ERROR_OK)
index 31d6618..e5a4efc 100644 (file)
@@ -1229,7 +1229,8 @@ int linux_thread_extra_info(struct target *target,
                        sprintf(tmp_str_ptr, "%s", name);
                        sprintf(tmp_str_ptr, "%s", temp->name);
                        char *hex_str = calloc(1, strlen(tmp_str) * 2 + 1);
-                       int pkt_len = hexify(hex_str, tmp_str, 0, strlen(tmp_str) * 2 + 1);
+                       size_t pkt_len = hexify(hex_str, (const uint8_t *)tmp_str,
+                               strlen(tmp_str), strlen(tmp_str) * 2 + 1);
                        gdb_put_packet(connection, hex_str, pkt_len);
                        free(hex_str);
                        free(tmp_str);
index 6938336..84ee498 100644 (file)
@@ -266,7 +266,9 @@ int rtos_qsymbol(struct connection *connection, char const *packet, int packet_s
        }
 
        reply_len = snprintf(reply, sizeof(reply), "qSymbol:");
-       reply_len += hexify(reply + reply_len, next_sym->symbol_name, 0, sizeof(reply) - reply_len);
+       reply_len += hexify(reply + reply_len,
+               (const uint8_t *)next_sym->symbol_name, strlen(next_sym->symbol_name),
+               sizeof(reply) - reply_len);
 
 done:
        gdb_put_packet(connection, reply, reply_len);
@@ -321,7 +323,8 @@ int rtos_thread_packet(struct connection *connection, char const *packet, int pa
                                (size_t) (tmp_str_ptr - tmp_str));
 
                        char *hex_str = malloc(strlen(tmp_str) * 2 + 1);
-                       int pkt_len = hexify(hex_str, tmp_str, 0, strlen(tmp_str) * 2 + 1);
+                       size_t pkt_len = hexify(hex_str, (const uint8_t *)tmp_str,
+                               strlen(tmp_str), strlen(tmp_str) * 2 + 1);
 
                        gdb_put_packet(connection, hex_str, pkt_len);
                        free(hex_str);
index 6f111e1..fe00744 100644 (file)
@@ -697,7 +697,8 @@ static int gdb_output_con(struct connection *connection, const char *line)
                return ERROR_GDB_BUFFER_TOO_SMALL;
 
        hex_buffer[0] = 'O';
-       int pkt_len = hexify(hex_buffer + 1, line, bin_size, bin_size * 2 + 1);
+       size_t pkt_len = hexify(hex_buffer + 1, (const uint8_t *)line, bin_size,
+               bin_size * 2 + 1);
        int retval = gdb_put_packet(connection, hex_buffer, pkt_len + 1);
 
        free(hex_buffer);
@@ -1407,7 +1408,7 @@ static int gdb_read_memory_packet(struct connection *connection,
        if (retval == ERROR_OK) {
                hex_buffer = malloc(len * 2 + 1);
 
-               int pkt_len = hexify(hex_buffer, (char *)buffer, len, len * 2 + 1);
+               size_t pkt_len = hexify(hex_buffer, buffer, len, len * 2 + 1);
 
                gdb_put_packet(connection, hex_buffer, pkt_len);
 
index 15a8736..0077339 100644 (file)
@@ -105,7 +105,7 @@ static int tcl_target_callback_trace_handler(struct target *target,
        if (tclc->tc_trace) {
                hex = malloc(hex_len);
                buf = malloc(max_len);
-               hexify(hex, (const char *)data, len, hex_len);
+               hexify(hex, data, len, hex_len);
                snprintf(buf, max_len, "%s%s%s", header, hex, trailer);
                tcl_output(connection, buf, strlen(buf));
                free(hex);
index 3dc6f6d..bdf81a0 100644 (file)
@@ -64,7 +64,8 @@ int gdb_read_smp_packet(struct connection *connection,
                        char hex_buffer[len * 2 + 1];
                        uint8_t buffer[len];
                        buf_set_u32(buffer, 0, len * 8, target->gdb_service->core[0]);
-                       int pkt_len = hexify(hex_buffer, (char *)buffer, sizeof(buffer), sizeof(hex_buffer));
+                       size_t pkt_len = hexify(hex_buffer, buffer, sizeof(buffer),
+                               sizeof(hex_buffer));
 
                        retval = gdb_put_packet(connection, hex_buffer, pkt_len);
                }