diff options
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/src/uscxml/InterpreterOptions.cpp | 187 | ||||
-rw-r--r-- | contrib/src/uscxml/InterpreterOptions.h | 81 |
2 files changed, 268 insertions, 0 deletions
diff --git a/contrib/src/uscxml/InterpreterOptions.cpp b/contrib/src/uscxml/InterpreterOptions.cpp new file mode 100644 index 0000000..d3d50be --- /dev/null +++ b/contrib/src/uscxml/InterpreterOptions.cpp @@ -0,0 +1,187 @@ +/** + * @file + * @author 2016 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) + * @copyright Simplified BSD + * + * @cond + * This program is free software: you can redistribute it and/or modify + * it under the terms of the FreeBSD license as published by the FreeBSD + * project. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the FreeBSD license along with this + * program. If not, see <http://www.opensource.org/licenses/bsd-license>. + * @endcond + */ + +#include "uscxml/InterpreterOptions.h" +#include "uscxml/util/String.h" +#include "uscxml/util/Convenience.h" +#include "getopt.h" + +#include <boost/algorithm/string.hpp> + +#include <stdlib.h> + +namespace uscxml { + +void InterpreterOptions::printUsageAndExit(const char* progName) { + + // remove path from program name + std::string progStr(progName); + if (progStr.find_last_of(PATH_SEPERATOR) != std::string::npos) { + progStr = progStr.substr(progStr.find_last_of(PATH_SEPERATOR) + 1, progStr.length() - (progStr.find_last_of(PATH_SEPERATOR) + 1)); + } + + printf("%s version " USCXML_VERSION " (" CMAKE_BUILD_TYPE " build - " CMAKE_COMPILER_STRING ")\n", progStr.c_str()); + printf("Usage\n"); + printf("\t%s", progStr.c_str()); + printf(" [-v] [-d] [-lN]"); +#ifdef BUILD_AS_PLUGINS + printf(" [-p pluginPath]"); +#endif + printf(" [-tN]"); +#ifdef EVENT_SSL_FOUND + printf(" [-sN] [--certificate=FILE | --private-key=FILE --public-key=FILE] "); +#endif + printf(" \\\n\t\t URL1 [--disable-http] [--option1=value1 --option2=value2]"); + printf(" \\\n\t\t[URL2 [--disable-http] [--option3=value3 --option4=value4]]"); + printf(" \\\n\t\t[URLN [--disable-http] [--optionN=valueN --optionM=valueM]]"); + printf("\n"); + printf("Options\n"); +#ifdef BUILD_AS_PLUGINS + printf("\t-p : path to the uSCXML plugins (or export USCXML_PLUGIN_PATH)\n"); +#endif + printf("\t-v : be verbose\n"); + printf("\t-c : perform some sanity checks on the state-chart\n"); + printf("\t-lN : set loglevel to N\n"); + printf("\t-tN : port for HTTP server\n"); + printf("\t-sN : port for HTTPS server\n"); + printf("\t-wN : port for WebSocket server\n"); + printf("\t-d : start with debugger attachable\n"); + printf("\n"); + exit(1); +} + +InterpreterOptions InterpreterOptions::fromCmdLine(int argc, char** argv) { + InterpreterOptions options; + optind = 0; + struct option longOptions[] = { + {"check", no_argument, 0, 'c'}, + {"verbose", no_argument, 0, 'v'}, + {"debug", no_argument, 0, 'd'}, + {"port", required_argument, 0, 't'}, + {"ssl-port", required_argument, 0, 's'}, + {"ws-port", required_argument, 0, 'w'}, + {"certificate", required_argument, 0, 0}, + {"private-key", required_argument, 0, 0}, + {"public-key", required_argument, 0, 0}, + {"plugin-path", required_argument, 0, 'p'}, + {"loglevel", required_argument, 0, 'l'}, + {0, 0, 0, 0} + }; + + opterr = 0; + InterpreterOptions* currOptions = &options; + + // parse global options + int optionInd = 0; + int option; + for (;;) { + option = getopt_long_only(argc, argv, "+vcdt:s:w:p:l:", longOptions, &optionInd); + if (option == -1) { + if (optind == argc) + // we are done with parsing + goto DONE_PARSING_CMD; + + std::string url = argv[optind]; + + options.interpreters.push_back(std::make_pair(url, new InterpreterOptions())); + currOptions = options.interpreters.back().second; + + argc -= optind; + argv += optind; + optind = 0; + + if (argc <= 1) + goto DONE_PARSING_CMD; + + } + switch(option) { + // cases without short option + case 0: { + if (iequals(longOptions[optionInd].name, "disable-http")) { + currOptions->withHTTP = false; + } else if (iequals(longOptions[optionInd].name, "private-key")) { + currOptions->privateKey = optarg; + } else if (iequals(longOptions[optionInd].name, "certificate")) { + currOptions->certificate = optarg; + } else if (iequals(longOptions[optionInd].name, "public-key")) { + currOptions->publicKey = optarg; + } + break; + } + // cases with short-hand options + case 'l': + currOptions->logLevel = strTo<unsigned int>(optarg); + break; + case 'p': + currOptions->pluginPath = optarg; + break; + case 'c': + currOptions->validate = true; + break; + case 'd': + currOptions->withDebugger = true; + break; + case 't': + currOptions->httpPort = strTo<unsigned short>(optarg); + break; + case 's': + currOptions->httpsPort = strTo<unsigned short>(optarg); + break; + case 'w': + currOptions->wsPort = strTo<unsigned short>(optarg); + break; + case 'v': + currOptions->verbose = true; + break; + case '?': { + std::string param = argv[optind - 1]; + if (boost::starts_with(param, "--")) { + param = param.substr(2, param.length() - 2); + } else if (boost::starts_with(param, "-")) { + param = param.substr(1, param.length() - 1); + } else { + break; + } + boost::trim(param); + + size_t equalPos = param.find("="); + if (equalPos != std::string::npos) { + std::string key = param.substr(0, equalPos); + std::string value = param.substr(equalPos + 1, param.length() - (equalPos + 1)); + currOptions->additionalParameters[key] = value; + } else { + currOptions->additionalParameters[param] = ""; + } + break; + } + default: + break; + } + } + +DONE_PARSING_CMD: + + if (options.interpreters.size() == 0 && !options.withDebugger) + options.error = "No SCXML document to evaluate"; + + return options; +} + + +} diff --git a/contrib/src/uscxml/InterpreterOptions.h b/contrib/src/uscxml/InterpreterOptions.h new file mode 100644 index 0000000..44bb399 --- /dev/null +++ b/contrib/src/uscxml/InterpreterOptions.h @@ -0,0 +1,81 @@ +/** + * @file + * @author 2016 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) + * @copyright Simplified BSD + * + * @cond + * This program is free software: you can redistribute it and/or modify + * it under the terms of the FreeBSD license as published by the FreeBSD + * project. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the FreeBSD license along with this + * program. If not, see <http://www.opensource.org/licenses/bsd-license>. + * @endcond + */ + +#ifndef INTERPRETEROPTIONS_H_9D94370D +#define INTERPRETEROPTIONS_H_9D94370D + +#include "uscxml/config.h" +#include "uscxml/Common.h" + +#include <string> +#include <map> +#include <vector> + +namespace uscxml { + +/** + * @ingroup interpreter + * Options to pass into an interpreter. + */ +class USCXML_API InterpreterOptions { +public: + InterpreterOptions() : + verbose(false), + validate(false), + withHTTP(true), + withHTTPS(true), + withWS(true), + withDebugger(true), + logLevel(0), + httpPort(5080), + httpsPort(5443), + wsPort(5081) { + } + + bool verbose; + bool validate; + bool withHTTP; + bool withHTTPS; + bool withWS; + bool withDebugger; + int logLevel; + unsigned short httpPort; + unsigned short httpsPort; + unsigned short wsPort; + std::string pluginPath; + std::string certificate; + std::string privateKey; + std::string publicKey; + std::vector<std::pair<std::string, InterpreterOptions*> > interpreters; + std::map<std::string, std::string> additionalParameters; + + std::string error; + + operator bool() { + return error.length() == 0; + } + + static void printUsageAndExit(const char* progName); + static InterpreterOptions fromCmdLine(int argc, char** argv); + +}; + +} + +#endif /* end of include guard: INTERPRETEROPTIONS_H_9D94370D */ |