/* * 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 ) * 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 ) * 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 */