cmd: Identify the program name using more appropriate parsing.

This commit is contained in:
Jason Edmeades 2012-10-13 22:11:03 +01:00 committed by Alexandre Julliard
parent 25cf0aa046
commit 4236c2007d
2 changed files with 26 additions and 29 deletions

View File

@ -48,37 +48,37 @@ var=33@space@
------ Testing invocation of batch files ---------- ------ Testing invocation of batch files ----------
0@space@ 0@space@
1@space@ 1@space@
@todo_wine@1@space@
1@space@ 1@space@
@todo_wine@1@space@ 1@space@
1@space@
0@space@ 0@space@
@todo_wine@1@space@ 1@space@
@todo_wine@2@space@ 2@space@
0@space@ 0@space@
3@space@ 3@space@
@todo_wine@3@space@ 3@space@
@todo_wine@4@space@ @todo_wine@4@space@
------ Testing invocation with CMD /C ------------- ------ Testing invocation with CMD /C -------------
0@space@ 0@space@
1@space@ 1@space@
@todo_wine@0@space@
0@space@ 0@space@
@todo_wine@1@space@
0@space@ 0@space@
@todo_wine@1@space@ 1@space@
@todo_wine@2@space@
0@space@ 0@space@
@todo_wine@3@space@ 1@space@
2@space@
0@space@
3@space@
@todo_wine@4@space@ @todo_wine@4@space@
---------- Testing CMD /C quoting ----------------- ---------- Testing CMD /C quoting -----------------
"hi" "hi"
@todo_wine@1@space@ 1@space@
"\"\\"\\\"\\\\"@space@"\"\\"\\\"\\\\" "\"\\"\\\"\\\\"@space@"\"\\"\\\"\\\\"
1@space@ 1@space@
0@space@ 0@space@
1@space@ 1@space@
0@space@ 0@space@
@todo_wine@0@space@ 0@space@
0@space@@or_broken@3@space@ 0@space@@or_broken@3@space@
3@space@ 3@space@
2@space@ 2@space@
@ -100,7 +100,7 @@ THIS FAILS: cmd ignoreme/c say one
{@space@ {@space@
}@space@ }@space@
0@space@ 0@space@
@todo_wine@0@space@ 0@space@
!@space@ !@space@
@todo_wine@0@space@@or_broken@!@space@ @todo_wine@0@space@@or_broken@!@space@
@todo_wine@0@space@ @todo_wine@0@space@
@ -117,8 +117,8 @@ THIS FAILS: cmd ignoreme/c say one
@todo_wine@1:((1)),2:@space@ @todo_wine@1:((1)),2:@space@
@todo_wine@1:(1)(2),2:@space@ @todo_wine@1:(1)(2),2:@space@
@todo_wine@1:(1),2:(2)@space@ @todo_wine@1:(1),2:(2)@space@
@todo_wine@1:1,2:2@space@ 1:1,2:2@space@
@todo_wine@1:1,2:2@space@ 1:1,2:2@space@
@todo_wine@1:1,2:2@space@ 1:1,2:2@space@
1:"p@space@"1,2:p"@space@"2@space@ 1:"p@space@"1,2:p"@space@"2@space@
1:p"1@space@p",2:2@space@ 1:p"1@space@p",2:2@space@

View File

@ -1008,6 +1008,7 @@ void WCMD_run_program (WCHAR *command, BOOL called)
MAX_PATH, including null character */ MAX_PATH, including null character */
WCHAR *lastSlash; WCHAR *lastSlash;
WCHAR pathext[MAXSTRING]; WCHAR pathext[MAXSTRING];
WCHAR *firstParam;
BOOL extensionsupplied = FALSE; BOOL extensionsupplied = FALSE;
BOOL launched = FALSE; BOOL launched = FALSE;
BOOL status; BOOL status;
@ -1016,17 +1017,13 @@ void WCMD_run_program (WCHAR *command, BOOL called)
static const WCHAR envPath[] = {'P','A','T','H','\0'}; static const WCHAR envPath[] = {'P','A','T','H','\0'};
static const WCHAR delims[] = {'/','\\',':','\0'}; static const WCHAR delims[] = {'/','\\',':','\0'};
/* Quick way to get the filename /* Quick way to get the filename is to extract the first argument. */
* (but handle leading / as part of program name, not qualifier) WINE_TRACE("Running '%s' (%d)\n", wine_dbgstr_w(command), called);
*/ firstParam = WCMD_parameter(command, 0, NULL, NULL, FALSE);
for (len = 0; command[len] == '/'; len++) param1[len] = '/'; if (!firstParam) return;
WCMD_parse (command + len, quals, param1 + len, param2);
if (!(*param1) && !(*param2))
return;
/* Calculate the search path and stem to search for */ /* Calculate the search path and stem to search for */
if (strpbrkW (param1, delims) == NULL) { /* No explicit path given, search path */ if (strpbrkW (firstParam, delims) == NULL) { /* No explicit path given, search path */
static const WCHAR curDir[] = {'.',';','\0'}; static const WCHAR curDir[] = {'.',';','\0'};
strcpyW(pathtosearch, curDir); strcpyW(pathtosearch, curDir);
len = GetEnvironmentVariableW(envPath, &pathtosearch[2], (sizeof(pathtosearch)/sizeof(WCHAR))-2); len = GetEnvironmentVariableW(envPath, &pathtosearch[2], (sizeof(pathtosearch)/sizeof(WCHAR))-2);
@ -1034,19 +1031,19 @@ void WCMD_run_program (WCHAR *command, BOOL called)
static const WCHAR curDir[] = {'.','\0'}; static const WCHAR curDir[] = {'.','\0'};
strcpyW (pathtosearch, curDir); strcpyW (pathtosearch, curDir);
} }
if (strchrW(param1, '.') != NULL) extensionsupplied = TRUE; if (strchrW(firstParam, '.') != NULL) extensionsupplied = TRUE;
if (strlenW(param1) >= MAX_PATH) if (strlenW(firstParam) >= MAX_PATH)
{ {
WCMD_output_asis_stderr(WCMD_LoadMessage(WCMD_LINETOOLONG)); WCMD_output_asis_stderr(WCMD_LoadMessage(WCMD_LINETOOLONG));
return; return;
} }
strcpyW(stemofsearch, param1); strcpyW(stemofsearch, firstParam);
} else { } else {
/* Convert eg. ..\fred to include a directory by removing file part */ /* Convert eg. ..\fred to include a directory by removing file part */
GetFullPathNameW(param1, sizeof(pathtosearch)/sizeof(WCHAR), pathtosearch, NULL); GetFullPathNameW(firstParam, sizeof(pathtosearch)/sizeof(WCHAR), pathtosearch, NULL);
lastSlash = strrchrW(pathtosearch, '\\'); lastSlash = strrchrW(pathtosearch, '\\');
if (lastSlash && strchrW(lastSlash, '.') != NULL) extensionsupplied = TRUE; if (lastSlash && strchrW(lastSlash, '.') != NULL) extensionsupplied = TRUE;
strcpyW(stemofsearch, lastSlash+1); strcpyW(stemofsearch, lastSlash+1);