From 0898030e4c8f54914454279edf9a0ab9f9491fc8 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Sat, 30 May 2020 00:15:53 +0200 Subject: [PATCH] Clamp at the first non-number character in readOpcode --- src/sfizz/Opcode.h | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/sfizz/Opcode.h b/src/sfizz/Opcode.h index 04cf67ac..52f67af7 100644 --- a/src/sfizz/Opcode.h +++ b/src/sfizz/Opcode.h @@ -115,20 +115,23 @@ private: template ::value, int> = 0> inline absl::optional readOpcode(absl::string_view value, const Range& validRange) { - int64_t returnedValue; - if (!absl::SimpleAtoi(value, &returnedValue)) { - float floatValue; - if (!absl::SimpleAtof(value, &floatValue)) - return {}; - returnedValue = static_cast(floatValue); - } + const auto numberEnd = value.find_first_not_of("-1234567890."); + value = value.substr(0, numberEnd); - if (returnedValue > std::numeric_limits::max()) - returnedValue = std::numeric_limits::max(); - if (returnedValue < std::numeric_limits::min()) - returnedValue = std::numeric_limits::min(); + int64_t returnedValue; + if (!absl::SimpleAtoi(value, &returnedValue)) { + float floatValue; + if (!absl::SimpleAtof(value, &floatValue)) + return {}; + returnedValue = static_cast(floatValue); + } - return validRange.clamp(static_cast(returnedValue)); + if (returnedValue > std::numeric_limits::max()) + returnedValue = std::numeric_limits::max(); + if (returnedValue < std::numeric_limits::min()) + returnedValue = std::numeric_limits::min(); + + return validRange.clamp(static_cast(returnedValue)); } /** @@ -144,8 +147,11 @@ inline absl::optional readOpcode(absl::string_view value, const Range template ::value, int> = 0> inline absl::optional readOpcode(absl::string_view value, const Range& validRange) { + const auto numberEnd = value.find_first_not_of("-1234567890."); + value = value.substr(0, numberEnd); + float returnedValue; - if (!absl::SimpleAtof(value, &returnedValue)) + if (!absl::SimpleAtof(value.substr(0, numberEnd), &returnedValue)) return absl::nullopt; return validRange.clamp(returnedValue);