Peter Dons Tychsen : cmd: Fix handling of quotes when line includes redirections and/or pipes.

Alexandre Julliard julliard at winehq.org
Thu Oct 8 08:57:15 CDT 2009


Module: wine
Branch: master
Commit: a78ccf11602215c51d664bea4ced1141f0470425
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a78ccf11602215c51d664bea4ced1141f0470425

Author: Peter Dons Tychsen <donpedro at tdcadsl.dk>
Date:   Sun Oct  4 04:28:26 2009 +0200

cmd: Fix handling of quotes when line includes redirections and/or pipes.

---

 programs/cmd/wcmdmain.c |   58 +++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index 249526f..9f5b6df 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -1649,6 +1649,60 @@ static void WCMD_addCommand(WCHAR *command, int *commandLen,
     *lastEntry = thisEntry;
 }
 
+
+/***************************************************************************
+ * WCMD_IsEndQuote
+ *
+ *   Checks if the quote pointet to is the end-quote.
+ *
+ *   Quotes end if:
+ *
+ *   1) The current parameter ends at EOL or at the beginning
+ *      of a redirection or pipe and not in a quote section.
+ *
+ *   2) If the next character is a space and not in a quote section.
+ *
+ *   Returns TRUE if this is an end quote, and FALSE if it is not.
+ *
+ */
+static BOOL WCMD_IsEndQuote(WCHAR *quote, int quoteIndex)
+{
+    int quoteCount = quoteIndex;
+    int i;
+
+    /* If we are not in a quoted section, then we are not an end-quote */
+    if(quoteIndex == 0)
+    {
+        return FALSE;
+    }
+
+    /* Check how many quotes are left for this parameter */
+    for(i=0;quote[i];i++)
+    {
+        if(quote[i] == '"')
+        {
+            quoteCount++;
+        }
+
+        /* Quote counting ends at EOL, redirection, space or pipe if current quote is complete */
+        else if(((quoteCount % 2) == 0)
+            && ((quote[i] == '<') || (quote[i] == '>') || (quote[i] == '|') || (quote[i] == ' ')))
+        {
+            break;
+        }
+    }
+
+    /* If the quote is part of the last part of a series of quotes-on-quotes, then it must
+       be an end-quote */
+    if(quoteIndex >= (quoteCount / 2))
+    {
+        return TRUE;
+    }
+
+    /* No cigar */
+    return FALSE;
+}
+
 /***************************************************************************
  * WCMD_ReadAndParseLine
  *
@@ -1897,8 +1951,8 @@ WCHAR *WCMD_ReadAndParseLine(WCHAR *optionalcmd, CMD_LIST **output, HANDLE readF
                 }
                 break;
 
-      case '"': if (inQuotes && *(curPos+1) == ' ') {
-                    inQuotes--; /* An end quote must be proceeded by a space */
+      case '"': if (WCMD_IsEndQuote(curPos, inQuotes)) {
+                    inQuotes--;
                 } else {
                     inQuotes++; /* Quotes within quotes are fun! */
                 }




More information about the wine-cvs mailing list