about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorPaul Ackersviller <packersv@users.sourceforge.net>2007-11-19 03:41:16 +0000
committerPaul Ackersviller <packersv@users.sourceforge.net>2007-11-19 03:41:16 +0000
commita3bff3e4ed5e29b695c64298d04e2d044a1a312f (patch)
treee88387477e3f7213673def5c625e15c254be682c /Src
parentf850793f055c03a29b281449b2f56f0f08b60fd0 (diff)
downloadzsh-a3bff3e4ed5e29b695c64298d04e2d044a1a312f.tar.gz
zsh-a3bff3e4ed5e29b695c64298d04e2d044a1a312f.tar.xz
zsh-a3bff3e4ed5e29b695c64298d04e2d044a1a312f.zip
Merge of 23693: _match tried to match the quoted form of file names and any completion that did it's own quoting.
Diffstat (limited to 'Src')
-rw-r--r--Src/Zle/compmatch.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/Src/Zle/compmatch.c b/Src/Zle/compmatch.c
index 7054feb6d..10fb5e20e 100644
--- a/Src/Zle/compmatch.c
+++ b/Src/Zle/compmatch.c
@@ -969,7 +969,8 @@ match_parts(char *l, char *w, int n, int part)
 /* Check if the word w is matched by the strings in pfx and sfx (the prefix
  * and the suffix from the line) or the pattern cp. In clp a cline list for
  * w is returned.
- * qu is non-zero if the words has to be quoted before processed any further.
+ * qu is non-zero if the words has to be quoted before processed any
+ * further: the value 2 indicates file quoting.
  * bpl and bsl are used to report the positions where the brace-strings in
  * the prefix and the suffix have to be re-inserted if this match is inserted
  * in the line.
@@ -986,9 +987,30 @@ comp_match(char *pfx, char *sfx, char *w, Patprog cp, Cline *clp, int qu,
     if (cp) {
 	/* We have a globcomplete-like pattern, just use that. */
 	int wl;
+	char *teststr;
 
 	r = w;
-	if (!pattry(cp, r))
+	if (!qu) {
+	    /*
+	     * If we're not quoting the strings, that means they're
+	     * already quoted (?) and so when we test them against
+	     * a pattern we have to remove the quotes else we will
+	     * end up trying to match against the quote characters.
+	     *
+	     * Almost certainly this fails in some complicated cases
+	     * but it should catch the basic ones.
+	     */
+	    teststr = dupstring(r);
+	    tokenize(teststr);
+	    if (parse_subst_string(teststr))
+		teststr = r;
+	    else {
+		remnulargs(teststr);
+		untokenize(teststr);
+	    }
+	} else
+	    teststr = r;
+	if (!pattry(cp, teststr))
 	    return NULL;
     
 	r = (qu == 2 ? tildequote(r, 0) : multiquote(r, !qu));