From 8561b4c859f9bd268384b79004641a920f7cbd42 Mon Sep 17 00:00:00 2001 From: Robert Müller Date: Mon, 16 Aug 2021 21:41:25 +0200 Subject: check for chain with eval_if command, check arbitrary chain length --- src/engine/shared/console.cpp | 49 +++++++++++++++++++++---------------------- src/engine/shared/console.h | 2 ++ 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/engine/shared/console.cpp b/src/engine/shared/console.cpp index 80f6176de..5d456120e 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(*ppUserData); + *ppfnCallback = pChainInfo->m_pfnCallback; + *ppUserData = pChainInfo->m_pCallbackUserData; + } +} + void CConsole::Con_EvalIf(IResult *pResult, void *pUserData) { - CConsole* pConsole = static_cast(pUserData); + CConsole *pConsole = static_cast(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(pUser); + CConsole *pConsole = static_cast(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(pCommand->m_pUserData); - pfnCallback = pChainInfo->m_pfnCallback; - pUserData = pChainInfo->m_pCallbackUserData; - } - + pConsole->TraverseChain(&pfnCallback, &pUserData); if(pfnCallback == IntVariableCommand) { CIntVariableData *pData = static_cast(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(pUser); + CConsole *pConsole = static_cast(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(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); } 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); -- cgit v1.2.3 From 579b85f74248ca5e2447806e4fbdca0069143e0a Mon Sep 17 00:00:00 2001 From: Robert Müller Date: Mon, 16 Aug 2021 21:56:46 +0200 Subject: fix only first command chain data being freed --- src/engine/shared/console.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/engine/shared/console.cpp b/src/engine/shared/console.cpp index 5d456120e..369087d6d 100644 --- a/src/engine/shared/console.cpp +++ b/src/engine/shared/console.cpp @@ -833,8 +833,16 @@ CConsole::~CConsole() { CCommand *pNext = pCommand->m_pNext; - if(pCommand->m_pfnCallback == Con_Chain) - mem_free(static_cast(pCommand->m_pUserData)); + FCommandCallback pfnCallback = pCommand->m_pfnCallback; + void *pUserData = pCommand->m_pUserData; + while(pfnCallback == Con_Chain) + { + CChain *pChainInfo = static_cast(pUserData); + pfnCallback = pChainInfo->m_pfnCallback; + pUserData = pChainInfo->m_pCallbackUserData; + mem_free(pChainInfo); + } + mem_free(pCommand); pCommand = pNext; -- cgit v1.2.3