[PATCH 1/3] [cmd] set "var=value" ignores trailing characters

Jason Edmeades jason at edmeades.me.uk
Tue Jun 4 16:06:33 CDT 2013


set "var=value"junk ignores all characters after the last quote,
meaning in the above example 'junk' is thrown away. Similarly,
set /p "var=prompt"junk does the same

[Fixes bug 33639]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20130604/4fbf2bb2/attachment.html>
-------------- next part --------------
From ad6819c150c1d7882bc968810f8f73705f000f79 Mon Sep 17 00:00:00 2001
From: Jason Edmeades <jason at edmeades.me.uk>
Date: Mon, 3 Jun 2013 22:38:15 +0100
Subject: [PATCH 1/3] [cmd] set "var=value" ignores trailing characters

set "var=value"junk ignores all characters after the last quote,
meaning in the above example 'junk' is thrown away. Similarly,
set /p "var=prompt"junk does the same

[Fixes bug 33639]
---
 programs/cmd/builtins.c                  |   19 +++++++++++++++----
 programs/cmd/tests/test_builtins.cmd     |   18 ++++++++++++++++++
 programs/cmd/tests/test_builtins.cmd.exp |    7 +++++++
 programs/cmd/wcmd.h                      |    2 +-
 programs/cmd/wcmdmain.c                  |    9 ++++++---
 5 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index 3c06e13..c2ccdc8 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -4038,8 +4038,13 @@ void WCMD_setshow_env (WCHAR *s) {
 
     s += 2;
     while (*s && (*s==' ' || *s=='\t')) s++;
-    if (*s=='\"')
-        WCMD_strip_quotes(s);
+    /* set /P "var=value"jim ignores anything after the last quote */
+    if (*s=='\"') {
+      WCHAR *lastquote;
+      lastquote = WCMD_strip_quotes(s);
+      if (lastquote) *lastquote = 0x00;
+      WINE_TRACE("set: Stripped command line '%s'\n", wine_dbgstr_w(s));
+    }
 
     /* If no parameter, or no '=' sign, return an error */
     if (!(*s) || ((p = strchrW (s, '=')) == NULL )) {
@@ -4104,8 +4109,14 @@ void WCMD_setshow_env (WCHAR *s) {
   } else {
     DWORD gle;
 
-    if (*s=='\"')
-        WCMD_strip_quotes(s);
+    /* set "var=value"jim ignores anything after the last quote */
+    if (*s=='\"') {
+      WCHAR *lastquote;
+      lastquote = WCMD_strip_quotes(s);
+      if (lastquote) *lastquote = 0x00;
+      WINE_TRACE("set: Stripped command line '%s'\n", wine_dbgstr_w(s));
+    }
+
     p = strchrW (s, '=');
     if (p == NULL) {
       env = GetEnvironmentStringsW();
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index 45617cf..48a8362 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -286,6 +286,24 @@ set WINE_FOO=foo at space@
 echo '%WINE_FOO%'
 set WINE_FOO=foo at tab@
 echo '%WINE_FOO%'
+rem Space symbol must appear in `var`
+set WINE_FOO=value at space@
+echo '%WINE_FOO%'
+rem Space symbol must NOT appear in `var`
+set "WINE_FOO=value"@space@
+echo '%WINE_FOO%'
+rem Mixed examples:
+set WINE_FOO=jim fred
+echo '%WINE_FOO%'
+set WINE_FOO="jim" fred
+echo '%WINE_FOO%'
+set "WINE_FOO=jim fred"
+echo '%WINE_FOO%'
+set "WINE_FOO=jim" fred
+echo '%WINE_FOO%'
+rem Only the final quote ends the string
+set "WINE_FOO=apple"banana"grape"orange
+echo '%WINE_FOO%'
 set WINE_FOO=
 
 echo ------------ Testing variable expansion ------------
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index 99ed738..77e4178 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -251,6 +251,13 @@ foo
 ''
 'foo at space@'
 'foo at tab@'
+'value at space@'
+'value'
+'jim fred'
+'"jim" fred'
+'jim fred'
+'jim'
+'apple"banana"grape'
 ------------ Testing variable expansion ------------
 ~dp0 should be directory containing batch file
 @pwd@\
diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h
index 418f8c9..e5a0138 100644
--- a/programs/cmd/wcmd.h
+++ b/programs/cmd/wcmd.h
@@ -115,7 +115,7 @@ BOOL WCMD_keyword_ws_found(const WCHAR *keyword, int len, const WCHAR *ptr);
 void WCMD_HandleTildaModifiers(WCHAR **start, BOOL atExecute);
 
 void WCMD_splitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext);
-void WCMD_strip_quotes(WCHAR *cmd);
+WCHAR *WCMD_strip_quotes(WCHAR *cmd);
 WCHAR *WCMD_LoadMessage(UINT id);
 void WCMD_strsubstW(WCHAR *start, const WCHAR* next, const WCHAR* insert, int len);
 BOOL WCMD_ReadFile(const HANDLE hIn, WCHAR *intoBuf, const DWORD maxChars, LPDWORD charsRead);
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index 876bbef..0d4575b 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -496,20 +496,23 @@ BOOL WCMD_keyword_ws_found(const WCHAR *keyword, int len, const WCHAR *ptr) {
 /*************************************************************************
  * WCMD_strip_quotes
  *
- *	Remove first and last quote WCHARacters, preserving all other text
+ *  Remove first and last quote WCHARacters, preserving all other text
+ *  Returns the location of the final quote
  */
-void WCMD_strip_quotes(WCHAR *cmd) {
-  WCHAR *src = cmd + 1, *dest = cmd, *lastq = NULL;
+WCHAR *WCMD_strip_quotes(WCHAR *cmd) {
+  WCHAR *src = cmd + 1, *dest = cmd, *lastq = NULL, *lastquote;
   while((*dest=*src) != '\0') {
       if (*src=='\"')
           lastq=dest;
       dest++, src++;
   }
+  lastquote = lastq;
   if (lastq) {
       dest=lastq++;
       while ((*dest++=*lastq++) != 0)
           ;
   }
+  return lastquote;
 }
 
 
-- 
1.7.9.5


More information about the wine-patches mailing list