2 * (C) Copyright 2000-2003
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5 * SPDX-License-Identifier: GPL-2.0
8 /* Command Processor Table */
12 void print_cmd_help(cmd_tbl_t *cmdtp)
15 if (cmdtp->help != NULL) {
16 printf("Usage:\n%s %s\n", cmdtp->name, cmdtp->help);
18 printf("Usage:\n%s %s\n", cmdtp->name, cmdtp->usage);
21 printf("Usage:\n%s %s\n", cmdtp->name, cmdtp->usage);
25 int do_version(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
27 extern char version_string[];
29 puts("Version and build date:\n");
30 printf(" %s, " MK_STR(CONFIG_BUILD_DATE_UTC) "\n\n", version_string);
32 puts("Modification by:\n");
33 puts(" Piotr Dymacz <piotr@dymacz.pl>\n");
34 puts(" https://github.com/pepe2k/u-boot_mod\n\n");
39 U_BOOT_CMD(version, 1, 1, do_version, "print U-Boot version\n", NULL);
41 #if defined(CONFIG_CMD_ECHO)
42 int do_echo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
47 for (i = 1; i < argc; i++) {
49 char *nls; /* new-line suppression */
54 nls = strstr(p, "\\c");
60 * be paranoid and guess that someone might
61 * say \c more than once
68 nls = strstr(prenls, "\\c");
82 U_BOOT_CMD(echo, CFG_MAXARGS, 1, do_echo,
83 "echo args to console\n", "[args..]\n"
84 "\t- echo args to console; \\c suppresses newline\n");
85 #endif /* CONFIG_CMD_ECHO */
87 #ifdef CFG_HUSH_PARSER
88 int do_test(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
91 int adv, expr, last_expr, last_cmp, left, neg;
101 if (left > 0 && strcmp(ap[0], "!") == 0) {
114 if (strcmp(ap[0], "-o") == 0 ||
115 strcmp(ap[0], "-a") == 0) {
117 } else if (strcmp(ap[0], "-z") == 0 ||
118 strcmp(ap[0], "-n") == 0) {
130 if (strcmp(ap[0], "-o") == 0) {
133 } else if (strcmp(ap[0], "-a") == 0) {
143 if (strcmp(ap[0], "-z") == 0) {
144 expr = strlen(ap[1]) == 0 ? 1 : 0;
145 } else if (strcmp(ap[0], "-n") == 0) {
146 expr = strlen(ap[1]) == 0 ? 0 : 1;
153 expr = last_expr || expr;
154 } else if (last_cmp == 1) {
155 expr = last_expr && expr;
162 if (strcmp(ap[1], "=") == 0) {
163 expr = strcmp(ap[0], ap[2]) == 0;
164 } else if (strcmp(ap[1], "!=") == 0) {
165 expr = strcmp(ap[0], ap[2]) != 0;
166 } else if (strcmp(ap[1], ">") == 0) {
167 expr = strcmp(ap[0], ap[2]) > 0;
168 } else if (strcmp(ap[1], "<") == 0) {
169 expr = strcmp(ap[0], ap[2]) < 0;
170 } else if (strcmp(ap[1], "-eq") == 0) {
171 expr = simple_strtol(ap[0], NULL, 10)
172 == simple_strtol(ap[2], NULL, 10);
173 } else if (strcmp(ap[1], "-ne") == 0) {
174 expr = simple_strtol(ap[0], NULL, 10)
175 != simple_strtol(ap[2], NULL, 10);
176 } else if (strcmp(ap[1], "-lt") == 0) {
177 expr = simple_strtol(ap[0], NULL, 10)
178 < simple_strtol(ap[2], NULL, 10);
179 } else if (strcmp(ap[1], "-le") == 0) {
180 expr = simple_strtol(ap[0], NULL, 10)
181 <= simple_strtol(ap[2], NULL, 10);
182 } else if (strcmp(ap[1], "-gt") == 0) {
183 expr = simple_strtol(ap[0], NULL, 10)
184 > simple_strtol(ap[2], NULL, 10);
185 } else if (strcmp(ap[1], "-ge") == 0) {
186 expr = simple_strtol(ap[0], NULL, 10)
187 >= simple_strtol(ap[2], NULL, 10);
194 expr = last_expr || expr;
195 } else if (last_cmp == 1) {
196 expr = last_expr && expr;
202 ap += adv; left -= adv;
213 U_BOOT_CMD(test, CFG_MAXARGS, 1, do_test,
214 "minimal test like /bin/sh\n", "[args..]\n"
215 "\t- test functionality\n");
217 int do_exit(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
222 r = simple_strtoul(argv[1], NULL, 10);
227 U_BOOT_CMD(exit, 2, 1, do_exit,
228 "exit script\n", "\n\t- exit functionality\n");
229 #endif /* CFG_HUSH_PARSER */
232 * Use puts() instead of printf() to avoid printf buffer overflow
233 * for long help messages
235 int do_help(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
240 /* Show list of commands */
243 int cmd_items = &__u_boot_cmd_end - &__u_boot_cmd_start;
245 cmd_tbl_t *cmd_array[cmd_items];
246 int i, j, swaps, max_len = 0;
248 /* Make array of commands from .uboot_cmd section */
249 cmdtp = &__u_boot_cmd_start;
251 for (i = 0; i < cmd_items; i++) {
252 cmd_array[i] = cmdtp++;
255 /* Sort command list (trivial bubble sort) */
256 for (i = cmd_items - 1; i > 0; --i) {
258 for (j = 0; j < i; ++j) {
259 const char *name = cmd_array[j]->name;
261 if (strlen(name) >= max_len)
262 max_len = strlen(name);
264 if (strcmp(cmd_array[j]->name,
265 cmd_array[j + 1]->name) > 0) {
268 cmd_array[j] = cmd_array[j + 1];
269 cmd_array[j + 1] = tmp;
278 /* Print short help (usage) */
279 for (i = 0; i < cmd_items; i++) {
280 const char *usage = cmd_array[i]->usage;
281 const char *name = cmd_array[i]->name;
283 /* Allow user abort */
290 /* Print aligned command name and usage */
291 printf("%-*s - ", max_len, name);
299 /* Command help (long version) */
300 for (i = 1; i < argc; ++i) {
301 if ((cmdtp = find_cmd(argv[i])) != NULL) {
303 /* Found - print (long) help info */
310 puts("- there is no help for this command\n");
318 #endif /* CFG_LONGHELP */
320 printf("Unknown command '%s' - try 'help' without arguments\n\n", argv[i]);
328 U_BOOT_CMD(help, CFG_MAXARGS, 1, do_help,
329 "print embedded help\n", "[command ...]\n"
330 "\t- show help information for 'command' or short usage of all commands\n");
332 /* This do not ust the U_BOOT_CMD macro as ? can't be used in symbol names */
334 cmd_tbl_t __u_boot_cmd_question_mark Struct_Section = {"?", CFG_MAXARGS, 1, do_help, "alias for 'help'\n", NULL};
336 cmd_tbl_t __u_boot_cmd_question_mark Struct_Section = {"?", CFG_MAXARGS, 1, do_help, "alias for 'help'\n"};
337 #endif /* CFG_LONGHELP */
340 * Find command table entry for a command
342 cmd_tbl_t *find_cmd(const char *cmd)
348 cmd_tbl_t *cmdtp_temp = &__u_boot_cmd_start; /*Init value */
351 * Some commands allow length modifiers (like "cp.b");
352 * compare command name only until first dot.
354 len = ((p = strchr(cmd, '.')) == NULL) ? strlen(cmd) : (p - cmd);
356 for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) {
357 if (strncmp(cmd, cmdtp->name, len) == 0) {
359 if (len == strlen(cmdtp->name))
362 /* Abbreviated command ? */
368 /* Exactly one match */
372 /* Not found or ambiguous command */