You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by sw...@apache.org on 2023/01/22 01:55:25 UTC

[logging-log4cxx] branch nonchar_logchar_compilation_errors created (now 638f573a)

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

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


      at 638f573a Ensure CI catches logchar related compilation errors

This branch includes the following new commits:

     new 6b4674fe Prevent compilation errors when logchar is not char
     new 638f573a Ensure CI catches logchar related compilation errors

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[logging-log4cxx] 02/02: Ensure CI catches logchar related compilation errors

Posted by sw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 638f573a9f1288a1d93593a0cf89667cce61848a
Author: Stephen Webb <st...@sabreautonomous.com.au>
AuthorDate: Sun Jan 22 12:40:01 2023 +1100

    Ensure CI catches logchar related compilation errors
---
 .github/workflows/log4cxx-windows-static.yml | 2 +-
 .github/workflows/log4cxx-windows.yml        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/log4cxx-windows-static.yml b/.github/workflows/log4cxx-windows-static.yml
index 5cb4de2a..b88c919b 100644
--- a/.github/workflows/log4cxx-windows-static.yml
+++ b/.github/workflows/log4cxx-windows-static.yml
@@ -74,7 +74,7 @@ jobs:
         cd main
         mkdir build
         cd build
-        cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DBUILD_SHARED_LIBS=off -DLOG4CXX_TEST_PROGRAM_PATH=C:\msys64\usr\bin "-DCMAKE_TOOLCHAIN_FILE=$THISDIR/vcpkg/scripts/buildsystems/vcpkg.cmake" ..
+        cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DBUILD_SHARED_LIBS=off -DLOG4CXX_TEST_PROGRAM_PATH=C:\msys64\usr\bin  -DLOG4CXX_CHAR=wchar_t  "-DCMAKE_TOOLCHAIN_FILE=$THISDIR/vcpkg/scripts/buildsystems/vcpkg.cmake" ..
         cmake --build .
 
     - name: run unit tests
diff --git a/.github/workflows/log4cxx-windows.yml b/.github/workflows/log4cxx-windows.yml
index 012c41c0..532ba636 100644
--- a/.github/workflows/log4cxx-windows.yml
+++ b/.github/workflows/log4cxx-windows.yml
@@ -74,7 +74,7 @@ jobs:
         cd main
         mkdir build
         cd build
-        cmake -DLOG4CXX_TEST_PROGRAM_PATH=C:\msys64\usr\bin "-DCMAKE_TOOLCHAIN_FILE=$THISDIR/vcpkg/scripts/buildsystems/vcpkg.cmake" ..
+        cmake -DLOG4CXX_TEST_PROGRAM_PATH=C:\msys64\usr\bin -DLOG4CXX_CHAR=unichar "-DCMAKE_TOOLCHAIN_FILE=$THISDIR/vcpkg/scripts/buildsystems/vcpkg.cmake" ..
         cmake --build .
 
     - name: run unit tests


[logging-log4cxx] 01/02: Prevent compilation errors when logchar is not char

Posted by sw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6b4674fe40f4c1829a258d2b52b21afe186b4752
Author: Stephen Webb <st...@sabreautonomous.com.au>
AuthorDate: Sun Jan 22 11:58:30 2023 +1100

    Prevent compilation errors when logchar is not char
---
 src/main/cpp/colorstartpatternconverter.cpp        | 12 ++---
 src/main/cpp/defaultconfigurator.cpp               | 19 +++++---
 src/main/cpp/domconfigurator.cpp                   |  5 +--
 src/main/cpp/exception.cpp                         | 10 +++--
 src/main/cpp/fmtlayout.cpp                         | 51 ++++++++++++++--------
 src/main/cpp/locationinfofilter.cpp                | 13 +++---
 src/main/cpp/loglog.cpp                            |  2 +-
 src/main/cpp/patternlayout.cpp                     |  2 +-
 src/main/cpp/propertyconfigurator.cpp              |  5 ++-
 src/main/cpp/rollingfileappender.cpp               | 28 +++++-------
 src/main/cpp/threadutility.cpp                     |  1 +
 src/test/cpp/filter/locationinfofiltertest.cpp     |  2 +-
 .../cpp/pattern/colorstartpatternconvertertest.cpp | 46 +++++++++----------
 src/test/cpp/pattern/patternparsertestcase.cpp     |  1 +
 14 files changed, 111 insertions(+), 86 deletions(-)

diff --git a/src/main/cpp/colorstartpatternconverter.cpp b/src/main/cpp/colorstartpatternconverter.cpp
index 72eb9f32..1193f6fd 100644
--- a/src/main/cpp/colorstartpatternconverter.cpp
+++ b/src/main/cpp/colorstartpatternconverter.cpp
@@ -122,10 +122,10 @@ static LogString convertSingleSequence(const LogString& sequence, Pool& pool){
 		return LOG4CXX_STR("");
 	}
 
-	if(StringHelper::startsWith(sequence, "fg(")){
+	if(StringHelper::startsWith(sequence, LOG4CXX_STR("fg("))){
 		// Parse foreground
 		return colorToANSISequence(strInParens, true, pool);
-	}else if(StringHelper::startsWith(sequence, "bg(")){
+	}else if(StringHelper::startsWith(sequence, LOG4CXX_STR("bg("))){
 		return colorToANSISequence(strInParens, false, pool);
 	}else{
 		return graphicsModeToANSISequence(sequence, pool);
@@ -234,7 +234,7 @@ void ColorStartPatternConverter::parseColor(const LogString& color, LogString* r
 		return;
 	}
 
-	if( StringHelper::startsWith(lower, "\\x1b") ){
+	if( StringHelper::startsWith(lower, LOG4CXX_STR("\\x1b")) ){
 		if( color[color.size() - 1] != 'm' ){
 			// In order for this to be a valid ANSI escape sequence,
 			// it must end with an 'm'.  If it does not, reject.
@@ -242,7 +242,7 @@ void ColorStartPatternConverter::parseColor(const LogString& color, LogString* r
 		}
 		// We start with an escape sequence, copy the data over after the escape byte
 		result->clear();
-		result->append("\x1b");
+		result->append(LOG4CXX_STR("\x1b"));
 		for( size_t x = 4; x < color.size(); x++ ){
 			result->push_back(color[x]);
 		}
@@ -252,7 +252,7 @@ void ColorStartPatternConverter::parseColor(const LogString& color, LogString* r
 		// https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
 		// https://en.wikipedia.org/wiki/ANSI_escape_code
 		result->clear();
-		result->append("\x1b[");
+		result->append(LOG4CXX_STR("\x1b["));
 		LogString tmp;
 		for( size_t x = 0; x < color.size(); x++ ){
 			if(color[x] == '|' ){
@@ -272,6 +272,6 @@ void ColorStartPatternConverter::parseColor(const LogString& color, LogString* r
 			result->push_back(';');
 			result->append(toAppend);
 		}
-		result->append("m");
+		result->append(LOG4CXX_STR("m"));
 	}
 }
diff --git a/src/main/cpp/defaultconfigurator.cpp b/src/main/cpp/defaultconfigurator.cpp
index a8bdddb7..5bb254bf 100644
--- a/src/main/cpp/defaultconfigurator.cpp
+++ b/src/main/cpp/defaultconfigurator.cpp
@@ -61,9 +61,14 @@ void DefaultConfigurator::configure(LoggerRepositoryPtr repository)
 
 	if (configurationFileName.empty())
 	{
-		const char* names[] = { "log4cxx.xml", "log4cxx.properties", "log4j.xml", "log4j.properties", 0 };
-
-		for (int i = 0; names[i] != 0; i++)
+		LogString names[4] =
+			{ LOG4CXX_STR("log4cxx.xml")
+			, LOG4CXX_STR("log4cxx.properties")
+			, LOG4CXX_STR("log4j.xml")
+			, LOG4CXX_STR("log4j.properties")
+			};
+
+		for (int i = 0; i < 4; i++)
 		{
 			File candidate(names[i]);
 
@@ -153,9 +158,9 @@ int DefaultConfigurator::getConfigurationWatchDelay()
 }
 
 log4cxx::spi::ConfigurationStatus DefaultConfigurator::tryLoadFile(const LogString& filename){
-	if(helpers::StringHelper::endsWith(filename, ".xml")){
+	if(helpers::StringHelper::endsWith(filename, LOG4CXX_STR(".xml"))){
 		return log4cxx::xml::DOMConfigurator::configure(filename);
-	}else if(helpers::StringHelper::endsWith(filename, ".properties")){
+	}else if(helpers::StringHelper::endsWith(filename, LOG4CXX_STR(".properties"))){
 		return log4cxx::PropertyConfigurator::configure(filename);
 	}
 
@@ -168,7 +173,7 @@ DefaultConfigurator::configureFromFile(const std::vector<LogString>& directories
 
 	for( LogString dir : directories ){
 		for( LogString fname : filenames ){
-			LogString canidate_str = dir + "/" + fname;
+			LogString canidate_str = dir + LOG4CXX_STR("/") + fname;
 			File candidate(canidate_str);
 
 			LogString debugMsg = LOG4CXX_STR("Checking file ");
@@ -180,7 +185,7 @@ DefaultConfigurator::configureFromFile(const std::vector<LogString>& directories
 				if( configStatus == log4cxx::spi::ConfigurationStatus::Configured ){
 					return {configStatus, canidate_str};
 				}
-				LogLog::debug("Unable to load file: trying next");
+				LogLog::debug(LOG4CXX_STR("Unable to load file: trying next"));
 			}
 		}
 	}
diff --git a/src/main/cpp/domconfigurator.cpp b/src/main/cpp/domconfigurator.cpp
index 360b9bfb..f5488fdd 100644
--- a/src/main/cpp/domconfigurator.cpp
+++ b/src/main/cpp/domconfigurator.cpp
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 #include <log4cxx/logstring.h>
 #include <log4cxx/xml/domconfigurator.h>
 #include <log4cxx/appender.h>
@@ -63,7 +62,6 @@ struct DOMConfigurator::DOMConfiguratorPrivate
 	spi::LoggerFactoryPtr loggerFactory;
 };
 
-
 #if APR_HAS_THREADS
 namespace log4cxx
 {
@@ -802,7 +800,8 @@ spi::ConfigurationStatus DOMConfigurator::doConfigure(const File& filename, spi:
 		LogString msg2(LOG4CXX_STR("Could not read configuration file ["));
 		msg2.append(filename.getPath());
 		msg2.append(LOG4CXX_STR("]. "));
-		msg2.append(io.what());
+		LOG4CXX_DECODE_CHAR(msg, io.what());
+		msg2.append(msg);
 		LogLog::error(msg2);
 		return spi::ConfigurationStatus::NotConfigured;
 	}
diff --git a/src/main/cpp/exception.cpp b/src/main/cpp/exception.cpp
index 7eeaf005..ba7c0074 100644
--- a/src/main/cpp/exception.cpp
+++ b/src/main/cpp/exception.cpp
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 #include <log4cxx/logstring.h>
 #include <log4cxx/helpers/exception.h>
 #include <string.h>
@@ -175,9 +174,12 @@ LogString IOException::formatMessage(log4cxx_status_t stat)
 	LogString s(LOG4CXX_STR("IO Exception : status code = "));
 	Pool p;
 	StringHelper::toString(stat, p, s);
-	s.append("(");
-	s.append(apr_strerror(stat, err_buff, sizeof(err_buff)));
-	s.append(")");
+	s.append(LOG4CXX_STR("("));
+	apr_strerror(stat, err_buff, sizeof(err_buff));
+	std::string sMsg = err_buff;
+	LOG4CXX_DECODE_CHAR(lsMsg, sMsg);
+	s.append(lsMsg);
+	s.append(LOG4CXX_STR(")"));
 	return s;
 }
 
diff --git a/src/main/cpp/fmtlayout.cpp b/src/main/cpp/fmtlayout.cpp
index 20b7cf54..62de068a 100644
--- a/src/main/cpp/fmtlayout.cpp
+++ b/src/main/cpp/fmtlayout.cpp
@@ -20,6 +20,7 @@
 #include <log4cxx/helpers/stringhelper.h>
 #include <log4cxx/helpers/pool.h>
 #include <log4cxx/helpers/optionconverter.h>
+#include <log4cxx/helpers/transcoder.h>
 #include <log4cxx/level.h>
 #include <chrono>
 
@@ -82,17 +83,33 @@ void FMTLayout::format(LogString& output,
 	const spi::LoggingEventPtr& event,
 	log4cxx::helpers::Pool&) const
 {
-	LogString locationFull = fmt::format("{}({})",
+	auto locationFull = fmt::format("{}({})",
 										 event->getLocationInformation().getFileName(),
 										 event->getLocationInformation().getLineNumber());
 	LogString ndc;
 	event->getNDC(ndc);
-
+#if LOG4CXX_LOGCHAR_IS_WCHAR || LOG4CXX_LOGCHAR_IS_UNICHAR
+	LOG4CXX_ENCODE_CHAR(sNDC, ndc);
+	LOG4CXX_ENCODE_CHAR(sPattern, m_priv->conversionPattern);
+	LOG4CXX_ENCODE_CHAR(sLogger, event->getLoggerName());
+	LOG4CXX_ENCODE_CHAR(sLevel, event->getLevel()->toString());
+	LOG4CXX_ENCODE_CHAR(sMsg, event->getMessage());
+	LOG4CXX_ENCODE_CHAR(sThread, event->getThreadName());
+	LOG4CXX_ENCODE_CHAR(endOfLine, LOG4CXX_EOL);
+#else
+	auto& sNDC = ndc;
+	auto& sPattern = m_priv->conversionPattern;
+	auto& sLogger = event->getLoggerName();
+	auto sLevel = event->getLevel()->toString();
+	auto& sMsg = event->getMessage();
+	auto& sThread = event->getThreadName();
+	auto endOfLine = LOG4CXX_EOL;
+#endif
 	fmt::format_to(std::back_inserter(output),
-				   m_priv->conversionPattern,
+				   sPattern,
 				   fmt::arg("d", event->getChronoTimeStamp()),
-				   fmt::arg("c", event->getLoggerName()),
-				   fmt::arg("logger", event->getLoggerName()),
+				   fmt::arg("c", sLogger),
+				   fmt::arg("logger", sLogger),
 				   fmt::arg("f", event->getLocationInformation().getShortFileName()),
 				   fmt::arg("shortfilename", event->getLocationInformation().getShortFileName()),
 				   fmt::arg("F", event->getLocationInformation().getFileName()),
@@ -101,20 +118,20 @@ void FMTLayout::format(LogString& output,
 				   fmt::arg("location", locationFull),
 				   fmt::arg("L", event->getLocationInformation().getLineNumber()),
 				   fmt::arg("line", event->getLocationInformation().getLineNumber()),
-				   fmt::arg("m", event->getMessage()),
-				   fmt::arg("message", event->getMessage()),
+				   fmt::arg("m", sMsg),
+				   fmt::arg("message", sMsg),
 				   fmt::arg("M", event->getLocationInformation().getMethodName()),
 				   fmt::arg("method", event->getLocationInformation().getMethodName()),
-				   fmt::arg("n", LOG4CXX_EOL),
-				   fmt::arg("newline", LOG4CXX_EOL),
-				   fmt::arg("p", event->getLevel()->toString()),
-				   fmt::arg("level", event->getLevel()->toString()),
+				   fmt::arg("n", endOfLine),
+				   fmt::arg("newline", endOfLine),
+				   fmt::arg("p", sLevel),
+				   fmt::arg("level", sLevel),
 				   fmt::arg("r", event->getTimeStamp()),
-				   fmt::arg("t", event->getThreadName()),
-				   fmt::arg("thread", event->getThreadName()),
-				   fmt::arg("T", event->getThreadUserName()),
-				   fmt::arg("threadname", event->getThreadUserName()),
-				   fmt::arg("x", ndc),
-				   fmt::arg("ndc", ndc)
+				   fmt::arg("t", sThread),
+				   fmt::arg("thread", sThread),
+				   fmt::arg("T", sThread),
+				   fmt::arg("threadname", sThread),
+				   fmt::arg("x", sNDC),
+				   fmt::arg("ndc", sNDC)
 				   );
 }
diff --git a/src/main/cpp/locationinfofilter.cpp b/src/main/cpp/locationinfofilter.cpp
index db8612fe..7224fcbc 100644
--- a/src/main/cpp/locationinfofilter.cpp
+++ b/src/main/cpp/locationinfofilter.cpp
@@ -22,6 +22,7 @@
 #include <log4cxx/helpers/optionconverter.h>
 #include <log4cxx/private/filter_priv.h>
 #include <log4cxx/helpers/loglog.h>
+#include <log4cxx/helpers/transcoder.h>
 
 using namespace log4cxx;
 using namespace log4cxx::filter;
@@ -40,8 +41,8 @@ struct LocationInfoFilter::LocationInfoFilterPrivate : public FilterPrivate
 
 	bool    acceptOnMatch;
 	bool    mustMatchAll; // true = AND; false = OR
-	int lineNumber;
-	LogString methodName;
+	int     lineNumber;
+	std::string methodName;
 };
 
 IMPLEMENT_LOG4CXX_OBJECT(LocationInfoFilter)
@@ -56,7 +57,7 @@ LocationInfoFilter::~LocationInfoFilter() {}
 void LocationInfoFilter::setOption(  const LogString& option,
 	const LogString& value)
 {
-	LogLog::warn(option + ":" + value);
+	LogLog::warn(option + LOG4CXX_STR(":") + value);
 	if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("ACCEPTONMATCH"), LOG4CXX_STR("acceptonmatch")))
 	{
 		priv->acceptOnMatch = OptionConverter::toBoolean(value, priv->acceptOnMatch);
@@ -71,7 +72,8 @@ void LocationInfoFilter::setOption(  const LogString& option,
 	}
 	else if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("METHOD"), LOG4CXX_STR("method")))
 	{
-		priv->methodName = value;
+		LOG4CXX_ENCODE_CHAR(sName, value);
+		priv->methodName = sName;
 	}
 }
 
@@ -134,5 +136,6 @@ void LocationInfoFilter::setLineNumber(int lineNum){
 }
 
 void LocationInfoFilter::setMethodName(const LogString& methodName){
-	priv->methodName = methodName;
+	LOG4CXX_ENCODE_CHAR(sName, methodName);
+	priv->methodName = sName;
 }
diff --git a/src/main/cpp/loglog.cpp b/src/main/cpp/loglog.cpp
index 55929fd8..e9977197 100644
--- a/src/main/cpp/loglog.cpp
+++ b/src/main/cpp/loglog.cpp
@@ -48,7 +48,7 @@ struct LogLog::LogLogPrivate {
 LogLog::LogLog() :
 	m_priv(std::make_unique<LogLogPrivate>())
 {
-	LogString log4cxxDebug = OptionConverter::getSystemProperty(LOG4CXX_STR("LOG4CXX_DEBUG"), "false");
+	LogString log4cxxDebug = OptionConverter::getSystemProperty(LOG4CXX_STR("LOG4CXX_DEBUG"), LOG4CXX_STR("false"));
 	m_priv->debugEnabled = OptionConverter::toBoolean(log4cxxDebug, false);
 }
 
diff --git a/src/main/cpp/patternlayout.cpp b/src/main/cpp/patternlayout.cpp
index b2f6c56b..08260190 100644
--- a/src/main/cpp/patternlayout.cpp
+++ b/src/main/cpp/patternlayout.cpp
@@ -140,7 +140,7 @@ void PatternLayout::setOption(const LogString& option, const LogString& value)
 											LOG4CXX_STR("ERRORCOLOR"),
 											LOG4CXX_STR("errorcolor"))){
 		m_priv->m_errorColor = value;
-		LogLog::debug("Setting error color to ");
+		LogLog::debug(LOG4CXX_STR("Setting error color to "));
 		LogLog::debug(value);
 	}else if(StringHelper::equalsIgnoreCase(option,
 											LOG4CXX_STR("FATALCOLOR"),
diff --git a/src/main/cpp/propertyconfigurator.cpp b/src/main/cpp/propertyconfigurator.cpp
index 2ece4d1a..72a3c920 100644
--- a/src/main/cpp/propertyconfigurator.cpp
+++ b/src/main/cpp/propertyconfigurator.cpp
@@ -103,8 +103,9 @@ spi::ConfigurationStatus PropertyConfigurator::doConfigure(const File& configFil
 	}
 	catch (const IOException& ex)
 	{
+		LOG4CXX_DECODE_CHAR(lsMsg, ex.what());
 		LogLog::error(((LogString) LOG4CXX_STR("Could not read configuration file ["))
-			+ configFileName.getPath() + LOG4CXX_STR("].") + ": " + ex.what());
+			+ configFileName.getPath() + LOG4CXX_STR("]: ") + lsMsg);
 		return spi::ConfigurationStatus::NotConfigured;
 	}
 
@@ -118,7 +119,7 @@ spi::ConfigurationStatus PropertyConfigurator::doConfigure(const File& configFil
 	catch (const std::exception& ex)
 	{
 		LogLog::error(((LogString) LOG4CXX_STR("Could not parse configuration file ["))
-			+ configFileName.getPath() + LOG4CXX_STR("]."), ex);
+			+ configFileName.getPath() + LOG4CXX_STR("]: "), ex);
 	}
 
 	return spi::ConfigurationStatus::NotConfigured;
diff --git a/src/main/cpp/rollingfileappender.cpp b/src/main/cpp/rollingfileappender.cpp
index 52b940aa..df553777 100644
--- a/src/main/cpp/rollingfileappender.cpp
+++ b/src/main/cpp/rollingfileappender.cpp
@@ -336,12 +336,11 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 								}
 								catch (std::exception& ex)
 								{
+									LOG4CXX_DECODE_CHAR(lsMsg, ex.what());
 									LogString errorMsg = LOG4CXX_STR("Exception on rollover: ");
-									errorMsg.append(ex.what());
+									errorMsg.append(lsMsg);
 									LogLog::error(errorMsg);
-									LogString exmsg;
-									log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
-									_priv->errorHandler->error(exmsg, ex, 0);
+									_priv->errorHandler->error(lsMsg, ex, 0);
 								}
 							}
 
@@ -399,12 +398,11 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 								}
 								catch (std::exception& ex)
 								{
+									LOG4CXX_DECODE_CHAR(lsMsg, ex.what());
 									LogString errorMsg = LOG4CXX_STR("Exception during rollover: ");
-									errorMsg.append(ex.what());
+									errorMsg.append(lsMsg);
 									LogLog::warn(errorMsg);
-									LogString exmsg;
-									log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
-									_priv->errorHandler->error(exmsg, ex, 0);
+									_priv->errorHandler->error(lsMsg, ex, 0);
 								}
 							}
 
@@ -437,12 +435,11 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 				}
 				catch (std::exception& ex)
 				{
+					LOG4CXX_DECODE_CHAR(lsMsg, ex.what());
 					LogString errorMsg = LOG4CXX_STR("Exception during rollover: ");
-					errorMsg.append(ex.what());
+					errorMsg.append(lsMsg);
 					LogLog::warn(errorMsg);
-					LogString exmsg;
-					log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
-					_priv->errorHandler->error(exmsg, ex, 0);
+					_priv->errorHandler->error(lsMsg, ex, 0);
 				}
 		}
 	}
@@ -473,12 +470,11 @@ void RollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
 		}
 		catch (std::exception& ex)
 		{
+			LOG4CXX_DECODE_CHAR(lsMsg, ex.what());
 			LogString errorMsg = LOG4CXX_STR("Exception during rollover attempt: ");
-			errorMsg.append(ex.what());
+			errorMsg.append(lsMsg);
 			LogLog::warn(errorMsg);
-			LogString exmsg;
-			log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
-			_priv->errorHandler->error(exmsg);
+			_priv->errorHandler->error(lsMsg);
 		}
 	}
 
diff --git a/src/main/cpp/threadutility.cpp b/src/main/cpp/threadutility.cpp
index a3c59737..a04a90a2 100644
--- a/src/main/cpp/threadutility.cpp
+++ b/src/main/cpp/threadutility.cpp
@@ -21,6 +21,7 @@
 #endif
 #include "log4cxx/private/log4cxx_private.h"
 #include "log4cxx/helpers/loglog.h"
+#include "log4cxx/helpers/transcoder.h"
 
 #include <signal.h>
 #include <mutex>
diff --git a/src/test/cpp/filter/locationinfofiltertest.cpp b/src/test/cpp/filter/locationinfofiltertest.cpp
index 4e0a12db..402b97a5 100644
--- a/src/test/cpp/filter/locationinfofiltertest.cpp
+++ b/src/test/cpp/filter/locationinfofiltertest.cpp
@@ -122,7 +122,7 @@ public:
 				li));
 		LocationInfoFilterPtr filter(new LocationInfoFilter());
 		filter->setLineNumber(50);
-		filter->setMethodName("exampleFun");
+		filter->setMethodName(LOG4CXX_STR("exampleFun"));
 		filter->setAcceptOnMatch(true);
 		filter->setMustMatchAll(true);
 		Pool p;
diff --git a/src/test/cpp/pattern/colorstartpatternconvertertest.cpp b/src/test/cpp/pattern/colorstartpatternconvertertest.cpp
index 0bf6a662..e2f85e52 100644
--- a/src/test/cpp/pattern/colorstartpatternconvertertest.cpp
+++ b/src/test/cpp/pattern/colorstartpatternconvertertest.cpp
@@ -77,10 +77,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(red)");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(red)"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[;31m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[;31m"), outputString);
 	}
 
 	void testParseBackground()
@@ -95,10 +95,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("bg(red)");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("bg(red)"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[;41m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[;41m"), outputString);
 	}
 
 	void testParseForegroundAndBackground()
@@ -113,10 +113,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(green)|bg(red)");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(green)|bg(red)"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[;32;41m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[;32;41m"), outputString);
 	}
 
 	void testParseUnbalancedParens1(){
@@ -130,10 +130,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(green))");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(green))"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[m"), outputString);
 	}
 
 	void testParseUnbalancedParens2(){
@@ -147,10 +147,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(green");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(green"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[m"), outputString);
 	}
 
 	void testParseUnbalancedParens3(){
@@ -164,12 +164,12 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(green|bg(red)");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(green|bg(red)"));
 		colorPatternConverter.format(event, outputString, p);
 
 		// The background should be parsed correctly, but since the foreground
 		// is bad it will not work
-		LOGUNIT_ASSERT_EQUAL("\x1b[;41m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[;41m"), outputString);
 	}
 
 	void testANSICode(){
@@ -183,10 +183,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("\\x1b[34;40m");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("\\x1b[34;40m"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[34;40m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[34;40m"), outputString);
 	}
 
 	void testInvalidANSICode(){
@@ -200,10 +200,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("\\x1b");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("\\x1b"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR(""), outputString);
 	}
 
 	void testUnterminatedANSICode(){
@@ -217,10 +217,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("\\x1b[31");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("\\x1b[31"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR(""), outputString);
 	}
 
 	void testForegroundBackgroundBlink(){
@@ -234,10 +234,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(white)|bg(black)|blinking");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(white)|bg(black)|blinking"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[;37;40;5m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[;37;40;5m"), outputString);
 	}
 
 	void testClearColor(){
@@ -251,11 +251,11 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(white)|bg(black)|blinking");
-		colorPatternConverter.setInfoColor("");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(white)|bg(black)|blinking"));
+		colorPatternConverter.setInfoColor(LOG4CXX_STR(""));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR(""), outputString);
 	}
 
 };
diff --git a/src/test/cpp/pattern/patternparsertestcase.cpp b/src/test/cpp/pattern/patternparsertestcase.cpp
index 3b41a83e..b88137e0 100644
--- a/src/test/cpp/pattern/patternparsertestcase.cpp
+++ b/src/test/cpp/pattern/patternparsertestcase.cpp
@@ -29,6 +29,7 @@
 #include <log4cxx/pattern/patternconverter.h>
 #include <log4cxx/helpers/relativetimedateformat.h>
 #include <log4cxx/helpers/simpledateformat.h>
+#include <log4cxx/helpers/transcoder.h>
 
 
 #include <log4cxx/pattern/loggerpatternconverter.h>