Blame view

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

490ba833d   Stephen Warren   cmd_test: use tab...
12
  #define OP_INVALID	0
d9b651ce3   Stephen Warren   cmd_test: impleme...
13
  #define OP_NOT		1
490ba833d   Stephen Warren   cmd_test: use tab...
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  #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...
28
  #define OP_FILE_EXISTS	16
490ba833d   Stephen Warren   cmd_test: use tab...
29
30
31
32
33
34
35
  
  const struct {
  	int arg;
  	const char *str;
  	int op;
  	int adv;
  } op_adv[] = {
490ba833d   Stephen Warren   cmd_test: use tab...
36
37
38
39
40
41
42
43
44
45
  	{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...
46
  	{0, "!", OP_NOT, 1},
4c80f29ed   Stephen Warren   cmd_test: check f...
47
48
49
50
  	{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...
51
  	{0, "-e", OP_FILE_EXISTS, 4},
490ba833d   Stephen Warren   cmd_test: use tab...
52
  };
088f1b199   Kim Phillips   common/cmd_*.c: s...
53
  static int do_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
6b8f5ad10   Peter Tyser   command.c: Break ...
54
  {
54841ab50   Wolfgang Denk   Make sure that ar...
55
  	char * const *ap;
d9b651ce3   Stephen Warren   cmd_test: impleme...
56
  	int i, op, left, adv, expr, last_expr, last_unop, last_binop;
6b8f5ad10   Peter Tyser   command.c: Break ...
57
58
59
60
  
  	/* args? */
  	if (argc < 3)
  		return 1;
b0fe6abd7   Joe Hershberger   Change dead code ...
61
  #ifdef DEBUG
6b8f5ad10   Peter Tyser   command.c: Break ...
62
  	{
b0fe6abd7   Joe Hershberger   Change dead code ...
63
  		debug("test(%d):", argc);
6b8f5ad10   Peter Tyser   command.c: Break ...
64
65
  		left = 1;
  		while (argv[left])
b0fe6abd7   Joe Hershberger   Change dead code ...
66
  			debug(" '%s'", argv[left++]);
6b8f5ad10   Peter Tyser   command.c: Break ...
67
68
  	}
  #endif
d9b651ce3   Stephen Warren   cmd_test: impleme...
69
70
  	left = argc - 1;
  	ap = argv + 1;
2453de99d   Stephen Warren   cmd_test: evaluat...
71
  	expr = 0;
d9b651ce3   Stephen Warren   cmd_test: impleme...
72
73
  	last_unop = OP_INVALID;
  	last_binop = OP_INVALID;
6b8f5ad10   Peter Tyser   command.c: Break ...
74
75
  	last_expr = -1;
  	while (left > 0) {
490ba833d   Stephen Warren   cmd_test: use tab...
76
77
78
79
80
81
82
83
84
85
  		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 ...
86
87
88
  			expr = 1;
  			break;
  		}
490ba833d   Stephen Warren   cmd_test: use tab...
89
90
91
  		if (left < adv) {
  			expr = 1;
  			break;
6b8f5ad10   Peter Tyser   command.c: Break ...
92
  		}
490ba833d   Stephen Warren   cmd_test: use tab...
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
135
  		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...
136
137
138
  		case OP_FILE_EXISTS:
  			expr = file_exists(ap[1], ap[2], ap[3], FS_TYPE_ANY);
  			break;
6b8f5ad10   Peter Tyser   command.c: Break ...
139
  		}
490ba833d   Stephen Warren   cmd_test: use tab...
140
141
142
  		switch (op) {
  		case OP_OR:
  			last_expr = expr;
d9b651ce3   Stephen Warren   cmd_test: impleme...
143
  			last_binop = OP_OR;
490ba833d   Stephen Warren   cmd_test: use tab...
144
145
146
  			break;
  		case OP_AND:
  			last_expr = expr;
d9b651ce3   Stephen Warren   cmd_test: impleme...
147
148
149
150
151
152
153
  			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...
154
155
  			break;
  		default:
d9b651ce3   Stephen Warren   cmd_test: impleme...
156
157
158
159
160
161
  			if (last_unop == OP_NOT) {
  				expr = !expr;
  				last_unop = OP_INVALID;
  			}
  
  			if (last_binop == OP_OR)
6b8f5ad10   Peter Tyser   command.c: Break ...
162
  				expr = last_expr || expr;
d9b651ce3   Stephen Warren   cmd_test: impleme...
163
  			else if (last_binop == OP_AND)
6b8f5ad10   Peter Tyser   command.c: Break ...
164
  				expr = last_expr && expr;
d9b651ce3   Stephen Warren   cmd_test: impleme...
165
  			last_binop = OP_INVALID;
490ba833d   Stephen Warren   cmd_test: use tab...
166
  			break;
6b8f5ad10   Peter Tyser   command.c: Break ...
167
168
169
170
  		}
  
  		ap += adv; left -= adv;
  	}
6b8f5ad10   Peter Tyser   command.c: Break ...
171
172
173
174
175
176
177
  	expr = !expr;
  
  	debug (": returns %d
  ", expr);
  
  	return expr;
  }
09c328075   Heiko Schocher   mtd, nand: Move c...
178
179
  #undef true
  #undef false
6b8f5ad10   Peter Tyser   command.c: Break ...
180
181
182
183
184
  U_BOOT_CMD(
  	test,	CONFIG_SYS_MAXARGS,	1,	do_test,
  	"minimal test like /bin/sh",
  	"[args..]"
  );
396fd1733   Peter Tyser   Add 'true' and 'f...
185

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