diff options
author | oy <tom_adams@web.de> | 2021-12-10 14:08:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-10 14:08:01 +0100 |
commit | b7176fbca2c8a74cb708b552b73c1db873a75175 (patch) | |
tree | 1324450c45edbbdd361ee7a26e2a3660253f042a | |
parent | 7e4dc25328e4f6fe6f938397c215b29d12beaf3a (diff) | |
parent | 579b85f74248ca5e2447806e4fbdca0069143e0a (diff) |
Merge pull request #2933 from Robyt3/issue2932
Check for chain with eval_if command, check arbitrary chain length
-rw-r--r-- | src/engine/shared/console.cpp | 61 | ||||
-rw-r--r-- | src/engine/shared/console.h | 2 |
2 files changed, 36 insertions, 27 deletions
diff --git a/src/engine/shared/console.cpp b/src/engine/shared/console.cpp index 80f6176de..369087d6d 100644 --- a/src/engine/shared/console.cpp +++ b/src/engine/shared/console.cpp @@ -683,9 +683,19 @@ static void StrVariableCommand(IConsole::IResult *pResult, void *pUserData) } } +void CConsole::TraverseChain(FCommandCallback *ppfnCallback, void **ppUserData) +{ + while(*ppfnCallback == Con_Chain) + { + CChain *pChainInfo = static_cast<CChain *>(*ppUserData); + *ppfnCallback = pChainInfo->m_pfnCallback; + *ppUserData = pChainInfo->m_pCallbackUserData; + } +} + void CConsole::Con_EvalIf(IResult *pResult, void *pUserData) { - CConsole* pConsole = static_cast<CConsole *>(pUserData); + CConsole *pConsole = static_cast<CConsole *>(pUserData); CCommand *pCommand = pConsole->FindCommand(pResult->GetString(0), pConsole->m_FlagMask); char aBuf[128]; if(!pCommand) @@ -694,16 +704,19 @@ void CConsole::Con_EvalIf(IResult *pResult, void *pUserData) pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf); return; } + FCommandCallback pfnCallback = pCommand->m_pfnCallback; + void *pCallbackUserData = pCommand->m_pUserData; + pConsole->TraverseChain(&pfnCallback, &pCallbackUserData); CResult Result; - pCommand->m_pfnCallback(&Result, pCommand->m_pUserData); + pfnCallback(&Result, pCallbackUserData); bool Condition = false; - if(pCommand->m_pfnCallback == IntVariableCommand) + if(pfnCallback == IntVariableCommand) Condition = Result.m_Value == atoi(pResult->GetString(2)); else Condition = !str_comp_nocase(Result.m_aValue, pResult->GetString(2)); if(!str_comp(pResult->GetString(1), "!=")) Condition = !Condition; - else if(str_comp(pResult->GetString(1), "==") && pCommand->m_pfnCallback == StrVariableCommand) + else if(str_comp(pResult->GetString(1), "==") && pfnCallback == StrVariableCommand) pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", "Error: invalid comperator for type string"); else if(!str_comp(pResult->GetString(1), ">")) Condition = Result.m_Value > atoi(pResult->GetString(2)); @@ -727,22 +740,14 @@ void CConsole::Con_EvalIf(IResult *pResult, void *pUserData) void CConsole::ConToggle(IConsole::IResult *pResult, void *pUser) { - CConsole* pConsole = static_cast<CConsole *>(pUser); + CConsole *pConsole = static_cast<CConsole *>(pUser); char aBuf[128] = {0}; CCommand *pCommand = pConsole->FindCommand(pResult->GetString(0), pConsole->m_FlagMask); if(pCommand) { FCommandCallback pfnCallback = pCommand->m_pfnCallback; void *pUserData = pCommand->m_pUserData; - - // check for chain - if(pCommand->m_pfnCallback == Con_Chain) - { - CChain *pChainInfo = static_cast<CChain *>(pCommand->m_pUserData); - pfnCallback = pChainInfo->m_pfnCallback; - pUserData = pChainInfo->m_pCallbackUserData; - } - + pConsole->TraverseChain(&pfnCallback, &pUserData); if(pfnCallback == IntVariableCommand) { CIntVariableData *pData = static_cast<CIntVariableData *>(pUserData); @@ -757,26 +762,20 @@ void CConsole::ConToggle(IConsole::IResult *pResult, void *pUser) else str_format(aBuf, sizeof(aBuf), "No such command: '%s'.", pResult->GetString(0)); - if(aBuf[0] != 0) + if(aBuf[0]) pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf); } void CConsole::ConToggleStroke(IConsole::IResult *pResult, void *pUser) { - CConsole* pConsole = static_cast<CConsole *>(pUser); + CConsole *pConsole = static_cast<CConsole *>(pUser); char aBuf[128] = {0}; CCommand *pCommand = pConsole->FindCommand(pResult->GetString(1), pConsole->m_FlagMask); if(pCommand) { FCommandCallback pfnCallback = pCommand->m_pfnCallback; - - // check for chain - if(pCommand->m_pfnCallback == Con_Chain) - { - CChain *pChainInfo = static_cast<CChain *>(pCommand->m_pUserData); - pfnCallback = pChainInfo->m_pfnCallback; - } - + void *pUserData = pCommand->m_pUserData; + pConsole->TraverseChain(&pfnCallback, &pUserData); if(pfnCallback == IntVariableCommand) { int Val = pResult->GetInteger(0)==0 ? pResult->GetInteger(3) : pResult->GetInteger(2); @@ -790,7 +789,7 @@ void CConsole::ConToggleStroke(IConsole::IResult *pResult, void *pUser) else str_format(aBuf, sizeof(aBuf), "No such command: '%s'.", pResult->GetString(1)); - if(aBuf[0] != 0) + if(aBuf[0]) pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf); } @@ -834,8 +833,16 @@ CConsole::~CConsole() { CCommand *pNext = pCommand->m_pNext; - if(pCommand->m_pfnCallback == Con_Chain) - mem_free(static_cast<CChain *>(pCommand->m_pUserData)); + FCommandCallback pfnCallback = pCommand->m_pfnCallback; + void *pUserData = pCommand->m_pUserData; + while(pfnCallback == Con_Chain) + { + CChain *pChainInfo = static_cast<CChain *>(pUserData); + pfnCallback = pChainInfo->m_pfnCallback; + pUserData = pChainInfo->m_pCallbackUserData; + mem_free(pChainInfo); + } + mem_free(pCommand); pCommand = pNext; diff --git a/src/engine/shared/console.h b/src/engine/shared/console.h index 3ea9c429b..7976d72ed 100644 --- a/src/engine/shared/console.h +++ b/src/engine/shared/console.h @@ -54,6 +54,8 @@ class CConsole : public IConsole CCommand *m_pRecycleList; CHeap m_TempCommands; + void TraverseChain(FCommandCallback *ppfnCallback, void **ppUserData); + static void Con_Chain(IResult *pResult, void *pUserData); static void Con_Echo(IResult *pResult, void *pUserData); static void Con_Exec(IResult *pResult, void *pUserData); |