diff options
Diffstat (limited to 'src/engine/shared/console.cpp')
| -rw-r--r-- | src/engine/shared/console.cpp | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/src/engine/shared/console.cpp b/src/engine/shared/console.cpp index b7850bea..a6cf4d0b 100644 --- a/src/engine/shared/console.cpp +++ b/src/engine/shared/console.cpp @@ -1,3 +1,4 @@ +#include <new> #include <base/system.h> #include <engine/shared/protocol.h> #include <engine/storage.h> @@ -172,12 +173,8 @@ void CConsole::Print(const char *pStr) void CConsole::ExecuteLineStroked(int Stroke, const char *pStr) { - CResult Result; + CResult *pResult = new(&m_ExecutionQueue.m_pLast->m_Result) CResult; - char aStrokeStr[2] = {'0', 0}; - if(Stroke) - aStrokeStr[0] = '1'; - while(pStr && *pStr) { const char *pEnd = pStr; @@ -207,37 +204,43 @@ void CConsole::ExecuteLineStroked(int Stroke, const char *pStr) pEnd++; } - if(ParseStart(&Result, pStr, (pEnd-pStr) + 1) != 0) + if(ParseStart(pResult, pStr, (pEnd-pStr) + 1) != 0) return; - CCommand *pCommand = FindCommand(Result.m_pCommand, m_FlagMask); + CCommand *pCommand = FindCommand(pResult->m_pCommand, m_FlagMask); if(pCommand) { int IsStrokeCommand = 0; - if(Result.m_pCommand[0] == '+') + if(pResult->m_pCommand[0] == '+') { // insert the stroke direction token - Result.AddArgument(aStrokeStr); + pResult->AddArgument(m_paStrokeStr[Stroke]); IsStrokeCommand = 1; } if(Stroke || IsStrokeCommand) { - if(ParseArgs(&Result, pCommand->m_pParams)) + if(ParseArgs(pResult, pCommand->m_pParams)) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "Invalid arguments... Usage: %s %s", pCommand->m_pName, pCommand->m_pParams); Print(aBuf); } + else if(m_StoreCommands && pCommand->m_Flags&CFGFLAG_STORE) + { + m_ExecutionQueue.m_pLast->m_pfnCommandCallback = pCommand->m_pfnCallback; + m_ExecutionQueue.m_pLast->m_pCommandUserData = pCommand->m_pUserData; + m_ExecutionQueue.AddEntry(); + } else - pCommand->m_pfnCallback(&Result, pCommand->m_pUserData); + pCommand->m_pfnCallback(pResult, pCommand->m_pUserData); } } else if(Stroke) { char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "No such command: %s.", Result.m_pCommand); + str_format(aBuf, sizeof(aBuf), "No such command: %s.", pResult->m_pCommand); Print(aBuf); } @@ -390,6 +393,10 @@ static void StrVariableCommand(IConsole::IResult *pResult, void *pUserData) CConsole::CConsole(int FlagMask) { m_FlagMask = FlagMask; + m_StoreCommands = true; + m_paStrokeStr[0] = "0"; + m_paStrokeStr[1] = "1"; + m_ExecutionQueue.Reset(); m_pFirstCommand = 0; m_pFirstExec = 0; m_pPrintCallbackUserdata = 0; @@ -483,6 +490,17 @@ void CConsole::Chain(const char *pName, FChainCommandCallback pfnChainFunc, void pCommand->m_pUserData = pChainInfo; } +void CConsole::StoreCommands(bool Store) +{ + if(!Store) + { + for(CExecutionQueue::CQueueEntry *pEntry = m_ExecutionQueue.m_pFirst; pEntry != m_ExecutionQueue.m_pLast; pEntry = pEntry->m_pNext) + pEntry->m_pfnCommandCallback(&pEntry->m_Result, pEntry->m_pCommandUserData); + m_ExecutionQueue.Reset(); + } + m_StoreCommands = Store; +} + IConsole::CCommandInfo *CConsole::GetCommandInfo(const char *pName, int FlagMask) { |