Blame view

cmd/test.c 4 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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  		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:
  			expr = simple_strtol(ap[0], NULL, 10) ==
  					simple_strtol(ap[2], NULL, 10);
  			break;
  		case OP_INT_NEQ:
  			expr = simple_strtol(ap[0], NULL, 10) !=
  					simple_strtol(ap[2], NULL, 10);
  			break;
  		case OP_INT_LT:
  			expr = simple_strtol(ap[0], NULL, 10) <
  					simple_strtol(ap[2], NULL, 10);
  			break;
  		case OP_INT_LE:
  			expr = simple_strtol(ap[0], NULL, 10) <=
  					simple_strtol(ap[2], NULL, 10);
  			break;
  		case OP_INT_GT:
  			expr = simple_strtol(ap[0], NULL, 10) >
  					simple_strtol(ap[2], NULL, 10);
  			break;
  		case OP_INT_GE:
  			expr = simple_strtol(ap[0], NULL, 10) >=
  					simple_strtol(ap[2], NULL, 10);
  			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
  );