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 2025/07/21 03:22:30 UTC

(logging-log4cxx) branch escape_control_chars created (now 72897f71)

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

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


      at 72897f71 Escape control characters in JSONLayout data

This branch includes the following new commits:

     new 72897f71 Escape control characters in JSONLayout data

The 1 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) 01/01: Escape control characters in JSONLayout data

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

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

commit 72897f71fcf717b6c5d2d961457401325e304c68
Author: Stephen Webb <sw...@gmail.com>
AuthorDate: Mon Jul 21 13:22:09 2025 +1000

    Escape control characters in JSONLayout data
---
 src/main/cpp/jsonlayout.cpp     | 48 ++++++++++++++++-------------------------
 src/test/cpp/jsonlayouttest.cpp |  7 ++++++
 2 files changed, 26 insertions(+), 29 deletions(-)

diff --git a/src/main/cpp/jsonlayout.cpp b/src/main/cpp/jsonlayout.cpp
index d8d062d7..e8668610 100644
--- a/src/main/cpp/jsonlayout.cpp
+++ b/src/main/cpp/jsonlayout.cpp
@@ -218,29 +218,24 @@ void JSONLayout::appendItem(const LogString& input, LogString& buf)
 	/* add leading quote */
 	buf.push_back(0x22);
 
-	logchar specialChars[] =
-	{
-		0x08,   /* \b backspace         */
-		0x09,   /* \t tab               */
-		0x0a,   /* \n newline           */
-		0x0c,   /* \f form feed         */
-		0x0d,   /* \r carriage return   */
-		0x22,   /* \" double quote      */
-		0x5c,   /* \\ backslash         */
-		0x00    /* terminating NULL for C-strings */
-	};
-
 	size_t start = 0;
-	size_t found = input.find_first_of(specialChars, start);
+	size_t index = 0;
 
-	while (found != LogString::npos)
+	for (int ch : input)
 	{
-		if (found > start)
+		if (0x22 == ch || 0x5c == ch)
+			;
+		else if (0x20 <= ch)
+		{
+			++index;
+			continue;
+		}
+		if (index > start)
 		{
-			buf.append(input, start, found - start);
+			buf.append(input, start, index - start);
 		}
 
-		switch (input[found])
+		switch (input[index])
 		{
 			case 0x08:
 				/* \b backspace */
@@ -285,20 +280,15 @@ void JSONLayout::appendItem(const LogString& input, LogString& buf)
 				break;
 
 			default:
-				buf.push_back(input[found]);
+				buf.push_back(0x5c);
+				buf.push_back(0x75); // 'u'
+				buf.push_back(((ch & 0xF000) >> 12) + 0x30);
+				buf.push_back(((ch & 0xF00) >> 8) + 0x30);
+				buf.push_back(((ch & 0xF0) >> 4) + 0x30);
+				buf.push_back((ch & 0xF) + 0x30);
 				break;
 		}
-
-		start = found + 1;
-
-		if (found < input.size())
-		{
-			found = input.find_first_of(specialChars, start);
-		}
-		else
-		{
-			found = LogString::npos;
-		}
+		start = ++index;
 	}
 
 	if (start < input.size())
diff --git a/src/test/cpp/jsonlayouttest.cpp b/src/test/cpp/jsonlayouttest.cpp
index fda39fca..0caacdbc 100644
--- a/src/test/cpp/jsonlayouttest.cpp
+++ b/src/test/cpp/jsonlayouttest.cpp
@@ -163,6 +163,13 @@ public:
 
 		appendQuotedEscapedString(cr_escaped, cr);
 		LOGUNIT_ASSERT_EQUAL(cr_expected, cr_escaped);
+
+		logchar esc[] = {0x1e, 0x00};
+		logchar esc_expected[] = {0x22, 0x5c, 'u', 0x30, 0x30, 0x31, 0x3e, 0x22, 0x00};      /* ESC */
+		LogString esc_escaped;
+
+		appendQuotedEscapedString(esc_escaped, esc);
+		LOGUNIT_ASSERT_EQUAL(esc_expected, esc_escaped);
 	}
 
 	/**