mirror of
https://github.com/reactos/reactos.git
synced 2024-06-30 01:42:30 +00:00
![Hermès Bélusca-Maïto](/assets/img/avatar_default.png)
- The ':EOF' label feature is available only when extensions are enabled. - Anything that follows the ':EOF' label, separated by at least one whitespace character, is ignored, and the batch file terminates.
141 lines
3.4 KiB
C
141 lines
3.4 KiB
C
/*
|
|
* GOTO.C - goto internal batch command.
|
|
*
|
|
* History:
|
|
*
|
|
* 16 Jul 1998 (Hans B Pufal)
|
|
* started.
|
|
*
|
|
* 16 Jul 1998 (John P Price)
|
|
* Separated commands into individual files.
|
|
*
|
|
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
|
|
* added config.h include
|
|
*
|
|
* 28 Jul 1998 (Hans B Pufal) [HBP_003]
|
|
* Terminate label on first space character, use only first 8 chars of
|
|
* label string
|
|
*
|
|
* 24-Jan-1999 (Eric Kohl)
|
|
* Unicode and redirection safe!
|
|
*
|
|
* 27-Jan-1999 (Eric Kohl)
|
|
* Added help text ("/?").
|
|
*
|
|
* 28-Apr-2005 (Magnus Olsen <magnus@greatlord.com>)
|
|
* Remove all hardcoded strings in En.rc
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
/*
|
|
* Perform GOTO command.
|
|
*
|
|
* Only valid when a batch context is active.
|
|
*/
|
|
INT cmd_goto(LPTSTR param)
|
|
{
|
|
LPTSTR tmp, tmp2;
|
|
DWORD dwCurrPos;
|
|
BOOL bRetry;
|
|
|
|
TRACE("cmd_goto(\'%s\')\n", debugstr_aw(param));
|
|
|
|
if (!_tcsncmp(param, _T("/?"), 2))
|
|
{
|
|
ConOutResPaging(TRUE, STRING_GOTO_HELP1);
|
|
return 0;
|
|
}
|
|
|
|
/* If not in batch, fail */
|
|
if (bc == NULL)
|
|
return 1;
|
|
|
|
/* Fail if no label has been provided */
|
|
if (*param == _T('\0'))
|
|
{
|
|
ConErrResPrintf(STRING_GOTO_ERROR1);
|
|
ExitBatch();
|
|
return 1;
|
|
}
|
|
|
|
/* Terminate label at first space char */
|
|
tmp = param + 1;
|
|
while (!_istcntrl(*tmp) && !_istspace(*tmp) && (*tmp != _T(':')))
|
|
++tmp;
|
|
*tmp = _T('\0');
|
|
|
|
/* Support jumping to the end of the file, only if extensions are enabled */
|
|
if (bEnableExtensions &&
|
|
(_tcsnicmp(param, _T(":EOF"), 4) == 0) &&
|
|
(!param[4] || _istspace(param[4])))
|
|
{
|
|
/* Position at the end of the batch file */
|
|
bc->mempos = bc->memsize;
|
|
|
|
/* Do not process any more parts of a compound command */
|
|
bc->current = NULL;
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Search the next label starting our position, until the end of the file.
|
|
* If none has been found, restart at the beginning of the file, and continue
|
|
* until reaching back our old current position.
|
|
*/
|
|
bRetry = FALSE;
|
|
dwCurrPos = bc->mempos;
|
|
|
|
retry:
|
|
while (BatchGetString(textline, ARRAYSIZE(textline)))
|
|
{
|
|
INT pos;
|
|
INT_PTR size;
|
|
|
|
if (bRetry && (bc->mempos >= dwCurrPos))
|
|
break;
|
|
|
|
/* Strip out any trailing spaces or control chars */
|
|
tmp = textline + _tcslen(textline) - 1;
|
|
while (tmp > textline && (_istcntrl(*tmp) || _istspace(*tmp) || (*tmp == _T(':'))))
|
|
--tmp;
|
|
*(tmp + 1) = _T('\0');
|
|
|
|
/* Then leading spaces... */
|
|
tmp = textline;
|
|
while (_istspace(*tmp))
|
|
++tmp;
|
|
|
|
/* All space after leading space terminate the string */
|
|
size = _tcslen(tmp) - 1;
|
|
pos = 0;
|
|
while (tmp + pos < tmp + size)
|
|
{
|
|
if (_istspace(tmp[pos]))
|
|
tmp[pos]=_T('\0');
|
|
++pos;
|
|
}
|
|
|
|
tmp2 = param;
|
|
/* Use whole label name */
|
|
if ((*tmp == _T(':')) && ((_tcsicmp(++tmp, param) == 0) || (_tcsicmp(tmp, ++tmp2) == 0)))
|
|
{
|
|
/* Do not process any more parts of a compound command */
|
|
bc->current = NULL;
|
|
return 0;
|
|
}
|
|
}
|
|
if (!bRetry && (bc->mempos >= bc->memsize))
|
|
{
|
|
bRetry = TRUE;
|
|
bc->mempos = 0;
|
|
goto retry;
|
|
}
|
|
|
|
ConErrResPrintf(STRING_GOTO_ERROR2, param);
|
|
ExitBatch();
|
|
return 1;
|
|
}
|
|
|
|
/* EOF */
|