On 11. 03. 20 23:46, Christoph Muellner wrote:
> The DLUG states the following:
>   Almost all U-Boot commands expect numbers to be entered in hexadecimal
>   input format.
> 
> Besides this fact, also most commands output hex values.
> 
> Given this facts, we need to be able to use the information provided
> by to/from commands in scripts. The test command does not support
> operating on hexadecimal input formats. This leads to very surprising
> tests like this (simple_strtol("ff", 10) == 0):
> 
>   => if test "ff" -eq 0; then echo "equal"; fi
>   equal
>   =>
> 
> This patch introduces comparison operators for the test command,
> that allow parameters in hexadecimal format. So the test above
> can be implemented as follows:
> 
>   => if test "ff" -heq 0; then echo "equal"; fi
>   =>
> 
> [1] https://www.denx.de/wiki/view/DULG/UBootCommandLineInterface
> 
> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com>
> 
> ---
> 
>  cmd/test.c | 36 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 36 insertions(+)
> 
> diff --git a/cmd/test.c b/cmd/test.c
> index 258bfd8806..dbaf23596b 100644
> --- a/cmd/test.c
> +++ b/cmd/test.c
> @@ -25,6 +25,12 @@
>  #define OP_INT_GT    14
>  #define OP_INT_GE    15
>  #define OP_FILE_EXISTS       16
> +#define OP_HEX_EQ    17
> +#define OP_HEX_NEQ   18
> +#define OP_HEX_LT    19
> +#define OP_HEX_LE    20
> +#define OP_HEX_GT    21
> +#define OP_HEX_GE    22
>  
>  const struct {
>       int arg;
> @@ -48,6 +54,12 @@ const struct {
>       {0, "-z", OP_STR_EMPTY, 2},
>       {0, "-n", OP_STR_NEMPTY, 2},
>       {0, "-e", OP_FILE_EXISTS, 4},
> +     {1, "-heq", OP_HEX_EQ, 3},
> +     {1, "-hne", OP_HEX_NEQ, 3},
> +     {1, "-hlt", OP_HEX_LT, 3},
> +     {1, "-hle", OP_HEX_LE, 3},
> +     {1, "-hgt", OP_HEX_GT, 3},
> +     {1, "-hge", OP_HEX_GE, 3},
>  };
>  
>  static int do_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> @@ -139,6 +151,30 @@ static int do_test(cmd_tbl_t *cmdtp, int flag, int argc, 
> char * const argv[])
>               case OP_FILE_EXISTS:
>                       expr = file_exists(ap[1], ap[2], ap[3], FS_TYPE_ANY);
>                       break;
> +             case OP_HEX_EQ:
> +                     expr = simple_strtol(ap[0], NULL, 16) ==
> +                                     simple_strtol(ap[2], NULL, 16);
> +                     break;
> +             case OP_HEX_NEQ:
> +                     expr = simple_strtol(ap[0], NULL, 16) !=
> +                                     simple_strtol(ap[2], NULL, 16);
> +                     break;
> +             case OP_HEX_LT:
> +                     expr = simple_strtol(ap[0], NULL, 16) <
> +                                     simple_strtol(ap[2], NULL, 16);
> +                     break;
> +             case OP_HEX_LE:
> +                     expr = simple_strtol(ap[0], NULL, 16) <=
> +                                     simple_strtol(ap[2], NULL, 16);
> +                     break;
> +             case OP_HEX_GT:
> +                     expr = simple_strtol(ap[0], NULL, 16) >
> +                                     simple_strtol(ap[2], NULL, 16);
> +                     break;
> +             case OP_HEX_GE:
> +                     expr = simple_strtol(ap[0], NULL, 16) >=
> +                                     simple_strtol(ap[2], NULL, 16);
> +                     break;
>               }
>  
>               switch (op) {
> 

We have been trying to improve this. Take a look at it.

https://lists.denx.de/pipermail/u-boot/2020-March/401745.html

It should cover your case.
But if you start to mix hex with dec then it will fail.

Thanks,
Michal

Reply via email to