summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroy <tom_adams@web.de>2021-12-10 14:08:01 +0100
committerGitHub <noreply@github.com>2021-12-10 14:08:01 +0100
commitb7176fbca2c8a74cb708b552b73c1db873a75175 (patch)
tree1324450c45edbbdd361ee7a26e2a3660253f042a
parent7e4dc25328e4f6fe6f938397c215b29d12beaf3a (diff)
parent579b85f74248ca5e2447806e4fbdca0069143e0a (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.cpp61
-rw-r--r--src/engine/shared/console.h2
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);