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 int do_version(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
14 extern char version_string[];
16 puts("Version and build date:\n");
17 printf(" %s\n " __DATE__ ", " __TIME__ "\n\n", version_string);
19 puts("Modification by:\n");
20 puts(" Piotr Dymacz <piotr@dymacz.pl>\n");
21 puts(" https://github.com/pepe2k/u-boot_mod\n\n");
26 U_BOOT_CMD(version, 1, 1, do_version,
27 "print U-Boot version\n",
30 #if (CONFIG_COMMANDS & CFG_CMD_ECHO)
31 int do_echo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
35 for (i = 1; i < argc; i++) {
41 while ((c = *p++) != '\0') {
42 if (c == '\\' && *p == 'c') {
57 U_BOOT_CMD(echo, CFG_MAXARGS, 1, do_echo,
58 "echo args to console\n",
59 "[args..]\n" "\t- echo args to console; \\c suppresses newline\n");
60 #endif /* CFG_CMD_ECHO */
62 #ifdef CFG_HUSH_PARSER
63 int do_test(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
65 int left, adv, expr, last_expr, neg, last_cmp;
76 if (left > 0 && strcmp(ap[0], "!") == 0) {
89 if (strcmp(ap[0], "-o") == 0 || strcmp(ap[0], "-a") == 0) {
91 } else if (strcmp(ap[0], "-z") == 0 || strcmp(ap[0], "-n") == 0) {
103 if (strcmp(ap[0], "-o") == 0) {
106 } else if (strcmp(ap[0], "-a") == 0) {
116 if (strcmp(ap[0], "-z") == 0) {
117 expr = strlen(ap[1]) == 0 ? 1 : 0;
118 } else if (strcmp(ap[0], "-n") == 0) {
119 expr = strlen(ap[1]) == 0 ? 0 : 1;
126 expr = last_expr || expr;
127 } else if (last_cmp == 1) {
128 expr = last_expr && expr;
135 if (strcmp(ap[1], "=") == 0) {
136 expr = strcmp(ap[0], ap[2]) == 0;
137 } else if (strcmp(ap[1], "!=") == 0) {
138 expr = strcmp(ap[0], ap[2]) != 0;
139 } else if (strcmp(ap[1], ">") == 0) {
140 expr = strcmp(ap[0], ap[2]) > 0;
141 } else if (strcmp(ap[1], "<") == 0) {
142 expr = strcmp(ap[0], ap[2]) < 0;
143 } else if (strcmp(ap[1], "-eq") == 0) {
144 expr = simple_strtol(ap[0], NULL, 10) == simple_strtol(ap[2], NULL, 10);
145 } else if (strcmp(ap[1], "-ne") == 0) {
146 expr = simple_strtol(ap[0], NULL, 10) != simple_strtol(ap[2], NULL, 10);
147 } else if (strcmp(ap[1], "-lt") == 0) {
148 expr = simple_strtol(ap[0], NULL, 10) < simple_strtol(ap[2], NULL, 10);
149 } else if (strcmp(ap[1], "-le") == 0) {
150 expr = simple_strtol(ap[0], NULL, 10) <= simple_strtol(ap[2], NULL, 10);
151 } else if (strcmp(ap[1], "-gt") == 0) {
152 expr = simple_strtol(ap[0], NULL, 10) > simple_strtol(ap[2], NULL, 10);
153 } else if (strcmp(ap[1], "-ge") == 0) {
154 expr = simple_strtol(ap[0], NULL, 10) >= simple_strtol(ap[2], NULL, 10);
161 expr = last_expr || expr;
162 } else if (last_cmp == 1) {
163 expr = last_expr && expr;
169 ap += adv; left -= adv;
180 U_BOOT_CMD(test, CFG_MAXARGS, 1, do_test,
181 "minimal test like /bin/sh\n",
182 "[args..]\n\t- test functionality\n");
184 int do_exit(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
189 r = simple_strtoul(argv[1], NULL, 10);
194 U_BOOT_CMD(exit, 2, 1, do_exit,
196 "\n\t- exit functionality\n");
197 #endif /* CFG_HUSH_PARSER */
200 * Use puts() instead of printf() to avoid printf buffer overflow
201 * for long help messages
203 int do_help(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
208 /* Show list of commands */
211 int cmd_items = &__u_boot_cmd_end - &__u_boot_cmd_start;
213 cmd_tbl_t *cmd_array[cmd_items];
214 int i, j, swaps, max_len = 0;
216 /* Make array of commands from .uboot_cmd section */
217 cmdtp = &__u_boot_cmd_start;
219 for (i = 0; i < cmd_items; i++) {
220 cmd_array[i] = cmdtp++;
223 /* Sort command list (trivial bubble sort) */
224 for (i = cmd_items - 1; i > 0; --i) {
226 for (j = 0; j < i; ++j) {
227 const char *name = cmd_array[j]->name;
229 if (strlen(name) >= max_len)
230 max_len = strlen(name);
232 if (strcmp(cmd_array[j]->name, cmd_array[j + 1]->name) > 0) {
235 cmd_array[j] = cmd_array[j + 1];
236 cmd_array[j + 1] = tmp;
245 /* Print short help (usage) */
246 for (i = 0; i < cmd_items; i++) {
247 const char *usage = cmd_array[i]->usage;
248 const char *name = cmd_array[i]->name;
250 /* Allow user abort */
257 /* Print aligned command name and usage */
258 printf("%-*s - ", max_len, name);
266 /* Command help (long version) */
267 for (i = 1; i < argc; ++i) {
268 if ((cmdtp = find_cmd(argv[i])) != NULL) {
270 /* Found - print (long) help info */
277 puts("- there is no help for this command\n");
285 #endif /* CFG_LONGHELP */
287 printf("Unknown command '%s' - try 'help' without arguments\n\n", argv[i]);
295 U_BOOT_CMD(help, CFG_MAXARGS, 1, do_help,
296 "print embedded help\n",
298 "\t- show help information (for 'command')\n"
299 "\twithout arguments, it prints a short usage message for available commands.\n");
301 /* This do not ust the U_BOOT_CMD macro as ? can't be used in symbol names */
303 cmd_tbl_t __u_boot_cmd_question_mark Struct_Section = {"?", CFG_MAXARGS, 1, do_help, "alias for 'help'\n", NULL};
305 cmd_tbl_t __u_boot_cmd_question_mark Struct_Section = {"?", CFG_MAXARGS, 1, do_help, "alias for 'help'\n"};
306 #endif /* CFG_LONGHELP */
309 * Find command table entry for a command
311 cmd_tbl_t *find_cmd(const char *cmd)
314 cmd_tbl_t *cmdtp_temp = &__u_boot_cmd_start; /*Init value */
320 * Some commands allow length modifiers (like "cp.b");
321 * compare command name only until first dot.
323 len = ((p = strchr(cmd, '.')) == NULL) ? strlen(cmd) : (p - cmd);
325 for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) {
326 if (strncmp(cmd, cmdtp->name, len) == 0) {
328 if (len == strlen(cmdtp->name))
331 /* Abbreviated command ? */
337 /* Exactly one match */
341 /* Not found or ambiguous command */