mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-30 09:20:40 +00:00
cmd: Set success/failure return code for SETLOCAL/ENDLOCAL commands.
Signed-off-by: Eric Pouech <epouech@codeweavers.com>
This commit is contained in:
parent
310cde555b
commit
ab1782fc86
|
@ -2298,33 +2298,40 @@ static WCHAR *WCMD_dupenv( const WCHAR *env )
|
||||||
* setlocal pushes the environment onto a stack
|
* setlocal pushes the environment onto a stack
|
||||||
* Save the environment as unicode so we don't screw anything up.
|
* Save the environment as unicode so we don't screw anything up.
|
||||||
*/
|
*/
|
||||||
void WCMD_setlocal (const WCHAR *s) {
|
RETURN_CODE WCMD_setlocal(WCHAR *args)
|
||||||
|
{
|
||||||
WCHAR *env;
|
WCHAR *env;
|
||||||
struct env_stack *env_copy;
|
struct env_stack *env_copy;
|
||||||
WCHAR cwd[MAX_PATH];
|
WCHAR cwd[MAX_PATH];
|
||||||
BOOL newdelay;
|
BOOL newdelay;
|
||||||
|
int argno = 0;
|
||||||
|
WCHAR *argN = args;
|
||||||
|
|
||||||
/* setlocal does nothing outside of batch programs */
|
/* setlocal does nothing outside of batch programs */
|
||||||
if (!context) return;
|
if (!context)
|
||||||
|
return NO_ERROR;
|
||||||
/* DISABLEEXTENSIONS ignored */
|
newdelay = delayedsubst;
|
||||||
|
while (argN)
|
||||||
/* ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION could be parm1 or parm2
|
{
|
||||||
(if both ENABLEEXTENSIONS and ENABLEDELAYEDEXPANSION supplied for example) */
|
WCHAR *thisArg = WCMD_parameter (args, argno++, &argN, FALSE, FALSE);
|
||||||
if (!wcsicmp(param1, L"ENABLEDELAYEDEXPANSION") || !wcsicmp(param2, L"ENABLEDELAYEDEXPANSION")) {
|
if (!thisArg || !*thisArg) break;
|
||||||
newdelay = TRUE;
|
if (!wcsicmp(thisArg, L"ENABLEDELAYEDEXPANSION"))
|
||||||
} else if (!wcsicmp(param1, L"DISABLEDELAYEDEXPANSION") || !wcsicmp(param2, L"DISABLEDELAYEDEXPANSION")) {
|
newdelay = TRUE;
|
||||||
newdelay = FALSE;
|
else if (!wcsicmp(thisArg, L"DISABLEDELAYEDEXPANSION"))
|
||||||
} else {
|
newdelay = FALSE;
|
||||||
newdelay = delayedsubst;
|
/* ENABLE/DISABLE EXTENSIONS ignored for now */
|
||||||
|
else if (!wcsicmp(thisArg, L"ENABLEEXTENSIONS") || !wcsicmp(thisArg, L"DISABLEEXTENSIONS"))
|
||||||
|
{}
|
||||||
|
else
|
||||||
|
return errorlevel = ERROR_INVALID_FUNCTION;
|
||||||
|
TRACE("Setting delayed expansion to %d\n", newdelay);
|
||||||
}
|
}
|
||||||
WINE_TRACE("Setting delayed expansion to %d\n", newdelay);
|
|
||||||
|
|
||||||
env_copy = LocalAlloc (LMEM_FIXED, sizeof (struct env_stack));
|
env_copy = LocalAlloc (LMEM_FIXED, sizeof (struct env_stack));
|
||||||
if( !env_copy )
|
if( !env_copy )
|
||||||
{
|
{
|
||||||
WINE_ERR ("out of memory\n");
|
ERR("out of memory\n");
|
||||||
return;
|
return errorlevel = ERROR_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
env = GetEnvironmentStringsW ();
|
env = GetEnvironmentStringsW ();
|
||||||
|
@ -2345,7 +2352,7 @@ void WCMD_setlocal (const WCHAR *s) {
|
||||||
LocalFree (env_copy);
|
LocalFree (env_copy);
|
||||||
|
|
||||||
FreeEnvironmentStringsW (env);
|
FreeEnvironmentStringsW (env);
|
||||||
|
return errorlevel = NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
@ -2355,18 +2362,19 @@ void WCMD_setlocal (const WCHAR *s) {
|
||||||
* Note: When searching for '=', search from WCHAR position 1, to handle
|
* Note: When searching for '=', search from WCHAR position 1, to handle
|
||||||
* special internal environment variables =C:, =D: etc
|
* special internal environment variables =C:, =D: etc
|
||||||
*/
|
*/
|
||||||
void WCMD_endlocal (void) {
|
RETURN_CODE WCMD_endlocal(void)
|
||||||
|
{
|
||||||
WCHAR *env, *old, *p;
|
WCHAR *env, *old, *p;
|
||||||
struct env_stack *temp;
|
struct env_stack *temp;
|
||||||
int len, n;
|
int len, n;
|
||||||
|
|
||||||
/* setlocal does nothing outside of batch programs */
|
/* setlocal does nothing outside of batch programs */
|
||||||
if (!context) return;
|
if (!context) return NO_ERROR;
|
||||||
|
|
||||||
/* setlocal needs a saved environment from within the same context (batch
|
/* setlocal needs a saved environment from within the same context (batch
|
||||||
program) as it was saved in */
|
program) as it was saved in */
|
||||||
if (!saved_environment || saved_environment->batchhandle != context->h)
|
if (!saved_environment || saved_environment->batchhandle != context->h)
|
||||||
return;
|
return ERROR_INVALID_FUNCTION;
|
||||||
|
|
||||||
/* pop the old environment from the stack */
|
/* pop the old environment from the stack */
|
||||||
temp = saved_environment;
|
temp = saved_environment;
|
||||||
|
@ -2419,6 +2427,7 @@ void WCMD_endlocal (void) {
|
||||||
|
|
||||||
LocalFree (env);
|
LocalFree (env);
|
||||||
LocalFree (temp);
|
LocalFree (temp);
|
||||||
|
return NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
|
@ -536,11 +536,11 @@ ERRORLEVEL 666
|
||||||
ERRORLEVEL 666
|
ERRORLEVEL 666
|
||||||
ERRORLEVEL 666
|
ERRORLEVEL 666
|
||||||
--- success/failure for SETLOCAL/ENDLOCAL commands
|
--- success/failure for SETLOCAL/ENDLOCAL commands
|
||||||
@todo_wine@FAILURE 1
|
FAILURE 1
|
||||||
@todo_wine@SUCCESS 0
|
SUCCESS 0
|
||||||
SUCCESS 666
|
SUCCESS 666
|
||||||
@todo_wine@SUCCESS@space@
|
@todo_wine@SUCCESS@space@
|
||||||
@todo_wine@SUCCESS 0
|
SUCCESS 0
|
||||||
--- success/failure for DATE command
|
--- success/failure for DATE command
|
||||||
@todo_wine@SUCCESS 0
|
@todo_wine@SUCCESS 0
|
||||||
@todo_wine@FAILURE 1
|
@todo_wine@FAILURE 1
|
||||||
|
@ -739,7 +739,7 @@ foo
|
||||||
bar@or_broken@foo
|
bar@or_broken@foo
|
||||||
gotitright
|
gotitright
|
||||||
33
|
33
|
||||||
@todo_wine@0@or_broken@1
|
0@or_broken@1
|
||||||
foo
|
foo
|
||||||
!WINE_FOO!
|
!WINE_FOO!
|
||||||
not empty
|
not empty
|
||||||
|
|
|
@ -171,7 +171,7 @@ RETURN_CODE WCMD_create_dir(WCHAR *);
|
||||||
RETURN_CODE WCMD_delete(WCHAR *);
|
RETURN_CODE WCMD_delete(WCHAR *);
|
||||||
RETURN_CODE WCMD_directory(WCHAR *);
|
RETURN_CODE WCMD_directory(WCHAR *);
|
||||||
RETURN_CODE WCMD_echo(const WCHAR *);
|
RETURN_CODE WCMD_echo(const WCHAR *);
|
||||||
void WCMD_endlocal (void);
|
RETURN_CODE WCMD_endlocal(void);
|
||||||
void WCMD_enter_paged_mode(const WCHAR *);
|
void WCMD_enter_paged_mode(const WCHAR *);
|
||||||
RETURN_CODE WCMD_exit(void);
|
RETURN_CODE WCMD_exit(void);
|
||||||
BOOL WCMD_get_fullpath(const WCHAR *, SIZE_T, WCHAR *, WCHAR **);
|
BOOL WCMD_get_fullpath(const WCHAR *, SIZE_T, WCHAR *, WCHAR **);
|
||||||
|
@ -192,7 +192,7 @@ RETURN_CODE WCMD_pushd(const WCHAR *args);
|
||||||
RETURN_CODE WCMD_remove_dir(WCHAR *command);
|
RETURN_CODE WCMD_remove_dir(WCHAR *command);
|
||||||
RETURN_CODE WCMD_rename(void);
|
RETURN_CODE WCMD_rename(void);
|
||||||
void WCMD_run_program (WCHAR *command, BOOL called);
|
void WCMD_run_program (WCHAR *command, BOOL called);
|
||||||
void WCMD_setlocal (const WCHAR *args);
|
RETURN_CODE WCMD_setlocal(WCHAR *args);
|
||||||
void WCMD_setshow_date (void);
|
void WCMD_setshow_date (void);
|
||||||
RETURN_CODE WCMD_setshow_default(const WCHAR *args);
|
RETURN_CODE WCMD_setshow_default(const WCHAR *args);
|
||||||
void WCMD_setshow_env (WCHAR *command);
|
void WCMD_setshow_env (WCHAR *command);
|
||||||
|
|
|
@ -1878,10 +1878,10 @@ static RETURN_CODE execute_single_command(const WCHAR *command)
|
||||||
return_code = WCMD_remove_dir(parms_start);
|
return_code = WCMD_remove_dir(parms_start);
|
||||||
break;
|
break;
|
||||||
case WCMD_SETLOCAL:
|
case WCMD_SETLOCAL:
|
||||||
WCMD_setlocal(parms_start);
|
return_code = WCMD_setlocal(parms_start);
|
||||||
break;
|
break;
|
||||||
case WCMD_ENDLOCAL:
|
case WCMD_ENDLOCAL:
|
||||||
WCMD_endlocal();
|
return_code = WCMD_endlocal();
|
||||||
break;
|
break;
|
||||||
case WCMD_SET:
|
case WCMD_SET:
|
||||||
WCMD_setshow_env (parms_start);
|
WCMD_setshow_env (parms_start);
|
||||||
|
|
Loading…
Reference in a new issue