/*! * \brief Reads an array from the input stream into \p rv */ bool parser_UTF8::readarray(JSON::value &rv){ rv.setarray(); if (*bfr.ptr != '[') return false; ++bfr.ptr; bool first=true; while (1){ JSON::value curval; skipWS(); if (bfr.ptr >= bfr.end){ adderror(5); return false; } if (*bfr.ptr == ']'){ ++bfr.ptr; return true; }else if (*bfr.ptr != ','){ if (first!=true){adderror(8);} }else{ ++bfr.ptr; skipWS(); if (bfr.ptr >= bfr.end){ adderror(5); return false; } if (*bfr.ptr == ']'){ ++bfr.ptr; return true; } } skipWS(); if (bfr.ptr == bfr.end){ adderror(5); return false; } getvalue(curval); if (curval.getdatatype() == datatype::_undefined && *(bfr.ptr)!=','){ adderror(8); return false; } rv.addvalue(curval); first=false; } return true; }
/*! * \brief Reads an object from the input stream into \p rv */ bool parser_UTF8::readobject(JSON::value &rv){ rv.setobject(); if (*bfr.ptr != '{') return false; ++bfr.ptr; bool first=true; while (1){ astr curname; JSON::value curval; skipWS(); if (bfr.ptr >= bfr.end){ adderror(5); return false; } if (*bfr.ptr == '}'){ ++bfr.ptr; return true; }else if (*bfr.ptr != ','){ if (first!=true){adderror(8);} }else{ ++bfr.ptr; skipWS(); if (bfr.ptr >= bfr.end){ adderror(5); return false; } if (*bfr.ptr == '}'){ ++bfr.ptr; return true; } } if (*bfr.ptr == ':'){ adderror(6); createrandomname(curname); }else if (*bfr.ptr == '"'){ readstring(curname); if (bfr.ptr == bfr.end){ adderror(5); return false; } }else{ readunquotedstring(curname); //adderror(11); // While this is _technically_ an error, we don't want people to fail because of it if (bfr.ptr == bfr.end){ adderror(5); return false; } } if (curname == A("")){ adderror(7); createrandomname(curname); } skipWS(); if (bfr.ptr == bfr.end){ adderror(5); return false; } if (*bfr.ptr != ':'){ adderror(6); if (*bfr.ptr == '}'){ //this should allow recovery in some situations. ++bfr.ptr; } return false; } ++bfr.ptr; skipWS(); if (bfr.ptr == bfr.end){ adderror(5); return false; } getvalue(curval); rv.addvalue(curname.c_str(),curval); first=false; } return true; }