From 5353bb47d63c187cdb607a92cca341b2753671dc Mon Sep 17 00:00:00 2001 From: James Booth Date: Mon, 22 Oct 2012 00:16:22 +0100 Subject: [PATCH] Refactored parameter autocompleters --- src/input_win.c | 88 +++++++++++++++++---------------------- tests/test_contact_list.c | 36 ++++++++-------- 2 files changed, 57 insertions(+), 67 deletions(-) diff --git a/src/input_win.c b/src/input_win.c index 89f98584..403dc9e6 100644 --- a/src/input_win.c +++ b/src/input_win.c @@ -58,12 +58,16 @@ #include "preferences.h" #include "ui.h" +typedef char*(*autocomplete_func)(char *); + static WINDOW *inp_win; static int pad_start = 0; static int _handle_edit(const int ch, char *input, int *size); static int _printable(const int ch); static void _replace_input(char *input, const char * const new_input, int *size); +static void _parameter_autocomplete(char *input, int *size, char *command, + autocomplete_func func); void create_input_window(void) @@ -320,7 +324,7 @@ _handle_edit(const int ch, char *input, int *size) case 9: // tab - // autocomplete commands + // autocomplete command if ((strncmp(input, "/", 1) == 0) && (!str_contains(input, *size, ' '))) { for(i = 0; i < *size; i++) { inp_cpy[i] = input[i]; @@ -334,55 +338,12 @@ _handle_edit(const int ch, char *input, int *size) free(auto_msg); free(found); } - - // autcomplete /msg recipient - } else if ((strncmp(input, "/msg ", 5) == 0) && (*size > 5)) { - for(i = 5; i < *size; i++) { - inp_cpy[i-5] = input[i]; - } - inp_cpy[(*size) - 5] = '\0'; - found = contact_list_find_contact(inp_cpy); - if (found != NULL) { - auto_msg = (char *) malloc((5 + (strlen(found) + 1)) * sizeof(char)); - strcpy(auto_msg, "/msg "); - strcat(auto_msg, found); - _replace_input(input, auto_msg, size); - free(auto_msg); - free(found); - } - - // autocomplete /connect username - } else if ((strncmp(input, "/connect ", 9) == 0) && (*size > 9)) { - for(i = 9; i < *size; i++) { - inp_cpy[i-9] = input[i]; - } - inp_cpy[(*size) - 9] = '\0'; - found = prefs_find_login(inp_cpy); - if (found != NULL) { - auto_msg = (char *) malloc((9 + (strlen(found) + 1)) * sizeof(char)); - strcpy(auto_msg, "/connect "); - strcat(auto_msg, found); - _replace_input(input, auto_msg, size); - free(auto_msg); - free(found); - } - - // autocomplete /help command - } else if ((strncmp(input, "/help ", 6) == 0) && (*size > 6)) { - for(i = 6; i < *size; i++) { - inp_cpy[i-6] = input[i]; - } - inp_cpy[(*size) - 6] = '\0'; - found = cmd_help_complete(inp_cpy); - if (found != NULL) { - auto_msg = (char *) malloc((6 + (strlen(found) + 1)) * sizeof(char)); - strcpy(auto_msg, "/help "); - strcat(auto_msg, found); - _replace_input(input, auto_msg, size); - free(auto_msg); - free(found); - } } + + _parameter_autocomplete(input, size, "/msg", contact_list_find_contact); + _parameter_autocomplete(input, size, "/connect", prefs_find_login); + _parameter_autocomplete(input, size, "/help", cmd_help_complete); + return 1; default: @@ -413,3 +374,32 @@ _replace_input(char *input, const char * const new_input, int *size) for (i = 0; i < *size; i++) waddch(inp_win, input[i]); } + +static void +_parameter_autocomplete(char *input, int *size, char *command, + autocomplete_func func) +{ + char *found = NULL; + char *auto_msg = NULL; + char inp_cpy[*size]; + int i; + char *command_cpy = malloc(strlen(command) + 2); + sprintf(command_cpy, "%s ", command); + int len = strlen(command_cpy); + if ((strncmp(input, command_cpy, len) == 0) && (*size > len)) { + for(i = len; i < *size; i++) { + inp_cpy[i-len] = input[i]; + } + inp_cpy[(*size) - len] = '\0'; + found = func(inp_cpy); + if (found != NULL) { + auto_msg = (char *) malloc((len + (strlen(found) + 1)) * sizeof(char)); + strcpy(auto_msg, command_cpy); + strcat(auto_msg, found); + _replace_input(input, auto_msg, size); + free(auto_msg); + free(found); + } + } + free(command_cpy); +} diff --git a/tests/test_contact_list.c b/tests/test_contact_list.c index 65d5fd72..18d5a6e4 100644 --- a/tests/test_contact_list.c +++ b/tests/test_contact_list.c @@ -339,7 +339,7 @@ static void find_first_exists(void) char *search = (char *) malloc(2 * sizeof(char)); strcpy(search, "B"); - char *result = find_contact(search); + char *result = contact_list_find_contact(search); assert_string_equals("Bob", result); free(result); free(search); @@ -351,7 +351,7 @@ static void find_second_exists(void) contact_list_add("Dave", NULL, NULL); contact_list_add("Bob", NULL, NULL); - char *result = find_contact("Dav"); + char *result = contact_list_find_contact("Dav"); assert_string_equals("Dave", result); free(result); } @@ -362,7 +362,7 @@ static void find_third_exists(void) contact_list_add("Dave", NULL, NULL); contact_list_add("Bob", NULL, NULL); - char *result = find_contact("Ja"); + char *result = contact_list_find_contact("Ja"); assert_string_equals("James", result); free(result); } @@ -373,13 +373,13 @@ static void find_returns_null(void) contact_list_add("Dave", NULL, NULL); contact_list_add("Bob", NULL, NULL); - char *result = find_contact("Mike"); + char *result = contact_list_find_contact("Mike"); assert_is_null(result); } static void find_on_empty_returns_null(void) { - char *result = find_contact("James"); + char *result = contact_list_find_contact("James"); assert_is_null(result); } @@ -389,8 +389,8 @@ static void find_twice_returns_second_when_two_match(void) contact_list_add("Jamie", NULL, NULL); contact_list_add("Bob", NULL, NULL); - char *result1 = find_contact("Jam"); - char *result2 = find_contact(result1); + char *result1 = contact_list_find_contact("Jam"); + char *result2 = contact_list_find_contact(result1); assert_string_equals("Jamie", result2); free(result1); free(result2); @@ -409,11 +409,11 @@ static void find_five_times_finds_fifth(void) contact_list_add("Jamy", NULL, NULL); contact_list_add("Jamz", NULL, NULL); - char *result1 = find_contact("Jam"); - char *result2 = find_contact(result1); - char *result3 = find_contact(result2); - char *result4 = find_contact(result3); - char *result5 = find_contact(result4); + char *result1 = contact_list_find_contact("Jam"); + char *result2 = contact_list_find_contact(result1); + char *result3 = contact_list_find_contact(result2); + char *result4 = contact_list_find_contact(result3); + char *result5 = contact_list_find_contact(result4); assert_string_equals("Jamo", result5); free(result1); free(result2); @@ -428,9 +428,9 @@ static void find_twice_returns_first_when_two_match_and_reset(void) contact_list_add("Jamie", NULL, NULL); contact_list_add("Bob", NULL, NULL); - char *result1 = find_contact("Jam"); - reset_search_attempts(); - char *result2 = find_contact(result1); + char *result1 = contact_list_find_contact("Jam"); + contact_list_reset_search_attempts(); + char *result2 = contact_list_find_contact(result1); assert_string_equals("James", result2); free(result1); free(result2); @@ -444,10 +444,10 @@ static void removed_contact_not_in_search(void) contact_list_add("James", NULL, NULL); contact_list_add("Jamie", NULL, NULL); - char *result1 = find_contact("Jam"); // Jamatron - char *result2 = find_contact(result1); // Jambo + char *result1 = contact_list_find_contact("Jam"); // Jamatron + char *result2 = contact_list_find_contact(result1); // Jambo contact_list_remove("James"); - char *result3 = find_contact(result2); + char *result3 = contact_list_find_contact(result2); assert_string_equals("Jamie", result3); free(result1); free(result2);