|
16 | 16 | #include <cstring>
|
17 | 17 | #include <cstdint>
|
18 | 18 |
|
| 19 | +#ifdef BOOST_JSON_BIG_ENDIAN |
| 20 | +# define BOOST_JSON_MK_NUM4(b4, b3, b2, b1) 0x ## b1 ## b2 ## b3 ## b4 |
| 21 | +#else |
| 22 | +# define BOOST_JSON_MK_NUM4(b4, b3, b2, b1) 0x ## b4 ## b3 ## b2 ## b1 |
| 23 | +#endif |
| 24 | + |
19 | 25 | namespace boost {
|
20 | 26 | namespace json {
|
21 | 27 | namespace detail {
|
@@ -74,46 +80,55 @@ inline
|
74 | 80 | bool
|
75 | 81 | is_valid_utf8(const char* p, uint16_t first)
|
76 | 82 | {
|
77 |
| - uint32_t v; |
| 83 | + std::uint32_t v = 0; |
78 | 84 | switch(first >> 8)
|
79 | 85 | {
|
80 | 86 | default:
|
81 | 87 | return false;
|
82 | 88 |
|
83 | 89 | // 2 bytes, second byte [80, BF]
|
84 | 90 | case 1:
|
85 |
| - v = load_little_endian<2>(p); |
86 |
| - return (v & 0xC000) == 0x8000; |
| 91 | + std::memcpy(&v, p, 2); |
| 92 | + return ( v & BOOST_JSON_MK_NUM4(00,00,C0,00) ) |
| 93 | + == BOOST_JSON_MK_NUM4(00,00,80,00); |
87 | 94 |
|
88 | 95 | // 3 bytes, second byte [A0, BF]
|
89 | 96 | case 2:
|
90 |
| - v = load_little_endian<3>(p); |
91 |
| - return (v & 0xC0E000) == 0x80A000; |
| 97 | + std::memcpy(&v, p, 3); |
| 98 | + return ( v & BOOST_JSON_MK_NUM4(00,C0,E0,00) ) |
| 99 | + == BOOST_JSON_MK_NUM4(00,80,A0,00); |
92 | 100 |
|
93 | 101 | // 3 bytes, second byte [80, BF]
|
94 | 102 | case 3:
|
95 |
| - v = load_little_endian<3>(p); |
96 |
| - return (v & 0xC0C000) == 0x808000; |
| 103 | + std::memcpy(&v, p, 3); |
| 104 | + return ( v & BOOST_JSON_MK_NUM4(00,C0,C0,00) ) |
| 105 | + == BOOST_JSON_MK_NUM4(00,80,80,00); |
97 | 106 |
|
98 | 107 | // 3 bytes, second byte [80, 9F]
|
99 | 108 | case 4:
|
100 |
| - v = load_little_endian<3>(p); |
101 |
| - return (v & 0xC0E000) == 0x808000; |
| 109 | + std::memcpy(&v, p, 3); |
| 110 | + return ( v & BOOST_JSON_MK_NUM4(00,C0,E0,00) ) |
| 111 | + == BOOST_JSON_MK_NUM4(00,80,80,00); |
102 | 112 |
|
103 | 113 | // 4 bytes, second byte [90, BF]
|
104 | 114 | case 5:
|
105 |
| - v = load_little_endian<4>(p); |
106 |
| - return (v & 0xC0C0FF00) + 0x7F7F7000 <= 0x2F00; |
| 115 | + std::memcpy(&v, p, 4); |
| 116 | + return ( |
| 117 | + ( v & BOOST_JSON_MK_NUM4(C0, C0, C0, 00) ) |
| 118 | + == BOOST_JSON_MK_NUM4(80, 80, 80, 00) ) |
| 119 | + && ( v & BOOST_JSON_MK_NUM4(00, 00, 30, 00) ); |
107 | 120 |
|
108 | 121 | // 4 bytes, second byte [80, BF]
|
109 | 122 | case 6:
|
110 |
| - v = load_little_endian<4>(p); |
111 |
| - return (v & 0xC0C0C000) == 0x80808000; |
| 123 | + std::memcpy(&v, p, 4); |
| 124 | + return ( v & BOOST_JSON_MK_NUM4(C0,C0,C0,00) ) |
| 125 | + == BOOST_JSON_MK_NUM4(80,80,80,00); |
112 | 126 |
|
113 | 127 | // 4 bytes, second byte [80, 8F]
|
114 | 128 | case 7:
|
115 |
| - v = load_little_endian<4>(p); |
116 |
| - return (v & 0xC0C0F000) == 0x80808000; |
| 129 | + std::memcpy(&v, p, 4); |
| 130 | + return ( v & BOOST_JSON_MK_NUM4(C0,C0,F0,00) ) |
| 131 | + == BOOST_JSON_MK_NUM4(80,80,80,00); |
117 | 132 | }
|
118 | 133 | }
|
119 | 134 |
|
|
0 commit comments