Commit 3bcc4695 authored by Dominik Charousset's avatar Dominik Charousset

Avoid double-escaping strings in deep_to_string

parent 88210301
......@@ -37,6 +37,7 @@ set (LIBCAF_CORE_SRCS
src/concatenated_tuple.cpp
src/continue_helper.cpp
src/decorated_tuple.cpp
src/deep_to_string.cpp
src/default_attachable.cpp
src/deserializer.cpp
src/detached_threads.cpp
......
......@@ -38,26 +38,7 @@ public:
// nop
}
inline std::string operator()(const char* cstr) const {
if (cstr == nullptr || *cstr == '\0')
return "\"\"";
std::string result = "\"";
char c;
while ((c = *cstr++) != '\0') {
switch (c) {
case '\\':
result += "\\\\";
break;
case '"':
result += "\\\"";
break;
default:
result += c;
}
}
result += "\"";
return result;
}
std::string operator()(const char* cstr) const;
inline std::string operator()(char* cstr) const {
return (*this)(const_cast<const char*>(cstr));
......@@ -67,12 +48,7 @@ public:
return (*this)(str.c_str());
}
inline std::string operator()(const atom_value& x) const {
std::string result = "'";
result += to_string(x);
result += "'";
return result;
}
std::string operator()(const atom_value& x) const;
constexpr const char* operator()(const bool& x) const {
return x ? "true" : "false";
......
/******************************************************************************
* ____ _ _____ *
* / ___| / \ | ___| C++ *
* | | / _ \ | |_ Actor *
* | |___ / ___ \| _| Framework *
* \____/_/ \_|_| *
* *
* Copyright (C) 2011 - 2015 *
* Dominik Charousset <dominik.charousset (at) haw-hamburg.de> *
* *
* Distributed under the terms and conditions of the BSD 3-Clause License or *
* (at your option) under the terms and conditions of the Boost Software *
* License 1.0. See accompanying files LICENSE and LICENSE_ALTERNATIVE. *
* *
* If you did not receive a copy of the license files, see *
* http://opensource.org/licenses/BSD-3-Clause and *
* http://www.boost.org/LICENSE_1_0.txt. *
******************************************************************************/
#include "caf/deep_to_string.hpp"
namespace caf {
namespace {
bool is_escaped(const char* cstr) {
if (*cstr != '"')
return false;
char last_char = *cstr++;
for (auto c = *cstr; c != '\0'; ++cstr)
if (c == '"' && last_char != '\\')
return false;
return last_char == '"';
}
} // namespace <anonymous>
std::string deep_to_string_t::operator()(const char* cstr) const {
if (cstr == nullptr || *cstr == '\0')
return "\"\"";
if (is_escaped(cstr))
return cstr;
std::string result = "\"";
char c;
while ((c = *cstr++) != '\0') {
switch (c) {
case '\\':
result += "\\\\";
break;
case '"':
result += "\\\"";
break;
default:
result += c;
}
}
result += "\"";
return result;
}
std::string deep_to_string_t::operator()(const atom_value& x) const {
std::string result = "'";
result += to_string(x);
result += "'";
return result;
}
} // namespace caf
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment