* mu-str etc.: improve escaping (for gmail folder names)

This commit is contained in:
djcb 2012-03-30 18:45:06 +03:00
parent 6e2c3bf726
commit 7f0ec697d8
4 changed files with 46 additions and 13 deletions

View File

@ -336,7 +336,7 @@ mu_str_to_list (const char *str, char sepa, gboolean strip)
static gchar*
eat_esc_string (char **strlst)
eat_esc_string (char **strlst, GError **err)
{
char *str;
gboolean quoted;
@ -366,14 +366,15 @@ leave:
*strlst = str;
return g_string_free (gstr, FALSE);
err:
g_warning ("error in string");
g_set_error (err, 0, MU_ERROR_IN_PARAMETERS,
"error parsing string '%s'", g_strchug(*strlst));
*strlst = NULL;
return g_string_free (gstr, TRUE);
}
GSList*
mu_str_esc_to_list (const char *strings)
mu_str_esc_to_list (const char *strings, GError **err)
{
GSList *lst;
char *mystrings, *freeme;
@ -387,9 +388,15 @@ mu_str_esc_to_list (const char *strings)
lst = NULL;
do {
gchar *str;
str = eat_esc_string (&mystrings);
str = eat_esc_string (&mystrings, err);
if (str)
lst = g_slist_prepend (lst, str);
else {
g_free (freeme);
mu_str_free_list (lst);
return NULL;
}
} while (mystrings && *mystrings);
g_free (freeme);
@ -443,11 +450,6 @@ mu_str_ascii_xapian_escape_in_place (char *query, gboolean esc_space)
*cur = tolower(*cur);
switch (*cur) {
case ' ':
case '@':
case '-':
case ';':
case '/':
*cur = escchar;
break;
case '.': /* don't escape '..' */
@ -464,7 +466,14 @@ mu_str_ascii_xapian_escape_in_place (char *query, gboolean esc_space)
if (!is_xapian_prefix (query, cur))
*cur = escchar;
break;
case '\'':
case '*': /* wildcard */
break;
default:
if (!isalnum(*cur))
*cur = escchar;
}
}
return query;

View File

@ -288,7 +288,7 @@ GSList* mu_str_to_list (const char *str, char sepa, gboolean strip);
*
* @return a list of elements or NULL in case of error
*/
GSList* mu_str_esc_to_list (const char *str);
GSList* mu_str_esc_to_list (const char *str, GError **err);
/**

View File

@ -103,7 +103,7 @@ run_and_count_matches (const char *xpath, const char *query)
if (g_test_verbose()) {
char *xs;
g_print ("\n==> query: %s\n", query);
xs = mu_query_preprocess (query);
xs = mu_query_preprocess (query, NULL);
g_print ("==> preproc: '%s'\n", xs);
g_free (xs);
xs = mu_query_as_string (mquery, query, NULL);
@ -137,7 +137,6 @@ run_and_count_matches (const char *xpath, const char *query)
return count1;
}
typedef struct {
const char *query;
size_t count; /* expected number of matches */
@ -563,6 +562,28 @@ test_mu_query_tags_02 (void)
}
static void
test_mu_query_preprocess (void)
{
unsigned u;
struct {
const gchar *expr, *expected;
} testcases [] = {
{ "hello", "hello" },
{ "/[Gmail].Sent Mail", "__gmail__sent mail" }
/* add more */
};
for (u = 0; u != G_N_ELEMENTS(testcases); ++u) {
gchar *prep;
prep = mu_query_preprocess (testcases[u].expr, NULL);
g_assert_cmpstr (prep, ==, testcases[u].expected);
g_free (prep);
}
}
int
@ -572,6 +593,9 @@ main (int argc, char *argv[])
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/mu-query/test-mu-query-preprocess",
test_mu_query_preprocess);
g_test_add_func ("/mu-query/test-mu-query-01", test_mu_query_01);
g_test_add_func ("/mu-query/test-mu-query-02", test_mu_query_02);
g_test_add_func ("/mu-query/test-mu-query-03", test_mu_query_03);

View File

@ -172,7 +172,7 @@ test_mu_str_esc_to_list (void)
for (i = 0; i != G_N_ELEMENTS(strings); ++i) {
GSList *lst, *cur;
unsigned u;
lst = mu_str_esc_to_list (strings[i].str);
lst = mu_str_esc_to_list (strings[i].str, NULL);
for (cur = lst, u = 0; cur; cur = g_slist_next(cur), ++u)
g_assert_cmpstr ((const char*)cur->data,==,strings[i].strs[u]);
mu_str_free_list (lst);