From 423929ad1096319a7788ceac1dc4b338c82cbd2a Mon Sep 17 00:00:00 2001 From: Erich Hoover Date: Sun, 11 Jan 2009 15:47:53 -0700 Subject: [PATCH] wcmd: Handle batch scripts containing quotes within quotes. --- programs/cmd/wcmdmain.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 4c513fb30b7..595dbc8e8dd 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1676,7 +1676,7 @@ static void WCMD_addCommand(WCHAR *command, int *commandLen, WCHAR *WCMD_ReadAndParseLine(WCHAR *optionalcmd, CMD_LIST **output, HANDLE readFrom) { WCHAR *curPos; - BOOL inQuotes = FALSE; + int inQuotes = 0; WCHAR curString[MAXSTRING]; int curStringLen = 0; WCHAR curRedirs[MAXSTRING]; @@ -1900,7 +1900,11 @@ WCHAR *WCMD_ReadAndParseLine(WCHAR *optionalcmd, CMD_LIST **output, HANDLE readF } break; - case '"': inQuotes = !inQuotes; + case '"': if (inQuotes && *(curPos+1) == ' ') { + inQuotes--; /* An end quote must be proceeded by a space */ + } else { + inQuotes++; /* Quotes within quotes are fun! */ + } curCopyTo[(*curLen)++] = *curPos; lastWasRedirect = FALSE; break; @@ -2042,7 +2046,7 @@ WCHAR *WCMD_ReadAndParseLine(WCHAR *optionalcmd, CMD_LIST **output, HANDLE readF if (*curPos == 0x00 && curDepth > 0 && readFrom != INVALID_HANDLE_VALUE) { inRem = FALSE; prevDelim = CMD_NONE; - inQuotes = FALSE; + inQuotes = 0; memset(extraSpace, 0x00, (MAXSTRING+1) * sizeof(WCHAR)); /* Read more, skipping any blank lines */