diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2007-07-05 18:02:18 +0200 |
---|---|---|
committer | Sascha Hauer <sha@octopus.labnet.pengutronix.de> | 2007-07-05 18:02:18 +0200 |
commit | 89f0c5c94f919445e1398016be0fc97f7bada3b1 (patch) | |
tree | a30ab33a276eb73670de464b2a2103b5aacb5b2b | |
parent | e24bb529b18eccbe5d1082d6eed0eb7353b756e3 (diff) | |
download | barebox-89f0c5c94f919445e1398016be0fc97f7bada3b1.tar.gz barebox-89f0c5c94f919445e1398016be0fc97f7bada3b1.tar.xz |
svn_rev_701
move do_test to own file and reimplement
-rw-r--r-- | commands/Kconfig | 22 | ||||
-rw-r--r-- | commands/Makefile | 2 | ||||
-rw-r--r-- | commands/test.c | 179 | ||||
-rw-r--r-- | common/command.c | 133 |
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; |