|  | /* | 
|  | * 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> | 
|  |  | 
|  | int do_test(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) | 
|  | { | 
|  | char **ap; | 
|  | int left, adv, expr, last_expr, neg, last_cmp; | 
|  |  | 
|  | /* args? */ | 
|  | if (argc < 3) | 
|  | return 1; | 
|  |  | 
|  | #if 0 | 
|  | { | 
|  | printf("test:"); | 
|  | left = 1; | 
|  | while (argv[left]) | 
|  | printf(" %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..]" | 
|  | ); | 
|  |  | 
|  | int do_false(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) | 
|  | { | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | U_BOOT_CMD( | 
|  | false,	CONFIG_SYS_MAXARGS,	1,	do_false, | 
|  | "do nothing, unsuccessfully", | 
|  | NULL | 
|  | ); | 
|  |  | 
|  | int do_true(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) | 
|  | { | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | U_BOOT_CMD( | 
|  | true,	CONFIG_SYS_MAXARGS,	1,	do_true, | 
|  | "do nothing, successfully", | 
|  | NULL | 
|  | ); |