}
} else if (retval == ERROR_COMMAND_CLOSE_CONNECTION) {
/* just fall through for a shutdown request */
- } else if (retval != ERROR_OK) {
- /* we do not print out an error message because the command *should*
- * have printed out an error
- */
- char *full_name = command_name(c, ' ');
- LOG_DEBUG("Command '%s' failed with error code %d",
- full_name ? full_name : c->name, retval);
- free(full_name);
} else {
+ if (retval != ERROR_OK) {
+ char *full_name = command_name(c, ' ');
+ LOG_DEBUG("Command '%s' failed with error code %d",
+ full_name ? full_name : c->name, retval);
+ free(full_name);
+ }
/* Use the command output as the Tcl result */
Jim_SetResult(context->interp, cmd.output);
}
result = Jim_GetString(Jim_GetResult(interp), &reslen);
if (reslen > 0) {
- int i;
- char buff[256 + 1];
- for (i = 0; i < reslen; i += 256) {
- int chunk;
- chunk = reslen - i;
- if (chunk > 256)
- chunk = 256;
- strncpy(buff, result + i, chunk);
- buff[chunk] = 0;
- LOG_USER_N("%s", buff);
- }
- LOG_USER_N("\n");
+ command_output_text(context, result);
+ command_output_text(context, "\n");
}
retval = ERROR_OK;
} else if (retcode == JIM_EXIT) {
return retcode;
} else {
Jim_MakeErrorMessage(interp);
+ /* error is broadcast */
LOG_USER("%s", Jim_GetString(Jim_GetResult(interp), NULL));
if (retval == ERROR_OK) {
if (0 == CMD_ARGC)
return ERROR_COMMAND_SYNTAX_ERROR;
*out = command_find(head, CMD_ARGV[0]);
- if (NULL == *out && strncmp(CMD_ARGV[0], "ocd_", 4) == 0)
- *out = command_find(head, CMD_ARGV[0] + 4);
if (NULL == *out)
return ERROR_COMMAND_SYNTAX_ERROR;
if (--CMD_ARGC == 0)
}
static int command_unknown_find(unsigned argc, Jim_Obj *const *argv,
- struct command *head, struct command **out, bool top_level)
+ struct command *head, struct command **out)
{
if (0 == argc)
return argc;
const char *cmd_name = Jim_GetString(argv[0], NULL);
struct command *c = command_find(head, cmd_name);
- if (NULL == c && top_level && strncmp(cmd_name, "ocd_", 4) == 0)
- c = command_find(head, cmd_name + 4);
if (NULL == c)
return argc;
*out = c;
- return command_unknown_find(--argc, ++argv, (*out)->children, out, false);
+ return command_unknown_find(--argc, ++argv, (*out)->children, out);
+}
+
+static char *alloc_concatenate_strings(int argc, Jim_Obj * const *argv)
+{
+ char *prev, *all;
+ int i;
+
+ assert(argc >= 1);
+
+ all = strdup(Jim_GetString(argv[0], NULL));
+ if (!all) {
+ LOG_ERROR("Out of memory");
+ return NULL;
+ }
+
+ for (i = 1; i < argc; ++i) {
+ prev = all;
+ all = alloc_printf("%s %s", all, Jim_GetString(argv[i], NULL));
+ free(prev);
+ if (!all) {
+ LOG_ERROR("Out of memory");
+ return NULL;
+ }
+ }
+
+ return all;
+}
+
+static int run_usage(Jim_Interp *interp, int argc_valid, int argc, Jim_Obj * const *argv)
+{
+ struct command_context *cmd_ctx = current_command_context(interp);
+ char *command;
+ int retval;
+
+ assert(argc_valid >= 1);
+ assert(argc >= argc_valid);
+
+ command = alloc_concatenate_strings(argc_valid, argv);
+ if (!command)
+ return JIM_ERR;
+
+ retval = command_run_linef(cmd_ctx, "usage %s", command);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("unable to execute command \"usage %s\"", command);
+ return JIM_ERR;
+ }
+
+ if (argc_valid == argc)
+ LOG_ERROR("%s: command requires more arguments", command);
+ else {
+ free(command);
+ command = alloc_concatenate_strings(argc - argc_valid, argv + argc_valid);
+ if (!command)
+ return JIM_ERR;
+ LOG_ERROR("invalid subcommand \"%s\"", command);
+ }
+
+ free(command);
+ return retval;
}
static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
const char *cmd_name = Jim_GetString(argv[0], NULL);
- if (strcmp(cmd_name, "unknown") == 0) {
- if (argc == 1)
- return JIM_OK;
- argc--;
- argv++;
- }
script_debug(interp, cmd_name, argc, argv);
struct command_context *cmd_ctx = current_command_context(interp);
struct command *c = cmd_ctx->commands;
- int remaining = command_unknown_find(argc, argv, c, &c, true);
+ int remaining = command_unknown_find(argc, argv, c, &c);
/* if nothing could be consumed, then it's really an unknown command */
if (remaining == argc) {
const char *cmd = Jim_GetString(argv[0], NULL);
count = remaining + 1;
start = argv + (argc - remaining - 1);
} else {
- c = command_find(cmd_ctx->commands, "usage");
- if (NULL == c) {
- LOG_ERROR("unknown command, but usage is missing too");
- return JIM_ERR;
- }
count = argc - remaining;
start = argv;
+ run_usage(interp, count, argc, start);
+ return JIM_ERR;
}
/* pass the command through to the intended handler */
if (c->jim_handler) {
if (argc > 1) {
struct command *c = cmd_ctx->commands;
- int remaining = command_unknown_find(argc - 1, argv + 1, c, &c, true);
+ int remaining = command_unknown_find(argc - 1, argv + 1, c, &c);
/* if nothing could be consumed, then it's an unknown command */
if (remaining == argc - 1) {
Jim_SetResultString(interp, "unknown", -1);