Silently ignore ampersands in opcode name
This commit is contained in:
parent
a17f6b9169
commit
692b2cda6a
3 changed files with 51 additions and 2 deletions
|
|
@ -20,7 +20,7 @@ sfz::Opcode::Opcode(absl::string_view inputOpcode, absl::string_view inputValue)
|
||||||
while (nextNumIndex != opcode.npos) {
|
while (nextNumIndex != opcode.npos) {
|
||||||
const auto numLetters = nextNumIndex - nextCharIndex;
|
const auto numLetters = nextNumIndex - nextCharIndex;
|
||||||
parameterPosition += numLetters;
|
parameterPosition += numLetters;
|
||||||
lettersOnlyHash = hash(opcode.substr(nextCharIndex, numLetters), lettersOnlyHash);
|
lettersOnlyHash = hashNoAmpersand(opcode.substr(nextCharIndex, numLetters), lettersOnlyHash);
|
||||||
nextCharIndex = opcode.find_first_not_of("1234567890", nextNumIndex);
|
nextCharIndex = opcode.find_first_not_of("1234567890", nextNumIndex);
|
||||||
|
|
||||||
uint32_t returnedValue;
|
uint32_t returnedValue;
|
||||||
|
|
@ -34,5 +34,5 @@ sfz::Opcode::Opcode(absl::string_view inputOpcode, absl::string_view inputValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nextCharIndex != opcode.npos)
|
if (nextCharIndex != opcode.npos)
|
||||||
lettersOnlyHash = hash(opcode.substr(nextCharIndex), lettersOnlyHash);
|
lettersOnlyHash = hashNoAmpersand(opcode.substr(nextCharIndex), lettersOnlyHash);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -66,3 +66,24 @@ constexpr uint64_t hash(absl::string_view s, uint64_t h = Fnv1aBasis)
|
||||||
|
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Same function as `hash()` but ignores ampersands (&)
|
||||||
|
*
|
||||||
|
* See e.g. the Region.cpp file
|
||||||
|
*
|
||||||
|
* @param s the input string to be hashed
|
||||||
|
* @param h the hashing seed to use
|
||||||
|
* @return uint64_t
|
||||||
|
*/
|
||||||
|
constexpr uint64_t hashNoAmpersand(absl::string_view s, uint64_t h = Fnv1aBasis)
|
||||||
|
{
|
||||||
|
if (s.length() > 0) {
|
||||||
|
if (s.front() == '&')
|
||||||
|
return hashNoAmpersand( { s.data() + 1, s.length() - 1 }, h );
|
||||||
|
else
|
||||||
|
return hashNoAmpersand( { s.data() + 1, s.length() - 1 }, (h ^ s.front()) * Fnv1aPrime );
|
||||||
|
}
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,24 @@ TEST_CASE("[Opcode] Construction")
|
||||||
REQUIRE(opcode.value == "dummy");
|
REQUIRE(opcode.value == "dummy");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("Normal construction with ampersand")
|
||||||
|
{
|
||||||
|
sfz::Opcode opcode { "sample&_ampersand", "dummy" };
|
||||||
|
REQUIRE(opcode.opcode == "sample&_ampersand");
|
||||||
|
REQUIRE(opcode.lettersOnlyHash == hash("sample_ampersand"));
|
||||||
|
REQUIRE(opcode.parameters.empty());
|
||||||
|
REQUIRE(opcode.value == "dummy");
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("Normal construction with multiple ampersands")
|
||||||
|
{
|
||||||
|
sfz::Opcode opcode { "&sample&_ampersand&", "dummy" };
|
||||||
|
REQUIRE(opcode.opcode == "&sample&_ampersand&");
|
||||||
|
REQUIRE(opcode.lettersOnlyHash == hash("sample_ampersand"));
|
||||||
|
REQUIRE(opcode.parameters.empty());
|
||||||
|
REQUIRE(opcode.value == "dummy");
|
||||||
|
}
|
||||||
|
|
||||||
SECTION("Parameterized opcode")
|
SECTION("Parameterized opcode")
|
||||||
{
|
{
|
||||||
sfz::Opcode opcode { "sample123", "dummy" };
|
sfz::Opcode opcode { "sample123", "dummy" };
|
||||||
|
|
@ -38,6 +56,16 @@ TEST_CASE("[Opcode] Construction")
|
||||||
REQUIRE(opcode.parameters == std::vector<uint16_t>({ 123 }));
|
REQUIRE(opcode.parameters == std::vector<uint16_t>({ 123 }));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("Parameterized opcode with ampersand")
|
||||||
|
{
|
||||||
|
sfz::Opcode opcode { "sample&123", "dummy" };
|
||||||
|
REQUIRE(opcode.opcode == "sample&123");
|
||||||
|
REQUIRE(opcode.lettersOnlyHash == hash("sample&"));
|
||||||
|
REQUIRE(opcode.value == "dummy");
|
||||||
|
REQUIRE(opcode.parameters.size() == 1);
|
||||||
|
REQUIRE(opcode.parameters == std::vector<uint16_t>({ 123 }));
|
||||||
|
}
|
||||||
|
|
||||||
SECTION("Parameterized opcode with underscore")
|
SECTION("Parameterized opcode with underscore")
|
||||||
{
|
{
|
||||||
sfz::Opcode opcode { "sample_underscore123", "dummy" };
|
sfz::Opcode opcode { "sample_underscore123", "dummy" };
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue