@@ -177,9 +177,9 @@ struct JHandler : public BaseReaderHandler<UTF8<>, JHandler> {
177177 vector<vector<JNode>> _nodes{1 };
178178 str _key;
179179 JNode* _root;
180- JHandler (const char * text, bool text_ownership ) {
180+ JHandler (const char * text) {
181181 assert (_nodes.size () == 1 );
182- _root = new JNode (text, text_ownership );
182+ _root = new JNode (text, false );
183183 }
184184 ~JHandler () {
185185 delete _root;
@@ -277,15 +277,26 @@ static bool fix_trail(estring_view text, char header, char trailer) {
277277}
278278
279279static NodeImpl* parse_json (char * text, size_t size, int flags) {
280+ // without kParseStopWhenDoneFlag, rapidjson will expect the last character of
281+ // the JSON string to be '\0'.
280282 const auto kFlags = kParseNumbersAsStringsFlag | kParseBoolsAsStringFlag |
281- kParseInsituFlag | kParseCommentsFlag | kParseTrailingCommasFlag ;
283+ kParseInsituFlag | kParseCommentsFlag |
284+ kParseTrailingCommasFlag | kParseStopWhenDoneFlag ;
282285 if (!fix_trail ({text, size}, ' {' , ' }' )) return nullptr ;
283- JHandler h (text, flags & DOC_FREE_TEXT_ON_DESTRUCTION );
286+ JHandler h (text);
284287 using Encoding = UTF8 <>;
285288 GenericInsituStringStream<Encoding> s (text);
286289 GenericReader<Encoding, Encoding> reader;
287- reader.Parse <kFlags >(s, h);
288- return h.get_root ();
290+ auto res = reader.Parse <kFlags >(s, h);
291+ if (!res) {
292+ LOG_ERROR (" json parsing failed with error ` at `, origin size `" ,
293+ res.Code (), res.Offset (), size);
294+ return nullptr ;
295+ }
296+ auto root = h.get_root ();
297+ if (flags & DOC_FREE_TEXT_ON_DESTRUCTION )
298+ root->_flags |= NodeImpl::FLAG_TEXT_OWNERSHIP ;
299+ return root;
289300}
290301
291302using namespace rapidxml ;
@@ -359,6 +370,12 @@ class YAMLNode : public DocNode<YAMLNode> {
359370};
360371
361372static NodeImpl* parse_yaml (char * text, size_t size, int flags) {
373+ ryml::s_default_callbacks.m_error = [](const char * msg, size_t msg_len,
374+ ryml::Location location,
375+ void * user_data) {
376+ LOG_ERROR (" yaml parsing failed with `" , std::string_view (msg, msg_len));
377+ throw std::runtime_error (" yaml parsing failed" );
378+ };
362379 auto yaml = ryml::parse_in_place ({text, size});
363380 auto root = make_unique<YAMLNode>(text, flags & DOC_FREE_TEXT_ON_DESTRUCTION );
364381 assert (root);
@@ -451,7 +468,7 @@ Node parse(char* text, size_t size, int flags) {
451468 constexpr static Parser parsers[] = {&parse_json, &parse_xml,
452469 &parse_yaml, &parse_ini};
453470 auto i = flags & DOC_TYPE_MASK ;
454- if ((size_t ) i > LEN (parsers)) {
471+ if ((size_t ) i >= LEN (parsers)) {
455472 if (flags & DOC_FREE_TEXT_IF_PARSING_FAILED ) free (text);
456473 LOG_ERROR_RETURN (EINVAL , nullptr , " invalid document type " , HEX (i));
457474 }
0 commit comments