]> git.sur5r.net Git - openocd/commitdiff
more command registration refactoring
authorZachary T Welch <zw@superlucidity.net>
Sat, 21 Nov 2009 21:33:32 +0000 (13:33 -0800)
committerZachary T Welch <zw@superlucidity.net>
Wed, 25 Nov 2009 05:37:30 +0000 (21:37 -0800)
Split out the handler registration into its own function, and add a
few obviously missing NULL pointer error checking.

src/helper/command.c

index 28952fda6fdfcdaeb8e7df0707a54d4d2dbbd63a..9cc996c226fbe563ad79a87b95d771574f53bc3c 100644 (file)
@@ -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;
 }