OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fxfa/fm2js/xfa_fmparse.h" | 7 #include "xfa/fxfa/fm2js/xfa_fmparse.h" |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 expressions.push_back(std::move(expr)); | 71 expressions.push_back(std::move(expr)); |
72 } else { | 72 } else { |
73 break; | 73 break; |
74 } | 74 } |
75 } | 75 } |
76 } | 76 } |
77 return expressions; | 77 return expressions; |
78 } | 78 } |
79 | 79 |
80 std::unique_ptr<CXFA_FMExpression> CXFA_FMParse::ParseFunction() { | 80 std::unique_ptr<CXFA_FMExpression> CXFA_FMParse::ParseFunction() { |
81 std::unique_ptr<CXFA_FMExpression> expr; | |
82 CFX_WideStringC ident; | 81 CFX_WideStringC ident; |
83 std::unique_ptr<CFX_WideStringCArray> pArguments; | 82 std::vector<CFX_WideStringC> arguments; |
84 std::vector<std::unique_ptr<CXFA_FMExpression>> expressions; | 83 std::vector<std::unique_ptr<CXFA_FMExpression>> expressions; |
85 uint32_t line = m_pToken->m_uLinenum; | 84 uint32_t line = m_pToken->m_uLinenum; |
86 NextToken(); | 85 NextToken(); |
87 if (m_pToken->m_type != TOKidentifier) { | 86 if (m_pToken->m_type != TOKidentifier) { |
88 CFX_WideString ws_TempString(m_pToken->m_wstring); | 87 CFX_WideString ws_TempString(m_pToken->m_wstring); |
89 Error(m_pToken->m_uLinenum, kFMErrExpectedIdentifier, | 88 Error(m_pToken->m_uLinenum, kFMErrExpectedIdentifier, |
90 ws_TempString.c_str()); | 89 ws_TempString.c_str()); |
91 } else { | 90 } else { |
92 ident = m_pToken->m_wstring; | 91 ident = m_pToken->m_wstring; |
93 NextToken(); | 92 NextToken(); |
94 } | 93 } |
95 Check(TOKlparen); | 94 Check(TOKlparen); |
96 if (m_pToken->m_type == TOKrparen) { | 95 if (m_pToken->m_type == TOKrparen) { |
97 NextToken(); | 96 NextToken(); |
98 } else { | 97 } else { |
99 pArguments = pdfium::MakeUnique<CFX_WideStringCArray>(); | |
100 CFX_WideStringC p; | |
101 while (1) { | 98 while (1) { |
102 if (m_pToken->m_type == TOKidentifier) { | 99 if (m_pToken->m_type == TOKidentifier) { |
103 p = m_pToken->m_wstring; | 100 arguments.push_back(m_pToken->m_wstring); |
104 pArguments->Add(p); | |
105 NextToken(); | 101 NextToken(); |
106 if (m_pToken->m_type == TOKcomma) { | 102 if (m_pToken->m_type == TOKcomma) { |
107 NextToken(); | 103 NextToken(); |
108 continue; | 104 continue; |
109 } else if (m_pToken->m_type == TOKrparen) { | 105 } else if (m_pToken->m_type == TOKrparen) { |
110 NextToken(); | 106 NextToken(); |
111 break; | 107 break; |
112 } else { | 108 } else { |
113 Check(TOKrparen); | 109 Check(TOKrparen); |
114 break; | 110 break; |
115 } | 111 } |
116 } else { | 112 } else { |
117 CFX_WideString ws_TempString(m_pToken->m_wstring); | 113 CFX_WideString ws_TempString(m_pToken->m_wstring); |
118 Error(m_pToken->m_uLinenum, kFMErrExpectedIdentifier, | 114 Error(m_pToken->m_uLinenum, kFMErrExpectedIdentifier, |
119 ws_TempString.c_str()); | 115 ws_TempString.c_str()); |
120 NextToken(); | 116 NextToken(); |
121 break; | 117 break; |
122 } | 118 } |
123 } | 119 } |
124 } | 120 } |
125 Check(TOKdo); | 121 Check(TOKdo); |
126 if (m_pToken->m_type == TOKendfunc) { | 122 if (m_pToken->m_type == TOKendfunc) { |
127 NextToken(); | 123 NextToken(); |
128 } else { | 124 } else { |
129 expressions = ParseTopExpression(); | 125 expressions = ParseTopExpression(); |
130 Check(TOKendfunc); | 126 Check(TOKendfunc); |
131 } | 127 } |
132 if (m_pErrorInfo->message.IsEmpty()) { | 128 if (!m_pErrorInfo->message.IsEmpty()) |
133 expr = pdfium::MakeUnique<CXFA_FMFunctionDefinition>( | 129 return nullptr; |
134 line, false, ident, std::move(pArguments), std::move(expressions)); | 130 |
135 } else if (pArguments) { | 131 return pdfium::MakeUnique<CXFA_FMFunctionDefinition>( |
136 pArguments->RemoveAll(); | 132 line, false, ident, std::move(arguments), std::move(expressions)); |
137 } | |
138 return expr; | |
139 } | 133 } |
140 | 134 |
141 std::unique_ptr<CXFA_FMExpression> CXFA_FMParse::ParseExpression() { | 135 std::unique_ptr<CXFA_FMExpression> CXFA_FMParse::ParseExpression() { |
142 std::unique_ptr<CXFA_FMExpression> expr; | 136 std::unique_ptr<CXFA_FMExpression> expr; |
143 uint32_t line = m_pToken->m_uLinenum; | 137 uint32_t line = m_pToken->m_uLinenum; |
144 switch (m_pToken->m_type) { | 138 switch (m_pToken->m_type) { |
145 case TOKvar: | 139 case TOKvar: |
146 expr = ParseVarExpression(); | 140 expr = ParseVarExpression(); |
147 break; | 141 break; |
148 case TOKnull: | 142 case TOKnull: |
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1019 std::unique_ptr<CXFA_FMExpression> CXFA_FMParse::ParseDoExpression() { | 1013 std::unique_ptr<CXFA_FMExpression> CXFA_FMParse::ParseDoExpression() { |
1020 uint32_t line = m_pToken->m_uLinenum; | 1014 uint32_t line = m_pToken->m_uLinenum; |
1021 NextToken(); | 1015 NextToken(); |
1022 std::unique_ptr<CXFA_FMExpression> expr = ParseBlockExpression(); | 1016 std::unique_ptr<CXFA_FMExpression> expr = ParseBlockExpression(); |
1023 Check(TOKend); | 1017 Check(TOKend); |
1024 if (!m_pErrorInfo->message.IsEmpty()) | 1018 if (!m_pErrorInfo->message.IsEmpty()) |
1025 return nullptr; | 1019 return nullptr; |
1026 | 1020 |
1027 return pdfium::MakeUnique<CXFA_FMDoExpression>(line, std::move(expr)); | 1021 return pdfium::MakeUnique<CXFA_FMDoExpression>(line, std::move(expr)); |
1028 } | 1022 } |
OLD | NEW |