From 74e30371742eca0adfb64d782a9d9010668a7148 Mon Sep 17 00:00:00 2001 From: Pawel Szewczyk Date: Tue, 19 Aug 2014 11:24:20 +0200 Subject: [PATCH] gt: Add function create/remove commands parsing Change-Id: I909275dba320ab61e0e5ff5b51d81a13ff011dad Signed-off-by: Pawel Szewczyk --- source/function/src/function.c | 201 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 200 insertions(+), 1 deletion(-) diff --git a/source/function/src/function.c b/source/function/src/function.c index 9181f70..cfe0865 100644 --- a/source/function/src/function.c +++ b/source/function/src/function.c @@ -15,8 +15,197 @@ */ #include +#include +#include #include "function.h" +#include "common.h" +#include "parser.h" + +static int gt_get_func_name(char **type, char **name, int argc, char **argv) +{ + int tmp; + + if (argc < 0) + return -1; + + if (strchr(argv[0], '.') != NULL) { + tmp = gt_parse_function_name(type, name, argv[0]); + if (tmp < 0) + return tmp; + return 1; + } + + if (argc < 2) + return -1; + + *type = strdup(argv[0]); + *name = strdup(argv[1]); + return 2; +} + +struct gt_func_create_data { + const char *gadget; + char *type; + char *name; + int opts; + struct gt_setting *attrs; +}; + +static void gt_func_create_destructor(void *data) +{ + struct gt_func_create_data *dt; + + if (data == NULL) + return; + + dt = (struct gt_func_create_data *)data; + free(dt->type); + free(dt->name); + gt_setting_list_cleanup(dt->attrs); + free(dt); +} + +static int gt_func_create_func(void *data) +{ + struct gt_func_create_data *dt; + struct gt_setting *ptr; + + dt = (struct gt_func_create_data *)data; + printf("Func create called successfully. Not implemented.\n"); + printf("gadget=%s, type=%s, name=%s, force=%d", + dt->gadget, dt->type, dt->name, !!(dt->opts & GT_FORCE)); + + for (ptr = dt->attrs; ptr->variable; ptr++) + printf(", %s=%s", ptr->variable, ptr->value); + + putchar('\n'); + + return 0; +} + +static int gt_func_create_help(void *data) +{ + printf("Func create help.\n"); + return -1; +} + +static void gt_parse_func_create(const Command *cmd, int argc, + char **argv, ExecutableCommand *exec, void * data) +{ + struct gt_func_create_data *dt = NULL; + int ind; + int tmp; + int avaible_opts = GT_FORCE; + + 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 < 2) + goto out; + + dt->gadget = argv[ind++]; + + tmp = gt_get_func_name(&dt->type, &dt->name, argc - ind, argv + ind); + if (tmp < 0) + goto out; + ind += tmp; + + tmp = gt_parse_setting_list(&dt->attrs, argc - ind, argv + ind); + if (tmp < 0) + goto out; + + executable_command_set(exec, gt_func_create_func, (void *)dt, + gt_func_create_destructor); + + return; +out: + gt_func_create_destructor(dt); + executable_command_set(exec, gt_func_create_help, data, NULL); +} + +struct gt_func_rm_data { + const char *gadget; + char *type; + char *name; + int opts; +}; + +static void gt_func_rm_destructor(void *data) +{ + struct gt_func_rm_data *dt; + + if (data == NULL) + return; + + dt = (struct gt_func_rm_data *)data; + free(dt->type); + free(dt->name); + free(dt); +} + +static int gt_func_rm_func(void *data) +{ + struct gt_func_rm_data *dt; + + dt = (struct gt_func_rm_data *)data; + printf("Func rm called successfully. Not implemented.\n"); + printf("gadget=%s, type=%s, name=%s, recursive=%d, force=%d\n", + dt->gadget, dt->type, dt->name, !!(dt->opts & GT_RECURSIVE), + !!(dt->opts & GT_FORCE)); + + return 0; +} + +static int gt_func_rm_help(void *data) +{ + printf("Func rm help.\n"); + return -1; +} + +static void gt_parse_func_rm(const Command *cmd, int argc, + char **argv, ExecutableCommand *exec, void * data) +{ + struct gt_func_rm_data *dt = NULL; + int ind; + int tmp; + int avaible_opts = GT_FORCE | 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 < 2) + goto out; + + dt->gadget = argv[ind++]; + + tmp = gt_get_func_name(&dt->type, &dt->name, argc - ind, argv + ind); + if (tmp < 0) + goto out; + ind += tmp; + + if (ind != argc) + goto out; + + executable_command_set(exec, gt_func_rm_func, (void *)dt, + gt_func_rm_destructor); + + return; +out: + gt_func_rm_destructor(dt); + executable_command_set(exec, gt_func_rm_help, data, NULL); +} + int gt_func_help(void *data) { @@ -27,7 +216,17 @@ int gt_func_help(void *data) const Command *gt_func_get_children(const Command *cmd) { static Command commands[] = { - {NULL, AGAIN, NULL, NULL, NULL} + {"create", NEXT, gt_parse_func_create, NULL, + gt_func_create_help}, + {"rm", NEXT, gt_parse_func_rm, NULL, gt_func_rm_help}, +// {"get", AGAIN, gt_parse_func_get, NULL, gt_func_get_help}, +// {"set", AGAIN, gt_parse_func_set, NULL, gt_func_set_help}, +// {"load", AGAIN, gt_parse_func_load, NULL, gt_func_load_help}, +// {"save", AGAIN, gt_parse_func_save, NULL, gt_func_save_help}. +// {"template", AGAIN, parse_command, +// gt_func_template_get_children, gt_func_template_help}, +// {NULL, PREV, gt_parse_func_func, NULL, gt_func_func_help}, + {NULL, AGAIN, NULL, NULL, NULL} }; return commands; } -- 2.7.4