X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=common%2Fcmd_itest.c;h=91ae5c2704c882be8d4457d67d5f8488b19d2f1c;hb=3c8dcf0eacda531724ed83af0f54ffb4b98bc799;hp=309b08bb03a5121adae34dfd825c16e1c772c4ab;hpb=156feb90d200f186cdfd856d7f6f1878bb1bec1e;p=oweals%2Fu-boot.git diff --git a/common/cmd_itest.c b/common/cmd_itest.c index 309b08bb03..91ae5c2704 100644 --- a/common/cmd_itest.c +++ b/common/cmd_itest.c @@ -2,23 +2,7 @@ * (C) Copyright 2003 * Tait Electronics Limited, Christchurch, New Zealand * - * 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 + * SPDX-License-Identifier: GPL-2.0+ */ /* @@ -31,6 +15,9 @@ #include #include #include +#include + +#include #define EQ 0 #define NE 1 @@ -46,7 +33,7 @@ struct op_tbl_s { typedef struct op_tbl_s op_tbl_t; -op_tbl_t op_table [] = { +static const op_tbl_t op_table [] = { { "-lt", LT }, { "<" , LT }, { "-gt", GT }, @@ -62,21 +49,38 @@ op_tbl_t op_table [] = { { "<=" , LE }, }; -#define op_tbl_size (sizeof(op_table)/sizeof(op_table[0])) - static long evalexp(char *s, int w) { - long l, *p; + long l = 0; + unsigned long addr; + void *buf; /* if the parameter starts with a * then assume is a pointer to the value we want */ if (s[0] == '*') { - p = (long *)simple_strtoul(&s[1], NULL, 16); - l = *p; + addr = simple_strtoul(&s[1], NULL, 16); + buf = map_physmem(addr, w, MAP_WRBACK); + if (!buf) { + puts("Failed to map physical memory\n"); + return 0; + } + switch (w) { + case 1: + l = (long)(*(unsigned char *)buf); + break; + case 2: + l = (long)(*(unsigned short *)buf); + break; + case 4: + l = (long)(*(unsigned long *)buf); + break; + } + unmap_physmem(buf, w); + return l; } else { l = simple_strtoul(s, NULL, 16); } - return (l & ((1 << (w * 8)) - 1)); + return l & ((1UL << (w * 8)) - 1); } static char * evalstr(char *s) @@ -84,6 +88,19 @@ static char * evalstr(char *s) /* if the parameter starts with a * then assume a string pointer else its a literal */ if (s[0] == '*') { return (char *)simple_strtoul(&s[1], NULL, 16); + } else if (s[0] == '$') { + int i = 2; + + if (s[1] != '{') + return NULL; + + while (s[i] != '}') { + if (s[i] == 0) + return NULL; + i++; + } + s[i] = 0; + return getenv((const char *)&s[2]); } else { return s; } @@ -91,16 +108,13 @@ static char * evalstr(char *s) static int stringcomp(char *s, char *t, int op) { - int n, p; + int p; char *l, *r; l = evalstr(s); r = evalstr(t); - /* we'll do a compare based on the length of the shortest string */ - n = min(strlen(l), strlen(r)); - - p = strncmp(l, r, n); + p = strcmp(l, r); switch (op) { case EQ: return (p == 0); case NE: return (p != 0); @@ -130,15 +144,15 @@ static int arithcomp (char *s, char *t, int op, int w) return (0); } -int binary_test (char *op, char *arg1, char *arg2, int w) +static int binary_test(char *op, char *arg1, char *arg2, int w) { int len, i; - op_tbl_t *optp; + const op_tbl_t *optp; len = strlen(op); for (optp = (op_tbl_t *)&op_table, i = 0; - i < op_tbl_size; + i < ARRAY_SIZE(op_table); optp++, i++) { if ((strncmp (op, optp->op, len) == 0) && (len == strlen (optp->op))) { @@ -155,15 +169,13 @@ int binary_test (char *op, char *arg1, char *arg2, int w) } /* command line interface to the shell test */ -int do_itest ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[] ) +static int do_itest(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int value, w; /* Validate arguments */ - if ((argc != 4)){ - cmd_usage(cmdtp); - return 1; - } + if ((argc != 4)) + return CMD_RET_USAGE; /* Check for a data width specification. * Defaults to long (4) if no specification. @@ -191,5 +203,5 @@ int do_itest ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[] ) U_BOOT_CMD( itest, 4, 0, do_itest, "return true/false on integer compare", - "[.b, .w, .l, .s] [*]value1 [*]value2\n" + "[.b, .w, .l, .s] [*]value1 [*]value2" );