From b64d2146c2aad612f5e95a6813187b754c10eb31 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Fri, 18 Dec 2020 21:23:24 +0100 Subject: [PATCH] Allow the preprocessor to output as xml --- devtools/CMakeLists.txt | 2 +- devtools/Preprocessor.cpp | 42 +++++++++++++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/devtools/CMakeLists.txt b/devtools/CMakeLists.txt index d9abd170..352c5cd1 100644 --- a/devtools/CMakeLists.txt +++ b/devtools/CMakeLists.txt @@ -9,4 +9,4 @@ if(TARGET sfizz::jack AND TARGET Qt5::Widgets) endif() add_executable(sfizz_preprocessor Preprocessor.cpp) -target_link_libraries(sfizz_preprocessor PRIVATE sfizz::parser sfizz::cxxopts) +target_link_libraries(sfizz_preprocessor PRIVATE sfizz::parser sfizz::pugixml sfizz::cxxopts) diff --git a/devtools/Preprocessor.cpp b/devtools/Preprocessor.cpp index 9476d356..b6b96036 100644 --- a/devtools/Preprocessor.cpp +++ b/devtools/Preprocessor.cpp @@ -13,10 +13,18 @@ */ #include "parser/Parser.h" +#include #include #include #include +namespace { + enum Mode { OutputSFZ, OutputXML }; + Mode g_mode = OutputSFZ; + + pugi::xml_document g_xml_doc; +} + class MyParserListener : public sfz::Parser::Listener { public: explicit MyParserListener(sfz::Parser& parser) @@ -27,10 +35,20 @@ public: protected: void onParseFullBlock(const std::string& header, const std::vector& opcodes) override { - std::cout << '\n'; - std::cout << '<' << header << '>' << '\n'; - for (const sfz::Opcode& opc : opcodes) - std::cout << opc.opcode << '=' << opc.value << '\n'; + if (g_mode == OutputSFZ) { + std::cout << '\n'; + std::cout << '<' << header << '>' << '\n'; + for (const sfz::Opcode& opc : opcodes) + std::cout << opc.opcode << '=' << opc.value << '\n'; + } + else if (g_mode == OutputXML) { + pugi::xml_node block_node = g_xml_doc.append_child(header.c_str()); + for (const sfz::Opcode& opc : opcodes) { + pugi::xml_node opcode_node = block_node.append_child("opcode"); + opcode_node.append_attribute("name").set_value(opc.opcode.c_str()); + opcode_node.append_attribute("value").set_value(opc.value.c_str()); + } + } } void onParseError(const sfz::SourceRange& range, const std::string& message) override @@ -58,6 +76,7 @@ int main(int argc, char *argv[]) options.add_options() ("D,define", "Add external definition", cxxopts::value>()) ("i,input", "Input SFZ file", cxxopts::value()) + ("m,mode", "Mode of operation (sfz, xml)", cxxopts::value()) ("h,help", "Print usage"); options.parse_positional({"input"}); @@ -81,6 +100,18 @@ int main(int argc, char *argv[]) return 1; } + if (result.count("mode")) { + const std::string& modeString = result["mode"].as(); + if (modeString == "sfz") + g_mode = OutputSFZ; + else if (modeString == "xml") + g_mode = OutputXML; + else { + std::cerr << "Unknown mode of operation: " << modeString << "\n"; + return 1; + } + } + const fs::path sfzFilePath { result["input"].as() }; sfz::Parser parser; @@ -106,5 +137,8 @@ int main(int argc, char *argv[]) if (parser.getErrorCount() > 0) return 1; + if (g_mode == OutputXML) + g_xml_doc.save(std::cout); + return 0; }