int handle_time_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int handle_fast_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+/* forward declaration of jim_command */
+extern int jim_command(command_context_t *context, char *line);
+
int build_unique_lengths(command_context_t *context, command_t *commands)
{
command_t *c, *p;
return nwords;
}
+void command_output_text(command_context_t *context, const char *data)
+{
+ if( context && context->output_handler && data ){
+ context->output_handler( context, data );
+ }
+}
+
void command_print_n(command_context_t *context, char *format, ...)
{
char *string;
{
int start_word=0;
command_t *c;
- c=find_command(context, commands, words, num_words, start_word, &start_word);
- if (c==NULL)
+ c = find_command(context, commands, words, num_words, start_word, &start_word);
+ if (c == NULL)
{
- command_print(context, "Command %s not found", words[start_word]);
- return ERROR_COMMAND_SYNTAX_ERROR;
+ /* just return command not found */
+ return ERROR_COMMAND_NOTFOUND;
}
int retval = c->handler(context, c->name, words + start_word + 1, num_words - start_word - 1);
*/
LOG_DEBUG("Command failed with error code %d", retval);
}
+
return retval;
}
-int command_run_line_internal_op(command_context_t *context, char *line, int run)
+int command_run_line_internal(command_context_t *context, char *line)
{
LOG_USER_N("%s", ""); /* Keep GDB connection alive*/
nwords = parse_line(line, words, sizeof(words) / sizeof(words[0]));
if (nwords > 0)
- if (run)
- {
- retval = find_and_run_command(context, context->commands, words, nwords);
- } else
- {
- int t;
- return (find_command(context, context->commands, words, nwords, 0, &t)!=NULL)?ERROR_OK:ERROR_FAIL;
- }
+ {
+ retval = find_and_run_command(context, context->commands, words, nwords);
+ }
else
return ERROR_INVALID_ARGUMENTS;
return retval;
}
-int command_run_line_internal(command_context_t *context, char *line)
-{
- return command_run_line_internal_op(context, line, 1);
-}
-
int command_run_line(command_context_t *context, char *line)
{
- int retval;
- if ((!context) || (!line))
- return ERROR_INVALID_ARGUMENTS;
-
- if (command_run_line_internal_op(context, line, 0)!=ERROR_OK)
- {
- /* If we can't find a command, then try the interpreter.
- * If there is no interpreter implemented, then this will
- * simply print a syntax error.
- *
- * These hooks were left in to reduce patch size for
- * wip to add scripting language.
- */
- return jim_command(context, line);
- }
-
- return command_run_line_internal(context, line);
+ /* if a command is unknown to the "unknown" proc in tcl/commands.tcl will
+ * redirect it to OpenOCD.
+ *
+ * This avoids having to type the "openocd" prefix and makes OpenOCD
+ * commands "native" to Tcl.
+ */
+ return jim_command(context, line);
}
-int command_run_file(command_context_t *context, FILE *file, enum command_mode mode)
-{
- int retval = ERROR_OK;
- int old_command_mode;
- char *buffer=malloc(4096);
- if (buffer==NULL)
- {
- return ERROR_INVALID_ARGUMENTS;
- }
-
- old_command_mode = context->mode;
- context->mode = mode;
-
- while (fgets(buffer, 4096, file))
- {
- char *p;
- char *cmd, *end;
-
- /* stop processing line after a comment (#, !) or a LF, CR were encountered */
- if ((p = strpbrk(buffer, "#!\r\n")))
- *p = 0;
-
- /* skip over leading whitespace */
- cmd = buffer;
- while (isspace(*cmd))
- cmd++;
-
- /* empty (all whitespace) line? */
- if (!*cmd)
- continue;
-
- /* search the end of the current line, ignore trailing whitespace */
- for (p = end = cmd; *p; p++)
- if (!isspace(*p))
- end = p;
-
- /* terminate end */
- *++end = 0;
- if (strcasecmp(cmd, "quit") == 0)
- break;
-
- /* run line */
- if ((retval = command_run_line(context, cmd)) == ERROR_COMMAND_CLOSE_CONNECTION)
- break;
- }
-
- context->mode = old_command_mode;
-
-
- free(buffer);
-
- return retval;
-}
int command_run_linef(command_context_t *context, char *format, ...)
{
return command_print_help_match(context, context->commands, name, args, argc);
}
-void command_set_output_handler(command_context_t* context, int (*output_handler)(struct command_context_s *context, char* line), void *priv)
+void command_set_output_handler(command_context_t* context, int (*output_handler)(struct command_context_s *context, const char* line), void *priv)
{
context->output_handler = output_handler;
context->output_handler_priv = priv;
duration_start_measure(&duration);
retval = find_and_run_command(cmd_ctx, cmd_ctx->commands, args, argc);
+ if (retval == ERROR_COMMAND_NOTFOUND)
+ {
+ command_print(cmd_ctx, "Command %s not found", args[0]);
+ }
duration_stop_measure(&duration, &duration_text);