Fix for USB sticks not working on ARM while using GCC 4.x compilers
[platform/kernel/u-boot.git] / 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 );