binarybuffer: simplify the prototype of str_to_buf()

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 <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/8394
Tested-by: jenkins
Reviewed-by: Jan Matyas <jan.matyas@codasip.com>
This commit is contained in:
Antonio Borneo 2024-07-14 12:09:15 +02:00
parent ea859e1cd0
commit 8a3efbf21f
3 changed files with 20 additions and 33 deletions

View File

@ -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);
assert(str);
if (radix == 0)
radix = str_radix_guess(str);
unsigned int radix = str_radix_guess(str);
if (_detected_radix)
*_detected_radix = radix;
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)

View File

@ -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);

View File

@ -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;