From 4425aba1f218cdaeacc607a69287db4ad951b2d0 Mon Sep 17 00:00:00 2001 From: James Booth Date: Tue, 15 Apr 2014 00:13:32 +0100 Subject: [PATCH 1/2] Simplified parse_options to take gchar** --- src/command/commands.c | 10 ++------ src/tools/parser.c | 13 +++++++++- src/tools/parser.h | 2 +- tests/test_parser.c | 55 +++++++----------------------------------- 4 files changed, 24 insertions(+), 56 deletions(-) diff --git a/src/command/commands.c b/src/command/commands.c index 63ecb48e..2daa82d1 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -68,9 +68,7 @@ cmd_connect(gchar **args, struct cmd_help_t help) cons_show("You are either connected already, or a login is in process."); result = TRUE; } else { - GList *opt_keys = NULL; - opt_keys = g_list_append(opt_keys, "server"); - opt_keys = g_list_append(opt_keys, "port"); + gchar *opt_keys[] = { "server", "port", NULL }; gboolean parsed; GHashTable *options = parse_options(args, 1, opt_keys, &parsed); @@ -93,7 +91,6 @@ cmd_connect(gchar **args, struct cmd_help_t help) } options_destroy(options); - g_list_free(opt_keys); char *user = args[0]; char *lower = g_utf8_strdown(user, -1); @@ -1572,9 +1569,7 @@ cmd_join(gchar **args, struct cmd_help_t help) } // Additional args supplied - GList *opt_keys = NULL; - opt_keys = g_list_append(opt_keys, "nick"); - opt_keys = g_list_append(opt_keys, "password"); + gchar *opt_keys[] = { "nick", "password", NULL }; gboolean parsed; GHashTable *options = parse_options(args, 1, opt_keys, &parsed); @@ -1588,7 +1583,6 @@ cmd_join(gchar **args, struct cmd_help_t help) passwd = g_hash_table_lookup(options, "password"); options_destroy(options); - g_list_free(opt_keys); // In the case that a nick wasn't provided by the optional args... if (nick == NULL) { diff --git a/src/tools/parser.c b/src/tools/parser.c index 6db522aa..ff00b1e8 100644 --- a/src/tools/parser.c +++ b/src/tools/parser.c @@ -374,14 +374,21 @@ get_start(char *string, int tokens) } GHashTable * -parse_options(gchar **args, int start, GList *keys, gboolean *res) +parse_options(gchar **args, int start, gchar **opt_keys, gboolean *res) { + GList *keys = NULL; + int i; + for (i = 0; i < g_strv_length(opt_keys); i++) { + keys = g_list_append(keys, opt_keys[i]); + } + GHashTable *options = NULL; // no options found, success if (args[start] == NULL) { options = g_hash_table_new(g_str_hash, g_str_equal); *res = TRUE; + g_list_free(keys); return options; } @@ -392,24 +399,28 @@ parse_options(gchar **args, int start, GList *keys, gboolean *res) // check if option valid if (g_list_find_custom(keys, args[curr], (GCompareFunc)g_strcmp0) == NULL) { *res = FALSE; + g_list_free(keys); return options; } // check if duplicate if (g_list_find_custom(found_keys, args[curr], (GCompareFunc)g_strcmp0) != NULL) { *res = FALSE; + g_list_free(keys); return options; } // check value given if (args[curr+1] == NULL) { *res = FALSE; + g_list_free(keys); return options; } found_keys = g_list_append(found_keys, args[curr]); } g_list_free(found_keys); + g_list_free(keys); // create map options = g_hash_table_new(g_str_hash, g_str_equal); diff --git a/src/tools/parser.h b/src/tools/parser.h index aef3ad37..10ee627c 100644 --- a/src/tools/parser.h +++ b/src/tools/parser.h @@ -29,7 +29,7 @@ gchar** parse_args(const char * const inp, int min, int max, gboolean *result); gchar** parse_args_with_freetext(const char * const inp, int min, int max, gboolean *result); int count_tokens(char *string); char* get_start(char *string, int tokens); -GHashTable* parse_options(gchar **args, int start, GList *keys, gboolean *res); +GHashTable* parse_options(gchar **args, int start, gchar **keys, gboolean *res); void options_destroy(GHashTable *options); #endif \ No newline at end of file diff --git a/tests/test_parser.c b/tests/test_parser.c index df7836a0..b69151ab 100644 --- a/tests/test_parser.c +++ b/tests/test_parser.c @@ -508,9 +508,7 @@ void parse_options_when_none_returns_empty_hasmap(void **state) { gchar *args[] = { "cmd1", "cmd2", NULL }; - - GList *keys = NULL; - keys = g_list_append(keys, "opt1"); + gchar *keys[] = { "opt1", NULL }; gboolean res = FALSE; @@ -521,16 +519,13 @@ parse_options_when_none_returns_empty_hasmap(void **state) assert_true(res); options_destroy(options); - g_list_free(keys); } void parse_options_when_opt1_no_val_sets_error(void **state) { gchar *args[] = { "cmd1", "cmd2", "opt1", NULL }; - - GList *keys = NULL; - keys = g_list_append(keys, "opt1"); + gchar *keys[] = { "opt1", NULL }; gboolean res = TRUE; @@ -540,16 +535,13 @@ parse_options_when_opt1_no_val_sets_error(void **state) assert_false(res); options_destroy(options); - g_list_free(keys); } void parse_options_when_one_returns_map(void **state) { gchar *args[] = { "cmd1", "cmd2", "opt1", "val1", NULL }; - - GList *keys = NULL; - keys = g_list_append(keys, "opt1"); + gchar *keys[] = { "opt1", NULL }; gboolean res = FALSE; @@ -561,17 +553,13 @@ parse_options_when_one_returns_map(void **state) assert_true(res); options_destroy(options); - g_list_free(keys); } void parse_options_when_opt2_no_val_sets_error(void **state) { gchar *args[] = { "cmd1", "cmd2", "opt1", "val1", "opt2", NULL }; - - GList *keys = NULL; - keys = g_list_append(keys, "opt1"); - keys = g_list_append(keys, "opt2"); + gchar *keys[] = { "opt1", "opt2", NULL }; gboolean res = TRUE; @@ -581,17 +569,13 @@ parse_options_when_opt2_no_val_sets_error(void **state) assert_false(res); options_destroy(options); - g_list_free(keys); } void parse_options_when_two_returns_map(void **state) { gchar *args[] = { "cmd1", "cmd2", "opt1", "val1", "opt2", "val2", NULL }; - - GList *keys = NULL; - keys = g_list_append(keys, "opt1"); - keys = g_list_append(keys, "opt2"); + gchar *keys[] = { "opt1", "opt2", NULL }; gboolean res = FALSE; @@ -605,18 +589,13 @@ parse_options_when_two_returns_map(void **state) assert_true(res); options_destroy(options); - g_list_free(keys); } void parse_options_when_opt3_no_val_sets_error(void **state) { gchar *args[] = { "cmd1", "cmd2", "opt1", "val1", "opt2", "val2", "opt3", NULL }; - - GList *keys = NULL; - keys = g_list_append(keys, "opt1"); - keys = g_list_append(keys, "opt2"); - keys = g_list_append(keys, "opt3"); + gchar *keys[] = { "opt1", "opt2", "opt3", NULL }; gboolean res = TRUE; @@ -626,18 +605,13 @@ parse_options_when_opt3_no_val_sets_error(void **state) assert_false(res); options_destroy(options); - g_list_free(keys); } void parse_options_when_three_returns_map(void **state) { gchar *args[] = { "cmd1", "cmd2", "opt1", "val1", "opt2", "val2", "opt3", "val3", NULL }; - - GList *keys = NULL; - keys = g_list_append(keys, "opt1"); - keys = g_list_append(keys, "opt2"); - keys = g_list_append(keys, "opt3"); + gchar *keys[] = { "opt1", "opt2", "opt3", NULL }; gboolean res = FALSE; @@ -653,18 +627,13 @@ parse_options_when_three_returns_map(void **state) assert_true(res); options_destroy(options); - g_list_free(keys); } void parse_options_when_unknown_opt_sets_error(void **state) { gchar *args[] = { "cmd1", "cmd2", "opt1", "val1", "oops", "val2", "opt3", "val3", NULL }; - - GList *keys = NULL; - keys = g_list_append(keys, "opt1"); - keys = g_list_append(keys, "opt2"); - keys = g_list_append(keys, "opt3"); + gchar *keys[] = { "opt1", "opt2", "opt3", NULL }; gboolean res = TRUE; @@ -674,18 +643,13 @@ parse_options_when_unknown_opt_sets_error(void **state) assert_false(res); options_destroy(options); - g_list_free(keys); } void parse_options_with_duplicated_option_sets_error(void **state) { gchar *args[] = { "cmd1", "cmd2", "opt1", "val1", "opt2", "val2", "opt1", "val3", NULL }; - - GList *keys = NULL; - keys = g_list_append(keys, "opt1"); - keys = g_list_append(keys, "opt2"); - keys = g_list_append(keys, "opt3"); + gchar *keys[] = { "opt1", "opt2", "opt3", NULL }; gboolean res = TRUE; @@ -695,5 +659,4 @@ parse_options_with_duplicated_option_sets_error(void **state) assert_false(res); options_destroy(options); - g_list_free(keys); } \ No newline at end of file From 40759eddbf2804cf43b9b73004609a92a7ff055c Mon Sep 17 00:00:00 2001 From: James Booth Date: Tue, 15 Apr 2014 00:27:55 +0100 Subject: [PATCH 2/2] Simplified parse_options to take first option as argument --- src/command/commands.c | 4 ++-- src/tools/parser.c | 8 ++++---- src/tools/parser.h | 2 +- tests/test_parser.c | 18 +++++++++--------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/command/commands.c b/src/command/commands.c index 2daa82d1..1a05de4e 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -71,7 +71,7 @@ cmd_connect(gchar **args, struct cmd_help_t help) gchar *opt_keys[] = { "server", "port", NULL }; gboolean parsed; - GHashTable *options = parse_options(args, 1, opt_keys, &parsed); + GHashTable *options = parse_options(&args[1], opt_keys, &parsed); if (!parsed) { cons_show("Usage: %s", help.usage); cons_show(""); @@ -1572,7 +1572,7 @@ cmd_join(gchar **args, struct cmd_help_t help) gchar *opt_keys[] = { "nick", "password", NULL }; gboolean parsed; - GHashTable *options = parse_options(args, 1, opt_keys, &parsed); + GHashTable *options = parse_options(&args[1], opt_keys, &parsed); if (!parsed) { cons_show("Usage: %s", help.usage); cons_show(""); diff --git a/src/tools/parser.c b/src/tools/parser.c index ff00b1e8..aafbf576 100644 --- a/src/tools/parser.c +++ b/src/tools/parser.c @@ -374,7 +374,7 @@ get_start(char *string, int tokens) } GHashTable * -parse_options(gchar **args, int start, gchar **opt_keys, gboolean *res) +parse_options(gchar **args, gchar **opt_keys, gboolean *res) { GList *keys = NULL; int i; @@ -385,7 +385,7 @@ parse_options(gchar **args, int start, gchar **opt_keys, gboolean *res) GHashTable *options = NULL; // no options found, success - if (args[start] == NULL) { + if (args[0] == NULL) { options = g_hash_table_new(g_str_hash, g_str_equal); *res = TRUE; g_list_free(keys); @@ -395,7 +395,7 @@ parse_options(gchar **args, int start, gchar **opt_keys, gboolean *res) // validate options int curr; GList *found_keys = NULL; - for (curr = start; curr < g_strv_length(args); curr+= 2) { + for (curr = 0; curr < g_strv_length(args); curr+= 2) { // check if option valid if (g_list_find_custom(keys, args[curr], (GCompareFunc)g_strcmp0) == NULL) { *res = FALSE; @@ -425,7 +425,7 @@ parse_options(gchar **args, int start, gchar **opt_keys, gboolean *res) // create map options = g_hash_table_new(g_str_hash, g_str_equal); *res = TRUE; - for (curr = start; curr < g_strv_length(args); curr+=2) { + for (curr = 0; curr < g_strv_length(args); curr+=2) { g_hash_table_insert(options, args[curr], args[curr+1]); } diff --git a/src/tools/parser.h b/src/tools/parser.h index 10ee627c..2ca92d85 100644 --- a/src/tools/parser.h +++ b/src/tools/parser.h @@ -29,7 +29,7 @@ gchar** parse_args(const char * const inp, int min, int max, gboolean *result); gchar** parse_args_with_freetext(const char * const inp, int min, int max, gboolean *result); int count_tokens(char *string); char* get_start(char *string, int tokens); -GHashTable* parse_options(gchar **args, int start, gchar **keys, gboolean *res); +GHashTable* parse_options(gchar **args, gchar **keys, gboolean *res); void options_destroy(GHashTable *options); #endif \ No newline at end of file diff --git a/tests/test_parser.c b/tests/test_parser.c index b69151ab..faefc9c7 100644 --- a/tests/test_parser.c +++ b/tests/test_parser.c @@ -512,7 +512,7 @@ parse_options_when_none_returns_empty_hasmap(void **state) gboolean res = FALSE; - GHashTable *options = parse_options(args, 2, keys, &res); + GHashTable *options = parse_options(&args[2], keys, &res); assert_true(options != NULL); assert_int_equal(0, g_hash_table_size(options)); @@ -529,7 +529,7 @@ parse_options_when_opt1_no_val_sets_error(void **state) gboolean res = TRUE; - GHashTable *options = parse_options(args, 2, keys, &res); + GHashTable *options = parse_options(&args[2], keys, &res); assert_null(options); assert_false(res); @@ -545,7 +545,7 @@ parse_options_when_one_returns_map(void **state) gboolean res = FALSE; - GHashTable *options = parse_options(args, 2, keys, &res); + GHashTable *options = parse_options(&args[2], keys, &res); assert_int_equal(1, g_hash_table_size(options)); assert_true(g_hash_table_contains(options, "opt1")); @@ -563,7 +563,7 @@ parse_options_when_opt2_no_val_sets_error(void **state) gboolean res = TRUE; - GHashTable *options = parse_options(args, 2, keys, &res); + GHashTable *options = parse_options(&args[2], keys, &res); assert_null(options); assert_false(res); @@ -579,7 +579,7 @@ parse_options_when_two_returns_map(void **state) gboolean res = FALSE; - GHashTable *options = parse_options(args, 2, keys, &res); + GHashTable *options = parse_options(&args[2], keys, &res); assert_int_equal(2, g_hash_table_size(options)); assert_true(g_hash_table_contains(options, "opt1")); @@ -599,7 +599,7 @@ parse_options_when_opt3_no_val_sets_error(void **state) gboolean res = TRUE; - GHashTable *options = parse_options(args, 2, keys, &res); + GHashTable *options = parse_options(&args[2], keys, &res); assert_null(options); assert_false(res); @@ -615,7 +615,7 @@ parse_options_when_three_returns_map(void **state) gboolean res = FALSE; - GHashTable *options = parse_options(args, 2, keys, &res); + GHashTable *options = parse_options(&args[2], keys, &res); assert_int_equal(3, g_hash_table_size(options)); assert_true(g_hash_table_contains(options, "opt1")); @@ -637,7 +637,7 @@ parse_options_when_unknown_opt_sets_error(void **state) gboolean res = TRUE; - GHashTable *options = parse_options(args, 2, keys, &res); + GHashTable *options = parse_options(&args[2], keys, &res); assert_null(options); assert_false(res); @@ -653,7 +653,7 @@ parse_options_with_duplicated_option_sets_error(void **state) gboolean res = TRUE; - GHashTable *options = parse_options(args, 2, keys, &res); + GHashTable *options = parse_options(&args[2], keys, &res); assert_null(options); assert_false(res);