From 79a98269ec15532d54f8b52d06f40deae14464cd Mon Sep 17 00:00:00 2001 From: Pawel Szewczyk Date: Wed, 20 Aug 2014 13:26:44 +0200 Subject: [PATCH] gt: Add gadget template command parsing Change-Id: I61584d7ad774ee64118a92c71bba15ecf5055d29 Signed-off-by: Pawel Szewczyk --- source/gadget/src/gadget.c | 246 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 244 insertions(+), 2 deletions(-) diff --git a/source/gadget/src/gadget.c b/source/gadget/src/gadget.c index 2842120..d15c172 100644 --- a/source/gadget/src/gadget.c +++ b/source/gadget/src/gadget.c @@ -704,6 +704,248 @@ out: executable_command_set(exec, cmd->printHelp, data, NULL); } +struct gt_gadget_template_data { + const char *name; + int opts; +}; + +static int gt_gadget_template_func(void *data) +{ + struct gt_gadget_template_data *dt; + + dt = (struct gt_gadget_template_data *)data; + printf("Gadget template called successfully. Not implemented.\n"); + if (dt->name) + printf("name = %s, ", dt->name); + printf("verbose = %d, recursive = %d\n", + !!(dt->opts & GT_VERBOSE), !!(dt->opts & GT_RECURSIVE)); + return 0; +} + +static int gt_gadget_template_help(void *data) +{ + printf("Gadget template help.\n"); + return -1; +} + +static void gt_parse_gadget_template(const Command *cmd, int argc, + char **argv, ExecutableCommand *exec, void * data) +{ + int ind; + struct gt_gadget_template_data *dt; + int avaible_opts = GT_VERBOSE | GT_RECURSIVE; + + dt = zalloc(sizeof(*dt)); + if (dt == NULL) + goto out; + ind = gt_get_options(&dt->opts, avaible_opts, argc, argv); + if (ind < 0) + goto out; + + if (argc - ind > 1) + goto out; + + if (argv[ind]) + dt->name = argv[ind]; + + executable_command_set(exec, gt_gadget_template_func, (void *)dt, + free); + + return; +out: + free(dt); + executable_command_set(exec, cmd->printHelp, data, NULL); +} + +static int gt_gadget_template_rm_func(void *data) +{ + char *dt; + + dt = (char *)data; + printf("Gadget template rm called successfully. Not implemented.\n"); + printf("name = %s\n", dt); + return 0; +} + +static int gt_gadget_template_rm_help(void *data) +{ + printf("Gadget template rm help.\n"); + return -1; +} + +static void gt_parse_gadget_template_rm(const Command *cmd, int argc, + char **argv, ExecutableCommand *exec, void * data) +{ + const char *dt = NULL; + + if (argc != 1) + goto out; + + dt = argv[0]; + executable_command_set(exec, gt_gadget_template_rm_func, (void *)dt, + NULL); + + return; +out: + executable_command_set(exec, cmd->printHelp, data, NULL); +} + +struct gt_gadget_template_set_data { + const char *name; + struct gt_setting *attr; +}; + +static void gt_gadget_template_set_destructor(void *data) +{ + struct gt_gadget_template_set_data *dt; + + if (data == NULL) + return; + dt = (struct gt_gadget_template_set_data *)data; + gt_setting_list_cleanup(dt->attr); + free(dt); +} + +static int gt_gadget_template_set_func(void *data) +{ + struct gt_gadget_template_set_data *dt; + struct gt_setting *ptr; + + dt = (struct gt_gadget_template_set_data *)data; + printf("Gadget template set called successfully. Not implemened.\n"); + printf("name = %s", dt->name); + ptr = dt->attr; + while (ptr->variable) { + printf(", %s = %s", ptr->variable, ptr->value); + ptr++; + } + + putchar('\n'); + return 0; +} + +static int gt_gadget_template_set_help(void *data) +{ + printf("Gadget template set help.\n"); + return -1; +} + +static void gt_parse_gadget_template_set(const Command *cmd, int argc, + char **argv, ExecutableCommand *exec, void * data) +{ + int tmp; + struct gt_gadget_template_set_data *dt; + + dt = zalloc(sizeof(*dt)); + if (dt == NULL) + goto out; + + if (argc != 2) + goto out; + + dt->name = argv[0]; + tmp = gt_parse_setting_list(&dt->attr, argc-1, argv+1); + if (tmp < 0) + goto out; + + executable_command_set(exec, gt_gadget_template_set_func, (void *)dt, + gt_gadget_template_set_destructor); + + return; +out: + gt_gadget_template_set_destructor((void *)dt); + executable_command_set(exec, cmd->printHelp, data, NULL); +} + +struct gt_gadget_template_get_data { + const char *name; + const char **attr; +}; + +static void gt_gadget_template_get_destructor(void *data) +{ + struct gt_gadget_template_get_data *dt; + + if (data == NULL) + return; + dt = (struct gt_gadget_template_get_data *)data; + free(dt->attr); + free(dt); +} + +static int gt_gadget_template_get_func(void *data) +{ + struct gt_gadget_template_get_data *dt; + const char **ptr; + + dt = (struct gt_gadget_template_get_data *)data; + printf("Gadget template get called successfully. Not implemented.\n"); + printf("name = %s, attr = ", dt->name); + ptr = dt->attr; + while (*ptr) { + printf("%s, ", *ptr); + ptr++; + } + + putchar('\n'); + return 0; +} + +static int gt_gadget_template_get_help(void *data) +{ + printf("Gadget template get help.\n"); + return -1; +} + +static void gt_parse_gadget_template_get(const Command *cmd, int argc, + char **argv, ExecutableCommand *exec, void * data) +{ + int i; + struct gt_gadget_template_get_data *dt; + + dt = zalloc(sizeof(*dt)); + if (dt == NULL) + goto out; + + if (argc < 1) + goto out; + + dt->name = argv[0]; + dt->attr = calloc(argc, sizeof(char *)); + if (dt->attr == NULL) + goto out; + + argv++; + argc--; + for (i = 0; i < argc; i++) + dt->attr[i] = argv[i]; + + executable_command_set(exec, gt_gadget_template_get_func, (void *)dt, + gt_gadget_template_get_destructor); + + return; +out: + gt_gadget_template_get_destructor((void *)dt); + executable_command_set(exec, cmd->printHelp, data, NULL); +} + +const Command *get_gadget_template_children(const Command *cmd) +{ + static Command commands[] = { + {"get", NEXT, gt_parse_gadget_template_get, NULL, + gt_gadget_template_get_help}, + {"set", NEXT, gt_parse_gadget_template_set, NULL, + gt_gadget_template_set_help}, + {"rm", NEXT, gt_parse_gadget_template_rm, NULL, + gt_gadget_template_rm_help}, + {NULL, AGAIN, gt_parse_gadget_template, NULL, + gt_gadget_template_help}, + CMD_LIST_END + }; + + return commands; +} + const Command *get_gadget_children(const Command *cmd) { static Command commands[] = { @@ -718,8 +960,8 @@ const Command *get_gadget_children(const Command *cmd) gt_gadget_disable_help}, {"gadget", NEXT, gt_parse_gadget_gadget, NULL, gt_gadget_gadget_help}, -// {"template", AGAIN, gt_parse_gadget_template, NULL, -// gt_gadget_template_help}, + {"template", NEXT, command_parse, get_gadget_template_children, + gt_gadget_template_help}, {"load", NEXT, gt_parse_gadget_load, NULL, gt_gadget_load_help}, {"save", NEXT, gt_parse_gadget_save, NULL, -- 2.7.4