From bb9d6cf66e8f9f66d6c2b99dcf3483c1c93d4719 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Fri, 15 May 2020 17:10:07 +0200 Subject: [PATCH] Add the preprocessor tool for sfz files --- devtools/CMakeLists.txt | 3 ++ devtools/Preprocessor.cpp | 69 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 devtools/Preprocessor.cpp diff --git a/devtools/CMakeLists.txt b/devtools/CMakeLists.txt index e4250d9c..399bb479 100644 --- a/devtools/CMakeLists.txt +++ b/devtools/CMakeLists.txt @@ -13,3 +13,6 @@ if(JACK_FOUND AND TARGET Qt5::Widgets) target_link_libraries(sfizz_capture_eg PRIVATE sfizz-sndfile Qt5::Widgets ${JACK_LIBRARIES}) set_target_properties(sfizz_capture_eg PROPERTIES AUTOUIC ON) endif() + +add_executable(sfizz_preprocessor Preprocessor.cpp) +target_link_libraries(sfizz_preprocessor sfizz_parser) diff --git a/devtools/Preprocessor.cpp b/devtools/Preprocessor.cpp new file mode 100644 index 00000000..c1a81748 --- /dev/null +++ b/devtools/Preprocessor.cpp @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +/* + This program reads a SFZ file, and outputs it back into a single file + with all the includes and definitions processed. + + It can serve to facilitate identifying problems, whether these are related to + the parser or complicated instrument structures. + */ + +#include "parser/Parser.h" +#include + +class MyParserListener : public sfz::Parser::Listener { +public: + explicit MyParserListener(sfz::Parser& parser) + : _parser(parser) + { + } + +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'; + } + + void onParseError(const sfz::SourceRange& range, const std::string& message) override + { + const auto relativePath = range.start.filePath->lexically_relative(_parser.originalDirectory()); + std::cerr << "Parse error in " << relativePath << " at line " << range.start.lineNumber + 1 << ": " << message << '\n'; + } + + void onParseWarning(const sfz::SourceRange& range, const std::string& message) override + { + const auto relativePath = range.start.filePath->lexically_relative(_parser.originalDirectory()); + std::cerr << "Parse warning in " << relativePath << " at line " << range.start.lineNumber + 1 << ": " << message << '\n'; + } + +private: + sfz::Parser& _parser; +}; + +int main(int argc, char *argv[]) +{ + if (argc != 2) { + std::cerr << "Please indicate the SFZ file path.\n"; + return 1; + } + + const fs::path sfzFilePath { argv[1] }; + + sfz::Parser parser; + MyParserListener listener(parser); + + parser.setListener(&listener); + parser.parseFile(argv[1]); + + if (parser.getErrorCount() > 0) + return 1; + + return 0; +}