1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
Description: Reimplement IterativeParseInit and IterativeParseNext
In order to use the old rapidjson v1.1.0, we have to implement IterativeReader
class by ourselves.
Author: Nicholas Guriev <guriev-ns@ya.ru>
Last-Update: Sun, 21 Jul 2019 21:31:05 +0300
--- a/src/lottie/lottieparser.cpp
+++ b/src/lottie/lottieparser.cpp
@@ -54,13 +54,75 @@
#include <array>
#include "lottiemodel.h"
+
+#define private protected
#include "rapidjson/document.h"
+#undef private
RAPIDJSON_DIAG_PUSH
#ifdef __GNUC__
RAPIDJSON_DIAG_OFF(effc++)
#endif
+namespace {
+
+class IterativeReader : public rapidjson::Reader {
+public:
+ void IterativeParseInit() {
+ SetParseError(rapidjson::kParseErrorNone, 0);
+ mCurrentState = IterativeParsingStartState;
+ }
+
+ template <unsigned parseFlags, typename InputStream, typename Handler>
+ bool IterativeParseNext(InputStream &input, Handler &handler) {
+ while (input.Peek() != '\0') {
+ SkipWhitespace(input);
+
+ Token token = Tokenize(input.Peek());
+ IterativeParsingState nextState = Predict(mCurrentState, token);
+ if (nextState == IterativeParsingErrorState) {
+ HandleError(mCurrentState, input);
+ return false;
+ }
+
+ mCurrentState = Transit<parseFlags>(mCurrentState, token, nextState,
+ input, handler);
+ if (mCurrentState == IterativeParsingFinishState) {
+ SkipWhitespace(input);
+ if (input.Peek() != '\0') {
+ HandleError(mCurrentState, input);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ if (nextState != IterativeParsingElementDelimiterState
+ && nextState != IterativeParsingMemberDelimiterState
+ && nextState != IterativeParsingKeyValueDelimiterState) {
+ return true;
+ }
+ }
+
+ ClearStack();
+ if (mCurrentState != IterativeParsingFinishState) {
+ HandleError(mCurrentState, input);
+ return false;
+ }
+ return true;
+ }
+
+ bool IterativeParseComplete() const {
+ return mCurrentState == IterativeParsingErrorState
+ || mCurrentState == IterativeParsingFinishState;
+ }
+
+private:
+ IterativeParsingState mCurrentState = IterativeParsingStartState;
+};
+
+} // namespace
+
using namespace rapidjson;
class LookaheadParserHandler {
@@ -161,7 +223,7 @@ protected:
Value v_;
LookaheadParsingState st_;
- Reader r_;
+ IterativeReader r_;
InsituStringStream ss_;
static const int parseFlags = kParseDefaultFlags | kParseInsituFlag;
@@ -344,9 +406,9 @@ const char *LottieParserImpl::NextObject
* so ignore those and don't put parser in the error state.
* */
if (st_ == kExitingArray || st_ == kEnteringObject) {
- // #ifdef DEBUG_PARSER
- // vDebug<<"Object: Exiting nested loop";
- // #endif
+ #ifdef DEBUG_PARSER
+ vDebug << "Object: Exiting nested loop";
+ #endif
return nullptr;
}
|