Commit d058698fd2d9f769ff38ac53c8708b3fdd314f2d
Committed by
Wolfgang Denk
1 parent
0d48926c87
Exists in
master
and in
54 other branches
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
common/Makefile
... | ... | @@ -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 */ |