mirror of
https://github.com/reactos/reactos.git
synced 2024-10-02 07:26:47 +00:00
support blocks ( ... )
support parsing of env vars like %TIMERAW:~0,2% there is still room for improvement... svn path=/trunk/; revision=31903
This commit is contained in:
parent
95ed37888e
commit
67ed022d72
|
@ -272,6 +272,7 @@ BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param)
|
||||||
SetFilePointer (bc->hBatchFile, 0, NULL, FILE_BEGIN);
|
SetFilePointer (bc->hBatchFile, 0, NULL, FILE_BEGIN);
|
||||||
bc->bEcho = bEcho; /* Preserve echo across batch calls */
|
bc->bEcho = bEcho; /* Preserve echo across batch calls */
|
||||||
bc->shiftlevel = 0;
|
bc->shiftlevel = 0;
|
||||||
|
bc->bCmdBlock = FALSE;
|
||||||
|
|
||||||
bc->ffind = NULL;
|
bc->ffind = NULL;
|
||||||
bc->forvar = _T('\0');
|
bc->forvar = _T('\0');
|
||||||
|
@ -453,6 +454,18 @@ LPTSTR ReadBatchLine (LPBOOL bLocalEcho)
|
||||||
|
|
||||||
*++ip = _T('\0');
|
*++ip = _T('\0');
|
||||||
|
|
||||||
|
/* cmd block over multiple lines (..) */
|
||||||
|
if (bc->bCmdBlock)
|
||||||
|
{
|
||||||
|
if (*first == _T(')'))
|
||||||
|
{
|
||||||
|
bc->bCmdBlock = FALSE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!bc->bExecuteBlock)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* ignore labels and empty lines */
|
/* ignore labels and empty lines */
|
||||||
if (*first == _T(':') || *first == 0)
|
if (*first == _T(':') || *first == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -23,6 +23,8 @@ typedef struct tagBATCHCONTEXT
|
||||||
TCHAR Out[MAX_PATH];
|
TCHAR Out[MAX_PATH];
|
||||||
TCHAR Err[MAX_PATH];
|
TCHAR Err[MAX_PATH];
|
||||||
TCHAR forvar;
|
TCHAR forvar;
|
||||||
|
BOOL bCmdBlock;
|
||||||
|
BOOL bExecuteBlock;
|
||||||
} BATCH_CONTEXT, *LPBATCH_CONTEXT;
|
} BATCH_CONTEXT, *LPBATCH_CONTEXT;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1140,20 +1140,49 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
|
||||||
static LPTSTR ret = NULL;
|
static LPTSTR ret = NULL;
|
||||||
static UINT retlen = 0;
|
static UINT retlen = 0;
|
||||||
UINT size;
|
UINT size;
|
||||||
|
TCHAR varNameFixed[MAX_PATH];
|
||||||
|
TCHAR ReturnValue[MAX_PATH];
|
||||||
|
LPTSTR position;
|
||||||
|
LPTSTR Token;
|
||||||
|
SIZE_T i = 0;
|
||||||
|
INT StringPart[1] = {0};
|
||||||
|
|
||||||
size = GetEnvironmentVariable ( varName, ret, retlen );
|
position = _tcsstr(varName, _T(":~"));
|
||||||
|
if (position)
|
||||||
|
_tcsncpy(varNameFixed, varName, (int) (position - varName));
|
||||||
|
else
|
||||||
|
_tcscpy(varNameFixed, varName);
|
||||||
|
|
||||||
|
size = GetEnvironmentVariable ( varNameFixed, ret, retlen );
|
||||||
if ( size > retlen )
|
if ( size > retlen )
|
||||||
{
|
{
|
||||||
if ( !GrowIfNecessary ( size, &ret, &retlen ) )
|
if ( !GrowIfNecessary ( size, &ret, &retlen ) )
|
||||||
return NULL;
|
return NULL;
|
||||||
size = GetEnvironmentVariable ( varName, ret, retlen );
|
size = GetEnvironmentVariable ( varNameFixed, ret, retlen );
|
||||||
}
|
}
|
||||||
if ( size )
|
if ( size )
|
||||||
|
{
|
||||||
|
if (position)
|
||||||
|
{
|
||||||
|
position += 2;
|
||||||
|
Token = _tcstok(position, _T(","));
|
||||||
|
while ((Token != NULL) && (i < 2))
|
||||||
|
{
|
||||||
|
StringPart[i] = _ttoi(Token);
|
||||||
|
i++;
|
||||||
|
Token = _tcstok (NULL, _T(","));
|
||||||
|
}
|
||||||
|
_tcsncpy(ReturnValue, ret + (1 - StringPart[0]), StringPart[1]);
|
||||||
|
_tcscpy(ret, ReturnValue);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* env var doesn't exist, look for a "special" one */
|
/* env var doesn't exist, look for a "special" one */
|
||||||
/* %CD% */
|
/* %CD% */
|
||||||
if (_tcsicmp(varName,_T("cd")) ==0)
|
if (_tcsicmp(varNameFixed,_T("cd")) ==0)
|
||||||
{
|
{
|
||||||
size = GetCurrentDirectory ( retlen, ret );
|
size = GetCurrentDirectory ( retlen, ret );
|
||||||
if ( size > retlen )
|
if ( size > retlen )
|
||||||
|
@ -1167,7 +1196,7 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
/* %TIME% */
|
/* %TIME% */
|
||||||
else if (_tcsicmp(varName,_T("time")) ==0)
|
else if (_tcsicmp(varNameFixed,_T("time")) ==0)
|
||||||
{
|
{
|
||||||
SYSTEMTIME t;
|
SYSTEMTIME t;
|
||||||
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
|
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
|
||||||
|
@ -1179,7 +1208,7 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
/* %DATE% */
|
/* %DATE% */
|
||||||
else if (_tcsicmp(varName,_T("date")) ==0)
|
else if (_tcsicmp(varNameFixed,_T("date")) ==0)
|
||||||
{
|
{
|
||||||
|
|
||||||
if ( !GrowIfNecessary ( GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, NULL, 0), &ret, &retlen ) )
|
if ( !GrowIfNecessary ( GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, NULL, 0), &ret, &retlen ) )
|
||||||
|
@ -1193,7 +1222,7 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* %RANDOM% */
|
/* %RANDOM% */
|
||||||
else if (_tcsicmp(varName,_T("random")) ==0)
|
else if (_tcsicmp(varNameFixed,_T("random")) ==0)
|
||||||
{
|
{
|
||||||
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
|
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1203,13 +1232,13 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* %CMDCMDLINE% */
|
/* %CMDCMDLINE% */
|
||||||
else if (_tcsicmp(varName,_T("cmdcmdline")) ==0)
|
else if (_tcsicmp(varNameFixed,_T("cmdcmdline")) ==0)
|
||||||
{
|
{
|
||||||
return GetCommandLine();
|
return GetCommandLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* %CMDEXTVERSION% */
|
/* %CMDEXTVERSION% */
|
||||||
else if (_tcsicmp(varName,_T("cmdextversion")) ==0)
|
else if (_tcsicmp(varNameFixed,_T("cmdextversion")) ==0)
|
||||||
{
|
{
|
||||||
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
|
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1219,7 +1248,7 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* %ERRORLEVEL% */
|
/* %ERRORLEVEL% */
|
||||||
else if (_tcsicmp(varName,_T("errorlevel")) ==0)
|
else if (_tcsicmp(varNameFixed,_T("errorlevel")) ==0)
|
||||||
{
|
{
|
||||||
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
|
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1227,8 +1256,8 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
GrowIfNecessary(_tcslen(varName) + 3, &ret, &retlen);
|
GrowIfNecessary(_tcslen(varNameFixed) + 3, &ret, &retlen);
|
||||||
_stprintf(ret,_T("%%%s%%"),varName);
|
_stprintf(ret,_T("%%%s%%"),varNameFixed);
|
||||||
return ret; /* not found - return orginal string */
|
return ret; /* not found - return orginal string */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -181,6 +181,18 @@ INT cmd_if (LPTSTR cmd, LPTSTR param)
|
||||||
x_flag ^= X_EXEC;
|
x_flag ^= X_EXEC;
|
||||||
pp += p1len;
|
pp += p1len;
|
||||||
|
|
||||||
|
while (_istspace (*pp)) /* skip spaces */
|
||||||
|
pp++;
|
||||||
|
|
||||||
|
if (*pp == _T('('))
|
||||||
|
{
|
||||||
|
if (bc)
|
||||||
|
{
|
||||||
|
bc->bCmdBlock = TRUE;
|
||||||
|
bc->bExecuteBlock = x_flag & X_EXEC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ( x_flag )
|
if ( x_flag )
|
||||||
{
|
{
|
||||||
x_flag |= X_EMPTY;
|
x_flag |= X_EMPTY;
|
||||||
|
|
Loading…
Reference in a new issue