about summary refs log tree commit diff stats
path: root/contact_list.c
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2012-05-13 23:06:01 +0100
committerJames Booth <boothj5@gmail.com>2012-05-13 23:06:01 +0100
commit6c9cbc446d405fb7d4a3df254f7c3edf6848e658 (patch)
tree9ca1753af4090ba5fd12abc921bf2b17726d3df3 /contact_list.c
parentbe964894c612929e7f74ff6765c29b7c780a6b82 (diff)
downloadprofani-tty-6c9cbc446d405fb7d4a3df254f7c3edf6848e658.tar.gz
Changed contact list to use generic autocomplete
Diffstat (limited to 'contact_list.c')
-rw-r--r--contact_list.c162
1 files changed, 19 insertions, 143 deletions
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));
 }
+