]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
cli: hush_modern: Enable if keyword
authorFrancis Laniel <francis.laniel@amarulasolutions.com>
Fri, 22 Dec 2023 21:02:39 +0000 (22:02 +0100)
committerTom Rini <trini@konsulko.com>
Thu, 28 Dec 2023 17:02:56 +0000 (12:02 -0500)
Adds support for "if then else" construct both for command line interface and
through run_command().

Signed-off-by: Francis Laniel <francis.laniel@amarulasolutions.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/cli_hush_modern.c
common/cli_hush_upstream.c

index 15bb1f0d9245d0643254326b65c3b503ca7ba175..6360747f2104f9e487b578bd4dad21245d3e5c7f 100644 (file)
@@ -33,6 +33,7 @@
  */
 #define ENABLE_HUSH_INTERACTIVE        1
 #define ENABLE_FEATURE_EDITING 1
+#define ENABLE_HUSH_IF         1
 /* No MMU in U-Boot */
 #define BB_MMU                 0
 #define USE_FOR_NOMMU(...)     __VA_ARGS__
@@ -124,6 +125,11 @@ static void bb_error_msg(const char *s, ...)
        va_end(p);
 }
 
+static void bb_simple_error_msg(const char *s)
+{
+       bb_error_msg("%s", s);
+}
+
 static void *xmalloc(size_t size)
 {
        void *p = NULL;
@@ -147,6 +153,11 @@ static void *xrealloc(void *ptr, size_t size)
        return p;
 }
 
+static void *xmemdup(const void *s, int n)
+{
+       return memcpy(xmalloc(n), s, n);
+}
+
 #define xstrdup                strdup
 #define xstrndup       strndup
 
index a56ea6c5c8ff77819d42c08ab78078cb68844060..06af538a4887a662052707ea13a4f851155943ed 100644 (file)
@@ -1487,7 +1487,6 @@ static void msg_and_die_if_script(unsigned lineno, const char *fmt, ...)
        die_if_script();
 }
 
-#ifndef __U_BOOT__
 static void syntax_error(unsigned lineno UNUSED_PARAM, const char *msg)
 {
        if (msg)
@@ -1496,7 +1495,6 @@ static void syntax_error(unsigned lineno UNUSED_PARAM, const char *msg)
                bb_simple_error_msg("syntax error");
        die_if_script();
 }
-#endif /* !__U_BOOT__ */
 
 static void syntax_error_at(unsigned lineno UNUSED_PARAM, const char *msg)
 {
@@ -3961,7 +3959,6 @@ static void debug_print_tree(struct pipe *pi, int lvl)
                [PIPE_OR ] = "OR" ,
                [PIPE_BG ] = "BG" ,
        };
-#ifndef __U_BOOT__
        static const char *RES[] = {
                [RES_NONE ] = "NONE" ,
 # if ENABLE_HUSH_IF
@@ -3991,7 +3988,6 @@ static void debug_print_tree(struct pipe *pi, int lvl)
                [RES_XXXX ] = "XXXX" ,
                [RES_SNTX ] = "SNTX" ,
        };
-#endif /* !__U_BOOT__ */
        static const char *const CMDTYPE[] = {
                "{}",
                "()",
@@ -4009,10 +4005,8 @@ static void debug_print_tree(struct pipe *pi, int lvl)
                                lvl*2, "",
                                pin,
                                pi->num_cmds,
-#ifdef __U_BOOT__
                                (IF_HAS_KEYWORDS(pi->pi_inverted ? "! " :) ""),
                                RES[pi->res_word],
-#endif /* !__U_BOOT__ */
                                pi->followup, PIPE[pi->followup]
                );
                prn = 0;
@@ -9832,6 +9826,7 @@ static NOINLINE int run_pipe(struct pipe *pi)
                rcode = 1; /* exitcode if redir failed */
 #ifndef __U_BOOT__
                if (setup_redirects(command, &squirrel) == 0) {
+#endif /* !__U_BOOT__ */
                        debug_printf_exec(": run_list\n");
 //FIXME: we need to pass squirrel down into run_list()
 //for SH_STANDALONE case, or else this construct:
@@ -9840,10 +9835,11 @@ static NOINLINE int run_pipe(struct pipe *pi)
 //and in SH_STANDALONE mode, "find" is not execed,
 //therefore CLOEXEC on saved fd does not help.
                        rcode = run_list(command->group) & 0xff;
+#ifndef __U_BOOT__
                }
                restore_redirects(squirrel);
-               IF_HAS_KEYWORDS(if (pi->pi_inverted) rcode = !rcode;)
 #endif /* !__U_BOOT__ */
+               IF_HAS_KEYWORDS(if (pi->pi_inverted) rcode = !rcode;)
                debug_leave();
                debug_printf_exec("run_pipe: return %d\n", rcode);
                return rcode;
@@ -10362,12 +10358,12 @@ static int run_list(struct pipe *pi)
                        break;
                if (G_flag_return_in_progress == 1)
                        break;
+#endif /* !__U_BOOT__ */
 
                IF_HAS_KEYWORDS(rword = pi->res_word;)
                debug_printf_exec(": rword=%d cond_code=%d last_rword=%d\n",
                                rword, cond_code, last_rword);
 
-#endif /* !__U_BOOT__ */
                sv_errexit_depth = G.errexit_depth;
                if (
 #if ENABLE_HUSH_IF