* add mu_str_from_list, mu_str_to_list and mu_str_list_free + unit tests
This commit is contained in:
59
src/mu-str.c
59
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 '.'
|
* Xapian treats various characters such as '@', '-', ':' and '.'
|
||||||
* specially; function below is an ugly hack to make it DWIM in most
|
* specially; function below is an ugly hack to make it DWIM in most
|
||||||
|
|||||||
28
src/mu-str.h
28
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)
|
#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
|
* guess some nick name for the given name; if we can determine an
|
||||||
|
|||||||
@ -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
|
static void
|
||||||
test_mu_str_guess_first_name (void)
|
test_mu_str_guess_first_name (void)
|
||||||
{
|
{
|
||||||
@ -365,6 +448,10 @@ main (int argc, char *argv[])
|
|||||||
g_test_add_func ("/mu-str/mu-str-display_contact",
|
g_test_add_func ("/mu-str/mu-str-display_contact",
|
||||||
test_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",
|
g_test_add_func ("/mu-str/mu-str_date_parse_hdwmy",
|
||||||
test_mu_str_date_parse_hdwmy);
|
test_mu_str_date_parse_hdwmy);
|
||||||
|
|||||||
Reference in New Issue
Block a user