summaryrefslogtreecommitdiff
path: root/vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp.orig
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp.orig')
-rw-r--r--vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp.orig2157
1 files changed, 0 insertions, 2157 deletions
diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp.orig b/vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp.orig
deleted file mode 100644
index e4769d5c..00000000
--- a/vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp.orig
+++ /dev/null
@@ -1,2157 +0,0 @@
-// Copyright 2015 Daniel Parker
-// Distributed under the Boost license, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See https://github.com/danielaparker/jsoncons for latest version
-
-#ifndef JSONCONS_JSON_PARSER_HPP
-#define JSONCONS_JSON_PARSER_HPP
-
-#include <memory>
-#include <string>
-#include <sstream>
-#include <vector>
-#include <istream>
-#include <cstdlib>
-#include <stdexcept>
-#include <system_error>
-#include "jsoncons/jsoncons.hpp"
-#include "jsoncons/json_input_handler.hpp"
-#include "jsoncons/parse_error_handler.hpp"
-#include "jsoncons/json_error_category.hpp"
-
-namespace jsoncons {
-
-enum class modes
-{
- done,
- start,
- array_element,
- object_member_name,
- object_member_value
-};
-
-enum class states
-{
- start,
- slash,
- slash_slash,
- slash_star,
- slash_star_star,
- expect_comma_or_end,
- object,
- expect_member_name,
- expect_colon,
- expect_value,
- array,
- string,
- escape,
- u1,
- u2,
- u3,
- u4,
- expect_surrogate_pair1,
- expect_surrogate_pair2,
- u6,
- u7,
- u8,
- u9,
- minus,
- zero,
- integer,
- fraction,
- exp1,
- exp2,
- exp3,
- n,
- t,
- f,
- cr,
- lf,
- done,
- scalar
-};
-
-template<typename CharT>
-class basic_json_parser : private basic_parsing_context<CharT>
-{
- static const int default_depth = 100;
-
- std::vector<states> state_stack_;
- int top_;
- std::vector<modes> stack_;
- basic_json_input_handler<CharT> *handler_;
- basic_parse_error_handler<CharT> *err_handler_;
- size_t column_;
- size_t line_;
- uint32_t cp_;
- uint32_t cp2_;
- std::basic_string<CharT> string_buffer_;
- std::basic_string<char> number_buffer_;
- bool is_negative_;
- states saved_state_;
- states pre_line_break_state_;
- size_t index_;
- int depth_;
- int max_depth_;
- float_reader float_reader_;
- const CharT* begin_input_;
- const CharT* end_input_;
- const CharT* p_;
- uint8_t precision_;
- std::pair<const CharT*,size_t> literal_;
- size_t literal_index_;
-
- std::vector<states> stack2_;
-
-public:
- basic_json_parser(basic_json_input_handler<CharT>& handler)
- : top_(-1),
- stack_(default_depth),
- handler_(std::addressof(handler)),
- err_handler_(std::addressof(basic_default_parse_error_handler<CharT>::instance())),
- column_(0),
- line_(0),
- cp_(0),
- is_negative_(false),
- index_(0),
- depth_(default_depth)
- {
- max_depth_ = std::numeric_limits<int>::max JSONCONS_NO_MACRO_EXP();
- }
-
- basic_json_parser(basic_json_input_handler<CharT>& handler,
- basic_parse_error_handler<CharT>& err_handler)
- : top_(-1),
- stack_(default_depth),
- handler_(std::addressof(handler)),
- err_handler_(std::addressof(err_handler)),
- column_(0),
- line_(0),
- cp_(0),
- is_negative_(false),
- index_(0),
- depth_(default_depth)
-
- {
- max_depth_ = std::numeric_limits<int>::max JSONCONS_NO_MACRO_EXP();
- }
-
- const basic_parsing_context<CharT>& parsing_context() const
- {
- return *this;
- }
-
- ~basic_json_parser()
- {
- }
-
- size_t max_nesting_depth() const
- {
- return static_cast<size_t>(max_depth_);
- }
-
- void max_nesting_depth(size_t max_nesting_depth)
- {
- max_depth_ = static_cast<int>(std::min(max_nesting_depth,static_cast<size_t>(std::numeric_limits<int>::max JSONCONS_NO_MACRO_EXP())));
- if (depth_ > max_depth_)
- {
- depth_ = max_depth_;
- stack_.resize(depth_);
- }
- }
-
- bool done() const
- {
- return state_stack_.back() == states::done;
- }
-
- void begin_parse()
- {
- if (!push(modes::done))
- {
- err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this);
- }
- state_stack_.clear();
- state_stack_.push_back(states::start);
- line_ = 1;
- column_ = 1;
- stack2_.push_back(states::start);
- stack2_.push_back(states::scalar);
- }
-
- void check_done(const CharT* input, size_t start, size_t length)
- {
- index_ = start;
- for (; index_ < length; ++index_)
- {
- CharT curr_char_ = input[index_];
- switch (curr_char_)
- {
- case '\n':
- case '\r':
- case '\t':
- case ' ':
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::extra_character, json_error_category()), *this);
- break;
- }
- }
- }
-
- bool parse_string(const CharT** first, const CharT** last)
- {
- const CharT* sb = p_;
- bool done = false;
- bool complete = false;
- while (!done && p_ < end_input_)
- {
- switch (*p_)
- {
- case 0x00:case 0x01:case 0x02:case 0x03:case 0x04:case 0x05:case 0x06:case 0x07:case 0x08:case 0x0b:
- case 0x0c:case 0x0e:case 0x0f:case 0x10:case 0x11:case 0x12:case 0x13:case 0x14:case 0x15:case 0x16:
- case 0x17:case 0x18:case 0x19:case 0x1a:case 0x1b:case 0x1c:case 0x1d:case 0x1e:case 0x1f:
- string_buffer_.append(sb,p_-sb);
- column_ += (p_ - sb + 1);
- err_handler_->error(std::error_code(json_parser_errc::illegal_control_character, json_error_category()), *this);
- // recovery - skip
- done = true;
- ++p_;
- break;
- case '\r':
- {
- column_ += (p_ - sb + 1);
- err_handler_->error(std::error_code(json_parser_errc::illegal_character_in_string, json_error_category()), *this);
- // recovery - keep
- string_buffer_.append(sb, p_ - sb + 1);
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
-
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- done = true;
- ++p_;
-
- stack2_.push_back(states::cr);
- }
- break;
- case '\n':
- {
- column_ += (p_ - sb + 1);
- err_handler_->error(std::error_code(json_parser_errc::illegal_character_in_string, json_error_category()), *this);
- // recovery - keep
- string_buffer_.append(sb, p_ - sb + 1);
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
- done = true;
- ++p_;
-
- stack2_.push_back(states::lf);
- }
- break;
- case '\t':
- {
- column_ += (p_ - sb + 1);
- err_handler_->error(std::error_code(json_parser_errc::illegal_character_in_string, json_error_category()), *this);
- // recovery - keep
- string_buffer_.append(sb, p_ - sb + 1);
- done = true;
- ++p_;
- }
- break;
- case '\\':
- string_buffer_.append(sb,p_-sb);
- column_ += (p_ - sb + 1);
-<<<<<<< HEAD
- state_stack_.back() = states::escape;
-=======
- state_ = states::escape;
- stack2_.front() = states::escape;
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- done = true;
- ++p_;
- break;
- case '\"':
- if (string_buffer_.length() == 0)
- {
- *first = sb;
- *last = p_;
- //end_string_value(sb,p_-sb);
- }
- else
- {
- string_buffer_.append(sb,p_-sb);
- *first = string_buffer_.data();
- *last = string_buffer_.data() + string_buffer_.length();
- //end_string_value(string_buffer_.data(),string_buffer_.length());
- //string_buffer_.clear();
- }
- column_ += (p_ - sb + 1);
- done = true;
- complete = true;
- ++p_;
- break;
- default:
- ++p_;
- break;
- }
- }
- if (!done)
- {
- string_buffer_.append(sb,p_-sb);
- column_ += (p_ - sb + 1);
- }
-
- return complete;
- }
-
- void parse(const CharT* const input, size_t start, size_t length)
- {
- begin_input_ = input + start;
- end_input_ = input + length;
- p_ = begin_input_;
-
- index_ = start;
- while ((p_ < end_input_) && (state_stack_.back() != states::done))
- {
- switch (*p_)
- {
- case 0x00:case 0x01:case 0x02:case 0x03:case 0x04:case 0x05:case 0x06:case 0x07:case 0x08:case 0x0b:
- case 0x0c:case 0x0e:case 0x0f:case 0x10:case 0x11:case 0x12:case 0x13:case 0x14:case 0x15:case 0x16:
- case 0x17:case 0x18:case 0x19:case 0x1a:case 0x1b:case 0x1c:case 0x1d:case 0x1e:case 0x1f:
- err_handler_->error(std::error_code(json_parser_errc::illegal_control_character, json_error_category()), *this);
- break;
- default:
- break;
- }
-
- switch (state_stack_.back())
- {
- case states::cr:
- ++line_;
- column_ = 1;
- switch (*p_)
- {
- case '\n':
- state_stack_.back() = pre_line_break_state_;
- ++p_;
- break;
- default:
- state_stack_.back() = pre_line_break_state_;
- break;
- }
- JSONCONS_ASSERT(stack2_.size() > 0);
- stack2_.pop_back();
- break;
- case states::lf:
- ++line_;
- column_ = 1;
-<<<<<<< HEAD
- state_stack_.back() = pre_line_break_state_;
-=======
- state_ = pre_line_break_state_;
- JSONCONS_ASSERT(stack2_.size() > 0);
- stack2_.pop_back();
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case states::start:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case ' ':case '\t':
- {
- bool done = false;
- while (!done && (p_ + 1) < end_input_)
- {
- switch (*(p_ + 1))
- {
- case ' ':case '\t':
- ++p_;
- ++column_;
- break;
- default:
- done = true;
- break;
- }
- }
- }
- break;
- case '{':
- handler_->begin_json();
- if (!push(modes::object_member_name))
- {
- err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this);
- }
-<<<<<<< HEAD
- state_stack_.back() = states::object;
-=======
- state_ = states::object;
-
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- handler_->begin_object(*this);
- break;
- case '[':
- handler_->begin_json();
- if (!push(modes::array_element))
- {
- err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this);
- }
- state_stack_.back() = states::array;
- handler_->begin_array(*this);
- break;
- case '\"':
- handler_->begin_json();
- flip(modes::done, modes::start);
- state_stack_.back() = states::string;
- break;
- case '-':
- handler_->begin_json();
- flip(modes::done, modes::start);
- is_negative_ = true;
- state_stack_.back() = states::minus;
- break;
- case '0':
- handler_->begin_json();
- flip(modes::done, modes::start);
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::zero;
- break;
- case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- handler_->begin_json();
- flip(modes::done, modes::start);
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::integer;
- break;
- case 'f':
- handler_->begin_json();
- flip(modes::done, modes::start);
- state_stack_.back() = states::f;
- literal_ = json_literals<CharT>::false_literal();
- literal_index_ = 1;
- break;
- case 'n':
- handler_->begin_json();
- flip(modes::done, modes::start);
- state_stack_.back() = states::n;
- literal_ = json_literals<CharT>::null_literal();
- literal_index_ = 1;
- break;
- case 't':
- handler_->begin_json();
- flip(modes::done, modes::start);
- state_stack_.back() = states::t;
- literal_ = json_literals<CharT>::true_literal();
- literal_index_ = 1;
- break;
- case '/':
- saved_state_ = state_stack_.back();
- state_stack_.back() = states::slash;
- break;
- case '}':
- err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_brace, json_error_category()), *this);
- break;
- case ']':
- err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_bracket, json_error_category()), *this);
- break;
- default:
- err_handler_->fatal_error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
-
- case states::expect_comma_or_end:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case ' ':case '\t':
- {
- bool done = false;
- while (!done && (p_ + 1) < end_input_)
- {
- switch (*(p_ + 1))
- {
- case ' ':case '\t':
- ++p_;
- ++column_;
- break;
- default:
- done = true;
- break;
- }
- }
- }
- break;
- case '}':
- if (peek() == modes::object_member_value)
- {
- pop(modes::object_member_value);
- handler_->end_object(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- }
- else if (peek() == modes::array_element)
- {
- err_handler_->fatal_error(std::error_code(json_parser_errc::expected_comma_or_right_bracket, json_error_category()), *this);
- }
- else
- {
- err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_brace, json_error_category()), *this);
- }
- break;
- case ']':
- if (peek() == modes::array_element)
- {
- pop(modes::array_element);
- handler_->end_array(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- }
- else if (peek() == modes::object_member_value)
- {
- err_handler_->fatal_error(std::error_code(json_parser_errc::expected_comma_or_right_brace, json_error_category()), *this);
- }
- else
- {
- err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_bracket, json_error_category()), *this);
- }
- break;
- case ',':
- begin_member_or_element();
- break;
- case '/':
- saved_state_ = state_stack_.back();
- state_stack_.back() = states::slash;
- break;
- default:
- if (peek() == modes::array_element)
- {
- err_handler_->error(std::error_code(json_parser_errc::expected_comma_or_right_bracket, json_error_category()), *this);
- }
- else if (peek() == modes::object_member_value)
- {
- err_handler_->error(std::error_code(json_parser_errc::expected_comma_or_right_brace, json_error_category()), *this);
- }
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::object:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case ' ':case '\t':
- {
- bool done = false;
- while (!done && (p_ + 1) < end_input_)
- {
- switch (*(p_ + 1))
- {
- case ' ':case '\t':
- ++p_;
- ++column_;
- break;
- default:
- done = true;
- break;
- }
- }
- }
- break;
- case '}':
- if (!pop(modes::object_member_name))
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- }
- handler_->end_object(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- break;
- case '\"':
- state_stack_.back() = states::string;
- break;
- case '/':
- saved_state_ = state_stack_.back();
- state_stack_.back() = states::slash;
- break;
- case '\'':
- err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this);
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_name, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::expect_member_name:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case ' ':case '\t':
- {
- bool done = false;
- while (!done && (p_ + 1) < end_input_)
- {
- switch (*(p_ + 1))
- {
- case ' ':case '\t':
- ++p_;
- ++column_;
- break;
- default:
- done = true;
- break;
- }
- }
- }
- break;
- case '\"':
- state_stack_.back() = states::string;
- break;
- case '/':
- saved_state_ = state_stack_.back();
- state_stack_.back() = states::slash;
- break;
- case '}':
- err_handler_->error(std::error_code(json_parser_errc::extra_comma, json_error_category()), *this);
- break;
- case '\'':
- err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this);
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_name, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::expect_colon:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case ' ':case '\t':
- {
- bool done = false;
- while (!done && (p_ + 1) < end_input_)
- {
- switch (*(p_ + 1))
- {
- case ' ':case '\t':
- ++p_;
- ++column_;
- break;
- default:
- done = true;
- break;
- }
- }
- }
- break;
- case ':':
- begin_member_value();
- state_stack_.back() = states::expect_value;
- break;
- case '/':
- saved_state_ = state_stack_.back();
- state_stack_.back() = states::slash;
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_colon, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::expect_value:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case ' ':case '\t':
- {
- bool done = false;
- while (!done && (p_ + 1) < end_input_)
- {
- switch (*(p_ + 1))
- {
- case ' ':case '\t':
- ++p_;
- ++column_;
- break;
- default:
- done = true;
- break;
- }
- }
- }
- break;
- case '{':
- if (!push(modes::object_member_name))
- {
- err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this);
- }
- state_stack_.back() = states::object;
- handler_->begin_object(*this);
- break;
- case '[':
- if (!push(modes::array_element))
- {
- err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this);
- }
- state_stack_.back() = states::array;
- handler_->begin_array(*this);
- break;
- case '/':
- saved_state_ = state_stack_.back();
- state_stack_.back() = states::slash;
- break;
-
- case '\"':
- state_stack_.back() = states::string;
- break;
- case '-':
- is_negative_ = true;
- state_stack_.back() = states::minus;
- break;
- case '0':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::zero;
- break;
- case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::integer;
- break;
- case 'f':
- state_stack_.back() = states::f;
- literal_ = json_literals<CharT>::false_literal();
- literal_index_ = 1;
- /*if ((p_+4) < end_input_)
- {
- if ((*(p_+1) == 'a') & (*(p_+2) == 'l') & (*(p_+3) == 's') & (*(p_+4) == 'e'))
- {
- p_ += 4;
- column_ += 4;
- handler_->value(false, *this);
- if (peek() == modes::start)
- {
- flip(modes::start,modes::done);
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- }
- }*/
- break;
- case 'n':
- state_stack_.back() = states::n;
- literal_ = json_literals<CharT>::null_literal();
- literal_index_ = 1;
- break;
- case 't':
- state_stack_.back() = states::t;
- literal_ = json_literals<CharT>::true_literal();
- literal_index_ = 1;
- break;
- case ']':
- if (peek() == modes::array_element)
- {
- err_handler_->error(std::error_code(json_parser_errc::extra_comma, json_error_category()), *this);
- }
- else
- {
- err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this);
- }
- break;
- case '\'':
- err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this);
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::array:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case ' ':case '\t':
- {
- bool done = false;
- while (!done && (p_ + 1) < end_input_)
- {
- switch (*(p_ + 1))
- {
- case ' ':case '\t':
- ++p_;
- ++column_;
- break;
- default:
- done = true;
- break;
- }
- }
- }
- break;
- case '{':
- if (!push(modes::object_member_name))
- {
- err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this);
- }
- state_stack_.back() = states::object;
- handler_->begin_object(*this);
- break;
- case '[':
- if (!push(modes::array_element))
- {
- err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this);
- }
- state_stack_.back() = states::array;
- handler_->begin_array(*this);
- break;
- case ']':
- if (!pop(modes::array_element))
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- }
- handler_->end_array(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- break;
- case '\"':
- state_stack_.back() = states::string;
- break;
- case '/':
- saved_state_ = state_stack_.back();
- state_stack_.back() = states::slash;
- break;
- case '-':
- is_negative_ = true;
- state_stack_.back() = states::minus;
- break;
- case '0':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::zero;
- break;
- case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::integer;
- break;
- case 'f':
- state_stack_.back() = states::f;
- literal_ = json_literals<CharT>::false_literal();
- literal_index_ = 1;
- /*if ((p_+4) < end_input_)
- {
- if ((*(p_+1) == 'a') & (*(p_+2) == 'l') & (*(p_+3) == 's') & (*(p_+4) == 'e'))
- {
- p_ += 4;
- column_ += 4;
- handler_->value(false, *this);
- if (peek() == modes::start)
- {
- flip(modes::start,modes::done);
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- }
- }*/
- break;
- case 'n':
- state_stack_.back() = states::n;
- literal_ = json_literals<CharT>::null_literal();
- literal_index_ = 1;
- break;
- case 't':
- state_stack_.back() = states::t;
- literal_ = json_literals<CharT>::true_literal();
- literal_index_ = 1;
- break;
- case '\'':
- err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this);
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::string:
- {
- const CharT* first;
- const CharT* last;
- if (parse_string(&first,&last))
- {
- end_string_value(first,last-first);
- string_buffer_.clear();
- }
- }
- break;
- case states::escape:
- {
- escape_next_char(*p_);
- }
- ++p_;
- ++column_;
- break;
- case states::u1:
- {
- append_codepoint(*p_);
- state_stack_.back() = states::u2;
- }
- ++p_;
- ++column_;
- break;
- case states::u2:
- {
- append_codepoint(*p_);
- state_stack_.back() = states::u3;
- }
- ++p_;
- ++column_;
- break;
- case states::u3:
- {
- append_codepoint(*p_);
- state_stack_.back() = states::u4;
- }
- ++p_;
- ++column_;
- break;
- case states::u4:
- {
- append_codepoint(*p_);
- if (cp_ >= min_lead_surrogate && cp_ <= max_lead_surrogate)
- {
- state_stack_.back() = states::expect_surrogate_pair1;
- }
- else
- {
- json_char_traits<CharT, sizeof(CharT)>::append_codepoint_to_string(cp_, string_buffer_);
- state_stack_.back() = states::string;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::expect_surrogate_pair1:
- {
- switch (*p_)
- {
- case '\\':
- cp2_ = 0;
- state_stack_.back() = states::expect_surrogate_pair2;
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_codepoint_surrogate_pair, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::expect_surrogate_pair2:
- {
- switch (*p_)
- {
- case 'u':
- state_stack_.back() = states::u6;
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_codepoint_surrogate_pair, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::u6:
- {
- append_second_codepoint(*p_);
- state_stack_.back() = states::u7;
- }
- ++p_;
- ++column_;
- break;
- case states::u7:
- {
- append_second_codepoint(*p_);
- state_stack_.back() = states::u8;
- }
- ++p_;
- ++column_;
- break;
- case states::u8:
- {
- append_second_codepoint(*p_);
- state_stack_.back() = states::u9;
- }
- ++p_;
- ++column_;
- break;
- case states::u9:
- {
- append_second_codepoint(*p_);
- uint32_t cp = 0x10000 + ((cp_ & 0x3FF) << 10) + (cp2_ & 0x3FF);
- json_char_traits<CharT, sizeof(CharT)>::append_codepoint_to_string(cp, string_buffer_);
- state_stack_.back() = states::string;
- }
- ++p_;
- ++column_;
- break;
- case states::minus:
- {
- switch (*p_)
- {
- case '0':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::zero;
- break;
- case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::integer;
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::zero:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case ' ':case '\t':
- {
- bool done = false;
- while (!done && (p_ + 1) < end_input_)
- {
- switch (*(p_ + 1))
- {
- case ' ':case '\t':
- ++p_;
- ++column_;
- break;
- default:
- done = true;
- break;
- }
- }
- }
- end_integer_value();
- break; // No change
- case '}':
- end_integer_value();
- if (!pop(modes::object_member_value))
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- }
- handler_->end_object(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- break;
- case ']':
- end_integer_value();
- if (!pop(modes::array_element))
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- }
- handler_->end_array(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- break;
- case '.':
- precision_ = static_cast<uint8_t>(number_buffer_.length());
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::fraction;
- break;
- case ',':
- end_integer_value();
- begin_member_or_element();
- break;
- case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- err_handler_->error(std::error_code(json_parser_errc::leading_zero, json_error_category()), *this);
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::integer:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case ' ':case '\t':
- {
- bool done = false;
- while (!done && (p_ + 1) < end_input_)
- {
- switch (*(p_ + 1))
- {
- case ' ':case '\t':
- ++p_;
- ++column_;
- break;
- default:
- done = true;
- break;
- }
- }
- }
- end_integer_value();
- break;
- case '}':
- end_integer_value();
- if (!pop(modes::object_member_value))
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- }
- handler_->end_object(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- break;
- case ']':
- end_integer_value();
- if (!pop(modes::array_element))
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- }
- handler_->end_array(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- break;
- case '0':
- case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::integer;
- break;
- case '.':
- precision_ = static_cast<uint8_t>(number_buffer_.length());
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::fraction;
- break;
- case ',':
- end_integer_value();
- begin_member_or_element();
- break;
- case 'e':case 'E':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::exp1;
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::fraction:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case ' ':case '\t':
- {
- bool done = false;
- while (!done && (p_ + 1) < end_input_)
- {
- switch (*(p_ + 1))
- {
- case ' ':case '\t':
- ++p_;
- ++column_;
- break;
- default:
- done = true;
- break;
- }
- }
- }
- end_fraction_value();
- break;
- case '}':
- end_fraction_value();
- if (!pop(modes::object_member_value))
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- }
- handler_->end_object(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- break;
- case ']':
- end_fraction_value();
- if (!pop(modes::array_element))
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- }
- handler_->end_array(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- break;
- case '0':
- case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- ++precision_;
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::fraction;
- break;
- case ',':
- end_fraction_value();
- begin_member_or_element();
- break;
- case 'e':case 'E':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::exp1;
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::exp1:
- {
- switch (*p_)
- {
- case '+':
- state_stack_.back() = states::exp2;
- break;
- case '-':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::exp2;
- break;
- case '0':
- case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::exp3;
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::exp2:
- {
- switch (*p_)
- {
- case '0':
- case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::exp3;
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::exp3:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case ' ':case '\t':
- {
- bool done = false;
- while (!done && (p_ + 1) < end_input_)
- {
- switch (*(p_ + 1))
- {
- case ' ':case '\t':
- ++p_;
- ++column_;
- break;
- default:
- done = true;
- break;
- }
- }
- }
- end_fraction_value();
- break;
- case '}':
- end_fraction_value();
- if (!pop(modes::object_member_value))
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- }
- handler_->end_object(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- break;
- case ']':
- end_fraction_value();
- if (!pop(modes::array_element))
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- }
- handler_->end_array(*this);
- if (peek() == modes::done)
- {
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- break;
- case ',':
- end_fraction_value();
- begin_member_or_element();
- break;
- case '0':
- case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- number_buffer_.push_back(static_cast<char>(*p_));
- state_stack_.back() = states::exp3;
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::t:
- while (p_ < end_input_ && literal_index_ < literal_.second)
- {
- if (*p_ != literal_.first[literal_index_])
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_value, json_error_category()), *this);
- }
- ++p_;
- ++literal_index_;
- ++column_;
- }
- if (literal_index_ == literal_.second)
- {
- handler_->value(true, *this);
- if (peek() == modes::start)
- {
- flip(modes::start,modes::done);
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- }
- break;
- case states::f:
- while (p_ < end_input_ && literal_index_ < literal_.second)
- {
- if (*p_ != literal_.first[literal_index_])
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_value, json_error_category()), *this);
- }
- ++p_;
- ++literal_index_;
- ++column_;
- }
- if (literal_index_ == literal_.second)
- {
- handler_->value(false, *this);
- if (peek() == modes::start)
- {
- flip(modes::start,modes::done);
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- }
- break;
- case states::n:
- while (p_ < end_input_ && literal_index_ < literal_.second)
- {
- if (*p_ != literal_.first[literal_index_])
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_value, json_error_category()), *this);
- }
- ++p_;
- ++literal_index_;
- ++column_;
- }
- if (literal_index_ == literal_.second)
- {
- handler_->value(null_type(), *this);
- if (peek() == modes::start)
- {
- flip(modes::start,modes::done);
- state_stack_.back() = states::done;
- handler_->end_json();
- }
- else
- {
- state_stack_.back() = states::expect_comma_or_end;
- }
- }
- break;
- case states::slash:
- {
- switch (*p_)
- {
- case '*':
- state_stack_.back() = states::slash_star;
- break;
- case '/':
- state_stack_.back() = states::slash_slash;
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::slash_star:
- {
- switch (*p_)
- {
- case '\r':
-<<<<<<< HEAD
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = state_stack_.back();
- state_stack_.back() = states::lf;
-=======
- pre_line_break_state_ = state_;
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- case '*':
- state_stack_.back() = states::slash_star_star;
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::slash_slash:
- {
- switch (*p_)
- {
- case '\r':
- pre_line_break_state_ = saved_state_;
-<<<<<<< HEAD
- state_stack_.back() = states::cr;
- break;
- case '\n':
- pre_line_break_state_ = saved_state_;
- state_stack_.back() = states::lf;
-=======
- state_ = states::cr;
- stack2_.push_back(states::cr);
- break;
- case '\n':
- pre_line_break_state_ = saved_state_;
- state_ = states::lf;
- stack2_.push_back(states::lf);
->>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- case states::slash_star_star:
- {
- switch (*p_)
- {
- case '/':
- state_stack_.back() = saved_state_;
- break;
- default:
- state_stack_.back() = states::slash_star;
- break;
- }
- }
- ++p_;
- ++column_;
- break;
- default:
- JSONCONS_THROW_EXCEPTION(std::runtime_error,"Bad parser state");
- break;
- }
- }
- index_ += (p_-begin_input_);
- }
-
- void end_parse()
- {
- if (peek() == modes::start)
- {
- switch (state_stack_.back())
- {
- case states::zero:
- case states::integer:
- end_integer_value();
- break;
- case states::fraction:
- case states::exp3:
- end_fraction_value();
- break;
- default:
- break;
- }
- }
- if (!pop(modes::done))
- {
- err_handler_->error(std::error_code(json_parser_errc::unexpected_eof, json_error_category()), *this);
- }
- }
-
- states state() const
- {
- return state_stack_.back();
- }
-
- size_t index() const
- {
- return index_;
- }
-private:
- void end_fraction_value()
- {
- try
- {
- double d = float_reader_.read(number_buffer_.data(), precision_);
- if (is_negative_)
- d = -d;
- handler_->value(d, static_cast<uint8_t>(precision_), *this);
- }
- catch (...)
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this);
- handler_->value(null_type(), *this); // recovery
- }
- number_buffer_.clear();
- is_negative_ = false;
- switch (stack_[top_])
- {
- case modes::array_element:
- case modes::object_member_value:
- state_stack_.back() = states::expect_comma_or_end;
- break;
- case modes::start:
- flip(modes::start,modes::done);
- state_stack_.back() = states::done;
- handler_->end_json();
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- break;
- }
- }
-
- void end_integer_value()
- {
- if (is_negative_)
- {
- try
- {
- int64_t d = string_to_integer(is_negative_, number_buffer_.data(), number_buffer_.length());
- handler_->value(d, *this);
- }
- catch (const std::exception&)
- {
- try
- {
- double d = float_reader_.read(number_buffer_.data(), number_buffer_.length());
- handler_->value(-d, static_cast<uint8_t>(number_buffer_.length()), *this);
- }
- catch (...)
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this);
- handler_->value(null_type(), *this);
- }
- }
- }
- else
- {
- try
- {
- uint64_t d = string_to_uinteger(number_buffer_.data(), number_buffer_.length());
- handler_->value(d, *this);
- }
- catch (const std::exception&)
- {
- try
- {
- double d = float_reader_.read(number_buffer_.data(),number_buffer_.length());
- handler_->value(d, static_cast<uint8_t>(number_buffer_.length()), *this);
- }
- catch (...)
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this);
- handler_->value(null_type(), *this);
- }
- }
- }
-
- switch (stack_[top_])
- {
- case modes::array_element:
- case modes::object_member_value:
- state_stack_.back() = states::expect_comma_or_end;
- break;
- case modes::start:
- flip(modes::start,modes::done);
- state_stack_.back() = states::done;
- handler_->end_json();
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- break;
- }
- number_buffer_.clear();
- is_negative_ = false;
- }
-
- void append_codepoint(int c)
- {
- switch (c)
- {
- case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':
- case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':
- cp_ = append_to_codepoint(cp_, c);
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this);
- break;
- }
- }
-
- void append_second_codepoint(int c)
- {
- switch (c)
- {
- case '0':
- case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
- case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':
- case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':
- cp2_ = append_to_codepoint(cp2_, c);
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this);
- break;
- }
- }
-
- void escape_next_char(int next_input)
- {
- switch (next_input)
- {
- case '\"':
- string_buffer_.push_back('\"');
- state_stack_.back() = states::string;
- break;
- case '\\':
- string_buffer_.push_back('\\');
- state_stack_.back() = states::string;
- break;
- case '/':
- string_buffer_.push_back('/');
- state_stack_.back() = states::string;
- break;
- case 'b':
- string_buffer_.push_back('\b');
- state_stack_.back() = states::string;
- break;
- case 'f':
- string_buffer_.push_back('\f');
- state_stack_.back() = states::string;
- break;
- case 'n':
- string_buffer_.push_back('\n');
- state_stack_.back() = states::string;
- break;
- case 'r':
- string_buffer_.push_back('\r');
- state_stack_.back() = states::string;
- break;
- case 't':
- string_buffer_.push_back('\t');
- state_stack_.back() = states::string;
- break;
- case 'u':
- cp_ = 0;
- state_stack_.back() = states::u1;
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::illegal_escaped_character, json_error_category()), *this);
- break;
- }
- }
-
- void end_string_value(const CharT* s, size_t length)
- {
- switch (stack_[top_])
- {
- case modes::object_member_name:
- handler_->name(s, length, *this);
- state_stack_.back() = states::expect_colon;
- break;
- case modes::array_element:
- case modes::object_member_value:
- handler_->value(s, length, *this);
- state_stack_.back() = states::expect_comma_or_end;
- break;
- case modes::start:
- handler_->value(s, length, *this);
- flip(modes::start,modes::done);
- state_stack_.back() = states::done;
- handler_->end_json();
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- break;
- }
- }
-
- void begin_member_or_element()
- {
- switch (stack_[top_])
- {
- case modes::object_member_value:
- // A comma causes a flip from object_member_value modes to object_member_name modes.
- flip(modes::object_member_value, modes::object_member_name);
- state_stack_.back() = states::expect_member_name;
- break;
- case modes::array_element:
- state_stack_.back() = states::expect_value;
- break;
- case modes::done:
- break;
- default:
- err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this);
- break;
- }
- }
-
- void begin_member_value()
- {
- flip(modes::object_member_name, modes::object_member_value);
- state_stack_.back() = states::expect_value;
- }
-
- uint32_t append_to_codepoint(uint32_t cp, int c)
- {
- cp *= 16;
- if (c >= '0' && c <= '9')
- {
- cp += c - '0';
- }
- else if (c >= 'a' && c <= 'f')
- {
- cp += c - 'a' + 10;
- }
- else if (c >= 'A' && c <= 'F')
- {
- cp += c - 'A' + 10;
- }
- else
- {
- err_handler_->error(std::error_code(json_parser_errc::invalid_hex_escape_sequence, json_error_category()), *this);
- }
- return cp;
- }
-
- size_t do_line_number() const override
- {
- return line_;
- }
-
- size_t do_column_number() const override
- {
- return column_;
- }
-
- CharT do_current_char() const override
- {
- return p_ < end_input_? *p_ : 0;
- }
-
- bool push(modes mode)
- {
- ++top_;
- if (top_ >= depth_)
- {
- if (top_ >= max_depth_)
- {
- return false;
- }
- depth_ *= 2;
- stack_.resize(depth_);
- }
- stack_[top_] = mode;
- return true;
- }
-
- modes peek()
- {
- return stack_[top_];
- }
-
- bool peek(modes mode)
- {
- return stack_[top_] == mode;
- }
-
- void flip(modes mode1, modes mode2)
- {
- JSONCONS_ASSERT((top_ >= 0) && (stack_[top_] == mode1))
- stack_[top_] = mode2;
- }
-
- bool pop(modes mode)
- {
- if (top_ < 0 || stack_[top_] != mode)
- {
- return false;
- }
- --top_;
- return true;
- }
-};
-
-typedef basic_json_parser<char> json_parser;
-typedef basic_json_parser<wchar_t> wjson_parser;
-
-}
-
-#endif
-