extern struct command_context *global_cmd_ctx;
+/* dump a single line to the log for the command.
+ * Do nothing in case we are not at debug level 3 */
void script_debug(Jim_Interp *interp, const char *name,
unsigned argc, Jim_Obj *const *argv)
{
- LOG_DEBUG("command - %s", name);
+ if (debug_level < LOG_LVL_DEBUG)
+ return;
+
+ char * dbg = alloc_printf("command - %s", name);
for (unsigned i = 0; i < argc; i++)
{
int len;
if (*w == '#')
break;
- LOG_DEBUG("%s - argv[%d]=%s", name, i, w);
+ char * t = alloc_printf("%s %s", dbg, w);
+ free (dbg);
+ dbg = t;
}
+ LOG_DEBUG("%s", dbg);
+ free(dbg);
}
static void script_command_args_free(const char **words, unsigned nwords)
return words;
}
-static struct command_context *current_command_context(Jim_Interp *interp)
+struct command_context *current_command_context(Jim_Interp *interp)
{
/* grab the command context from the associated data */
struct command_context *cmd_ctx = Jim_GetAssocData(interp, "context");
if (NULL == cmd_ctx)
{
/* Tcl can invoke commands directly instead of via command_run_line(). This would
- * happen when the Jim Tcl interpreter is provided by eCos.
+ * happen when the Jim Tcl interpreter is provided by eCos or if we are running
+ * commands in a startup script.
+ *
+ * A telnet or gdb server would provide a non-default command context to
+ * handle piping of error output, have a separate current target, etc.
*/
cmd_ctx = global_cmd_ctx;
}
if (NULL == override_name)
return JIM_ERR;
- retval = Jim_Eval_Named(interp, override_name, __FILE__, __LINE__);
+ retval = Jim_Eval_Named(interp, override_name, 0, 0);
free((void *)override_name);
return retval;
struct command *c = command_find(*head, name);
if (NULL != c)
{
- LOG_ERROR("command '%s' is already registered in '%s' context",
+ /* TODO: originally we treated attempting to register a cmd twice as an error
+ * Sometimes we need this behaviour, such as with flash banks.
+ * http://www.mail-archive.com/openocd-development@lists.berlios.de/msg11152.html */
+ LOG_DEBUG("command '%s' is already registered in '%s' context",
name, parent ? parent->name : "<global>");
return c;
}
retcode = Jim_SetAssocData(interp, "retval", NULL, &retval);
if (retcode == JIM_OK)
{
- retcode = Jim_Eval_Named(interp, line, __THIS__FILE__, __LINE__);
+ retcode = Jim_Eval_Named(interp, line, 0, 0);
Jim_DeleteAssocData(interp, "retval");
}
{
struct command_context *cmd_ctx = current_command_context(interp);
enum command_mode mode;
+
if (argc > 1)
{
struct command *c = cmd_ctx->commands;
return help_add_command(CMD_CTX, c, cmd_name, help, usage);
}
-/* sleep command sleeps for <n> miliseconds
+/* sleep command sleeps for <n> milliseconds
* this is useful in target startup scripts
*/
COMMAND_HANDLER(handle_sleep_command)
{
.name = "mode",
.mode = COMMAND_ANY,
- .jim_handler = &jim_command_mode,
- .usage = "[<name> ...]",
+ .jim_handler = jim_command_mode,
+ .usage = "[command_name ...]",
.help = "Returns the command modes allowed by a command:"
"'any', 'config', or 'exec'. If no command is"
- "specified, returns the current command mode.",
+ "specified, returns the current command mode. "
+ "Returns 'unknown' if an unknown command is given. "
+ "Command can be multiple tokens.",
},
{
.name = "type",
.mode = COMMAND_ANY,
- .jim_handler = &jim_command_type,
- .usage = "<name> ...",
+ .jim_handler = jim_command_type,
+ .usage = "command_name [...]",
.help = "Returns the type of built-in command:"
- "'native', 'simple', 'group', or 'unknown'",
+ "'native', 'simple', 'group', or 'unknown'. "
+ "Command can be multiple tokens.",
},
COMMAND_REGISTRATION_DONE
};
static const struct command_registration command_builtin_handlers[] = {
{
.name = "add_help_text",
- .handler = &handle_help_add_command,
+ .handler = handle_help_add_command,
.mode = COMMAND_ANY,
- .help = "add new command help text",
- .usage = "<command> [...] <help_text>]",
+ .help = "Add new command help text; "
+ "Command can be multiple tokens.",
+ .usage = "command_name helptext_string",
},
{
.name = "add_usage_text",
- .handler = &handle_help_add_command,
+ .handler = handle_help_add_command,
.mode = COMMAND_ANY,
- .help = "add new command usage text",
- .usage = "<command> [...] <usage_text>]",
+ .help = "Add new command usage text; "
+ "command can be multiple tokens.",
+ .usage = "command_name usage_string",
},
{
.name = "sleep",
- .handler = &handle_sleep_command,
+ .handler = handle_sleep_command,
.mode = COMMAND_ANY,
- .help = "sleep for n milliseconds. "
- "\"busy\" will busy wait",
- .usage = "<n> [busy]",
+ .help = "Sleep for specified number of milliseconds. "
+ "\"busy\" will busy wait instead (avoid this).",
+ .usage = "milliseconds ['busy']",
},
{
.name = "help",
- .handler = &handle_help_command,
+ .handler = handle_help_command,
.mode = COMMAND_ANY,
- .help = "show full command help",
- .usage = "[<command> ...]",
+ .help = "Show full command help; "
+ "command can be multiple tokens.",
+ .usage = "[command_name]",
},
{
.name = "usage",
- .handler = &handle_help_command,
+ .handler = handle_help_command,
.mode = COMMAND_ANY,
- .help = "show basic command usage",
- .usage = "[<command> ...]",
+ .help = "Show basic command usage; "
+ "command can be multiple tokens.",
+ .usage = "[command_name]",
},
{
.name = "command",
#endif
context->interp = interp;
+ /* Stick to lowercase for HostOS strings. */
#if defined(_MSC_VER)
/* WinXX - is generic, the forward
* looking problem is this:
HostOs = "winxx";
#elif defined(__linux__)
HostOs = "linux";
-#elif defined(__DARWIN__)
+#elif defined(__APPLE__) || defined(__DARWIN__)
HostOs = "darwin";
#elif defined(__CYGWIN__)
HostOs = "cygwin";
HostOs = "mingw32";
#elif defined(__ECOS)
HostOs = "ecos";
+#elif defined(__FreeBSD__)
+ HostOs = "freebsd";
#else
-#warn unrecognized host OS...
+#warning "Unrecognized host OS..."
HostOs = "other";
#endif
Jim_SetGlobalVariableStr(interp, "ocd_HOSTOS",