Jason Edmeades : cmd.exe: Add basic for /F string support.
Module: wine Branch: master Commit: f3ae48cbdafb93936f51133045714f7a64f3ce12 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f3ae48cbdafb93936f51133045... Author: Jason Edmeades <jason.edmeades(a)googlemail.com> Date: Tue Sep 11 21:43:06 2007 +0100 cmd.exe: Add basic for /F string support. --- programs/cmd/builtins.c | 27 +++++++++++++++++++++++++-- 1 files changed, 25 insertions(+), 2 deletions(-) diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index ee8f1b3..a58acde 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -770,10 +770,11 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) { /* Loop through all entries on the same line */ WCHAR *item; + WCHAR *itemStart; WINE_TRACE("Processing for set %p\n", thisSet); i = 0; - while (*(item = WCMD_parameter (thisSet->command, i, NULL))) { + while (*(item = WCMD_parameter (thisSet->command, i, &itemStart))) { /* * If the parameter within the set has a wildcard then search for matching files @@ -817,7 +818,8 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) { if (itemNum <=3) numbers[itemNum-1] = atolW(item); /* else ignore them! */ - } else if (doFileset) { + /* Filesets - either a list of files, or a command to run and parse the output */ + } else if (doFileset && *itemStart != '"') { HANDLE input; @@ -847,6 +849,8 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) { wine_dbgstr_w(buffer)); if (where) { + /* FIXME: The following should be moved into its own routine and + reused for the string literal parsing below */ thisCmdStart = cmdStart; WCMD_part_execute(&thisCmdStart, firstCmd, variable, parm, FALSE, TRUE); cmdEnd = thisCmdStart; @@ -857,6 +861,25 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) { } CloseHandle (input); } + + /* Filesets - A string literal */ + } else if (doFileset && *itemStart == '"') { + WCHAR buffer[MAXSTRING] = {'\0'}; + WCHAR *where, *parm; + + /* Skip blank lines, and re-extract parameter now string has quotes removed */ + strcpyW(buffer, item); + parm = WCMD_parameter (buffer, 0, &where); + WINE_TRACE("Parsed parameter: %s from %s\n", wine_dbgstr_w(parm), + wine_dbgstr_w(buffer)); + + if (where) { + /* FIXME: The following should be moved into its own routine and + reused for the string literal parsing below */ + thisCmdStart = cmdStart; + WCMD_part_execute(&thisCmdStart, firstCmd, variable, parm, FALSE, TRUE); + cmdEnd = thisCmdStart; + } } WINE_TRACE("Post-command, cmdEnd = %p\n", cmdEnd);
participants (1)
-
Alexandre Julliard