return words;
}
+static struct command_context *current_command_context(void)
+{
+ /* 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.
+ */
+ cmd_ctx = global_cmd_ctx;
+ }
+ return cmd_ctx;
+}
+
static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
/* the private data is stashed in the interp structure */
struct command *c;
- struct command_context *context;
int retval;
/* DANGER!!!! be careful what we invoke here, since interp->cmdPrivData might
if (NULL == words)
return JIM_ERR;
- /* grab the command context from the associated data */
- context = Jim_GetAssocData(interp, "context");
- if (context == NULL)
- {
- /* Tcl can invoke commands directly instead of via command_run_line(). This would
- * happen when the Jim Tcl interpreter is provided by eCos.
- */
- context = global_cmd_ctx;
- }
-
/* capture log output and return it */
Jim_Obj *tclOutput = Jim_NewStringObj(interp, "", 0);
/* a garbage collect can happen, so we need a reference count to this object */
log_add_callback(tcl_output, tclOutput);
- retval = run_command(context, c, (const char **)words, nwords);
+ struct command_context *cmd_ctx = current_command_context();
+ retval = run_command(cmd_ctx, c, (const char **)words, nwords);
log_remove_callback(tcl_output, tclOutput);
}
return NULL;
}
+struct command *command_find_in_context(struct command_context *cmd_ctx,
+ const char *name)
+{
+ return command_find(cmd_ctx->commands, name);
+}
+struct command *command_find_in_parent(struct command *parent,
+ const char *name)
+{
+ return command_find(parent->children, name);
+}
/**
* Add the command into the linked list, sorted by name.
int register_commands(struct command_context *cmd_ctx, struct command *parent,
const struct command_registration *cmds)
{
+ int retval = ERROR_OK;
unsigned i;
- for (i = 0; cmds[i].name; i++)
+ for (i = 0; cmds[i].name || cmds[i].chain; i++)
{
- struct command *c = register_command(cmd_ctx, parent, cmds + i);
- if (NULL != c)
- continue;
+ const struct command_registration *cr = cmds + i;
+ struct command *c = NULL;
+ if (NULL != cr->name)
+ {
+ c = register_command(cmd_ctx, parent, cr);
+ if (NULL == c)
+ {
+ retval = ERROR_FAIL;
+ break;
+ }
+ }
+ if (NULL != cr->chain)
+ {
+ struct command *p = c ? : parent;
+ retval = register_commands(cmd_ctx, p, cr->chain);
+ if (ERROR_OK != retval)
+ break;
+ }
+ }
+ if (ERROR_OK != retval)
+ {
for (unsigned j = 0; j < i; j++)
unregister_command(cmd_ctx, parent, cmds[j].name);
- return ERROR_FAIL;
}
- return ERROR_OK;
+ return retval;
}
int unregister_all_commands(struct command_context *context,