diff options
author | Francis Laniel | 2023-12-22 22:02:40 +0100 |
---|---|---|
committer | Tom Rini | 2023-12-28 12:02:56 -0500 |
commit | e252f50f27841d2aad844dbebbe2d238a6e13f0d (patch) | |
tree | 06274d77075d6b1b06359d8cca54a70ca0210b97 /common | |
parent | 374b77ed9ee573da3f47f4fdaaf69cc82d657c52 (diff) |
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>
Diffstat (limited to 'common')
-rw-r--r-- | common/cli_hush_modern.c | 1 | ||||
-rw-r--r-- | common/cli_hush_upstream.c | 15 |
2 files changed, 15 insertions, 1 deletions
diff --git a/common/cli_hush_modern.c b/common/cli_hush_modern.c index 6360747f210..fb578c38535 100644 --- a/common/cli_hush_modern.c +++ b/common/cli_hush_modern.c @@ -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__ diff --git a/common/cli_hush_upstream.c b/common/cli_hush_upstream.c index 06af538a488..748edc9d2fd 100644 --- a/common/cli_hush_upstream.c +++ b/common/cli_hush_upstream.c @@ -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) { |