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:
Christoph von Wittich 2008-01-20 14:29:18 +00:00
parent 95ed37888e
commit 67ed022d72
4 changed files with 68 additions and 12 deletions

View file

@ -272,6 +272,7 @@ BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param)
SetFilePointer (bc->hBatchFile, 0, NULL, FILE_BEGIN);
bc->bEcho = bEcho; /* Preserve echo across batch calls */
bc->shiftlevel = 0;
bc->bCmdBlock = FALSE;
bc->ffind = NULL;
bc->forvar = _T('\0');
@ -453,6 +454,18 @@ LPTSTR ReadBatchLine (LPBOOL bLocalEcho)
*++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 */
if (*first == _T(':') || *first == 0)
continue;

View file

@ -23,6 +23,8 @@ typedef struct tagBATCHCONTEXT
TCHAR Out[MAX_PATH];
TCHAR Err[MAX_PATH];
TCHAR forvar;
BOOL bCmdBlock;
BOOL bExecuteBlock;
} BATCH_CONTEXT, *LPBATCH_CONTEXT;

View file

@ -1140,20 +1140,49 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
static LPTSTR ret = NULL;
static UINT retlen = 0;
UINT size;
TCHAR varNameFixed[MAX_PATH];
TCHAR ReturnValue[MAX_PATH];
LPTSTR position;
LPTSTR Token;
SIZE_T i = 0;
INT StringPart[1] = {0};
position = _tcsstr(varName, _T(":~"));
if (position)
_tcsncpy(varNameFixed, varName, (int) (position - varName));
else
_tcscpy(varNameFixed, varName);
size = GetEnvironmentVariable ( varName, ret, retlen );
size = GetEnvironmentVariable ( varNameFixed, ret, retlen );
if ( size > retlen )
{
if ( !GrowIfNecessary ( size, &ret, &retlen ) )
return NULL;
size = GetEnvironmentVariable ( varName, ret, retlen );
size = GetEnvironmentVariable ( varNameFixed, ret, retlen );
}
if ( size )
return ret;
{
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;
}
else
return ret;
}
/* env var doesn't exist, look for a "special" one */
/* %CD% */
if (_tcsicmp(varName,_T("cd")) ==0)
if (_tcsicmp(varNameFixed,_T("cd")) ==0)
{
size = GetCurrentDirectory ( retlen, ret );
if ( size > retlen )
@ -1167,7 +1196,7 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
return ret;
}
/* %TIME% */
else if (_tcsicmp(varName,_T("time")) ==0)
else if (_tcsicmp(varNameFixed,_T("time")) ==0)
{
SYSTEMTIME t;
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
@ -1179,7 +1208,7 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
return ret;
}
/* %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 ) )
@ -1193,7 +1222,7 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
}
/* %RANDOM% */
else if (_tcsicmp(varName,_T("random")) ==0)
else if (_tcsicmp(varNameFixed,_T("random")) ==0)
{
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
return NULL;
@ -1203,13 +1232,13 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
}
/* %CMDCMDLINE% */
else if (_tcsicmp(varName,_T("cmdcmdline")) ==0)
else if (_tcsicmp(varNameFixed,_T("cmdcmdline")) ==0)
{
return GetCommandLine();
}
/* %CMDEXTVERSION% */
else if (_tcsicmp(varName,_T("cmdextversion")) ==0)
else if (_tcsicmp(varNameFixed,_T("cmdextversion")) ==0)
{
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
return NULL;
@ -1219,7 +1248,7 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
}
/* %ERRORLEVEL% */
else if (_tcsicmp(varName,_T("errorlevel")) ==0)
else if (_tcsicmp(varNameFixed,_T("errorlevel")) ==0)
{
if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
return NULL;
@ -1227,8 +1256,8 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
return ret;
}
GrowIfNecessary(_tcslen(varName) + 3, &ret, &retlen);
_stprintf(ret,_T("%%%s%%"),varName);
GrowIfNecessary(_tcslen(varNameFixed) + 3, &ret, &retlen);
_stprintf(ret,_T("%%%s%%"),varNameFixed);
return ret; /* not found - return orginal string */
}

View file

@ -181,6 +181,18 @@ INT cmd_if (LPTSTR cmd, LPTSTR param)
x_flag ^= X_EXEC;
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 )
{
x_flag |= X_EMPTY;