From 2ef079968a85444e566edc392651948f57622db3 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Wed, 15 Jun 2011 23:44:52 +0300 Subject: [PATCH] * add mu_str_from_list, mu_str_to_list and mu_str_list_free + unit tests --- src/mu-str.c | 59 +++++++++++++++++++++++++++ src/mu-str.h | 28 +++++++++++++ src/tests/test-mu-str.c | 89 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 175 insertions(+), 1 deletion(-) diff --git a/src/mu-str.c b/src/mu-str.c index 58f77ac8..4504fd62 100644 --- a/src/mu-str.c +++ b/src/mu-str.c @@ -371,6 +371,65 @@ mu_str_size_parse_kmg (const char* str) } + + +char* +mu_str_from_list (const GSList *lst, char sepa) +{ + const GSList *cur; + char *str; + + g_return_val_if_fail (sepa, NULL); + + for (cur = lst, str = NULL; cur; cur = g_slist_next(cur)) { + + char *tmp; + char sep[2] = { '\0', '\0' }; + sep[0] = cur->next ? sepa : '\0'; + + tmp = g_strdup_printf ("%s%s%s", + str ? str : "", + (gchar*)cur->data, + sep); + g_free (str); + str = tmp; + } + + return str; +} + +GSList* +mu_str_to_list (const char *str, char sepa) +{ + GSList *lst; + gchar **strs, **cur; + char sep[] = { '\0', '\0' }; + + g_return_val_if_fail (sepa, NULL); + + if (!str) + return NULL; + + sep[0] = sepa; + strs = g_strsplit (str, sep, -1); + + for (cur = strs, lst = NULL; cur && *cur; ++cur) + lst = g_slist_prepend (lst, g_strdup(*cur)); + + lst = g_slist_reverse (lst); + g_strfreev (strs); + + return lst; +} + +void +mu_str_free_list (GSList *lst) +{ + g_slist_foreach (lst, (GFunc)g_free, NULL); + g_slist_free (lst); +} + + /* * Xapian treats various characters such as '@', '-', ':' and '.' * specially; function below is an ugly hack to make it DWIM in most diff --git a/src/mu-str.h b/src/mu-str.h index ba772d34..4e80e60f 100644 --- a/src/mu-str.h +++ b/src/mu-str.h @@ -265,6 +265,34 @@ char* mu_str_escape_c_literal (const gchar* str) #define mu_str_is_empty(S) ((!(S)||!(*S))?TRUE:FALSE) +/** + * convert a GSList of strings to a #sepa-separated list + * + * @param lst a GSList + * @param the separator character + * + * @return a newly allocated string + */ +char* mu_str_from_list (const GSList *lst, char sepa); + + +/** + * convert a #sepa-separated list of strings in to a GSList + * + * @param str a #sepa-separated list of strings + * @param the separator character + * + * @return a newly allocated GSList (free with mu_str_free_list) + */ +GSList* mu_str_to_list (const char *str, char sepa); + + +/** + * free a GSList consisting of allocated strings + * + * @param lst a GSList + */ +void mu_str_free_list (GSList *lst); /** * guess some nick name for the given name; if we can determine an diff --git a/src/tests/test-mu-str.c b/src/tests/test-mu-str.c index 6ed7a0de..50e8c85f 100644 --- a/src/tests/test-mu-str.c +++ b/src/tests/test-mu-str.c @@ -255,6 +255,89 @@ test_mu_str_date_parse_hdwmy (void) } +static void +assert_cmplst (GSList *lst, const char *items[]) +{ + int i; + + if (!lst) + g_assert (!items); + + for (i = 0; lst; lst = g_slist_next(lst), ++i) + g_assert_cmpstr ((char*)lst->data,==,items[i]); + + g_assert (items[i] == NULL); +} + + +static GSList* +create_list (const char *items[]) +{ + GSList *lst; + + lst = NULL; + while (items && *items) { + lst = g_slist_prepend (lst, g_strdup(*items)); + ++items; + } + + return g_slist_reverse (lst); + +} + +static void +test_mu_str_from_list (void) +{ + { + const char *strs[] = {"aap", "noot", "mies", NULL}; + GSList *lst = create_list (strs); + gchar *str = mu_str_from_list (lst, ','); + g_assert_cmpstr ("aap,noot,mies", ==, str); + mu_str_free_list (lst); + g_free (str); + } + + { + const char *strs[] = {"aap", "no,ot", "mies", NULL}; + GSList *lst = create_list (strs); + gchar *str = mu_str_from_list (lst, ','); + g_assert_cmpstr ("aap,no,ot,mies", ==, str); + mu_str_free_list (lst); + g_free (str); + } + + { + const char *strs[] = {NULL}; + GSList *lst = create_list (strs); + gchar *str = mu_str_from_list (lst,'@'); + g_assert_cmpstr (NULL, ==, str); + mu_str_free_list (lst); + g_free (str); + } + + +} + + +static void +test_mu_str_to_list (void) +{ + { + const char *items[]= {"foo", "bar", "cuux", NULL}; + GSList *lst = mu_str_to_list ("foo@bar@cuux",'@'); + assert_cmplst (lst, items); + mu_str_free_list (lst); + } + + { + GSList *lst = mu_str_to_list (NULL,'x'); + g_assert (lst == NULL); + mu_str_free_list (lst); + } +} + + + static void test_mu_str_guess_first_name (void) { @@ -365,7 +448,11 @@ main (int argc, char *argv[]) g_test_add_func ("/mu-str/mu-str-display_contact", test_mu_str_display_contact); - + g_test_add_func ("/mu-str/mu-str-from-list", + test_mu_str_from_list); + g_test_add_func ("/mu-str/mu-str-to-list", + test_mu_str_to_list); + g_test_add_func ("/mu-str/mu-str_date_parse_hdwmy", test_mu_str_date_parse_hdwmy);