File: Custom-IterativeReader.patch

package info (click to toggle)
rlottie 0.1%2Bdfsg-4.3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,948 kB
  • sloc: cpp: 20,376; asm: 221; ansic: 194; makefile: 16
file content (106 lines) | stat: -rw-r--r-- 3,304 bytes parent folder | download | duplicates (4)
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;
     }