Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
dc4dd0cb
Commit
dc4dd0cb
authored
Jun 02, 2013
by
Jason Edmeades
Committed by
Alexandre Julliard
Jun 04, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
cmd: Fix handling of redundant information on goto/labels.
parent
f3eb64ec
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
97 additions
and
20 deletions
+97
-20
builtins.c
programs/cmd/builtins.c
+24
-10
test_builtins.cmd
programs/cmd/tests/test_builtins.cmd
+55
-0
test_builtins.cmd.exp
programs/cmd/tests/test_builtins.cmd.exp
+6
-0
wcmdmain.c
programs/cmd/wcmdmain.c
+12
-10
No files found.
programs/cmd/builtins.c
View file @
dc4dd0cb
...
...
@@ -2501,7 +2501,8 @@ void WCMD_give_help (const WCHAR *args)
void
WCMD_goto
(
CMD_LIST
**
cmdList
)
{
WCHAR
string
[
MAX_PATH
];
WCHAR
current
[
MAX_PATH
];
WCHAR
*
labelend
=
NULL
;
const
WCHAR
labelEndsW
[]
=
{
'>'
,
'<'
,
'|'
,
'&'
,
' '
,
':'
,
'\t'
,
'\0'
};
/* Do not process any more parts of a processed multipart or multilines command */
if
(
cmdList
)
*
cmdList
=
NULL
;
...
...
@@ -2521,25 +2522,38 @@ void WCMD_goto (CMD_LIST **cmdList) {
return
;
}
/* Support goto :label as well as goto label */
/* Support goto :label as well as goto label
plus remove trailing chars
*/
if
(
*
paramStart
==
':'
)
paramStart
++
;
labelend
=
strpbrkW
(
paramStart
,
labelEndsW
);
if
(
labelend
)
*
labelend
=
0x00
;
WINE_TRACE
(
"goto label: '%s'
\n
"
,
wine_dbgstr_w
(
paramStart
));
SetFilePointer
(
context
->
h
,
0
,
NULL
,
FILE_BEGIN
);
while
(
WCMD_fgets
(
string
,
sizeof
(
string
)
/
sizeof
(
WCHAR
),
context
->
h
))
{
while
(
*
paramStart
&&
WCMD_fgets
(
string
,
sizeof
(
string
)
/
sizeof
(
WCHAR
),
context
->
h
))
{
str
=
string
;
while
(
isspaceW
(
*
str
))
str
++
;
/* Ignore leading whitespace or no-echo character */
while
(
*
str
==
'@'
||
isspaceW
(
*
str
))
str
++
;
/* If the first real character is a : then this is a label */
if
(
*
str
==
':'
)
{
DWORD
index
=
0
;
str
++
;
while
(((
current
[
index
]
=
str
[
index
]))
&&
(
!
isspaceW
(
current
[
index
])))
index
++
;
/* ignore space at the end */
current
[
index
]
=
0
;
if
(
lstrcmpiW
(
current
,
paramStart
)
==
0
)
return
;
/* Skip spaces between : and label */
while
(
isspaceW
(
*
str
))
str
++
;
WINE_TRACE
(
"str before brk %s
\n
"
,
wine_dbgstr_w
(
str
));
/* Label ends at whitespace or redirection characters */
labelend
=
strpbrkW
(
str
,
labelEndsW
);
if
(
labelend
)
*
labelend
=
0x00
;
WINE_TRACE
(
"comparing found label %s
\n
"
,
wine_dbgstr_w
(
str
));
if
(
lstrcmpiW
(
str
,
paramStart
)
==
0
)
return
;
}
}
WCMD_output_stderr
(
WCMD_LoadMessage
(
WCMD_NOTARGET
));
context
->
skip_rest
=
TRUE
;
}
return
;
}
...
...
programs/cmd/tests/test_builtins.cmd
View file @
dc4dd0cb
...
...
@@ -2538,17 +2538,72 @@ echo %ErrorLevel% should still be 7
echo ------------ Testing GOTO ------------
if a==a goto dest1
echo FAILURE at dest 1
:dest1
echo goto with no leading space worked
if a==a goto :dest1b
echo FAILURE at dest 1b
:dest1b
echo goto with colon and no leading space worked
if b==b goto dest2
echo FAILURE at dest 2
:dest2
echo goto with a leading space worked
if c==c goto dest3
echo FAILURE at dest 3
:dest3
echo goto with a leading tab worked
if d==d goto dest4
echo FAILURE at dest 4
:dest4@space@
echo goto with a following space worked
if e==e goto dest5
echo FAILURE at dest 5
:dest5&& echo FAILURE
echo goto with following amphersands worked
del failure.txt >nul 2>&1
if f==f goto dest6
echo FAILURE at dest 6
:dest6>FAILURE.TXT
if exist FAILURE.TXT echo FAILURE at dest 6 as file exists
echo goto with redirections worked
del FAILURE.TXT >nul 2>&1
:: some text that is ignored | dir >cmd_output | another test
if exist cmd_output echo FAILURE at dest 6 as file exists
echo Ignoring double colons worked
del cmd_output >nul 2>&1
rem goto a label which does not exist issues an error message and
rem acts the same as goto :EOF, and ensure ::label is never matched
del testgoto.bat >nul 2>&1
echo goto :dest7 ^>nul 2^>^&1 >> testgoto.bat
echo echo FAILURE at dest 7 - Should have not found label and issued an error plus ended the batch>> testgoto.bat
echo ::dest7>> testgoto.bat
echo echo FAILURE at dest 7 - Incorrectly went to label >> testgoto.bat
call testgoto.bat
del testgoto.bat >nul 2>&1
del testgoto.bat >nul 2>&1
echo goto ::dest8 ^>nul 2^>^&1 >> testgoto.bat
echo echo FAILURE at dest 8 - Should have not found label and issued an error plus ended the batch>> testgoto.bat
echo ::dest8>> testgoto.bat
echo echo FAILURE at dest 8 - Incorrectly went to label >> testgoto.bat
call testgoto.bat
del testgoto.bat >nul 2>&1
if g==g goto dest9
echo FAILURE at dest 9
:dest91
echo FAILURE at dest 91
@ : dest9>rubbish
echo label with mixed whitespace and no echo worked
if h==h goto :dest10:this is ignored
echo FAILURE at dest 10
:dest10:this is also ignored
echo Correctly ignored trailing information
echo ------------ Testing PATH ------------
set WINE_backup_path=%path%
...
...
programs/cmd/tests/test_builtins.cmd.exp
View file @
dc4dd0cb
...
...
@@ -1294,9 +1294,15 @@ errorlevel zero, good@or_broken@errorlevel nonzero, bad
7 should still be 7
------------ Testing GOTO ------------
goto with no leading space worked
goto with colon and no leading space worked
goto with a leading space worked
goto with a leading tab worked
goto with a following space worked
goto with following amphersands worked
goto with redirections worked
Ignoring double colons worked
label with mixed whitespace and no echo worked
Correctly ignored trailing information
------------ Testing PATH ------------
PATH=original
PATH=try2
...
...
programs/cmd/wcmdmain.c
View file @
dc4dd0cb
...
...
@@ -1813,7 +1813,7 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE
static
const
WCHAR
forCmd
[]
=
{
'f'
,
'o'
,
'r'
};
static
const
WCHAR
ifCmd
[]
=
{
'i'
,
'f'
};
static
const
WCHAR
ifElse
[]
=
{
'e'
,
'l'
,
's'
,
'e'
};
BOOL
in
Rem
=
FALSE
;
BOOL
in
OneLine
=
FALSE
;
BOOL
inFor
=
FALSE
;
BOOL
inIn
=
FALSE
;
BOOL
inIf
=
FALSE
;
...
...
@@ -1910,9 +1910,10 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE
if
(
curStringLen
==
0
&&
curCopyTo
==
curString
)
{
static
const
WCHAR
forDO
[]
=
{
'd'
,
'o'
};
/* If command starts with 'rem ', ignore any &&, ( etc. */
if
(
WCMD_keyword_ws_found
(
remCmd
,
sizeof
(
remCmd
)
/
sizeof
(
remCmd
[
0
]),
curPos
))
{
inRem
=
TRUE
;
/* If command starts with 'rem ' or identifies a label, ignore any &&, ( etc. */
if
(
WCMD_keyword_ws_found
(
remCmd
,
sizeof
(
remCmd
)
/
sizeof
(
remCmd
[
0
]),
curPos
)
||
*
curPos
==
':'
)
{
inOneLine
=
TRUE
;
}
else
if
(
WCMD_keyword_ws_found
(
forCmd
,
sizeof
(
forCmd
)
/
sizeof
(
forCmd
[
0
]),
curPos
))
{
inFor
=
TRUE
;
...
...
@@ -1971,11 +1972,12 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE
}
}
/* Nothing 'ends' a REM statement and &&, quotes etc are ineffective,
so just use the default processing ie skip character specific
matching below */
if
(
!
inRem
)
thisChar
=
*
curPos
;
else
thisChar
=
'X'
;
/* Character with no special processing */
/* Nothing 'ends' a one line statement (e.g. REM or :labels mean
the &&, quotes and redirection etc are ineffective, so just force
the use of the default processing by skipping character specific
matching below) */
if
(
!
inOneLine
)
thisChar
=
*
curPos
;
else
thisChar
=
'X'
;
/* Character with no special processing */
lastWasWhiteSpace
=
FALSE
;
/* Will be reset below */
lastWasCaret
=
FALSE
;
...
...
@@ -2225,7 +2227,7 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE
WCHAR
*
extraData
;
WINE_TRACE
(
"Need to read more data as outstanding brackets or carets
\n
"
);
in
Rem
=
FALSE
;
in
OneLine
=
FALSE
;
prevDelim
=
CMD_NONE
;
inQuotes
=
0
;
memset
(
extraSpace
,
0x00
,
(
MAXSTRING
+
1
)
*
sizeof
(
WCHAR
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment