From 5b0806f1cb3d6fc84df731551db77025a5bacc32 Mon Sep 17 00:00:00 2001 From: Mark Tiefenbruck Date: Fri, 11 Jan 2008 02:46:06 -0800 Subject: forgot to add this --- src/FbTk/CommandParser.hh | 128 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 src/FbTk/CommandParser.hh diff --git a/src/FbTk/CommandParser.hh b/src/FbTk/CommandParser.hh new file mode 100644 index 0000000..89cac7d --- /dev/null +++ b/src/FbTk/CommandParser.hh @@ -0,0 +1,128 @@ +// CommandParser.hh for FbTk +// Copyright (c) 2007 Fluxbox Team (fluxgen at fluxbox dot org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef CommandParser_HH +#define CommandParser_HH + +#include "ObjectRegistry.hh" +#include "StringUtil.hh" + +using std::string; + +namespace FbTk { + +// helper for registering a function to parse arguments +#define REGISTER_COMMAND_PARSER(name, parser, type) \ + namespace { \ + static const bool p_register_command_##type_##name = FbTk::CommandParser::instance().registerCommand(#name, parser); \ + } + +// include some basic Command creators +template +Command *CommandCreator(const string &name, const string &args, + bool trusted) { + return new ClassName(); +} + +#define REGISTER_COMMAND(name, classname, type) \ + namespace { \ + static const bool p_register_##type_##name = FbTk::CommandParser::instance().registerCommand(#name, FbTk::CommandCreator); \ + } + +template +Command *CommandCreatorWithArgs(const string &name, const string &args, + bool trusted) { + return new ClassName(args); +} + +#define REGISTER_COMMAND_WITH_ARGS(name, classname, type) \ + namespace { \ + static const bool p_register_##type_##name = FbTk::CommandParser::instance().registerCommand(#name, FbTk::CommandCreatorWithArgs); \ + } + +template +Command *UntrustedCommandCreator(const string &name, const string &args, + bool trusted) { + if (!trusted) return 0; + return new ClassName(); +} + +#define REGISTER_UNTRUSTED_COMMAND(name, classname, type) \ + namespace { \ + static const bool p_register_##type_##name = FbTk::CommandParser::instance().registerCommand(#name, FbTk::UntrustedCommandCreator); \ + } + +template +Command *UntrustedCommandCreatorWithArgs(const string &name, + const string &args, bool trusted) { + if (!trusted) return 0; + return new ClassName(args); +} + +#define REGISTER_UNTRUSTED_COMMAND_WITH_ARGS(name, classname, type) \ + namespace { \ + static const bool p_register_##type_##name = FbTk::CommandParser::instance().registerCommand(#name, FbTk::UntrustedCommandCreatorWithArgs); \ + } + +template +class CommandParser { +public: + typedef Command *Creator(const string &, const string &, bool); + + static CommandParser &instance() { + static CommandParser s_instance; + return s_instance; + } + + Command *parse(const string &name, const string &args, + bool trusted = true) const { + string lc = StringUtil::toLower(name); + Creator *creator = ObjectRegistry::instance().lookup(lc); + if (creator) + return creator(lc, args, trusted); + return 0; + } + + Command *parse(const string &line, bool trusted = true) const { + // separate args and command + string command, args; + StringUtil::getFirstWord(line, command, args); + StringUtil::removeFirstWhitespace(args); + StringUtil::removeTrailingWhitespace(args); + + // now we parse + return parse(command, args, trusted); + } + + bool registerCommand(string name, Creator creator) { + name = StringUtil::toLower(name); + return ObjectRegistry::instance().registerObject(name, + creator); + } + +private: + CommandParser() {} + ~CommandParser() {} +}; + +} // end namespace FbTk + +#endif // COMMANDPARSER_HH -- cgit v0.11.2