Commit d058698fd2d9f769ff38ac53c8708b3fdd314f2d

Authored by Kumar Gala
Committed by Wolfgang Denk
1 parent 0d48926c87

Add setexpr command

Add a simple expr style 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>

Showing 3 changed files with 72 additions and 0 deletions Side-by-side Diff

... ... @@ -88,6 +88,7 @@
88 88 COBJS-$(CONFIG_CMD_REISER) += cmd_reiser.o
89 89 COBJS-y += cmd_sata.o
90 90 COBJS-$(CONFIG_CMD_SCSI) += cmd_scsi.o
  91 +COBJS-$(CONFIG_CMD_SETEXPR) += cmd_setexpr.o
91 92 COBJS-$(CONFIG_CMD_SPI) += cmd_spi.o
92 93 COBJS-$(CONFIG_CMD_STRINGS) += cmd_strings.o
93 94 COBJS-$(CONFIG_CMD_TERMINAL) += cmd_terminal.o
common/cmd_setexpr.c
  1 +/*
  2 + * Copyright 2008 Freescale Semiconductor, Inc.
  3 + *
  4 + * See file CREDITS for list of people who contributed to this
  5 + * project.
  6 + *
  7 + * This program is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU General Public License as
  9 + * published by the Free Software Foundation; either version 2 of
  10 + * the License, or (at your option) any later version.
  11 + *
  12 + * This program is distributed in the hope that it will be useful,
  13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15 + * GNU General Public License for more details.
  16 + *
  17 + * You should have received a copy of the GNU General Public License
  18 + * along with this program; if not, write to the Free Software
  19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  20 + * MA 02111-1307 USA
  21 + */
  22 +
  23 +/*
  24 + * This file provides a shell like 'expr' function to return.
  25 + */
  26 +
  27 +#include <common.h>
  28 +#include <config.h>
  29 +#include <command.h>
  30 +
  31 +int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
  32 +{
  33 + ulong a, b;
  34 + char buf[16];
  35 +
  36 + /* Validate arguments */
  37 + if ((argc != 5) || (strlen(argv[3]) != 1)) {
  38 + printf("Usage:\n%s\n", cmdtp->usage);
  39 + return 1;
  40 + }
  41 +
  42 + a = simple_strtoul(argv[2], NULL, 16);
  43 + b = simple_strtoul(argv[4], NULL, 16);
  44 +
  45 + switch (argv[3][0]) {
  46 + case '|': sprintf(buf, "%lx", (a | b)); break;
  47 + case '&': sprintf(buf, "%lx", (a & b)); break;
  48 + case '+': sprintf(buf, "%lx", (a + b)); break;
  49 + case '^': sprintf(buf, "%lx", (a ^ b)); break;
  50 + case '-': sprintf(buf, "%lx", (a - b)); break;
  51 + case '*': sprintf(buf, "%lx", (a * b)); break;
  52 + case '/': sprintf(buf, "%lx", (a / b)); break;
  53 + case '%': sprintf(buf, "%lx", (a % b)); break;
  54 + default:
  55 + printf("invalid op\n");
  56 + return 1;
  57 + }
  58 +
  59 + setenv(argv[1], buf);
  60 +
  61 + return 0;
  62 +}
  63 +
  64 +U_BOOT_CMD(
  65 + setexpr, 5, 0, do_setexpr,
  66 + "setexpr - set environment variable as the result of eval expression\n",
  67 + "name value1 <op> value2\n"
  68 + " - set environment variable 'name' to the result of the evaluated\n"
  69 + " express specified by <op>. <op> can be &, |, ^, +, -, *, /, %\n"
  70 +);
include/config_cmd_all.h
... ... @@ -70,6 +70,7 @@
70 70 #define CONFIG_CMD_SAVES /* save S record dump */
71 71 #define CONFIG_CMD_SCSI /* SCSI Support */
72 72 #define CONFIG_CMD_SDRAM /* SDRAM DIMM SPD info printout */
  73 +#define CONFIG_CMD_SETEXPR /* setexpr support */
73 74 #define CONFIG_CMD_SETGETDCR /* DCR support on 4xx */
74 75 #define CONFIG_CMD_SNTP /* SNTP support */
75 76 #define CONFIG_CMD_SPI /* SPI utility */