fixed bugs in shifting (<<, >>, <<=, >>=) eliminated some code duplication while I was in there. Modified: trunk/reactos/subsys/system/cmd/set.c _____
Modified: trunk/reactos/subsys/system/cmd/set.c --- trunk/reactos/subsys/system/cmd/set.c 2005-09-18 16:56:33 UTC (rev 17914) +++ trunk/reactos/subsys/system/cmd/set.c 2005-09-18 17:33:11 UTC (rev 17915) @@ -305,20 +305,20 @@
}
static BOOL -seta_addTerm ( LPCTSTR* p_, INT* result ) +seta_ltorTerm ( LPCTSTR* p_, INT* result, LPCTSTR ops, BOOL (*subTerm)(LPCTSTR*,INT*) ) { LPCTSTR p = *p_; INT lval; - if ( !seta_mulTerm ( &p, &lval ) ) + if ( !subTerm ( &p, &lval ) ) return FALSE; - while ( *p && _tcschr(_T("*/%"),*p) ) + while ( *p && _tcschr(ops,*p) ) { INT rval; TCHAR op = *p;
p = skip_ws ( p+1 );
- if ( !seta_mulTerm ( &p, &rval ) ) + if ( !subTerm ( &p, &rval ) ) return FALSE;
if ( !calc ( &lval, op, rval ) ) @@ -331,29 +331,15 @@ }
static BOOL -seta_logShiftTerm ( LPCTSTR* p_, INT* result ) +seta_addTerm ( LPCTSTR* p_, INT* result ) { - LPCTSTR p = *p_; - INT lval; - if ( !seta_addTerm ( &p, &lval ) ) - return FALSE; - while ( *p && _tcschr(_T("+-"),*p) ) - { - INT rval; - TCHAR op = *p; + return seta_ltorTerm ( p_, result, _T("*/%"), seta_mulTerm ); +}
- p = skip_ws ( p+1 ); - - if ( !seta_addTerm ( &p, &rval ) ) - return FALSE; - - if ( !calc ( &lval, op, rval ) ) - return FALSE; - } - - *result = lval; - *p_ = p; - return TRUE; +static BOOL +seta_logShiftTerm ( LPCTSTR* p_, INT* result ) +{ + return seta_ltorTerm ( p_, result, _T("+-"), seta_addTerm ); }
static BOOL @@ -373,8 +359,18 @@ if ( !seta_logShiftTerm ( &p, &rval ) ) return FALSE;
- if ( !calc ( &lval, op, rval ) ) + switch ( op ) + { + case '<': + lval <<= rval; + break; + case '>': + lval >>= rval; + break; + default: + printf ( "Invalid operand.\n" ); return FALSE; + } }
*result = lval; @@ -385,73 +381,19 @@ static BOOL seta_bitExclOrTerm ( LPCTSTR* p_, INT* result ) { - LPCTSTR p = *p_; - INT lval; - if ( !seta_bitAndTerm ( &p, &lval ) ) - return FALSE; - while ( *p == _T('&') ) - { - INT rval; - - p = skip_ws ( p+1 ); - - if ( !seta_bitAndTerm ( &p, &rval ) ) - return FALSE; - - lval &= rval; - } - - *result = lval; - *p_ = p; - return TRUE; + return seta_ltorTerm ( p_, result, _T("&"), seta_bitAndTerm ); }
static BOOL seta_bitOrTerm ( LPCTSTR* p_, INT* result ) { - LPCTSTR p = *p_; - INT lval; - if ( !seta_bitExclOrTerm ( &p, &lval ) ) - return FALSE; - while ( *p == _T('^') ) - { - INT rval; - - p = skip_ws ( p+1 ); - - if ( !seta_bitExclOrTerm ( &p, &rval ) ) - return FALSE; - - lval ^= rval; - } - - *result = lval; - *p_ = p; - return TRUE; + return seta_ltorTerm ( p_, result, _T("^"), seta_bitExclOrTerm ); }
static BOOL seta_expr ( LPCTSTR* p_, INT* result ) { - LPCTSTR p = *p_; - INT lval; - if ( !seta_bitOrTerm ( &p, &lval ) ) - return FALSE; - while ( *p == _T('|') ) - { - INT rval; - - p = skip_ws ( p+1 ); - - if ( !seta_bitOrTerm ( &p, &rval ) ) - return FALSE; - - lval |= rval; - } - - *result = lval; - *p_ = p; - return TRUE; + return seta_ltorTerm ( p_, result, _T("|"), seta_bitOrTerm ); }
static BOOL @@ -498,10 +440,21 @@
if ( !seta_identval ( ident, &identval ) ) identval = 0; - if ( op == '=' ) + switch ( op ) + { + case '=': identval = exprval; - else if ( !calc ( &identval, op, exprval ) ) - return FALSE; + break; + case '<': + identval <<= exprval; + break; + case '>': + identval >>= exprval; + break; + default: + if ( !calc ( &identval, op, exprval ) ) + return FALSE; + } buf = (LPTSTR)alloca ( 32 * sizeof(TCHAR) ); _sntprintf ( buf, 32, _T("%i"), identval ); SetEnvironmentVariable ( ident, buf ); // TODO FIXME - check return value