5 const uint8_t nbytes[] = {
6 /* 0xC0-0xC3 */ 0, 0, 0, 0,
7 /* 0xC4-0xC6 fbin8-fbin32 */ 2, 3, 5,
8 /* 0xC7-0xC9 fext */ 0, 0, 0,
10 /* 0xCB ffloat64 */ 9,
11 /* 0xCC-0xD3 ints */ 2, 3, 5, 9, 2, 3, 5, 9,
12 /* 0xD4-0xD8 ffixext */ 0, 0, 0, 0, 0,
13 /* 0xD9-0xDB fstr8-fstr32 */ 2, 3, 5,
14 /* 0xDC-0xDD farray16-farray32 */ 3, 5,
15 /* 0xDE-0xDF fmap16-fmap32 */ 3, 5
19 const uint8_t* streaming_parser::consume(const uint8_t* first,
28 if (state_ == st_partial || state_ == st_string) {
30 if (state_ == st_partial)
31 nneed = nbytes[str_.udata()[0] - 0xC0];
33 nneed = stack_.back().size;
35 if (last - first < nneed - str_.length())
38 next = first + (nneed - str_.length());
39 str_.append(first, next);
40 if (str_.length() != nneed)
43 if (state_ == st_string) {
45 jx = stack_.empty() ? &json_ : stack_.back().jp;
50 consume(str_.ubegin(), str_.uend(), str_);
51 if (state_ != st_normal)
56 while (first != last) {
57 jx = stack_.empty() ? &json_ : stack_.back().jp;
59 if (format::is_fixint(*first)) {
60 *jx = int(int8_t(*first));
62 } else if (*first == format::fnull) {
65 } else if (format::is_bool(*first)) {
66 *jx = bool(*first - format::ffalse);
68 } else if (format::is_fixmap(*first)) {
69 n = *first - format::ffixmap;
75 *jx = Json::make_object();
76 } else if (format::is_fixarray(*first)) {
77 n = *first - format::ffixarray;
81 *jx = Json::make_array_reserve(n);
83 } else if (format::is_fixstr(*first)) {
84 n = *first - format::ffixstr;
87 if (last - first < n) {
88 str_ = String(first, last);
89 stack_.push_back(selem{0, n});
93 if (first < str.ubegin() || first + n >= str.uend())
94 *jx = String(first, n);
96 const char* s = reinterpret_cast<const char*>(first);
97 *jx = str.fast_substring(s, s + n);
101 uint8_t type = *first - format::fnull;
104 if (last - first < nbytes[type]) {
105 str_ = String(first, last);
109 first += nbytes[type];
111 case format::ffloat32 - format::fnull:
112 *jx = read_in_net_order<float>(first - 4);
114 case format::ffloat64 - format::fnull:
115 *jx = read_in_net_order<double>(first - 8);
117 case format::fuint8 - format::fnull:
118 *jx = int(first[-1]);
120 case format::fuint16 - format::fnull:
121 *jx = read_in_net_order<uint16_t>(first - 2);
123 case format::fuint32 - format::fnull:
124 *jx = read_in_net_order<uint32_t>(first - 4);
126 case format::fuint64 - format::fnull:
127 *jx = read_in_net_order<uint64_t>(first - 8);
129 case format::fint8 - format::fnull:
130 *jx = int8_t(first[-1]);
132 case format::fint16 - format::fnull:
133 *jx = read_in_net_order<int16_t>(first - 2);
135 case format::fint32 - format::fnull:
136 *jx = read_in_net_order<int32_t>(first - 4);
138 case format::fint64 - format::fnull:
139 *jx = read_in_net_order<int64_t>(first - 8);
141 case format::fbin8 - format::fnull:
142 case format::fstr8 - format::fnull:
145 case format::fbin16 - format::fnull:
146 case format::fstr16 - format::fnull:
147 n = read_in_net_order<uint16_t>(first - 2);
149 case format::fbin32 - format::fnull:
150 case format::fstr32 - format::fnull:
151 n = read_in_net_order<uint32_t>(first - 4);
153 case format::farray16 - format::fnull:
154 n = read_in_net_order<uint16_t>(first - 2);
156 case format::farray32 - format::fnull:
157 n = read_in_net_order<uint32_t>(first - 4);
159 case format::fmap16 - format::fnull:
160 n = read_in_net_order<uint16_t>(first - 2);
162 case format::fmap32 - format::fnull:
163 n = read_in_net_order<uint32_t>(first - 4);
171 // Reading a key for some object Json
172 if (!jx->is_s() && !jx->is_i())
174 selem* top = &stack_.back();
175 Json* jo = (top == stack_.begin() ? &json_ : top[-1].jp);
176 top->jp = &jo->get_insert(jx->to_s());
180 if (jx->is_a() && n != 0)
181 stack_.push_back(selem{&jx->at_insert(0), n - 1});
182 else if (jx->is_o() && n != 0)
183 stack_.push_back(selem{&jokey_, n - 1});
185 while (!stack_.empty() && stack_.back().size == 0)
187 if (stack_.empty()) {
191 selem* top = &stack_.back();
193 Json* jo = (top == stack_.begin() ? &json_ : top[-1].jp);
209 parser& parser::operator>>(Str& x) {
211 if ((uint32_t) *s_ - format::ffixstr < format::nfixstr) {
212 len = *s_ - format::ffixstr;
214 } else if (*s_ == format::fbin8 || *s_ == format::fstr8) {
217 } else if (*s_ == format::fbin16 || *s_ == format::fstr16) {
218 len = read_in_net_order<uint16_t>(s_ + 1);
221 assert(*s_ == format::fbin32 || *s_ == format::fstr32);
222 len = read_in_net_order<uint32_t>(s_ + 1);
225 x.assign(reinterpret_cast<const char*>(s_), len);
230 parser& parser::operator>>(String& x) {
234 x = str_.substring(s.begin(), s.end());
236 x.assign(s.begin(), s.end());
240 } // namespace msgpack