示例#1
0
	/*!
	 * \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;
}
示例#2
0
/*!
	 * \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;
}