/src/jsoncons/include/jsoncons/json_parser.hpp
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright 2013-2023 Daniel Parker |
2 | | // Distributed under the Boost license, Version 1.0. |
3 | | // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
4 | | |
5 | | // See https://github.com/danielaparker/jsoncons for latest version |
6 | | |
7 | | #ifndef JSONCONS_JSON_PARSER_HPP |
8 | | #define JSONCONS_JSON_PARSER_HPP |
9 | | |
10 | | #include <memory> // std::allocator |
11 | | #include <string> |
12 | | #include <vector> |
13 | | #include <stdexcept> |
14 | | #include <system_error> |
15 | | #include <unordered_map> |
16 | | #include <limits> // std::numeric_limits |
17 | | #include <functional> // std::function |
18 | | #include <jsoncons/json_exception.hpp> |
19 | | #include <jsoncons/json_filter.hpp> |
20 | | #include <jsoncons/json_options.hpp> |
21 | | #include <jsoncons/json_visitor.hpp> |
22 | | #include <jsoncons/json_error.hpp> |
23 | | #include <jsoncons/detail/parse_number.hpp> |
24 | | |
25 | | #define JSONCONS_ILLEGAL_CONTROL_CHARACTER \ |
26 | 396 | case 0x00:case 0x01:case 0x02:case 0x03:case 0x04:case 0x05:case 0x06:case 0x07:case 0x08:case 0x0b: \ |
27 | 675 | case 0x0c:case 0x0e:case 0x0f:case 0x10:case 0x11:case 0x12:case 0x13:case 0x14:case 0x15:case 0x16: \ |
28 | 924 | case 0x17:case 0x18:case 0x19:case 0x1a:case 0x1b:case 0x1c:case 0x1d:case 0x1e:case 0x1f |
29 | | |
30 | | namespace jsoncons { |
31 | | |
32 | | namespace detail { |
33 | | |
34 | | } |
35 | | |
36 | | enum class json_parse_state : uint8_t |
37 | | { |
38 | | root, |
39 | | start, |
40 | | accept, |
41 | | slash, |
42 | | slash_slash, |
43 | | slash_star, |
44 | | slash_star_star, |
45 | | expect_comma_or_end, |
46 | | object, |
47 | | expect_member_name_or_end, |
48 | | expect_member_name, |
49 | | expect_colon, |
50 | | expect_value_or_end, |
51 | | expect_value, |
52 | | array, |
53 | | string, |
54 | | member_name, |
55 | | escape, |
56 | | escape_u1, |
57 | | escape_u2, |
58 | | escape_u3, |
59 | | escape_u4, |
60 | | escape_expect_surrogate_pair1, |
61 | | escape_expect_surrogate_pair2, |
62 | | escape_u5, |
63 | | escape_u6, |
64 | | escape_u7, |
65 | | escape_u8, |
66 | | minus, |
67 | | zero, |
68 | | integer, |
69 | | fraction1, |
70 | | fraction2, |
71 | | exp1, |
72 | | exp2, |
73 | | exp3, |
74 | | n, |
75 | | nu, |
76 | | nul, |
77 | | t, |
78 | | tr, |
79 | | tru, |
80 | | f, |
81 | | fa, |
82 | | fal, |
83 | | fals, |
84 | | cr, |
85 | | done |
86 | | }; |
87 | | |
88 | | template <class CharT, class TempAllocator = std::allocator<char>> |
89 | | class basic_json_parser : public ser_context |
90 | | { |
91 | | public: |
92 | | using char_type = CharT; |
93 | | using string_view_type = typename basic_json_visitor<CharT>::string_view_type; |
94 | | private: |
95 | | struct string_maps_to_double |
96 | | { |
97 | | string_view_type s; |
98 | | |
99 | | bool operator()(const std::pair<string_view_type,double>& val) const |
100 | 0 | { |
101 | 0 | return val.first == s; |
102 | 0 | } Unexecuted instantiation: jsoncons::basic_json_parser<char, std::__1::allocator<char> >::string_maps_to_double::operator()(std::__1::pair<jsoncons::detail::basic_string_view<char, std::__1::char_traits<char> >, double> const&) const Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::string_maps_to_double::operator()(std::__1::pair<jsoncons::detail::basic_string_view<wchar_t, std::__1::char_traits<wchar_t> >, double> const&) const |
103 | | }; |
104 | | |
105 | | using temp_allocator_type = TempAllocator; |
106 | | using char_allocator_type = typename std::allocator_traits<temp_allocator_type>:: template rebind_alloc<CharT>; |
107 | | using parse_state_allocator_type = typename std::allocator_traits<temp_allocator_type>:: template rebind_alloc<json_parse_state>; |
108 | | |
109 | | static constexpr std::size_t initial_string_buffer_capacity_ = 1024; |
110 | | static constexpr std::size_t default_initial_stack_capacity_ = 100; |
111 | | |
112 | | basic_json_decode_options<char_type> options_; |
113 | | |
114 | | std::function<bool(json_errc,const ser_context&)> err_handler_; |
115 | | int initial_stack_capacity_; |
116 | | int nesting_depth_; |
117 | | uint32_t cp_; |
118 | | uint32_t cp2_; |
119 | | std::size_t line_; |
120 | | std::size_t position_; |
121 | | std::size_t mark_position_; |
122 | | std::size_t saved_position_; |
123 | | const char_type* begin_input_; |
124 | | const char_type* end_input_; |
125 | | const char_type* input_ptr_; |
126 | | json_parse_state state_; |
127 | | bool more_; |
128 | | bool done_; |
129 | | |
130 | | std::basic_string<char_type,std::char_traits<char_type>,char_allocator_type> string_buffer_; |
131 | | jsoncons::detail::chars_to to_double_; |
132 | | |
133 | | std::vector<json_parse_state,parse_state_allocator_type> state_stack_; |
134 | | std::vector<std::pair<std::basic_string<char_type>,double>> string_double_map_; |
135 | | |
136 | | // Noncopyable and nonmoveable |
137 | | basic_json_parser(const basic_json_parser&) = delete; |
138 | | basic_json_parser& operator=(const basic_json_parser&) = delete; |
139 | | |
140 | | public: |
141 | | basic_json_parser(const TempAllocator& temp_alloc = TempAllocator()) |
142 | | : basic_json_parser(basic_json_decode_options<char_type>(), default_json_parsing(), temp_alloc) |
143 | 0 | { |
144 | 0 | } |
145 | | |
146 | | basic_json_parser(std::function<bool(json_errc,const ser_context&)> err_handler, |
147 | | const TempAllocator& temp_alloc = TempAllocator()) |
148 | | : basic_json_parser(basic_json_decode_options<char_type>(), err_handler, temp_alloc) |
149 | | { |
150 | | } |
151 | | |
152 | | basic_json_parser(const basic_json_decode_options<char_type>& options, |
153 | | const TempAllocator& temp_alloc = TempAllocator()) |
154 | | : basic_json_parser(options, options.err_handler(), temp_alloc) |
155 | 5.29k | { |
156 | 5.29k | } |
157 | | |
158 | | basic_json_parser(const basic_json_decode_options<char_type>& options, |
159 | | std::function<bool(json_errc,const ser_context&)> err_handler, |
160 | | const TempAllocator& temp_alloc = TempAllocator()) |
161 | | : options_(options), |
162 | | err_handler_(err_handler), |
163 | | initial_stack_capacity_(default_initial_stack_capacity_), |
164 | | nesting_depth_(0), |
165 | | cp_(0), |
166 | | cp2_(0), |
167 | | line_(1), |
168 | | position_(0), |
169 | | mark_position_(0), |
170 | | saved_position_(0), |
171 | | begin_input_(nullptr), |
172 | | end_input_(nullptr), |
173 | | input_ptr_(nullptr), |
174 | | state_(json_parse_state::start), |
175 | | more_(true), |
176 | | done_(false), |
177 | | string_buffer_(temp_alloc), |
178 | | state_stack_(temp_alloc) |
179 | 18.3k | { |
180 | 18.3k | string_buffer_.reserve(initial_string_buffer_capacity_); |
181 | | |
182 | 18.3k | state_stack_.reserve(initial_stack_capacity_); |
183 | 18.3k | push_state(json_parse_state::root); |
184 | | |
185 | 18.3k | if (options_.enable_str_to_nan()) |
186 | 0 | { |
187 | 0 | string_double_map_.emplace_back(options_.nan_to_str(),std::nan("")); |
188 | 0 | } |
189 | 18.3k | if (options_.enable_str_to_inf()) |
190 | 0 | { |
191 | 0 | string_double_map_.emplace_back(options_.inf_to_str(),std::numeric_limits<double>::infinity()); |
192 | 0 | } |
193 | 18.3k | if (options_.enable_str_to_neginf()) |
194 | 0 | { |
195 | 0 | string_double_map_.emplace_back(options_.neginf_to_str(),-std::numeric_limits<double>::infinity()); |
196 | 0 | } |
197 | 18.3k | } |
198 | | |
199 | | bool source_exhausted() const |
200 | 77.4k | { |
201 | 77.4k | return input_ptr_ == end_input_; |
202 | 77.4k | } |
203 | | |
204 | | ~basic_json_parser() noexcept |
205 | 18.3k | { |
206 | 18.3k | } |
207 | | |
208 | | json_parse_state parent() const |
209 | 55.0M | { |
210 | 55.0M | JSONCONS_ASSERT(state_stack_.size() >= 1); |
211 | 55.0M | return state_stack_.back(); |
212 | 55.0M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parent() const jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parent() const Line | Count | Source | 209 | 55.0M | { | 210 | 55.0M | JSONCONS_ASSERT(state_stack_.size() >= 1); | 211 | 55.0M | return state_stack_.back(); | 212 | 55.0M | } |
|
213 | | |
214 | | bool done() const |
215 | 8.64k | { |
216 | 8.64k | return done_; |
217 | 8.64k | } |
218 | | |
219 | | bool enter() const |
220 | 10.9k | { |
221 | 10.9k | return state_ == json_parse_state::start; |
222 | 10.9k | } |
223 | | |
224 | | bool accept() const |
225 | 10.6k | { |
226 | 10.6k | return state_ == json_parse_state::accept || done_; |
227 | 10.6k | } |
228 | | |
229 | | bool stopped() const |
230 | 45.5k | { |
231 | 45.5k | return !more_; |
232 | 45.5k | } |
233 | | |
234 | | json_parse_state state() const |
235 | | { |
236 | | return state_; |
237 | | } |
238 | | |
239 | | bool finished() const |
240 | 9.60k | { |
241 | 9.60k | return !more_ && state_ != json_parse_state::accept; |
242 | 9.60k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::finished() const jsoncons::basic_json_parser<char, std::__1::allocator<char> >::finished() const Line | Count | Source | 240 | 9.60k | { | 241 | 9.60k | return !more_ && state_ != json_parse_state::accept; | 242 | 9.60k | } |
|
243 | | |
244 | | const char_type* first() const |
245 | | { |
246 | | return begin_input_; |
247 | | } |
248 | | |
249 | | const char_type* current() const |
250 | | { |
251 | | return input_ptr_; |
252 | | } |
253 | | |
254 | | const char_type* last() const |
255 | | { |
256 | | return end_input_; |
257 | | } |
258 | | |
259 | | void skip_space() |
260 | 376k | { |
261 | 376k | const char_type* local_input_end = end_input_; |
262 | 9.51M | while (input_ptr_ != local_input_end) |
263 | 9.51M | { |
264 | 9.51M | switch (*input_ptr_) |
265 | 9.51M | { |
266 | 9.07M | case ' ': |
267 | 9.14M | case '\t': |
268 | 9.14M | ++input_ptr_; |
269 | 9.14M | ++position_; |
270 | 9.14M | break; |
271 | 252k | case '\r': |
272 | 252k | push_state(state_); |
273 | 252k | ++input_ptr_; |
274 | 252k | ++position_; |
275 | 252k | state_ = json_parse_state::cr; |
276 | 252k | return; |
277 | 100k | case '\n': |
278 | 100k | ++input_ptr_; |
279 | 100k | ++line_; |
280 | 100k | ++position_; |
281 | 100k | mark_position_ = position_; |
282 | 100k | return; |
283 | 21.8k | default: |
284 | 21.8k | return; |
285 | 9.51M | } |
286 | 9.51M | } |
287 | 376k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::skip_space() jsoncons::basic_json_parser<char, std::__1::allocator<char> >::skip_space() Line | Count | Source | 260 | 376k | { | 261 | 376k | const char_type* local_input_end = end_input_; | 262 | 9.51M | while (input_ptr_ != local_input_end) | 263 | 9.51M | { | 264 | 9.51M | switch (*input_ptr_) | 265 | 9.51M | { | 266 | 9.07M | case ' ': | 267 | 9.14M | case '\t': | 268 | 9.14M | ++input_ptr_; | 269 | 9.14M | ++position_; | 270 | 9.14M | break; | 271 | 252k | case '\r': | 272 | 252k | push_state(state_); | 273 | 252k | ++input_ptr_; | 274 | 252k | ++position_; | 275 | 252k | state_ = json_parse_state::cr; | 276 | 252k | return; | 277 | 100k | case '\n': | 278 | 100k | ++input_ptr_; | 279 | 100k | ++line_; | 280 | 100k | ++position_; | 281 | 100k | mark_position_ = position_; | 282 | 100k | return; | 283 | 21.8k | default: | 284 | 21.8k | return; | 285 | 9.51M | } | 286 | 9.51M | } | 287 | 376k | } |
|
288 | | |
289 | | void skip_whitespace() |
290 | 438 | { |
291 | 438 | const char_type* local_input_end = end_input_; |
292 | | |
293 | 557k | while (input_ptr_ != local_input_end) |
294 | 557k | { |
295 | 557k | switch (state_) |
296 | 557k | { |
297 | 232k | case json_parse_state::cr: |
298 | 232k | ++line_; |
299 | 232k | ++position_; |
300 | 232k | mark_position_ = position_; |
301 | 232k | switch (*input_ptr_) |
302 | 232k | { |
303 | 4.28k | case '\n': |
304 | 4.28k | ++input_ptr_; |
305 | 4.28k | ++position_; |
306 | 4.28k | state_ = pop_state(); |
307 | 4.28k | break; |
308 | 227k | default: |
309 | 227k | state_ = pop_state(); |
310 | 227k | break; |
311 | 232k | } |
312 | 232k | break; |
313 | | |
314 | 325k | default: |
315 | 325k | switch (*input_ptr_) |
316 | 325k | { |
317 | 35.2k | case ' ': |
318 | 60.3k | case '\t': |
319 | 144k | case '\n': |
320 | 324k | case '\r': |
321 | 324k | skip_space(); |
322 | 324k | break; |
323 | 46 | default: |
324 | 46 | return; |
325 | 325k | } |
326 | 324k | break; |
327 | 557k | } |
328 | 557k | } |
329 | 438 | } |
330 | | |
331 | | void begin_object(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
332 | 512k | { |
333 | 512k | if (JSONCONS_UNLIKELY(++nesting_depth_ > options_.max_nesting_depth())) |
334 | 7 | { |
335 | 7 | more_ = err_handler_(json_errc::max_nesting_depth_exceeded, *this); |
336 | 7 | if (!more_) |
337 | 7 | { |
338 | 7 | ec = json_errc::max_nesting_depth_exceeded; |
339 | 7 | return; |
340 | 7 | } |
341 | 7 | } |
342 | | |
343 | 512k | push_state(json_parse_state::object); |
344 | 512k | state_ = json_parse_state::expect_member_name_or_end; |
345 | 512k | more_ = visitor.begin_object(semantic_tag::none, *this, ec); |
346 | 512k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::begin_object(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::begin_object(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 332 | 512k | { | 333 | 512k | if (JSONCONS_UNLIKELY(++nesting_depth_ > options_.max_nesting_depth())) | 334 | 7 | { | 335 | 7 | more_ = err_handler_(json_errc::max_nesting_depth_exceeded, *this); | 336 | 7 | if (!more_) | 337 | 7 | { | 338 | 7 | ec = json_errc::max_nesting_depth_exceeded; | 339 | 7 | return; | 340 | 7 | } | 341 | 7 | } | 342 | | | 343 | 512k | push_state(json_parse_state::object); | 344 | 512k | state_ = json_parse_state::expect_member_name_or_end; | 345 | 512k | more_ = visitor.begin_object(semantic_tag::none, *this, ec); | 346 | 512k | } |
|
347 | | |
348 | | void end_object(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
349 | 507k | { |
350 | 507k | if (JSONCONS_UNLIKELY(nesting_depth_ < 1)) |
351 | 18 | { |
352 | 18 | err_handler_(json_errc::unexpected_rbrace, *this); |
353 | 18 | ec = json_errc::unexpected_rbrace; |
354 | 18 | more_ = false; |
355 | 18 | return; |
356 | 18 | } |
357 | 507k | --nesting_depth_; |
358 | 507k | state_ = pop_state(); |
359 | 507k | if (state_ == json_parse_state::object) |
360 | 507k | { |
361 | 507k | more_ = visitor.end_object(*this, ec); |
362 | 507k | } |
363 | 104 | else if (state_ == json_parse_state::array) |
364 | 104 | { |
365 | 104 | err_handler_(json_errc::expected_comma_or_rbracket, *this); |
366 | 104 | ec = json_errc::expected_comma_or_rbracket; |
367 | 104 | more_ = false; |
368 | 104 | return; |
369 | 104 | } |
370 | 0 | else |
371 | 0 | { |
372 | 0 | err_handler_(json_errc::unexpected_rbrace, *this); |
373 | 0 | ec = json_errc::unexpected_rbrace; |
374 | 0 | more_ = false; |
375 | 0 | return; |
376 | 0 | } |
377 | | |
378 | 507k | if (parent() == json_parse_state::root) |
379 | 983 | { |
380 | 983 | state_ = json_parse_state::accept; |
381 | 983 | } |
382 | 506k | else |
383 | 506k | { |
384 | 506k | state_ = json_parse_state::expect_comma_or_end; |
385 | 506k | } |
386 | 507k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_object(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_object(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 349 | 507k | { | 350 | 507k | if (JSONCONS_UNLIKELY(nesting_depth_ < 1)) | 351 | 18 | { | 352 | 18 | err_handler_(json_errc::unexpected_rbrace, *this); | 353 | 18 | ec = json_errc::unexpected_rbrace; | 354 | 18 | more_ = false; | 355 | 18 | return; | 356 | 18 | } | 357 | 507k | --nesting_depth_; | 358 | 507k | state_ = pop_state(); | 359 | 507k | if (state_ == json_parse_state::object) | 360 | 507k | { | 361 | 507k | more_ = visitor.end_object(*this, ec); | 362 | 507k | } | 363 | 104 | else if (state_ == json_parse_state::array) | 364 | 104 | { | 365 | 104 | err_handler_(json_errc::expected_comma_or_rbracket, *this); | 366 | 104 | ec = json_errc::expected_comma_or_rbracket; | 367 | 104 | more_ = false; | 368 | 104 | return; | 369 | 104 | } | 370 | 0 | else | 371 | 0 | { | 372 | 0 | err_handler_(json_errc::unexpected_rbrace, *this); | 373 | 0 | ec = json_errc::unexpected_rbrace; | 374 | 0 | more_ = false; | 375 | 0 | return; | 376 | 0 | } | 377 | | | 378 | 507k | if (parent() == json_parse_state::root) | 379 | 983 | { | 380 | 983 | state_ = json_parse_state::accept; | 381 | 983 | } | 382 | 506k | else | 383 | 506k | { | 384 | 506k | state_ = json_parse_state::expect_comma_or_end; | 385 | 506k | } | 386 | 507k | } |
|
387 | | |
388 | | void begin_array(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
389 | 11.4M | { |
390 | 11.4M | if (++nesting_depth_ > options_.max_nesting_depth()) |
391 | 9 | { |
392 | 9 | more_ = err_handler_(json_errc::max_nesting_depth_exceeded, *this); |
393 | 9 | if (!more_) |
394 | 9 | { |
395 | 9 | ec = json_errc::max_nesting_depth_exceeded; |
396 | 9 | return; |
397 | 9 | } |
398 | 9 | } |
399 | | |
400 | 11.4M | push_state(json_parse_state::array); |
401 | 11.4M | state_ = json_parse_state::expect_value_or_end; |
402 | 11.4M | more_ = visitor.begin_array(semantic_tag::none, *this, ec); |
403 | 11.4M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::begin_array(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::begin_array(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 389 | 11.4M | { | 390 | 11.4M | if (++nesting_depth_ > options_.max_nesting_depth()) | 391 | 9 | { | 392 | 9 | more_ = err_handler_(json_errc::max_nesting_depth_exceeded, *this); | 393 | 9 | if (!more_) | 394 | 9 | { | 395 | 9 | ec = json_errc::max_nesting_depth_exceeded; | 396 | 9 | return; | 397 | 9 | } | 398 | 9 | } | 399 | | | 400 | 11.4M | push_state(json_parse_state::array); | 401 | 11.4M | state_ = json_parse_state::expect_value_or_end; | 402 | 11.4M | more_ = visitor.begin_array(semantic_tag::none, *this, ec); | 403 | 11.4M | } |
|
404 | | |
405 | | void end_array(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
406 | 25.8k | { |
407 | 25.8k | if (nesting_depth_ < 1) |
408 | 19 | { |
409 | 19 | err_handler_(json_errc::unexpected_rbracket, *this); |
410 | 19 | ec = json_errc::unexpected_rbracket; |
411 | 19 | more_ = false; |
412 | 19 | return; |
413 | 19 | } |
414 | 25.8k | --nesting_depth_; |
415 | 25.8k | state_ = pop_state(); |
416 | 25.8k | if (state_ == json_parse_state::array) |
417 | 25.8k | { |
418 | 25.8k | more_ = visitor.end_array(*this, ec); |
419 | 25.8k | } |
420 | 3 | else if (state_ == json_parse_state::object) |
421 | 3 | { |
422 | 3 | err_handler_(json_errc::expected_comma_or_rbrace, *this); |
423 | 3 | ec = json_errc::expected_comma_or_rbrace; |
424 | 3 | more_ = false; |
425 | 3 | return; |
426 | 3 | } |
427 | 0 | else |
428 | 0 | { |
429 | 0 | err_handler_(json_errc::unexpected_rbracket, *this); |
430 | 0 | ec = json_errc::unexpected_rbracket; |
431 | 0 | more_ = false; |
432 | 0 | return; |
433 | 0 | } |
434 | 25.8k | if (parent() == json_parse_state::root) |
435 | 415 | { |
436 | 415 | state_ = json_parse_state::accept; |
437 | 415 | } |
438 | 25.4k | else |
439 | 25.4k | { |
440 | 25.4k | state_ = json_parse_state::expect_comma_or_end; |
441 | 25.4k | } |
442 | 25.8k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_array(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_array(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 406 | 25.8k | { | 407 | 25.8k | if (nesting_depth_ < 1) | 408 | 19 | { | 409 | 19 | err_handler_(json_errc::unexpected_rbracket, *this); | 410 | 19 | ec = json_errc::unexpected_rbracket; | 411 | 19 | more_ = false; | 412 | 19 | return; | 413 | 19 | } | 414 | 25.8k | --nesting_depth_; | 415 | 25.8k | state_ = pop_state(); | 416 | 25.8k | if (state_ == json_parse_state::array) | 417 | 25.8k | { | 418 | 25.8k | more_ = visitor.end_array(*this, ec); | 419 | 25.8k | } | 420 | 3 | else if (state_ == json_parse_state::object) | 421 | 3 | { | 422 | 3 | err_handler_(json_errc::expected_comma_or_rbrace, *this); | 423 | 3 | ec = json_errc::expected_comma_or_rbrace; | 424 | 3 | more_ = false; | 425 | 3 | return; | 426 | 3 | } | 427 | 0 | else | 428 | 0 | { | 429 | 0 | err_handler_(json_errc::unexpected_rbracket, *this); | 430 | 0 | ec = json_errc::unexpected_rbracket; | 431 | 0 | more_ = false; | 432 | 0 | return; | 433 | 0 | } | 434 | 25.8k | if (parent() == json_parse_state::root) | 435 | 415 | { | 436 | 415 | state_ = json_parse_state::accept; | 437 | 415 | } | 438 | 25.4k | else | 439 | 25.4k | { | 440 | 25.4k | state_ = json_parse_state::expect_comma_or_end; | 441 | 25.4k | } | 442 | 25.8k | } |
|
443 | | |
444 | | void reinitialize() |
445 | | { |
446 | | reset(); |
447 | | cp_ = 0; |
448 | | cp2_ = 0; |
449 | | saved_position_ = 0; |
450 | | begin_input_ = nullptr; |
451 | | end_input_ = nullptr; |
452 | | input_ptr_ = nullptr; |
453 | | string_buffer_.clear(); |
454 | | } |
455 | | |
456 | | void reset() |
457 | 9.74k | { |
458 | 9.74k | state_stack_.clear(); |
459 | 9.74k | state_stack_.reserve(initial_stack_capacity_); |
460 | 9.74k | push_state(json_parse_state::root); |
461 | 9.74k | state_ = json_parse_state::start; |
462 | 9.74k | more_ = true; |
463 | 9.74k | done_ = false; |
464 | 9.74k | line_ = 1; |
465 | 9.74k | position_ = 0; |
466 | 9.74k | mark_position_ = 0; |
467 | 9.74k | nesting_depth_ = 0; |
468 | 9.74k | } |
469 | | |
470 | | void restart() |
471 | 5.30k | { |
472 | 5.30k | more_ = true; |
473 | 5.30k | } |
474 | | |
475 | | void check_done() |
476 | 2.27k | { |
477 | 2.27k | std::error_code ec; |
478 | 2.27k | check_done(ec); |
479 | 2.27k | if (ec) |
480 | 133 | { |
481 | 133 | JSONCONS_THROW(ser_error(ec,line_,column())); |
482 | 133 | } |
483 | 2.27k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::check_done() jsoncons::basic_json_parser<char, std::__1::allocator<char> >::check_done() Line | Count | Source | 476 | 2.27k | { | 477 | 2.27k | std::error_code ec; | 478 | 2.27k | check_done(ec); | 479 | 2.27k | if (ec) | 480 | 133 | { | 481 | 133 | JSONCONS_THROW(ser_error(ec,line_,column())); | 482 | 133 | } | 483 | 2.27k | } |
|
484 | | |
485 | | void check_done(std::error_code& ec) |
486 | 5.57k | { |
487 | 25.9k | for (; input_ptr_ != end_input_; ++input_ptr_) |
488 | 20.6k | { |
489 | 20.6k | char_type curr_char_ = *input_ptr_; |
490 | 20.6k | switch (curr_char_) |
491 | 20.6k | { |
492 | 512 | case '\n': |
493 | 2.19k | case '\r': |
494 | 2.39k | case '\t': |
495 | 20.3k | case ' ': |
496 | 20.3k | break; |
497 | 241 | default: |
498 | 241 | more_ = err_handler_(json_errc::extra_character, *this); |
499 | 241 | if (!more_) |
500 | 241 | { |
501 | 241 | ec = json_errc::extra_character; |
502 | 241 | return; |
503 | 241 | } |
504 | 0 | break; |
505 | 20.6k | } |
506 | 20.6k | } |
507 | 5.57k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::check_done(std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::check_done(std::__1::error_code&) Line | Count | Source | 486 | 5.57k | { | 487 | 25.9k | for (; input_ptr_ != end_input_; ++input_ptr_) | 488 | 20.6k | { | 489 | 20.6k | char_type curr_char_ = *input_ptr_; | 490 | 20.6k | switch (curr_char_) | 491 | 20.6k | { | 492 | 512 | case '\n': | 493 | 2.19k | case '\r': | 494 | 2.39k | case '\t': | 495 | 20.3k | case ' ': | 496 | 20.3k | break; | 497 | 241 | default: | 498 | 241 | more_ = err_handler_(json_errc::extra_character, *this); | 499 | 241 | if (!more_) | 500 | 241 | { | 501 | 241 | ec = json_errc::extra_character; | 502 | 241 | return; | 503 | 241 | } | 504 | 0 | break; | 505 | 20.6k | } | 506 | 20.6k | } | 507 | 5.57k | } |
|
508 | | |
509 | | void update(const string_view_type sv) |
510 | | { |
511 | | update(sv.data(),sv.length()); |
512 | | } |
513 | | |
514 | | void update(const char_type* data, std::size_t length) |
515 | 29.4k | { |
516 | 29.4k | begin_input_ = data; |
517 | 29.4k | end_input_ = data + length; |
518 | 29.4k | input_ptr_ = begin_input_; |
519 | 29.4k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::update(wchar_t const*, unsigned long) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::update(char const*, unsigned long) Line | Count | Source | 515 | 29.4k | { | 516 | 29.4k | begin_input_ = data; | 517 | 29.4k | end_input_ = data + length; | 518 | 29.4k | input_ptr_ = begin_input_; | 519 | 29.4k | } |
|
520 | | |
521 | | void parse_some(basic_json_visitor<char_type>& visitor) |
522 | 5.28k | { |
523 | 5.28k | std::error_code ec; |
524 | 5.28k | parse_some(visitor, ec); |
525 | 5.28k | if (ec) |
526 | 1.10k | { |
527 | 1.10k | JSONCONS_THROW(ser_error(ec,line_,column())); |
528 | 1.10k | } |
529 | 5.28k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_some(jsoncons::basic_json_visitor<wchar_t>&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_some(jsoncons::basic_json_visitor<char>&) Line | Count | Source | 522 | 5.28k | { | 523 | 5.28k | std::error_code ec; | 524 | 5.28k | parse_some(visitor, ec); | 525 | 5.28k | if (ec) | 526 | 1.10k | { | 527 | 1.10k | JSONCONS_THROW(ser_error(ec,line_,column())); | 528 | 1.10k | } | 529 | 5.28k | } |
|
530 | | |
531 | | void parse_some(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
532 | 49.1k | { |
533 | 49.1k | parse_some_(visitor, ec); |
534 | 49.1k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_some(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_some(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 532 | 49.1k | { | 533 | 49.1k | parse_some_(visitor, ec); | 534 | 49.1k | } |
|
535 | | |
536 | | void finish_parse(basic_json_visitor<char_type>& visitor) |
537 | 4.18k | { |
538 | 4.18k | std::error_code ec; |
539 | 4.18k | finish_parse(visitor, ec); |
540 | 4.18k | if (ec) |
541 | 1.91k | { |
542 | 1.91k | JSONCONS_THROW(ser_error(ec,line_,column())); |
543 | 1.91k | } |
544 | 4.18k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::finish_parse(jsoncons::basic_json_visitor<wchar_t>&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::finish_parse(jsoncons::basic_json_visitor<char>&) Line | Count | Source | 537 | 4.18k | { | 538 | 4.18k | std::error_code ec; | 539 | 4.18k | finish_parse(visitor, ec); | 540 | 4.18k | if (ec) | 541 | 1.91k | { | 542 | 1.91k | JSONCONS_THROW(ser_error(ec,line_,column())); | 543 | 1.91k | } | 544 | 4.18k | } |
|
545 | | |
546 | | void finish_parse(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
547 | 4.18k | { |
548 | 9.60k | while (!finished()) |
549 | 5.41k | { |
550 | 5.41k | parse_some(visitor, ec); |
551 | 5.41k | } |
552 | 4.18k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::finish_parse(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::finish_parse(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 547 | 4.18k | { | 548 | 9.60k | while (!finished()) | 549 | 5.41k | { | 550 | 5.41k | parse_some(visitor, ec); | 551 | 5.41k | } | 552 | 4.18k | } |
|
553 | | |
554 | | void parse_some_(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
555 | 49.1k | { |
556 | 49.1k | if (state_ == json_parse_state::accept) |
557 | 7.01k | { |
558 | 7.01k | visitor.flush(); |
559 | 7.01k | done_ = true; |
560 | 7.01k | state_ = json_parse_state::done; |
561 | 7.01k | more_ = false; |
562 | 7.01k | return; |
563 | 7.01k | } |
564 | 42.1k | const char_type* local_input_end = end_input_; |
565 | | |
566 | 42.1k | if (input_ptr_ == local_input_end && more_) |
567 | 13.0k | { |
568 | 13.0k | switch (state_) |
569 | 13.0k | { |
570 | 176 | case json_parse_state::zero: |
571 | 3.44k | case json_parse_state::integer: |
572 | 3.44k | end_integer_value(visitor, ec); |
573 | 3.44k | if (ec) return; |
574 | 3.44k | break; |
575 | 3.44k | case json_parse_state::fraction2: |
576 | 3.23k | case json_parse_state::exp3: |
577 | 3.23k | end_fraction_value(visitor, ec); |
578 | 3.23k | if (ec) return; |
579 | 3.23k | break; |
580 | 3.23k | case json_parse_state::accept: |
581 | 0 | visitor.flush(); |
582 | 0 | done_ = true; |
583 | 0 | state_ = json_parse_state::done; |
584 | 0 | more_ = false; |
585 | 0 | break; |
586 | 332 | case json_parse_state::start: |
587 | 332 | case json_parse_state::done: |
588 | 332 | more_ = false; |
589 | 332 | break; |
590 | 422 | case json_parse_state::cr: |
591 | 422 | state_ = pop_state(); |
592 | 422 | break; |
593 | 5.56k | default: |
594 | 5.56k | err_handler_(json_errc::unexpected_eof, *this); |
595 | 5.56k | ec = json_errc::unexpected_eof; |
596 | 5.56k | more_ = false; |
597 | 5.56k | return; |
598 | 13.0k | } |
599 | 13.0k | } |
600 | | |
601 | 52.4M | while ((input_ptr_ < local_input_end) && more_) |
602 | 52.4M | { |
603 | 52.4M | switch (state_) |
604 | 52.4M | { |
605 | 176 | case json_parse_state::accept: |
606 | 176 | visitor.flush(); |
607 | 176 | done_ = true; |
608 | 176 | state_ = json_parse_state::done; |
609 | 176 | more_ = false; |
610 | 176 | break; |
611 | 476k | case json_parse_state::cr: |
612 | 476k | ++line_; |
613 | 476k | mark_position_ = position_; |
614 | 476k | switch (*input_ptr_) |
615 | 476k | { |
616 | 2.78k | case '\n': |
617 | 2.78k | ++input_ptr_; |
618 | 2.78k | ++position_; |
619 | 2.78k | state_ = pop_state(); |
620 | 2.78k | break; |
621 | 473k | default: |
622 | 473k | state_ = pop_state(); |
623 | 473k | break; |
624 | 476k | } |
625 | 476k | break; |
626 | 476k | case json_parse_state::start: |
627 | 70.5k | { |
628 | 70.5k | switch (*input_ptr_) |
629 | 70.5k | { |
630 | 4.72k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: |
631 | 4.72k | more_ = err_handler_(json_errc::illegal_control_character, *this); |
632 | 4.72k | if (!more_) |
633 | 230 | { |
634 | 230 | ec = json_errc::illegal_control_character; |
635 | 230 | return; |
636 | 230 | } |
637 | 0 | break; |
638 | 11.5k | case '\r': |
639 | 11.5k | push_state(state_); |
640 | 11.5k | ++input_ptr_; |
641 | 11.5k | ++position_; |
642 | 11.5k | state_ = json_parse_state::cr; |
643 | 11.5k | break; |
644 | 21.7k | case '\n': |
645 | 21.7k | ++input_ptr_; |
646 | 21.7k | ++line_; |
647 | 21.7k | ++position_; |
648 | 21.7k | mark_position_ = position_; |
649 | 21.7k | break; |
650 | 11.0k | case ' ':case '\t': |
651 | 11.0k | skip_space(); |
652 | 11.0k | break; |
653 | 8.53k | case '/': |
654 | 8.53k | ++input_ptr_; |
655 | 8.53k | ++position_; |
656 | 8.53k | push_state(state_); |
657 | 8.53k | state_ = json_parse_state::slash; |
658 | 8.53k | break; |
659 | 2.30k | case '{': |
660 | 2.30k | saved_position_ = position_; |
661 | 2.30k | ++input_ptr_; |
662 | 2.30k | ++position_; |
663 | 2.30k | begin_object(visitor, ec); |
664 | 2.30k | if (ec) return; |
665 | 2.30k | break; |
666 | 5.40k | case '[': |
667 | 5.40k | saved_position_ = position_; |
668 | 5.40k | ++input_ptr_; |
669 | 5.40k | ++position_; |
670 | 5.40k | begin_array(visitor, ec); |
671 | 5.40k | if (ec) return; |
672 | 5.40k | break; |
673 | 5.40k | case '\"': |
674 | 2.67k | state_ = json_parse_state::string; |
675 | 2.67k | saved_position_ = position_; |
676 | 2.67k | ++input_ptr_; |
677 | 2.67k | ++position_; |
678 | 2.67k | string_buffer_.clear(); |
679 | 2.67k | parse_string(visitor, ec); |
680 | 2.67k | if (ec) return; |
681 | 2.02k | break; |
682 | 2.02k | case '-': |
683 | 1.25k | string_buffer_.clear(); |
684 | 1.25k | string_buffer_.push_back('-'); |
685 | 1.25k | saved_position_ = position_; |
686 | 1.25k | ++input_ptr_; |
687 | 1.25k | ++position_; |
688 | 1.25k | state_ = json_parse_state::minus; |
689 | 1.25k | parse_number(visitor, ec); |
690 | 1.25k | if (ec) {return;} |
691 | 1.23k | break; |
692 | 1.23k | case '0': |
693 | 331 | string_buffer_.clear(); |
694 | 331 | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
695 | 331 | state_ = json_parse_state::zero; |
696 | 331 | saved_position_ = position_; |
697 | 331 | ++input_ptr_; |
698 | 331 | ++position_; |
699 | 331 | parse_number(visitor, ec); |
700 | 331 | if (ec) {return;} |
701 | 259 | break; |
702 | 4.02k | case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': |
703 | 4.02k | string_buffer_.clear(); |
704 | 4.02k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
705 | 4.02k | saved_position_ = position_; |
706 | 4.02k | ++input_ptr_; |
707 | 4.02k | ++position_; |
708 | 4.02k | state_ = json_parse_state::integer; |
709 | 4.02k | parse_number(visitor, ec); |
710 | 4.02k | if (ec) {return;} |
711 | 3.91k | break; |
712 | 3.91k | case 'n': |
713 | 309 | parse_null(visitor, ec); |
714 | 309 | if (ec) {return;} |
715 | 124 | break; |
716 | 290 | case 't': |
717 | 290 | parse_true(visitor, ec); |
718 | 290 | if (ec) {return;} |
719 | 129 | break; |
720 | 375 | case 'f': |
721 | 375 | parse_false(visitor, ec); |
722 | 375 | if (ec) {return;} |
723 | 176 | break; |
724 | 176 | case '}': |
725 | 6 | err_handler_(json_errc::unexpected_rbrace, *this); |
726 | 6 | ec = json_errc::unexpected_rbrace; |
727 | 6 | more_ = false; |
728 | 6 | return; |
729 | 7 | case ']': |
730 | 7 | err_handler_(json_errc::unexpected_rbracket, *this); |
731 | 7 | ec = json_errc::unexpected_rbracket; |
732 | 7 | more_ = false; |
733 | 7 | return; |
734 | 352 | default: |
735 | 352 | err_handler_(json_errc::syntax_error, *this); |
736 | 352 | ec = json_errc::syntax_error; |
737 | 352 | more_ = false; |
738 | 352 | return; |
739 | 70.5k | } |
740 | 70.5k | } |
741 | 68.5k | break; |
742 | | |
743 | 3.08M | case json_parse_state::expect_comma_or_end: |
744 | 3.08M | { |
745 | 3.08M | switch (*input_ptr_) |
746 | 3.08M | { |
747 | 1.50k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: |
748 | 1.50k | more_ = err_handler_(json_errc::illegal_control_character, *this); |
749 | 1.50k | if (!more_) |
750 | 98 | { |
751 | 98 | ec = json_errc::illegal_control_character; |
752 | 98 | return; |
753 | 98 | } |
754 | 0 | ++input_ptr_; |
755 | 0 | ++position_; |
756 | 0 | break; |
757 | 47.0k | case '\r': |
758 | 47.0k | ++input_ptr_; |
759 | 47.0k | ++position_; |
760 | 47.0k | push_state(state_); |
761 | 47.0k | state_ = json_parse_state::cr; |
762 | 47.0k | break; |
763 | 12.0k | case '\n': |
764 | 12.0k | ++input_ptr_; |
765 | 12.0k | ++line_; |
766 | 12.0k | ++position_; |
767 | 12.0k | mark_position_ = position_; |
768 | 12.0k | break; |
769 | 6.20k | case ' ':case '\t': |
770 | 6.20k | skip_space(); |
771 | 6.20k | break; |
772 | 4.11k | case '/': |
773 | 4.11k | ++input_ptr_; |
774 | 4.11k | ++position_; |
775 | 4.11k | push_state(state_); |
776 | 4.11k | state_ = json_parse_state::slash; |
777 | 4.11k | break; |
778 | 13.5k | case '}': |
779 | 13.5k | saved_position_ = position_; |
780 | 13.5k | ++input_ptr_; |
781 | 13.5k | ++position_; |
782 | 13.5k | end_object(visitor, ec); |
783 | 13.5k | if (ec) return; |
784 | 13.4k | break; |
785 | 19.4k | case ']': |
786 | 19.4k | saved_position_ = position_; |
787 | 19.4k | ++input_ptr_; |
788 | 19.4k | ++position_; |
789 | 19.4k | end_array(visitor, ec); |
790 | 19.4k | if (ec) return; |
791 | 19.3k | break; |
792 | 2.97M | case ',': |
793 | 2.97M | begin_member_or_element(ec); |
794 | 2.97M | if (ec) return; |
795 | 2.97M | ++input_ptr_; |
796 | 2.97M | ++position_; |
797 | 2.97M | break; |
798 | 146 | default: |
799 | 146 | if (parent() == json_parse_state::array) |
800 | 120 | { |
801 | 120 | more_ = err_handler_(json_errc::expected_comma_or_rbracket, *this); |
802 | 120 | if (!more_) |
803 | 120 | { |
804 | 120 | ec = json_errc::expected_comma_or_rbracket; |
805 | 120 | return; |
806 | 120 | } |
807 | 120 | } |
808 | 26 | else if (parent() == json_parse_state::object) |
809 | 26 | { |
810 | 26 | more_ = err_handler_(json_errc::expected_comma_or_rbrace, *this); |
811 | 26 | if (!more_) |
812 | 26 | { |
813 | 26 | ec = json_errc::expected_comma_or_rbrace; |
814 | 26 | return; |
815 | 26 | } |
816 | 26 | } |
817 | 0 | ++input_ptr_; |
818 | 0 | ++position_; |
819 | 0 | break; |
820 | 3.08M | } |
821 | 3.08M | } |
822 | 3.08M | break; |
823 | 3.08M | case json_parse_state::expect_member_name_or_end: |
824 | 516k | { |
825 | 516k | switch (*input_ptr_) |
826 | 516k | { |
827 | 1.32k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: |
828 | 1.32k | more_ = err_handler_(json_errc::illegal_control_character, *this); |
829 | 1.32k | if (!more_) |
830 | 88 | { |
831 | 88 | ec = json_errc::illegal_control_character; |
832 | 88 | return; |
833 | 88 | } |
834 | 0 | ++input_ptr_; |
835 | 0 | ++position_; |
836 | 0 | break; |
837 | 1.02k | case '\r': |
838 | 1.02k | ++input_ptr_; |
839 | 1.02k | ++position_; |
840 | 1.02k | push_state(state_); |
841 | 1.02k | state_ = json_parse_state::cr; |
842 | 1.02k | break; |
843 | 766 | case '\n': |
844 | 766 | ++input_ptr_; |
845 | 766 | ++line_; |
846 | 766 | ++position_; |
847 | 766 | mark_position_ = position_; |
848 | 766 | break; |
849 | 1.24k | case ' ':case '\t': |
850 | 1.24k | skip_space(); |
851 | 1.24k | break; |
852 | 584 | case '/': |
853 | 584 | ++input_ptr_; |
854 | 584 | ++position_; |
855 | 584 | push_state(state_); |
856 | 584 | state_ = json_parse_state::slash; |
857 | 584 | break; |
858 | 494k | case '}': |
859 | 494k | saved_position_ = position_; |
860 | 494k | ++input_ptr_; |
861 | 494k | ++position_; |
862 | 494k | end_object(visitor, ec); |
863 | 494k | if (ec) return; |
864 | 494k | break; |
865 | 494k | case '\"': |
866 | 18.2k | saved_position_ = position_; |
867 | 18.2k | ++input_ptr_; |
868 | 18.2k | ++position_; |
869 | 18.2k | push_state(json_parse_state::member_name); |
870 | 18.2k | state_ = json_parse_state::string; |
871 | 18.2k | string_buffer_.clear(); |
872 | 18.2k | parse_string(visitor, ec); |
873 | 18.2k | if (ec) return; |
874 | 18.2k | break; |
875 | 18.2k | case '\'': |
876 | 3 | more_ = err_handler_(json_errc::single_quote, *this); |
877 | 3 | if (!more_) |
878 | 3 | { |
879 | 3 | ec = json_errc::single_quote; |
880 | 3 | return; |
881 | 3 | } |
882 | 0 | ++input_ptr_; |
883 | 0 | ++position_; |
884 | 0 | break; |
885 | 14 | default: |
886 | 14 | more_ = err_handler_(json_errc::expected_key, *this); |
887 | 14 | if (!more_) |
888 | 14 | { |
889 | 14 | ec = json_errc::expected_key; |
890 | 14 | return; |
891 | 14 | } |
892 | 0 | ++input_ptr_; |
893 | 0 | ++position_; |
894 | 0 | break; |
895 | 516k | } |
896 | 516k | } |
897 | 516k | break; |
898 | 2.03M | case json_parse_state::expect_member_name: |
899 | 2.03M | { |
900 | 2.03M | switch (*input_ptr_) |
901 | 2.03M | { |
902 | 1.36k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: |
903 | 1.36k | more_ = err_handler_(json_errc::illegal_control_character, *this); |
904 | 1.36k | if (!more_) |
905 | 90 | { |
906 | 90 | ec = json_errc::illegal_control_character; |
907 | 90 | return; |
908 | 90 | } |
909 | 0 | ++input_ptr_; |
910 | 0 | ++position_; |
911 | 0 | break; |
912 | 1.21k | case '\r': |
913 | 1.21k | ++input_ptr_; |
914 | 1.21k | ++position_; |
915 | 1.21k | push_state(state_); |
916 | 1.21k | state_ = json_parse_state::cr; |
917 | 1.21k | break; |
918 | 1.79k | case '\n': |
919 | 1.79k | ++input_ptr_; |
920 | 1.79k | ++line_; |
921 | 1.79k | ++position_; |
922 | 1.79k | mark_position_ = position_; |
923 | 1.79k | break; |
924 | 1.28k | case ' ':case '\t': |
925 | 1.28k | skip_space(); |
926 | 1.28k | break; |
927 | 605 | case '/': |
928 | 605 | ++input_ptr_; |
929 | 605 | ++position_; |
930 | 605 | push_state(state_); |
931 | 605 | state_ = json_parse_state::slash; |
932 | 605 | break; |
933 | 2.02M | case '\"': |
934 | 2.02M | saved_position_ = position_; |
935 | 2.02M | ++input_ptr_; |
936 | 2.02M | ++position_; |
937 | 2.02M | push_state(json_parse_state::member_name); |
938 | 2.02M | state_ = json_parse_state::string; |
939 | 2.02M | string_buffer_.clear(); |
940 | 2.02M | parse_string(visitor, ec); |
941 | 2.02M | if (ec) return; |
942 | 2.02M | break; |
943 | 2.02M | case '}': |
944 | 3 | more_ = err_handler_(json_errc::extra_comma, *this); |
945 | 3 | if (!more_) |
946 | 3 | { |
947 | 3 | ec = json_errc::extra_comma; |
948 | 3 | return; |
949 | 3 | } |
950 | 0 | saved_position_ = position_; |
951 | 0 | ++input_ptr_; |
952 | 0 | ++position_; |
953 | 0 | end_object(visitor, ec); // Recover |
954 | 0 | if (ec) return; |
955 | 0 | break; |
956 | 3 | case '\'': |
957 | 3 | more_ = err_handler_(json_errc::single_quote, *this); |
958 | 3 | if (!more_) |
959 | 3 | { |
960 | 3 | ec = json_errc::single_quote; |
961 | 3 | return; |
962 | 3 | } |
963 | 0 | ++input_ptr_; |
964 | 0 | ++position_; |
965 | 0 | break; |
966 | 19 | default: |
967 | 19 | more_ = err_handler_(json_errc::expected_key, *this); |
968 | 19 | if (!more_) |
969 | 19 | { |
970 | 19 | ec = json_errc::expected_key; |
971 | 19 | return; |
972 | 19 | } |
973 | 0 | ++input_ptr_; |
974 | 0 | ++position_; |
975 | 0 | break; |
976 | 2.03M | } |
977 | 2.03M | } |
978 | 2.03M | break; |
979 | 2.05M | case json_parse_state::expect_colon: |
980 | 2.05M | { |
981 | 2.05M | switch (*input_ptr_) |
982 | 2.05M | { |
983 | 1.36k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: |
984 | 1.36k | more_ = err_handler_(json_errc::illegal_control_character, *this); |
985 | 1.36k | if (!more_) |
986 | 90 | { |
987 | 90 | ec = json_errc::illegal_control_character; |
988 | 90 | return; |
989 | 90 | } |
990 | 0 | ++input_ptr_; |
991 | 0 | ++position_; |
992 | 0 | break; |
993 | 1.02k | case '\r': |
994 | 1.02k | push_state(state_); |
995 | 1.02k | state_ = json_parse_state::cr; |
996 | 1.02k | ++input_ptr_; |
997 | 1.02k | ++position_; |
998 | 1.02k | break; |
999 | 4.89k | case '\n': |
1000 | 4.89k | ++input_ptr_; |
1001 | 4.89k | ++line_; |
1002 | 4.89k | ++position_; |
1003 | 4.89k | mark_position_ = position_; |
1004 | 4.89k | break; |
1005 | 1.48k | case ' ':case '\t': |
1006 | 1.48k | skip_space(); |
1007 | 1.48k | break; |
1008 | 582 | case '/': |
1009 | 582 | push_state(state_); |
1010 | 582 | state_ = json_parse_state::slash; |
1011 | 582 | ++input_ptr_; |
1012 | 582 | ++position_; |
1013 | 582 | break; |
1014 | 2.04M | case ':': |
1015 | 2.04M | state_ = json_parse_state::expect_value; |
1016 | 2.04M | ++input_ptr_; |
1017 | 2.04M | ++position_; |
1018 | 2.04M | break; |
1019 | 30 | default: |
1020 | 30 | more_ = err_handler_(json_errc::expected_colon, *this); |
1021 | 30 | if (!more_) |
1022 | 30 | { |
1023 | 30 | ec = json_errc::expected_colon; |
1024 | 30 | return; |
1025 | 30 | } |
1026 | 0 | ++input_ptr_; |
1027 | 0 | ++position_; |
1028 | 0 | break; |
1029 | 2.05M | } |
1030 | 2.05M | } |
1031 | 2.05M | break; |
1032 | | |
1033 | 26.5M | case json_parse_state::expect_value: |
1034 | 26.5M | { |
1035 | 26.5M | switch (*input_ptr_) |
1036 | 26.5M | { |
1037 | 1.37k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: |
1038 | 1.37k | more_ = err_handler_(json_errc::illegal_control_character, *this); |
1039 | 1.37k | if (!more_) |
1040 | 90 | { |
1041 | 90 | ec = json_errc::illegal_control_character; |
1042 | 90 | return; |
1043 | 90 | } |
1044 | 0 | ++input_ptr_; |
1045 | 0 | ++position_; |
1046 | 0 | break; |
1047 | 22.1k | case '\r': |
1048 | 22.1k | push_state(state_); |
1049 | 22.1k | ++input_ptr_; |
1050 | 22.1k | ++position_; |
1051 | 22.1k | state_ = json_parse_state::cr; |
1052 | 22.1k | break; |
1053 | 30.3k | case '\n': |
1054 | 30.3k | ++input_ptr_; |
1055 | 30.3k | ++line_; |
1056 | 30.3k | ++position_; |
1057 | 30.3k | mark_position_ = position_; |
1058 | 30.3k | break; |
1059 | 7.77k | case ' ':case '\t': |
1060 | 7.77k | skip_space(); |
1061 | 7.77k | break; |
1062 | 6.06k | case '/': |
1063 | 6.06k | push_state(state_); |
1064 | 6.06k | ++input_ptr_; |
1065 | 6.06k | ++position_; |
1066 | 6.06k | state_ = json_parse_state::slash; |
1067 | 6.06k | break; |
1068 | 495k | case '{': |
1069 | 495k | saved_position_ = position_; |
1070 | 495k | ++input_ptr_; |
1071 | 495k | ++position_; |
1072 | 495k | begin_object(visitor, ec); |
1073 | 495k | if (ec) return; |
1074 | 495k | break; |
1075 | 495k | case '[': |
1076 | 264k | saved_position_ = position_; |
1077 | 264k | ++input_ptr_; |
1078 | 264k | ++position_; |
1079 | 264k | begin_array(visitor, ec); |
1080 | 264k | if (ec) return; |
1081 | 264k | break; |
1082 | 264k | case '\"': |
1083 | 72.1k | saved_position_ = position_; |
1084 | 72.1k | ++input_ptr_; |
1085 | 72.1k | ++position_; |
1086 | 72.1k | state_ = json_parse_state::string; |
1087 | 72.1k | string_buffer_.clear(); |
1088 | 72.1k | parse_string(visitor, ec); |
1089 | 72.1k | if (ec) return; |
1090 | 72.0k | break; |
1091 | 747k | case '-': |
1092 | 747k | string_buffer_.clear(); |
1093 | 747k | string_buffer_.push_back('-'); |
1094 | 747k | saved_position_ = position_; |
1095 | 747k | ++input_ptr_; |
1096 | 747k | ++position_; |
1097 | 747k | state_ = json_parse_state::minus; |
1098 | 747k | parse_number(visitor, ec); |
1099 | 747k | if (ec) {return;} |
1100 | 747k | break; |
1101 | 4.90M | case '0': |
1102 | 4.90M | string_buffer_.clear(); |
1103 | 4.90M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1104 | 4.90M | saved_position_ = position_; |
1105 | 4.90M | ++input_ptr_; |
1106 | 4.90M | ++position_; |
1107 | 4.90M | state_ = json_parse_state::zero; |
1108 | 4.90M | parse_number(visitor, ec); |
1109 | 4.90M | if (ec) {return;} |
1110 | 4.90M | break; |
1111 | 18.0M | case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': |
1112 | 18.0M | string_buffer_.clear(); |
1113 | 18.0M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1114 | 18.0M | saved_position_ = position_; |
1115 | 18.0M | ++input_ptr_; |
1116 | 18.0M | ++position_; |
1117 | 18.0M | state_ = json_parse_state::integer; |
1118 | 18.0M | parse_number(visitor, ec); |
1119 | 18.0M | if (ec) {return;} |
1120 | 18.0M | break; |
1121 | 18.0M | case 'n': |
1122 | 692k | parse_null(visitor, ec); |
1123 | 692k | if (ec) {return;} |
1124 | 692k | break; |
1125 | 878k | case 't': |
1126 | 878k | parse_true(visitor, ec); |
1127 | 878k | if (ec) {return;} |
1128 | 878k | break; |
1129 | 878k | case 'f': |
1130 | 404k | parse_false(visitor, ec); |
1131 | 404k | if (ec) {return;} |
1132 | 404k | break; |
1133 | 404k | case ']': |
1134 | 8 | saved_position_ = position_; |
1135 | 8 | ++input_ptr_; |
1136 | 8 | ++position_; |
1137 | 8 | if (parent() == json_parse_state::array) |
1138 | 5 | { |
1139 | 5 | more_ = err_handler_(json_errc::extra_comma, *this); |
1140 | 5 | if (!more_) |
1141 | 5 | { |
1142 | 5 | ec = json_errc::extra_comma; |
1143 | 5 | return; |
1144 | 5 | } |
1145 | 0 | end_array(visitor, ec); // Recover |
1146 | 0 | if (ec) return; |
1147 | 0 | } |
1148 | 3 | else |
1149 | 3 | { |
1150 | 3 | more_ = err_handler_(json_errc::expected_value, *this); |
1151 | 3 | if (!more_) |
1152 | 3 | { |
1153 | 3 | ec = json_errc::expected_value; |
1154 | 3 | return; |
1155 | 3 | } |
1156 | 3 | } |
1157 | 0 | break; |
1158 | 3 | case '\'': |
1159 | 3 | more_ = err_handler_(json_errc::single_quote, *this); |
1160 | 3 | if (!more_) |
1161 | 3 | { |
1162 | 3 | ec = json_errc::single_quote; |
1163 | 3 | return; |
1164 | 3 | } |
1165 | 0 | ++input_ptr_; |
1166 | 0 | ++position_; |
1167 | 0 | break; |
1168 | 51 | default: |
1169 | 51 | more_ = err_handler_(json_errc::expected_value, *this); |
1170 | 51 | if (!more_) |
1171 | 51 | { |
1172 | 51 | ec = json_errc::expected_value; |
1173 | 51 | return; |
1174 | 51 | } |
1175 | 0 | ++input_ptr_; |
1176 | 0 | ++position_; |
1177 | 0 | break; |
1178 | 26.5M | } |
1179 | 26.5M | } |
1180 | 26.5M | break; |
1181 | 26.5M | case json_parse_state::expect_value_or_end: |
1182 | 11.6M | { |
1183 | 11.6M | switch (*input_ptr_) |
1184 | 11.6M | { |
1185 | 1.39k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: |
1186 | 1.39k | more_ = err_handler_(json_errc::illegal_control_character, *this); |
1187 | 1.39k | if (!more_) |
1188 | 91 | { |
1189 | 91 | ec = json_errc::illegal_control_character; |
1190 | 91 | return; |
1191 | 91 | } |
1192 | 0 | ++input_ptr_; |
1193 | 0 | ++position_; |
1194 | 0 | break; |
1195 | 23.4k | case '\r': |
1196 | 23.4k | ++input_ptr_; |
1197 | 23.4k | ++position_; |
1198 | 23.4k | push_state(state_); |
1199 | 23.4k | state_ = json_parse_state::cr; |
1200 | 23.4k | break; |
1201 | 201k | case '\n': |
1202 | 201k | ++input_ptr_; |
1203 | 201k | ++line_; |
1204 | 201k | ++position_; |
1205 | 201k | mark_position_ = position_; |
1206 | 201k | break; |
1207 | 10.7k | case ' ':case '\t': |
1208 | 10.7k | skip_space(); |
1209 | 10.7k | break; |
1210 | 5.74k | case '/': |
1211 | 5.74k | ++input_ptr_; |
1212 | 5.74k | ++position_; |
1213 | 5.74k | push_state(state_); |
1214 | 5.74k | state_ = json_parse_state::slash; |
1215 | 5.74k | break; |
1216 | 14.6k | case '{': |
1217 | 14.6k | saved_position_ = position_; |
1218 | 14.6k | ++input_ptr_; |
1219 | 14.6k | ++position_; |
1220 | 14.6k | begin_object(visitor, ec); |
1221 | 14.6k | if (ec) return; |
1222 | 14.6k | break; |
1223 | 11.1M | case '[': |
1224 | 11.1M | saved_position_ = position_; |
1225 | 11.1M | ++input_ptr_; |
1226 | 11.1M | ++position_; |
1227 | 11.1M | begin_array(visitor, ec); |
1228 | 11.1M | if (ec) return; |
1229 | 11.1M | break; |
1230 | 11.1M | case ']': |
1231 | 6.47k | saved_position_ = position_; |
1232 | 6.47k | ++input_ptr_; |
1233 | 6.47k | ++position_; |
1234 | 6.47k | end_array(visitor, ec); |
1235 | 6.47k | if (ec) return; |
1236 | 6.47k | break; |
1237 | 6.47k | case '\"': |
1238 | 983 | saved_position_ = position_; |
1239 | 983 | ++input_ptr_; |
1240 | 983 | ++position_; |
1241 | 983 | state_ = json_parse_state::string; |
1242 | 983 | string_buffer_.clear(); |
1243 | 983 | parse_string(visitor, ec); |
1244 | 983 | if (ec) return; |
1245 | 972 | break; |
1246 | 111k | case '-': |
1247 | 111k | string_buffer_.clear(); |
1248 | 111k | string_buffer_.push_back('-'); |
1249 | 111k | saved_position_ = position_; |
1250 | 111k | ++input_ptr_; |
1251 | 111k | ++position_; |
1252 | 111k | state_ = json_parse_state::minus; |
1253 | 111k | parse_number(visitor, ec); |
1254 | 111k | if (ec) {return;} |
1255 | 111k | break; |
1256 | 111k | case '0': |
1257 | 7.25k | string_buffer_.clear(); |
1258 | 7.25k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1259 | 7.25k | saved_position_ = position_; |
1260 | 7.25k | ++input_ptr_; |
1261 | 7.25k | ++position_; |
1262 | 7.25k | state_ = json_parse_state::zero; |
1263 | 7.25k | parse_number(visitor, ec); |
1264 | 7.25k | if (ec) {return;} |
1265 | 7.24k | break; |
1266 | 41.0k | case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': |
1267 | 41.0k | string_buffer_.clear(); |
1268 | 41.0k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1269 | 41.0k | saved_position_ = position_; |
1270 | 41.0k | ++input_ptr_; |
1271 | 41.0k | ++position_; |
1272 | 41.0k | state_ = json_parse_state::integer; |
1273 | 41.0k | parse_number(visitor, ec); |
1274 | 41.0k | if (ec) {return;} |
1275 | 41.0k | break; |
1276 | 41.0k | case 'n': |
1277 | 9.82k | parse_null(visitor, ec); |
1278 | 9.82k | if (ec) {return;} |
1279 | 9.81k | break; |
1280 | 9.81k | case 't': |
1281 | 9.75k | parse_true(visitor, ec); |
1282 | 9.75k | if (ec) {return;} |
1283 | 9.74k | break; |
1284 | 68.1k | case 'f': |
1285 | 68.1k | parse_false(visitor, ec); |
1286 | 68.1k | if (ec) {return;} |
1287 | 68.1k | break; |
1288 | 68.1k | case '\'': |
1289 | 3 | more_ = err_handler_(json_errc::single_quote, *this); |
1290 | 3 | if (!more_) |
1291 | 3 | { |
1292 | 3 | ec = json_errc::single_quote; |
1293 | 3 | return; |
1294 | 3 | } |
1295 | 0 | ++input_ptr_; |
1296 | 0 | ++position_; |
1297 | 0 | break; |
1298 | 16 | default: |
1299 | 16 | more_ = err_handler_(json_errc::expected_value, *this); |
1300 | 16 | if (!more_) |
1301 | 16 | { |
1302 | 16 | ec = json_errc::expected_value; |
1303 | 16 | return; |
1304 | 16 | } |
1305 | 0 | ++input_ptr_; |
1306 | 0 | ++position_; |
1307 | 0 | break; |
1308 | 11.6M | } |
1309 | 11.6M | } |
1310 | 11.6M | break; |
1311 | 11.6M | case json_parse_state::string: |
1312 | 1.16M | case json_parse_state::escape: |
1313 | 1.16M | case json_parse_state::escape_u1: |
1314 | 1.17M | case json_parse_state::escape_u2: |
1315 | 1.17M | case json_parse_state::escape_u3: |
1316 | 1.17M | case json_parse_state::escape_u4: |
1317 | 1.17M | case json_parse_state::escape_expect_surrogate_pair1: |
1318 | 1.17M | case json_parse_state::escape_expect_surrogate_pair2: |
1319 | 1.17M | case json_parse_state::escape_u5: |
1320 | 1.17M | case json_parse_state::escape_u6: |
1321 | 1.17M | case json_parse_state::escape_u7: |
1322 | 1.17M | case json_parse_state::escape_u8: |
1323 | 1.17M | parse_string(visitor, ec); |
1324 | 1.17M | if (ec) return; |
1325 | 1.17M | break; |
1326 | 1.17M | case json_parse_state::minus: |
1327 | 584 | case json_parse_state::zero: |
1328 | 2.34k | case json_parse_state::integer: |
1329 | 2.46k | case json_parse_state::fraction1: |
1330 | 2.94k | case json_parse_state::fraction2: |
1331 | 3.18k | case json_parse_state::exp1: |
1332 | 3.26k | case json_parse_state::exp2: |
1333 | 3.88k | case json_parse_state::exp3: |
1334 | 3.88k | parse_number(visitor, ec); |
1335 | 3.88k | if (ec) return; |
1336 | 3.87k | break; |
1337 | 3.87k | case json_parse_state::t: |
1338 | 433 | switch (*input_ptr_) |
1339 | 433 | { |
1340 | 386 | case 'r': |
1341 | 386 | ++input_ptr_; |
1342 | 386 | ++position_; |
1343 | 386 | state_ = json_parse_state::tr; |
1344 | 386 | break; |
1345 | 47 | default: |
1346 | 47 | err_handler_(json_errc::invalid_value, *this); |
1347 | 47 | ec = json_errc::invalid_value; |
1348 | 47 | more_ = false; |
1349 | 47 | return; |
1350 | 433 | } |
1351 | 386 | break; |
1352 | 386 | case json_parse_state::tr: |
1353 | 371 | switch (*input_ptr_) |
1354 | 371 | { |
1355 | 326 | case 'u': |
1356 | 326 | state_ = json_parse_state::tru; |
1357 | 326 | break; |
1358 | 45 | default: |
1359 | 45 | err_handler_(json_errc::invalid_value, *this); |
1360 | 45 | ec = json_errc::invalid_value; |
1361 | 45 | more_ = false; |
1362 | 45 | return; |
1363 | 371 | } |
1364 | 326 | ++input_ptr_; |
1365 | 326 | ++position_; |
1366 | 326 | break; |
1367 | 312 | case json_parse_state::tru: |
1368 | 312 | switch (*input_ptr_) |
1369 | 312 | { |
1370 | 282 | case 'e': |
1371 | 282 | ++input_ptr_; |
1372 | 282 | ++position_; |
1373 | 282 | more_ = visitor.bool_value(true, semantic_tag::none, *this, ec); |
1374 | 282 | if (parent() == json_parse_state::root) |
1375 | 3 | { |
1376 | 3 | state_ = json_parse_state::accept; |
1377 | 3 | } |
1378 | 279 | else |
1379 | 279 | { |
1380 | 279 | state_ = json_parse_state::expect_comma_or_end; |
1381 | 279 | } |
1382 | 282 | break; |
1383 | 30 | default: |
1384 | 30 | err_handler_(json_errc::invalid_value, *this); |
1385 | 30 | ec = json_errc::invalid_value; |
1386 | 30 | more_ = false; |
1387 | 30 | return; |
1388 | 312 | } |
1389 | 282 | break; |
1390 | 429 | case json_parse_state::f: |
1391 | 429 | switch (*input_ptr_) |
1392 | 429 | { |
1393 | 381 | case 'a': |
1394 | 381 | ++input_ptr_; |
1395 | 381 | ++position_; |
1396 | 381 | state_ = json_parse_state::fa; |
1397 | 381 | break; |
1398 | 48 | default: |
1399 | 48 | err_handler_(json_errc::invalid_value, *this); |
1400 | 48 | ec = json_errc::invalid_value; |
1401 | 48 | more_ = false; |
1402 | 48 | return; |
1403 | 429 | } |
1404 | 381 | break; |
1405 | 381 | case json_parse_state::fa: |
1406 | 372 | switch (*input_ptr_) |
1407 | 372 | { |
1408 | 324 | case 'l': |
1409 | 324 | state_ = json_parse_state::fal; |
1410 | 324 | break; |
1411 | 48 | default: |
1412 | 48 | err_handler_(json_errc::invalid_value, *this); |
1413 | 48 | ec = json_errc::invalid_value; |
1414 | 48 | more_ = false; |
1415 | 48 | return; |
1416 | 372 | } |
1417 | 324 | ++input_ptr_; |
1418 | 324 | ++position_; |
1419 | 324 | break; |
1420 | 314 | case json_parse_state::fal: |
1421 | 314 | switch (*input_ptr_) |
1422 | 314 | { |
1423 | 270 | case 's': |
1424 | 270 | state_ = json_parse_state::fals; |
1425 | 270 | break; |
1426 | 44 | default: |
1427 | 44 | err_handler_(json_errc::invalid_value, *this); |
1428 | 44 | ec = json_errc::invalid_value; |
1429 | 44 | more_ = false; |
1430 | 44 | return; |
1431 | 314 | } |
1432 | 270 | ++input_ptr_; |
1433 | 270 | ++position_; |
1434 | 270 | break; |
1435 | 257 | case json_parse_state::fals: |
1436 | 257 | switch (*input_ptr_) |
1437 | 257 | { |
1438 | 228 | case 'e': |
1439 | 228 | ++input_ptr_; |
1440 | 228 | ++position_; |
1441 | 228 | more_ = visitor.bool_value(false, semantic_tag::none, *this, ec); |
1442 | 228 | if (parent() == json_parse_state::root) |
1443 | 3 | { |
1444 | 3 | state_ = json_parse_state::accept; |
1445 | 3 | } |
1446 | 225 | else |
1447 | 225 | { |
1448 | 225 | state_ = json_parse_state::expect_comma_or_end; |
1449 | 225 | } |
1450 | 228 | break; |
1451 | 29 | default: |
1452 | 29 | err_handler_(json_errc::invalid_value, *this); |
1453 | 29 | ec = json_errc::invalid_value; |
1454 | 29 | more_ = false; |
1455 | 29 | return; |
1456 | 257 | } |
1457 | 228 | break; |
1458 | 353 | case json_parse_state::n: |
1459 | 353 | switch (*input_ptr_) |
1460 | 353 | { |
1461 | 308 | case 'u': |
1462 | 308 | ++input_ptr_; |
1463 | 308 | ++position_; |
1464 | 308 | state_ = json_parse_state::nu; |
1465 | 308 | break; |
1466 | 45 | default: |
1467 | 45 | err_handler_(json_errc::invalid_value, *this); |
1468 | 45 | ec = json_errc::invalid_value; |
1469 | 45 | more_ = false; |
1470 | 45 | return; |
1471 | 353 | } |
1472 | 308 | break; |
1473 | 308 | case json_parse_state::nu: |
1474 | 304 | switch (*input_ptr_) |
1475 | 304 | { |
1476 | 260 | case 'l': |
1477 | 260 | state_ = json_parse_state::nul; |
1478 | 260 | break; |
1479 | 44 | default: |
1480 | 44 | err_handler_(json_errc::invalid_value, *this); |
1481 | 44 | ec = json_errc::invalid_value; |
1482 | 44 | more_ = false; |
1483 | 44 | return; |
1484 | 304 | } |
1485 | 260 | ++input_ptr_; |
1486 | 260 | ++position_; |
1487 | 260 | break; |
1488 | 243 | case json_parse_state::nul: |
1489 | 243 | ++position_; |
1490 | 243 | switch (*input_ptr_) |
1491 | 243 | { |
1492 | 209 | case 'l': |
1493 | 209 | more_ = visitor.null_value(semantic_tag::none, *this, ec); |
1494 | 209 | if (parent() == json_parse_state::root) |
1495 | 3 | { |
1496 | 3 | state_ = json_parse_state::accept; |
1497 | 3 | } |
1498 | 206 | else |
1499 | 206 | { |
1500 | 206 | state_ = json_parse_state::expect_comma_or_end; |
1501 | 206 | } |
1502 | 209 | break; |
1503 | 34 | default: |
1504 | 34 | err_handler_(json_errc::invalid_value, *this); |
1505 | 34 | ec = json_errc::invalid_value; |
1506 | 34 | more_ = false; |
1507 | 34 | return; |
1508 | 243 | } |
1509 | 209 | ++input_ptr_; |
1510 | 209 | break; |
1511 | 31.8k | case json_parse_state::slash: |
1512 | 31.8k | { |
1513 | 31.8k | switch (*input_ptr_) |
1514 | 31.8k | { |
1515 | 6.72k | case '*': |
1516 | 6.72k | state_ = json_parse_state::slash_star; |
1517 | 6.72k | more_ = err_handler_(json_errc::illegal_comment, *this); |
1518 | 6.72k | if (!more_) |
1519 | 0 | { |
1520 | 0 | ec = json_errc::illegal_comment; |
1521 | 0 | return; |
1522 | 0 | } |
1523 | 6.72k | break; |
1524 | 25.1k | case '/': |
1525 | 25.1k | state_ = json_parse_state::slash_slash; |
1526 | 25.1k | more_ = err_handler_(json_errc::illegal_comment, *this); |
1527 | 25.1k | if (!more_) |
1528 | 0 | { |
1529 | 0 | ec = json_errc::illegal_comment; |
1530 | 0 | return; |
1531 | 0 | } |
1532 | 25.1k | break; |
1533 | 25.1k | default: |
1534 | 6 | more_ = err_handler_(json_errc::syntax_error, *this); |
1535 | 6 | if (!more_) |
1536 | 6 | { |
1537 | 6 | ec = json_errc::syntax_error; |
1538 | 6 | return; |
1539 | 6 | } |
1540 | 0 | break; |
1541 | 31.8k | } |
1542 | 31.8k | ++input_ptr_; |
1543 | 31.8k | ++position_; |
1544 | 31.8k | break; |
1545 | 31.8k | } |
1546 | 1.99M | case json_parse_state::slash_star: |
1547 | 1.99M | { |
1548 | 1.99M | switch (*input_ptr_) |
1549 | 1.99M | { |
1550 | 48.2k | case '\r': |
1551 | 48.2k | push_state(state_); |
1552 | 48.2k | ++input_ptr_; |
1553 | 48.2k | ++position_; |
1554 | 48.2k | state_ = json_parse_state::cr; |
1555 | 48.2k | break; |
1556 | 22.7k | case '\n': |
1557 | 22.7k | ++input_ptr_; |
1558 | 22.7k | ++line_; |
1559 | 22.7k | ++position_; |
1560 | 22.7k | mark_position_ = position_; |
1561 | 22.7k | break; |
1562 | 15.9k | case '*': |
1563 | 15.9k | ++input_ptr_; |
1564 | 15.9k | ++position_; |
1565 | 15.9k | state_ = json_parse_state::slash_star_star; |
1566 | 15.9k | break; |
1567 | 1.90M | default: |
1568 | 1.90M | ++input_ptr_; |
1569 | 1.90M | ++position_; |
1570 | 1.90M | break; |
1571 | 1.99M | } |
1572 | 1.99M | break; |
1573 | 1.99M | } |
1574 | 2.74M | case json_parse_state::slash_slash: |
1575 | 2.74M | { |
1576 | 2.74M | switch (*input_ptr_) |
1577 | 2.74M | { |
1578 | 15.9k | case '\r': |
1579 | 25.0k | case '\n': |
1580 | 25.0k | state_ = pop_state(); |
1581 | 25.0k | break; |
1582 | 2.72M | default: |
1583 | 2.72M | ++input_ptr_; |
1584 | 2.72M | ++position_; |
1585 | 2.74M | } |
1586 | 2.74M | break; |
1587 | 2.74M | } |
1588 | 2.74M | case json_parse_state::slash_star_star: |
1589 | 15.9k | { |
1590 | 15.9k | switch (*input_ptr_) |
1591 | 15.9k | { |
1592 | 6.47k | case '/': |
1593 | 6.47k | state_ = pop_state(); |
1594 | 6.47k | break; |
1595 | 9.44k | default: |
1596 | 9.44k | state_ = json_parse_state::slash_star; |
1597 | 9.44k | break; |
1598 | 15.9k | } |
1599 | 15.9k | ++input_ptr_; |
1600 | 15.9k | ++position_; |
1601 | 15.9k | break; |
1602 | 15.9k | } |
1603 | 0 | default: |
1604 | 0 | JSONCONS_ASSERT(false); |
1605 | 0 | break; |
1606 | 52.4M | } |
1607 | 52.4M | } |
1608 | 36.5k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_some_(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_some_(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 555 | 49.1k | { | 556 | 49.1k | if (state_ == json_parse_state::accept) | 557 | 7.01k | { | 558 | 7.01k | visitor.flush(); | 559 | 7.01k | done_ = true; | 560 | 7.01k | state_ = json_parse_state::done; | 561 | 7.01k | more_ = false; | 562 | 7.01k | return; | 563 | 7.01k | } | 564 | 42.1k | const char_type* local_input_end = end_input_; | 565 | | | 566 | 42.1k | if (input_ptr_ == local_input_end && more_) | 567 | 13.0k | { | 568 | 13.0k | switch (state_) | 569 | 13.0k | { | 570 | 176 | case json_parse_state::zero: | 571 | 3.44k | case json_parse_state::integer: | 572 | 3.44k | end_integer_value(visitor, ec); | 573 | 3.44k | if (ec) return; | 574 | 3.44k | break; | 575 | 3.44k | case json_parse_state::fraction2: | 576 | 3.23k | case json_parse_state::exp3: | 577 | 3.23k | end_fraction_value(visitor, ec); | 578 | 3.23k | if (ec) return; | 579 | 3.23k | break; | 580 | 3.23k | case json_parse_state::accept: | 581 | 0 | visitor.flush(); | 582 | 0 | done_ = true; | 583 | 0 | state_ = json_parse_state::done; | 584 | 0 | more_ = false; | 585 | 0 | break; | 586 | 332 | case json_parse_state::start: | 587 | 332 | case json_parse_state::done: | 588 | 332 | more_ = false; | 589 | 332 | break; | 590 | 422 | case json_parse_state::cr: | 591 | 422 | state_ = pop_state(); | 592 | 422 | break; | 593 | 5.56k | default: | 594 | 5.56k | err_handler_(json_errc::unexpected_eof, *this); | 595 | 5.56k | ec = json_errc::unexpected_eof; | 596 | 5.56k | more_ = false; | 597 | 5.56k | return; | 598 | 13.0k | } | 599 | 13.0k | } | 600 | | | 601 | 52.4M | while ((input_ptr_ < local_input_end) && more_) | 602 | 52.4M | { | 603 | 52.4M | switch (state_) | 604 | 52.4M | { | 605 | 176 | case json_parse_state::accept: | 606 | 176 | visitor.flush(); | 607 | 176 | done_ = true; | 608 | 176 | state_ = json_parse_state::done; | 609 | 176 | more_ = false; | 610 | 176 | break; | 611 | 476k | case json_parse_state::cr: | 612 | 476k | ++line_; | 613 | 476k | mark_position_ = position_; | 614 | 476k | switch (*input_ptr_) | 615 | 476k | { | 616 | 2.78k | case '\n': | 617 | 2.78k | ++input_ptr_; | 618 | 2.78k | ++position_; | 619 | 2.78k | state_ = pop_state(); | 620 | 2.78k | break; | 621 | 473k | default: | 622 | 473k | state_ = pop_state(); | 623 | 473k | break; | 624 | 476k | } | 625 | 476k | break; | 626 | 476k | case json_parse_state::start: | 627 | 70.5k | { | 628 | 70.5k | switch (*input_ptr_) | 629 | 70.5k | { | 630 | 4.72k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: | 631 | 4.72k | more_ = err_handler_(json_errc::illegal_control_character, *this); | 632 | 4.72k | if (!more_) | 633 | 230 | { | 634 | 230 | ec = json_errc::illegal_control_character; | 635 | 230 | return; | 636 | 230 | } | 637 | 0 | break; | 638 | 11.5k | case '\r': | 639 | 11.5k | push_state(state_); | 640 | 11.5k | ++input_ptr_; | 641 | 11.5k | ++position_; | 642 | 11.5k | state_ = json_parse_state::cr; | 643 | 11.5k | break; | 644 | 21.7k | case '\n': | 645 | 21.7k | ++input_ptr_; | 646 | 21.7k | ++line_; | 647 | 21.7k | ++position_; | 648 | 21.7k | mark_position_ = position_; | 649 | 21.7k | break; | 650 | 11.0k | case ' ':case '\t': | 651 | 11.0k | skip_space(); | 652 | 11.0k | break; | 653 | 8.53k | case '/': | 654 | 8.53k | ++input_ptr_; | 655 | 8.53k | ++position_; | 656 | 8.53k | push_state(state_); | 657 | 8.53k | state_ = json_parse_state::slash; | 658 | 8.53k | break; | 659 | 2.30k | case '{': | 660 | 2.30k | saved_position_ = position_; | 661 | 2.30k | ++input_ptr_; | 662 | 2.30k | ++position_; | 663 | 2.30k | begin_object(visitor, ec); | 664 | 2.30k | if (ec) return; | 665 | 2.30k | break; | 666 | 5.40k | case '[': | 667 | 5.40k | saved_position_ = position_; | 668 | 5.40k | ++input_ptr_; | 669 | 5.40k | ++position_; | 670 | 5.40k | begin_array(visitor, ec); | 671 | 5.40k | if (ec) return; | 672 | 5.40k | break; | 673 | 5.40k | case '\"': | 674 | 2.67k | state_ = json_parse_state::string; | 675 | 2.67k | saved_position_ = position_; | 676 | 2.67k | ++input_ptr_; | 677 | 2.67k | ++position_; | 678 | 2.67k | string_buffer_.clear(); | 679 | 2.67k | parse_string(visitor, ec); | 680 | 2.67k | if (ec) return; | 681 | 2.02k | break; | 682 | 2.02k | case '-': | 683 | 1.25k | string_buffer_.clear(); | 684 | 1.25k | string_buffer_.push_back('-'); | 685 | 1.25k | saved_position_ = position_; | 686 | 1.25k | ++input_ptr_; | 687 | 1.25k | ++position_; | 688 | 1.25k | state_ = json_parse_state::minus; | 689 | 1.25k | parse_number(visitor, ec); | 690 | 1.25k | if (ec) {return;} | 691 | 1.23k | break; | 692 | 1.23k | case '0': | 693 | 331 | string_buffer_.clear(); | 694 | 331 | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 695 | 331 | state_ = json_parse_state::zero; | 696 | 331 | saved_position_ = position_; | 697 | 331 | ++input_ptr_; | 698 | 331 | ++position_; | 699 | 331 | parse_number(visitor, ec); | 700 | 331 | if (ec) {return;} | 701 | 259 | break; | 702 | 4.02k | case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': | 703 | 4.02k | string_buffer_.clear(); | 704 | 4.02k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 705 | 4.02k | saved_position_ = position_; | 706 | 4.02k | ++input_ptr_; | 707 | 4.02k | ++position_; | 708 | 4.02k | state_ = json_parse_state::integer; | 709 | 4.02k | parse_number(visitor, ec); | 710 | 4.02k | if (ec) {return;} | 711 | 3.91k | break; | 712 | 3.91k | case 'n': | 713 | 309 | parse_null(visitor, ec); | 714 | 309 | if (ec) {return;} | 715 | 124 | break; | 716 | 290 | case 't': | 717 | 290 | parse_true(visitor, ec); | 718 | 290 | if (ec) {return;} | 719 | 129 | break; | 720 | 375 | case 'f': | 721 | 375 | parse_false(visitor, ec); | 722 | 375 | if (ec) {return;} | 723 | 176 | break; | 724 | 176 | case '}': | 725 | 6 | err_handler_(json_errc::unexpected_rbrace, *this); | 726 | 6 | ec = json_errc::unexpected_rbrace; | 727 | 6 | more_ = false; | 728 | 6 | return; | 729 | 7 | case ']': | 730 | 7 | err_handler_(json_errc::unexpected_rbracket, *this); | 731 | 7 | ec = json_errc::unexpected_rbracket; | 732 | 7 | more_ = false; | 733 | 7 | return; | 734 | 352 | default: | 735 | 352 | err_handler_(json_errc::syntax_error, *this); | 736 | 352 | ec = json_errc::syntax_error; | 737 | 352 | more_ = false; | 738 | 352 | return; | 739 | 70.5k | } | 740 | 70.5k | } | 741 | 68.5k | break; | 742 | | | 743 | 3.08M | case json_parse_state::expect_comma_or_end: | 744 | 3.08M | { | 745 | 3.08M | switch (*input_ptr_) | 746 | 3.08M | { | 747 | 1.50k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: | 748 | 1.50k | more_ = err_handler_(json_errc::illegal_control_character, *this); | 749 | 1.50k | if (!more_) | 750 | 98 | { | 751 | 98 | ec = json_errc::illegal_control_character; | 752 | 98 | return; | 753 | 98 | } | 754 | 0 | ++input_ptr_; | 755 | 0 | ++position_; | 756 | 0 | break; | 757 | 47.0k | case '\r': | 758 | 47.0k | ++input_ptr_; | 759 | 47.0k | ++position_; | 760 | 47.0k | push_state(state_); | 761 | 47.0k | state_ = json_parse_state::cr; | 762 | 47.0k | break; | 763 | 12.0k | case '\n': | 764 | 12.0k | ++input_ptr_; | 765 | 12.0k | ++line_; | 766 | 12.0k | ++position_; | 767 | 12.0k | mark_position_ = position_; | 768 | 12.0k | break; | 769 | 6.20k | case ' ':case '\t': | 770 | 6.20k | skip_space(); | 771 | 6.20k | break; | 772 | 4.11k | case '/': | 773 | 4.11k | ++input_ptr_; | 774 | 4.11k | ++position_; | 775 | 4.11k | push_state(state_); | 776 | 4.11k | state_ = json_parse_state::slash; | 777 | 4.11k | break; | 778 | 13.5k | case '}': | 779 | 13.5k | saved_position_ = position_; | 780 | 13.5k | ++input_ptr_; | 781 | 13.5k | ++position_; | 782 | 13.5k | end_object(visitor, ec); | 783 | 13.5k | if (ec) return; | 784 | 13.4k | break; | 785 | 19.4k | case ']': | 786 | 19.4k | saved_position_ = position_; | 787 | 19.4k | ++input_ptr_; | 788 | 19.4k | ++position_; | 789 | 19.4k | end_array(visitor, ec); | 790 | 19.4k | if (ec) return; | 791 | 19.3k | break; | 792 | 2.97M | case ',': | 793 | 2.97M | begin_member_or_element(ec); | 794 | 2.97M | if (ec) return; | 795 | 2.97M | ++input_ptr_; | 796 | 2.97M | ++position_; | 797 | 2.97M | break; | 798 | 146 | default: | 799 | 146 | if (parent() == json_parse_state::array) | 800 | 120 | { | 801 | 120 | more_ = err_handler_(json_errc::expected_comma_or_rbracket, *this); | 802 | 120 | if (!more_) | 803 | 120 | { | 804 | 120 | ec = json_errc::expected_comma_or_rbracket; | 805 | 120 | return; | 806 | 120 | } | 807 | 120 | } | 808 | 26 | else if (parent() == json_parse_state::object) | 809 | 26 | { | 810 | 26 | more_ = err_handler_(json_errc::expected_comma_or_rbrace, *this); | 811 | 26 | if (!more_) | 812 | 26 | { | 813 | 26 | ec = json_errc::expected_comma_or_rbrace; | 814 | 26 | return; | 815 | 26 | } | 816 | 26 | } | 817 | 0 | ++input_ptr_; | 818 | 0 | ++position_; | 819 | 0 | break; | 820 | 3.08M | } | 821 | 3.08M | } | 822 | 3.08M | break; | 823 | 3.08M | case json_parse_state::expect_member_name_or_end: | 824 | 516k | { | 825 | 516k | switch (*input_ptr_) | 826 | 516k | { | 827 | 1.32k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: | 828 | 1.32k | more_ = err_handler_(json_errc::illegal_control_character, *this); | 829 | 1.32k | if (!more_) | 830 | 88 | { | 831 | 88 | ec = json_errc::illegal_control_character; | 832 | 88 | return; | 833 | 88 | } | 834 | 0 | ++input_ptr_; | 835 | 0 | ++position_; | 836 | 0 | break; | 837 | 1.02k | case '\r': | 838 | 1.02k | ++input_ptr_; | 839 | 1.02k | ++position_; | 840 | 1.02k | push_state(state_); | 841 | 1.02k | state_ = json_parse_state::cr; | 842 | 1.02k | break; | 843 | 766 | case '\n': | 844 | 766 | ++input_ptr_; | 845 | 766 | ++line_; | 846 | 766 | ++position_; | 847 | 766 | mark_position_ = position_; | 848 | 766 | break; | 849 | 1.24k | case ' ':case '\t': | 850 | 1.24k | skip_space(); | 851 | 1.24k | break; | 852 | 584 | case '/': | 853 | 584 | ++input_ptr_; | 854 | 584 | ++position_; | 855 | 584 | push_state(state_); | 856 | 584 | state_ = json_parse_state::slash; | 857 | 584 | break; | 858 | 494k | case '}': | 859 | 494k | saved_position_ = position_; | 860 | 494k | ++input_ptr_; | 861 | 494k | ++position_; | 862 | 494k | end_object(visitor, ec); | 863 | 494k | if (ec) return; | 864 | 494k | break; | 865 | 494k | case '\"': | 866 | 18.2k | saved_position_ = position_; | 867 | 18.2k | ++input_ptr_; | 868 | 18.2k | ++position_; | 869 | 18.2k | push_state(json_parse_state::member_name); | 870 | 18.2k | state_ = json_parse_state::string; | 871 | 18.2k | string_buffer_.clear(); | 872 | 18.2k | parse_string(visitor, ec); | 873 | 18.2k | if (ec) return; | 874 | 18.2k | break; | 875 | 18.2k | case '\'': | 876 | 3 | more_ = err_handler_(json_errc::single_quote, *this); | 877 | 3 | if (!more_) | 878 | 3 | { | 879 | 3 | ec = json_errc::single_quote; | 880 | 3 | return; | 881 | 3 | } | 882 | 0 | ++input_ptr_; | 883 | 0 | ++position_; | 884 | 0 | break; | 885 | 14 | default: | 886 | 14 | more_ = err_handler_(json_errc::expected_key, *this); | 887 | 14 | if (!more_) | 888 | 14 | { | 889 | 14 | ec = json_errc::expected_key; | 890 | 14 | return; | 891 | 14 | } | 892 | 0 | ++input_ptr_; | 893 | 0 | ++position_; | 894 | 0 | break; | 895 | 516k | } | 896 | 516k | } | 897 | 516k | break; | 898 | 2.03M | case json_parse_state::expect_member_name: | 899 | 2.03M | { | 900 | 2.03M | switch (*input_ptr_) | 901 | 2.03M | { | 902 | 1.36k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: | 903 | 1.36k | more_ = err_handler_(json_errc::illegal_control_character, *this); | 904 | 1.36k | if (!more_) | 905 | 90 | { | 906 | 90 | ec = json_errc::illegal_control_character; | 907 | 90 | return; | 908 | 90 | } | 909 | 0 | ++input_ptr_; | 910 | 0 | ++position_; | 911 | 0 | break; | 912 | 1.21k | case '\r': | 913 | 1.21k | ++input_ptr_; | 914 | 1.21k | ++position_; | 915 | 1.21k | push_state(state_); | 916 | 1.21k | state_ = json_parse_state::cr; | 917 | 1.21k | break; | 918 | 1.79k | case '\n': | 919 | 1.79k | ++input_ptr_; | 920 | 1.79k | ++line_; | 921 | 1.79k | ++position_; | 922 | 1.79k | mark_position_ = position_; | 923 | 1.79k | break; | 924 | 1.28k | case ' ':case '\t': | 925 | 1.28k | skip_space(); | 926 | 1.28k | break; | 927 | 605 | case '/': | 928 | 605 | ++input_ptr_; | 929 | 605 | ++position_; | 930 | 605 | push_state(state_); | 931 | 605 | state_ = json_parse_state::slash; | 932 | 605 | break; | 933 | 2.02M | case '\"': | 934 | 2.02M | saved_position_ = position_; | 935 | 2.02M | ++input_ptr_; | 936 | 2.02M | ++position_; | 937 | 2.02M | push_state(json_parse_state::member_name); | 938 | 2.02M | state_ = json_parse_state::string; | 939 | 2.02M | string_buffer_.clear(); | 940 | 2.02M | parse_string(visitor, ec); | 941 | 2.02M | if (ec) return; | 942 | 2.02M | break; | 943 | 2.02M | case '}': | 944 | 3 | more_ = err_handler_(json_errc::extra_comma, *this); | 945 | 3 | if (!more_) | 946 | 3 | { | 947 | 3 | ec = json_errc::extra_comma; | 948 | 3 | return; | 949 | 3 | } | 950 | 0 | saved_position_ = position_; | 951 | 0 | ++input_ptr_; | 952 | 0 | ++position_; | 953 | 0 | end_object(visitor, ec); // Recover | 954 | 0 | if (ec) return; | 955 | 0 | break; | 956 | 3 | case '\'': | 957 | 3 | more_ = err_handler_(json_errc::single_quote, *this); | 958 | 3 | if (!more_) | 959 | 3 | { | 960 | 3 | ec = json_errc::single_quote; | 961 | 3 | return; | 962 | 3 | } | 963 | 0 | ++input_ptr_; | 964 | 0 | ++position_; | 965 | 0 | break; | 966 | 19 | default: | 967 | 19 | more_ = err_handler_(json_errc::expected_key, *this); | 968 | 19 | if (!more_) | 969 | 19 | { | 970 | 19 | ec = json_errc::expected_key; | 971 | 19 | return; | 972 | 19 | } | 973 | 0 | ++input_ptr_; | 974 | 0 | ++position_; | 975 | 0 | break; | 976 | 2.03M | } | 977 | 2.03M | } | 978 | 2.03M | break; | 979 | 2.05M | case json_parse_state::expect_colon: | 980 | 2.05M | { | 981 | 2.05M | switch (*input_ptr_) | 982 | 2.05M | { | 983 | 1.36k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: | 984 | 1.36k | more_ = err_handler_(json_errc::illegal_control_character, *this); | 985 | 1.36k | if (!more_) | 986 | 90 | { | 987 | 90 | ec = json_errc::illegal_control_character; | 988 | 90 | return; | 989 | 90 | } | 990 | 0 | ++input_ptr_; | 991 | 0 | ++position_; | 992 | 0 | break; | 993 | 1.02k | case '\r': | 994 | 1.02k | push_state(state_); | 995 | 1.02k | state_ = json_parse_state::cr; | 996 | 1.02k | ++input_ptr_; | 997 | 1.02k | ++position_; | 998 | 1.02k | break; | 999 | 4.89k | case '\n': | 1000 | 4.89k | ++input_ptr_; | 1001 | 4.89k | ++line_; | 1002 | 4.89k | ++position_; | 1003 | 4.89k | mark_position_ = position_; | 1004 | 4.89k | break; | 1005 | 1.48k | case ' ':case '\t': | 1006 | 1.48k | skip_space(); | 1007 | 1.48k | break; | 1008 | 582 | case '/': | 1009 | 582 | push_state(state_); | 1010 | 582 | state_ = json_parse_state::slash; | 1011 | 582 | ++input_ptr_; | 1012 | 582 | ++position_; | 1013 | 582 | break; | 1014 | 2.04M | case ':': | 1015 | 2.04M | state_ = json_parse_state::expect_value; | 1016 | 2.04M | ++input_ptr_; | 1017 | 2.04M | ++position_; | 1018 | 2.04M | break; | 1019 | 30 | default: | 1020 | 30 | more_ = err_handler_(json_errc::expected_colon, *this); | 1021 | 30 | if (!more_) | 1022 | 30 | { | 1023 | 30 | ec = json_errc::expected_colon; | 1024 | 30 | return; | 1025 | 30 | } | 1026 | 0 | ++input_ptr_; | 1027 | 0 | ++position_; | 1028 | 0 | break; | 1029 | 2.05M | } | 1030 | 2.05M | } | 1031 | 2.05M | break; | 1032 | | | 1033 | 26.5M | case json_parse_state::expect_value: | 1034 | 26.5M | { | 1035 | 26.5M | switch (*input_ptr_) | 1036 | 26.5M | { | 1037 | 1.37k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: | 1038 | 1.37k | more_ = err_handler_(json_errc::illegal_control_character, *this); | 1039 | 1.37k | if (!more_) | 1040 | 90 | { | 1041 | 90 | ec = json_errc::illegal_control_character; | 1042 | 90 | return; | 1043 | 90 | } | 1044 | 0 | ++input_ptr_; | 1045 | 0 | ++position_; | 1046 | 0 | break; | 1047 | 22.1k | case '\r': | 1048 | 22.1k | push_state(state_); | 1049 | 22.1k | ++input_ptr_; | 1050 | 22.1k | ++position_; | 1051 | 22.1k | state_ = json_parse_state::cr; | 1052 | 22.1k | break; | 1053 | 30.3k | case '\n': | 1054 | 30.3k | ++input_ptr_; | 1055 | 30.3k | ++line_; | 1056 | 30.3k | ++position_; | 1057 | 30.3k | mark_position_ = position_; | 1058 | 30.3k | break; | 1059 | 7.77k | case ' ':case '\t': | 1060 | 7.77k | skip_space(); | 1061 | 7.77k | break; | 1062 | 6.06k | case '/': | 1063 | 6.06k | push_state(state_); | 1064 | 6.06k | ++input_ptr_; | 1065 | 6.06k | ++position_; | 1066 | 6.06k | state_ = json_parse_state::slash; | 1067 | 6.06k | break; | 1068 | 495k | case '{': | 1069 | 495k | saved_position_ = position_; | 1070 | 495k | ++input_ptr_; | 1071 | 495k | ++position_; | 1072 | 495k | begin_object(visitor, ec); | 1073 | 495k | if (ec) return; | 1074 | 495k | break; | 1075 | 495k | case '[': | 1076 | 264k | saved_position_ = position_; | 1077 | 264k | ++input_ptr_; | 1078 | 264k | ++position_; | 1079 | 264k | begin_array(visitor, ec); | 1080 | 264k | if (ec) return; | 1081 | 264k | break; | 1082 | 264k | case '\"': | 1083 | 72.1k | saved_position_ = position_; | 1084 | 72.1k | ++input_ptr_; | 1085 | 72.1k | ++position_; | 1086 | 72.1k | state_ = json_parse_state::string; | 1087 | 72.1k | string_buffer_.clear(); | 1088 | 72.1k | parse_string(visitor, ec); | 1089 | 72.1k | if (ec) return; | 1090 | 72.0k | break; | 1091 | 747k | case '-': | 1092 | 747k | string_buffer_.clear(); | 1093 | 747k | string_buffer_.push_back('-'); | 1094 | 747k | saved_position_ = position_; | 1095 | 747k | ++input_ptr_; | 1096 | 747k | ++position_; | 1097 | 747k | state_ = json_parse_state::minus; | 1098 | 747k | parse_number(visitor, ec); | 1099 | 747k | if (ec) {return;} | 1100 | 747k | break; | 1101 | 4.90M | case '0': | 1102 | 4.90M | string_buffer_.clear(); | 1103 | 4.90M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1104 | 4.90M | saved_position_ = position_; | 1105 | 4.90M | ++input_ptr_; | 1106 | 4.90M | ++position_; | 1107 | 4.90M | state_ = json_parse_state::zero; | 1108 | 4.90M | parse_number(visitor, ec); | 1109 | 4.90M | if (ec) {return;} | 1110 | 4.90M | break; | 1111 | 18.0M | case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': | 1112 | 18.0M | string_buffer_.clear(); | 1113 | 18.0M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1114 | 18.0M | saved_position_ = position_; | 1115 | 18.0M | ++input_ptr_; | 1116 | 18.0M | ++position_; | 1117 | 18.0M | state_ = json_parse_state::integer; | 1118 | 18.0M | parse_number(visitor, ec); | 1119 | 18.0M | if (ec) {return;} | 1120 | 18.0M | break; | 1121 | 18.0M | case 'n': | 1122 | 692k | parse_null(visitor, ec); | 1123 | 692k | if (ec) {return;} | 1124 | 692k | break; | 1125 | 878k | case 't': | 1126 | 878k | parse_true(visitor, ec); | 1127 | 878k | if (ec) {return;} | 1128 | 878k | break; | 1129 | 878k | case 'f': | 1130 | 404k | parse_false(visitor, ec); | 1131 | 404k | if (ec) {return;} | 1132 | 404k | break; | 1133 | 404k | case ']': | 1134 | 8 | saved_position_ = position_; | 1135 | 8 | ++input_ptr_; | 1136 | 8 | ++position_; | 1137 | 8 | if (parent() == json_parse_state::array) | 1138 | 5 | { | 1139 | 5 | more_ = err_handler_(json_errc::extra_comma, *this); | 1140 | 5 | if (!more_) | 1141 | 5 | { | 1142 | 5 | ec = json_errc::extra_comma; | 1143 | 5 | return; | 1144 | 5 | } | 1145 | 0 | end_array(visitor, ec); // Recover | 1146 | 0 | if (ec) return; | 1147 | 0 | } | 1148 | 3 | else | 1149 | 3 | { | 1150 | 3 | more_ = err_handler_(json_errc::expected_value, *this); | 1151 | 3 | if (!more_) | 1152 | 3 | { | 1153 | 3 | ec = json_errc::expected_value; | 1154 | 3 | return; | 1155 | 3 | } | 1156 | 3 | } | 1157 | 0 | break; | 1158 | 3 | case '\'': | 1159 | 3 | more_ = err_handler_(json_errc::single_quote, *this); | 1160 | 3 | if (!more_) | 1161 | 3 | { | 1162 | 3 | ec = json_errc::single_quote; | 1163 | 3 | return; | 1164 | 3 | } | 1165 | 0 | ++input_ptr_; | 1166 | 0 | ++position_; | 1167 | 0 | break; | 1168 | 51 | default: | 1169 | 51 | more_ = err_handler_(json_errc::expected_value, *this); | 1170 | 51 | if (!more_) | 1171 | 51 | { | 1172 | 51 | ec = json_errc::expected_value; | 1173 | 51 | return; | 1174 | 51 | } | 1175 | 0 | ++input_ptr_; | 1176 | 0 | ++position_; | 1177 | 0 | break; | 1178 | 26.5M | } | 1179 | 26.5M | } | 1180 | 26.5M | break; | 1181 | 26.5M | case json_parse_state::expect_value_or_end: | 1182 | 11.6M | { | 1183 | 11.6M | switch (*input_ptr_) | 1184 | 11.6M | { | 1185 | 1.39k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: | 1186 | 1.39k | more_ = err_handler_(json_errc::illegal_control_character, *this); | 1187 | 1.39k | if (!more_) | 1188 | 91 | { | 1189 | 91 | ec = json_errc::illegal_control_character; | 1190 | 91 | return; | 1191 | 91 | } | 1192 | 0 | ++input_ptr_; | 1193 | 0 | ++position_; | 1194 | 0 | break; | 1195 | 23.4k | case '\r': | 1196 | 23.4k | ++input_ptr_; | 1197 | 23.4k | ++position_; | 1198 | 23.4k | push_state(state_); | 1199 | 23.4k | state_ = json_parse_state::cr; | 1200 | 23.4k | break; | 1201 | 201k | case '\n': | 1202 | 201k | ++input_ptr_; | 1203 | 201k | ++line_; | 1204 | 201k | ++position_; | 1205 | 201k | mark_position_ = position_; | 1206 | 201k | break; | 1207 | 10.7k | case ' ':case '\t': | 1208 | 10.7k | skip_space(); | 1209 | 10.7k | break; | 1210 | 5.74k | case '/': | 1211 | 5.74k | ++input_ptr_; | 1212 | 5.74k | ++position_; | 1213 | 5.74k | push_state(state_); | 1214 | 5.74k | state_ = json_parse_state::slash; | 1215 | 5.74k | break; | 1216 | 14.6k | case '{': | 1217 | 14.6k | saved_position_ = position_; | 1218 | 14.6k | ++input_ptr_; | 1219 | 14.6k | ++position_; | 1220 | 14.6k | begin_object(visitor, ec); | 1221 | 14.6k | if (ec) return; | 1222 | 14.6k | break; | 1223 | 11.1M | case '[': | 1224 | 11.1M | saved_position_ = position_; | 1225 | 11.1M | ++input_ptr_; | 1226 | 11.1M | ++position_; | 1227 | 11.1M | begin_array(visitor, ec); | 1228 | 11.1M | if (ec) return; | 1229 | 11.1M | break; | 1230 | 11.1M | case ']': | 1231 | 6.47k | saved_position_ = position_; | 1232 | 6.47k | ++input_ptr_; | 1233 | 6.47k | ++position_; | 1234 | 6.47k | end_array(visitor, ec); | 1235 | 6.47k | if (ec) return; | 1236 | 6.47k | break; | 1237 | 6.47k | case '\"': | 1238 | 983 | saved_position_ = position_; | 1239 | 983 | ++input_ptr_; | 1240 | 983 | ++position_; | 1241 | 983 | state_ = json_parse_state::string; | 1242 | 983 | string_buffer_.clear(); | 1243 | 983 | parse_string(visitor, ec); | 1244 | 983 | if (ec) return; | 1245 | 972 | break; | 1246 | 111k | case '-': | 1247 | 111k | string_buffer_.clear(); | 1248 | 111k | string_buffer_.push_back('-'); | 1249 | 111k | saved_position_ = position_; | 1250 | 111k | ++input_ptr_; | 1251 | 111k | ++position_; | 1252 | 111k | state_ = json_parse_state::minus; | 1253 | 111k | parse_number(visitor, ec); | 1254 | 111k | if (ec) {return;} | 1255 | 111k | break; | 1256 | 111k | case '0': | 1257 | 7.25k | string_buffer_.clear(); | 1258 | 7.25k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1259 | 7.25k | saved_position_ = position_; | 1260 | 7.25k | ++input_ptr_; | 1261 | 7.25k | ++position_; | 1262 | 7.25k | state_ = json_parse_state::zero; | 1263 | 7.25k | parse_number(visitor, ec); | 1264 | 7.25k | if (ec) {return;} | 1265 | 7.24k | break; | 1266 | 41.0k | case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': | 1267 | 41.0k | string_buffer_.clear(); | 1268 | 41.0k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1269 | 41.0k | saved_position_ = position_; | 1270 | 41.0k | ++input_ptr_; | 1271 | 41.0k | ++position_; | 1272 | 41.0k | state_ = json_parse_state::integer; | 1273 | 41.0k | parse_number(visitor, ec); | 1274 | 41.0k | if (ec) {return;} | 1275 | 41.0k | break; | 1276 | 41.0k | case 'n': | 1277 | 9.82k | parse_null(visitor, ec); | 1278 | 9.82k | if (ec) {return;} | 1279 | 9.81k | break; | 1280 | 9.81k | case 't': | 1281 | 9.75k | parse_true(visitor, ec); | 1282 | 9.75k | if (ec) {return;} | 1283 | 9.74k | break; | 1284 | 68.1k | case 'f': | 1285 | 68.1k | parse_false(visitor, ec); | 1286 | 68.1k | if (ec) {return;} | 1287 | 68.1k | break; | 1288 | 68.1k | case '\'': | 1289 | 3 | more_ = err_handler_(json_errc::single_quote, *this); | 1290 | 3 | if (!more_) | 1291 | 3 | { | 1292 | 3 | ec = json_errc::single_quote; | 1293 | 3 | return; | 1294 | 3 | } | 1295 | 0 | ++input_ptr_; | 1296 | 0 | ++position_; | 1297 | 0 | break; | 1298 | 16 | default: | 1299 | 16 | more_ = err_handler_(json_errc::expected_value, *this); | 1300 | 16 | if (!more_) | 1301 | 16 | { | 1302 | 16 | ec = json_errc::expected_value; | 1303 | 16 | return; | 1304 | 16 | } | 1305 | 0 | ++input_ptr_; | 1306 | 0 | ++position_; | 1307 | 0 | break; | 1308 | 11.6M | } | 1309 | 11.6M | } | 1310 | 11.6M | break; | 1311 | 11.6M | case json_parse_state::string: | 1312 | 1.16M | case json_parse_state::escape: | 1313 | 1.16M | case json_parse_state::escape_u1: | 1314 | 1.17M | case json_parse_state::escape_u2: | 1315 | 1.17M | case json_parse_state::escape_u3: | 1316 | 1.17M | case json_parse_state::escape_u4: | 1317 | 1.17M | case json_parse_state::escape_expect_surrogate_pair1: | 1318 | 1.17M | case json_parse_state::escape_expect_surrogate_pair2: | 1319 | 1.17M | case json_parse_state::escape_u5: | 1320 | 1.17M | case json_parse_state::escape_u6: | 1321 | 1.17M | case json_parse_state::escape_u7: | 1322 | 1.17M | case json_parse_state::escape_u8: | 1323 | 1.17M | parse_string(visitor, ec); | 1324 | 1.17M | if (ec) return; | 1325 | 1.17M | break; | 1326 | 1.17M | case json_parse_state::minus: | 1327 | 584 | case json_parse_state::zero: | 1328 | 2.34k | case json_parse_state::integer: | 1329 | 2.46k | case json_parse_state::fraction1: | 1330 | 2.94k | case json_parse_state::fraction2: | 1331 | 3.18k | case json_parse_state::exp1: | 1332 | 3.26k | case json_parse_state::exp2: | 1333 | 3.88k | case json_parse_state::exp3: | 1334 | 3.88k | parse_number(visitor, ec); | 1335 | 3.88k | if (ec) return; | 1336 | 3.87k | break; | 1337 | 3.87k | case json_parse_state::t: | 1338 | 433 | switch (*input_ptr_) | 1339 | 433 | { | 1340 | 386 | case 'r': | 1341 | 386 | ++input_ptr_; | 1342 | 386 | ++position_; | 1343 | 386 | state_ = json_parse_state::tr; | 1344 | 386 | break; | 1345 | 47 | default: | 1346 | 47 | err_handler_(json_errc::invalid_value, *this); | 1347 | 47 | ec = json_errc::invalid_value; | 1348 | 47 | more_ = false; | 1349 | 47 | return; | 1350 | 433 | } | 1351 | 386 | break; | 1352 | 386 | case json_parse_state::tr: | 1353 | 371 | switch (*input_ptr_) | 1354 | 371 | { | 1355 | 326 | case 'u': | 1356 | 326 | state_ = json_parse_state::tru; | 1357 | 326 | break; | 1358 | 45 | default: | 1359 | 45 | err_handler_(json_errc::invalid_value, *this); | 1360 | 45 | ec = json_errc::invalid_value; | 1361 | 45 | more_ = false; | 1362 | 45 | return; | 1363 | 371 | } | 1364 | 326 | ++input_ptr_; | 1365 | 326 | ++position_; | 1366 | 326 | break; | 1367 | 312 | case json_parse_state::tru: | 1368 | 312 | switch (*input_ptr_) | 1369 | 312 | { | 1370 | 282 | case 'e': | 1371 | 282 | ++input_ptr_; | 1372 | 282 | ++position_; | 1373 | 282 | more_ = visitor.bool_value(true, semantic_tag::none, *this, ec); | 1374 | 282 | if (parent() == json_parse_state::root) | 1375 | 3 | { | 1376 | 3 | state_ = json_parse_state::accept; | 1377 | 3 | } | 1378 | 279 | else | 1379 | 279 | { | 1380 | 279 | state_ = json_parse_state::expect_comma_or_end; | 1381 | 279 | } | 1382 | 282 | break; | 1383 | 30 | default: | 1384 | 30 | err_handler_(json_errc::invalid_value, *this); | 1385 | 30 | ec = json_errc::invalid_value; | 1386 | 30 | more_ = false; | 1387 | 30 | return; | 1388 | 312 | } | 1389 | 282 | break; | 1390 | 429 | case json_parse_state::f: | 1391 | 429 | switch (*input_ptr_) | 1392 | 429 | { | 1393 | 381 | case 'a': | 1394 | 381 | ++input_ptr_; | 1395 | 381 | ++position_; | 1396 | 381 | state_ = json_parse_state::fa; | 1397 | 381 | break; | 1398 | 48 | default: | 1399 | 48 | err_handler_(json_errc::invalid_value, *this); | 1400 | 48 | ec = json_errc::invalid_value; | 1401 | 48 | more_ = false; | 1402 | 48 | return; | 1403 | 429 | } | 1404 | 381 | break; | 1405 | 381 | case json_parse_state::fa: | 1406 | 372 | switch (*input_ptr_) | 1407 | 372 | { | 1408 | 324 | case 'l': | 1409 | 324 | state_ = json_parse_state::fal; | 1410 | 324 | break; | 1411 | 48 | default: | 1412 | 48 | err_handler_(json_errc::invalid_value, *this); | 1413 | 48 | ec = json_errc::invalid_value; | 1414 | 48 | more_ = false; | 1415 | 48 | return; | 1416 | 372 | } | 1417 | 324 | ++input_ptr_; | 1418 | 324 | ++position_; | 1419 | 324 | break; | 1420 | 314 | case json_parse_state::fal: | 1421 | 314 | switch (*input_ptr_) | 1422 | 314 | { | 1423 | 270 | case 's': | 1424 | 270 | state_ = json_parse_state::fals; | 1425 | 270 | break; | 1426 | 44 | default: | 1427 | 44 | err_handler_(json_errc::invalid_value, *this); | 1428 | 44 | ec = json_errc::invalid_value; | 1429 | 44 | more_ = false; | 1430 | 44 | return; | 1431 | 314 | } | 1432 | 270 | ++input_ptr_; | 1433 | 270 | ++position_; | 1434 | 270 | break; | 1435 | 257 | case json_parse_state::fals: | 1436 | 257 | switch (*input_ptr_) | 1437 | 257 | { | 1438 | 228 | case 'e': | 1439 | 228 | ++input_ptr_; | 1440 | 228 | ++position_; | 1441 | 228 | more_ = visitor.bool_value(false, semantic_tag::none, *this, ec); | 1442 | 228 | if (parent() == json_parse_state::root) | 1443 | 3 | { | 1444 | 3 | state_ = json_parse_state::accept; | 1445 | 3 | } | 1446 | 225 | else | 1447 | 225 | { | 1448 | 225 | state_ = json_parse_state::expect_comma_or_end; | 1449 | 225 | } | 1450 | 228 | break; | 1451 | 29 | default: | 1452 | 29 | err_handler_(json_errc::invalid_value, *this); | 1453 | 29 | ec = json_errc::invalid_value; | 1454 | 29 | more_ = false; | 1455 | 29 | return; | 1456 | 257 | } | 1457 | 228 | break; | 1458 | 353 | case json_parse_state::n: | 1459 | 353 | switch (*input_ptr_) | 1460 | 353 | { | 1461 | 308 | case 'u': | 1462 | 308 | ++input_ptr_; | 1463 | 308 | ++position_; | 1464 | 308 | state_ = json_parse_state::nu; | 1465 | 308 | break; | 1466 | 45 | default: | 1467 | 45 | err_handler_(json_errc::invalid_value, *this); | 1468 | 45 | ec = json_errc::invalid_value; | 1469 | 45 | more_ = false; | 1470 | 45 | return; | 1471 | 353 | } | 1472 | 308 | break; | 1473 | 308 | case json_parse_state::nu: | 1474 | 304 | switch (*input_ptr_) | 1475 | 304 | { | 1476 | 260 | case 'l': | 1477 | 260 | state_ = json_parse_state::nul; | 1478 | 260 | break; | 1479 | 44 | default: | 1480 | 44 | err_handler_(json_errc::invalid_value, *this); | 1481 | 44 | ec = json_errc::invalid_value; | 1482 | 44 | more_ = false; | 1483 | 44 | return; | 1484 | 304 | } | 1485 | 260 | ++input_ptr_; | 1486 | 260 | ++position_; | 1487 | 260 | break; | 1488 | 243 | case json_parse_state::nul: | 1489 | 243 | ++position_; | 1490 | 243 | switch (*input_ptr_) | 1491 | 243 | { | 1492 | 209 | case 'l': | 1493 | 209 | more_ = visitor.null_value(semantic_tag::none, *this, ec); | 1494 | 209 | if (parent() == json_parse_state::root) | 1495 | 3 | { | 1496 | 3 | state_ = json_parse_state::accept; | 1497 | 3 | } | 1498 | 206 | else | 1499 | 206 | { | 1500 | 206 | state_ = json_parse_state::expect_comma_or_end; | 1501 | 206 | } | 1502 | 209 | break; | 1503 | 34 | default: | 1504 | 34 | err_handler_(json_errc::invalid_value, *this); | 1505 | 34 | ec = json_errc::invalid_value; | 1506 | 34 | more_ = false; | 1507 | 34 | return; | 1508 | 243 | } | 1509 | 209 | ++input_ptr_; | 1510 | 209 | break; | 1511 | 31.8k | case json_parse_state::slash: | 1512 | 31.8k | { | 1513 | 31.8k | switch (*input_ptr_) | 1514 | 31.8k | { | 1515 | 6.72k | case '*': | 1516 | 6.72k | state_ = json_parse_state::slash_star; | 1517 | 6.72k | more_ = err_handler_(json_errc::illegal_comment, *this); | 1518 | 6.72k | if (!more_) | 1519 | 0 | { | 1520 | 0 | ec = json_errc::illegal_comment; | 1521 | 0 | return; | 1522 | 0 | } | 1523 | 6.72k | break; | 1524 | 25.1k | case '/': | 1525 | 25.1k | state_ = json_parse_state::slash_slash; | 1526 | 25.1k | more_ = err_handler_(json_errc::illegal_comment, *this); | 1527 | 25.1k | if (!more_) | 1528 | 0 | { | 1529 | 0 | ec = json_errc::illegal_comment; | 1530 | 0 | return; | 1531 | 0 | } | 1532 | 25.1k | break; | 1533 | 25.1k | default: | 1534 | 6 | more_ = err_handler_(json_errc::syntax_error, *this); | 1535 | 6 | if (!more_) | 1536 | 6 | { | 1537 | 6 | ec = json_errc::syntax_error; | 1538 | 6 | return; | 1539 | 6 | } | 1540 | 0 | break; | 1541 | 31.8k | } | 1542 | 31.8k | ++input_ptr_; | 1543 | 31.8k | ++position_; | 1544 | 31.8k | break; | 1545 | 31.8k | } | 1546 | 1.99M | case json_parse_state::slash_star: | 1547 | 1.99M | { | 1548 | 1.99M | switch (*input_ptr_) | 1549 | 1.99M | { | 1550 | 48.2k | case '\r': | 1551 | 48.2k | push_state(state_); | 1552 | 48.2k | ++input_ptr_; | 1553 | 48.2k | ++position_; | 1554 | 48.2k | state_ = json_parse_state::cr; | 1555 | 48.2k | break; | 1556 | 22.7k | case '\n': | 1557 | 22.7k | ++input_ptr_; | 1558 | 22.7k | ++line_; | 1559 | 22.7k | ++position_; | 1560 | 22.7k | mark_position_ = position_; | 1561 | 22.7k | break; | 1562 | 15.9k | case '*': | 1563 | 15.9k | ++input_ptr_; | 1564 | 15.9k | ++position_; | 1565 | 15.9k | state_ = json_parse_state::slash_star_star; | 1566 | 15.9k | break; | 1567 | 1.90M | default: | 1568 | 1.90M | ++input_ptr_; | 1569 | 1.90M | ++position_; | 1570 | 1.90M | break; | 1571 | 1.99M | } | 1572 | 1.99M | break; | 1573 | 1.99M | } | 1574 | 2.74M | case json_parse_state::slash_slash: | 1575 | 2.74M | { | 1576 | 2.74M | switch (*input_ptr_) | 1577 | 2.74M | { | 1578 | 15.9k | case '\r': | 1579 | 25.0k | case '\n': | 1580 | 25.0k | state_ = pop_state(); | 1581 | 25.0k | break; | 1582 | 2.72M | default: | 1583 | 2.72M | ++input_ptr_; | 1584 | 2.72M | ++position_; | 1585 | 2.74M | } | 1586 | 2.74M | break; | 1587 | 2.74M | } | 1588 | 2.74M | case json_parse_state::slash_star_star: | 1589 | 15.9k | { | 1590 | 15.9k | switch (*input_ptr_) | 1591 | 15.9k | { | 1592 | 6.47k | case '/': | 1593 | 6.47k | state_ = pop_state(); | 1594 | 6.47k | break; | 1595 | 9.44k | default: | 1596 | 9.44k | state_ = json_parse_state::slash_star; | 1597 | 9.44k | break; | 1598 | 15.9k | } | 1599 | 15.9k | ++input_ptr_; | 1600 | 15.9k | ++position_; | 1601 | 15.9k | break; | 1602 | 15.9k | } | 1603 | 0 | default: | 1604 | 0 | JSONCONS_ASSERT(false); | 1605 | 0 | break; | 1606 | 52.4M | } | 1607 | 52.4M | } | 1608 | 36.5k | } |
|
1609 | | |
1610 | | void parse_true(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
1611 | 888k | { |
1612 | 888k | saved_position_ = position_; |
1613 | 888k | if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 4)) |
1614 | 888k | { |
1615 | 888k | if (*(input_ptr_+1) == 'r' && *(input_ptr_+2) == 'u' && *(input_ptr_+3) == 'e') |
1616 | 887k | { |
1617 | 887k | input_ptr_ += 4; |
1618 | 887k | position_ += 4; |
1619 | 887k | more_ = visitor.bool_value(true, semantic_tag::none, *this, ec); |
1620 | 887k | if (parent() == json_parse_state::root) |
1621 | 6 | { |
1622 | 6 | state_ = json_parse_state::accept; |
1623 | 6 | } |
1624 | 887k | else |
1625 | 887k | { |
1626 | 887k | state_ = json_parse_state::expect_comma_or_end; |
1627 | 887k | } |
1628 | 887k | } |
1629 | 169 | else |
1630 | 169 | { |
1631 | 169 | err_handler_(json_errc::invalid_value, *this); |
1632 | 169 | ec = json_errc::invalid_value; |
1633 | 169 | more_ = false; |
1634 | 169 | return; |
1635 | 169 | } |
1636 | 888k | } |
1637 | 511 | else |
1638 | 511 | { |
1639 | 511 | ++input_ptr_; |
1640 | 511 | ++position_; |
1641 | 511 | state_ = json_parse_state::t; |
1642 | 511 | } |
1643 | 888k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_true(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_true(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 1611 | 888k | { | 1612 | 888k | saved_position_ = position_; | 1613 | 888k | if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 4)) | 1614 | 888k | { | 1615 | 888k | if (*(input_ptr_+1) == 'r' && *(input_ptr_+2) == 'u' && *(input_ptr_+3) == 'e') | 1616 | 887k | { | 1617 | 887k | input_ptr_ += 4; | 1618 | 887k | position_ += 4; | 1619 | 887k | more_ = visitor.bool_value(true, semantic_tag::none, *this, ec); | 1620 | 887k | if (parent() == json_parse_state::root) | 1621 | 6 | { | 1622 | 6 | state_ = json_parse_state::accept; | 1623 | 6 | } | 1624 | 887k | else | 1625 | 887k | { | 1626 | 887k | state_ = json_parse_state::expect_comma_or_end; | 1627 | 887k | } | 1628 | 887k | } | 1629 | 169 | else | 1630 | 169 | { | 1631 | 169 | err_handler_(json_errc::invalid_value, *this); | 1632 | 169 | ec = json_errc::invalid_value; | 1633 | 169 | more_ = false; | 1634 | 169 | return; | 1635 | 169 | } | 1636 | 888k | } | 1637 | 511 | else | 1638 | 511 | { | 1639 | 511 | ++input_ptr_; | 1640 | 511 | ++position_; | 1641 | 511 | state_ = json_parse_state::t; | 1642 | 511 | } | 1643 | 888k | } |
|
1644 | | |
1645 | | void parse_null(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
1646 | 702k | { |
1647 | 702k | saved_position_ = position_; |
1648 | 702k | if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 4)) |
1649 | 702k | { |
1650 | 702k | if (*(input_ptr_+1) == 'u' && *(input_ptr_+2) == 'l' && *(input_ptr_+3) == 'l') |
1651 | 701k | { |
1652 | 701k | input_ptr_ += 4; |
1653 | 701k | position_ += 4; |
1654 | 701k | more_ = visitor.null_value(semantic_tag::none, *this, ec); |
1655 | 701k | if (parent() == json_parse_state::root) |
1656 | 5 | { |
1657 | 5 | state_ = json_parse_state::accept; |
1658 | 5 | } |
1659 | 701k | else |
1660 | 701k | { |
1661 | 701k | state_ = json_parse_state::expect_comma_or_end; |
1662 | 701k | } |
1663 | 701k | } |
1664 | 195 | else |
1665 | 195 | { |
1666 | 195 | err_handler_(json_errc::invalid_value, *this); |
1667 | 195 | ec = json_errc::invalid_value; |
1668 | 195 | more_ = false; |
1669 | 195 | return; |
1670 | 195 | } |
1671 | 702k | } |
1672 | 428 | else |
1673 | 428 | { |
1674 | 428 | ++input_ptr_; |
1675 | 428 | ++position_; |
1676 | 428 | state_ = json_parse_state::n; |
1677 | 428 | } |
1678 | 702k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_null(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_null(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 1646 | 702k | { | 1647 | 702k | saved_position_ = position_; | 1648 | 702k | if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 4)) | 1649 | 702k | { | 1650 | 702k | if (*(input_ptr_+1) == 'u' && *(input_ptr_+2) == 'l' && *(input_ptr_+3) == 'l') | 1651 | 701k | { | 1652 | 701k | input_ptr_ += 4; | 1653 | 701k | position_ += 4; | 1654 | 701k | more_ = visitor.null_value(semantic_tag::none, *this, ec); | 1655 | 701k | if (parent() == json_parse_state::root) | 1656 | 5 | { | 1657 | 5 | state_ = json_parse_state::accept; | 1658 | 5 | } | 1659 | 701k | else | 1660 | 701k | { | 1661 | 701k | state_ = json_parse_state::expect_comma_or_end; | 1662 | 701k | } | 1663 | 701k | } | 1664 | 195 | else | 1665 | 195 | { | 1666 | 195 | err_handler_(json_errc::invalid_value, *this); | 1667 | 195 | ec = json_errc::invalid_value; | 1668 | 195 | more_ = false; | 1669 | 195 | return; | 1670 | 195 | } | 1671 | 702k | } | 1672 | 428 | else | 1673 | 428 | { | 1674 | 428 | ++input_ptr_; | 1675 | 428 | ++position_; | 1676 | 428 | state_ = json_parse_state::n; | 1677 | 428 | } | 1678 | 702k | } |
|
1679 | | |
1680 | | void parse_false(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
1681 | 473k | { |
1682 | 473k | saved_position_ = position_; |
1683 | 473k | if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 5)) |
1684 | 472k | { |
1685 | 472k | if (*(input_ptr_+1) == 'a' && *(input_ptr_+2) == 'l' && *(input_ptr_+3) == 's' && *(input_ptr_+4) == 'e') |
1686 | 472k | { |
1687 | 472k | input_ptr_ += 5; |
1688 | 472k | position_ += 5; |
1689 | 472k | more_ = visitor.bool_value(false, semantic_tag::none, *this, ec); |
1690 | 472k | if (parent() == json_parse_state::root) |
1691 | 4 | { |
1692 | 4 | state_ = json_parse_state::accept; |
1693 | 4 | } |
1694 | 472k | else |
1695 | 472k | { |
1696 | 472k | state_ = json_parse_state::expect_comma_or_end; |
1697 | 472k | } |
1698 | 472k | } |
1699 | 209 | else |
1700 | 209 | { |
1701 | 209 | err_handler_(json_errc::invalid_value, *this); |
1702 | 209 | ec = json_errc::invalid_value; |
1703 | 209 | more_ = false; |
1704 | 209 | return; |
1705 | 209 | } |
1706 | 472k | } |
1707 | 507 | else |
1708 | 507 | { |
1709 | 507 | ++input_ptr_; |
1710 | 507 | ++position_; |
1711 | 507 | state_ = json_parse_state::f; |
1712 | 507 | } |
1713 | 473k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_false(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_false(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 1681 | 473k | { | 1682 | 473k | saved_position_ = position_; | 1683 | 473k | if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 5)) | 1684 | 472k | { | 1685 | 472k | if (*(input_ptr_+1) == 'a' && *(input_ptr_+2) == 'l' && *(input_ptr_+3) == 's' && *(input_ptr_+4) == 'e') | 1686 | 472k | { | 1687 | 472k | input_ptr_ += 5; | 1688 | 472k | position_ += 5; | 1689 | 472k | more_ = visitor.bool_value(false, semantic_tag::none, *this, ec); | 1690 | 472k | if (parent() == json_parse_state::root) | 1691 | 4 | { | 1692 | 4 | state_ = json_parse_state::accept; | 1693 | 4 | } | 1694 | 472k | else | 1695 | 472k | { | 1696 | 472k | state_ = json_parse_state::expect_comma_or_end; | 1697 | 472k | } | 1698 | 472k | } | 1699 | 209 | else | 1700 | 209 | { | 1701 | 209 | err_handler_(json_errc::invalid_value, *this); | 1702 | 209 | ec = json_errc::invalid_value; | 1703 | 209 | more_ = false; | 1704 | 209 | return; | 1705 | 209 | } | 1706 | 472k | } | 1707 | 507 | else | 1708 | 507 | { | 1709 | 507 | ++input_ptr_; | 1710 | 507 | ++position_; | 1711 | 507 | state_ = json_parse_state::f; | 1712 | 507 | } | 1713 | 473k | } |
|
1714 | | |
1715 | | void parse_number(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
1716 | 23.8M | { |
1717 | 23.8M | const char_type* local_input_end = end_input_; |
1718 | | |
1719 | 23.8M | switch (state_) |
1720 | 23.8M | { |
1721 | 860k | case json_parse_state::minus: |
1722 | 860k | goto minus_sign; |
1723 | 4.91M | case json_parse_state::zero: |
1724 | 4.91M | goto zero; |
1725 | 18.0M | case json_parse_state::integer: |
1726 | 18.0M | goto integer; |
1727 | 126 | case json_parse_state::fraction1: |
1728 | 126 | goto fraction1; |
1729 | 483 | case json_parse_state::fraction2: |
1730 | 483 | goto fraction2; |
1731 | 233 | case json_parse_state::exp1: |
1732 | 233 | goto exp1; |
1733 | 82 | case json_parse_state::exp2: |
1734 | 82 | goto exp2; |
1735 | 623 | case json_parse_state::exp3: |
1736 | 623 | goto exp3; |
1737 | 0 | default: |
1738 | 0 | JSONCONS_UNREACHABLE(); |
1739 | 23.8M | } |
1740 | 860k | minus_sign: |
1741 | 860k | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
1742 | 194 | { |
1743 | 194 | state_ = json_parse_state::minus; |
1744 | 194 | return; |
1745 | 194 | } |
1746 | 859k | switch (*input_ptr_) |
1747 | 859k | { |
1748 | 3.53k | case '0': |
1749 | 3.53k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1750 | 3.53k | ++input_ptr_; |
1751 | 3.53k | ++position_; |
1752 | 3.53k | goto zero; |
1753 | 856k | case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': |
1754 | 856k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1755 | 856k | ++input_ptr_; |
1756 | 856k | ++position_; |
1757 | 856k | goto integer; |
1758 | 18 | default: |
1759 | 18 | err_handler_(json_errc::invalid_number, *this); |
1760 | 18 | ec = json_errc::expected_value; |
1761 | 18 | more_ = false; |
1762 | 18 | return; |
1763 | 859k | } |
1764 | 4.91M | zero: |
1765 | 4.91M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
1766 | 629 | { |
1767 | 629 | state_ = json_parse_state::zero; |
1768 | 629 | return; |
1769 | 629 | } |
1770 | 4.91M | switch (*input_ptr_) |
1771 | 4.91M | { |
1772 | 3.55k | case '\r': |
1773 | 3.55k | end_integer_value(visitor, ec); |
1774 | 3.55k | if (ec) return; |
1775 | 3.55k | ++input_ptr_; |
1776 | 3.55k | ++position_; |
1777 | 3.55k | push_state(state_); |
1778 | 3.55k | state_ = json_parse_state::cr; |
1779 | 3.55k | return; |
1780 | 1.11k | case '\n': |
1781 | 1.11k | end_integer_value(visitor, ec); |
1782 | 1.11k | if (ec) return; |
1783 | 1.11k | ++input_ptr_; |
1784 | 1.11k | ++line_; |
1785 | 1.11k | ++position_; |
1786 | 1.11k | mark_position_ = position_; |
1787 | 1.11k | return; |
1788 | 1.63k | case ' ':case '\t': |
1789 | 1.63k | end_integer_value(visitor, ec); |
1790 | 1.63k | if (ec) return; |
1791 | 1.63k | skip_space(); |
1792 | 1.63k | return; |
1793 | 1.58k | case '/': |
1794 | 1.58k | end_integer_value(visitor, ec); |
1795 | 1.58k | if (ec) return; |
1796 | 1.58k | ++input_ptr_; |
1797 | 1.58k | ++position_; |
1798 | 1.58k | push_state(state_); |
1799 | 1.58k | state_ = json_parse_state::slash; |
1800 | 1.58k | return; |
1801 | 3.03k | case '}': |
1802 | 6.58k | case ']': |
1803 | 6.58k | end_integer_value(visitor, ec); |
1804 | 6.58k | if (ec) return; |
1805 | 6.58k | state_ = json_parse_state::expect_comma_or_end; |
1806 | 6.58k | return; |
1807 | 79.5k | case '.': |
1808 | 79.5k | string_buffer_.push_back(to_double_.get_decimal_point()); |
1809 | 79.5k | ++input_ptr_; |
1810 | 79.5k | ++position_; |
1811 | 79.5k | goto fraction1; |
1812 | 248k | case 'e':case 'E': |
1813 | 248k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1814 | 248k | ++input_ptr_; |
1815 | 248k | ++position_; |
1816 | 248k | goto exp1; |
1817 | 4.57M | case ',': |
1818 | 4.57M | end_integer_value(visitor, ec); |
1819 | 4.57M | if (ec) return; |
1820 | 4.57M | begin_member_or_element(ec); |
1821 | 4.57M | if (ec) return; |
1822 | 4.57M | ++input_ptr_; |
1823 | 4.57M | ++position_; |
1824 | 4.57M | return; |
1825 | 49 | case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': |
1826 | 49 | err_handler_(json_errc::leading_zero, *this); |
1827 | 49 | ec = json_errc::leading_zero; |
1828 | 49 | more_ = false; |
1829 | 49 | state_ = json_parse_state::zero; |
1830 | 49 | return; |
1831 | 15 | default: |
1832 | 15 | err_handler_(json_errc::invalid_number, *this); |
1833 | 15 | ec = json_errc::invalid_number; |
1834 | 15 | more_ = false; |
1835 | 15 | state_ = json_parse_state::zero; |
1836 | 15 | return; |
1837 | 4.91M | } |
1838 | 53.7M | integer: |
1839 | 53.7M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
1840 | 5.02k | { |
1841 | 5.02k | state_ = json_parse_state::integer; |
1842 | 5.02k | return; |
1843 | 5.02k | } |
1844 | 53.7M | switch (*input_ptr_) |
1845 | 53.7M | { |
1846 | 15.5k | case '\r': |
1847 | 15.5k | end_integer_value(visitor, ec); |
1848 | 15.5k | if (ec) return; |
1849 | 15.5k | push_state(state_); |
1850 | 15.5k | ++input_ptr_; |
1851 | 15.5k | ++position_; |
1852 | 15.5k | state_ = json_parse_state::cr; |
1853 | 15.5k | return; |
1854 | 1.79k | case '\n': |
1855 | 1.79k | end_integer_value(visitor, ec); |
1856 | 1.79k | if (ec) return; |
1857 | 1.79k | ++input_ptr_; |
1858 | 1.79k | ++line_; |
1859 | 1.79k | ++position_; |
1860 | 1.79k | mark_position_ = position_; |
1861 | 1.79k | return; |
1862 | 2.68k | case ' ':case '\t': |
1863 | 2.68k | end_integer_value(visitor, ec); |
1864 | 2.68k | if (ec) return; |
1865 | 2.68k | skip_space(); |
1866 | 2.68k | return; |
1867 | 708 | case '/': |
1868 | 708 | end_integer_value(visitor, ec); |
1869 | 708 | if (ec) return; |
1870 | 708 | push_state(state_); |
1871 | 708 | ++input_ptr_; |
1872 | 708 | ++position_; |
1873 | 708 | state_ = json_parse_state::slash; |
1874 | 708 | return; |
1875 | 3.97k | case '}': |
1876 | 10.7k | case ']': |
1877 | 10.7k | end_integer_value(visitor, ec); |
1878 | 10.7k | if (ec) return; |
1879 | 10.7k | state_ = json_parse_state::expect_comma_or_end; |
1880 | 10.7k | return; |
1881 | 34.8M | case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': |
1882 | 34.8M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1883 | 34.8M | ++input_ptr_; |
1884 | 34.8M | ++position_; |
1885 | 34.8M | goto integer; |
1886 | 651k | case '.': |
1887 | 651k | string_buffer_.push_back(to_double_.get_decimal_point()); |
1888 | 651k | ++input_ptr_; |
1889 | 651k | ++position_; |
1890 | 651k | goto fraction1; |
1891 | 1.58M | case 'e':case 'E': |
1892 | 1.58M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1893 | 1.58M | ++input_ptr_; |
1894 | 1.58M | ++position_; |
1895 | 1.58M | goto exp1; |
1896 | 16.6M | case ',': |
1897 | 16.6M | end_integer_value(visitor, ec); |
1898 | 16.6M | if (ec) return; |
1899 | 16.6M | begin_member_or_element(ec); |
1900 | 16.6M | if (ec) return; |
1901 | 16.6M | ++input_ptr_; |
1902 | 16.6M | ++position_; |
1903 | 16.6M | return; |
1904 | 54 | default: |
1905 | 54 | err_handler_(json_errc::invalid_number, *this); |
1906 | 54 | ec = json_errc::invalid_number; |
1907 | 54 | more_ = false; |
1908 | 54 | state_ = json_parse_state::integer; |
1909 | 54 | return; |
1910 | 53.7M | } |
1911 | 731k | fraction1: |
1912 | 731k | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
1913 | 189 | { |
1914 | 189 | state_ = json_parse_state::fraction1; |
1915 | 189 | return; |
1916 | 189 | } |
1917 | 731k | switch (*input_ptr_) |
1918 | 731k | { |
1919 | 730k | case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': |
1920 | 730k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1921 | 730k | ++input_ptr_; |
1922 | 730k | ++position_; |
1923 | 730k | goto fraction2; |
1924 | 54 | default: |
1925 | 54 | err_handler_(json_errc::invalid_number, *this); |
1926 | 54 | ec = json_errc::invalid_number; |
1927 | 54 | more_ = false; |
1928 | 54 | state_ = json_parse_state::fraction1; |
1929 | 54 | return; |
1930 | 731k | } |
1931 | 7.73M | fraction2: |
1932 | 7.73M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
1933 | 1.72k | { |
1934 | 1.72k | state_ = json_parse_state::fraction2; |
1935 | 1.72k | return; |
1936 | 1.72k | } |
1937 | 7.73M | switch (*input_ptr_) |
1938 | 7.73M | { |
1939 | 214k | case '\r': |
1940 | 214k | end_fraction_value(visitor, ec); |
1941 | 214k | if (ec) return; |
1942 | 214k | push_state(state_); |
1943 | 214k | ++input_ptr_; |
1944 | 214k | ++position_; |
1945 | 214k | state_ = json_parse_state::cr; |
1946 | 214k | return; |
1947 | 862 | case '\n': |
1948 | 862 | end_fraction_value(visitor, ec); |
1949 | 862 | if (ec) return; |
1950 | 862 | ++input_ptr_; |
1951 | 862 | ++line_; |
1952 | 862 | ++position_; |
1953 | 862 | mark_position_ = position_; |
1954 | 862 | return; |
1955 | 1.47k | case ' ':case '\t': |
1956 | 1.47k | end_fraction_value(visitor, ec); |
1957 | 1.47k | if (ec) return; |
1958 | 1.47k | skip_space(); |
1959 | 1.47k | return; |
1960 | 3.00k | case '/': |
1961 | 3.00k | end_fraction_value(visitor, ec); |
1962 | 3.00k | if (ec) return; |
1963 | 3.00k | push_state(state_); |
1964 | 3.00k | ++input_ptr_; |
1965 | 3.00k | ++position_; |
1966 | 3.00k | state_ = json_parse_state::slash; |
1967 | 3.00k | return; |
1968 | 845 | case '}': |
1969 | 845 | end_fraction_value(visitor, ec); |
1970 | 845 | if (ec) return; |
1971 | 845 | state_ = json_parse_state::expect_comma_or_end; |
1972 | 845 | return; |
1973 | 591 | case ']': |
1974 | 591 | end_fraction_value(visitor, ec); |
1975 | 591 | if (ec) return; |
1976 | 591 | state_ = json_parse_state::expect_comma_or_end; |
1977 | 591 | return; |
1978 | 497k | case ',': |
1979 | 497k | end_fraction_value(visitor, ec); |
1980 | 497k | if (ec) return; |
1981 | 497k | begin_member_or_element(ec); |
1982 | 497k | if (ec) return; |
1983 | 497k | ++input_ptr_; |
1984 | 497k | ++position_; |
1985 | 497k | return; |
1986 | 7.00M | case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': |
1987 | 7.00M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1988 | 7.00M | ++input_ptr_; |
1989 | 7.00M | ++position_; |
1990 | 7.00M | goto fraction2; |
1991 | 10.4k | case 'e':case 'E': |
1992 | 10.4k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
1993 | 10.4k | ++input_ptr_; |
1994 | 10.4k | ++position_; |
1995 | 10.4k | goto exp1; |
1996 | 9 | default: |
1997 | 9 | err_handler_(json_errc::invalid_number, *this); |
1998 | 9 | ec = json_errc::invalid_number; |
1999 | 9 | more_ = false; |
2000 | 9 | state_ = json_parse_state::fraction2; |
2001 | 9 | return; |
2002 | 7.73M | } |
2003 | 1.84M | exp1: |
2004 | 1.84M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2005 | 389 | { |
2006 | 389 | state_ = json_parse_state::exp1; |
2007 | 389 | return; |
2008 | 389 | } |
2009 | 1.84M | switch (*input_ptr_) |
2010 | 1.84M | { |
2011 | 76.7k | case '+': |
2012 | 76.7k | ++input_ptr_; |
2013 | 76.7k | ++position_; |
2014 | 76.7k | goto exp2; |
2015 | 161k | case '-': |
2016 | 161k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
2017 | 161k | ++input_ptr_; |
2018 | 161k | ++position_; |
2019 | 161k | goto exp2; |
2020 | 1.60M | case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': |
2021 | 1.60M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
2022 | 1.60M | ++input_ptr_; |
2023 | 1.60M | ++position_; |
2024 | 1.60M | goto exp3; |
2025 | 16 | default: |
2026 | 16 | err_handler_(json_errc::invalid_number, *this); |
2027 | 16 | ec = json_errc::expected_value; |
2028 | 16 | more_ = false; |
2029 | 16 | state_ = json_parse_state::exp1; |
2030 | 16 | return; |
2031 | 1.84M | } |
2032 | 238k | exp2: |
2033 | 238k | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2034 | 143 | { |
2035 | 143 | state_ = json_parse_state::exp2; |
2036 | 143 | return; |
2037 | 143 | } |
2038 | 238k | switch (*input_ptr_) |
2039 | 238k | { |
2040 | 238k | case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': |
2041 | 238k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
2042 | 238k | ++input_ptr_; |
2043 | 238k | ++position_; |
2044 | 238k | goto exp3; |
2045 | 51 | default: |
2046 | 51 | err_handler_(json_errc::invalid_number, *this); |
2047 | 51 | ec = json_errc::expected_value; |
2048 | 51 | more_ = false; |
2049 | 51 | state_ = json_parse_state::exp2; |
2050 | 51 | return; |
2051 | 238k | } |
2052 | | |
2053 | 10.3M | exp3: |
2054 | 10.3M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2055 | 2.62k | { |
2056 | 2.62k | state_ = json_parse_state::exp3; |
2057 | 2.62k | return; |
2058 | 2.62k | } |
2059 | 10.3M | switch (*input_ptr_) |
2060 | 10.3M | { |
2061 | 66.3k | case '\r': |
2062 | 66.3k | end_fraction_value(visitor, ec); |
2063 | 66.3k | if (ec) return; |
2064 | 66.3k | ++input_ptr_; |
2065 | 66.3k | ++position_; |
2066 | 66.3k | push_state(state_); |
2067 | 66.3k | state_ = json_parse_state::cr; |
2068 | 66.3k | return; |
2069 | 692 | case '\n': |
2070 | 692 | end_fraction_value(visitor, ec); |
2071 | 692 | if (ec) return; |
2072 | 692 | ++input_ptr_; |
2073 | 692 | ++line_; |
2074 | 692 | ++position_; |
2075 | 692 | mark_position_ = position_; |
2076 | 692 | return; |
2077 | 5.63k | case ' ':case '\t': |
2078 | 5.63k | end_fraction_value(visitor, ec); |
2079 | 5.63k | if (ec) return; |
2080 | 5.63k | skip_space(); |
2081 | 5.63k | return; |
2082 | 649 | case '/': |
2083 | 649 | end_fraction_value(visitor, ec); |
2084 | 649 | if (ec) return; |
2085 | 649 | push_state(state_); |
2086 | 649 | ++input_ptr_; |
2087 | 649 | ++position_; |
2088 | 649 | state_ = json_parse_state::slash; |
2089 | 649 | return; |
2090 | 704 | case '}': |
2091 | 704 | end_fraction_value(visitor, ec); |
2092 | 704 | if (ec) return; |
2093 | 704 | state_ = json_parse_state::expect_comma_or_end; |
2094 | 704 | return; |
2095 | 3.84k | case ']': |
2096 | 3.84k | end_fraction_value(visitor, ec); |
2097 | 3.84k | if (ec) return; |
2098 | 3.84k | state_ = json_parse_state::expect_comma_or_end; |
2099 | 3.84k | return; |
2100 | 1.76M | case ',': |
2101 | 1.76M | end_fraction_value(visitor, ec); |
2102 | 1.76M | if (ec) return; |
2103 | 1.76M | begin_member_or_element(ec); |
2104 | 1.76M | if (ec) return; |
2105 | 1.76M | ++input_ptr_; |
2106 | 1.76M | ++position_; |
2107 | 1.76M | return; |
2108 | 8.50M | case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': |
2109 | 8.50M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); |
2110 | 8.50M | ++input_ptr_; |
2111 | 8.50M | ++position_; |
2112 | 8.50M | goto exp3; |
2113 | 21 | default: |
2114 | 21 | err_handler_(json_errc::invalid_number, *this); |
2115 | 21 | ec = json_errc::invalid_number; |
2116 | 21 | more_ = false; |
2117 | 21 | state_ = json_parse_state::exp3; |
2118 | 21 | return; |
2119 | 10.3M | } |
2120 | | |
2121 | 10.3M | JSONCONS_UNREACHABLE(); |
2122 | 10.3M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_number(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_number(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 1716 | 23.8M | { | 1717 | 23.8M | const char_type* local_input_end = end_input_; | 1718 | | | 1719 | 23.8M | switch (state_) | 1720 | 23.8M | { | 1721 | 860k | case json_parse_state::minus: | 1722 | 860k | goto minus_sign; | 1723 | 4.91M | case json_parse_state::zero: | 1724 | 4.91M | goto zero; | 1725 | 18.0M | case json_parse_state::integer: | 1726 | 18.0M | goto integer; | 1727 | 126 | case json_parse_state::fraction1: | 1728 | 126 | goto fraction1; | 1729 | 483 | case json_parse_state::fraction2: | 1730 | 483 | goto fraction2; | 1731 | 233 | case json_parse_state::exp1: | 1732 | 233 | goto exp1; | 1733 | 82 | case json_parse_state::exp2: | 1734 | 82 | goto exp2; | 1735 | 623 | case json_parse_state::exp3: | 1736 | 623 | goto exp3; | 1737 | 0 | default: | 1738 | 0 | JSONCONS_UNREACHABLE(); | 1739 | 23.8M | } | 1740 | 860k | minus_sign: | 1741 | 860k | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 1742 | 194 | { | 1743 | 194 | state_ = json_parse_state::minus; | 1744 | 194 | return; | 1745 | 194 | } | 1746 | 859k | switch (*input_ptr_) | 1747 | 859k | { | 1748 | 3.53k | case '0': | 1749 | 3.53k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1750 | 3.53k | ++input_ptr_; | 1751 | 3.53k | ++position_; | 1752 | 3.53k | goto zero; | 1753 | 856k | case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': | 1754 | 856k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1755 | 856k | ++input_ptr_; | 1756 | 856k | ++position_; | 1757 | 856k | goto integer; | 1758 | 18 | default: | 1759 | 18 | err_handler_(json_errc::invalid_number, *this); | 1760 | 18 | ec = json_errc::expected_value; | 1761 | 18 | more_ = false; | 1762 | 18 | return; | 1763 | 859k | } | 1764 | 4.91M | zero: | 1765 | 4.91M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 1766 | 629 | { | 1767 | 629 | state_ = json_parse_state::zero; | 1768 | 629 | return; | 1769 | 629 | } | 1770 | 4.91M | switch (*input_ptr_) | 1771 | 4.91M | { | 1772 | 3.55k | case '\r': | 1773 | 3.55k | end_integer_value(visitor, ec); | 1774 | 3.55k | if (ec) return; | 1775 | 3.55k | ++input_ptr_; | 1776 | 3.55k | ++position_; | 1777 | 3.55k | push_state(state_); | 1778 | 3.55k | state_ = json_parse_state::cr; | 1779 | 3.55k | return; | 1780 | 1.11k | case '\n': | 1781 | 1.11k | end_integer_value(visitor, ec); | 1782 | 1.11k | if (ec) return; | 1783 | 1.11k | ++input_ptr_; | 1784 | 1.11k | ++line_; | 1785 | 1.11k | ++position_; | 1786 | 1.11k | mark_position_ = position_; | 1787 | 1.11k | return; | 1788 | 1.63k | case ' ':case '\t': | 1789 | 1.63k | end_integer_value(visitor, ec); | 1790 | 1.63k | if (ec) return; | 1791 | 1.63k | skip_space(); | 1792 | 1.63k | return; | 1793 | 1.58k | case '/': | 1794 | 1.58k | end_integer_value(visitor, ec); | 1795 | 1.58k | if (ec) return; | 1796 | 1.58k | ++input_ptr_; | 1797 | 1.58k | ++position_; | 1798 | 1.58k | push_state(state_); | 1799 | 1.58k | state_ = json_parse_state::slash; | 1800 | 1.58k | return; | 1801 | 3.03k | case '}': | 1802 | 6.58k | case ']': | 1803 | 6.58k | end_integer_value(visitor, ec); | 1804 | 6.58k | if (ec) return; | 1805 | 6.58k | state_ = json_parse_state::expect_comma_or_end; | 1806 | 6.58k | return; | 1807 | 79.5k | case '.': | 1808 | 79.5k | string_buffer_.push_back(to_double_.get_decimal_point()); | 1809 | 79.5k | ++input_ptr_; | 1810 | 79.5k | ++position_; | 1811 | 79.5k | goto fraction1; | 1812 | 248k | case 'e':case 'E': | 1813 | 248k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1814 | 248k | ++input_ptr_; | 1815 | 248k | ++position_; | 1816 | 248k | goto exp1; | 1817 | 4.57M | case ',': | 1818 | 4.57M | end_integer_value(visitor, ec); | 1819 | 4.57M | if (ec) return; | 1820 | 4.57M | begin_member_or_element(ec); | 1821 | 4.57M | if (ec) return; | 1822 | 4.57M | ++input_ptr_; | 1823 | 4.57M | ++position_; | 1824 | 4.57M | return; | 1825 | 49 | case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': | 1826 | 49 | err_handler_(json_errc::leading_zero, *this); | 1827 | 49 | ec = json_errc::leading_zero; | 1828 | 49 | more_ = false; | 1829 | 49 | state_ = json_parse_state::zero; | 1830 | 49 | return; | 1831 | 15 | default: | 1832 | 15 | err_handler_(json_errc::invalid_number, *this); | 1833 | 15 | ec = json_errc::invalid_number; | 1834 | 15 | more_ = false; | 1835 | 15 | state_ = json_parse_state::zero; | 1836 | 15 | return; | 1837 | 4.91M | } | 1838 | 53.7M | integer: | 1839 | 53.7M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 1840 | 5.02k | { | 1841 | 5.02k | state_ = json_parse_state::integer; | 1842 | 5.02k | return; | 1843 | 5.02k | } | 1844 | 53.7M | switch (*input_ptr_) | 1845 | 53.7M | { | 1846 | 15.5k | case '\r': | 1847 | 15.5k | end_integer_value(visitor, ec); | 1848 | 15.5k | if (ec) return; | 1849 | 15.5k | push_state(state_); | 1850 | 15.5k | ++input_ptr_; | 1851 | 15.5k | ++position_; | 1852 | 15.5k | state_ = json_parse_state::cr; | 1853 | 15.5k | return; | 1854 | 1.79k | case '\n': | 1855 | 1.79k | end_integer_value(visitor, ec); | 1856 | 1.79k | if (ec) return; | 1857 | 1.79k | ++input_ptr_; | 1858 | 1.79k | ++line_; | 1859 | 1.79k | ++position_; | 1860 | 1.79k | mark_position_ = position_; | 1861 | 1.79k | return; | 1862 | 2.68k | case ' ':case '\t': | 1863 | 2.68k | end_integer_value(visitor, ec); | 1864 | 2.68k | if (ec) return; | 1865 | 2.68k | skip_space(); | 1866 | 2.68k | return; | 1867 | 708 | case '/': | 1868 | 708 | end_integer_value(visitor, ec); | 1869 | 708 | if (ec) return; | 1870 | 708 | push_state(state_); | 1871 | 708 | ++input_ptr_; | 1872 | 708 | ++position_; | 1873 | 708 | state_ = json_parse_state::slash; | 1874 | 708 | return; | 1875 | 3.97k | case '}': | 1876 | 10.7k | case ']': | 1877 | 10.7k | end_integer_value(visitor, ec); | 1878 | 10.7k | if (ec) return; | 1879 | 10.7k | state_ = json_parse_state::expect_comma_or_end; | 1880 | 10.7k | return; | 1881 | 34.8M | case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': | 1882 | 34.8M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1883 | 34.8M | ++input_ptr_; | 1884 | 34.8M | ++position_; | 1885 | 34.8M | goto integer; | 1886 | 651k | case '.': | 1887 | 651k | string_buffer_.push_back(to_double_.get_decimal_point()); | 1888 | 651k | ++input_ptr_; | 1889 | 651k | ++position_; | 1890 | 651k | goto fraction1; | 1891 | 1.58M | case 'e':case 'E': | 1892 | 1.58M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1893 | 1.58M | ++input_ptr_; | 1894 | 1.58M | ++position_; | 1895 | 1.58M | goto exp1; | 1896 | 16.6M | case ',': | 1897 | 16.6M | end_integer_value(visitor, ec); | 1898 | 16.6M | if (ec) return; | 1899 | 16.6M | begin_member_or_element(ec); | 1900 | 16.6M | if (ec) return; | 1901 | 16.6M | ++input_ptr_; | 1902 | 16.6M | ++position_; | 1903 | 16.6M | return; | 1904 | 54 | default: | 1905 | 54 | err_handler_(json_errc::invalid_number, *this); | 1906 | 54 | ec = json_errc::invalid_number; | 1907 | 54 | more_ = false; | 1908 | 54 | state_ = json_parse_state::integer; | 1909 | 54 | return; | 1910 | 53.7M | } | 1911 | 731k | fraction1: | 1912 | 731k | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 1913 | 189 | { | 1914 | 189 | state_ = json_parse_state::fraction1; | 1915 | 189 | return; | 1916 | 189 | } | 1917 | 731k | switch (*input_ptr_) | 1918 | 731k | { | 1919 | 730k | case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': | 1920 | 730k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1921 | 730k | ++input_ptr_; | 1922 | 730k | ++position_; | 1923 | 730k | goto fraction2; | 1924 | 54 | default: | 1925 | 54 | err_handler_(json_errc::invalid_number, *this); | 1926 | 54 | ec = json_errc::invalid_number; | 1927 | 54 | more_ = false; | 1928 | 54 | state_ = json_parse_state::fraction1; | 1929 | 54 | return; | 1930 | 731k | } | 1931 | 7.73M | fraction2: | 1932 | 7.73M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 1933 | 1.72k | { | 1934 | 1.72k | state_ = json_parse_state::fraction2; | 1935 | 1.72k | return; | 1936 | 1.72k | } | 1937 | 7.73M | switch (*input_ptr_) | 1938 | 7.73M | { | 1939 | 214k | case '\r': | 1940 | 214k | end_fraction_value(visitor, ec); | 1941 | 214k | if (ec) return; | 1942 | 214k | push_state(state_); | 1943 | 214k | ++input_ptr_; | 1944 | 214k | ++position_; | 1945 | 214k | state_ = json_parse_state::cr; | 1946 | 214k | return; | 1947 | 862 | case '\n': | 1948 | 862 | end_fraction_value(visitor, ec); | 1949 | 862 | if (ec) return; | 1950 | 862 | ++input_ptr_; | 1951 | 862 | ++line_; | 1952 | 862 | ++position_; | 1953 | 862 | mark_position_ = position_; | 1954 | 862 | return; | 1955 | 1.47k | case ' ':case '\t': | 1956 | 1.47k | end_fraction_value(visitor, ec); | 1957 | 1.47k | if (ec) return; | 1958 | 1.47k | skip_space(); | 1959 | 1.47k | return; | 1960 | 3.00k | case '/': | 1961 | 3.00k | end_fraction_value(visitor, ec); | 1962 | 3.00k | if (ec) return; | 1963 | 3.00k | push_state(state_); | 1964 | 3.00k | ++input_ptr_; | 1965 | 3.00k | ++position_; | 1966 | 3.00k | state_ = json_parse_state::slash; | 1967 | 3.00k | return; | 1968 | 845 | case '}': | 1969 | 845 | end_fraction_value(visitor, ec); | 1970 | 845 | if (ec) return; | 1971 | 845 | state_ = json_parse_state::expect_comma_or_end; | 1972 | 845 | return; | 1973 | 591 | case ']': | 1974 | 591 | end_fraction_value(visitor, ec); | 1975 | 591 | if (ec) return; | 1976 | 591 | state_ = json_parse_state::expect_comma_or_end; | 1977 | 591 | return; | 1978 | 497k | case ',': | 1979 | 497k | end_fraction_value(visitor, ec); | 1980 | 497k | if (ec) return; | 1981 | 497k | begin_member_or_element(ec); | 1982 | 497k | if (ec) return; | 1983 | 497k | ++input_ptr_; | 1984 | 497k | ++position_; | 1985 | 497k | return; | 1986 | 7.00M | case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': | 1987 | 7.00M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1988 | 7.00M | ++input_ptr_; | 1989 | 7.00M | ++position_; | 1990 | 7.00M | goto fraction2; | 1991 | 10.4k | case 'e':case 'E': | 1992 | 10.4k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 1993 | 10.4k | ++input_ptr_; | 1994 | 10.4k | ++position_; | 1995 | 10.4k | goto exp1; | 1996 | 9 | default: | 1997 | 9 | err_handler_(json_errc::invalid_number, *this); | 1998 | 9 | ec = json_errc::invalid_number; | 1999 | 9 | more_ = false; | 2000 | 9 | state_ = json_parse_state::fraction2; | 2001 | 9 | return; | 2002 | 7.73M | } | 2003 | 1.84M | exp1: | 2004 | 1.84M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2005 | 389 | { | 2006 | 389 | state_ = json_parse_state::exp1; | 2007 | 389 | return; | 2008 | 389 | } | 2009 | 1.84M | switch (*input_ptr_) | 2010 | 1.84M | { | 2011 | 76.7k | case '+': | 2012 | 76.7k | ++input_ptr_; | 2013 | 76.7k | ++position_; | 2014 | 76.7k | goto exp2; | 2015 | 161k | case '-': | 2016 | 161k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 2017 | 161k | ++input_ptr_; | 2018 | 161k | ++position_; | 2019 | 161k | goto exp2; | 2020 | 1.60M | case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': | 2021 | 1.60M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 2022 | 1.60M | ++input_ptr_; | 2023 | 1.60M | ++position_; | 2024 | 1.60M | goto exp3; | 2025 | 16 | default: | 2026 | 16 | err_handler_(json_errc::invalid_number, *this); | 2027 | 16 | ec = json_errc::expected_value; | 2028 | 16 | more_ = false; | 2029 | 16 | state_ = json_parse_state::exp1; | 2030 | 16 | return; | 2031 | 1.84M | } | 2032 | 238k | exp2: | 2033 | 238k | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2034 | 143 | { | 2035 | 143 | state_ = json_parse_state::exp2; | 2036 | 143 | return; | 2037 | 143 | } | 2038 | 238k | switch (*input_ptr_) | 2039 | 238k | { | 2040 | 238k | case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': | 2041 | 238k | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 2042 | 238k | ++input_ptr_; | 2043 | 238k | ++position_; | 2044 | 238k | goto exp3; | 2045 | 51 | default: | 2046 | 51 | err_handler_(json_errc::invalid_number, *this); | 2047 | 51 | ec = json_errc::expected_value; | 2048 | 51 | more_ = false; | 2049 | 51 | state_ = json_parse_state::exp2; | 2050 | 51 | return; | 2051 | 238k | } | 2052 | | | 2053 | 10.3M | exp3: | 2054 | 10.3M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2055 | 2.62k | { | 2056 | 2.62k | state_ = json_parse_state::exp3; | 2057 | 2.62k | return; | 2058 | 2.62k | } | 2059 | 10.3M | switch (*input_ptr_) | 2060 | 10.3M | { | 2061 | 66.3k | case '\r': | 2062 | 66.3k | end_fraction_value(visitor, ec); | 2063 | 66.3k | if (ec) return; | 2064 | 66.3k | ++input_ptr_; | 2065 | 66.3k | ++position_; | 2066 | 66.3k | push_state(state_); | 2067 | 66.3k | state_ = json_parse_state::cr; | 2068 | 66.3k | return; | 2069 | 692 | case '\n': | 2070 | 692 | end_fraction_value(visitor, ec); | 2071 | 692 | if (ec) return; | 2072 | 692 | ++input_ptr_; | 2073 | 692 | ++line_; | 2074 | 692 | ++position_; | 2075 | 692 | mark_position_ = position_; | 2076 | 692 | return; | 2077 | 5.63k | case ' ':case '\t': | 2078 | 5.63k | end_fraction_value(visitor, ec); | 2079 | 5.63k | if (ec) return; | 2080 | 5.63k | skip_space(); | 2081 | 5.63k | return; | 2082 | 649 | case '/': | 2083 | 649 | end_fraction_value(visitor, ec); | 2084 | 649 | if (ec) return; | 2085 | 649 | push_state(state_); | 2086 | 649 | ++input_ptr_; | 2087 | 649 | ++position_; | 2088 | 649 | state_ = json_parse_state::slash; | 2089 | 649 | return; | 2090 | 704 | case '}': | 2091 | 704 | end_fraction_value(visitor, ec); | 2092 | 704 | if (ec) return; | 2093 | 704 | state_ = json_parse_state::expect_comma_or_end; | 2094 | 704 | return; | 2095 | 3.84k | case ']': | 2096 | 3.84k | end_fraction_value(visitor, ec); | 2097 | 3.84k | if (ec) return; | 2098 | 3.84k | state_ = json_parse_state::expect_comma_or_end; | 2099 | 3.84k | return; | 2100 | 1.76M | case ',': | 2101 | 1.76M | end_fraction_value(visitor, ec); | 2102 | 1.76M | if (ec) return; | 2103 | 1.76M | begin_member_or_element(ec); | 2104 | 1.76M | if (ec) return; | 2105 | 1.76M | ++input_ptr_; | 2106 | 1.76M | ++position_; | 2107 | 1.76M | return; | 2108 | 8.50M | case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': | 2109 | 8.50M | string_buffer_.push_back(static_cast<char>(*input_ptr_)); | 2110 | 8.50M | ++input_ptr_; | 2111 | 8.50M | ++position_; | 2112 | 8.50M | goto exp3; | 2113 | 21 | default: | 2114 | 21 | err_handler_(json_errc::invalid_number, *this); | 2115 | 21 | ec = json_errc::invalid_number; | 2116 | 21 | more_ = false; | 2117 | 21 | state_ = json_parse_state::exp3; | 2118 | 21 | return; | 2119 | 10.3M | } | 2120 | | | 2121 | 0 | JSONCONS_UNREACHABLE(); | 2122 | 10.3M | } |
|
2123 | | |
2124 | | void parse_string(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
2125 | 3.29M | { |
2126 | 3.29M | const char_type* local_input_end = end_input_; |
2127 | 3.29M | const char_type* sb = input_ptr_; |
2128 | | |
2129 | 3.29M | switch (state_) |
2130 | 3.29M | { |
2131 | 3.29M | case json_parse_state::string: |
2132 | 3.29M | goto string_u1; |
2133 | 385 | case json_parse_state::escape: |
2134 | 385 | goto escape; |
2135 | 241 | case json_parse_state::escape_u1: |
2136 | 241 | goto escape_u1; |
2137 | 240 | case json_parse_state::escape_u2: |
2138 | 240 | goto escape_u2; |
2139 | 245 | case json_parse_state::escape_u3: |
2140 | 245 | goto escape_u3; |
2141 | 240 | case json_parse_state::escape_u4: |
2142 | 240 | goto escape_u4; |
2143 | 242 | case json_parse_state::escape_expect_surrogate_pair1: |
2144 | 242 | goto escape_expect_surrogate_pair1; |
2145 | 209 | case json_parse_state::escape_expect_surrogate_pair2: |
2146 | 209 | goto escape_expect_surrogate_pair2; |
2147 | 213 | case json_parse_state::escape_u5: |
2148 | 213 | goto escape_u5; |
2149 | 206 | case json_parse_state::escape_u6: |
2150 | 206 | goto escape_u6; |
2151 | 213 | case json_parse_state::escape_u7: |
2152 | 213 | goto escape_u7; |
2153 | 202 | case json_parse_state::escape_u8: |
2154 | 202 | goto escape_u8; |
2155 | 0 | default: |
2156 | 0 | JSONCONS_UNREACHABLE(); |
2157 | 3.29M | } |
2158 | | |
2159 | 9.46M | string_u1: |
2160 | 83.1M | while (input_ptr_ < local_input_end) |
2161 | 83.0M | { |
2162 | 83.0M | switch (*input_ptr_) |
2163 | 83.0M | { |
2164 | 2.40k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: |
2165 | 2.40k | { |
2166 | 2.40k | position_ += (input_ptr_ - sb + 1); |
2167 | 2.40k | more_ = err_handler_(json_errc::illegal_control_character, *this); |
2168 | 2.40k | if (!more_) |
2169 | 147 | { |
2170 | 147 | ec = json_errc::illegal_control_character; |
2171 | 147 | state_ = json_parse_state::string; |
2172 | 147 | return; |
2173 | 147 | } |
2174 | | // recovery - skip |
2175 | 0 | string_buffer_.append(sb,input_ptr_-sb); |
2176 | 0 | ++input_ptr_; |
2177 | 0 | state_ = json_parse_state::string; |
2178 | 0 | return; |
2179 | 2.40k | } |
2180 | 5 | case '\r': |
2181 | 5 | { |
2182 | 5 | position_ += (input_ptr_ - sb + 1); |
2183 | 5 | more_ = err_handler_(json_errc::illegal_character_in_string, *this); |
2184 | 5 | if (!more_) |
2185 | 5 | { |
2186 | 5 | ec = json_errc::illegal_character_in_string; |
2187 | 5 | state_ = json_parse_state::string; |
2188 | 5 | return; |
2189 | 5 | } |
2190 | | // recovery - keep |
2191 | 0 | string_buffer_.append(sb, input_ptr_ - sb + 1); |
2192 | 0 | ++input_ptr_; |
2193 | 0 | push_state(state_); |
2194 | 0 | state_ = json_parse_state::cr; |
2195 | 0 | return; |
2196 | 5 | } |
2197 | 5 | case '\n': |
2198 | 5 | { |
2199 | 5 | ++line_; |
2200 | 5 | ++position_; |
2201 | 5 | mark_position_ = position_; |
2202 | 5 | more_ = err_handler_(json_errc::illegal_character_in_string, *this); |
2203 | 5 | if (!more_) |
2204 | 5 | { |
2205 | 5 | ec = json_errc::illegal_character_in_string; |
2206 | 5 | state_ = json_parse_state::string; |
2207 | 5 | return; |
2208 | 5 | } |
2209 | | // recovery - keep |
2210 | 0 | string_buffer_.append(sb, input_ptr_ - sb + 1); |
2211 | 0 | ++input_ptr_; |
2212 | 0 | return; |
2213 | 5 | } |
2214 | 7 | case '\t': |
2215 | 7 | { |
2216 | 7 | position_ += (input_ptr_ - sb + 1); |
2217 | 7 | more_ = err_handler_(json_errc::illegal_character_in_string, *this); |
2218 | 7 | if (!more_) |
2219 | 7 | { |
2220 | 7 | ec = json_errc::illegal_character_in_string; |
2221 | 7 | state_ = json_parse_state::string; |
2222 | 7 | return; |
2223 | 7 | } |
2224 | | // recovery - keep |
2225 | 0 | string_buffer_.append(sb, input_ptr_ - sb + 1); |
2226 | 0 | ++input_ptr_; |
2227 | 0 | state_ = json_parse_state::string; |
2228 | 0 | return; |
2229 | 7 | } |
2230 | 7.33M | case '\\': |
2231 | 7.33M | { |
2232 | 7.33M | string_buffer_.append(sb,input_ptr_-sb); |
2233 | 7.33M | position_ += (input_ptr_ - sb + 1); |
2234 | 7.33M | ++input_ptr_; |
2235 | 7.33M | goto escape; |
2236 | 7 | } |
2237 | 2.12M | case '\"': |
2238 | 2.12M | { |
2239 | 2.12M | position_ += (input_ptr_ - sb + 1); |
2240 | 2.12M | if (string_buffer_.length() == 0) |
2241 | 2.11M | { |
2242 | 2.11M | end_string_value(sb,input_ptr_-sb, visitor, ec); |
2243 | 2.11M | if (ec) {return;} |
2244 | 2.11M | } |
2245 | 1.67k | else |
2246 | 1.67k | { |
2247 | 1.67k | string_buffer_.append(sb,input_ptr_-sb); |
2248 | 1.67k | end_string_value(string_buffer_.data(),string_buffer_.length(), visitor, ec); |
2249 | 1.67k | if (ec) {return;} |
2250 | 1.67k | } |
2251 | 2.12M | ++input_ptr_; |
2252 | 2.12M | return; |
2253 | 2.12M | } |
2254 | 73.6M | default: |
2255 | 73.6M | break; |
2256 | 83.0M | } |
2257 | 73.6M | ++input_ptr_; |
2258 | 73.6M | } |
2259 | | |
2260 | | // Buffer exhausted |
2261 | 3.02k | { |
2262 | 3.02k | string_buffer_.append(sb,input_ptr_-sb); |
2263 | 3.02k | position_ += (input_ptr_ - sb); |
2264 | 3.02k | state_ = json_parse_state::string; |
2265 | 3.02k | return; |
2266 | 9.46M | } |
2267 | | |
2268 | 7.34M | escape: |
2269 | 7.34M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2270 | 439 | { |
2271 | 439 | state_ = json_parse_state::escape; |
2272 | 439 | return; |
2273 | 439 | } |
2274 | 7.33M | switch (*input_ptr_) |
2275 | 7.33M | { |
2276 | 816k | case '\"': |
2277 | 816k | string_buffer_.push_back('\"'); |
2278 | 816k | sb = ++input_ptr_; |
2279 | 816k | ++position_; |
2280 | 816k | goto string_u1; |
2281 | 4.24M | case '\\': |
2282 | 4.24M | string_buffer_.push_back('\\'); |
2283 | 4.24M | sb = ++input_ptr_; |
2284 | 4.24M | ++position_; |
2285 | 4.24M | goto string_u1; |
2286 | 1.05k | case '/': |
2287 | 1.05k | string_buffer_.push_back('/'); |
2288 | 1.05k | sb = ++input_ptr_; |
2289 | 1.05k | ++position_; |
2290 | 1.05k | goto string_u1; |
2291 | 12.4k | case 'b': |
2292 | 12.4k | string_buffer_.push_back('\b'); |
2293 | 12.4k | sb = ++input_ptr_; |
2294 | 12.4k | ++position_; |
2295 | 12.4k | goto string_u1; |
2296 | 8.43k | case 'f': |
2297 | 8.43k | string_buffer_.push_back('\f'); |
2298 | 8.43k | sb = ++input_ptr_; |
2299 | 8.43k | ++position_; |
2300 | 8.43k | goto string_u1; |
2301 | 3.43k | case 'n': |
2302 | 3.43k | string_buffer_.push_back('\n'); |
2303 | 3.43k | sb = ++input_ptr_; |
2304 | 3.43k | ++position_; |
2305 | 3.43k | goto string_u1; |
2306 | 3.32k | case 'r': |
2307 | 3.32k | string_buffer_.push_back('\r'); |
2308 | 3.32k | sb = ++input_ptr_; |
2309 | 3.32k | ++position_; |
2310 | 3.32k | goto string_u1; |
2311 | 2.43k | case 't': |
2312 | 2.43k | string_buffer_.push_back('\t'); |
2313 | 2.43k | sb = ++input_ptr_; |
2314 | 2.43k | ++position_; |
2315 | 2.43k | goto string_u1; |
2316 | 2.24M | case 'u': |
2317 | 2.24M | cp_ = 0; |
2318 | 2.24M | ++input_ptr_; |
2319 | 2.24M | ++position_; |
2320 | 2.24M | goto escape_u1; |
2321 | 10 | default: |
2322 | 10 | err_handler_(json_errc::illegal_escaped_character, *this); |
2323 | 10 | ec = json_errc::illegal_escaped_character; |
2324 | 10 | more_ = false; |
2325 | 10 | state_ = json_parse_state::escape; |
2326 | 10 | return; |
2327 | 7.33M | } |
2328 | | |
2329 | 2.24M | escape_u1: |
2330 | 2.24M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2331 | 287 | { |
2332 | 287 | state_ = json_parse_state::escape_u1; |
2333 | 287 | return; |
2334 | 287 | } |
2335 | 2.24M | { |
2336 | 2.24M | cp_ = append_to_codepoint(0, *input_ptr_, ec); |
2337 | 2.24M | if (ec) |
2338 | 144 | { |
2339 | 144 | state_ = json_parse_state::escape_u1; |
2340 | 144 | return; |
2341 | 144 | } |
2342 | 2.24M | ++input_ptr_; |
2343 | 2.24M | ++position_; |
2344 | 2.24M | goto escape_u2; |
2345 | 2.24M | } |
2346 | | |
2347 | 2.24M | escape_u2: |
2348 | 2.24M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2349 | 330 | { |
2350 | 330 | state_ = json_parse_state::escape_u2; |
2351 | 330 | return; |
2352 | 330 | } |
2353 | 2.24M | { |
2354 | 2.24M | cp_ = append_to_codepoint(cp_, *input_ptr_, ec); |
2355 | 2.24M | if (ec) |
2356 | 6 | { |
2357 | 6 | state_ = json_parse_state::escape_u2; |
2358 | 6 | return; |
2359 | 6 | } |
2360 | 2.24M | ++input_ptr_; |
2361 | 2.24M | ++position_; |
2362 | 2.24M | goto escape_u3; |
2363 | 2.24M | } |
2364 | | |
2365 | 2.24M | escape_u3: |
2366 | 2.24M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2367 | 319 | { |
2368 | 319 | state_ = json_parse_state::escape_u3; |
2369 | 319 | return; |
2370 | 319 | } |
2371 | 2.24M | { |
2372 | 2.24M | cp_ = append_to_codepoint(cp_, *input_ptr_, ec); |
2373 | 2.24M | if (ec) |
2374 | 10 | { |
2375 | 10 | state_ = json_parse_state::escape_u3; |
2376 | 10 | return; |
2377 | 10 | } |
2378 | 2.24M | ++input_ptr_; |
2379 | 2.24M | ++position_; |
2380 | 2.24M | goto escape_u4; |
2381 | 2.24M | } |
2382 | | |
2383 | 2.24M | escape_u4: |
2384 | 2.24M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2385 | 308 | { |
2386 | 308 | state_ = json_parse_state::escape_u4; |
2387 | 308 | return; |
2388 | 308 | } |
2389 | 2.24M | { |
2390 | 2.24M | cp_ = append_to_codepoint(cp_, *input_ptr_, ec); |
2391 | 2.24M | if (ec) |
2392 | 9 | { |
2393 | 9 | state_ = json_parse_state::escape_u4; |
2394 | 9 | return; |
2395 | 9 | } |
2396 | 2.24M | if (unicode_traits::is_high_surrogate(cp_)) |
2397 | 1.08M | { |
2398 | 1.08M | ++input_ptr_; |
2399 | 1.08M | ++position_; |
2400 | 1.08M | goto escape_expect_surrogate_pair1; |
2401 | 1.08M | } |
2402 | 1.16M | else |
2403 | 1.16M | { |
2404 | 1.16M | unicode_traits::convert(&cp_, 1, string_buffer_); |
2405 | 1.16M | sb = ++input_ptr_; |
2406 | 1.16M | ++position_; |
2407 | 1.16M | state_ = json_parse_state::string; |
2408 | 1.16M | return; |
2409 | 1.16M | } |
2410 | 2.24M | } |
2411 | | |
2412 | 1.08M | escape_expect_surrogate_pair1: |
2413 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2414 | 342 | { |
2415 | 342 | state_ = json_parse_state::escape_expect_surrogate_pair1; |
2416 | 342 | return; |
2417 | 342 | } |
2418 | 1.08M | { |
2419 | 1.08M | switch (*input_ptr_) |
2420 | 1.08M | { |
2421 | 1.08M | case '\\': |
2422 | 1.08M | cp2_ = 0; |
2423 | 1.08M | ++input_ptr_; |
2424 | 1.08M | ++position_; |
2425 | 1.08M | goto escape_expect_surrogate_pair2; |
2426 | 44 | default: |
2427 | 44 | err_handler_(json_errc::expected_codepoint_surrogate_pair, *this); |
2428 | 44 | ec = json_errc::expected_codepoint_surrogate_pair; |
2429 | 44 | more_ = false; |
2430 | 44 | state_ = json_parse_state::escape_expect_surrogate_pair1; |
2431 | 44 | return; |
2432 | 1.08M | } |
2433 | 1.08M | } |
2434 | | |
2435 | 1.08M | escape_expect_surrogate_pair2: |
2436 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2437 | 264 | { |
2438 | 264 | state_ = json_parse_state::escape_expect_surrogate_pair2; |
2439 | 264 | return; |
2440 | 264 | } |
2441 | 1.08M | { |
2442 | 1.08M | switch (*input_ptr_) |
2443 | 1.08M | { |
2444 | 1.08M | case 'u': |
2445 | 1.08M | ++input_ptr_; |
2446 | 1.08M | ++position_; |
2447 | 1.08M | goto escape_u5; |
2448 | 45 | default: |
2449 | 45 | err_handler_(json_errc::expected_codepoint_surrogate_pair, *this); |
2450 | 45 | ec = json_errc::expected_codepoint_surrogate_pair; |
2451 | 45 | more_ = false; |
2452 | 45 | state_ = json_parse_state::escape_expect_surrogate_pair2; |
2453 | 45 | return; |
2454 | 1.08M | } |
2455 | 1.08M | } |
2456 | | |
2457 | 1.08M | escape_u5: |
2458 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2459 | 276 | { |
2460 | 276 | state_ = json_parse_state::escape_u5; |
2461 | 276 | return; |
2462 | 276 | } |
2463 | 1.08M | { |
2464 | 1.08M | cp2_ = append_to_codepoint(0, *input_ptr_, ec); |
2465 | 1.08M | if (ec) |
2466 | 4 | { |
2467 | 4 | state_ = json_parse_state::escape_u5; |
2468 | 4 | return; |
2469 | 4 | } |
2470 | 1.08M | } |
2471 | 1.08M | ++input_ptr_; |
2472 | 1.08M | ++position_; |
2473 | 1.08M | goto escape_u6; |
2474 | | |
2475 | 1.08M | escape_u6: |
2476 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2477 | 260 | { |
2478 | 260 | state_ = json_parse_state::escape_u6; |
2479 | 260 | return; |
2480 | 260 | } |
2481 | 1.08M | { |
2482 | 1.08M | cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec); |
2483 | 1.08M | if (ec) |
2484 | 5 | { |
2485 | 5 | state_ = json_parse_state::escape_u6; |
2486 | 5 | return; |
2487 | 5 | } |
2488 | 1.08M | ++input_ptr_; |
2489 | 1.08M | ++position_; |
2490 | 1.08M | goto escape_u7; |
2491 | 1.08M | } |
2492 | | |
2493 | 1.08M | escape_u7: |
2494 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2495 | 270 | { |
2496 | 270 | state_ = json_parse_state::escape_u7; |
2497 | 270 | return; |
2498 | 270 | } |
2499 | 1.08M | { |
2500 | 1.08M | cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec); |
2501 | 1.08M | if (ec) |
2502 | 6 | { |
2503 | 6 | state_ = json_parse_state::escape_u7; |
2504 | 6 | return; |
2505 | 6 | } |
2506 | 1.08M | ++input_ptr_; |
2507 | 1.08M | ++position_; |
2508 | 1.08M | goto escape_u8; |
2509 | 1.08M | } |
2510 | | |
2511 | 1.08M | escape_u8: |
2512 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted |
2513 | 260 | { |
2514 | 260 | state_ = json_parse_state::escape_u8; |
2515 | 260 | return; |
2516 | 260 | } |
2517 | 1.08M | { |
2518 | 1.08M | cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec); |
2519 | 1.08M | if (ec) |
2520 | 7 | { |
2521 | 7 | state_ = json_parse_state::escape_u8; |
2522 | 7 | return; |
2523 | 7 | } |
2524 | 1.08M | uint32_t cp = 0x10000 + ((cp_ & 0x3FF) << 10) + (cp2_ & 0x3FF); |
2525 | 1.08M | unicode_traits::convert(&cp, 1, string_buffer_); |
2526 | 1.08M | sb = ++input_ptr_; |
2527 | 1.08M | ++position_; |
2528 | 1.08M | goto string_u1; |
2529 | 1.08M | } |
2530 | | |
2531 | 1.08M | JSONCONS_UNREACHABLE(); |
2532 | 1.08M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_string(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_string(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 2125 | 3.29M | { | 2126 | 3.29M | const char_type* local_input_end = end_input_; | 2127 | 3.29M | const char_type* sb = input_ptr_; | 2128 | | | 2129 | 3.29M | switch (state_) | 2130 | 3.29M | { | 2131 | 3.29M | case json_parse_state::string: | 2132 | 3.29M | goto string_u1; | 2133 | 385 | case json_parse_state::escape: | 2134 | 385 | goto escape; | 2135 | 241 | case json_parse_state::escape_u1: | 2136 | 241 | goto escape_u1; | 2137 | 240 | case json_parse_state::escape_u2: | 2138 | 240 | goto escape_u2; | 2139 | 245 | case json_parse_state::escape_u3: | 2140 | 245 | goto escape_u3; | 2141 | 240 | case json_parse_state::escape_u4: | 2142 | 240 | goto escape_u4; | 2143 | 242 | case json_parse_state::escape_expect_surrogate_pair1: | 2144 | 242 | goto escape_expect_surrogate_pair1; | 2145 | 209 | case json_parse_state::escape_expect_surrogate_pair2: | 2146 | 209 | goto escape_expect_surrogate_pair2; | 2147 | 213 | case json_parse_state::escape_u5: | 2148 | 213 | goto escape_u5; | 2149 | 206 | case json_parse_state::escape_u6: | 2150 | 206 | goto escape_u6; | 2151 | 213 | case json_parse_state::escape_u7: | 2152 | 213 | goto escape_u7; | 2153 | 202 | case json_parse_state::escape_u8: | 2154 | 202 | goto escape_u8; | 2155 | 0 | default: | 2156 | 0 | JSONCONS_UNREACHABLE(); | 2157 | 3.29M | } | 2158 | | | 2159 | 9.46M | string_u1: | 2160 | 83.1M | while (input_ptr_ < local_input_end) | 2161 | 83.0M | { | 2162 | 83.0M | switch (*input_ptr_) | 2163 | 83.0M | { | 2164 | 2.40k | JSONCONS_ILLEGAL_CONTROL_CHARACTER: | 2165 | 2.40k | { | 2166 | 2.40k | position_ += (input_ptr_ - sb + 1); | 2167 | 2.40k | more_ = err_handler_(json_errc::illegal_control_character, *this); | 2168 | 2.40k | if (!more_) | 2169 | 147 | { | 2170 | 147 | ec = json_errc::illegal_control_character; | 2171 | 147 | state_ = json_parse_state::string; | 2172 | 147 | return; | 2173 | 147 | } | 2174 | | // recovery - skip | 2175 | 0 | string_buffer_.append(sb,input_ptr_-sb); | 2176 | 0 | ++input_ptr_; | 2177 | 0 | state_ = json_parse_state::string; | 2178 | 0 | return; | 2179 | 2.40k | } | 2180 | 5 | case '\r': | 2181 | 5 | { | 2182 | 5 | position_ += (input_ptr_ - sb + 1); | 2183 | 5 | more_ = err_handler_(json_errc::illegal_character_in_string, *this); | 2184 | 5 | if (!more_) | 2185 | 5 | { | 2186 | 5 | ec = json_errc::illegal_character_in_string; | 2187 | 5 | state_ = json_parse_state::string; | 2188 | 5 | return; | 2189 | 5 | } | 2190 | | // recovery - keep | 2191 | 0 | string_buffer_.append(sb, input_ptr_ - sb + 1); | 2192 | 0 | ++input_ptr_; | 2193 | 0 | push_state(state_); | 2194 | 0 | state_ = json_parse_state::cr; | 2195 | 0 | return; | 2196 | 5 | } | 2197 | 5 | case '\n': | 2198 | 5 | { | 2199 | 5 | ++line_; | 2200 | 5 | ++position_; | 2201 | 5 | mark_position_ = position_; | 2202 | 5 | more_ = err_handler_(json_errc::illegal_character_in_string, *this); | 2203 | 5 | if (!more_) | 2204 | 5 | { | 2205 | 5 | ec = json_errc::illegal_character_in_string; | 2206 | 5 | state_ = json_parse_state::string; | 2207 | 5 | return; | 2208 | 5 | } | 2209 | | // recovery - keep | 2210 | 0 | string_buffer_.append(sb, input_ptr_ - sb + 1); | 2211 | 0 | ++input_ptr_; | 2212 | 0 | return; | 2213 | 5 | } | 2214 | 7 | case '\t': | 2215 | 7 | { | 2216 | 7 | position_ += (input_ptr_ - sb + 1); | 2217 | 7 | more_ = err_handler_(json_errc::illegal_character_in_string, *this); | 2218 | 7 | if (!more_) | 2219 | 7 | { | 2220 | 7 | ec = json_errc::illegal_character_in_string; | 2221 | 7 | state_ = json_parse_state::string; | 2222 | 7 | return; | 2223 | 7 | } | 2224 | | // recovery - keep | 2225 | 0 | string_buffer_.append(sb, input_ptr_ - sb + 1); | 2226 | 0 | ++input_ptr_; | 2227 | 0 | state_ = json_parse_state::string; | 2228 | 0 | return; | 2229 | 7 | } | 2230 | 7.33M | case '\\': | 2231 | 7.33M | { | 2232 | 7.33M | string_buffer_.append(sb,input_ptr_-sb); | 2233 | 7.33M | position_ += (input_ptr_ - sb + 1); | 2234 | 7.33M | ++input_ptr_; | 2235 | 7.33M | goto escape; | 2236 | 7 | } | 2237 | 2.12M | case '\"': | 2238 | 2.12M | { | 2239 | 2.12M | position_ += (input_ptr_ - sb + 1); | 2240 | 2.12M | if (string_buffer_.length() == 0) | 2241 | 2.11M | { | 2242 | 2.11M | end_string_value(sb,input_ptr_-sb, visitor, ec); | 2243 | 2.11M | if (ec) {return;} | 2244 | 2.11M | } | 2245 | 1.67k | else | 2246 | 1.67k | { | 2247 | 1.67k | string_buffer_.append(sb,input_ptr_-sb); | 2248 | 1.67k | end_string_value(string_buffer_.data(),string_buffer_.length(), visitor, ec); | 2249 | 1.67k | if (ec) {return;} | 2250 | 1.67k | } | 2251 | 2.12M | ++input_ptr_; | 2252 | 2.12M | return; | 2253 | 2.12M | } | 2254 | 73.6M | default: | 2255 | 73.6M | break; | 2256 | 83.0M | } | 2257 | 73.6M | ++input_ptr_; | 2258 | 73.6M | } | 2259 | | | 2260 | | // Buffer exhausted | 2261 | 3.02k | { | 2262 | 3.02k | string_buffer_.append(sb,input_ptr_-sb); | 2263 | 3.02k | position_ += (input_ptr_ - sb); | 2264 | 3.02k | state_ = json_parse_state::string; | 2265 | 3.02k | return; | 2266 | 9.46M | } | 2267 | | | 2268 | 7.34M | escape: | 2269 | 7.34M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2270 | 439 | { | 2271 | 439 | state_ = json_parse_state::escape; | 2272 | 439 | return; | 2273 | 439 | } | 2274 | 7.33M | switch (*input_ptr_) | 2275 | 7.33M | { | 2276 | 816k | case '\"': | 2277 | 816k | string_buffer_.push_back('\"'); | 2278 | 816k | sb = ++input_ptr_; | 2279 | 816k | ++position_; | 2280 | 816k | goto string_u1; | 2281 | 4.24M | case '\\': | 2282 | 4.24M | string_buffer_.push_back('\\'); | 2283 | 4.24M | sb = ++input_ptr_; | 2284 | 4.24M | ++position_; | 2285 | 4.24M | goto string_u1; | 2286 | 1.05k | case '/': | 2287 | 1.05k | string_buffer_.push_back('/'); | 2288 | 1.05k | sb = ++input_ptr_; | 2289 | 1.05k | ++position_; | 2290 | 1.05k | goto string_u1; | 2291 | 12.4k | case 'b': | 2292 | 12.4k | string_buffer_.push_back('\b'); | 2293 | 12.4k | sb = ++input_ptr_; | 2294 | 12.4k | ++position_; | 2295 | 12.4k | goto string_u1; | 2296 | 8.43k | case 'f': | 2297 | 8.43k | string_buffer_.push_back('\f'); | 2298 | 8.43k | sb = ++input_ptr_; | 2299 | 8.43k | ++position_; | 2300 | 8.43k | goto string_u1; | 2301 | 3.43k | case 'n': | 2302 | 3.43k | string_buffer_.push_back('\n'); | 2303 | 3.43k | sb = ++input_ptr_; | 2304 | 3.43k | ++position_; | 2305 | 3.43k | goto string_u1; | 2306 | 3.32k | case 'r': | 2307 | 3.32k | string_buffer_.push_back('\r'); | 2308 | 3.32k | sb = ++input_ptr_; | 2309 | 3.32k | ++position_; | 2310 | 3.32k | goto string_u1; | 2311 | 2.43k | case 't': | 2312 | 2.43k | string_buffer_.push_back('\t'); | 2313 | 2.43k | sb = ++input_ptr_; | 2314 | 2.43k | ++position_; | 2315 | 2.43k | goto string_u1; | 2316 | 2.24M | case 'u': | 2317 | 2.24M | cp_ = 0; | 2318 | 2.24M | ++input_ptr_; | 2319 | 2.24M | ++position_; | 2320 | 2.24M | goto escape_u1; | 2321 | 10 | default: | 2322 | 10 | err_handler_(json_errc::illegal_escaped_character, *this); | 2323 | 10 | ec = json_errc::illegal_escaped_character; | 2324 | 10 | more_ = false; | 2325 | 10 | state_ = json_parse_state::escape; | 2326 | 10 | return; | 2327 | 7.33M | } | 2328 | | | 2329 | 2.24M | escape_u1: | 2330 | 2.24M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2331 | 287 | { | 2332 | 287 | state_ = json_parse_state::escape_u1; | 2333 | 287 | return; | 2334 | 287 | } | 2335 | 2.24M | { | 2336 | 2.24M | cp_ = append_to_codepoint(0, *input_ptr_, ec); | 2337 | 2.24M | if (ec) | 2338 | 144 | { | 2339 | 144 | state_ = json_parse_state::escape_u1; | 2340 | 144 | return; | 2341 | 144 | } | 2342 | 2.24M | ++input_ptr_; | 2343 | 2.24M | ++position_; | 2344 | 2.24M | goto escape_u2; | 2345 | 2.24M | } | 2346 | | | 2347 | 2.24M | escape_u2: | 2348 | 2.24M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2349 | 330 | { | 2350 | 330 | state_ = json_parse_state::escape_u2; | 2351 | 330 | return; | 2352 | 330 | } | 2353 | 2.24M | { | 2354 | 2.24M | cp_ = append_to_codepoint(cp_, *input_ptr_, ec); | 2355 | 2.24M | if (ec) | 2356 | 6 | { | 2357 | 6 | state_ = json_parse_state::escape_u2; | 2358 | 6 | return; | 2359 | 6 | } | 2360 | 2.24M | ++input_ptr_; | 2361 | 2.24M | ++position_; | 2362 | 2.24M | goto escape_u3; | 2363 | 2.24M | } | 2364 | | | 2365 | 2.24M | escape_u3: | 2366 | 2.24M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2367 | 319 | { | 2368 | 319 | state_ = json_parse_state::escape_u3; | 2369 | 319 | return; | 2370 | 319 | } | 2371 | 2.24M | { | 2372 | 2.24M | cp_ = append_to_codepoint(cp_, *input_ptr_, ec); | 2373 | 2.24M | if (ec) | 2374 | 10 | { | 2375 | 10 | state_ = json_parse_state::escape_u3; | 2376 | 10 | return; | 2377 | 10 | } | 2378 | 2.24M | ++input_ptr_; | 2379 | 2.24M | ++position_; | 2380 | 2.24M | goto escape_u4; | 2381 | 2.24M | } | 2382 | | | 2383 | 2.24M | escape_u4: | 2384 | 2.24M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2385 | 308 | { | 2386 | 308 | state_ = json_parse_state::escape_u4; | 2387 | 308 | return; | 2388 | 308 | } | 2389 | 2.24M | { | 2390 | 2.24M | cp_ = append_to_codepoint(cp_, *input_ptr_, ec); | 2391 | 2.24M | if (ec) | 2392 | 9 | { | 2393 | 9 | state_ = json_parse_state::escape_u4; | 2394 | 9 | return; | 2395 | 9 | } | 2396 | 2.24M | if (unicode_traits::is_high_surrogate(cp_)) | 2397 | 1.08M | { | 2398 | 1.08M | ++input_ptr_; | 2399 | 1.08M | ++position_; | 2400 | 1.08M | goto escape_expect_surrogate_pair1; | 2401 | 1.08M | } | 2402 | 1.16M | else | 2403 | 1.16M | { | 2404 | 1.16M | unicode_traits::convert(&cp_, 1, string_buffer_); | 2405 | 1.16M | sb = ++input_ptr_; | 2406 | 1.16M | ++position_; | 2407 | 1.16M | state_ = json_parse_state::string; | 2408 | 1.16M | return; | 2409 | 1.16M | } | 2410 | 2.24M | } | 2411 | | | 2412 | 1.08M | escape_expect_surrogate_pair1: | 2413 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2414 | 342 | { | 2415 | 342 | state_ = json_parse_state::escape_expect_surrogate_pair1; | 2416 | 342 | return; | 2417 | 342 | } | 2418 | 1.08M | { | 2419 | 1.08M | switch (*input_ptr_) | 2420 | 1.08M | { | 2421 | 1.08M | case '\\': | 2422 | 1.08M | cp2_ = 0; | 2423 | 1.08M | ++input_ptr_; | 2424 | 1.08M | ++position_; | 2425 | 1.08M | goto escape_expect_surrogate_pair2; | 2426 | 44 | default: | 2427 | 44 | err_handler_(json_errc::expected_codepoint_surrogate_pair, *this); | 2428 | 44 | ec = json_errc::expected_codepoint_surrogate_pair; | 2429 | 44 | more_ = false; | 2430 | 44 | state_ = json_parse_state::escape_expect_surrogate_pair1; | 2431 | 44 | return; | 2432 | 1.08M | } | 2433 | 1.08M | } | 2434 | | | 2435 | 1.08M | escape_expect_surrogate_pair2: | 2436 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2437 | 264 | { | 2438 | 264 | state_ = json_parse_state::escape_expect_surrogate_pair2; | 2439 | 264 | return; | 2440 | 264 | } | 2441 | 1.08M | { | 2442 | 1.08M | switch (*input_ptr_) | 2443 | 1.08M | { | 2444 | 1.08M | case 'u': | 2445 | 1.08M | ++input_ptr_; | 2446 | 1.08M | ++position_; | 2447 | 1.08M | goto escape_u5; | 2448 | 45 | default: | 2449 | 45 | err_handler_(json_errc::expected_codepoint_surrogate_pair, *this); | 2450 | 45 | ec = json_errc::expected_codepoint_surrogate_pair; | 2451 | 45 | more_ = false; | 2452 | 45 | state_ = json_parse_state::escape_expect_surrogate_pair2; | 2453 | 45 | return; | 2454 | 1.08M | } | 2455 | 1.08M | } | 2456 | | | 2457 | 1.08M | escape_u5: | 2458 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2459 | 276 | { | 2460 | 276 | state_ = json_parse_state::escape_u5; | 2461 | 276 | return; | 2462 | 276 | } | 2463 | 1.08M | { | 2464 | 1.08M | cp2_ = append_to_codepoint(0, *input_ptr_, ec); | 2465 | 1.08M | if (ec) | 2466 | 4 | { | 2467 | 4 | state_ = json_parse_state::escape_u5; | 2468 | 4 | return; | 2469 | 4 | } | 2470 | 1.08M | } | 2471 | 1.08M | ++input_ptr_; | 2472 | 1.08M | ++position_; | 2473 | 1.08M | goto escape_u6; | 2474 | | | 2475 | 1.08M | escape_u6: | 2476 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2477 | 260 | { | 2478 | 260 | state_ = json_parse_state::escape_u6; | 2479 | 260 | return; | 2480 | 260 | } | 2481 | 1.08M | { | 2482 | 1.08M | cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec); | 2483 | 1.08M | if (ec) | 2484 | 5 | { | 2485 | 5 | state_ = json_parse_state::escape_u6; | 2486 | 5 | return; | 2487 | 5 | } | 2488 | 1.08M | ++input_ptr_; | 2489 | 1.08M | ++position_; | 2490 | 1.08M | goto escape_u7; | 2491 | 1.08M | } | 2492 | | | 2493 | 1.08M | escape_u7: | 2494 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2495 | 270 | { | 2496 | 270 | state_ = json_parse_state::escape_u7; | 2497 | 270 | return; | 2498 | 270 | } | 2499 | 1.08M | { | 2500 | 1.08M | cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec); | 2501 | 1.08M | if (ec) | 2502 | 6 | { | 2503 | 6 | state_ = json_parse_state::escape_u7; | 2504 | 6 | return; | 2505 | 6 | } | 2506 | 1.08M | ++input_ptr_; | 2507 | 1.08M | ++position_; | 2508 | 1.08M | goto escape_u8; | 2509 | 1.08M | } | 2510 | | | 2511 | 1.08M | escape_u8: | 2512 | 1.08M | if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted | 2513 | 260 | { | 2514 | 260 | state_ = json_parse_state::escape_u8; | 2515 | 260 | return; | 2516 | 260 | } | 2517 | 1.08M | { | 2518 | 1.08M | cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec); | 2519 | 1.08M | if (ec) | 2520 | 7 | { | 2521 | 7 | state_ = json_parse_state::escape_u8; | 2522 | 7 | return; | 2523 | 7 | } | 2524 | 1.08M | uint32_t cp = 0x10000 + ((cp_ & 0x3FF) << 10) + (cp2_ & 0x3FF); | 2525 | 1.08M | unicode_traits::convert(&cp, 1, string_buffer_); | 2526 | 1.08M | sb = ++input_ptr_; | 2527 | 1.08M | ++position_; | 2528 | 1.08M | goto string_u1; | 2529 | 1.08M | } | 2530 | | | 2531 | 0 | JSONCONS_UNREACHABLE(); | 2532 | 1.08M | } |
|
2533 | | |
2534 | | void translate_conv_errc(unicode_traits::conv_errc result, std::error_code& ec) |
2535 | 322 | { |
2536 | 322 | switch (result) |
2537 | 322 | { |
2538 | 0 | case unicode_traits::conv_errc(): |
2539 | 0 | break; |
2540 | 84 | case unicode_traits::conv_errc::over_long_utf8_sequence: |
2541 | 84 | more_ = err_handler_(json_errc::over_long_utf8_sequence, *this); |
2542 | 84 | if (!more_) |
2543 | 84 | { |
2544 | 84 | ec = json_errc::over_long_utf8_sequence; |
2545 | 84 | return; |
2546 | 84 | } |
2547 | 0 | break; |
2548 | 0 | case unicode_traits::conv_errc::unpaired_high_surrogate: |
2549 | 0 | more_ = err_handler_(json_errc::unpaired_high_surrogate, *this); |
2550 | 0 | if (!more_) |
2551 | 0 | { |
2552 | 0 | ec = json_errc::unpaired_high_surrogate; |
2553 | 0 | return; |
2554 | 0 | } |
2555 | 0 | break; |
2556 | 67 | case unicode_traits::conv_errc::expected_continuation_byte: |
2557 | 67 | more_ = err_handler_(json_errc::expected_continuation_byte, *this); |
2558 | 67 | if (!more_) |
2559 | 67 | { |
2560 | 67 | ec = json_errc::expected_continuation_byte; |
2561 | 67 | return; |
2562 | 67 | } |
2563 | 0 | break; |
2564 | 0 | case unicode_traits::conv_errc::illegal_surrogate_value: |
2565 | 0 | more_ = err_handler_(json_errc::illegal_surrogate_value, *this); |
2566 | 0 | if (!more_) |
2567 | 0 | { |
2568 | 0 | ec = json_errc::illegal_surrogate_value; |
2569 | 0 | return; |
2570 | 0 | } |
2571 | 0 | break; |
2572 | 171 | default: |
2573 | 171 | more_ = err_handler_(json_errc::illegal_codepoint, *this); |
2574 | 171 | if (!more_) |
2575 | 171 | { |
2576 | 171 | ec = json_errc::illegal_codepoint; |
2577 | 171 | return; |
2578 | 171 | } |
2579 | 0 | break; |
2580 | 322 | } |
2581 | 322 | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::translate_conv_errc(jsoncons::unicode_traits::conv_errc, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::translate_conv_errc(jsoncons::unicode_traits::conv_errc, std::__1::error_code&) Line | Count | Source | 2535 | 322 | { | 2536 | 322 | switch (result) | 2537 | 322 | { | 2538 | 0 | case unicode_traits::conv_errc(): | 2539 | 0 | break; | 2540 | 84 | case unicode_traits::conv_errc::over_long_utf8_sequence: | 2541 | 84 | more_ = err_handler_(json_errc::over_long_utf8_sequence, *this); | 2542 | 84 | if (!more_) | 2543 | 84 | { | 2544 | 84 | ec = json_errc::over_long_utf8_sequence; | 2545 | 84 | return; | 2546 | 84 | } | 2547 | 0 | break; | 2548 | 0 | case unicode_traits::conv_errc::unpaired_high_surrogate: | 2549 | 0 | more_ = err_handler_(json_errc::unpaired_high_surrogate, *this); | 2550 | 0 | if (!more_) | 2551 | 0 | { | 2552 | 0 | ec = json_errc::unpaired_high_surrogate; | 2553 | 0 | return; | 2554 | 0 | } | 2555 | 0 | break; | 2556 | 67 | case unicode_traits::conv_errc::expected_continuation_byte: | 2557 | 67 | more_ = err_handler_(json_errc::expected_continuation_byte, *this); | 2558 | 67 | if (!more_) | 2559 | 67 | { | 2560 | 67 | ec = json_errc::expected_continuation_byte; | 2561 | 67 | return; | 2562 | 67 | } | 2563 | 0 | break; | 2564 | 0 | case unicode_traits::conv_errc::illegal_surrogate_value: | 2565 | 0 | more_ = err_handler_(json_errc::illegal_surrogate_value, *this); | 2566 | 0 | if (!more_) | 2567 | 0 | { | 2568 | 0 | ec = json_errc::illegal_surrogate_value; | 2569 | 0 | return; | 2570 | 0 | } | 2571 | 0 | break; | 2572 | 171 | default: | 2573 | 171 | more_ = err_handler_(json_errc::illegal_codepoint, *this); | 2574 | 171 | if (!more_) | 2575 | 171 | { | 2576 | 171 | ec = json_errc::illegal_codepoint; | 2577 | 171 | return; | 2578 | 171 | } | 2579 | 0 | break; | 2580 | 322 | } | 2581 | 322 | } |
|
2582 | | |
2583 | | #if !defined(JSONCONS_NO_DEPRECATED) |
2584 | | |
2585 | | JSONCONS_DEPRECATED_MSG("Instead, use finish_parse(basic_json_visitor<char_type>&)") |
2586 | | void end_parse(basic_json_visitor<char_type>& visitor) |
2587 | | { |
2588 | | std::error_code ec; |
2589 | | finish_parse(visitor, ec); |
2590 | | if (ec) |
2591 | | { |
2592 | | JSONCONS_THROW(ser_error(ec,line_,column())); |
2593 | | } |
2594 | | } |
2595 | | |
2596 | | JSONCONS_DEPRECATED_MSG("Instead, use finish_parse(basic_json_visitor<char_type>&, std::error_code&)") |
2597 | | void end_parse(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
2598 | | { |
2599 | | while (!finished()) |
2600 | | { |
2601 | | parse_some(visitor, ec); |
2602 | | } |
2603 | | } |
2604 | | |
2605 | | JSONCONS_DEPRECATED_MSG("Instead, use update(const char_type*, std::size_t)") |
2606 | | void set_source(const char_type* data, std::size_t length) |
2607 | | { |
2608 | | begin_input_ = data; |
2609 | | end_input_ = data + length; |
2610 | | input_ptr_ = begin_input_; |
2611 | | } |
2612 | | #endif |
2613 | | |
2614 | | std::size_t line() const override |
2615 | 4 | { |
2616 | 4 | return line_; |
2617 | 4 | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::line() const jsoncons::basic_json_parser<char, std::__1::allocator<char> >::line() const Line | Count | Source | 2615 | 4 | { | 2616 | 4 | return line_; | 2617 | 4 | } |
|
2618 | | |
2619 | | std::size_t column() const override |
2620 | 3.15k | { |
2621 | 3.15k | return (position_ - mark_position_) + 1; |
2622 | 3.15k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::column() const jsoncons::basic_json_parser<char, std::__1::allocator<char> >::column() const Line | Count | Source | 2620 | 3.15k | { | 2621 | 3.15k | return (position_ - mark_position_) + 1; | 2622 | 3.15k | } |
|
2623 | | |
2624 | | std::size_t position() const override |
2625 | 0 | { |
2626 | 0 | return saved_position_; |
2627 | 0 | } Unexecuted instantiation: jsoncons::basic_json_parser<char, std::__1::allocator<char> >::position() const Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::position() const |
2628 | | |
2629 | | std::size_t end_position() const override |
2630 | 0 | { |
2631 | 0 | return position_; |
2632 | 0 | } Unexecuted instantiation: jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_position() const Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_position() const |
2633 | | |
2634 | | std::size_t offset() const |
2635 | | { |
2636 | | return input_ptr_ - begin_input_; |
2637 | | } |
2638 | | private: |
2639 | | |
2640 | | void end_integer_value(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
2641 | 21.2M | { |
2642 | 21.2M | if (string_buffer_[0] == '-') |
2643 | 839k | { |
2644 | 839k | end_negative_value(visitor, ec); |
2645 | 839k | } |
2646 | 20.4M | else |
2647 | 20.4M | { |
2648 | 20.4M | end_positive_value(visitor, ec); |
2649 | 20.4M | } |
2650 | 21.2M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_integer_value(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_integer_value(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 2641 | 21.2M | { | 2642 | 21.2M | if (string_buffer_[0] == '-') | 2643 | 839k | { | 2644 | 839k | end_negative_value(visitor, ec); | 2645 | 839k | } | 2646 | 20.4M | else | 2647 | 20.4M | { | 2648 | 20.4M | end_positive_value(visitor, ec); | 2649 | 20.4M | } | 2650 | 21.2M | } |
|
2651 | | |
2652 | | void end_negative_value(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
2653 | 839k | { |
2654 | 839k | int64_t val; |
2655 | 839k | auto result = jsoncons::detail::to_integer_unchecked(string_buffer_.data(), string_buffer_.length(), val); |
2656 | 839k | if (result) |
2657 | 825k | { |
2658 | 825k | more_ = visitor.int64_value(val, semantic_tag::none, *this, ec); |
2659 | 825k | } |
2660 | 14.3k | else // Must be overflow |
2661 | 14.3k | { |
2662 | 14.3k | more_ = visitor.string_value(string_buffer_, semantic_tag::bigint, *this, ec); |
2663 | 14.3k | } |
2664 | 839k | after_value(ec); |
2665 | 839k | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_negative_value(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_negative_value(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 2653 | 839k | { | 2654 | 839k | int64_t val; | 2655 | 839k | auto result = jsoncons::detail::to_integer_unchecked(string_buffer_.data(), string_buffer_.length(), val); | 2656 | 839k | if (result) | 2657 | 825k | { | 2658 | 825k | more_ = visitor.int64_value(val, semantic_tag::none, *this, ec); | 2659 | 825k | } | 2660 | 14.3k | else // Must be overflow | 2661 | 14.3k | { | 2662 | 14.3k | more_ = visitor.string_value(string_buffer_, semantic_tag::bigint, *this, ec); | 2663 | 14.3k | } | 2664 | 839k | after_value(ec); | 2665 | 839k | } |
|
2666 | | |
2667 | | void end_positive_value(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
2668 | 20.4M | { |
2669 | 20.4M | uint64_t val; |
2670 | 20.4M | auto result = jsoncons::detail::to_integer_unchecked(string_buffer_.data(), string_buffer_.length(), val); |
2671 | 20.4M | if (result) |
2672 | 20.4M | { |
2673 | 20.4M | more_ = visitor.uint64_value(val, semantic_tag::none, *this, ec); |
2674 | 20.4M | } |
2675 | 14.1k | else // Must be overflow |
2676 | 14.1k | { |
2677 | 14.1k | more_ = visitor.string_value(string_buffer_, semantic_tag::bigint, *this, ec); |
2678 | 14.1k | } |
2679 | 20.4M | after_value(ec); |
2680 | 20.4M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_positive_value(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_positive_value(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 2668 | 20.4M | { | 2669 | 20.4M | uint64_t val; | 2670 | 20.4M | auto result = jsoncons::detail::to_integer_unchecked(string_buffer_.data(), string_buffer_.length(), val); | 2671 | 20.4M | if (result) | 2672 | 20.4M | { | 2673 | 20.4M | more_ = visitor.uint64_value(val, semantic_tag::none, *this, ec); | 2674 | 20.4M | } | 2675 | 14.1k | else // Must be overflow | 2676 | 14.1k | { | 2677 | 14.1k | more_ = visitor.string_value(string_buffer_, semantic_tag::bigint, *this, ec); | 2678 | 14.1k | } | 2679 | 20.4M | after_value(ec); | 2680 | 20.4M | } |
|
2681 | | |
2682 | | void end_fraction_value(basic_json_visitor<char_type>& visitor, std::error_code& ec) |
2683 | 2.56M | { |
2684 | 2.56M | JSONCONS_TRY |
2685 | 2.56M | { |
2686 | 2.56M | if (options_.lossless_number()) |
2687 | 0 | { |
2688 | 0 | more_ = visitor.string_value(string_buffer_, semantic_tag::bigdec, *this, ec); |
2689 | 0 | } |
2690 | 2.56M | else |
2691 | 2.56M | { |
2692 | 2.56M | double d = to_double_(string_buffer_.c_str(), string_buffer_.length()); |
2693 | 2.56M | more_ = visitor.double_value(d, semantic_tag::none, *this, ec); |
2694 | 2.56M | } |
2695 | 2.56M | } |
2696 | 2.56M | JSONCONS_CATCH(...) |
2697 | 2.56M | { |
2698 | 0 | more_ = err_handler_(json_errc::invalid_number, *this); |
2699 | 0 | if (!more_) |
2700 | 0 | { |
2701 | 0 | ec = json_errc::invalid_number; |
2702 | 0 | return; |
2703 | 0 | } |
2704 | 0 | more_ = visitor.null_value(semantic_tag::none, *this, ec); // recovery |
2705 | 0 | } |
2706 | | |
2707 | 2.56M | after_value(ec); |
2708 | 2.56M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_fraction_value(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_fraction_value(jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 2683 | 2.56M | { | 2684 | 2.56M | JSONCONS_TRY | 2685 | 2.56M | { | 2686 | 2.56M | if (options_.lossless_number()) | 2687 | 0 | { | 2688 | 0 | more_ = visitor.string_value(string_buffer_, semantic_tag::bigdec, *this, ec); | 2689 | 0 | } | 2690 | 2.56M | else | 2691 | 2.56M | { | 2692 | 2.56M | double d = to_double_(string_buffer_.c_str(), string_buffer_.length()); | 2693 | 2.56M | more_ = visitor.double_value(d, semantic_tag::none, *this, ec); | 2694 | 2.56M | } | 2695 | 2.56M | } | 2696 | 2.56M | JSONCONS_CATCH(...) | 2697 | 2.56M | { | 2698 | 0 | more_ = err_handler_(json_errc::invalid_number, *this); | 2699 | 0 | if (!more_) | 2700 | 0 | { | 2701 | 0 | ec = json_errc::invalid_number; | 2702 | 0 | return; | 2703 | 0 | } | 2704 | 0 | more_ = visitor.null_value(semantic_tag::none, *this, ec); // recovery | 2705 | 0 | } | 2706 | | | 2707 | 2.56M | after_value(ec); | 2708 | 2.56M | } |
|
2709 | | |
2710 | | void end_string_value(const char_type* s, std::size_t length, basic_json_visitor<char_type>& visitor, std::error_code& ec) |
2711 | 2.12M | { |
2712 | 2.12M | string_view_type sv(s, length); |
2713 | 2.12M | auto result = unicode_traits::validate(s, length); |
2714 | 2.12M | if (result.ec != unicode_traits::conv_errc()) |
2715 | 322 | { |
2716 | 322 | translate_conv_errc(result.ec,ec); |
2717 | 322 | position_ += (result.ptr - s); |
2718 | 322 | return; |
2719 | 322 | } |
2720 | 2.12M | switch (parent()) |
2721 | 2.12M | { |
2722 | 2.04M | case json_parse_state::member_name: |
2723 | 2.04M | more_ = visitor.key(sv, *this, ec); |
2724 | 2.04M | pop_state(); |
2725 | 2.04M | state_ = json_parse_state::expect_colon; |
2726 | 2.04M | break; |
2727 | 7.60k | case json_parse_state::object: |
2728 | 72.8k | case json_parse_state::array: |
2729 | 72.8k | { |
2730 | 72.8k | auto it = std::find_if(string_double_map_.begin(), string_double_map_.end(), string_maps_to_double{ sv }); |
2731 | 72.8k | if (it != string_double_map_.end()) |
2732 | 0 | { |
2733 | 0 | more_ = visitor.double_value(it->second, semantic_tag::none, *this, ec); |
2734 | 0 | } |
2735 | 72.8k | else |
2736 | 72.8k | { |
2737 | 72.8k | more_ = visitor.string_value(sv, semantic_tag::none, *this, ec); |
2738 | 72.8k | } |
2739 | 72.8k | state_ = json_parse_state::expect_comma_or_end; |
2740 | 72.8k | break; |
2741 | 7.60k | } |
2742 | 497 | case json_parse_state::root: |
2743 | 497 | { |
2744 | 497 | auto it = std::find_if(string_double_map_.begin(),string_double_map_.end(),string_maps_to_double{sv}); |
2745 | 497 | if (it != string_double_map_.end()) |
2746 | 0 | { |
2747 | 0 | more_ = visitor.double_value(it->second, semantic_tag::none, *this, ec); |
2748 | 0 | } |
2749 | 497 | else |
2750 | 497 | { |
2751 | 497 | more_ = visitor.string_value(sv, semantic_tag::none, *this, ec); |
2752 | 497 | } |
2753 | 497 | state_ = json_parse_state::accept; |
2754 | 497 | break; |
2755 | 7.60k | } |
2756 | 0 | default: |
2757 | 0 | more_ = err_handler_(json_errc::syntax_error, *this); |
2758 | 0 | if (!more_) |
2759 | 0 | { |
2760 | 0 | ec = json_errc::syntax_error; |
2761 | 0 | return; |
2762 | 0 | } |
2763 | 0 | break; |
2764 | 2.12M | } |
2765 | 2.12M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_string_value(wchar_t const*, unsigned long, jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_string_value(char const*, unsigned long, jsoncons::basic_json_visitor<char>&, std::__1::error_code&) Line | Count | Source | 2711 | 2.12M | { | 2712 | 2.12M | string_view_type sv(s, length); | 2713 | 2.12M | auto result = unicode_traits::validate(s, length); | 2714 | 2.12M | if (result.ec != unicode_traits::conv_errc()) | 2715 | 322 | { | 2716 | 322 | translate_conv_errc(result.ec,ec); | 2717 | 322 | position_ += (result.ptr - s); | 2718 | 322 | return; | 2719 | 322 | } | 2720 | 2.12M | switch (parent()) | 2721 | 2.12M | { | 2722 | 2.04M | case json_parse_state::member_name: | 2723 | 2.04M | more_ = visitor.key(sv, *this, ec); | 2724 | 2.04M | pop_state(); | 2725 | 2.04M | state_ = json_parse_state::expect_colon; | 2726 | 2.04M | break; | 2727 | 7.60k | case json_parse_state::object: | 2728 | 72.8k | case json_parse_state::array: | 2729 | 72.8k | { | 2730 | 72.8k | auto it = std::find_if(string_double_map_.begin(), string_double_map_.end(), string_maps_to_double{ sv }); | 2731 | 72.8k | if (it != string_double_map_.end()) | 2732 | 0 | { | 2733 | 0 | more_ = visitor.double_value(it->second, semantic_tag::none, *this, ec); | 2734 | 0 | } | 2735 | 72.8k | else | 2736 | 72.8k | { | 2737 | 72.8k | more_ = visitor.string_value(sv, semantic_tag::none, *this, ec); | 2738 | 72.8k | } | 2739 | 72.8k | state_ = json_parse_state::expect_comma_or_end; | 2740 | 72.8k | break; | 2741 | 7.60k | } | 2742 | 497 | case json_parse_state::root: | 2743 | 497 | { | 2744 | 497 | auto it = std::find_if(string_double_map_.begin(),string_double_map_.end(),string_maps_to_double{sv}); | 2745 | 497 | if (it != string_double_map_.end()) | 2746 | 0 | { | 2747 | 0 | more_ = visitor.double_value(it->second, semantic_tag::none, *this, ec); | 2748 | 0 | } | 2749 | 497 | else | 2750 | 497 | { | 2751 | 497 | more_ = visitor.string_value(sv, semantic_tag::none, *this, ec); | 2752 | 497 | } | 2753 | 497 | state_ = json_parse_state::accept; | 2754 | 497 | break; | 2755 | 7.60k | } | 2756 | 0 | default: | 2757 | 0 | more_ = err_handler_(json_errc::syntax_error, *this); | 2758 | 0 | if (!more_) | 2759 | 0 | { | 2760 | 0 | ec = json_errc::syntax_error; | 2761 | 0 | return; | 2762 | 0 | } | 2763 | 0 | break; | 2764 | 2.12M | } | 2765 | 2.12M | } |
|
2766 | | |
2767 | | void begin_member_or_element(std::error_code& ec) |
2768 | 26.4M | { |
2769 | 26.4M | switch (parent()) |
2770 | 26.4M | { |
2771 | 2.02M | case json_parse_state::object: |
2772 | 2.02M | state_ = json_parse_state::expect_member_name; |
2773 | 2.02M | break; |
2774 | 24.4M | case json_parse_state::array: |
2775 | 24.4M | state_ = json_parse_state::expect_value; |
2776 | 24.4M | break; |
2777 | 42 | case json_parse_state::root: |
2778 | 42 | break; |
2779 | 0 | default: |
2780 | 0 | more_ = err_handler_(json_errc::syntax_error, *this); |
2781 | 0 | if (!more_) |
2782 | 0 | { |
2783 | 0 | ec = json_errc::syntax_error; |
2784 | 0 | return; |
2785 | 0 | } |
2786 | 0 | break; |
2787 | 26.4M | } |
2788 | 26.4M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::begin_member_or_element(std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::begin_member_or_element(std::__1::error_code&) Line | Count | Source | 2768 | 26.4M | { | 2769 | 26.4M | switch (parent()) | 2770 | 26.4M | { | 2771 | 2.02M | case json_parse_state::object: | 2772 | 2.02M | state_ = json_parse_state::expect_member_name; | 2773 | 2.02M | break; | 2774 | 24.4M | case json_parse_state::array: | 2775 | 24.4M | state_ = json_parse_state::expect_value; | 2776 | 24.4M | break; | 2777 | 42 | case json_parse_state::root: | 2778 | 42 | break; | 2779 | 0 | default: | 2780 | 0 | more_ = err_handler_(json_errc::syntax_error, *this); | 2781 | 0 | if (!more_) | 2782 | 0 | { | 2783 | 0 | ec = json_errc::syntax_error; | 2784 | 0 | return; | 2785 | 0 | } | 2786 | 0 | break; | 2787 | 26.4M | } | 2788 | 26.4M | } |
|
2789 | | |
2790 | | void after_value(std::error_code& ec) |
2791 | 23.8M | { |
2792 | 23.8M | switch (parent()) |
2793 | 23.8M | { |
2794 | 21.8M | case json_parse_state::array: |
2795 | 23.8M | case json_parse_state::object: |
2796 | 23.8M | state_ = json_parse_state::expect_comma_or_end; |
2797 | 23.8M | break; |
2798 | 5.36k | case json_parse_state::root: |
2799 | 5.36k | state_ = json_parse_state::accept; |
2800 | 5.36k | break; |
2801 | 0 | default: |
2802 | 0 | more_ = err_handler_(json_errc::syntax_error, *this); |
2803 | 0 | if (!more_) |
2804 | 0 | { |
2805 | 0 | ec = json_errc::syntax_error; |
2806 | 0 | return; |
2807 | 0 | } |
2808 | 0 | break; |
2809 | 23.8M | } |
2810 | 23.8M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::after_value(std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::after_value(std::__1::error_code&) Line | Count | Source | 2791 | 23.8M | { | 2792 | 23.8M | switch (parent()) | 2793 | 23.8M | { | 2794 | 21.8M | case json_parse_state::array: | 2795 | 23.8M | case json_parse_state::object: | 2796 | 23.8M | state_ = json_parse_state::expect_comma_or_end; | 2797 | 23.8M | break; | 2798 | 5.36k | case json_parse_state::root: | 2799 | 5.36k | state_ = json_parse_state::accept; | 2800 | 5.36k | break; | 2801 | 0 | default: | 2802 | 0 | more_ = err_handler_(json_errc::syntax_error, *this); | 2803 | 0 | if (!more_) | 2804 | 0 | { | 2805 | 0 | ec = json_errc::syntax_error; | 2806 | 0 | return; | 2807 | 0 | } | 2808 | 0 | break; | 2809 | 23.8M | } | 2810 | 23.8M | } |
|
2811 | | |
2812 | | void push_state(json_parse_state state) |
2813 | 14.7M | { |
2814 | 14.7M | state_stack_.push_back(state); |
2815 | 14.7M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::push_state(jsoncons::json_parse_state) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::push_state(jsoncons::json_parse_state) Line | Count | Source | 2813 | 14.7M | { | 2814 | 14.7M | state_stack_.push_back(state); | 2815 | 14.7M | } |
|
2816 | | |
2817 | | json_parse_state pop_state() |
2818 | 3.32M | { |
2819 | 3.32M | JSONCONS_ASSERT(!state_stack_.empty()) |
2820 | 3.32M | json_parse_state state = state_stack_.back(); |
2821 | 3.32M | state_stack_.pop_back(); |
2822 | 3.32M | return state; |
2823 | 3.32M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::pop_state() jsoncons::basic_json_parser<char, std::__1::allocator<char> >::pop_state() Line | Count | Source | 2818 | 3.32M | { | 2819 | 3.32M | JSONCONS_ASSERT(!state_stack_.empty()) | 2820 | 3.32M | json_parse_state state = state_stack_.back(); | 2821 | 3.32M | state_stack_.pop_back(); | 2822 | 3.32M | return state; | 2823 | 3.32M | } |
|
2824 | | |
2825 | | uint32_t append_to_codepoint(uint32_t cp, int c, std::error_code& ec) |
2826 | 13.3M | { |
2827 | 13.3M | cp *= 16; |
2828 | 13.3M | if (c >= '0' && c <= '9') |
2829 | 4.75M | { |
2830 | 4.75M | cp += c - '0'; |
2831 | 4.75M | } |
2832 | 8.57M | else if (c >= 'a' && c <= 'f') |
2833 | 2.15M | { |
2834 | 2.15M | cp += c - 'a' + 10; |
2835 | 2.15M | } |
2836 | 6.41M | else if (c >= 'A' && c <= 'F') |
2837 | 6.41M | { |
2838 | 6.41M | cp += c - 'A' + 10; |
2839 | 6.41M | } |
2840 | 191 | else |
2841 | 191 | { |
2842 | 191 | more_ = err_handler_(json_errc::invalid_unicode_escape_sequence, *this); |
2843 | 191 | if (!more_) |
2844 | 191 | { |
2845 | 191 | ec = json_errc::invalid_unicode_escape_sequence; |
2846 | 191 | return cp; |
2847 | 191 | } |
2848 | 191 | } |
2849 | 13.3M | return cp; |
2850 | 13.3M | } Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::append_to_codepoint(unsigned int, int, std::__1::error_code&) jsoncons::basic_json_parser<char, std::__1::allocator<char> >::append_to_codepoint(unsigned int, int, std::__1::error_code&) Line | Count | Source | 2826 | 13.3M | { | 2827 | 13.3M | cp *= 16; | 2828 | 13.3M | if (c >= '0' && c <= '9') | 2829 | 4.75M | { | 2830 | 4.75M | cp += c - '0'; | 2831 | 4.75M | } | 2832 | 8.57M | else if (c >= 'a' && c <= 'f') | 2833 | 2.15M | { | 2834 | 2.15M | cp += c - 'a' + 10; | 2835 | 2.15M | } | 2836 | 6.41M | else if (c >= 'A' && c <= 'F') | 2837 | 6.41M | { | 2838 | 6.41M | cp += c - 'A' + 10; | 2839 | 6.41M | } | 2840 | 191 | else | 2841 | 191 | { | 2842 | 191 | more_ = err_handler_(json_errc::invalid_unicode_escape_sequence, *this); | 2843 | 191 | if (!more_) | 2844 | 191 | { | 2845 | 191 | ec = json_errc::invalid_unicode_escape_sequence; | 2846 | 191 | return cp; | 2847 | 191 | } | 2848 | 191 | } | 2849 | 13.3M | return cp; | 2850 | 13.3M | } |
|
2851 | | }; |
2852 | | |
2853 | | using json_parser = basic_json_parser<char>; |
2854 | | using wjson_parser = basic_json_parser<wchar_t>; |
2855 | | |
2856 | | } |
2857 | | |
2858 | | #endif |
2859 | | |