parent
e24bb529b1
commit
89f0c5c94f
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
133
common/command.c
133
common/command.c
|
@ -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[])
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue