about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2014-04-14 22:48:18 +0100
committerJames Booth <boothj5@gmail.com>2014-04-14 22:48:18 +0100
commit8d77930eceba6841673605f7df5083657a0ecd28 (patch)
tree1dd4a3f4b0821cffa2609286e848e4aa0cae23cf
parentcc68fc5e9a7346d501c8c7df8444acc1f538ef58 (diff)
downloadprofani-tty-8d77930eceba6841673605f7df5083657a0ecd28.tar.gz
Added parse_options
-rw-r--r--src/tools/parser.c40
-rw-r--r--src/tools/parser.h4
-rw-r--r--tests/test_parser.c165
-rw-r--r--tests/test_parser.h8
-rw-r--r--tests/testsuite.c8
5 files changed, 224 insertions, 1 deletions
diff --git a/src/tools/parser.c b/src/tools/parser.c
index 932fd9aa..375572e0 100644
--- a/src/tools/parser.c
+++ b/src/tools/parser.c
@@ -372,3 +372,43 @@ get_start(char *string, int tokens)
 
     return result_str;
 }
+
+GHashTable *
+parse_options(gchar **args, int start, GList *keys, gboolean *res)
+{
+    GHashTable *options = NULL;
+
+    // no options found, success
+    if (args[start] == NULL) {
+        options = g_hash_table_new(g_str_hash, g_str_equal);
+        *res = TRUE;
+        return options;
+    }
+
+    // check each option is valid and has value, failure if not
+    int curr;
+    for (curr = start; curr < g_strv_length(args); curr+= 2) {
+        if ((g_list_find(keys, args[curr]) == NULL) || (args[curr+1] == NULL)) {
+            *res = FALSE;
+            return options;
+        }
+    }
+
+    // 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) {
+        g_hash_table_insert(options, args[curr], args[curr+1]);
+    }
+
+    return options;
+}
+
+void
+options_destroy(GHashTable *options)
+{
+    if (options != NULL) {
+        g_hash_table_destroy(options);
+        options = NULL;
+    }
+}
\ No newline at end of file
diff --git a/src/tools/parser.h b/src/tools/parser.h
index f03fca81..aef3ad37 100644
--- a/src/tools/parser.h
+++ b/src/tools/parser.h
@@ -29,5 +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);
+void options_destroy(GHashTable *options);
 
-#endif
+#endif
\ No newline at end of file
diff --git a/tests/test_parser.c b/tests/test_parser.c
index d05d17c3..1309e8e1 100644
--- a/tests/test_parser.c
+++ b/tests/test_parser.c
@@ -502,4 +502,169 @@ get_first_two_of_three_first_and_second_quoted(void **state)
     char *result = get_start(inp, 3);
 
     assert_string_equal("\"one\" \"two\" ", result);
+}
+
+void
+parse_options_when_none_returns_empty_hasmap(void **state)
+{
+    gchar *args[] = { "cmd1", "cmd2", NULL };
+
+    GList *keys = NULL;
+    keys = g_list_append(keys, "opt1");
+
+    gboolean res = FALSE;
+
+    GHashTable *options = parse_options(args, 2, keys, &res);
+
+    assert_true(options != NULL);
+    assert_int_equal(0, g_hash_table_size(options));
+    assert_true(res);
+
+    options_destroy(options);
+}
+
+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");
+
+    gboolean res = TRUE;
+
+    GHashTable *options = parse_options(args, 2, keys, &res);
+
+    assert_null(options);
+    assert_false(res);
+
+    options_destroy(options);
+}
+
+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");
+
+    gboolean res = FALSE;
+
+    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"));
+    assert_string_equal("val1", g_hash_table_lookup(options, "opt1"));
+    assert_true(res);
+
+    options_destroy(options);
+}
+
+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");
+
+    gboolean res = TRUE;
+
+    GHashTable *options = parse_options(args, 2, keys, &res);
+
+    assert_null(options);
+    assert_false(res);
+
+    options_destroy(options);
+}
+
+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");
+
+    gboolean res = FALSE;
+
+    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"));
+    assert_true(g_hash_table_contains(options, "opt2"));
+    assert_string_equal("val1", g_hash_table_lookup(options, "opt1"));
+    assert_string_equal("val2", g_hash_table_lookup(options, "opt2"));
+    assert_true(res);
+
+    options_destroy(options);
+}
+
+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");
+
+    gboolean res = TRUE;
+
+    GHashTable *options = parse_options(args, 2, keys, &res);
+
+    assert_null(options);
+    assert_false(res);
+
+    options_destroy(options);
+}
+
+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");
+
+    gboolean res = FALSE;
+
+    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"));
+    assert_true(g_hash_table_contains(options, "opt2"));
+    assert_true(g_hash_table_contains(options, "opt3"));
+    assert_string_equal("val1", g_hash_table_lookup(options, "opt1"));
+    assert_string_equal("val2", g_hash_table_lookup(options, "opt2"));
+    assert_string_equal("val3", g_hash_table_lookup(options, "opt3"));
+    assert_true(res);
+
+    options_destroy(options);
+}
+
+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");
+
+    gboolean res = TRUE;
+
+    GHashTable *options = parse_options(args, 2, keys, &res);
+
+    assert_null(options);
+    assert_false(res);
+
+    options_destroy(options);
 }
\ No newline at end of file
diff --git a/tests/test_parser.h b/tests/test_parser.h
index 7b178c3d..70b94b50 100644
--- a/tests/test_parser.h
+++ b/tests/test_parser.h
@@ -39,3 +39,11 @@ void get_first_two_of_three(void **state);
 void get_first_two_of_three_first_quoted(void **state);
 void get_first_two_of_three_second_quoted(void **state);
 void get_first_two_of_three_first_and_second_quoted(void **state);
+void parse_options_when_none_returns_empty_hasmap(void **state);
+void parse_options_when_opt1_no_val_sets_error(void **state);
+void parse_options_when_one_returns_map(void **state);
+void parse_options_when_opt2_no_val_sets_error(void **state);
+void parse_options_when_two_returns_map(void **state);
+void parse_options_when_opt3_no_val_sets_error(void **state);
+void parse_options_when_three_returns_map(void **state);
+void parse_options_when_unknown_opt_sets_error(void **state);
\ No newline at end of file
diff --git a/tests/testsuite.c b/tests/testsuite.c
index cdcd61ee..c6577410 100644
--- a/tests/testsuite.c
+++ b/tests/testsuite.c
@@ -165,6 +165,14 @@ int main(int argc, char* argv[]) {
         unit_test(get_first_two_of_three_first_quoted),
         unit_test(get_first_two_of_three_second_quoted),
         unit_test(get_first_two_of_three_first_and_second_quoted),
+        unit_test(parse_options_when_none_returns_empty_hasmap),
+        unit_test(parse_options_when_opt1_no_val_sets_error),
+        unit_test(parse_options_when_one_returns_map),
+        unit_test(parse_options_when_opt2_no_val_sets_error),
+        unit_test(parse_options_when_two_returns_map),
+        unit_test(parse_options_when_opt3_no_val_sets_error),
+        unit_test(parse_options_when_three_returns_map),
+        unit_test(parse_options_when_unknown_opt_sets_error),
 
         unit_test(empty_list_when_none_added),
         unit_test(contains_one_element),