fix if command to work more like expected. seta_test.cmd gets much further now. fixed some msvc6 warnings while I was in here Modified: trunk/reactos/subsys/system/cmd/if.c _____
Modified: trunk/reactos/subsys/system/cmd/if.c --- trunk/reactos/subsys/system/cmd/if.c 2005-09-19 05:29:17 UTC (rev 17926) +++ trunk/reactos/subsys/system/cmd/if.c 2005-09-19 05:42:01 UTC (rev 17927) @@ -52,9 +52,16 @@
return 0; }
- /* First check if param string begins with word 'not' */ - if (!_tcsnicmp (param, _T("not"), 3) && _istspace (*(param + 3))) + /* First check if param string begins with '!' or 'not' */ + if ( param[0] == _T('!') ) { + x_flag = X_EXEC; /* Remember '!' */ + ++param; /* Step over '!' */ + while (_istspace (*param)) /* And subsequent spaces */ + param++; + } + else if (!_tcsnicmp (param, _T("not"), 3) && _istspace (*(param + 3))) + { x_flag = X_EXEC; /* Remember 'NOT' */ param += 3; /* Step over 'NOT' */ while (_istspace (*param)) /* And subsequent spaces */ @@ -64,14 +71,15 @@ /* Check for 'exist' form */ if (!_tcsnicmp (param, _T("exist"), 5) && _istspace (*(param + 5))) { + UINT i; + BOOL bInside = FALSE; + param += 5; while (_istspace (*param)) param++;
pp = param;
- INT i; - BOOL bInside = FALSE; /* find the whole path to the file */ for(i = 0; i < _tcslen(param); i++) { @@ -155,38 +163,34 @@
x_flag |= X_EMPTY; /* Syntax error if comd empty */ } - else if (NULL == (pp = _tcsstr (param, _T("==")))) - { - /* Check that '==' is present, syntax error if not */ - error_syntax (NULL); - return 1; - } else { - /* Change first '='to space to terminate comparison loop */ - - *pp = _T(' '); /* Need a space to terminate comparison loop */ - pp += 2; /* over '==' */ + BOOL bInQuote = FALSE; + INT p1len; + pp = param; + while ( *pp && ( bInQuote || *pp != _T('=') ) ) + { + if ( *pp == _T('"') ) + bInQuote = !bInQuote; + ++pp; + } + p1len = pp-param; + /* check for "==" */ + if ( *pp++ != _T('=') || *pp++ != _T('=') ) + { + error_syntax ( NULL ); + return 1; + } while (_istspace (*pp)) /* Skip subsequent spaces */ pp++;
- _tcscat (pp, _T(" ")); /* Add one space to ensure comparison ends */ + /* are the two sides equal, and does the second end in the same place? */ + if ( !_tcsncmp(param,pp,p1len) && _tcschr(_T(" ("),pp[p1len]) ) + x_flag ^= X_EXEC; + pp += p1len;
- while (*param == *pp) /* Comparison loop */ - { - if (_istspace (*param)) /* Terminates on space */ - break; - - param++, pp++; - } - - if (x_flag ^= (*param != *pp) ? 0 : X_EXEC) - { - while (*pp && !_istspace (*pp)) /* Find first space, */ - pp++; - + if ( x_flag ) x_flag |= X_EMPTY; - } }
if (x_flag & X_EMPTY)