Skip to content

Commit

Permalink
binarybuffer: simplify the prototype of str_to_buf()
Browse files Browse the repository at this point in the history
With 'radix' always zero and '_detected_radix' always NULL, drop
the two parameters and simplify str_to_buf().

While there:
- drop some redundant assert(),
- drop the re-check for the base prefix,
- simplify str_strip_number_prefix_if_present() and rename it, as
  the prefix MUST be present,
- fix a minor typo,
- update the doxygen description of str_to_buf().

Change-Id: I1abdc8ec0587b23881953d3094101c04d5bb1c58
Signed-off-by: Antonio Borneo <[email protected]>
Reviewed-on: https://review.openocd.org/c/openocd/+/8394
Tested-by: jenkins
Reviewed-by: Jan Matyas <[email protected]>
  • Loading branch information
borneoa committed Aug 25, 2024
1 parent ea859e1 commit 8a3efbf
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 33 deletions.
42 changes: 15 additions & 27 deletions src/helper/binarybuffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,49 +225,37 @@ static bool str_has_octal_prefix(const char *s)
*/
static unsigned int str_radix_guess(const char *str)
{
assert(str);

if (str_has_hex_prefix(str))
return 16;

if (str_has_octal_prefix(str))
return 8;

/* Otherwise assume a decadic number. */
/* Otherwise assume a decimal number. */
return 10;
}

/** Strip leading "0x" or "0X" from hex numbers or "0" from octal numbers. */
static void str_strip_number_prefix_if_present(const char **_str, unsigned int radix)
static const char *str_strip_number_prefix(const char *str, unsigned int radix)
{
assert(radix == 16 || radix == 10 || radix == 8);
assert(_str);

const char *str = *_str;
assert(str);

if (radix == 16 && str_has_hex_prefix(str))
str += 2;
else if (radix == 8 && str_has_octal_prefix(str))
str += 1;

/* No prefix to strip for radix == 10. */

*_str = str;
switch (radix) {
case 16:
return str + 2;
case 8:
return str + 1;
case 10:
default:
return str;
}
}

int str_to_buf(const char *str, void *_buf, unsigned int buf_len,
unsigned int radix, unsigned int *_detected_radix)
int str_to_buf(const char *str, void *_buf, unsigned int buf_len)
{
assert(radix == 0 || radix == 8 || radix == 10 || radix == 16);

if (radix == 0)
radix = str_radix_guess(str);
assert(str);

if (_detected_radix)
*_detected_radix = radix;
unsigned int radix = str_radix_guess(str);

str_strip_number_prefix_if_present(&str, radix);
str = str_strip_number_prefix(str, radix);

const size_t str_len = strlen(str);
if (str_len == 0)
Expand Down
9 changes: 4 additions & 5 deletions src/helper/binarybuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,15 +194,14 @@ void *buf_set_buf(const void *src, unsigned src_start,

/**
* Parse an unsigned number (provided as a zero-terminated string)
* into a bit buffer whose size is buf_len bits.
* into a bit buffer whose size is buf_len bits. The base of the
* number is detected between decimal, hexadecimal and octal.
* @param str Input number, zero-terminated string
* @param _buf Output buffer, allocated by the caller
* @param buf_len Output buffer size in bits
* @param radix Base of the input number - 16, 10, 8 or 0.
* 0 means auto-detect the radix.
* @returns Error on invalid or overflowing number
*/
int str_to_buf(const char *str, void *_buf, unsigned int buf_len,
unsigned int radix, unsigned int *_detected_radix);
int str_to_buf(const char *str, void *_buf, unsigned int buf_len);

char *buf_to_hex_str(const void *buf, unsigned size);

Expand Down
2 changes: 1 addition & 1 deletion src/helper/command.c
Original file line number Diff line number Diff line change
Expand Up @@ -1365,7 +1365,7 @@ COMMAND_HELPER(command_parse_str_to_buf, const char *str, void *buf, unsigned in
assert(str);
assert(buf);

int ret = str_to_buf(str, buf, buf_len, 0, NULL);
int ret = str_to_buf(str, buf, buf_len);
if (ret == ERROR_OK)
return ret;

Expand Down

0 comments on commit 8a3efbf

Please sign in to comment.