From fedc68aea842c11d45e158394a7eae1b8e7cab1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 12 Jul 2020 21:41:07 +0200 Subject: [PATCH] [CMD] IF: Some functionality is available only when extensions are enabled. This functionality is: case insensitivity comparisons (/I); CMDEXTVERSION and DEFINED unary operators; EQU, NEQ, LSS, LEQ, GTR, GEQ generic string comparators. --- base/shell/cmd/cmd.c | 4 ++-- base/shell/cmd/cmd.h | 23 ++++++++++++++++++----- base/shell/cmd/if.c | 8 ++++---- base/shell/cmd/parser.c | 32 ++++++++++++++++++++++++-------- 4 files changed, 48 insertions(+), 19 deletions(-) diff --git a/base/shell/cmd/cmd.c b/base/shell/cmd/cmd.c index 4bbffa9faf1..3a57c04ef33 100644 --- a/base/shell/cmd/cmd.c +++ b/base/shell/cmd/cmd.c @@ -934,8 +934,8 @@ GetEnvVarOrSpecial(LPCTSTR varName) /* %CMDEXTVERSION% */ else if (_tcsicmp(varName, _T("CMDEXTVERSION")) == 0) { - /* Set version number to 2 */ - _itot(2, ret, 10); + /* Set version number to CMDEXTVERSION */ + _itot(CMDEXTVERSION, ret, 10); return ret; } /* %ERRORLEVEL% */ diff --git a/base/shell/cmd/cmd.h b/base/shell/cmd/cmd.h index d7bce5c139e..c7a9f4db8b8 100644 --- a/base/shell/cmd/cmd.h +++ b/base/shell/cmd/cmd.h @@ -28,6 +28,9 @@ #include "cmdver.h" #include "cmddbg.h" +/* Version of the Command Extensions */ +#define CMDEXTVERSION 2 + #define BREAK_BATCHFILE 1 #define BREAK_OUTOFBATCH 2 /* aka. BREAK_ENDOFBATCHFILES */ #define BREAK_INPUT 3 @@ -232,11 +235,21 @@ INT CommandHistory(LPTSTR param); #endif /* Prototypes for IF.C */ -#define IFFLAG_NEGATE 1 /* NOT */ -#define IFFLAG_IGNORECASE 2 /* /I */ -enum { IF_CMDEXTVERSION, IF_DEFINED, IF_ERRORLEVEL, IF_EXIST, - IF_STRINGEQ, /* == */ - IF_EQU, IF_GTR, IF_GEQ, IF_LSS, IF_LEQ, IF_NEQ }; +#define IFFLAG_NEGATE 1 /* NOT */ +#define IFFLAG_IGNORECASE 2 /* /I - Extended */ +enum { + /** Unary operators **/ + /* Standard */ + IF_ERRORLEVEL, IF_EXIST, + /* Extended */ + IF_CMDEXTVERSION, IF_DEFINED, + + /** Binary operators **/ + /* Standard */ + IF_STRINGEQ, /* == */ + /* Extended */ + IF_EQU, IF_NEQ, IF_LSS, IF_LEQ, IF_GTR, IF_GEQ +}; INT ExecuteIf(struct _PARSED_COMMAND *Cmd); /* Prototypes for INTERNAL.C */ diff --git a/base/shell/cmd/if.c b/base/shell/cmd/if.c index c7882ad2fec..e74298ad612 100644 --- a/base/shell/cmd/if.c +++ b/base/shell/cmd/if.c @@ -82,7 +82,7 @@ INT ExecuteIf(PARSED_COMMAND *Cmd) return 1; } - if (Cmd->If.Operator == IF_CMDEXTVERSION) + if (bEnableExtensions && (Cmd->If.Operator == IF_CMDEXTVERSION)) { /* IF CMDEXTVERSION n: check if Command Extensions version * is greater or equal to n */ @@ -93,9 +93,9 @@ INT ExecuteIf(PARSED_COMMAND *Cmd) cmd_free(Right); return 1; } - result = (2 >= n); + result = (CMDEXTVERSION >= n); } - else if (Cmd->If.Operator == IF_DEFINED) + else if (bEnableExtensions && (Cmd->If.Operator == IF_DEFINED)) { /* IF DEFINED var: check if environment variable exists */ result = (GetEnvVarOrSpecial(Right) != NULL); @@ -167,7 +167,7 @@ INT ExecuteIf(PARSED_COMMAND *Cmd) /* IF str1 == str2 */ result = (StringCmp(Left, Right) == 0); } - else + else if (bEnableExtensions) { result = GenericCmp(StringCmp, Left, Right); switch (Cmd->If.Operator) diff --git a/base/shell/cmd/parser.c b/base/shell/cmd/parser.c index 20310c77830..21bfd2504a9 100644 --- a/base/shell/cmd/parser.c +++ b/base/shell/cmd/parser.c @@ -24,19 +24,26 @@ static const TCHAR RedirString[][3] = { _T("<"), _T(">"), _T(">>") }; static const TCHAR *const IfOperatorString[] = { - _T("cmdextversion"), - _T("defined"), + /* Standard */ _T("errorlevel"), _T("exist"), -#define IF_MAX_UNARY IF_EXIST + + /* Extended */ + _T("cmdextversion"), + _T("defined"), +#define IF_MAX_UNARY IF_DEFINED + + /* Standard */ _T("=="), + + /* Extended */ _T("equ"), - _T("gtr"), - _T("geq"), + _T("neq"), _T("lss"), _T("leq"), - _T("neq"), -#define IF_MAX_COMPARISON IF_NEQ + _T("gtr"), + _T("geq"), +#define IF_MAX_COMPARISON IF_GEQ }; static BOOL IsSeparator(TCHAR Char) @@ -389,7 +396,7 @@ static PARSED_COMMAND *ParseIf(void) memset(Cmd, 0, sizeof(PARSED_COMMAND)); Cmd->Type = C_IF; - if (_tcsicmp(CurrentToken, _T("/I")) == 0) + if (bEnableExtensions && (_tcsicmp(CurrentToken, _T("/I")) == 0)) { Cmd->If.Flags |= IFFLAG_IGNORECASE; ParseToken(0, STANDARD_SEPS); @@ -406,6 +413,10 @@ static PARSED_COMMAND *ParseIf(void) /* Check for unary operators */ for (; Cmd->If.Operator <= IF_MAX_UNARY; Cmd->If.Operator++) { + /* Skip the extended operators if the extensions are disabled */ + if (!bEnableExtensions && (Cmd->If.Operator >= IF_CMDEXTVERSION)) + continue; + if (_tcsicmp(CurrentToken, IfOperatorString[Cmd->If.Operator]) == 0) { if (ParseToken(0, STANDARD_SEPS) != TOK_NORMAL) @@ -427,8 +438,13 @@ static PARSED_COMMAND *ParseIf(void) goto condition_done; } + // Cmd->If.Operator == IF_MAX_UNARY + 1; for (; Cmd->If.Operator <= IF_MAX_COMPARISON; Cmd->If.Operator++) { + /* Skip the extended operators if the extensions are disabled */ + if (!bEnableExtensions && (Cmd->If.Operator >= IF_EQU)) // (Cmd->If.Operator > IF_STRINGEQ) + continue; + if (_tcsicmp(CurrentToken, IfOperatorString[Cmd->If.Operator]) == 0) { if (ParseToken(0, STANDARD_SEPS) != TOK_NORMAL)