diff --git a/common.mk b/common.mk index 5c7cf10f..ea5553ff 100644 --- a/common.mk +++ b/common.mk @@ -97,7 +97,6 @@ SFIZZ_SOURCES = \ src/sfizz/Opcode.cpp \ src/sfizz/Oversampler.cpp \ src/sfizz/Panning.cpp \ - src/sfizz/Parser.cpp \ src/sfizz/parser/Parser.cpp \ src/sfizz/parser/ParserPrivate.cpp \ src/sfizz/PolyphonyGroup.cpp \ @@ -109,7 +108,6 @@ SFIZZ_SOURCES = \ src/sfizz/sfizz.cpp \ src/sfizz/sfizz_wrapper.cpp \ src/sfizz/SfzFilter.cpp \ - src/sfizz/SfzHelpers.cpp \ src/sfizz/SIMDHelpers.cpp \ src/sfizz/simd/HelpersSSE.cpp \ src/sfizz/simd/HelpersAVX.cpp \ diff --git a/scripts/run_clang_tidy.sh b/scripts/run_clang_tidy.sh index dea7d0ea..041d331a 100755 --- a/scripts/run_clang_tidy.sh +++ b/scripts/run_clang_tidy.sh @@ -12,11 +12,9 @@ clang-tidy \ src/sfizz/MidiState.cpp \ src/sfizz/Opcode.cpp \ src/sfizz/Oversampler.cpp \ - src/sfizz/Parser.cpp \ src/sfizz/Panning.cpp \ src/sfizz/sfizz.cpp \ src/sfizz/Region.cpp \ - src/sfizz/SfzHelpers.cpp \ src/sfizz/SIMDHelpers.cpp \ src/sfizz/simd/HelpersSSE.cpp \ src/sfizz/simd/HelpersAVX.cpp \ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2a574522..d548788c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -128,7 +128,6 @@ set(SFIZZ_SOURCES sfizz/Voice.cpp sfizz/ScopedFTZ.cpp sfizz/MidiState.cpp - sfizz/SfzHelpers.cpp sfizz/Oversampler.cpp sfizz/ADSREnvelope.cpp sfizz/Logger.cpp @@ -193,7 +192,6 @@ set(SFIZZ_PARSER_HEADERS sfizz/Range.h sfizz/Opcode.h sfizz/Macros.h - sfizz/Parser.h sfizz/parser/Parser.h sfizz/parser/ParserPrivate.h sfizz/parser/ParserPrivate.hpp @@ -201,10 +199,8 @@ set(SFIZZ_PARSER_HEADERS sfizz/StringViewHelpers.h) set(SFIZZ_PARSER_SOURCES - sfizz/Parser.cpp sfizz/Opcode.cpp sfizz/OpcodeCleanup.cpp - sfizz/SfzHelpers.cpp sfizz/parser/Parser.cpp sfizz/parser/ParserPrivate.cpp) diff --git a/src/sfizz/Parser.cpp b/src/sfizz/Parser.cpp deleted file mode 100644 index 541ac592..00000000 --- a/src/sfizz/Parser.cpp +++ /dev/null @@ -1,132 +0,0 @@ -// 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 - -#include "Parser.h" -#include "StringViewHelpers.h" -#include "SfzHelpers.h" -#include "absl/strings/str_join.h" -#include "absl/strings/str_cat.h" -#include -#include - -void removeCommentOnLine(absl::string_view& line) -{ - auto position = line.find("//"); - if (position != line.npos) - line.remove_suffix(line.size() - position); -} - -bool sfz::OldParser::loadSfzFile(const fs::path& file) -{ - includedFiles.clear(); - - const auto sfzFile = - (file.empty() || file.is_absolute()) ? file : originalDirectory / file; - if (!fs::exists(sfzFile)) - return false; - - originalDirectory = sfzFile.parent_path(); - includedFiles.push_back(sfzFile); - std::vector lines; - readSfzFile(sfzFile, lines); - - aggregatedContent = absl::StrJoin(lines, " "); - absl::string_view aggregatedView { aggregatedContent }; - - absl::string_view header; - absl::string_view members; - - std::vector currentMembers; - - while (findHeader(aggregatedView, header, members)) { - absl::string_view opcode; - absl::string_view value; - - // Store or handle members - while(findOpcode(members, opcode, value)) - currentMembers.emplace_back(opcode, value); - - callback(header, currentMembers); - currentMembers.clear(); - } - - return true; -} - -void sfz::OldParser::readSfzFile(const fs::path& fileName, std::vector& lines) noexcept -{ - std::ifstream fileStream(fileName.c_str()); - if (!fileStream) - return; - - std::string tmpString; - std::string includePath; - absl::string_view variable; - absl::string_view value; - while (std::getline(fileStream, tmpString)) { - absl::string_view tmpView { tmpString }; - - removeCommentOnLine(tmpView); - trimInPlace(tmpView); - - if (tmpView.empty()) - continue; - - // New #include - if (findInclude(tmpView, includePath)) { - std::replace(includePath.begin(), includePath.end(), '\\', '/'); - const auto newFile = originalDirectory / includePath; - auto alreadyIncluded = std::find(includedFiles.begin(), includedFiles.end(), newFile); - if (fs::exists(newFile)) { - if (alreadyIncluded == includedFiles.end()) { - includedFiles.push_back(newFile); - readSfzFile(newFile, lines); - } else if (!recursiveIncludeGuard) { - readSfzFile(newFile, lines); - } - } - continue; - } - - // New #define - if (findDefine(tmpView, variable, value)) { - - defines[std::string(variable)] = std::string(value); - continue; - } - - // Replace defined variables starting with $ - std::string newString; - newString.reserve(tmpView.length()); - std::string::size_type lastPos = 0; - std::string::size_type findPos = tmpView.find(sfz::config::defineCharacter, lastPos); - - while (findPos < tmpView.npos) { - absl::StrAppend(&newString, tmpView.substr(lastPos, findPos - lastPos)); - - const auto defineEnd = tmpView.find_first_of("= \r\t\n\f\v", findPos); - const auto candidate = tmpView.substr(findPos, defineEnd - findPos); - for (auto& definePair : defines) { - if (candidate == definePair.first) { - absl::StrAppend(&newString, definePair.second); - lastPos = findPos + definePair.first.length(); - break; - } - } - - if (lastPos <= findPos) { - newString += sfz::config::defineCharacter; - lastPos = findPos + 1; - } - - findPos = tmpView.find(sfz::config::defineCharacter, lastPos); - } - - // Copy the rest of the string - absl::StrAppend(&newString, tmpView.substr(lastPos)); - lines.push_back(std::move(newString)); - } -} diff --git a/src/sfizz/Parser.h b/src/sfizz/Parser.h deleted file mode 100644 index e1be5971..00000000 --- a/src/sfizz/Parser.h +++ /dev/null @@ -1,36 +0,0 @@ -// 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 - -#pragma once -#include "Config.h" -#include "Opcode.h" -#include "ghc/fs_std.hpp" -#include -#include -#include "absl/strings/string_view.h" -#include - -namespace sfz { -class OldParser { -public: - virtual ~OldParser() = default; - virtual bool loadSfzFile(const fs::path& file); - const std::map& getDefines() const noexcept { return defines; } - const std::vector& getIncludedFiles() const noexcept { return includedFiles; } - void disableRecursiveIncludeGuard() { recursiveIncludeGuard = false; } - void enableRecursiveIncludeGuard() { recursiveIncludeGuard = true; } -protected: - virtual void callback(absl::string_view header, const std::vector& members) = 0; - fs::path originalDirectory { fs::current_path() }; -private: - bool recursiveIncludeGuard { false }; - std::map defines; - std::vector includedFiles; - std::string aggregatedContent {}; - void readSfzFile(const fs::path& fileName, std::vector& lines) noexcept; -}; - -} // namespace sfz diff --git a/src/sfizz/SfzHelpers.cpp b/src/sfizz/SfzHelpers.cpp deleted file mode 100644 index 581315f8..00000000 --- a/src/sfizz/SfzHelpers.cpp +++ /dev/null @@ -1,106 +0,0 @@ -// 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 - -#include "SfzHelpers.h" -#include "StringViewHelpers.h" - -namespace sfz { - -bool findHeader(absl::string_view& source, absl::string_view& header, absl::string_view& members) -{ - auto openHeader = source.find("<"); - if (openHeader == absl::string_view::npos) - return false; - - auto closeHeader = source.find(">", openHeader); - if (openHeader == absl::string_view::npos) - return false; - - auto nextHeader = source.find("<", closeHeader); - header = source.substr(openHeader + 1, closeHeader - openHeader - 1); - if (nextHeader == absl::string_view::npos) { - members = trim(source.substr(closeHeader + 1)); - source.remove_prefix(source.length()); - } else { - members = trim(source.substr(closeHeader + 1, nextHeader - closeHeader - 1)); - source.remove_prefix(nextHeader); - } - - return true; -} - -bool findOpcode(absl::string_view& source, absl::string_view& opcode, absl::string_view& value) -{ - auto opcodeEnd = source.find("="); - if (opcodeEnd == absl::string_view::npos) - return false; - - const auto valueStart = opcodeEnd + 1; - const auto nextOpcodeEnd = source.find("=", valueStart); - - if (nextOpcodeEnd == absl::string_view::npos) { - opcode = source.substr(0, opcodeEnd); - value = source.substr(valueStart); - source.remove_prefix(source.length()); - return true; - } - - auto valueEnd = nextOpcodeEnd; - while (source[valueEnd] != ' ' && valueEnd != valueStart) - valueEnd--; - - opcode = source.substr(0, opcodeEnd); - value = source.substr(valueStart, valueEnd - valueStart); - source.remove_prefix(valueEnd); - return true; -} - - -bool findDefine(absl::string_view line, absl::string_view& variable, absl::string_view& value) -{ - const auto defPosition = line.find("#define"); - if (defPosition == absl::string_view::npos) - return false; - - const auto variableStart = line.find("$", 7); - if (variableStart == absl::string_view::npos) - return false; - - const auto variableEnd = line.find_first_of(" \r\t\n\f\v", variableStart); - if (variableEnd == absl::string_view::npos) - return false; - - const auto valueStart = line.find_first_not_of(" \r\t\n\f\v", variableEnd); - if (valueStart == absl::string_view::npos) - return false; - - const auto valueEnd = line.find_first_of(" \r\t\n\f\v", valueStart); - variable = line.substr(variableStart, variableEnd - variableStart); - value = valueEnd != absl::string_view::npos - ? line.substr(valueStart, valueEnd - valueStart) - : line.substr(valueStart); - return true; -} - -bool findInclude(absl::string_view line, std::string& path) -{ - const auto defPosition = line.find("#include"); - if (defPosition == absl::string_view::npos) - return false; - - const auto pathStart = line.find("\"", 8); - if (pathStart == absl::string_view::npos) - return false; - - const auto pathEnd = line.find("\"", pathStart + 1); - if (pathEnd == absl::string_view::npos) - return false; - - path = std::string(line.substr(pathStart + 1, pathEnd - pathStart - 1)); - return true; -} - -} diff --git a/src/sfizz/SfzHelpers.h b/src/sfizz/SfzHelpers.h index a2d2439e..b26f6560 100644 --- a/src/sfizz/SfzHelpers.h +++ b/src/sfizz/SfzHelpers.h @@ -250,66 +250,4 @@ bool insertPairUniquely(std::vector

& pairVector, const T& key, U value, bool return result; } -/** - * @brief From a source view, find the next sfz header and its members and - * return them, while updating the source by removing this header - * and members from the beginning. The function "consumes" the - * header and its members from the source if found. - * - * No check is made to see if the header is "valid" in the sfz sense. - * The output parameters are set only if the method returns true. - * - * @param source A source view; can be updated and shortened - * @param header An output view on the header, without the <> - * @param members An output view on the members, untrimmed - * @return true if a header was found - * @return false otherwise - */ -bool findHeader(absl::string_view& source, absl::string_view& header, absl::string_view& members); -/** - * @brief From a source view, find the next sfz member opcode and its value. - * Return them while updating the source by removing this opcode - * and value from the beginning. The function "consumes" the - * opcode from the source if one is found. - * - * No check is made to see if the opcode is "valid" in the sfz sense. - * The output parameters are set only if the method returns true. - * - * @param source A source view; can be updated and shortened - * @param opcode An output view on the opcode name - * @param value An output view on the opcode value - * @return true if an opcode was found - * @return false - */ -bool findOpcode(absl::string_view& source, absl::string_view& opcode, absl::string_view& value); - -/** - * @brief Find an SFZ #define statement on a line and return the variable and value as views. - * - * This function assums that there is a single define per line and that the variable and value - * are separated by whitespace. - * The output parameters are set only if the method returns true. - * - * @param line The source line - * @param variable An output view on the define variable - * @param value An output view on the define value - * @return true If a define was found - * @return false - */ -bool findDefine(absl::string_view line, absl::string_view& variable, absl::string_view& value); - -/** - * @brief Find an SFZ #include statement on a line and return included path. - * - * This function assums that there is a single include per line and that the - * include path is within quotes. - * The output parameter is set only if the method returns true. - * - * @param line The source line - * @param path The path, if found - * @return true If an include was found - * @return false - */ -bool findInclude(absl::string_view line, std::string& path); - } // namespace sfz diff --git a/tests/ParsingT.cpp b/tests/ParsingT.cpp index 1224b46c..ce35830d 100644 --- a/tests/ParsingT.cpp +++ b/tests/ParsingT.cpp @@ -11,126 +11,6 @@ #include "absl/strings/string_view.h" using namespace Catch::literals; -void includeTest(const std::string& line, const std::string& fileName) -{ - std::string parsedPath; - auto found = sfz::findInclude(line, parsedPath); - if (!found) - std::cerr << "Include test failed: " << line << '\n'; - REQUIRE(found); - REQUIRE(parsedPath == fileName); -} - -TEST_CASE("[Parsing] #include") -{ - includeTest("#include \"file.sfz\"", "file.sfz"); - includeTest("#include \"../Programs/file.sfz\"", "../Programs/file.sfz"); - includeTest("#include \"..\\Programs\\file.sfz\"", "..\\Programs\\file.sfz"); - includeTest("#include \"file-1.sfz\"", "file-1.sfz"); - includeTest("#include \"file~1.sfz\"", "file~1.sfz"); - includeTest("#include \"file_1.sfz\"", "file_1.sfz"); - includeTest("#include \"file$1.sfz\"", "file$1.sfz"); - includeTest("#include \"file,1.sfz\"", "file,1.sfz"); - includeTest("#include \"rubbishCharactersAfter.sfz\" blabldaljf///df", "rubbishCharactersAfter.sfz"); - includeTest("#include \"lazyMatching.sfz\" b\"", "lazyMatching.sfz"); -} - -void defineTest(const std::string& line, const std::string& variable, const std::string& value) -{ - absl::string_view variableMatch; - absl::string_view valueMatch; - - auto found = sfz::findDefine(line, variableMatch, valueMatch); - REQUIRE(found); - REQUIRE(variableMatch == variable); - REQUIRE(valueMatch == value); -} - -void defineFail(const std::string& line) -{ - absl::string_view variableMatch; - absl::string_view valueMatch; - auto found = sfz::findDefine(line, variableMatch, valueMatch); - REQUIRE(!found); -} - -TEST_CASE("[Parsing] #define") -{ - defineTest("#define $number 1", "$number", "1"); - defineTest("#define $letters QWERasdf", "$letters", "QWERasdf"); - defineTest("#define $alphanum asr1t44", "$alphanum", "asr1t44"); - defineTest("#define $whitespace asr1t44 ", "$whitespace", "asr1t44"); - defineTest("#define $lazyMatching matched bfasd ", "$lazyMatching", "matched"); - defineTest("#define $stircut -12", "$stircut", "-12"); - defineTest("#define $_ht_under_score_ 3fd", "$_ht_under_score_", "3fd"); - defineTest("#define $ht_under_score 3fd", "$ht_under_score", "3fd"); - // defineFail("#define $symbols# 1"); - // defineFail("#define $symbolsAgain $1"); - // defineFail("#define $trailingSymbols 1$"); -} - -TEST_CASE("[Parsing] Header") -{ - SECTION("Basic header match") - { - absl::string_view header; - absl::string_view members; - absl::string_view line { "

param1=value1 param2=value2" }; - auto found = sfz::findHeader(line, header, members); - REQUIRE(found); - REQUIRE(header == "header"); - REQUIRE(members == "param1=value1 param2=value2"); - REQUIRE(line == ""); - } - SECTION("EOL header match") - { - absl::string_view header; - absl::string_view members; - absl::string_view line { "
param1=value1 param2=value2" }; - auto found = sfz::findHeader(line, header, members); - REQUIRE(found); - REQUIRE(header == "header"); - REQUIRE(members == "param1=value1 param2=value2"); - REQUIRE(line == ""); - } -} - -void memberTest(const std::string& line, const std::string& opcode, const std::string& value) -{ - absl::string_view opcodeMatched; - absl::string_view valueMatched; - absl::string_view lineView { line }; - auto found = sfz::findOpcode(lineView, opcodeMatched, valueMatched); - REQUIRE(found); - REQUIRE(opcodeMatched == opcode); - REQUIRE(valueMatched == value); -} - -TEST_CASE("[Parsing] Member") -{ - memberTest("param=value", "param", "value"); - memberTest("param=113", "param", "113"); - memberTest("param1=value", "param1", "value"); - memberTest("param_1=value", "param_1", "value"); - memberTest("param_1=value", "param_1", "value"); - memberTest("ampeg_sustain_oncc74=-100", "ampeg_sustain_oncc74", "-100"); - memberTest("lorand=0.750", "lorand", "0.750"); - memberTest("sample=value", "sample", "value"); - memberTest("sample=value-()*", "sample", "value-()*"); - memberTest("sample=../sample.wav", "sample", "../sample.wav"); - memberTest("sample=..\\sample.wav", "sample", "..\\sample.wav"); - memberTest("sample=subdir\\subdir\\sample.wav", "sample", "subdir\\subdir\\sample.wav"); - memberTest("sample=subdir/subdir/sample.wav", "sample", "subdir/subdir/sample.wav"); - memberTest("sample=subdir_underscore\\sample.wav", "sample", "subdir_underscore\\sample.wav"); - memberTest("sample=subdir space\\sample.wav", "sample", "subdir space\\sample.wav"); - memberTest("sample=subdir space\\sample.wav next_member=value", "sample", "subdir space\\sample.wav"); - memberTest("sample=..\\Samples\\pizz\\a0_vl3_rr3.wav", "sample", "..\\Samples\\pizz\\a0_vl3_rr3.wav"); - memberTest("sample=..\\Samples\\SMD Cymbals Stereo (Samples)\\Hi-Hat (Samples)\\01 Hat Tight 1\\RR1\\09_Hat_Tight_Cnt_RR1.wav", "sample", "..\\Samples\\SMD Cymbals Stereo (Samples)\\Hi-Hat (Samples)\\01 Hat Tight 1\\RR1\\09_Hat_Tight_Cnt_RR1.wav"); - memberTest("sample=..\\G&S CW-Drum Kit-1\\SnareFX\\SNR-OFF-V08-CustomWorks-6x13.wav", "sample", "..\\G&S CW-Drum Kit-1\\SnareFX\\SNR-OFF-V08-CustomWorks-6x13.wav"); -} - -// New parser - struct ParsingMocker: sfz::Parser::Listener { void onParseBegin() override