mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-07 21:23:32 +00:00
lottie/parser: revise logic to handle exceptional cases more gracefully
- prioritize valid (positive) cases first - continue parsing even when encountering parsing errors Co-Authored-By: Mira Grudzinska <mira@lottiefiles.com>
This commit is contained in:
parent
ae84708f9b
commit
57adfbd499
2 changed files with 41 additions and 50 deletions
|
@ -46,13 +46,6 @@
|
||||||
#include "tvgLottieParserHandler.h"
|
#include "tvgLottieParserHandler.h"
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* Internal Class Implementation */
|
|
||||||
/************************************************************************/
|
|
||||||
|
|
||||||
static const int PARSE_FLAGS = kParseDefaultFlags | kParseInsituFlag;
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
/* External Class Implementation */
|
/* External Class Implementation */
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
@ -60,12 +53,12 @@ static const int PARSE_FLAGS = kParseDefaultFlags | kParseInsituFlag;
|
||||||
|
|
||||||
bool LookaheadParserHandler::enterArray()
|
bool LookaheadParserHandler::enterArray()
|
||||||
{
|
{
|
||||||
if (state != kEnteringArray) {
|
if (state == kEnteringArray) {
|
||||||
Error();
|
parseNext();
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
parseNext();
|
Error();
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,37 +80,37 @@ bool LookaheadParserHandler::nextArrayValue()
|
||||||
|
|
||||||
int LookaheadParserHandler::getInt()
|
int LookaheadParserHandler::getInt()
|
||||||
{
|
{
|
||||||
if (state != kHasNumber) {
|
if (state == kHasNumber) {
|
||||||
Error();
|
auto result = val.GetInt();
|
||||||
return 0;
|
parseNext();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
auto result = val.GetInt();
|
Error();
|
||||||
parseNext();
|
return 0;
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float LookaheadParserHandler::getFloat()
|
float LookaheadParserHandler::getFloat()
|
||||||
{
|
{
|
||||||
if (state != kHasNumber) {
|
if (state == kHasNumber) {
|
||||||
Error();
|
auto result = val.GetFloat();
|
||||||
return 0;
|
parseNext();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
auto result = val.GetFloat();
|
Error();
|
||||||
parseNext();
|
return 0;
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char* LookaheadParserHandler::getString()
|
const char* LookaheadParserHandler::getString()
|
||||||
{
|
{
|
||||||
if (state != kHasString) {
|
if (state == kHasString) {
|
||||||
Error();
|
auto result = val.GetString();
|
||||||
return nullptr;
|
parseNext();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
auto result = val.GetString();
|
Error();
|
||||||
parseNext();
|
return nullptr;
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -131,33 +124,29 @@ char* LookaheadParserHandler::getStringCopy()
|
||||||
|
|
||||||
bool LookaheadParserHandler::getBool()
|
bool LookaheadParserHandler::getBool()
|
||||||
{
|
{
|
||||||
if (state != kHasBool) {
|
if (state == kHasBool) {
|
||||||
Error();
|
auto result = val.GetBool();
|
||||||
return false;
|
parseNext();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
auto result = val.GetBool();
|
Error();
|
||||||
parseNext();
|
return false;
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LookaheadParserHandler::getNull()
|
void LookaheadParserHandler::getNull()
|
||||||
{
|
{
|
||||||
if (state != kHasNull) {
|
if (state == kHasNull) {
|
||||||
Error();
|
parseNext();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
parseNext();
|
Error();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LookaheadParserHandler::parseNext()
|
bool LookaheadParserHandler::parseNext()
|
||||||
{
|
{
|
||||||
if (reader.HasParseError()) {
|
if (reader.HasParseError() || !reader.IterativeParseNext<PARSE_FLAGS>(iss, *this)) {
|
||||||
Error();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!reader.IterativeParseNext<PARSE_FLAGS>(iss, *this)) {
|
|
||||||
Error();
|
Error();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -167,12 +156,12 @@ bool LookaheadParserHandler::parseNext()
|
||||||
|
|
||||||
bool LookaheadParserHandler::enterObject()
|
bool LookaheadParserHandler::enterObject()
|
||||||
{
|
{
|
||||||
if (state != kEnteringObject) {
|
if (state == kEnteringObject) {
|
||||||
Error();
|
parseNext();
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
parseNext();
|
Error();
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
|
|
||||||
using namespace rapidjson;
|
using namespace rapidjson;
|
||||||
|
|
||||||
|
#define PARSE_FLAGS (kParseDefaultFlags | kParseInsituFlag)
|
||||||
|
|
||||||
struct LookaheadParserHandler
|
struct LookaheadParserHandler
|
||||||
{
|
{
|
||||||
|
@ -172,8 +173,9 @@ struct LookaheadParserHandler
|
||||||
|
|
||||||
void Error()
|
void Error()
|
||||||
{
|
{
|
||||||
TVGERR("LOTTIE", "Parsing Error!");
|
TVGERR("LOTTIE", "Invalid JSON: unexpected or misaligned data fields.");
|
||||||
state = kError;
|
state = kError;
|
||||||
|
reader.IterativeParseNext<PARSE_FLAGS>(iss, *this); //something wrong but try advancement.
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Invalid()
|
bool Invalid()
|
||||||
|
|
Loading…
Add table
Reference in a new issue