From 19fc5d65b6cd66be3d52963b3595bf20701076bb Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Fri, 29 May 2020 02:18:53 +0200 Subject: [PATCH] Add option handling, and external definitions --- devtools/Preprocessor.cpp | 49 +++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/devtools/Preprocessor.cpp b/devtools/Preprocessor.cpp index c1a81748..f9dbfba6 100644 --- a/devtools/Preprocessor.cpp +++ b/devtools/Preprocessor.cpp @@ -13,6 +13,8 @@ */ #include "parser/Parser.h" +#include "../tests/cxxopts.hpp" +#include "absl/strings/string_view.h" #include class MyParserListener : public sfz::Parser::Listener { @@ -49,18 +51,57 @@ private: int main(int argc, char *argv[]) { - if (argc != 2) { + cxxopts::Options options("sfizz_preprocess", "Preprocess SFZ files"); + + options.positional_help(""); + + options.add_options() + ("D,define", "Add external definition", cxxopts::value>()) + ("i,input", "Input SFZ file", cxxopts::value()) + ("h,help", "Print usage"); + + options.parse_positional({"input"}); + + std::unique_ptr resultPtr; + try { + resultPtr = absl::make_unique(options.parse(argc, argv)); + } catch (cxxopts::OptionException& ex) { + std::cerr << ex.what() << "\n"; + return 1; + } + cxxopts::ParseResult& result = *resultPtr; + + if (result.count("help")) { + std::cerr << options.help() << "\n"; + return 0; + } + + if (!result.count("input")) { std::cerr << "Please indicate the SFZ file path.\n"; return 1; } - const fs::path sfzFilePath { argv[1] }; + const fs::path sfzFilePath { result["input"].as() }; sfz::Parser parser; MyParserListener listener(parser); - parser.setListener(&listener); - parser.parseFile(argv[1]); + + if (result.count("define")) { + auto& definitions = result["define"].as>(); + for (absl::string_view definition : definitions) { + size_t pos = definition.find('='); + if (pos == definition.npos) { + std::cerr << "The definition is malformed, should be key=value.\n"; + return 1; + } + absl::string_view key = definition.substr(0, pos); + absl::string_view val = definition.substr(pos + 1); + parser.addExternalDefinition(key, val); + } + } + + parser.parseFile(sfzFilePath); if (parser.getErrorCount() > 0) return 1;