Ticket #5598: json_parser_write.hpp

File json_parser_write.hpp, 2.1 KB (added by shane.turner@…, 7 years ago)

Updated patch for 1.59.0

Line 
1--- /tmp/json_parser_write.hpp 2015-11-10 15:40:51.487154585 -0400
2+++ json_parser_write.hpp 2015-11-10 15:47:08.967154252 -0400
3@@ -20,6 +20,36 @@
4 namespace boost { namespace property_tree { namespace json_parser
5 {
6
7+ /*
8+ * Add specialized checks for the case where the character
9+ * class is char or unsigned char. The specialized check avoids
10+ * comparing to <= 0xFF which triggers a GCC warning about the
11+ * fact that the check is always true.
12+ *
13+ * See https://svn.boost.org/trac/boost/ticket/5598
14+ */
15+ namespace detail {
16+ template <class Ch>
17+ bool check_is_ascii(const Ch c)
18+ {
19+ return (c == 0x20 || c == 0x21 || (c >= 0x23 && c <= 0x2E) ||
20+ (c >= 0x30 && c <= 0x5B) || (c >= 0x5D && c <= 0xFF));
21+ }
22+
23+ template <>
24+ bool check_is_ascii(const char c)
25+ {
26+ return (c == 0x20 || c == 0x21 || (c >= 0x23 && c <= 0x2E) ||
27+ (c >= 0x30 && c <= 0x5B) || c >= 0x5D);
28+ }
29+
30+ template <>
31+ bool check_is_ascii(const unsigned char c)
32+ {
33+ return (c == 0x20 || c == 0x21 || (c >= 0x23 && c <= 0x2E) ||
34+ (c >= 0x30 && c <= 0x5B) || c >= 0x5D);
35+ }
36+ }
37 // Create necessary escape sequences from illegal characters
38 template<class Ch>
39 std::basic_string<Ch> create_escapes(const std::basic_string<Ch> &s)
40@@ -30,12 +60,10 @@
41 while (b != e)
42 {
43 typedef typename make_unsigned<Ch>::type UCh;
44- UCh c(*b);
45 // This assumes an ASCII superset. But so does everything in PTree.
46 // We escape everything outside ASCII, because this code can't
47 // handle high unicode characters.
48- if (c == 0x20 || c == 0x21 || (c >= 0x23 && c <= 0x2E) ||
49- (c >= 0x30 && c <= 0x5B) || (c >= 0x5D && c <= 0xFF))
50+ if (detail::check_is_ascii(*b))
51 result += *b;
52 else if (*b == Ch('\b')) result += Ch('\\'), result += Ch('b');
53 else if (*b == Ch('\f')) result += Ch('\\'), result += Ch('f');