X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fhelper%2Fbinarybuffer.c;h=26aa8ccede30ce7f236da74ecbaf9aadae6095d8;hp=6fe3664a7fa09e1b94d1bf31623551e2fdad3a63;hb=674141e8a7a6413cb803d90c2a20150260015f81;hpb=4e79b48e2c7e535ef21178a69788c15b571c72ff diff --git a/src/helper/binarybuffer.c b/src/helper/binarybuffer.c index 6fe3664a7f..26aa8ccede 100644 --- a/src/helper/binarybuffer.c +++ b/src/helper/binarybuffer.c @@ -16,9 +16,7 @@ * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * + * along with this program. If not, see . * ***************************************************************************/ #ifdef HAVE_CONFIG_H @@ -148,7 +146,7 @@ void *buf_set_buf(const void *_src, unsigned src_start, if ((sq == 0) && (dq == 0) && (lq == 0)) { for (i = 0; i < lb; i++) *dst++ = *src++; - return (uint8_t *)_dst; + return _dst; } /* fallback to slow bit copy */ @@ -167,7 +165,7 @@ void *buf_set_buf(const void *_src, unsigned src_start, } } - return (uint8_t *)_dst; + return _dst; } uint32_t flip_u32(uint32_t value, unsigned int num) @@ -231,7 +229,7 @@ char *buf_to_str(const void *_buf, unsigned buf_len, unsigned radix) } } - const char *DIGITS = "0123456789ABCDEF"; + const char * const DIGITS = "0123456789ABCDEF"; for (unsigned j = 0; j < str_len; j++) str[j] = DIGITS[(int)str[j]]; @@ -371,17 +369,42 @@ void bit_copy_discard(struct bit_copy_queue *q) } } -int unhexify(char *bin, const char *hex, int count) +/** + * Convert a string of hexadecimal pairs into its binary + * representation. + * + * @param[out] bin Buffer to store binary representation. The buffer size must + * be at least @p count. + * @param[in] hex String with hexadecimal pairs to convert into its binary + * representation. + * @param[in] count Number of hexadecimal pairs to convert. + * + * @return The number of converted hexadecimal pairs. + */ +size_t unhexify(uint8_t *bin, const char *hex, size_t count) { - int i, tmp; + size_t i; + char tmp; - for (i = 0; i < count; i++) { - if (sscanf(hex + (2 * i), "%02x", &tmp) != 1) - return i; - bin[i] = tmp; + if (!bin || !hex) + return 0; + + memset(bin, 0, count); + + for (i = 0; i < 2 * count; i++) { + if (hex[i] >= 'a' && hex[i] <= 'f') + tmp = hex[i] - 'a' + 10; + else if (hex[i] >= 'A' && hex[i] <= 'F') + tmp = hex[i] - 'A' + 10; + else if (hex[i] >= '0' && hex[i] <= '9') + tmp = hex[i] - '0'; + else + return i / 2; + + bin[i / 2] |= tmp << (4 * ((i + 1) % 2)); } - return i; + return i / 2; } int hexify(char *hex, const char *bin, int count, int out_maxlen)