73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| //     __ _____ _____ _____
 | |
| //  __|  |   __|     |   | |  JSON for Modern C++
 | |
| // |  |  |__   |  |  | | | |  version 3.11.3
 | |
| // |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 | |
| //
 | |
| // SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <nlohmann/detail/abi_macros.hpp>
 | |
| 
 | |
| NLOHMANN_JSON_NAMESPACE_BEGIN
 | |
| namespace detail
 | |
| {
 | |
| 
 | |
| /*!
 | |
| @brief replace all occurrences of a substring by another string
 | |
| 
 | |
| @param[in,out] s  the string to manipulate; changed so that all
 | |
|                occurrences of @a f are replaced with @a t
 | |
| @param[in]     f  the substring to replace with @a t
 | |
| @param[in]     t  the string to replace @a f
 | |
| 
 | |
| @pre The search string @a f must not be empty. **This precondition is
 | |
| enforced with an assertion.**
 | |
| 
 | |
| @since version 2.0.0
 | |
| */
 | |
| template<typename StringType>
 | |
| inline void replace_substring(StringType& s, const StringType& f,
 | |
|                               const StringType& t)
 | |
| {
 | |
|     JSON_ASSERT(!f.empty());
 | |
|     for (auto pos = s.find(f);                // find first occurrence of f
 | |
|             pos != StringType::npos;          // make sure f was found
 | |
|             s.replace(pos, f.size(), t),      // replace with t, and
 | |
|             pos = s.find(f, pos + t.size()))  // find next occurrence of f
 | |
|     {}
 | |
| }
 | |
| 
 | |
| /*!
 | |
|  * @brief string escaping as described in RFC 6901 (Sect. 4)
 | |
|  * @param[in] s string to escape
 | |
|  * @return    escaped string
 | |
|  *
 | |
|  * Note the order of escaping "~" to "~0" and "/" to "~1" is important.
 | |
|  */
 | |
| template<typename StringType>
 | |
| inline StringType escape(StringType s)
 | |
| {
 | |
|     replace_substring(s, StringType{"~"}, StringType{"~0"});
 | |
|     replace_substring(s, StringType{"/"}, StringType{"~1"});
 | |
|     return s;
 | |
| }
 | |
| 
 | |
| /*!
 | |
|  * @brief string unescaping as described in RFC 6901 (Sect. 4)
 | |
|  * @param[in] s string to unescape
 | |
|  * @return    unescaped string
 | |
|  *
 | |
|  * Note the order of escaping "~1" to "/" and "~0" to "~" is important.
 | |
|  */
 | |
| template<typename StringType>
 | |
| static void unescape(StringType& s)
 | |
| {
 | |
|     replace_substring(s, StringType{"~1"}, StringType{"/"});
 | |
|     replace_substring(s, StringType{"~0"}, StringType{"~"});
 | |
| }
 | |
| 
 | |
| }  // namespace detail
 | |
| NLOHMANN_JSON_NAMESPACE_END
 |