diff options
Diffstat (limited to 'app-i18n/libime/files/libime-1.1.3-fix-the-nanf-value-issue-on-musl.patch')
-rw-r--r-- | app-i18n/libime/files/libime-1.1.3-fix-the-nanf-value-issue-on-musl.patch | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/app-i18n/libime/files/libime-1.1.3-fix-the-nanf-value-issue-on-musl.patch b/app-i18n/libime/files/libime-1.1.3-fix-the-nanf-value-issue-on-musl.patch new file mode 100644 index 000000000000..73b94a07cff5 --- /dev/null +++ b/app-i18n/libime/files/libime-1.1.3-fix-the-nanf-value-issue-on-musl.patch @@ -0,0 +1,79 @@ +Backport of https://github.com/fcitx/libime/commit/59ae4a3ab4becdab164f29af07c502096c745b94.diff + +Backport upstream commit 59ae4a3 to fix the nanf value issue on musl + +--- a/src/libime/core/datrie.cpp ++++ b/src/libime/core/datrie.cpp +@@ -47,12 +47,24 @@ struct NanValue { + static inline int32_t NO_PATH() { return -2; } + }; + ++// Musl doesn't have nanf implementation we need, just check if they are the ++// same value. If not, prefer old hardcoded value. ++bool isGoodNanf() { ++ int32_t noValue = decodeValue(std::nanf("1")); ++ int32_t noPath = decodeValue(std::nanf("2")); ++ return (noValue != noPath); ++} ++ + template <> + struct NanValue<float> { + static_assert(std::numeric_limits<float>::has_quiet_NaN, + "Require support for quiet NaN."); +- static inline int32_t NO_VALUE() { return decodeValue(std::nanf("1")); } +- static inline int32_t NO_PATH() { return decodeValue(std::nanf("2")); } ++ static inline int32_t NO_VALUE() { ++ return isGoodNanf() ? decodeValue(std::nanf("1")) : 0x7fc00001; ++ } ++ static inline int32_t NO_PATH() { ++ return isGoodNanf() ? decodeValue(std::nanf("2")) : 0x7fc00002; ++ } + }; + + } // namespace +@@ -1144,6 +1156,20 @@ bool DATrie<T>::isValid(value_type v) { + return !(isNoPath(v) || isNoValue(v)); + } + ++template <typename T> ++T DATrie<T>::noPath() { ++ typename DATriePrivate<T>::decorder_type d; ++ d.result = DATriePrivate<value_type>::CEDAR_NO_PATH; ++ return d.result_value; ++} ++ ++template <typename T> ++T DATrie<T>::noValue() { ++ typename DATriePrivate<T>::decorder_type d; ++ d.result = DATriePrivate<value_type>::CEDAR_NO_VALUE; ++ return d.result_value; ++} ++ + template <typename T> + size_t DATrie<T>::mem_size() const { + // std::cout << "tail" << d->m_tail.size() << std::endl +--- a/src/libime/core/datrie.h ++++ b/src/libime/core/datrie.h +@@ -136,6 +136,9 @@ class DATrie { + static bool isNoPath(value_type v); + static bool isNoValue(value_type v); + ++ static value_type noPath(); ++ static value_type noValue(); ++ + size_t mem_size() const; + + private: +--- a/test/testtrie.cpp ++++ b/test/testtrie.cpp +@@ -40,8 +40,8 @@ int main() { + FCITX_ASSERT(trie.size() == 4); + DATrie<float>::position_type pos = 0; + auto result = trie.traverse("aaa", pos); +- auto nan1 = std::nanf("1"); +- auto nan2 = std::nanf("2"); ++ auto nan1 = trie.noValue(); ++ auto nan2 = trie.noPath(); + // NaN != NaN, we must use memcmp to do this. + FCITX_ASSERT(memcmp(&nan1, &result, sizeof(float)) == 0); + FCITX_ASSERT(trie.isNoValue(result)); |