handle call :Label
authorChristoph von Wittich <christoph_vw@reactos.org>
Thu, 31 Jan 2008 20:55:05 +0000 (20:55 +0000)
committerChristoph von Wittich <christoph_vw@reactos.org>
Thu, 31 Jan 2008 20:55:05 +0000 (20:55 +0000)
fix goto :Label

svn path=/trunk/; revision=32070

reactos/base/shell/cmd/batch.c
reactos/base/shell/cmd/batch.h
reactos/base/shell/cmd/call.c
reactos/base/shell/cmd/goto.c

index 35f199f..cf8a5cc 100644 (file)
@@ -273,6 +273,8 @@ BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param)
        bc->bEcho = bEcho; /* Preserve echo across batch calls */
        bc->shiftlevel = 0;
        bc->bCmdBlock = -1;
+       bc->lCallPosition = 0;
+       bc->lCallPositionHigh = 0;
        
        bc->ffind = NULL;
        bc->forvar = _T('\0');
index 591f67a..ba162dc 100644 (file)
@@ -24,6 +24,8 @@ typedef struct tagBATCHCONTEXT
        TCHAR forvar;
        INT   bCmdBlock;
        BOOL  bExecuteBlock[MAX_PATH];
+       LONG lCallPosition; /* store position where to return to after Call :Label */
+       LONG lCallPositionHigh;
 } BATCH_CONTEXT, *LPBATCH_CONTEXT;
 
 
index b246b12..397477b 100644 (file)
@@ -53,6 +53,13 @@ INT cmd_call (LPTSTR cmd, LPTSTR param)
                return 0;
        }
 
+       if (*param == _T(':') && (bc))
+       {
+               bc->lCallPosition = SetFilePointer(bc->hBatchFile, 0, &bc->lCallPositionHigh, FILE_CURRENT);
+               cmd_goto(_T("goto"), param);
+               return 0;
+       }
+
     nErrorLevel = 0;
 
        n = (LPBATCH_CONTEXT)cmd_alloc (sizeof (BATCH_CONTEXT));
index 8de630e..c555488 100644 (file)
@@ -40,7 +40,7 @@ INT cmd_goto (LPTSTR cmd, LPTSTR param)
 {
        TCHAR szMsg[RC_STRING_MAX_SIZE];
        LPTSTR tmp;
-       LONG   lNewPosHigh;
+       LONG   lNewPosHigh = 0;
 
 #ifdef _DEBUG
        DebugPrintf (_T("cmd_goto (\'%s\', \'%s\'\n"), cmd, param);
@@ -67,33 +67,40 @@ INT cmd_goto (LPTSTR cmd, LPTSTR param)
 
        /* terminate label at first space char */
        tmp = param+1;
-  while (!_istcntrl (*tmp) && !_istspace (*tmp) &&  (*tmp != _T(':')))
-  tmp++;
+       while (!_istcntrl (*tmp) && !_istspace (*tmp) &&  (*tmp != _T(':')))
+               tmp++;
        *(tmp) = _T('\0');
 
        /* set file pointer to the beginning of the batch file */
        lNewPosHigh = 0;
 
-  /* jump to end of the file */
-  if ( _tcsicmp( param, _T(":eof"))==0)
-  {
-    SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_END);
-    return 0;
-  }
+       /* jump to end of the file */
+       if ( _tcsicmp( param, _T(":eof"))==0)
+       {
+               /* when lCallPosition != 0 we have to return to the caller */
+               if (bc->lCallPosition == 0)
+                       SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_END);
+               else
+               {
+                       SetFilePointer (bc->hBatchFile, (LONG)bc->lCallPosition, &bc->lCallPositionHigh, FILE_BEGIN);
+                       bc->lCallPosition = 0;
+                       bc->lCallPositionHigh = 0;
+               }
+               return 0;
+       }
 
-  /* jump to begin of the file */
-  SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_BEGIN);
+       /* jump to begin of the file */
+       SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_BEGIN);
 
        while (FileGetString (bc->hBatchFile, textline, sizeof(textline) / sizeof(textline[0])))
        {
-     int pos;
-     int size;
+               int pos;
+               int size;
 
                /* Strip out any trailing spaces or control chars */
                tmp = textline + _tcslen (textline) - 1;
 
-
-    while (_istcntrl (*tmp) || _istspace (*tmp) ||  (*tmp == _T(':')))
+               while (_istcntrl (*tmp) || _istspace (*tmp) ||  (*tmp == _T(':')))
                        tmp--;
                *(tmp + 1) = _T('\0');
 
@@ -101,20 +108,21 @@ INT cmd_goto (LPTSTR cmd, LPTSTR param)
                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++;
-    }
+               
+               /* 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++;
+               }
 
                /* use whole label name */
-               if ((*tmp == _T(':')) && (_tcsicmp (++tmp, param) == 0))
+               if ((*tmp == _T(':')) && ((_tcsicmp (++tmp, param) == 0) || (_tcsicmp (tmp, ++param) == 0)))
                        return 0;
+
        }
 
        LoadString(CMD_ModuleHandle, STRING_GOTO_ERROR2, szMsg, RC_STRING_MAX_SIZE);