From b3303c3a32b94b61f82e739d8d494752047f11c1 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 1 Feb 2015 10:14:17 +0100 Subject: Added BGFX latest code to 3rdparty (nw) --- 3rdparty/bgfx/examples/common/entry/cmd.cpp | 102 ++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 3rdparty/bgfx/examples/common/entry/cmd.cpp (limited to '3rdparty/bgfx/examples/common/entry/cmd.cpp') diff --git a/3rdparty/bgfx/examples/common/entry/cmd.cpp b/3rdparty/bgfx/examples/common/entry/cmd.cpp new file mode 100644 index 00000000000..6dfcb37d874 --- /dev/null +++ b/3rdparty/bgfx/examples/common/entry/cmd.cpp @@ -0,0 +1,102 @@ +/* + * Copyright 2010-2015 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include // isspace +#include +#include // size_t +#include // strlen +#include +#include + +#include "dbg.h" +#include "cmd.h" + +#include +#include +#include +namespace stl = tinystl; + +struct CmdContext +{ + CmdContext() + { + } + + ~CmdContext() + { + } + + void add(const char* _name, ConsoleFn _fn, void* _userData) + { + uint32_t cmd = bx::hashMurmur2A(_name, (uint32_t)strlen(_name) ); + BX_CHECK(m_lookup.end() == m_lookup.find(cmd), "Command \"%s\" already exist.", _name); + Func fn = { _fn, _userData }; + m_lookup.insert(stl::make_pair(cmd, fn) ); + } + + void exec(const char* _cmd) + { + for (const char* next = _cmd; '\0' != *next; _cmd = next) + { + char commandLine[1024]; + uint32_t size = sizeof(commandLine); + int argc; + char* argv[64]; + next = bx::tokenizeCommandLine(_cmd, commandLine, size, argc, argv, BX_COUNTOF(argv), '\n'); + if (argc > 0) + { + int err = -1; + uint32_t cmd = bx::hashMurmur2A(argv[0], (uint32_t)strlen(argv[0]) ); + CmdLookup::iterator it = m_lookup.find(cmd); + if (it != m_lookup.end() ) + { + Func& fn = it->second; + err = fn.m_fn(this, fn.m_userData, argc, argv); + } + + switch (err) + { + case 0: + break; + + case -1: + { + stl::string tmp(_cmd, next-_cmd - (*next == '\0' ? 0 : 1) ); + DBG("Command '%s' doesn't exist.", tmp.c_str() ); + } + break; + + default: + { + stl::string tmp(_cmd, next-_cmd - (*next == '\0' ? 0 : 1) ); + DBG("Failed '%s' err: %d.", tmp.c_str(), err); + } + break; + } + } + } + } + + struct Func + { + ConsoleFn m_fn; + void* m_userData; + }; + + typedef stl::unordered_map CmdLookup; + CmdLookup m_lookup; +}; + +static CmdContext s_cmdContext; + +void cmdAdd(const char* _name, ConsoleFn _fn, void* _userData) +{ + s_cmdContext.add(_name, _fn, _userData); +} + +void cmdExec(const char* _cmd) +{ + s_cmdContext.exec(_cmd); +} -- cgit v1.2.3-70-g09d2