summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2007-07-05 18:02:18 +0200
committerSascha Hauer <sha@octopus.labnet.pengutronix.de>2007-07-05 18:02:18 +0200
commit89f0c5c94f919445e1398016be0fc97f7bada3b1 (patch)
treea30ab33a276eb73670de464b2a2103b5aacb5b2b
parente24bb529b18eccbe5d1082d6eed0eb7353b756e3 (diff)
downloadbarebox-89f0c5c94f919445e1398016be0fc97f7bada3b1.tar.gz
barebox-89f0c5c94f919445e1398016be0fc97f7bada3b1.tar.xz
svn_rev_701
move do_test to own file and reimplement
-rw-r--r--commands/Kconfig22
-rw-r--r--commands/Makefile2
-rw-r--r--commands/test.c179
-rw-r--r--common/command.c133
4 files changed, 203 insertions, 133 deletions
diff --git a/commands/Kconfig b/commands/Kconfig
index c09a14e416..4d2cb2c6c7 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -32,42 +32,52 @@ menu "file commands "
config CMD_LS
bool
+ default y
prompt "ls"
config CMD_RM
bool
+ default y
prompt "rm"
config CMD_CAT
bool
+ default y
prompt "cat"
config CMD_MKDIR
bool
+ default y
prompt "mkdir"
config CMD_RMDIR
bool
+ default y
prompt "rmdir"
config CMD_CP
bool
+ default y
prompt "cp"
config CMD_PWD
bool
+ default y
prompt "pwd"
config CMD_CD
bool
+ default y
prompt "cd"
config CMD_MOUNT
bool
+ default y
prompt "mount"
config CMD_UMOUNT
bool
+ default y
prompt "umount"
endmenu
@@ -76,10 +86,12 @@ menu "console "
config CMD_CLEAR
bool
+ default y
prompt "clear"
config CMD_ECHO
bool
+ default y
prompt "echo"
config CMD_SPLASH
@@ -125,6 +137,7 @@ config CMD_MEMINFO
config CMD_MEMORY
bool
+ default y
prompt "md and mw"
config CMD_CRC
@@ -177,6 +190,7 @@ menu "booting "
config CMD_BOOTM
bool
+ default y
select CRC32
prompt "bootm"
@@ -206,6 +220,14 @@ config CMD_PARTITION
bool
prompt "addpart/delpart"
+config CMD_TEST
+ bool
+ depends on HUSH_PARSER
+ default y
+ prompt "test"
+ help
+ shell like test function
+
config CMD_REGINFO
depends on HAS_REGINFO
select REGINFO
diff --git a/commands/Makefile b/commands/Makefile
index 733deb1b36..f2b2939ae0 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -28,3 +28,5 @@ obj-$(CONFIG_CMD_MOUNT) += mount.o
obj-$(CONFIG_CMD_UMOUNT) += umount.o
obj-$(CONFIG_CMD_REGINFO) += reginfo.o
obj-$(CONFIG_CMD_CRC) += crc.o
+obj-$(CONFIG_CMD_CLEAR) += clear.o
+obj-$(CONFIG_CMD_TEST) += test.o
diff --git a/commands/test.c b/commands/test.c
new file mode 100644
index 0000000000..8fc2e4a86c
--- /dev/null
+++ b/commands/test.c
@@ -0,0 +1,179 @@
+#include <common.h>
+#include <command.h>
+
+typedef enum {
+ OPT_EQUAL,
+ OPT_NOT_EQUAL,
+ OPT_ARITH_EQUAL,
+ OPT_ARITH_NOT_EQUAL,
+ OPT_ARITH_GREATER_EQUAL,
+ OPT_ARITH_GREATER_THAN,
+ OPT_ARITH_LESS_EQUAL,
+ OPT_ARITH_LESS_THAN,
+ OPT_OR,
+ OPT_AND,
+ OPT_ZERO,
+ OPT_NONZERO,
+ OPT_MAX,
+} test_opts;
+
+static char *test_options[] = {
+ [OPT_EQUAL] = "=",
+ [OPT_NOT_EQUAL] = "!=",
+ [OPT_ARITH_EQUAL] = "-eq",
+ [OPT_ARITH_NOT_EQUAL] = "-ne",
+ [OPT_ARITH_GREATER_EQUAL] = "-ge",
+ [OPT_ARITH_GREATER_THAN] = "-gt",
+ [OPT_ARITH_LESS_EQUAL] = "-le",
+ [OPT_ARITH_LESS_THAN] = "-lt",
+ [OPT_OR] = "-o",
+ [OPT_AND] = "-a",
+ [OPT_ZERO] = "-z",
+ [OPT_NONZERO] = "-n",
+};
+
+static int parse_opt(const char *opt)
+{
+ char **opts = test_options;
+ int i;
+
+ for (i = 0; i < OPT_MAX; i++) {
+ if (!strcmp(opts[i], opt))
+ return i;
+ }
+ return -1;
+}
+
+int
+do_test (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ char **ap;
+ int left, adv, expr, last_expr, neg, last_cmp, opt, zero;
+ ulong a, b;
+
+ if (*argv[0] == '[') {
+ if (*argv[argc - 1] != ']') {
+ printf("[: missing `]'\n");
+ return 1;
+ }
+ argc--;
+ }
+
+ /* args? */
+ if (argc < 2)
+ return 1;
+
+ last_expr = 0;
+ left = argc - 1;
+ ap = argv + 1;
+
+ if (strcmp(ap[0], "!") == 0) {
+ neg = 1;
+ ap++;
+ left--;
+ } else
+ neg = 0;
+
+ expr = -1;
+ last_cmp = -1;
+ last_expr = -1;
+ adv = 0;
+ while (left - adv > 0) {
+ ap += adv; left -= adv;
+
+ adv = 1;
+ opt = parse_opt(ap[0]);
+ switch (opt) {
+ /* one argument options */
+ case OPT_OR:
+ last_expr = expr;
+ last_cmp = 0;
+ continue;
+ case OPT_AND:
+ last_expr = expr;
+ last_cmp = 1;
+ continue;
+
+ /* two argument options */
+ case OPT_ZERO:
+ case OPT_NONZERO:
+ adv = 2;
+ zero = 1;
+ if (ap[1] && *ap[1] != ']' && strlen(ap[1]))
+ zero = 0;
+
+ expr = (opt == OPT_ZERO) ? zero : !zero;
+ break;
+
+ /* three argument options */
+ default:
+ adv = 3;
+ if (left < 3) {
+ expr = 1;
+ break;
+ }
+
+ a = simple_strtol(ap[0], NULL, 0);
+ b = simple_strtol(ap[2], NULL, 0);
+ switch (parse_opt(ap[1])) {
+ case OPT_EQUAL:
+ expr = strcmp(ap[0], ap[2]) == 0;
+ break;
+ case OPT_NOT_EQUAL:
+ expr = strcmp(ap[0], ap[2]) != 0;
+ break;
+ case OPT_ARITH_EQUAL:
+ printf("equal: %d %d\n", a, b);
+ expr = a == b;
+ break;
+ case OPT_ARITH_NOT_EQUAL:
+ expr = a != b;
+ break;
+ case OPT_ARITH_LESS_THAN:
+ expr = a < b;
+ break;
+ case OPT_ARITH_LESS_EQUAL:
+ expr = a <= b;
+ break;
+ case OPT_ARITH_GREATER_THAN:
+ expr = a > b;
+ break;
+ case OPT_ARITH_GREATER_EQUAL:
+ expr = a >= b;
+ break;
+ default:
+ expr = 1;
+ goto out;
+ }
+ }
+
+ if (last_cmp == 0)
+ expr = last_expr || expr;
+ else if (last_cmp == 1)
+ expr = last_expr && expr;
+ last_cmp = -1;
+ }
+out:
+ if (neg)
+ expr = !expr;
+
+ expr = !expr;
+
+
+ return expr;
+}
+
+char *test_aliases[] = { "[", NULL};
+
+static __maybe_unused char cmd_test_help[] =
+"Usage: test [OPTIONS]\n"
+"options: !, =, !=, -eq, -ne, -ge, -gt, -le, -lt, -o, -a, -z, -n\n"
+"see 'man test' on your PC for more information.\n";
+
+U_BOOT_CMD_START(test)
+ .aliases = test_aliases,
+ .maxargs = CONFIG_MAXARGS,
+ .cmd = do_test,
+ .usage = "minimal test like /bin/sh",
+ U_BOOT_CMD_HELP(cmd_test_help)
+U_BOOT_CMD_END
diff --git a/common/command.c b/common/command.c
index 4fcf17bc66..064ab710fb 100644
--- a/common/command.c
+++ b/common/command.c
@@ -104,139 +104,6 @@ U_BOOT_CMD_START(readline)
U_BOOT_CMD_END
int
-do_test (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
- char **ap;
- int left, adv, expr, last_expr, neg, last_cmp;
-
- if (*argv[0] == '[') {
- if (*argv[argc - 1] != ']') {
- printf("[: missing `]'\n");
- return 1;
- }
- argc--;
- }
-
- /* args? */
- if (argc < 3)
- return 1;
-
- last_expr = 0;
- left = argc - 1; ap = argv + 1;
- if (left > 0 && strcmp(ap[0], "!") == 0) {
- neg = 1;
- ap++;
- left--;
- } else
- neg = 0;
-
- expr = -1;
- last_cmp = -1;
- last_expr = -1;
- while (left > 0) {
-
- if (strcmp(ap[0], "-o") == 0 || strcmp(ap[0], "-a") == 0)
- adv = 1;
- else if (strcmp(ap[0], "-z") == 0 || strcmp(ap[0], "-n") == 0)
- adv = 2;
- else
- adv = 3;
-
- if (left < adv) {
- expr = 1;
- break;
- }
-
- if (adv == 1) {
- if (strcmp(ap[0], "-o") == 0) {
- last_expr = expr;
- last_cmp = 0;
- } else if (strcmp(ap[0], "-a") == 0) {
- last_expr = expr;
- last_cmp = 1;
- } else {
- expr = 1;
- break;
- }
- }
-
- if (adv == 2) {
- if (strcmp(ap[0], "-z") == 0)
- expr = strlen(ap[1]) == 0 ? 1 : 0;
- else if (strcmp(ap[0], "-n") == 0)
- expr = strlen(ap[1]) == 0 ? 0 : 1;
- else {
- expr = 1;
- break;
- }
-
- if (last_cmp == 0)
- expr = last_expr || expr;
- else if (last_cmp == 1)
- expr = last_expr && expr;
- last_cmp = -1;
- }
-
- if (adv == 3) {
- ulong a = simple_strtol(ap[0], NULL, 0);
- ulong b = simple_strtol(ap[2], NULL, 0);
- if (strcmp(ap[1], "=") == 0)
- expr = strcmp(ap[0], ap[2]) == 0;
- else if (strcmp(ap[1], "!=") == 0)
- expr = strcmp(ap[0], ap[2]) != 0;
- else if (strcmp(ap[1], ">") == 0)
- expr = strcmp(ap[0], ap[2]) > 0;
- else if (strcmp(ap[1], "<") == 0)
- expr = strcmp(ap[0], ap[2]) < 0;
- else if (strcmp(ap[1], "-eq") == 0)
- expr = a == b;
- else if (strcmp(ap[1], "-ne") == 0)
- expr = a != b;
- else if (strcmp(ap[1], "-lt") == 0)
- expr = a < b;
- else if (strcmp(ap[1], "-le") == 0)
- expr = a <= b;
- else if (strcmp(ap[1], "-gt") == 0)
- expr = a > b;
- else if (strcmp(ap[1], "-ge") == 0)
- expr = a >= b;
- else {
- expr = 1;
- break;
- }
-
- if (last_cmp == 0)
- expr = last_expr || expr;
- else if (last_cmp == 1)
- expr = last_expr && expr;
- last_cmp = -1;
- }
-
- ap += adv; left -= adv;
- }
-
- if (neg)
- expr = !expr;
-
- expr = !expr;
-
-
- return expr;
-}
-
-char *test_aliases[] = { "[", NULL};
-
-U_BOOT_CMD_START(test)
- .aliases = test_aliases,
- .maxargs = CONFIG_MAXARGS,
- .cmd = do_test,
- .usage = "minimal test like /bin/sh",
- U_BOOT_CMD_HELP(
- "[args..]\n"
- " - test functionality\n")
-U_BOOT_CMD_END
-
-int
do_exit (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
int r;