[PATCH] cmd: test: Add operators to deal with hexadecimal numbers.

Christoph Müllner christoph.muellner at theobroma-systems.com
Thu Mar 12 10:52:11 CET 2020


Hi Michal,

On 3/12/20 8:38 AM, Michal Simek wrote:
> 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.muellner at 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 for this input.

I would prefer to not "guess" the base based on the fact that the string contains [a-f].
Reason is, that I cannot guarantee that all hex numbers contain [a-f].

I want to have something reliably compatible to other commands like setexpr
(allowing operations like addition and subtraction, but all in hex format).
So I want to strictly interpret all numbers as hex numbers (as stated in the DLUG).

Thanks,
Christoph


More information about the U-Boot mailing list