[U-Boot-Users] [PATCH v2] Add expr command

Add a simple expr command that will set an env variable as the result of the command. This allows us to do simple math in shell. The following operations are supported: &, |, ^, +, -, *, /.
Signed-off-by: Kumar Gala galak@kernel.crashing.org ---
Added xor (^) and check that the op arg is only one char as suggsted by Andreas.
- k
common/Makefile | 1 + common/cmd_expr.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 0 deletions(-) create mode 100644 common/cmd_expr.c
diff --git a/common/Makefile b/common/Makefile index 1639109..4f3e711 100644 --- a/common/Makefile +++ b/common/Makefile @@ -54,6 +54,7 @@ COBJS-$(CONFIG_CMD_DOC) += cmd_doc.o COBJS-$(CONFIG_CMD_DTT) += cmd_dtt.o COBJS-y += cmd_eeprom.o COBJS-$(CONFIG_CMD_ELF) += cmd_elf.o +COBJS-$(CONFIG_CMD_EXPR) += cmd_expr.o COBJS-$(CONFIG_CMD_EXT2) += cmd_ext2.o COBJS-$(CONFIG_CMD_FAT) += cmd_fat.o COBJS-y += cmd_fdc.o diff --git a/common/cmd_expr.c b/common/cmd_expr.c new file mode 100644 index 0000000..441865a --- /dev/null +++ b/common/cmd_expr.c @@ -0,0 +1,70 @@ +/* + * Copyright 2008 Freescale Semiconductor, Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * This file provides a shell like 'expr' function to return. + */ + +#include <common.h> +#include <config.h> +#include <command.h> + +int do_expr (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + ulong a, b; + char buf[16]; + + /* Validate arguments */ + if ((argc != 5) || (strlen(argv[3]) != 1)) { + printf("Usage:\n%s\n", cmdtp->usage); + return 1; + } + + a = simple_strtoul(argv[2], NULL, 16); + b = simple_strtoul(argv[4], NULL, 16); + + switch (argv[3][0]) { + case '|': sprintf(buf, "%lx", (a | b)); break; + case '&': sprintf(buf, "%lx", (a & b)); break; + case '+': sprintf(buf, "%lx", (a + b)); break; + case '^': sprintf(buf, "%lx", (a ^ b)); break; + case '-': sprintf(buf, "%lx", (a - b)); break; + case '*': sprintf(buf, "%lx", (a * b)); break; + case '/': sprintf(buf, "%lx", (a / b)); break; + case '%': sprintf(buf, "%lx", (a % b)); break; + default: + printf("invalid op\n"); + return 1; + } + + setenv(argv[1], buf); + + return 0; +} + +U_BOOT_CMD( + expr, 5, 0, do_expr, + "expr - set environment variable as the result of eval expression\n", + "name value1 <op> value2\n" + " - set environment variable 'name' to the result of the evaluated\n" + " express specified by <op>. <op> can be &, |, ^, +, -, *, /, %\n" +);

On Wed, 13 Feb 2008 09:54:31 -0600 (CST) Kumar Gala galak@kernel.crashing.org wrote:
+}
+U_BOOT_CMD(
- expr, 5, 0, do_expr,
- "expr - set environment variable as the result of eval expression\n",
- "name value1 <op> value2\n"
- " - set environment variable 'name' to the result of the evaluated\n"
- " express specified by <op>. <op> can be &, |, ^, +, -, *, /, %\n"
can we at least change the name to "setexpr" or something, so as not break forward compatibility with any future GNU syntax expr implementation?
Kim

On Feb 13, 2008, at 10:35 AM, Kim Phillips wrote:
On Wed, 13 Feb 2008 09:54:31 -0600 (CST) Kumar Gala galak@kernel.crashing.org wrote:
+}
+U_BOOT_CMD(
- expr, 5, 0, do_expr,
- "expr - set environment variable as the result of eval
expression\n",
- "name value1 <op> value2\n"
- " - set environment variable 'name' to the result of the
evaluated\n"
- " express specified by <op>. <op> can be &, |, ^, +, -,
*, /, %\n"
can we at least change the name to "setexpr" or something, so as not break forward compatibility with any future GNU syntax expr implementation?
ok. Waiting to here on wd's feeling about having this as part of the standard command set or not.
- k

In message 2040FCC8-76A9-4B8E-9F3B-5422EF117F26@kernel.crashing.org you wrote:
can we at least change the name to "setexpr" or something, so as not break forward compatibility with any future GNU syntax expr implementation?
ok. Waiting to here on wd's feeling about having this as part of the standard command set or not.
Well, if you ask me, I'd just call it expr.... [I have to admit that this is for very egoistic reasons, namely being used to type "sete" fort setenv, which then would be require me to type one more character. And with my age you don't change such habits easily ;-) ]
Best regards,
Wolfgang Denk

Hello!
Kim Phillips schrieb:
can we at least change the name to "setexpr" or something, so as not break forward compatibility with any future GNU syntax expr implementation?
+1
Regards Andreas Schweigstill
participants (4)
-
Andreas Schweigstill
-
Kim Phillips
-
Kumar Gala
-
Wolfgang Denk