summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZachary T Welch <zw@superlucidity.net>2009-11-11 08:20:09 -0800
committerZachary T Welch <zw@superlucidity.net>2009-11-11 12:15:39 -0800
commita1a3ee579ca8485f7840c7140e4a006f83b797d2 (patch)
tree4d8804130390e670033e76b97aef45cdb694777c
parent2d3cc1eac126990c5cd4ca8a47b0c09814dc1e5c (diff)
downloadopenocd+libswd-a1a3ee579ca8485f7840c7140e4a006f83b797d2.tar.gz
openocd+libswd-a1a3ee579ca8485f7840c7140e4a006f83b797d2.tar.bz2
openocd+libswd-a1a3ee579ca8485f7840c7140e4a006f83b797d2.tar.xz
openocd+libswd-a1a3ee579ca8485f7840c7140e4a006f83b797d2.zip
eliminate duplicate helptext management
Add helpers to manage adding entries to the helptext list. Adds support for arbitrarily nested commands.
-rw-r--r--src/helper/command.c61
1 files changed, 30 insertions, 31 deletions
diff --git a/src/helper/command.c b/src/helper/command.c
index 86158d72..a4ac4af0 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -162,6 +162,32 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
return (retval == ERROR_OK)?JIM_OK:JIM_ERR;
}
+static Jim_Obj *command_name_list(struct command_s *c)
+{
+ Jim_Obj *cmd_list = c->parent ?
+ command_name_list(c->parent) :
+ Jim_NewListObj(interp, NULL, 0);
+ Jim_ListAppendElement(interp, cmd_list,
+ Jim_NewStringObj(interp, c->name, -1));
+
+ return cmd_list;
+}
+
+static void command_helptext_add(Jim_Obj *cmd_list, const char *help)
+{
+ Jim_Obj *cmd_entry = Jim_NewListObj(interp, NULL, 0);
+ Jim_ListAppendElement(interp, cmd_entry, cmd_list);
+ Jim_ListAppendElement(interp, cmd_entry,
+ Jim_NewStringObj(interp, help ? : "", -1));
+
+ /* accumulate help text in Tcl helptext list. */
+ Jim_Obj *helptext = Jim_GetGlobalVariableStr(interp,
+ "ocd_helptext", JIM_ERRMSG);
+ if (Jim_IsShared(helptext))
+ helptext = Jim_DuplicateObj(interp, helptext);
+ Jim_ListAppendElement(interp, helptext, cmd_entry);
+}
+
/* nice short description of source file */
#define __THIS__FILE__ "command.c"
@@ -179,8 +205,6 @@ command_t* register_command(command_context_t *context, command_t *parent, char
c->children = NULL;
c->handler = handler;
c->mode = mode;
- if (!help)
- help="";
c->next = NULL;
/* place command in tree */
@@ -233,24 +257,8 @@ command_t* register_command(command_context_t *context, command_t *parent, char
free((void *)full_name);
- /* accumulate help text in Tcl helptext list. */
- Jim_Obj *helptext = Jim_GetGlobalVariableStr(interp, "ocd_helptext", JIM_ERRMSG);
- if (Jim_IsShared(helptext))
- helptext = Jim_DuplicateObj(interp, helptext);
- Jim_Obj *cmd_entry = Jim_NewListObj(interp, NULL, 0);
-
- Jim_Obj *cmd_list = Jim_NewListObj(interp, NULL, 0);
-
- /* maximum of two levels :-) */
- if (c->parent != NULL)
- {
- Jim_ListAppendElement(interp, cmd_list, Jim_NewStringObj(interp, c->parent->name, -1));
- }
- Jim_ListAppendElement(interp, cmd_list, Jim_NewStringObj(interp, c->name, -1));
+ command_helptext_add(command_name_list(c), help);
- Jim_ListAppendElement(interp, cmd_entry, cmd_list);
- Jim_ListAppendElement(interp, cmd_entry, Jim_NewStringObj(interp, help, -1));
- Jim_ListAppendElement(interp, helptext, cmd_entry);
return c;
}
@@ -851,20 +859,11 @@ void register_jim(struct command_context_s *cmd_ctx, const char *name, int (*cmd
{
Jim_CreateCommand(interp, name, cmd, NULL, NULL);
- /* FIX!!! it would be prettier to invoke add_help_text...
- * accumulate help text in Tcl helptext list. */
- Jim_Obj *helptext = Jim_GetGlobalVariableStr(interp, "ocd_helptext", JIM_ERRMSG);
- if (Jim_IsShared(helptext))
- helptext = Jim_DuplicateObj(interp, helptext);
-
- Jim_Obj *cmd_entry = Jim_NewListObj(interp, NULL, 0);
-
Jim_Obj *cmd_list = Jim_NewListObj(interp, NULL, 0);
- Jim_ListAppendElement(interp, cmd_list, Jim_NewStringObj(interp, name, -1));
+ Jim_ListAppendElement(interp, cmd_list,
+ Jim_NewStringObj(interp, name, -1));
- Jim_ListAppendElement(interp, cmd_entry, cmd_list);
- Jim_ListAppendElement(interp, cmd_entry, Jim_NewStringObj(interp, help, -1));
- Jim_ListAppendElement(interp, helptext, cmd_entry);
+ command_helptext_add(cmd_list, help);
}
/* return global variable long value or 0 upon failure */