mirror of https://github.com/djcb/mu.git
* mu-str etc.: improve escaping (for gmail folder names)
This commit is contained in:
parent
6e2c3bf726
commit
7f0ec697d8
27
src/mu-str.c
27
src/mu-str.c
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue