Allow the preprocessor to output as xml
This commit is contained in:
parent
c045f71706
commit
b64d2146c2
2 changed files with 39 additions and 5 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -13,10 +13,18 @@
|
|||
*/
|
||||
|
||||
#include "parser/Parser.h"
|
||||
#include <pugixml.hpp>
|
||||
#include <cxxopts.hpp>
|
||||
#include <absl/strings/string_view.h>
|
||||
#include <iostream>
|
||||
|
||||
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<sfz::Opcode>& 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<std::vector<std::string>>())
|
||||
("i,input", "Input SFZ file", cxxopts::value<std::string>())
|
||||
("m,mode", "Mode of operation (sfz, xml)", cxxopts::value<std::string>())
|
||||
("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<std::string>();
|
||||
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<std::string>() };
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue