X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Fmatcher.c;h=06b5f1244fa153d6b94a9acdadb058712e4dfdfc;hp=ccd394da63edc4a0d90e170b0cee8e932065dcde;hb=de8be65d1feef5c981242407e474932986706ef7;hpb=cd5312573bd5b94566dbe7e0526311ec77cb5d75 diff --git a/src/matcher.c b/src/matcher.c index ccd394da6..06b5f1244 100644 --- a/src/matcher.c +++ b/src/matcher.c @@ -407,6 +407,10 @@ gchar * matcher_parse_regexp(gchar ** str) return g_strdup(start); } +/* matcher_parse_str() - parses a string until it hits a + * terminating \". to unescape characters use \. The string + * should not be used directly: matcher_unescape_str() + * returns a string that can be used directly. */ gchar * matcher_parse_str(gchar ** str) { gchar * p; @@ -429,22 +433,52 @@ gchar * matcher_parse_str(gchar ** str) p ++; start = p; dest = p; - while (*p != '"') { + + for ( ; *p && *p != '\"'; p++, dest++) { if (*p == '\\') { - p++; + *dest++ = *p++; *dest = *p; } - else + else *dest = *p; - dest++; - p++; } *dest = '\0'; - + *str += dest - dup + 2; return g_strdup(start); } +gchar *matcher_unescape_str(gchar *str) +{ + gchar *tmp = alloca(strlen(str) + 1); + register gchar *src = tmp; + register gchar *dst = str; + + strcpy(tmp, str); + + for ( ; *src; src++) { + if (*src != '\\') + *dst++ = *src; + else { + src++; + if (*src == '\\') + *dst++ = '\\'; + else if (*src == 'n') + *dst++ = '\n'; + else if (*src == 'r') + *dst++ = '\r'; + else if (*src == '\'' || *src == '\"') + *dst++ = *src; + else { + src--; + *dst++ = *src; + } + } + } + *dst = 0; + return str; +} + /* **************** data structure allocation **************** */ @@ -1280,6 +1314,8 @@ gchar * matching_build_command(gchar * cmd, MsgInfo * info) gchar * p; gint size; + matcher_unescape_str(cmd); + size = strlen(cmd) + 1; while (*s != '\0') { if (*s == '%') { @@ -1419,6 +1455,8 @@ gchar * matching_build_command(gchar * cmd, MsgInfo * info) } } + debug_print("*** exec string \"%s\"\n", processed_cmd); + g_free(filename); return processed_cmd; }