Module: wine Branch: master Commit: a78ccf11602215c51d664bea4ced1141f0470425 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a78ccf11602215c51d664bea4c...
Author: Peter Dons Tychsen donpedro@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! */ }