From 607634f967cf25630860794847dea770eb17a8f4 Mon Sep 17 00:00:00 2001 From: Zachary T Welch Date: Sat, 21 Nov 2009 13:33:32 -0800 Subject: [PATCH] more command registration refactoring Split out the handler registration into its own function, and add a few obviously missing NULL pointer error checking. --- src/helper/command.c | 54 +++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/src/helper/command.c b/src/helper/command.c index 28952fda6..9cc996c22 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -266,6 +266,38 @@ static void command_free(struct command *c) free(c); } +static int register_command_handler(struct command *c) +{ + int retval = -ENOMEM; + const char *full_name = command_name(c, '_'); + if (NULL == full_name) + return retval; + + const char *ocd_name = alloc_printf("ocd_%s", full_name); + if (NULL == full_name) + goto free_full_name; + + Jim_CreateCommand(interp, ocd_name, script_command, c, NULL); + free((void *)ocd_name); + + /* we now need to add an overrideable proc */ + const char *override_name = alloc_printf("proc %s {args} {" + "if {[catch {eval ocd_%s $args}] == 0} " + "{return \"\"} else {return -code error}}", + full_name, full_name); + if (NULL == full_name) + goto free_full_name; + + Jim_Eval_Named(interp, override_name, __THIS__FILE__, __LINE__); + free((void *)override_name); + + retval = ERROR_OK; + +free_full_name: + free((void *)full_name); + return retval; +} + struct command* register_command(struct command_context *context, struct command *parent, const struct command_registration *cr) { @@ -287,22 +319,12 @@ struct command* register_command(struct command_context *context, if (NULL == c || NULL == c->handler) return c; - const char *full_name = command_name(c, '_'); - - const char *ocd_name = alloc_printf("ocd_%s", full_name); - Jim_CreateCommand(interp, ocd_name, script_command, c, NULL); - free((void *)ocd_name); - - /* we now need to add an overrideable proc */ - const char *override_name = alloc_printf("proc %s {args} {" - "if {[catch {eval ocd_%s $args}] == 0} " - "{return \"\"} else {return -code error}}", - full_name, full_name); - Jim_Eval_Named(interp, override_name, __THIS__FILE__, __LINE__); - free((void *)override_name); - - free((void *)full_name); - + int retval = register_command_handler(c); + if (ERROR_OK != retval) + { + unregister_command(context, parent, name); + c = NULL; + } return c; }