From 6e46e8fec0165f5e5ef337df0718481e9113bc94 Mon Sep 17 00:00:00 2001 From: James Booth Date: Fri, 4 May 2012 01:00:01 +0100 Subject: Added contact module --- Makefile | 9 ++-- contact.c | 61 +++++++++++++++++++++++ contact.h | 13 +++++ contact_list.c | 95 ++++++++++------------------------- contact_list.h | 4 +- test_contact_list.c | 139 +++++++++++++++++++++++++++------------------------- windows.c | 15 +++--- 7 files changed, 189 insertions(+), 147 deletions(-) create mode 100644 contact.c create mode 100644 contact.h diff --git a/Makefile b/Makefile index 61210e29..c7429f9e 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,8 @@ CPPLIB = -lstdc++ CFLAGS = -I ~/include -O3 $(WARNS) $(LIBS) `pkg-config --cflags glib-2.0` OBJS = log.o windows.o title_bar.o status_bar.o input_win.o jabber.o \ profanity.o util.o command.o history.o contact_list.o prof_history.o \ - main.o -TESTOBJS = test_contact_list.o contact_list.o \ + contact.o main.o +TESTOBJS = test_contact_list.o contact_list.o contact.o \ test_util.o test_prof_history.o prof_history.o util.o profanity: $(OBJS) @@ -24,11 +24,12 @@ profanity.o: log.h windows.h jabber.h command.h util.o: util.h command.o: command.h util.h history.h contact_list.h history.o: history.h prof_history.h -contact_list.o: contact_list.h +contact_list.o: contact_list.h contact.h prof_history.o: prof_history.h +contact.o: contact.h main.o: profanity.h -test_contact_list.o: contact_list.h +test_contact_list.o: contact_list.h contact.h test_util.o: util.h test_prof_history.o: prof_history.h diff --git a/contact.c b/contact.c new file mode 100644 index 00000000..621d029e --- /dev/null +++ b/contact.c @@ -0,0 +1,61 @@ +#include +#include + +#include "contact.h" + +struct p_contact_t { + char *name; + char *show; + char *status; +}; + +PContact p_contact_new(const char * const name, const char * const show, + const char * const status) +{ + PContact contact = malloc(sizeof(struct p_contact_t)); + contact->name = strdup(name); + + if (show == NULL || (strcmp(show, "") == 0)) + contact->show = strdup("online"); + else + contact->show = strdup(show); + + if (status != NULL) + contact->status = strdup(status); + else + contact->status = NULL; + + return contact; +} + +void p_contact_free(PContact contact) +{ + free(contact->name); + + if (contact->show != NULL) { + free(contact->show); + contact->show = NULL; + } + if (contact->status != NULL) { + free(contact->status); + contact->status = NULL; + } + + free(contact); + contact = NULL; +} + +char * p_contact_name(PContact contact) +{ + return contact->name; +} + +char * p_contact_show(PContact contact) +{ + return contact->show; +} + +char * p_contact_status(PContact contact) +{ + return contact->status; +} diff --git a/contact.h b/contact.h new file mode 100644 index 00000000..1e2796d8 --- /dev/null +++ b/contact.h @@ -0,0 +1,13 @@ +#ifndef CONTACT_H +#define CONTACT_H + +typedef struct p_contact_t *PContact; + +PContact p_contact_new(const char * const name, const char * const show, + const char * const status); +void p_contact_free(PContact contact); +char * p_contact_name(PContact contact); +char * p_contact_show(PContact contact); +char * p_contact_status(PContact contact); + +#endif diff --git a/contact_list.c b/contact_list.c index bb2ad1a5..1715e594 100644 --- a/contact_list.c +++ b/contact_list.c @@ -24,6 +24,7 @@ #include #include +#include "contact.h" #include "contact_list.h" // internal contact list @@ -37,9 +38,6 @@ static char * _search_str = NULL; static char * _search_contact_list_from(struct contact_node_t * curr); static struct contact_node_t * _make_contact_node(const char * const name, const char * const show, const char * const status); -static struct contact_t * _new_contact(const char * const name, - const char * const show, const char * const status); -static void _destroy_contact(struct contact_t *contact); static struct contact_node_t * _copy_contact_list(struct contact_node_t *node); static void _insert_contact(struct contact_node_t *curr, struct contact_node_t *prev, const char * const name, @@ -51,8 +49,8 @@ void contact_list_clear(void) if (curr) { while(curr) { - struct contact_t *contact = curr->contact; - _destroy_contact(contact); + PContact contact = curr->contact; + p_contact_free(contact); curr = curr->next; } @@ -66,8 +64,8 @@ void contact_list_clear(void) void destroy_list(struct contact_node_t *list) { while(list) { - struct contact_t *contact = list->contact; - _destroy_contact(contact); + PContact contact = list->contact; + p_contact_free(contact); list = list->next; } @@ -93,8 +91,8 @@ int contact_list_remove(const char * const name) struct contact_node_t *prev = NULL; while(curr) { - struct contact_t *contact = curr->contact; - if (strcmp(contact->name, name) == 0) { + PContact contact = curr->contact; + if (strcmp(p_contact_name(contact), name) == 0) { if (prev) prev->next = curr->next; else @@ -102,10 +100,11 @@ int 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(_last_found->contact->name, contact->name) == 0) + if (strcmp(p_contact_name(_last_found->contact), + p_contact_name(contact)) == 0) _last_found = NULL; - _destroy_contact(contact); + p_contact_free(contact); free(curr); return 1; @@ -132,16 +131,16 @@ int contact_list_add(const char * const name, const char * const show, struct contact_node_t *prev = NULL; while(curr) { - struct contact_t *curr_contact = curr->contact; + PContact curr_contact = curr->contact; // insert - if (strcmp(curr_contact->name, name) > 0) { + if (strcmp(p_contact_name(curr_contact), name) > 0) { _insert_contact(curr, prev, name, show, status); return 0; // update - } else if (strcmp(curr_contact->name, name) == 0) { - _destroy_contact(curr->contact); - curr->contact = _new_contact(name, show, status); + } else if (strcmp(p_contact_name(curr_contact), name) == 0) { + p_contact_free(curr->contact); + curr->contact = p_contact_new(name, show, status); return 0; } @@ -174,11 +173,11 @@ struct contact_node_t * _copy_contact_list(struct contact_node_t *node) if (node == NULL) { return NULL; } else { - struct contact_t *curr_contact = node->contact; + PContact curr_contact = node->contact; struct contact_node_t *copy = - _make_contact_node(curr_contact->name, - curr_contact->show, - curr_contact->status); + _make_contact_node(p_contact_name(curr_contact), + p_contact_show(curr_contact), + p_contact_status(curr_contact)); copy->next = _copy_contact_list(node->next); @@ -235,18 +234,21 @@ int get_size(struct contact_node_t *list) static char * _search_contact_list_from(struct contact_node_t * curr) { while(curr) { - struct contact_t *curr_contact = curr->contact; + PContact curr_contact = curr->contact; // match found - if (strncmp(curr_contact->name, _search_str, strlen(_search_str)) == 0) { + if (strncmp(p_contact_name(curr_contact), + _search_str, + strlen(_search_str)) == 0) { char *result = - (char *) malloc((strlen(curr_contact->name) + 1) * sizeof(char)); + (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, curr_contact->name); + strcpy(result, p_contact_name(curr_contact)); return result; } @@ -261,55 +263,12 @@ static struct contact_node_t * _make_contact_node(const char * const name, { struct contact_node_t *new = (struct contact_node_t *) malloc(sizeof(struct contact_node_t)); - new->contact = _new_contact(name, show, status); + new->contact = p_contact_new(name, show, status); new->next = NULL; return new; } -static struct contact_t * _new_contact(const char * const name, - const char * const show, const char * const status) -{ - struct contact_t *new = - (struct contact_t *) malloc(sizeof(struct contact_t)); - new->name = (char *) malloc((strlen(name) + 1) * sizeof(char)); - strcpy(new->name, name); - - if (show == NULL || (strcmp(show, "") == 0)) { - new->show = (char *) malloc((strlen("online") + 1) * sizeof(char)); - strcpy(new->show, "online"); - } else { - new->show = (char *) malloc((strlen(show) + 1) * sizeof(char)); - strcpy(new->show, show); - } - - if (status != NULL) { - new->status = (char *) malloc((strlen(status) + 1) * sizeof(char)); - strcpy(new->status, status); - } else { - new->status = NULL; - } - - return new; -} - -static void _destroy_contact(struct contact_t *contact) -{ - free(contact->name); - - if (contact->show != NULL) { - free(contact->show); - contact->show = NULL; - } - if (contact->status != NULL) { - free(contact->status); - contact->status = NULL; - } - - free(contact); - contact = NULL; -} - static void _insert_contact(struct contact_node_t *curr, struct contact_node_t *prev, const char * const name, const char * const show, const char * const status) diff --git a/contact_list.h b/contact_list.h index ba44738e..32021528 100644 --- a/contact_list.h +++ b/contact_list.h @@ -23,6 +23,8 @@ #ifndef CONTACT_LIST_H #define CONTACT_LIST_H +#include "contact.h" + struct contact_t { char *name; char *show; @@ -30,7 +32,7 @@ struct contact_t { }; struct contact_node_t { - struct contact_t *contact; + PContact contact; struct contact_node_t *next; }; diff --git a/test_contact_list.c b/test_contact_list.c index 39fbd983..106f6438 100644 --- a/test_contact_list.c +++ b/test_contact_list.c @@ -1,7 +1,10 @@ #include #include #include + #include + +#include "contact.h" #include "contact_list.h" static void beforetest(void) @@ -33,9 +36,9 @@ static void first_element_correct(void) { contact_list_add("James", NULL, NULL); struct contact_node_t *list = get_contact_list(); - struct contact_t *james = list->contact; + PContact james = list->contact; - assert_string_equals("James", james->name); + assert_string_equals("James", p_contact_name(james)); destroy_list(list); } @@ -55,11 +58,11 @@ static void first_and_second_elements_correct(void) contact_list_add("Dave", NULL, NULL); struct contact_node_t *list = get_contact_list(); - struct contact_t *dave = list->contact; - struct contact_t *james = (list->next)->contact; + PContact dave = list->contact; + PContact james = (list->next)->contact; - assert_string_equals("James", james->name); - assert_string_equals("Dave", dave->name); + assert_string_equals("James", p_contact_name(james)); + assert_string_equals("Dave", p_contact_name(dave)); destroy_list(list); } @@ -80,13 +83,13 @@ static void first_three_elements_correct(void) contact_list_add("Dave", NULL, NULL); contact_list_add("James", NULL, NULL); struct contact_node_t *list = get_contact_list(); - struct contact_t *bob = list->contact; - struct contact_t *dave = (list->next)->contact; - struct contact_t *james = ((list->next)->next)->contact; + PContact bob = list->contact; + PContact dave = (list->next)->contact; + PContact james = ((list->next)->next)->contact; - assert_string_equals("James", james->name); - assert_string_equals("Dave", dave->name); - assert_string_equals("Bob", bob->name); + assert_string_equals("James", p_contact_name(james)); + assert_string_equals("Dave", p_contact_name(dave)); + assert_string_equals("Bob", p_contact_name(bob)); destroy_list(list); } @@ -97,14 +100,14 @@ static void add_twice_at_beginning_adds_once(void) contact_list_add("Dave", NULL, NULL); contact_list_add("Bob", NULL, NULL); struct contact_node_t *list = get_contact_list(); - struct contact_t *bob = list->contact; - struct contact_t *dave = (list->next)->contact; - struct contact_t *james = ((list->next)->next)->contact; + PContact bob = list->contact; + PContact dave = (list->next)->contact; + PContact james = ((list->next)->next)->contact; assert_int_equals(3, get_size(list)); - assert_string_equals("James", james->name); - assert_string_equals("Dave", dave->name); - assert_string_equals("Bob", bob->name); + assert_string_equals("James", p_contact_name(james)); + assert_string_equals("Dave", p_contact_name(dave)); + assert_string_equals("Bob", p_contact_name(bob)); destroy_list(list); } @@ -115,14 +118,14 @@ static void add_twice_in_middle_adds_once(void) contact_list_add("James", NULL, NULL); contact_list_add("Bob", NULL, NULL); struct contact_node_t *list = get_contact_list(); - struct contact_t *bob = list->contact; - struct contact_t *dave = (list->next)->contact; - struct contact_t *james = ((list->next)->next)->contact; + PContact bob = list->contact; + PContact dave = (list->next)->contact; + PContact james = ((list->next)->next)->contact; assert_int_equals(3, get_size(list)); - assert_string_equals("James", james->name); - assert_string_equals("Dave", dave->name); - assert_string_equals("Bob", bob->name); + assert_string_equals("James", p_contact_name(james)); + assert_string_equals("Dave", p_contact_name(dave)); + assert_string_equals("Bob", p_contact_name(bob)); destroy_list(list); } @@ -133,14 +136,14 @@ static void add_twice_at_end_adds_once(void) contact_list_add("Bob", NULL, NULL); contact_list_add("James", NULL, NULL); struct contact_node_t *list = get_contact_list(); - struct contact_t *bob = list->contact; - struct contact_t *dave = (list->next)->contact; - struct contact_t *james = ((list->next)->next)->contact; + PContact bob = list->contact; + PContact dave = (list->next)->contact; + PContact james = ((list->next)->next)->contact; assert_int_equals(3, get_size(list)); - assert_string_equals("James", james->name); - assert_string_equals("Dave", dave->name); - assert_string_equals("Bob", bob->name); + assert_string_equals("James", p_contact_name(james)); + assert_string_equals("Dave", p_contact_name(dave)); + assert_string_equals("Bob", p_contact_name(bob)); destroy_list(list); } @@ -172,8 +175,8 @@ static void remove_first_when_two(void) struct contact_node_t *list = get_contact_list(); assert_int_equals(1, get_size(list)); - struct contact_t *dave = list->contact; - assert_string_equals("Dave", dave->name); + PContact dave = list->contact; + assert_string_equals("Dave", p_contact_name(dave)); destroy_list(list); } @@ -186,8 +189,8 @@ static void remove_second_when_two(void) struct contact_node_t *list = get_contact_list(); assert_int_equals(1, get_size(list)); - struct contact_t *james = list->contact; - assert_string_equals("James", james->name); + PContact james = list->contact; + assert_string_equals("James", p_contact_name(james)); destroy_list(list); } @@ -201,11 +204,11 @@ static void remove_first_when_three(void) struct contact_node_t *list = get_contact_list(); assert_int_equals(2, get_size(list)); - struct contact_t *bob = list->contact; - struct contact_t *dave = (list->next)->contact; + PContact bob = list->contact; + PContact dave = (list->next)->contact; - assert_string_equals("Dave", dave->name); - assert_string_equals("Bob", bob->name); + assert_string_equals("Dave", p_contact_name(dave)); + assert_string_equals("Bob", p_contact_name(bob)); destroy_list(list); } @@ -219,11 +222,11 @@ static void remove_second_when_three(void) struct contact_node_t *list = get_contact_list(); assert_int_equals(2, get_size(list)); - struct contact_t *bob = list->contact; - struct contact_t *james = (list->next)->contact; + PContact bob = list->contact; + PContact james = (list->next)->contact; - assert_string_equals("James", james->name); - assert_string_equals("Bob", bob->name); + assert_string_equals("James", p_contact_name(james)); + assert_string_equals("Bob", p_contact_name(bob)); destroy_list(list); } @@ -237,11 +240,11 @@ static void remove_third_when_three(void) struct contact_node_t *list = get_contact_list(); assert_int_equals(2, get_size(list)); - struct contact_t *dave = list->contact; - struct contact_t *james = (list->next)->contact; + PContact dave = list->contact; + PContact james = (list->next)->contact; - assert_string_equals("James", james->name); - assert_string_equals("Dave", dave->name); + assert_string_equals("James", p_contact_name(james)); + assert_string_equals("Dave", p_contact_name(dave)); destroy_list(list); } @@ -249,9 +252,9 @@ static void test_show_when_value(void) { contact_list_add("James", "away", NULL); struct contact_node_t *list = get_contact_list(); - struct contact_t *james = list->contact; + PContact james = list->contact; - assert_string_equals("away", james->show); + assert_string_equals("away", p_contact_show(james)); destroy_list(list); } @@ -259,9 +262,9 @@ static void test_show_online_when_no_value(void) { contact_list_add("James", NULL, NULL); struct contact_node_t *list = get_contact_list(); - struct contact_t *james = list->contact; + PContact james = list->contact; - assert_string_equals("online", james->show); + assert_string_equals("online", p_contact_show(james)); destroy_list(list); } @@ -269,9 +272,9 @@ static void test_show_online_when_empty_string(void) { contact_list_add("James", "", NULL); struct contact_node_t *list = get_contact_list(); - struct contact_t *james = list->contact; + PContact james = list->contact; - assert_string_equals("online", james->show); + assert_string_equals("online", p_contact_show(james)); destroy_list(list); } @@ -279,9 +282,9 @@ static void test_status_when_value(void) { contact_list_add("James", NULL, "I'm not here right now"); struct contact_node_t *list = get_contact_list(); - struct contact_t *james = list->contact; + PContact james = list->contact; - assert_string_equals("I'm not here right now", james->status); + assert_string_equals("I'm not here right now", p_contact_status(james)); destroy_list(list); } @@ -289,9 +292,9 @@ static void test_status_when_no_value(void) { contact_list_add("James", NULL, NULL); struct contact_node_t *list = get_contact_list(); - struct contact_t *james = list->contact; + PContact james = list->contact; - assert_is_null(james->status); + assert_is_null(p_contact_status(james)); destroy_list(list); } @@ -302,9 +305,9 @@ static void update_show(void) struct contact_node_t *list = get_contact_list(); assert_int_equals(1, get_size(list)); - struct contact_t *james = list->contact; - assert_string_equals("James", james->name); - assert_string_equals("dnd", james->show); + PContact james = list->contact; + assert_string_equals("James", p_contact_name(james)); + assert_string_equals("dnd", p_contact_show(james)); destroy_list(list); } @@ -315,9 +318,9 @@ static void set_show_to_null(void) struct contact_node_t *list = get_contact_list(); assert_int_equals(1, get_size(list)); - struct contact_t *james = list->contact; - assert_string_equals("James", james->name); - assert_string_equals("online", james->show); + PContact james = list->contact; + assert_string_equals("James", p_contact_name(james)); + assert_string_equals("online", p_contact_show(james)); destroy_list(list); } @@ -328,9 +331,9 @@ static void update_status(void) struct contact_node_t *list = get_contact_list(); assert_int_equals(1, get_size(list)); - struct contact_t *james = list->contact; - assert_string_equals("James", james->name); - assert_string_equals("Gone to lunch", james->status); + PContact james = list->contact; + assert_string_equals("James", p_contact_name(james)); + assert_string_equals("Gone to lunch", p_contact_status(james)); destroy_list(list); } @@ -341,9 +344,9 @@ static void set_status_to_null(void) struct contact_node_t *list = get_contact_list(); assert_int_equals(1, get_size(list)); - struct contact_t *james = list->contact; - assert_string_equals("James", james->name); - assert_is_null(james->status); + PContact james = list->contact; + assert_string_equals("James", p_contact_name(james)); + assert_is_null(p_contact_status(james)); destroy_list(list); } diff --git a/windows.c b/windows.c index 6b3355c4..7af787d8 100644 --- a/windows.c +++ b/windows.c @@ -22,9 +22,12 @@ #include #include + #include + #include "windows.h" #include "util.h" +#include "contact.h" #define CONS_WIN_TITLE "_cons" #define PAD_SIZE 200 @@ -299,14 +302,14 @@ void cons_show_online_contacts(struct contact_node_t *list) struct contact_node_t *curr = list; while(curr) { - struct contact_t *contact = curr->contact; + PContact contact = curr->contact; _win_show_time(_cons_win); wattron(_cons_win, COLOR_PAIR(2)); - wprintw(_cons_win, "%s", contact->name); - if (contact->show) - wprintw(_cons_win, " is %s", contact->show); - if (contact->status) - wprintw(_cons_win, ", \"%s\"", contact->status); + wprintw(_cons_win, "%s", p_contact_name(contact)); + if (p_contact_show(contact)) + wprintw(_cons_win, " is %s", p_contact_show(contact)); + if (p_contact_status(contact)) + wprintw(_cons_win, ", \"%s\"", p_contact_status(contact)); wprintw(_cons_win, "\n"); wattroff(_cons_win, COLOR_PAIR(2)); -- cgit 1.4.1-2-gfad0