summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-10-09 21:49:33 +0200
committerBram Moolenaar <Bram@vim.org>2018-10-09 21:49:33 +0200
commit0664089eccec1083dd04ef2255856fb34ce62f15 (patch)
tree3358c6be040a9af6dfa17849bec2ed8ee33617d8 /src
parent1d3dbcf743be9c72a0df5fc0711553fce287d3f8 (diff)
patch 8.1.0468: MS-Windows: filter command with pipe character failsv8.1.0468
Problem: MS-Windows: Filter command with pipe character fails. (Johannes Riecken) Solution: Find the pipe character outside of quotes. (Yasuhiro Matsumoto, closes #1743, closes #3523)
Diffstat (limited to 'src')
-rw-r--r--src/ex_cmds.c24
-rw-r--r--src/testdir/test_filter_cmd.vim13
-rw-r--r--src/version.c2
3 files changed, 37 insertions, 2 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 99c19f9136..0a5387c52b 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1676,6 +1676,26 @@ do_shell(
apply_autocmds(EVENT_SHELLCMDPOST, NULL, NULL, FALSE, curbuf);
}
+#if !defined(UNIX)
+ static char_u *
+find_pipe(char_u *cmd)
+{
+ char_u *p;
+ int inquote = FALSE;
+
+ for (p = cmd; *p != NUL; ++p)
+ {
+ if (!inquote && *p == '|')
+ return p;
+ if (*p == '"')
+ inquote = !inquote;
+ else if (rem_backslash(p))
+ ++p;
+ }
+ return NULL;
+}
+#endif
+
/*
* Create a shell command from a command string, input redirection file and
* output redirection file.
@@ -1746,7 +1766,7 @@ make_filter_cmd(
*/
if (*p_shq == NUL)
{
- p = vim_strchr(buf, '|');
+ p = find_pipe(buf);
if (p != NULL)
*p = NUL;
}
@@ -1754,7 +1774,7 @@ make_filter_cmd(
STRCAT(buf, itmp);
if (*p_shq == NUL)
{
- p = vim_strchr(cmd, '|');
+ p = find_pipe(cmd);
if (p != NULL)
{
STRCAT(buf, " "); /* insert a space before the '|' for DOS */
diff --git a/src/testdir/test_filter_cmd.vim b/src/testdir/test_filter_cmd.vim
index 5aa5fa64df..86347ab77f 100644
--- a/src/testdir/test_filter_cmd.vim
+++ b/src/testdir/test_filter_cmd.vim
@@ -74,3 +74,16 @@ func Test_filter_cmd_completion()
call assert_equal('filter /pat/ print', s:complete_filter_cmd('filter /pat/ pri'))
call assert_equal('filter #pat# print', s:complete_filter_cmd('filter #pat# pri'))
endfunc
+
+func Test_filter_cmd_with_filter()
+ new
+ set shelltemp
+ %!echo "a|b"
+ let out = getline(1)
+ bw!
+ if has('win32')
+ let out = trim(out, '" ')
+ endif
+ call assert_equal('a|b', out)
+ set shelltemp&
+endfunction
diff --git a/src/version.c b/src/version.c
index def449a576..d4cccb941a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -793,6 +793,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 468,
+/**/
467,
/**/
466,