From 86c87ad6d19574824ce5e6948a6c1653adaab64f Mon Sep 17 00:00:00 2001 From: ThomasH Date: Thu, 15 Sep 2016 21:12:05 +0200 Subject: [PATCH] add argument parsing & help output Former-commit-id: d5e412f2cdd7085d57ab9ad1af12ff040d2db21e --- src/storm-gspn.cpp | 117 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 108 insertions(+), 9 deletions(-) diff --git a/src/storm-gspn.cpp b/src/storm-gspn.cpp index 76b2be886..40802218e 100644 --- a/src/storm-gspn.cpp +++ b/src/storm-gspn.cpp @@ -1,34 +1,133 @@ -#include -#include +#include "src/builder/ExplicitGspnModelBuilder.h" #include "src/exceptions/BaseException.h" #include "src/parser/GspnParser.h" #include "src/storage/gspn/GSPN.h" +#include "src/storage/gspn/GspnBuilder.h" #include "src/utility/macros.h" #include "src/utility/initialize.h" #include +#include +#include +// TODO clean-up includes after doing all other todos + +/*! + * Parses the arguments to storm-gspn + * The read data is stored in the different arguments (e.g., inputFile, formula, ...) + * + * @param argc number of arguments passed to storm-gspn + * @param argv array of arguments + * @param inputFile the input file is stored in this object + * @param formula the formula is stored in this object + * @param outputFile the output file is stored in this object + * @param outputType the output type is stored in this object + * @return false if the help flag is set or the input file is missing + */ +bool parseArguments(const int argc, const char **argv, std::string &inputFile, std::string &formula, + std::string &outputFile, std::string &outputType) { + auto end = argv + argc; + bool result = false; + + for (auto it = argv; it != end; ++it) { + std::string currentArg = *it; + + // parse input file argument + if (currentArg == "--input_file" || currentArg == "-i") { + auto next = it + 1; + if (next != end) { + return -1; + } else { + inputFile = *next; + result = true; + } + break; + } -int main(const int argc, const char** argv) { - if (argc != 3) { - std::cout << "Error: incorrect number of parameters!" << std::endl << std::endl; - std::cout << "Usage:" << std::endl; - std::cout << "storm-gspn " << std::endl; + // parse formula argument + if (currentArg == "--formula" || currentArg == "-f") { + auto next = it + 1; + if (next != end) { + return -1; + } else { + formula = *next; + } + break; + } + + // parse output file argument + if (currentArg == "--output_file" || currentArg == "-o") { + auto next = it + 1; + if (next != end) { + return -1; + } else { + outputFile = *next; + } + break; + } + + // parse output file type argument + if (currentArg == "--output_type" || currentArg == "-ot") { + auto next = it + 1; + if (next != end) { + return -1; + } else { + outputType = *next; + } + break; + } + + // parse help argument + if (currentArg == "--help" || currentArg == "-h") { + return false; + } + } + + return result; +} + +/*! + * Print the manual of storm-gspn + */ +void printHelp() { + std::cout << "storm-gspn -i input_file [-f formula] [-o output_file] [-ot output_type] [-h]" << std::endl; + std::cout << std::endl; + std::cout << "-i, --input_file: file which contains the gspn" << std::endl; + std::cout << "-f, --formula: formula which should be checked on the gspn" << std::endl; + std::cout << "-o, -output_file: file in which the gspn/markov automaton should be stored" << std::endl + << " requires the option -ot to be set" << std::endl; + std::cout << "-ot, --output_type: possible output types are: pnml, pnpro or ma" << std::endl; +} + +int main(const int argc, const char **argv) { + std::string inputFile, formula, outputFile, outputType; + if (!parseArguments(argc, argv, inputFile, formula, outputFile, outputType)) { + printHelp(); return 1; } try { storm::utility::setUp(); - // Parse GSPN from xml + // parse GSPN from file auto parser = storm::parser::GspnParser(); - auto gspn = parser.parse(argv[1]); + auto gspn = parser.parse(inputFile); + + // todo ------[marker] gspn.isValid(); + storm::gspn::GspnBuilder builder2; + builder2.addPlace(2); + // //std::ofstream file; //file.open("/Users/thomas/Desktop/storm.dot"); //gspn.writeDotToStream(file); //file.close(); + std::ofstream file; + file.open("/Users/thomas/Desktop/gspn.pnpro"); + gspn.toPnpro(file); + file.close(); + std::cout << "Parsing complete!" << std::endl;