From 6c9cbc446d405fb7d4a3df254f7c3edf6848e658 Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 13 May 2012 23:06:01 +0100 Subject: Changed contact list to use generic autocomplete --- contact_list.c | 162 +++++++-------------------------------------------------- 1 file changed, 19 insertions(+), 143 deletions(-) (limited to 'contact_list.c') diff --git a/contact_list.c b/contact_list.c index eae48963..73d5cc8d 100644 --- a/contact_list.c +++ b/contact_list.c @@ -28,177 +28,53 @@ #include "contact.h" #include "contact_list.h" +#include "prof_autocomplete.h" -// internal contact list -static GSList * _contact_list = NULL; +static PAutocomplete ac; -// state of current tab completion, currrent node -static GSList * _last_found = NULL; -// and current search pattern -static char * _search_str = NULL; +static PContact _copy(PContact contact); -static char * _search_contact_list_from(GSList * curr); +void contact_list_init(void) +{ + ac = p_autocomplete_new(); +} void contact_list_clear(void) { - g_slist_free_full(_contact_list, (GDestroyNotify)p_contact_free); - _contact_list = NULL; - - reset_search_attempts(); + p_autocomplete_clear(ac, (GDestroyNotify)p_contact_free); } void reset_search_attempts(void) { - _last_found = NULL; - if (_search_str != NULL) { - free(_search_str); - _search_str = NULL; - } + p_autocomplete_reset(ac); } void contact_list_remove(const char * const name) { - // reset last found if it points at the node to be removed - if (_last_found != NULL) - if (strcmp(p_contact_name(_last_found->data), name) == 0) - _last_found = NULL; - - if (!_contact_list) { - return; - } else { - GSList *curr = _contact_list; - - while(curr) { - PContact contact = curr->data; - if (strcmp(p_contact_name(contact), name) == 0) { - _contact_list = g_slist_remove(_contact_list, contact); - p_contact_free(contact); - - return; - } - - curr = g_slist_next(curr); - } - - return; - } + p_autocomplete_remove(ac, name, (PStrFunc)p_contact_name, (GDestroyNotify)p_contact_free); } void contact_list_add(const char * const name, const char * const show, const char * const status) { - - // empty list, create new - if (!_contact_list) { - _contact_list = g_slist_append(_contact_list, - p_contact_new(name, show, status)); - - return; - } else { - GSList *curr = _contact_list; - - while(curr) { - PContact curr_contact = curr->data; - - // insert - if (strcmp(p_contact_name(curr_contact), name) > 0) { - _contact_list = g_slist_insert_before(_contact_list, - curr, p_contact_new(name, show, status)); - return; - // update - } else if (strcmp(p_contact_name(curr_contact), name) == 0) { - p_contact_free(curr->data); - curr->data = p_contact_new(name, show, status); - return; - } - - curr = g_slist_next(curr); - } - - // hit end, append - _contact_list = g_slist_append(_contact_list, - p_contact_new(name, show, status)); - - return; - } + p_autocomplete_add(ac, p_contact_new(name, show, status), (PStrFunc)p_contact_name, + (GDestroyNotify)p_contact_free); } GSList * get_contact_list(void) { - GSList *copy = NULL; - GSList *curr = _contact_list; - - while(curr) { - PContact curr_contact = curr->data; - - copy = g_slist_append(copy, - p_contact_new(p_contact_name(curr_contact), - p_contact_show(curr_contact), - p_contact_status(curr_contact))); - - curr = g_slist_next(curr); - } - - return copy; + return p_autocomplete_get_list(ac, (PCopyFunc)_copy); } char * find_contact(char *search_str) { - char *found = NULL; - - // no contacts to search - if (!_contact_list) - return NULL; - - // first search attempt - if (_last_found == NULL) { - _search_str = (char *) malloc((strlen(search_str) + 1) * sizeof(char)); - strcpy(_search_str, search_str); - - found = _search_contact_list_from(_contact_list); - return found; - - // subsequent search attempt - } else { - // search from here+1 to end - found = _search_contact_list_from(g_slist_next(_last_found)); - if (found != NULL) - return found; - - // search from beginning - found = _search_contact_list_from(_contact_list); - if (found != NULL) - return found; - - // we found nothing, reset search - reset_search_attempts(); - return NULL; - } + return p_autocomplete_complete(ac, search_str, (PStrFunc)p_contact_name); } -static char * _search_contact_list_from(GSList * curr) +static PContact _copy(PContact contact) { - while(curr) { - PContact curr_contact = curr->data; - - // match found - if (strncmp(p_contact_name(curr_contact), - _search_str, - strlen(_search_str)) == 0) { - char *result = - (char *) malloc((strlen(p_contact_name(curr_contact)) + 1) - * sizeof(char)); - - // set pointer to last found - _last_found = curr; - - // return the contact, must be free'd by caller - strcpy(result, p_contact_name(curr_contact)); - return result; - } - - curr = g_slist_next(curr); - } - - return NULL; + return p_contact_new(p_contact_name(contact), + p_contact_show(contact), + p_contact_status(contact)); } + -- cgit 1.4.1-2-gfad0