summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/winPipe.test7
-rw-r--r--win/tclWinPipe.c11
2 files changed, 17 insertions, 1 deletions
diff --git a/tests/winPipe.test b/tests/winPipe.test
index 9aa84a9..5d3999e 100644
--- a/tests/winPipe.test
+++ b/tests/winPipe.test
@@ -352,6 +352,13 @@ proc _testExecArgs {flags args} {
} r]} {
set r "ERROR: $r"
}
+ if {[file extension [lindex $cmd 0]] eq ".bat"} {
+ set evm {}; foreach ev [lsort -unique [regexp -inline -all {%[A-Z]+%} $e]] {
+ set ev [string range $ev 1 end-1]
+ if {[info exists ::env($ev)]} { lappend evm %$ev% $::env($ev) }
+ }
+ set e [string map $evm $e]
+ }
if {$r ne $e} {
append broken "\[ERROR\]: exec [file extension [lindex $cmd 0]] on $args\n -- result:\n$r\n -- expected:\n$e\n"
}
diff --git a/win/tclWinPipe.c b/win/tclWinPipe.c
index 8b707fa..b992536 100644
--- a/win/tclWinPipe.c
+++ b/win/tclWinPipe.c
@@ -1557,12 +1557,20 @@ BuildCommandLine(
const char *arg, *start, *special, *bspos;
int quote = 0, i;
Tcl_DString ds;
+#ifdef TCL_WIN_PIPE_FULLESC
+ /* full escape inclusive %-subst avoidance */
static const char specMetaChars[] = "&|^<>!()%";
/* Characters to enclose in quotes if unpaired
* quote flag set. */
static const char specMetaChars2[] = "%";
/* Character to enclose in quotes in any case
* (regardless of unpaired-flag). */
+#else
+ /* escape considering quotation only (no %-subst avoidance) */
+ static const char specMetaChars[] = "&|^<>!()";
+ /* Characters to enclose in quotes if unpaired
+ * quote flag set. */
+#endif
/*
* Quote flags:
* CL_ESCAPE - escape argument;
@@ -1700,7 +1708,7 @@ BuildCommandLine(
start = !bspos ? special : bspos;
continue;
}
-
+#ifdef TCL_WIN_PIPE_FULLESC
/*
* Special case for % - should be enclosed always (paired
* also)
@@ -1717,6 +1725,7 @@ BuildCommandLine(
start = !bspos ? special : bspos;
continue;
}
+#endif
/*
* Other not special (and not meta) character