diff mbox series

[v2,12/14] lib: Support a decimal prefix 0n

Message ID 20210724150341.243074-13-sjg@chromium.org
State Deferred
Delegated to: Tom Rini
Headers show
Series lib: Add support for a decimal 0t prefix for numbers | expand

Commit Message

Simon Glass July 24, 2021, 3:03 p.m. UTC
U-Boot mostly uses hex for value input, largely because addresses are much
easier to understand in hex.

However sometimes it is useful to be able to supply a decimal value when a
hex value is expected.

Add this functionality, for increased flexibility.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Use 0n instead for the decimal prefix

 doc/usage/cmdline.rst |  7 +++++++
 include/vsprintf.h    |  6 ++++--
 lib/strto.c           |  3 +++
 test/str_ut.c         | 12 ++++++++++++
 4 files changed, 26 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/doc/usage/cmdline.rst b/doc/usage/cmdline.rst
index 88f18c974c8..ff0f8b77f1c 100644
--- a/doc/usage/cmdline.rst
+++ b/doc/usage/cmdline.rst
@@ -65,6 +65,13 @@  use of addresses, for example::
   00001000: 2c786f62 00697073 03000000 0c000000  box,spi.........
   00001010: 67020000 00000000                    ...g....
 
+In these cases it is possible to use a `0n` prefix to use a decimal value if
+that is more convenient. For example, this shows 19 bytes (0x13)::
+
+  => md.b 1000 0n19
+  00001000: 62 6f 78 2c 73 70 69 00 00 00 00 03 00 00 00 0c  box,spi.........
+  00001010: 00 00 02                                         ...
+
 There is no need to add a `0x` prefix to the arguments and the output is shown
 in hex also, without any prefixes. This helps to avoid clutter.
 
diff --git a/include/vsprintf.h b/include/vsprintf.h
index 604963dad61..1ff9562c41b 100644
--- a/include/vsprintf.h
+++ b/include/vsprintf.h
@@ -23,7 +23,8 @@ 
  * 0 is returned
  *
  * A hex prefix is supported (e.g. 0x123) regardless of the value of @base.
- * If found, the base is set to hex (16).
+ * If found, the base is set to hex (16). Similarly a decimal prefix (e.g. 0n12)
+ * causes the base to be set to decimal (10).
  *
  * If @base is 0:
  *    - an octal '0' prefix (e.g. 0777) sets the base to octal (8).
@@ -76,7 +77,8 @@  unsigned long dectoul(const char *cp, char **endp);
  * echo will append a newline to the tail.
  *
  * A hex prefix is supported (e.g. 0x123) regardless of the value of @base.
- * If found, the base is set to hex (16).
+ * If found, the base is set to hex (16). Similarly a decimal prefix (e.g. 0n12)
+ * causes the base to be set to decimal (10).
  *
  * If @base is 0:
  *    - an octal '0' prefix (e.g. 0777) sets the base to octal (8).
diff --git a/lib/strto.c b/lib/strto.c
index 54ee3e81f6a..0fdc3d68b90 100644
--- a/lib/strto.c
+++ b/lib/strto.c
@@ -23,6 +23,9 @@  static const char *_parse_integer_fixup_radix(const char *s, uint *basep)
 		if (ch == 'x') {
 			*basep = 16;
 			s += 2;
+		} else if (ch == 'n') {
+			*basep = 10;
+			s += 2;
 		} else if (!*basep) {
 			/* Only select octal if we don't have a base */
 			*basep = 8;
diff --git a/test/str_ut.c b/test/str_ut.c
index d2840d51524..c3b797b027a 100644
--- a/test/str_ut.c
+++ b/test/str_ut.c
@@ -111,6 +111,12 @@  static int str_simple_strtoul(struct unit_test_state *uts)
 	/* Check endp being NULL */
 	ut_asserteq(1099, simple_strtoul(str2, NULL, 0));
 
+	/* check decimal */
+	ut_assertok(run_strtoul(uts, "123fg", 0, 123, 3, false));
+	ut_assertok(run_strtoul(uts, "123a", 10, 123, 3, false));
+	ut_assertok(run_strtoul(uts, "0x123fg", 0, 0x123f, 6, false));
+	ut_assertok(run_strtoul(uts, "0n123a", 16, 123, 5, false));
+
 	return 0;
 }
 STR_TEST(str_simple_strtoul, 0);
@@ -174,6 +180,12 @@  static int str_simple_strtoull(struct unit_test_state *uts)
 	/* Check endp being NULL */
 	ut_asserteq(1099, simple_strtoull(str2, NULL, 0));
 
+	/* check decimal */
+	ut_assertok(run_strtoull(uts, "123fg", 0, 123, 3, false));
+	ut_assertok(run_strtoull(uts, "123a", 10, 123, 3, false));
+	ut_assertok(run_strtoull(uts, "0x123fg", 0, 0x123f, 6, false));
+	ut_assertok(run_strtoull(uts, "0n123a", 16, 123, 5, false));
+
 	return 0;
 }
 STR_TEST(str_simple_strtoull, 0);