openocd: fix SPDX tag format for files .c
[fw/openocd] / src / helper / command.c
index 681e8705e75d26688e489c73761e47705abb6b4c..6898e2d7c644b073778f3f26a6c28f60c51859bb 100644 (file)
@@ -1,3 +1,5 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
  *   part of this file is taken from libcli (libcli.sourceforge.net)       *
  *   Copyright (C) David Parrish (david@dparrish.com)                      *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -137,41 +126,6 @@ static void command_log_capture_finish(struct log_capture_state *state)
        free(state);
 }
 
-/*
- * FIXME: workaround for memory leak in jimtcl 0.80
- * Jim API Jim_CreateCommand() converts the command name in a Jim object and
- * does not free the object. Fixed for jimtcl 0.81 by e4416cf86f0b
- * Use the internal jimtcl API Jim_CreateCommandObj, not exported by jim.h,
- * and override the bugged API through preprocessor's macro.
- * This workaround works only when jimtcl is compiled as OpenOCD submodule.
- * It's broken on macOS, so it's currently restricted on Linux only.
- * If jimtcl is linked-in from a precompiled library, either static or dynamic,
- * the symbol Jim_CreateCommandObj is not exported and the build will use the
- * bugged API.
- * To be removed when OpenOCD will switch to jimtcl 0.81
- */
-#if JIM_VERSION == 80 && defined __linux__
-static int workaround_createcommand(Jim_Interp *interp, const char *cmdName,
-       Jim_CmdProc *cmdProc, void *privData, Jim_DelCmdProc *delProc);
-int Jim_CreateCommandObj(Jim_Interp *interp, Jim_Obj *cmdNameObj,
-       Jim_CmdProc *cmdProc, void *privData, Jim_DelCmdProc *delProc)
-__attribute__((weak, alias("workaround_createcommand")));
-static int workaround_createcommand(Jim_Interp *interp, const char *cmdName,
-       Jim_CmdProc *cmdProc, void *privData, Jim_DelCmdProc *delProc)
-{
-       if ((void *)Jim_CreateCommandObj == (void *)workaround_createcommand)
-               return Jim_CreateCommand(interp, cmdName, cmdProc, privData, delProc);
-
-       Jim_Obj *cmd_name = Jim_NewStringObj(interp, cmdName, -1);
-       Jim_IncrRefCount(cmd_name);
-       int retval = Jim_CreateCommandObj(interp, cmd_name, cmdProc, privData, delProc);
-       Jim_DecrRefCount(interp, cmd_name);
-       return retval;
-}
-#define Jim_CreateCommand workaround_createcommand
-#endif /* JIM_VERSION == 80 && defined __linux__*/
-/* FIXME: end of workaround for memory leak in jimtcl 0.80 */
-
 static int command_retval_set(Jim_Interp *interp, int retval)
 {
        int *return_retval = Jim_GetAssocData(interp, "retval");
@@ -718,16 +672,18 @@ static int jim_find(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        return JIM_OK;
 }
 
-COMMAND_HANDLER(jim_echo)
+COMMAND_HANDLER(handle_echo)
 {
        if (CMD_ARGC == 2 && !strcmp(CMD_ARGV[0], "-n")) {
                LOG_USER_N("%s", CMD_ARGV[1]);
-               return JIM_OK;
+               return ERROR_OK;
        }
+
        if (CMD_ARGC != 1)
-               return JIM_ERR;
+               return ERROR_FAIL;
+
        LOG_USER("%s", CMD_ARGV[0]);
-       return JIM_OK;
+       return ERROR_OK;
 }
 
 /* Capture progress output and return as tcl return value. If the
@@ -746,14 +702,12 @@ static int jim_capture(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
         * This is necessary in order to avoid accidentally getting a non-empty
         * string for tcl fn's.
         */
-       bool save_poll = jtag_poll_get_enabled();
-
-       jtag_poll_set_enabled(false);
+       bool save_poll_mask = jtag_poll_mask();
 
        const char *str = Jim_GetString(argv[1], NULL);
        int retcode = Jim_Eval_Named(interp, str, __THIS__FILE__, __LINE__);
 
-       jtag_poll_set_enabled(save_poll);
+       jtag_poll_unmask(save_poll_mask);
 
        command_log_capture_finish(state);
 
@@ -815,9 +769,9 @@ static COMMAND_HELPER(command_help_show, struct help_entry *c,
 
        /* If the match string occurs anywhere, we print out
         * stuff for this command. */
-       bool is_match = (strstr(c->cmd_name, cmd_match) != NULL) ||
-               ((c->usage) && (strstr(c->usage, cmd_match) != NULL)) ||
-               ((c->help) && (strstr(c->help, cmd_match) != NULL));
+       bool is_match = strstr(c->cmd_name, cmd_match) ||
+               (c->usage && strstr(c->usage, cmd_match)) ||
+               (c->help && strstr(c->help, cmd_match));
 
        if (is_match) {
                if (c->usage && strlen(c->usage) > 0) {
@@ -954,8 +908,6 @@ static int exec_command(Jim_Interp *interp, struct command_context *cmd_ctx,
 
 static int jim_command_dispatch(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
 {
-       script_debug(interp, argc, argv);
-
        /* check subcommands */
        if (argc > 1) {
                char *s = alloc_printf("%s %s", Jim_GetString(argv[0], NULL), Jim_GetString(argv[1], NULL));
@@ -971,6 +923,8 @@ static int jim_command_dispatch(Jim_Interp *interp, int argc, Jim_Obj * const *a
                Jim_DecrRefCount(interp, js);
        }
 
+       script_debug(interp, argc, argv);
+
        struct command *c = jim_to_command(interp);
        if (!c->jim_handler && !c->handler) {
                Jim_EvalObjPrefix(interp, Jim_NewStringObj(interp, "usage", -1), 1, argv);
@@ -982,7 +936,19 @@ static int jim_command_dispatch(Jim_Interp *interp, int argc, Jim_Obj * const *a
        if (!command_can_run(cmd_ctx, c, Jim_GetString(argv[0], NULL)))
                return JIM_ERR;
 
-       target_call_timer_callbacks_now();
+       /*
+        * TODO: to be removed after v0.12.0
+        * workaround for https://sourceforge.net/p/openocd/tickets/362/
+        * After syntax change of "expr" in jimtcl 0.81
+        * the replacement of jimtcl "expr" with openocd version in
+        * https://review.openocd.org/6510/
+        * introduces too many target polling during math expressions with
+        * "expr" commands.
+        * After v0.12.0 replace the following two lines with
+        * target_call_timer_callbacks();
+        */
+       if (strcmp(c->name, "expr"))
+               target_call_timer_callbacks_now();
 
        /*
         * Black magic of overridden current target:
@@ -1178,6 +1144,7 @@ COMMAND_HANDLER(handle_sleep_command)
                int64_t then = timeval_ms();
                while (timeval_ms() - then < (int64_t)duration) {
                        target_call_timer_callbacks_now();
+                       keep_alive();
                        usleep(1000);
                }
        } else
@@ -1219,7 +1186,7 @@ static const struct command_registration command_builtin_handlers[] = {
        },
        {
                .name = "echo",
-               .handler = jim_echo,
+               .handler = handle_echo,
                .mode = COMMAND_ANY,
                .help = "Logs a message at \"user\" priority. "
                        "Option \"-n\" suppresses trailing newline",