This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch case_insensitive_properties
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git

commit c175e90719dac36640d5f1f3bda0259e0a748bc5
Author: Stephen Webb <[email protected]>
AuthorDate: Tue Jun 2 17:18:57 2026 +1000

    Ignore character case in loaded option names in the next ABI version
---
 src/main/cpp/properties.cpp                   | 18 ++++++++++++++++++
 src/main/include/log4cxx/helpers/properties.h |  7 ++++++-
 src/test/cpp/helpers/propertiestestcase.cpp   | 15 +++++++++++++++
 3 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/src/main/cpp/properties.cpp b/src/main/cpp/properties.cpp
index 893f186c..a5847b88 100644
--- a/src/main/cpp/properties.cpp
+++ b/src/main/cpp/properties.cpp
@@ -20,10 +20,28 @@
 #include <log4cxx/helpers/inputstreamreader.h>
 #include <log4cxx/helpers/exception.h>
 #include <log4cxx/helpers/pool.h>
+#include <cctype>
+#include <algorithm>
 
 using namespace LOG4CXX_NS;
 using namespace LOG4CXX_NS::helpers;
 
+template <typename Char>
+struct Properties::Less
+{
+       bool operator()(const std::basic_string<Char>& str1, const 
std::basic_string<Char>& str2) const
+       {
+               return std::lexicographical_compare
+                       ( str1.begin(), str1.end()
+                       , str2.begin(), str2.end()
+                       , [](Char c1, Char c2)
+                               {
+                                       return std::tolower(c1) < 
std::tolower(c2);
+                               }
+                       );
+       }
+};
+
 class PropertyParser
 {
        public:
diff --git a/src/main/include/log4cxx/helpers/properties.h 
b/src/main/include/log4cxx/helpers/properties.h
index 1481d2cc..2a82ad29 100644
--- a/src/main/include/log4cxx/helpers/properties.h
+++ b/src/main/include/log4cxx/helpers/properties.h
@@ -32,7 +32,12 @@ namespace helpers
 class LOG4CXX_EXPORT Properties
 {
        private:
-               typedef std::map<LogString, LogString> PropertyMap;
+               template <typename Char> struct Less;
+#if LOG4CXX_ABI_VERSION < 15
+               using PropertyMap = std::map<LogString, LogString>;
+#else
+               using PropertyMap = std::map<LogString, LogString, 
Less<logchar> >;
+#endif
                PropertyMap* properties;
 
        public: // ...structors
diff --git a/src/test/cpp/helpers/propertiestestcase.cpp 
b/src/test/cpp/helpers/propertiestestcase.cpp
index 315b6c8e..338a04e9 100644
--- a/src/test/cpp/helpers/propertiestestcase.cpp
+++ b/src/test/cpp/helpers/propertiestestcase.cpp
@@ -44,6 +44,7 @@ LOGUNIT_CLASS(PropertiesTestCase)
        LOGUNIT_TEST(testCRLF);
        LOGUNIT_TEST(testLF);
        LOGUNIT_TEST(testMixedLineEndings);
+       LOGUNIT_TEST(testCaseSensitivity);
        LOGUNIT_TEST_SUITE_END();
 
 public:
@@ -295,6 +296,20 @@ public:
                LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("some_value")), 
value3);
        }
 
+       void testCaseSensitivity(){
+               Properties properties;
+               properties.setProperty(LOG4CXX_STR("key"), 
LOG4CXX_STR("value1"));
+               properties.setProperty(LOG4CXX_STR("Key"), 
LOG4CXX_STR("value2"));
+               auto keys = properties.propertyNames();
+               auto keyCount = static_cast<int>(keys.size());
+#if LOG4CXX_ABI_VERSION < 15
+               LOGUNIT_ASSERT_EQUAL(keyCount, 2);
+#else
+               LOGUNIT_ASSERT_EQUAL(keyCount, 1);
+               LOGUNIT_ASSERT_EQUAL(properties.get(keys.front()), 
LOG4CXX_STR("value2"));
+#endif
+       }
+
 };
 
 

Reply via email to