|
|
|
/*
|
|
|
|
* Copyright 2000-2009
|
|
|
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
|
|
|
*
|
|
|
|
* See file CREDITS for list of people who contributed to this
|
|
|
|
* project.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License as
|
|
|
|
* published by the Free Software Foundation; either version 2 of
|
|
|
|
* the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <common.h>
|
|
|
|
#include <command.h>
|
|
|
|
|
|
|
|
static int do_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
|
{
|
|
|
|
char * const *ap;
|
|
|
|
int left, adv, expr, last_expr, neg, last_cmp;
|
|
|
|
|
|
|
|
/* args? */
|
|
|
|
if (argc < 3)
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
{
|
|
|
|
debug("test(%d):", argc);
|
|
|
|
left = 1;
|
|
|
|
while (argv[left])
|
|
|
|
debug(" '%s'", argv[left++]);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
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) {
|
|
|
|
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 = simple_strtol(ap[0], NULL, 10) == simple_strtol(ap[2], NULL, 10);
|
|
|
|
else if (strcmp(ap[1], "-ne") == 0)
|
|
|
|
expr = simple_strtol(ap[0], NULL, 10) != simple_strtol(ap[2], NULL, 10);
|
|
|
|
else if (strcmp(ap[1], "-lt") == 0)
|
|
|
|
expr = simple_strtol(ap[0], NULL, 10) < simple_strtol(ap[2], NULL, 10);
|
|
|
|
else if (strcmp(ap[1], "-le") == 0)
|
|
|
|
expr = simple_strtol(ap[0], NULL, 10) <= simple_strtol(ap[2], NULL, 10);
|
|
|
|
else if (strcmp(ap[1], "-gt") == 0)
|
|
|
|
expr = simple_strtol(ap[0], NULL, 10) > simple_strtol(ap[2], NULL, 10);
|
|
|
|
else if (strcmp(ap[1], "-ge") == 0)
|
|
|
|
expr = simple_strtol(ap[0], NULL, 10) >= simple_strtol(ap[2], NULL, 10);
|
|
|
|
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;
|
|
|
|
|
|
|
|
debug (": returns %d\n", expr);
|
|
|
|
|
|
|
|
return expr;
|
|
|
|
}
|
|
|
|
|
|
|
|
U_BOOT_CMD(
|
|
|
|
test, CONFIG_SYS_MAXARGS, 1, do_test,
|
|
|
|
"minimal test like /bin/sh",
|
|
|
|
"[args..]"
|
|
|
|
);
|
|
|
|
|
|
|
|
static int do_false(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
U_BOOT_CMD(
|
|
|
|
false, CONFIG_SYS_MAXARGS, 1, do_false,
|
|
|
|
"do nothing, unsuccessfully",
|
|
|
|
NULL
|
|
|
|
);
|
|
|
|
|
|
|
|
static int do_true(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
U_BOOT_CMD(
|
|
|
|
true, CONFIG_SYS_MAXARGS, 1, do_true,
|
|
|
|
"do nothing, successfully",
|
|
|
|
NULL
|
|
|
|
);
|