9
0
Fork 0

svn_rev_701

move do_test to own file and reimplement
This commit is contained in:
Sascha Hauer 2007-07-05 18:02:18 +02:00 committed by Sascha Hauer
parent e24bb529b1
commit 89f0c5c94f
4 changed files with 203 additions and 133 deletions

View File

@ -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

View File

@ -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

179
commands/test.c Normal file
View File

@ -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

View File

@ -103,139 +103,6 @@ U_BOOT_CMD_START(readline)
U_BOOT_CMD_HELP(cmd_readline_help)
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[])
{