|
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