// Copyright 2013-2023 Daniel Parker // Distributed under the Boost license, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See https://github.com/danielaparker/jsoncons for latest version #ifndef JSONCONS_JSONPATH_UTILITIES_HPP #define JSONCONS_JSONPATH_UTILITIES_HPP #include #include #include #include // std::is_const #include // std::numeric_limits #include // std::move #include // std::copy #include // std::back_inserter namespace jsoncons { namespace jsonpath { template std::size_t escape_string(const CharT* s, std::size_t length, Sink& sink) { std::size_t count = 0; const CharT* begin = s; const CharT* end = s + length; for (const CharT* it = begin; it != end; ++it) { CharT c = *it; switch (c) { case '\\': sink.push_back('\\'); sink.push_back('\\'); count += 2; break; case '\'': sink.push_back('\\'); sink.push_back('\''); count += 2; break; case '\b': sink.push_back('\\'); sink.push_back('b'); count += 2; break; case '\f': sink.push_back('\\'); sink.push_back('f'); count += 2; break; case '\n': sink.push_back('\\'); sink.push_back('n'); count += 2; break; case '\r': sink.push_back('\\'); sink.push_back('r'); count += 2; break; case '\t': sink.push_back('\\'); sink.push_back('t'); count += 2; break; default: sink.push_back(c); ++count; break; } } return count; } }} #endif