} else if ((cp = strrchr(arg, '/')) != NULL) {
arg = cp + 1;
if (*arg == '.' && arg[1] == '\0')
- arg++;
+ arg++;
}
arg_len = strlen(arg);
if (arg_len) {
while (*cp) {
switch (*cp) {
case '\\':
- backslash_cnt++;
- if (saw_wild)
- *p++ = '\\';
+ if (cp[1] == ']')
+ cp++; /* A \] in a filter might cause a problem w/o wildcards. */
+ else if (!strchr("*[?", cp[1])) {
+ backslash_cnt++;
+ if (saw_wild)
+ *p++ = '\\';
+ }
*p++ = *cp++;
break;
case '/':
implied_filter_list.head = R_rule;
if (DEBUG_GTE(FILTER, 3)) {
rprintf(FINFO, "[%s] add_implied_include(%s/)\n",
- who_am_i(), rule->pattern);
+ who_am_i(), R_rule->pattern);
}
}
}
*p = '\0';
rule->u.slash_cnt = slash_cnt;
arg = (const char *)rule->pattern;
+ arg_len = p - arg; /* We recompute it due to backslash weirdness. */
if (DEBUG_GTE(FILTER, 3))
rprintf(FINFO, "[%s] add_implied_include(%s)\n", who_am_i(), rule->pattern);
}
const char *f = arg;
char *t = ret + len1;
while (*f) {
- if (strchr(escapes, *f))
+ if (*f == '\\') {
+ if (!is_filename_arg || !strchr(WILD_CHARS, f[1]))
+ *t++ = '\\';
+ } else if (strchr(escapes, *f))
*t++ = '\\';
*t++ = *f++;
}