diff options
Diffstat (limited to 'src/cli/apps.h')
-rw-r--r-- | src/cli/apps.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/cli/apps.h b/src/cli/apps.h new file mode 100644 index 000000000..9f1f00ba2 --- /dev/null +++ b/src/cli/apps.h @@ -0,0 +1,77 @@ +/* +* (C) 2014,2015 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include <iostream> +#include <functional> +#include <string> +#include <set> +#include <botan/build.h> +#include <botan/hex.h> +#include <botan/auto_rng.h> +#include "getopt.h" + +using namespace Botan; + +typedef std::function<int (std::vector<std::string>)> app_fn; + +class AppRegistrations + { + public: + void add(const std::string& name, app_fn fn) + { + m_apps[name] = fn; + } + + bool has(const std::string& cmd) const + { + return m_apps.count(cmd) > 0; + } + + std::set<std::string> all_appnames() const + { + std::set<std::string> apps; + for(auto i : m_apps) + apps.insert(i.first); + return apps; + } + + // TODO: Remove redundancy cmd == args[0] + int run(const std::string& cmd, std::vector<std::string> args) const + { + const auto app = m_apps.find(cmd); + if(app != m_apps.end()) + return app->second(args); + return -1; + } + + static AppRegistrations& instance() + { + static AppRegistrations s_apps; + return s_apps; + } + + class AppRegistration + { + public: + AppRegistration(const std::string& name, app_fn fn) + { + AppRegistrations::instance().add(name, fn); + } + }; + + private: + AppRegistrations() {} + + std::map<std::string, app_fn> m_apps; + }; + +#define REGISTER_APP(nm) AppRegistrations::AppRegistration g_ ## nm ## _registration(#nm, nm) + +#if defined(BOTAN_TARGET_OS_IS_WINDOWS) || defined(BOTAN_TARGET_OS_IS_MINGW) + #undef BOTAN_TARGET_OS_HAS_SOCKETS +#else + #define BOTAN_TARGET_OS_HAS_SOCKETS +#endif |