| 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/fde/xml/fde_xml_imp.h" | 7 #include "xfa/fde/xml/fde_xml_imp.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 FX_STRSIZE iFind = m_wsTag.Find(L':', 0); | 674 FX_STRSIZE iFind = m_wsTag.Find(L':', 0); |
| 675 if (iFind < 0) { | 675 if (iFind < 0) { |
| 676 wsTag = m_wsTag; | 676 wsTag = m_wsTag; |
| 677 } else { | 677 } else { |
| 678 wsTag = m_wsTag.Right(m_wsTag.GetLength() - iFind - 1); | 678 wsTag = m_wsTag.Right(m_wsTag.GetLength() - iFind - 1); |
| 679 } | 679 } |
| 680 } | 680 } |
| 681 void CFDE_XMLElement::GetNamespacePrefix(CFX_WideString& wsPrefix) const { | 681 void CFDE_XMLElement::GetNamespacePrefix(CFX_WideString& wsPrefix) const { |
| 682 FX_STRSIZE iFind = m_wsTag.Find(L':', 0); | 682 FX_STRSIZE iFind = m_wsTag.Find(L':', 0); |
| 683 if (iFind < 0) { | 683 if (iFind < 0) { |
| 684 wsPrefix.Empty(); | 684 wsPrefix.clear(); |
| 685 } else { | 685 } else { |
| 686 wsPrefix = m_wsTag.Left(iFind); | 686 wsPrefix = m_wsTag.Left(iFind); |
| 687 } | 687 } |
| 688 } | 688 } |
| 689 void CFDE_XMLElement::GetNamespaceURI(CFX_WideString& wsNamespace) const { | 689 void CFDE_XMLElement::GetNamespaceURI(CFX_WideString& wsNamespace) const { |
| 690 CFX_WideString wsAttri(L"xmlns"), wsPrefix; | 690 CFX_WideString wsAttri(L"xmlns"), wsPrefix; |
| 691 GetNamespacePrefix(wsPrefix); | 691 GetNamespacePrefix(wsPrefix); |
| 692 if (wsPrefix.GetLength() > 0) { | 692 if (wsPrefix.GetLength() > 0) { |
| 693 wsAttri += L":"; | 693 wsAttri += L":"; |
| 694 wsAttri += wsPrefix; | 694 wsAttri += wsPrefix; |
| 695 } | 695 } |
| 696 wsNamespace.Empty(); | 696 wsNamespace.clear(); |
| 697 CFDE_XMLNode* pNode = (CFDE_XMLNode*)this; | 697 CFDE_XMLNode* pNode = (CFDE_XMLNode*)this; |
| 698 while (pNode != NULL) { | 698 while (pNode != NULL) { |
| 699 if (pNode->GetType() != FDE_XMLNODE_Element) { | 699 if (pNode->GetType() != FDE_XMLNODE_Element) { |
| 700 break; | 700 break; |
| 701 } | 701 } |
| 702 CFDE_XMLElement* pElement = (CFDE_XMLElement*)pNode; | 702 CFDE_XMLElement* pElement = (CFDE_XMLElement*)pNode; |
| 703 if (!pElement->HasAttribute(wsAttri.c_str())) { | 703 if (!pElement->HasAttribute(wsAttri.c_str())) { |
| 704 pNode = pNode->GetNodeItem(CFDE_XMLNode::Parent); | 704 pNode = pNode->GetNodeItem(CFDE_XMLNode::Parent); |
| 705 continue; | 705 continue; |
| 706 } | 706 } |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1079 : m_pParser(pParser), | 1079 : m_pParser(pParser), |
| 1080 m_pParent(pRoot), | 1080 m_pParent(pRoot), |
| 1081 m_pChild(NULL), | 1081 m_pChild(NULL), |
| 1082 m_NodeStack(16), | 1082 m_NodeStack(16), |
| 1083 m_ws1(), | 1083 m_ws1(), |
| 1084 m_ws2() { | 1084 m_ws2() { |
| 1085 m_NodeStack.Push(m_pParent); | 1085 m_NodeStack.Push(m_pParent); |
| 1086 } | 1086 } |
| 1087 CFDE_XMLDOMParser::~CFDE_XMLDOMParser() { | 1087 CFDE_XMLDOMParser::~CFDE_XMLDOMParser() { |
| 1088 m_NodeStack.RemoveAll(); | 1088 m_NodeStack.RemoveAll(); |
| 1089 m_ws1.Empty(); | 1089 m_ws1.clear(); |
| 1090 m_ws2.Empty(); | 1090 m_ws2.clear(); |
| 1091 } | 1091 } |
| 1092 | 1092 |
| 1093 int32_t CFDE_XMLDOMParser::DoParser(IFX_Pause* pPause) { | 1093 int32_t CFDE_XMLDOMParser::DoParser(IFX_Pause* pPause) { |
| 1094 FDE_XmlSyntaxResult syntaxParserResult; | 1094 FDE_XmlSyntaxResult syntaxParserResult; |
| 1095 int32_t iCount = 0; | 1095 int32_t iCount = 0; |
| 1096 while (TRUE) { | 1096 while (TRUE) { |
| 1097 syntaxParserResult = m_pParser->DoSyntaxParse(); | 1097 syntaxParserResult = m_pParser->DoSyntaxParse(); |
| 1098 switch (syntaxParserResult) { | 1098 switch (syntaxParserResult) { |
| 1099 case FDE_XmlSyntaxResult::InstructionOpen: | 1099 case FDE_XmlSyntaxResult::InstructionOpen: |
| 1100 break; | 1100 break; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1125 break; | 1125 break; |
| 1126 } | 1126 } |
| 1127 m_pParent = (CFDE_XMLNode*)*m_NodeStack.GetTopElement(); | 1127 m_pParent = (CFDE_XMLNode*)*m_NodeStack.GetTopElement(); |
| 1128 m_pChild = m_pParent; | 1128 m_pChild = m_pParent; |
| 1129 iCount++; | 1129 iCount++; |
| 1130 break; | 1130 break; |
| 1131 case FDE_XmlSyntaxResult::TargetName: | 1131 case FDE_XmlSyntaxResult::TargetName: |
| 1132 m_pParser->GetTargetName(m_ws1); | 1132 m_pParser->GetTargetName(m_ws1); |
| 1133 m_pChild = new CFDE_XMLInstruction(m_ws1); | 1133 m_pChild = new CFDE_XMLInstruction(m_ws1); |
| 1134 m_pParent->InsertChildNode(m_pChild); | 1134 m_pParent->InsertChildNode(m_pChild); |
| 1135 m_ws1.Empty(); | 1135 m_ws1.clear(); |
| 1136 break; | 1136 break; |
| 1137 case FDE_XmlSyntaxResult::TagName: | 1137 case FDE_XmlSyntaxResult::TagName: |
| 1138 m_pParser->GetTagName(m_ws1); | 1138 m_pParser->GetTagName(m_ws1); |
| 1139 m_pChild = new CFDE_XMLElement(m_ws1); | 1139 m_pChild = new CFDE_XMLElement(m_ws1); |
| 1140 m_pParent->InsertChildNode(m_pChild); | 1140 m_pParent->InsertChildNode(m_pChild); |
| 1141 m_NodeStack.Push(m_pChild); | 1141 m_NodeStack.Push(m_pChild); |
| 1142 m_pParent = m_pChild; | 1142 m_pParent = m_pChild; |
| 1143 break; | 1143 break; |
| 1144 case FDE_XmlSyntaxResult::AttriName: | 1144 case FDE_XmlSyntaxResult::AttriName: |
| 1145 m_pParser->GetAttributeName(m_ws1); | 1145 m_pParser->GetAttributeName(m_ws1); |
| 1146 break; | 1146 break; |
| 1147 case FDE_XmlSyntaxResult::AttriValue: | 1147 case FDE_XmlSyntaxResult::AttriValue: |
| 1148 if (m_pChild == NULL) { | 1148 if (m_pChild == NULL) { |
| 1149 syntaxParserResult = FDE_XmlSyntaxResult::Error; | 1149 syntaxParserResult = FDE_XmlSyntaxResult::Error; |
| 1150 break; | 1150 break; |
| 1151 } | 1151 } |
| 1152 m_pParser->GetAttributeName(m_ws2); | 1152 m_pParser->GetAttributeName(m_ws2); |
| 1153 if (m_pChild->GetType() == FDE_XMLNODE_Element) { | 1153 if (m_pChild->GetType() == FDE_XMLNODE_Element) { |
| 1154 ((CFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2); | 1154 ((CFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2); |
| 1155 } else if (m_pChild->GetType() == FDE_XMLNODE_Instruction) { | 1155 } else if (m_pChild->GetType() == FDE_XMLNODE_Instruction) { |
| 1156 ((CFDE_XMLInstruction*)m_pChild)->SetString(m_ws1, m_ws2); | 1156 ((CFDE_XMLInstruction*)m_pChild)->SetString(m_ws1, m_ws2); |
| 1157 } | 1157 } |
| 1158 m_ws1.Empty(); | 1158 m_ws1.clear(); |
| 1159 break; | 1159 break; |
| 1160 case FDE_XmlSyntaxResult::Text: | 1160 case FDE_XmlSyntaxResult::Text: |
| 1161 m_pParser->GetTextData(m_ws1); | 1161 m_pParser->GetTextData(m_ws1); |
| 1162 m_pChild = new CFDE_XMLText(m_ws1); | 1162 m_pChild = new CFDE_XMLText(m_ws1); |
| 1163 m_pParent->InsertChildNode(m_pChild); | 1163 m_pParent->InsertChildNode(m_pChild); |
| 1164 m_pChild = m_pParent; | 1164 m_pChild = m_pParent; |
| 1165 break; | 1165 break; |
| 1166 case FDE_XmlSyntaxResult::CData: | 1166 case FDE_XmlSyntaxResult::CData: |
| 1167 m_pParser->GetTextData(m_ws1); | 1167 m_pParser->GetTextData(m_ws1); |
| 1168 m_pChild = new CFDE_XMLCharData(m_ws1); | 1168 m_pChild = new CFDE_XMLCharData(m_ws1); |
| 1169 m_pParent->InsertChildNode(m_pChild); | 1169 m_pParent->InsertChildNode(m_pChild); |
| 1170 m_pChild = m_pParent; | 1170 m_pChild = m_pParent; |
| 1171 break; | 1171 break; |
| 1172 case FDE_XmlSyntaxResult::TargetData: | 1172 case FDE_XmlSyntaxResult::TargetData: |
| 1173 if (m_pChild == NULL || | 1173 if (m_pChild == NULL || |
| 1174 m_pChild->GetType() != FDE_XMLNODE_Instruction) { | 1174 m_pChild->GetType() != FDE_XMLNODE_Instruction) { |
| 1175 syntaxParserResult = FDE_XmlSyntaxResult::Error; | 1175 syntaxParserResult = FDE_XmlSyntaxResult::Error; |
| 1176 break; | 1176 break; |
| 1177 } | 1177 } |
| 1178 if (!m_ws1.IsEmpty()) { | 1178 if (!m_ws1.IsEmpty()) { |
| 1179 ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); | 1179 ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); |
| 1180 } | 1180 } |
| 1181 m_pParser->GetTargetData(m_ws1); | 1181 m_pParser->GetTargetData(m_ws1); |
| 1182 ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); | 1182 ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); |
| 1183 m_ws1.Empty(); | 1183 m_ws1.clear(); |
| 1184 break; | 1184 break; |
| 1185 default: | 1185 default: |
| 1186 break; | 1186 break; |
| 1187 } | 1187 } |
| 1188 if (syntaxParserResult == FDE_XmlSyntaxResult::Error || | 1188 if (syntaxParserResult == FDE_XmlSyntaxResult::Error || |
| 1189 syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { | 1189 syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { |
| 1190 break; | 1190 break; |
| 1191 } | 1191 } |
| 1192 if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { | 1192 if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { |
| 1193 break; | 1193 break; |
| 1194 } | 1194 } |
| 1195 } | 1195 } |
| 1196 return m_pParser->GetStatus(); | 1196 return m_pParser->GetStatus(); |
| 1197 } | 1197 } |
| 1198 CFDE_XMLSAXParser::CFDE_XMLSAXParser(FDE_XMLREADERHANDLER* pHandler, | 1198 CFDE_XMLSAXParser::CFDE_XMLSAXParser(FDE_XMLREADERHANDLER* pHandler, |
| 1199 CFDE_XMLSyntaxParser* pParser) | 1199 CFDE_XMLSyntaxParser* pParser) |
| 1200 : m_pHandler(pHandler), | 1200 : m_pHandler(pHandler), |
| 1201 m_pParser(pParser), | 1201 m_pParser(pParser), |
| 1202 m_TagStack(16), | 1202 m_TagStack(16), |
| 1203 m_pTagTop(NULL), | 1203 m_pTagTop(NULL), |
| 1204 m_ws1(), | 1204 m_ws1(), |
| 1205 m_ws2() {} | 1205 m_ws2() {} |
| 1206 CFDE_XMLSAXParser::~CFDE_XMLSAXParser() { | 1206 CFDE_XMLSAXParser::~CFDE_XMLSAXParser() { |
| 1207 m_TagStack.RemoveAll(); | 1207 m_TagStack.RemoveAll(); |
| 1208 m_ws1.Empty(); | 1208 m_ws1.clear(); |
| 1209 m_ws2.Empty(); | 1209 m_ws2.clear(); |
| 1210 } | 1210 } |
| 1211 int32_t CFDE_XMLSAXParser::DoParser(IFX_Pause* pPause) { | 1211 int32_t CFDE_XMLSAXParser::DoParser(IFX_Pause* pPause) { |
| 1212 FDE_XmlSyntaxResult syntaxParserResult; | 1212 FDE_XmlSyntaxResult syntaxParserResult; |
| 1213 int32_t iCount = 0; | 1213 int32_t iCount = 0; |
| 1214 while (TRUE) { | 1214 while (TRUE) { |
| 1215 syntaxParserResult = m_pParser->DoSyntaxParse(); | 1215 syntaxParserResult = m_pParser->DoSyntaxParse(); |
| 1216 switch (syntaxParserResult) { | 1216 switch (syntaxParserResult) { |
| 1217 case FDE_XmlSyntaxResult::ElementBreak: | 1217 case FDE_XmlSyntaxResult::ElementBreak: |
| 1218 if (m_pTagTop == NULL) { | 1218 if (m_pTagTop == NULL) { |
| 1219 syntaxParserResult = FDE_XmlSyntaxResult::Error; | 1219 syntaxParserResult = FDE_XmlSyntaxResult::Error; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1240 iCount++; | 1240 iCount++; |
| 1241 break; | 1241 break; |
| 1242 case FDE_XmlSyntaxResult::TargetName: { | 1242 case FDE_XmlSyntaxResult::TargetName: { |
| 1243 m_pParser->GetTargetName(m_ws1); | 1243 m_pParser->GetTargetName(m_ws1); |
| 1244 CFDE_XMLTAG xmlTag; | 1244 CFDE_XMLTAG xmlTag; |
| 1245 xmlTag.wsTagName = m_ws1; | 1245 xmlTag.wsTagName = m_ws1; |
| 1246 xmlTag.eType = FDE_XMLNODE_Instruction; | 1246 xmlTag.eType = FDE_XMLNODE_Instruction; |
| 1247 Push(xmlTag); | 1247 Push(xmlTag); |
| 1248 m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Instruction, | 1248 m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Instruction, |
| 1249 m_pTagTop->wsTagName); | 1249 m_pTagTop->wsTagName); |
| 1250 m_ws1.Empty(); | 1250 m_ws1.clear(); |
| 1251 } break; | 1251 } break; |
| 1252 case FDE_XmlSyntaxResult::TagName: { | 1252 case FDE_XmlSyntaxResult::TagName: { |
| 1253 m_pParser->GetTargetName(m_ws1); | 1253 m_pParser->GetTargetName(m_ws1); |
| 1254 CFDE_XMLTAG xmlTag; | 1254 CFDE_XMLTAG xmlTag; |
| 1255 xmlTag.wsTagName = m_ws1; | 1255 xmlTag.wsTagName = m_ws1; |
| 1256 xmlTag.eType = FDE_XMLNODE_Element; | 1256 xmlTag.eType = FDE_XMLNODE_Element; |
| 1257 Push(xmlTag); | 1257 Push(xmlTag); |
| 1258 m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Element, | 1258 m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Element, |
| 1259 m_pTagTop->wsTagName); | 1259 m_pTagTop->wsTagName); |
| 1260 } break; | 1260 } break; |
| 1261 case FDE_XmlSyntaxResult::AttriName: | 1261 case FDE_XmlSyntaxResult::AttriName: |
| 1262 m_pParser->GetTargetName(m_ws1); | 1262 m_pParser->GetTargetName(m_ws1); |
| 1263 break; | 1263 break; |
| 1264 case FDE_XmlSyntaxResult::AttriValue: | 1264 case FDE_XmlSyntaxResult::AttriValue: |
| 1265 m_pParser->GetAttributeName(m_ws2); | 1265 m_pParser->GetAttributeName(m_ws2); |
| 1266 if (m_pTagTop == NULL) { | 1266 if (m_pTagTop == NULL) { |
| 1267 syntaxParserResult = FDE_XmlSyntaxResult::Error; | 1267 syntaxParserResult = FDE_XmlSyntaxResult::Error; |
| 1268 break; | 1268 break; |
| 1269 } | 1269 } |
| 1270 if (m_pTagTop->eType == FDE_XMLNODE_Element) { | 1270 if (m_pTagTop->eType == FDE_XMLNODE_Element) { |
| 1271 m_pHandler->OnAttribute(m_pHandler, m_ws1, m_ws2); | 1271 m_pHandler->OnAttribute(m_pHandler, m_ws1, m_ws2); |
| 1272 } | 1272 } |
| 1273 m_ws1.Empty(); | 1273 m_ws1.clear(); |
| 1274 break; | 1274 break; |
| 1275 case FDE_XmlSyntaxResult::CData: | 1275 case FDE_XmlSyntaxResult::CData: |
| 1276 m_pParser->GetTextData(m_ws1); | 1276 m_pParser->GetTextData(m_ws1); |
| 1277 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_CharData, m_ws1); | 1277 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_CharData, m_ws1); |
| 1278 break; | 1278 break; |
| 1279 case FDE_XmlSyntaxResult::Text: | 1279 case FDE_XmlSyntaxResult::Text: |
| 1280 m_pParser->GetTextData(m_ws1); | 1280 m_pParser->GetTextData(m_ws1); |
| 1281 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Text, m_ws1); | 1281 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Text, m_ws1); |
| 1282 break; | 1282 break; |
| 1283 case FDE_XmlSyntaxResult::TargetData: | 1283 case FDE_XmlSyntaxResult::TargetData: |
| 1284 m_pParser->GetTargetData(m_ws1); | 1284 m_pParser->GetTargetData(m_ws1); |
| 1285 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Instruction, m_ws1); | 1285 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Instruction, m_ws1); |
| 1286 m_ws1.Empty(); | 1286 m_ws1.clear(); |
| 1287 break; | 1287 break; |
| 1288 default: | 1288 default: |
| 1289 break; | 1289 break; |
| 1290 } | 1290 } |
| 1291 if (syntaxParserResult == FDE_XmlSyntaxResult::Error || | 1291 if (syntaxParserResult == FDE_XmlSyntaxResult::Error || |
| 1292 syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { | 1292 syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { |
| 1293 break; | 1293 break; |
| 1294 } | 1294 } |
| 1295 if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { | 1295 if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { |
| 1296 break; | 1296 break; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1373 m_iStartPosition += iCount; | 1373 m_iStartPosition += iCount; |
| 1374 m_iDataLength -= iCount; | 1374 m_iDataLength -= iCount; |
| 1375 } else { | 1375 } else { |
| 1376 m_iDataLength -= iCount; | 1376 m_iDataLength -= iCount; |
| 1377 } | 1377 } |
| 1378 return m_iDataLength; | 1378 return m_iDataLength; |
| 1379 } | 1379 } |
| 1380 void CFDE_BlockBuffer::GetTextData(CFX_WideString& wsTextData, | 1380 void CFDE_BlockBuffer::GetTextData(CFX_WideString& wsTextData, |
| 1381 int32_t iStart, | 1381 int32_t iStart, |
| 1382 int32_t iLength) const { | 1382 int32_t iLength) const { |
| 1383 wsTextData.Empty(); | 1383 wsTextData.clear(); |
| 1384 int32_t iMaybeDataLength = m_iBufferSize - 1 - m_iStartPosition; | 1384 int32_t iMaybeDataLength = m_iBufferSize - 1 - m_iStartPosition; |
| 1385 if (iStart < 0 || iStart > iMaybeDataLength) { | 1385 if (iStart < 0 || iStart > iMaybeDataLength) { |
| 1386 return; | 1386 return; |
| 1387 } | 1387 } |
| 1388 if (iLength == -1 || iLength > iMaybeDataLength) { | 1388 if (iLength == -1 || iLength > iMaybeDataLength) { |
| 1389 iLength = iMaybeDataLength; | 1389 iLength = iMaybeDataLength; |
| 1390 } | 1390 } |
| 1391 if (iLength <= 0) { | 1391 if (iLength <= 0) { |
| 1392 return; | 1392 return; |
| 1393 } | 1393 } |
| (...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2074 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); | 2074 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); |
| 2075 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); | 2075 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
| 2076 m_iEntityStart = -1; | 2076 m_iEntityStart = -1; |
| 2077 } else { | 2077 } else { |
| 2078 if (m_iEntityStart < 0 && ch == L'&') { | 2078 if (m_iEntityStart < 0 && ch == L'&') { |
| 2079 m_iEntityStart = m_iDataLength - 1; | 2079 m_iEntityStart = m_iDataLength - 1; |
| 2080 } | 2080 } |
| 2081 } | 2081 } |
| 2082 m_pStart++; | 2082 m_pStart++; |
| 2083 } | 2083 } |
| OLD | NEW |