summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Sluift/main.cpp')
-rw-r--r--Sluift/main.cpp268
1 files changed, 136 insertions, 132 deletions
diff --git a/Sluift/main.cpp b/Sluift/main.cpp
index 425f7fa..65d6d60 100644
--- a/Sluift/main.cpp
+++ b/Sluift/main.cpp
@@ -1,20 +1,24 @@
/*
- * Copyright (c) 2013-2014 Isode Limited.
+ * Copyright (c) 2013-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
+#include <iostream>
#include <string>
#include <vector>
-#include <lua.hpp>
-#include <Swiften/Base/foreach.h>
-#include <Swiften/Base/Platform.h>
+
+#include <boost/assign/list_of.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+#include <boost/program_options.hpp>
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/variables_map.hpp>
-#include <boost/program_options.hpp>
#include <boost/version.hpp>
-#include <boost/numeric/conversion/cast.hpp>
-#include <boost/assign/list_of.hpp>
+
+#include <lua.hpp>
+
+#include <Swiften/Base/Platform.h>
+
#include <Sluift/globals.h>
#include <Sluift/Console.h>
#include <Sluift/StandardTerminal.h>
@@ -34,155 +38,155 @@ using namespace Swift;
#endif
static const std::string SLUIFT_WELCOME_STRING(
- "== Sluift XMPP Console (" SLUIFT_VERSION_STRING ")\nPress Ctrl-" EXIT_KEY " to exit. Type help() for help.");
+ "== Sluift XMPP Console (" SLUIFT_VERSION_STRING ")\nPress Ctrl-" EXIT_KEY " to exit. Type help() for help.");
static const luaL_Reg defaultLibraries[] = {
- {"", luaopen_base},
- {LUA_LOADLIBNAME, luaopen_package},
- {LUA_TABLIBNAME, luaopen_table},
- {LUA_IOLIBNAME, luaopen_io},
- {LUA_OSLIBNAME, luaopen_os},
- {LUA_STRLIBNAME, luaopen_string},
- {LUA_MATHLIBNAME, luaopen_math},
- {LUA_DBLIBNAME, luaopen_debug},
- {"sluift", luaopen_sluift},
- {NULL, NULL}
+ {"", luaopen_base},
+ {LUA_LOADLIBNAME, luaopen_package},
+ {LUA_TABLIBNAME, luaopen_table},
+ {LUA_IOLIBNAME, luaopen_io},
+ {LUA_OSLIBNAME, luaopen_os},
+ {LUA_STRLIBNAME, luaopen_string},
+ {LUA_MATHLIBNAME, luaopen_math},
+ {LUA_DBLIBNAME, luaopen_debug},
+ {"sluift", luaopen_sluift},
+ {nullptr, nullptr}
};
static void handleInterruptSignal(int) {
- Sluift::globals.interruptRequested = 1;
+ Sluift::globals.interruptRequested = 1;
}
static void checkResult(lua_State* L, int result) {
- if (result && !lua_isnil(L, -1)) {
- const char* errorMessage = lua_tostring(L, -1);
- throw std::runtime_error(errorMessage ? errorMessage : "Unknown error");
- }
+ if (result && !lua_isnil(L, -1)) {
+ const char* errorMessage = lua_tostring(L, -1);
+ throw std::runtime_error(errorMessage ? errorMessage : "Unknown error");
+ }
}
static void initialize(lua_State* L) {
- lua_gc(L, LUA_GCSTOP, 0);
- for (const luaL_Reg* lib = defaultLibraries; lib->func; lib++) {
+ lua_gc(L, LUA_GCSTOP, 0);
+ for (const luaL_Reg* lib = defaultLibraries; lib->func; lib++) {
#if LUA_VERSION_NUM >= 502
- luaL_requiref(L, lib->name, lib->func, 1);
- lua_pop(L, 1);
+ luaL_requiref(L, lib->name, lib->func, 1);
+ lua_pop(L, 1);
#else
- lua_pushcfunction(L, lib->func);
- lua_pushstring(L, lib->name);
- lua_call(L, 1, 0);
+ lua_pushcfunction(L, lib->func);
+ lua_pushstring(L, lib->name);
+ lua_call(L, 1, 0);
#endif
- }
- lua_gc(L, LUA_GCRESTART, 0);
+ }
+ lua_gc(L, LUA_GCRESTART, 0);
}
static void runScript(lua_State* L, const std::string& script, const std::vector<std::string>& scriptArguments) {
- // Create arguments table
- lua_createtable(L, boost::numeric_cast<int>(scriptArguments.size()), 0);
- for (size_t i = 0; i < scriptArguments.size(); ++i) {
- lua_pushstring(L, scriptArguments[i].c_str());
- lua_rawseti(L, -2, boost::numeric_cast<int>(i+1));
- }
- lua_setglobal(L, "arg");
-
- // Load file
- checkResult(L, luaL_loadfile(L, script.c_str()));
- foreach (const std::string& scriptArgument, scriptArguments) {
- lua_pushstring(L, scriptArgument.c_str());
- }
- checkResult(L, Console::call(L, boost::numeric_cast<int>(scriptArguments.size()), false));
+ // Create arguments table
+ lua_createtable(L, boost::numeric_cast<int>(scriptArguments.size()), 0);
+ for (size_t i = 0; i < scriptArguments.size(); ++i) {
+ lua_pushstring(L, scriptArguments[i].c_str());
+ lua_rawseti(L, -2, boost::numeric_cast<int>(i+1));
+ }
+ lua_setglobal(L, "arg");
+
+ // Load file
+ checkResult(L, luaL_loadfile(L, script.c_str()));
+ for (const auto& scriptArgument : scriptArguments) {
+ lua_pushstring(L, scriptArgument.c_str());
+ }
+ checkResult(L, Console::call(L, boost::numeric_cast<int>(scriptArguments.size()), false));
}
int main(int argc, char* argv[]) {
- // Parse program options
- boost::program_options::options_description visibleOptions("Options");
- visibleOptions.add_options()
- ("help,h", "Display this help message")
- ("version,v", "Display version information")
- ("interactive,i", "Enter interactive mode after executing script")
- ;
- boost::program_options::options_description hiddenOptions("Hidden Options");
- hiddenOptions.add_options()
- ("script", boost::program_options::value< std::string >(), "Script to be executed")
- ("script-arguments", boost::program_options::value< std::vector<std::string> >(), "Script arguments")
- ;
- boost::program_options::options_description options("All Options");
- options.add(visibleOptions).add(hiddenOptions);
-
- boost::program_options::positional_options_description positional_options;
- positional_options.add("script", 1).add("script-arguments", -1);
-
- boost::program_options::variables_map arguments;
- try {
- boost::program_options::store(
- boost::program_options::command_line_parser(argc, argv)
- .options(options)
- .positional(positional_options).run(), arguments);
- }
- catch (const boost::program_options::unknown_option& option) {
+ // Parse program options
+ boost::program_options::options_description visibleOptions("Options");
+ visibleOptions.add_options()
+ ("help,h", "Display this help message")
+ ("version,v", "Display version information")
+ ("interactive,i", "Enter interactive mode after executing script")
+ ;
+ boost::program_options::options_description hiddenOptions("Hidden Options");
+ hiddenOptions.add_options()
+ ("script", boost::program_options::value< std::string >(), "Script to be executed")
+ ("script-arguments", boost::program_options::value< std::vector<std::string> >(), "Script arguments")
+ ;
+ boost::program_options::options_description options("All Options");
+ options.add(visibleOptions).add(hiddenOptions);
+
+ boost::program_options::positional_options_description positional_options;
+ positional_options.add("script", 1).add("script-arguments", -1);
+
+ boost::program_options::variables_map arguments;
+ try {
+ boost::program_options::store(
+ boost::program_options::command_line_parser(argc, argv)
+ .options(options)
+ .positional(positional_options).run(), arguments);
+ }
+ catch (const boost::program_options::unknown_option& option) {
#if BOOST_VERSION >= 104200
- std::cout << "Ignoring unknown option " << option.get_option_name() << " but continuing." << std::endl;
+ std::cout << "Ignoring unknown option " << option.get_option_name() << " but continuing." << std::endl;
#else
- std::cout << "Error: " << option.what() << " (continuing)" << std::endl;
+ std::cout << "Error: " << option.what() << " (continuing)" << std::endl;
#endif
- }
- catch (const std::exception& e) {
- std::cout << "Error: " << e.what() << std::endl;
- return -1;
- }
- boost::program_options::notify(arguments);
-
- // Help & version
- if (arguments.count("help")) {
- std::cout << visibleOptions << "\n";
- return 0;
- }
- else if (arguments.count("version")) {
- std::cout << SLUIFT_VERSION_STRING;
- return 0;
- }
-
- lua_State* L = luaL_newstate();
- initialize(L);
- try {
- // Run script
- if (arguments.count("script")) {
- std::vector<std::string> scriptArguments;
- if (arguments.count("script-arguments")) {
- scriptArguments = arguments["script-arguments"].as< std::vector<std::string> >();
- }
- runScript(L, arguments["script"].as<std::string>(), scriptArguments);
- }
-
- // Run console
- if (arguments.count("interactive") || arguments.count("script") == 0) {
- // Set up signal handler
- signal(SIGINT, handleInterruptSignal);
-
- // Import some useful functions into the global namespace
- lua_getglobal(L, "sluift");
- std::vector<std::string> globalImports = boost::assign::list_of
- ("help")("with");
- foreach (const std::string& globalImport, globalImports) {
- lua_getfield(L, -1, globalImport.c_str());
- lua_setglobal(L, globalImport.c_str());
- }
- lua_pop(L, 1);
-
- std::cout << SLUIFT_WELCOME_STRING << std::endl;
+ }
+ catch (const std::exception& e) {
+ std::cout << "Error: " << e.what() << std::endl;
+ return -1;
+ }
+ boost::program_options::notify(arguments);
+
+ // Help & version
+ if (arguments.count("help")) {
+ std::cout << visibleOptions << "\n";
+ return 0;
+ }
+ else if (arguments.count("version")) {
+ std::cout << SLUIFT_VERSION_STRING;
+ return 0;
+ }
+
+ lua_State* L = luaL_newstate();
+ initialize(L);
+ try {
+ // Run script
+ if (arguments.count("script")) {
+ std::vector<std::string> scriptArguments;
+ if (arguments.count("script-arguments")) {
+ scriptArguments = arguments["script-arguments"].as< std::vector<std::string> >();
+ }
+ runScript(L, arguments["script"].as<std::string>(), scriptArguments);
+ }
+
+ // Run console
+ if (arguments.count("interactive") || arguments.count("script") == 0) {
+ // Set up signal handler
+ signal(SIGINT, handleInterruptSignal);
+
+ // Import some useful functions into the global namespace
+ lua_getglobal(L, "sluift");
+ std::vector<std::string> globalImports = boost::assign::list_of
+ ("help")("with");
+ for (const auto& globalImport : globalImports) {
+ lua_getfield(L, -1, globalImport.c_str());
+ lua_setglobal(L, globalImport.c_str());
+ }
+ lua_pop(L, 1);
+
+ std::cout << SLUIFT_WELCOME_STRING << std::endl;
#ifdef HAVE_EDITLINE
- EditlineTerminal& terminal = EditlineTerminal::getInstance();
+ EditlineTerminal& terminal = EditlineTerminal::getInstance();
#else
- StandardTerminal terminal;
+ StandardTerminal terminal;
#endif
- Console console(L, &terminal);
- console.run();
- }
- }
- catch (const std::exception& e) {
- std::cerr << e.what() << std::endl;
- lua_close(L);
- return -1;
- }
- lua_close(L);
- return 0;
+ Console console(L, &terminal);
+ console.run();
+ }
+ }
+ catch (const std::exception& e) {
+ std::cerr << e.what() << std::endl;
+ lua_close(L);
+ return -1;
+ }
+ lua_close(L);
+ return 0;
}