cli: hush_modern: Enable loops

Enables the use of for, while and until loops for command line as
well as with run_command().

Signed-off-by: Francis Laniel <francis.laniel@amarulasolutions.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Francis Laniel 2023-12-22 22:02:40 +01:00 committed by Tom Rini
parent 374b77ed9e
commit e252f50f27
2 changed files with 15 additions and 1 deletions

View File

@ -34,6 +34,7 @@
#define ENABLE_HUSH_INTERACTIVE 1
#define ENABLE_FEATURE_EDITING 1
#define ENABLE_HUSH_IF 1
#define ENABLE_HUSH_LOOPS 1
/* No MMU in U-Boot */
#define BB_MMU 0
#define USE_FOR_NOMMU(...) __VA_ARGS__

View File

@ -10348,7 +10348,7 @@ static int run_list(struct pipe *pi)
#ifndef __U_BOOT__
for (; pi; pi = IF_HUSH_LOOPS(rword == RES_DONE ? loop_top : ) pi->next) {
#else /* __U_BOOT__ */
for (; pi; pi = pi->next) {
for (; pi; pi = rword == RES_DONE ? loop_top : pi->next) {
#endif /* __U_BOOT__ */
int r;
int sv_errexit_depth;
@ -10450,7 +10450,20 @@ static int run_list(struct pipe *pi)
}
/* Insert next value from for_lcur */
/* note: *for_lcur already has quotes removed, $var expanded, etc */
#ifndef __U_BOOT__
set_local_var(xasprintf("%s=%s", pi->cmds[0].argv[0], *for_lcur++), /*flag:*/ 0);
#else /* __U_BOOT__ */
/* We cannot use xasprintf, so we emulate it. */
char *full_var;
char *var = pi->cmds[0].argv[0];
char *val = *for_lcur++;
/* + 1 to take into account =. */
full_var = xmalloc(strlen(var) + strlen(val) + 1);
sprintf(full_var, "%s=%s", var, val);
set_local_var_modern(full_var, /*flag:*/ 0);
#endif /* __U_BOOT__ */
continue;
}
if (rword == RES_IN) {