+ /* just a placeholder, no handler */
+ if (c->handler==NULL)
+ return c;
+
+ /* If this is a two level command, e.g. "flash banks", then the
+ * "unknown" proc in startup.tcl must redirect to this command.
+ *
+ * "flash banks" is translated by "unknown" to "flash_banks"
+ * if such a proc exists
+ */
+ /* Print help for command */
+ const char *t1="";
+ const char *t2="";
+ const char *t3="";
+ /* maximum of two levels :-) */
+ if (c->parent!=NULL)
+ {
+ t1=c->parent->name;
+ t2="_";
+ }
+ t3=c->name;
+ const char *full_name=alloc_printf("ocd_%s%s%s", t1, t2, t3);
+ Jim_CreateCommand(interp, full_name, script_command, c, NULL);
+ free((void *)full_name);
+
+ /* we now need to add an overrideable proc */
+ const char *override_name=alloc_printf("proc %s%s%s {args} {if {[catch {eval \"ocd_%s%s%s $args\"}]==0} {return \"\"} else { return -code error }", t1, t2, t3, t1, t2, t3);
+ Jim_Eval_Named(interp, override_name, __FILE__, __LINE__ );
+ free((void *)override_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));