Index: xfa/fde/xml/fde_xml_imp.cpp |
diff --git a/xfa/fde/xml/fde_xml_imp.cpp b/xfa/fde/xml/fde_xml_imp.cpp |
index ef5a7e4ee3aebd789efc7bbf70fa3466b37e66f3..0affe8a62190ef2e2b9a58b9c2dfa50c5feaed34 100644 |
--- a/xfa/fde/xml/fde_xml_imp.cpp |
+++ b/xfa/fde/xml/fde_xml_imp.cpp |
@@ -1491,7 +1491,7 @@ uint32_t CFDE_XMLSyntaxParser::DoSyntaxParse() { |
FXSYS_assert(m_pStream && m_pBuffer && m_BlockBuffer.IsInitialized()); |
int32_t iStreamLength = m_pStream->GetLength(); |
int32_t iPos; |
- FX_WCHAR ch; |
+ |
uint32_t dwStatus = FDE_XMLSYNTAXSTATUS_None; |
while (TRUE) { |
if (m_pStart >= m_pEnd) { |
@@ -1516,8 +1516,9 @@ uint32_t CFDE_XMLSyntaxParser::DoSyntaxParse() { |
m_pStart = m_pBuffer; |
m_pEnd = m_pBuffer + m_iBufferChars; |
} |
+ |
while (m_pStart < m_pEnd) { |
- ch = *m_pStart; |
+ FX_WCHAR ch = *m_pStart; |
switch (m_dwMode) { |
case FDE_XMLSYNTAXMODE_Text: |
if (ch == L'<') { |
@@ -1783,27 +1784,51 @@ uint32_t CFDE_XMLSyntaxParser::DoSyntaxParse() { |
m_pStart++; |
break; |
case FDE_XMLSYNTAXMODE_SkipCommentOrDecl: |
- if (ch == '-') { |
+ if (FX_wcsnicmp(m_pStart, L"--", 2) == 0) { |
+ m_pStart += 2; |
m_dwMode = FDE_XMLSYNTAXMODE_SkipComment; |
+ } else if (FX_wcsnicmp(m_pStart, L"[CDATA[", 7) == 0) { |
+ m_pStart += 7; |
+ m_dwMode = FDE_XMLSYNTAXMODE_SkipCData; |
} else { |
m_dwMode = FDE_XMLSYNTAXMODE_SkipDeclNode; |
m_SkipChar = L'>'; |
m_SkipStack.Push(L'>'); |
} |
break; |
+ case FDE_XMLSYNTAXMODE_SkipCData: { |
+ if (FX_wcsnicmp(m_pStart, L"]]>", 3) == 0) { |
+ m_pStart += 3; |
+ dwStatus = FDE_XMLSYNTAXSTATUS_CData; |
+ m_iTextDataLength = m_iDataLength; |
+ m_BlockBuffer.Reset(); |
+ m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
+ m_dwMode = FDE_XMLSYNTAXMODE_Text; |
+ } else { |
+ if (m_iIndexInBlock == m_iAllocStep) { |
+ m_pCurrentBlock = |
+ m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
+ if (!m_pCurrentBlock) |
+ return FDE_XMLSYNTAXSTATUS_Error; |
+ } |
+ m_pCurrentBlock[m_iIndexInBlock++] = ch; |
+ m_iDataLength++; |
+ m_pStart++; |
+ } |
+ break; |
+ } |
case FDE_XMLSYNTAXMODE_SkipDeclNode: |
if (m_SkipChar == L'\'' || m_SkipChar == L'\"') { |
m_pStart++; |
- if (ch != m_SkipChar) { |
+ if (ch != m_SkipChar) |
break; |
- } |
+ |
m_SkipStack.Pop(); |
uint32_t* pDWord = m_SkipStack.GetTopElement(); |
- if (pDWord == NULL) { |
+ if (!pDWord) |
m_dwMode = FDE_XMLSYNTAXMODE_Text; |
- } else { |
+ else |
m_SkipChar = (FX_WCHAR)*pDWord; |
- } |
} else { |
switch (ch) { |
case L'<': |
@@ -1830,20 +1855,10 @@ uint32_t CFDE_XMLSyntaxParser::DoSyntaxParse() { |
if (ch == m_SkipChar) { |
m_SkipStack.Pop(); |
uint32_t* pDWord = m_SkipStack.GetTopElement(); |
- if (pDWord == NULL) { |
+ if (!pDWord) { |
if (m_iDataLength >= 9) { |
CFX_WideString wsHeader; |
m_BlockBuffer.GetTextData(wsHeader, 0, 7); |
- if (wsHeader.Equal(FX_WSTRC(L"[CDATA["))) { |
- CFX_WideString wsTailer; |
- m_BlockBuffer.GetTextData(wsTailer, m_iDataLength - 2, |
- 2); |
- if (wsTailer.Equal(FX_WSTRC(L"]]"))) { |
- m_BlockBuffer.DeleteTextChars(7, TRUE); |
- m_BlockBuffer.DeleteTextChars(2, FALSE); |
- dwStatus = FDE_XMLSYNTAXSTATUS_CData; |
- } |
- } |
} |
m_iTextDataLength = m_iDataLength; |
m_BlockBuffer.Reset(); |
@@ -1851,7 +1866,7 @@ uint32_t CFDE_XMLSyntaxParser::DoSyntaxParse() { |
m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
m_dwMode = FDE_XMLSYNTAXMODE_Text; |
} else { |
- m_SkipChar = (FX_WCHAR)*pDWord; |
+ m_SkipChar = static_cast<FX_WCHAR>(*pDWord); |
} |
} |
break; |
@@ -1871,27 +1886,11 @@ uint32_t CFDE_XMLSyntaxParser::DoSyntaxParse() { |
} |
break; |
case FDE_XMLSYNTAXMODE_SkipComment: |
- if (ch == L'-') { |
- if (m_iIndexInBlock == m_iAllocStep) { |
- m_pCurrentBlock = |
- m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
- if (!m_pCurrentBlock) { |
- return FDE_XMLSYNTAXSTATUS_Error; |
- } |
- } |
- m_pCurrentBlock[m_iIndexInBlock++] = L'-'; |
- m_iDataLength++; |
- } else if (ch == L'>') { |
- if (m_iDataLength > 1) { |
- m_BlockBuffer.Reset(); |
- m_pCurrentBlock = |
- m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
- m_dwMode = FDE_XMLSYNTAXMODE_Text; |
- } |
- } else { |
- m_BlockBuffer.Reset(); |
- m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
+ if (FX_wcsnicmp(m_pStart, L"-->", 3) == 0) { |
+ m_pStart += 2; |
+ m_dwMode = FDE_XMLSYNTAXMODE_Text; |
} |
+ |
m_pStart++; |
break; |
case FDE_XMLSYNTAXMODE_TargetData: |
@@ -1945,9 +1944,8 @@ uint32_t CFDE_XMLSyntaxParser::DoSyntaxParse() { |
default: |
break; |
} |
- if (dwStatus != FDE_XMLSYNTAXSTATUS_None) { |
+ if (dwStatus != FDE_XMLSYNTAXSTATUS_None) |
return dwStatus; |
- } |
} |
} |
return 0; |