Blame view

cmd/test.c 3.99 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
6b8f5ad10   Peter Tyser   command.c: Break ...
2
3
4
  /*
   * Copyright 2000-2009
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
6b8f5ad10   Peter Tyser   command.c: Break ...
5
6
7
8
   */
  
  #include <common.h>
  #include <command.h>
e5e897c01   Stephen Warren   cmd_test: impleme...
9
  #include <fs.h>
6b8f5ad10   Peter Tyser   command.c: Break ...
10

490ba833d   Stephen Warren   cmd_test: use tab...
11
  #define OP_INVALID	0
d9b651ce3   Stephen Warren   cmd_test: impleme...
12
  #define OP_NOT		1
490ba833d   Stephen Warren   cmd_test: use tab...
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  #define OP_OR		2
  #define OP_AND		3
  #define OP_STR_EMPTY	4
  #define OP_STR_NEMPTY	5
  #define OP_STR_EQ	6
  #define OP_STR_NEQ	7
  #define OP_STR_LT	8
  #define OP_STR_GT	9
  #define OP_INT_EQ	10
  #define OP_INT_NEQ	11
  #define OP_INT_LT	12
  #define OP_INT_LE	13
  #define OP_INT_GT	14
  #define OP_INT_GE	15
e5e897c01   Stephen Warren   cmd_test: impleme...
27
  #define OP_FILE_EXISTS	16
490ba833d   Stephen Warren   cmd_test: use tab...
28
29
30
31
32
33
34
  
  const struct {
  	int arg;
  	const char *str;
  	int op;
  	int adv;
  } op_adv[] = {
490ba833d   Stephen Warren   cmd_test: use tab...
35
36
37
38
39
40
41
42
43
44
  	{1, "=", OP_STR_EQ, 3},
  	{1, "!=", OP_STR_NEQ, 3},
  	{1, "<", OP_STR_LT, 3},
  	{1, ">", OP_STR_GT, 3},
  	{1, "-eq", OP_INT_EQ, 3},
  	{1, "-ne", OP_INT_NEQ, 3},
  	{1, "-lt", OP_INT_LT, 3},
  	{1, "-le", OP_INT_LE, 3},
  	{1, "-gt", OP_INT_GT, 3},
  	{1, "-ge", OP_INT_GE, 3},
d9b651ce3   Stephen Warren   cmd_test: impleme...
45
  	{0, "!", OP_NOT, 1},
4c80f29ed   Stephen Warren   cmd_test: check f...
46
47
48
49
  	{0, "-o", OP_OR, 1},
  	{0, "-a", OP_AND, 1},
  	{0, "-z", OP_STR_EMPTY, 2},
  	{0, "-n", OP_STR_NEMPTY, 2},
e5e897c01   Stephen Warren   cmd_test: impleme...
50
  	{0, "-e", OP_FILE_EXISTS, 4},
490ba833d   Stephen Warren   cmd_test: use tab...
51
  };
088f1b199   Kim Phillips   common/cmd_*.c: s...
52
  static int do_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
6b8f5ad10   Peter Tyser   command.c: Break ...
53
  {
54841ab50   Wolfgang Denk   Make sure that ar...
54
  	char * const *ap;
d9b651ce3   Stephen Warren   cmd_test: impleme...
55
  	int i, op, left, adv, expr, last_expr, last_unop, last_binop;
6b8f5ad10   Peter Tyser   command.c: Break ...
56
57
58
59
  
  	/* args? */
  	if (argc < 3)
  		return 1;
b0fe6abd7   Joe Hershberger   Change dead code ...
60
  #ifdef DEBUG
6b8f5ad10   Peter Tyser   command.c: Break ...
61
  	{
b0fe6abd7   Joe Hershberger   Change dead code ...
62
  		debug("test(%d):", argc);
6b8f5ad10   Peter Tyser   command.c: Break ...
63
64
  		left = 1;
  		while (argv[left])
b0fe6abd7   Joe Hershberger   Change dead code ...
65
  			debug(" '%s'", argv[left++]);
6b8f5ad10   Peter Tyser   command.c: Break ...
66
67
  	}
  #endif
d9b651ce3   Stephen Warren   cmd_test: impleme...
68
69
  	left = argc - 1;
  	ap = argv + 1;
2453de99d   Stephen Warren   cmd_test: evaluat...
70
  	expr = 0;
d9b651ce3   Stephen Warren   cmd_test: impleme...
71
72
  	last_unop = OP_INVALID;
  	last_binop = OP_INVALID;
6b8f5ad10   Peter Tyser   command.c: Break ...
73
74
  	last_expr = -1;
  	while (left > 0) {
490ba833d   Stephen Warren   cmd_test: use tab...
75
76
77
78
79
80
81
82
83
84
  		for (i = 0; i < ARRAY_SIZE(op_adv); i++) {
  			if (left <= op_adv[i].arg)
  				continue;
  			if (!strcmp(ap[op_adv[i].arg], op_adv[i].str)) {
  				op = op_adv[i].op;
  				adv = op_adv[i].adv;
  				break;
  			}
  		}
  		if (i == ARRAY_SIZE(op_adv)) {
6b8f5ad10   Peter Tyser   command.c: Break ...
85
86
87
  			expr = 1;
  			break;
  		}
490ba833d   Stephen Warren   cmd_test: use tab...
88
89
90
  		if (left < adv) {
  			expr = 1;
  			break;
6b8f5ad10   Peter Tyser   command.c: Break ...
91
  		}
490ba833d   Stephen Warren   cmd_test: use tab...
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  		switch (op) {
  		case OP_STR_EMPTY:
  			expr = strlen(ap[1]) == 0 ? 1 : 0;
  			break;
  		case OP_STR_NEMPTY:
  			expr = strlen(ap[1]) == 0 ? 0 : 1;
  			break;
  		case OP_STR_EQ:
  			expr = strcmp(ap[0], ap[2]) == 0;
  			break;
  		case OP_STR_NEQ:
  			expr = strcmp(ap[0], ap[2]) != 0;
  			break;
  		case OP_STR_LT:
  			expr = strcmp(ap[0], ap[2]) < 0;
  			break;
  		case OP_STR_GT:
  			expr = strcmp(ap[0], ap[2]) > 0;
  			break;
  		case OP_INT_EQ:
100e75bbd   T Karthik Reddy   cmd: avoid decima...
112
113
  			expr = simple_strtol(ap[0], NULL, 0) ==
  					simple_strtol(ap[2], NULL, 0);
490ba833d   Stephen Warren   cmd_test: use tab...
114
115
  			break;
  		case OP_INT_NEQ:
100e75bbd   T Karthik Reddy   cmd: avoid decima...
116
117
  			expr = simple_strtol(ap[0], NULL, 0) !=
  					simple_strtol(ap[2], NULL, 0);
490ba833d   Stephen Warren   cmd_test: use tab...
118
119
  			break;
  		case OP_INT_LT:
100e75bbd   T Karthik Reddy   cmd: avoid decima...
120
121
  			expr = simple_strtol(ap[0], NULL, 0) <
  					simple_strtol(ap[2], NULL, 0);
490ba833d   Stephen Warren   cmd_test: use tab...
122
123
  			break;
  		case OP_INT_LE:
100e75bbd   T Karthik Reddy   cmd: avoid decima...
124
125
  			expr = simple_strtol(ap[0], NULL, 0) <=
  					simple_strtol(ap[2], NULL, 0);
490ba833d   Stephen Warren   cmd_test: use tab...
126
127
  			break;
  		case OP_INT_GT:
100e75bbd   T Karthik Reddy   cmd: avoid decima...
128
129
  			expr = simple_strtol(ap[0], NULL, 0) >
  					simple_strtol(ap[2], NULL, 0);
490ba833d   Stephen Warren   cmd_test: use tab...
130
131
  			break;
  		case OP_INT_GE:
100e75bbd   T Karthik Reddy   cmd: avoid decima...
132
133
  			expr = simple_strtol(ap[0], NULL, 0) >=
  					simple_strtol(ap[2], NULL, 0);
490ba833d   Stephen Warren   cmd_test: use tab...
134
  			break;
e5e897c01   Stephen Warren   cmd_test: impleme...
135
136
137
  		case OP_FILE_EXISTS:
  			expr = file_exists(ap[1], ap[2], ap[3], FS_TYPE_ANY);
  			break;
6b8f5ad10   Peter Tyser   command.c: Break ...
138
  		}
490ba833d   Stephen Warren   cmd_test: use tab...
139
140
141
  		switch (op) {
  		case OP_OR:
  			last_expr = expr;
d9b651ce3   Stephen Warren   cmd_test: impleme...
142
  			last_binop = OP_OR;
490ba833d   Stephen Warren   cmd_test: use tab...
143
144
145
  			break;
  		case OP_AND:
  			last_expr = expr;
d9b651ce3   Stephen Warren   cmd_test: impleme...
146
147
148
149
150
151
152
  			last_binop = OP_AND;
  			break;
  		case OP_NOT:
  			if (last_unop == OP_NOT)
  				last_unop = OP_INVALID;
  			else
  				last_unop = OP_NOT;
490ba833d   Stephen Warren   cmd_test: use tab...
153
154
  			break;
  		default:
d9b651ce3   Stephen Warren   cmd_test: impleme...
155
156
157
158
159
160
  			if (last_unop == OP_NOT) {
  				expr = !expr;
  				last_unop = OP_INVALID;
  			}
  
  			if (last_binop == OP_OR)
6b8f5ad10   Peter Tyser   command.c: Break ...
161
  				expr = last_expr || expr;
d9b651ce3   Stephen Warren   cmd_test: impleme...
162
  			else if (last_binop == OP_AND)
6b8f5ad10   Peter Tyser   command.c: Break ...
163
  				expr = last_expr && expr;
d9b651ce3   Stephen Warren   cmd_test: impleme...
164
  			last_binop = OP_INVALID;
490ba833d   Stephen Warren   cmd_test: use tab...
165
  			break;
6b8f5ad10   Peter Tyser   command.c: Break ...
166
167
168
169
  		}
  
  		ap += adv; left -= adv;
  	}
6b8f5ad10   Peter Tyser   command.c: Break ...
170
171
172
173
174
175
176
  	expr = !expr;
  
  	debug (": returns %d
  ", expr);
  
  	return expr;
  }
09c328075   Heiko Schocher   mtd, nand: Move c...
177
178
  #undef true
  #undef false
6b8f5ad10   Peter Tyser   command.c: Break ...
179
180
181
182
183
  U_BOOT_CMD(
  	test,	CONFIG_SYS_MAXARGS,	1,	do_test,
  	"minimal test like /bin/sh",
  	"[args..]"
  );
396fd1733   Peter Tyser   Add 'true' and 'f...
184

088f1b199   Kim Phillips   common/cmd_*.c: s...
185
  static int do_false(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
396fd1733   Peter Tyser   Add 'true' and 'f...
186
187
188
189
190
191
192
193
194
  {
  	return 1;
  }
  
  U_BOOT_CMD(
  	false,	CONFIG_SYS_MAXARGS,	1,	do_false,
  	"do nothing, unsuccessfully",
  	NULL
  );
088f1b199   Kim Phillips   common/cmd_*.c: s...
195
  static int do_true(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
396fd1733   Peter Tyser   Add 'true' and 'f...
196
197
198
199
200
201
202
203
204
  {
  	return 0;
  }
  
  U_BOOT_CMD(
  	true,	CONFIG_SYS_MAXARGS,	1,	do_true,
  	"do nothing, successfully",
  	NULL
  );