From 50a2e7c44f5112cb9800f496132a7cf1ceb2a0ec Mon Sep 17 00:00:00 2001
From: Michel Juillard <michel.juillard@mjui.fr>
Date: Sat, 30 May 2020 19:58:30 +0200
Subject: [PATCH] Add escape codes in NativeStatement and VerbatimStatement
 writeJsonOutput() method

---
 src/Statement.cc | 84 +++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 80 insertions(+), 4 deletions(-)

diff --git a/src/Statement.cc b/src/Statement.cc
index 6dbb996d..4e7afa1b 100644
--- a/src/Statement.cc
+++ b/src/Statement.cc
@@ -61,8 +61,46 @@ void
 NativeStatement::writeJsonOutput(ostream &output) const
 {
   output << R"({"statementName": "native")"
-         << R"(, "string": ")" << native_statement << R"(")"
-         << "}";
+         << R"(, "string": ")";
+
+  // A similar code is in VerbatimStatement::writeJsonOutput()
+  for (auto ch : native_statement)
+    switch (ch)
+      {
+      case '\b':
+	output << R"(\b)";
+	break;
+
+      case '\f':
+	output << R"(\f)";
+	break;
+
+      case '\n':
+	output << R"(\n)";
+	break;
+
+      case '\r':
+	output << R"(\r)";
+	break;
+
+      case '\t':
+	output << R"(\t)";
+	break;
+
+      case '"':
+	output << R"(\")";
+	break;
+
+      case '\\':
+	output << R"(\\)";
+        break;
+
+      default:
+	output << ch;
+	break;
+      }
+
+  output << R"("})";
 }
 
 VerbatimStatement::VerbatimStatement(string verbatim_statement_arg) :
@@ -80,8 +118,46 @@ void
 VerbatimStatement::writeJsonOutput(ostream &output) const
 {
   output << R"({"statementName": "verbatim")"
-         << R"(, "string": ")" << verbatim_statement << R"(")"
-         << "}";
+         << R"(, "string": ")";
+
+  // A similar code is in NativeStatement::writeJsonOutput()
+  for (auto ch : verbatim_statement)
+    switch (ch)
+      {
+      case '\b':
+	output << R"(\b)";
+	break;
+
+      case '\f':
+	output << R"(\f)";
+	break;
+
+      case '\n':
+	output << R"(\n)";
+	break;
+
+      case '\r':
+	output << R"(\r)";
+	break;
+
+      case '\t':
+	output << R"(\t)";
+	break;
+
+      case '"':
+	output << R"(\")";
+	break;
+
+      case '\\':
+	output << R"(\\)";
+        break;
+
+      default:
+	output << ch;
+	break;
+      }
+
+  output << R"("})";
 }
 
 void
-- 
GitLab