Index: xfa/fde/xml/cfx_saxreader.cpp |
diff --git a/xfa/fde/xml/cfx_saxreader.cpp b/xfa/fde/xml/cfx_saxreader.cpp |
index 2fde9d90f1c846f9b4710f05a3b6e2d1f9769214..bd76e79442d3d13f48552bf85b02086248ca8d65 100644 |
--- a/xfa/fde/xml/cfx_saxreader.cpp |
+++ b/xfa/fde/xml/cfx_saxreader.cpp |
@@ -7,6 +7,7 @@ |
#include "xfa/fde/xml/cfx_saxreader.h" |
#include <algorithm> |
+#include <utility> |
#include "xfa/fxfa/xfa_checksum.h" |
@@ -94,6 +95,7 @@ FX_BOOL CFX_SAXFile::StartFile(IFX_FileRead* pFile, |
m_dwBufIndex = 0; |
return TRUE; |
} |
+ |
FX_BOOL CFX_SAXFile::ReadNextBlock() { |
ASSERT(m_pFile); |
uint32_t dwSize = m_dwEnd - m_dwCur; |
@@ -107,6 +109,7 @@ FX_BOOL CFX_SAXFile::ReadNextBlock() { |
m_dwBufIndex = 0; |
return TRUE; |
} |
+ |
void CFX_SAXFile::Reset() { |
if (m_pBuf) { |
FX_Free(m_pBuf); |
@@ -114,12 +117,11 @@ void CFX_SAXFile::Reset() { |
} |
m_pFile = nullptr; |
} |
+ |
CFX_SAXReader::CFX_SAXReader() |
: m_File(), |
m_pHandler(nullptr), |
m_iState(-1), |
- m_pRoot(nullptr), |
- m_pCurItem(nullptr), |
m_dwItemID(0), |
m_iDataSize(256), |
m_iNameSize(256), |
@@ -139,16 +141,12 @@ CFX_SAXReader::~CFX_SAXReader() { |
m_pszName = nullptr; |
} |
} |
+ |
void CFX_SAXReader::Reset() { |
m_File.Reset(); |
- CFX_SAXItem* pItem = m_pRoot; |
- while (pItem) { |
- CFX_SAXItem* pNext = pItem->m_pNext; |
- delete pItem; |
- pItem = pNext; |
- } |
- m_pRoot = nullptr; |
- m_pCurItem = nullptr; |
+ while (!m_Stack.empty()) |
+ m_Stack.pop(); |
+ |
m_dwItemID = 0; |
m_SkipStack.RemoveAll(); |
m_SkipChar = 0; |
@@ -156,36 +154,36 @@ void CFX_SAXReader::Reset() { |
m_iEntityStart = -1; |
m_iNameLength = 0; |
m_iDataPos = 0; |
- if (m_pCommentContext) { |
- delete m_pCommentContext; |
- m_pCommentContext = nullptr; |
- } |
+ delete m_pCommentContext; |
+ m_pCommentContext = nullptr; |
+} |
+ |
+void CFX_SAXReader::Push() { |
+ std::unique_ptr<CFX_SAXItem> pNew(WrapUnique(new CFX_SAXItem(++m_dwItemID))); |
+ if (!m_Stack.empty()) |
+ pNew->m_bSkip = m_Stack.top()->m_bSkip; |
+ m_Stack.push(std::move(pNew)); |
} |
-inline void CFX_SAXReader::Push() { |
- CFX_SAXItem* pNew = new CFX_SAXItem; |
- pNew->m_dwID = ++m_dwItemID; |
- pNew->m_bSkip = m_pCurItem->m_bSkip; |
- pNew->m_pPrev = m_pCurItem; |
- m_pCurItem->m_pNext = pNew; |
- m_pCurItem = pNew; |
+ |
+void CFX_SAXReader::Pop() { |
+ if (!m_Stack.empty()) |
+ m_Stack.pop(); |
} |
-inline void CFX_SAXReader::Pop() { |
- if (!m_pCurItem) { |
- return; |
- } |
- CFX_SAXItem* pPrev = m_pCurItem->m_pPrev; |
- pPrev->m_pNext = nullptr; |
- delete m_pCurItem; |
- m_pCurItem = pPrev; |
+ |
+CFX_SAXItem* CFX_SAXReader::GetCurrentItem() const { |
+ return m_Stack.empty() ? nullptr : m_Stack.top().get(); |
} |
-inline void CFX_SAXReader::AppendData(uint8_t ch) { |
+ |
+void CFX_SAXReader::AppendData(uint8_t ch) { |
ReallocDataBuffer(); |
m_pszData[m_iDataPos++] = ch; |
} |
-inline void CFX_SAXReader::AppendName(uint8_t ch) { |
+ |
+void CFX_SAXReader::AppendName(uint8_t ch) { |
ReallocNameBuffer(); |
m_pszName[m_iDataPos++] = ch; |
} |
+ |
void CFX_SAXReader::ReallocDataBuffer() { |
if (m_iDataPos < m_iDataSize) { |
return; |
@@ -197,6 +195,7 @@ void CFX_SAXReader::ReallocDataBuffer() { |
} |
m_pszData = (uint8_t*)FX_Realloc(uint8_t, m_pszData, m_iDataSize); |
} |
+ |
void CFX_SAXReader::ReallocNameBuffer() { |
if (m_iDataPos < m_iNameSize) { |
return; |
@@ -208,9 +207,11 @@ void CFX_SAXReader::ReallocNameBuffer() { |
} |
m_pszName = (uint8_t*)FX_Realloc(uint8_t, m_pszName, m_iNameSize); |
} |
-inline FX_BOOL CFX_SAXReader::SkipSpace(uint8_t ch) { |
+ |
+FX_BOOL CFX_SAXReader::SkipSpace(uint8_t ch) { |
return (m_dwParseMode & CFX_SaxParseMode_NotSkipSpace) == 0 && ch < 0x21; |
} |
+ |
int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile, |
uint32_t dwStart, |
uint32_t dwLen, |
@@ -225,9 +226,8 @@ int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile, |
m_ePrevMode = CFX_SaxMode::Text; |
m_bCharData = FALSE; |
m_dwDataOffset = 0; |
- m_pRoot = m_pCurItem = new CFX_SAXItem; |
- m_pCurItem->m_dwID = ++m_dwItemID; |
m_dwParseMode = dwParseMode; |
+ m_Stack.emplace(new CFX_SAXItem(++m_dwItemID)); |
return 0; |
} |
@@ -338,6 +338,7 @@ void CFX_SAXReader::ParseChar(uint8_t ch) { |
m_iDataPos++; |
} |
} |
+ |
void CFX_SAXReader::ParseText() { |
if (m_CurByte == '<') { |
if (m_iDataPos > 0) { |
@@ -357,9 +358,10 @@ void CFX_SAXReader::ParseText() { |
} |
ParseChar(m_CurByte); |
} |
+ |
void CFX_SAXReader::ParseNodeStart() { |
if (m_CurByte == '?') { |
- m_pCurItem->m_eNode = CFX_SAXItem::Type::Instruction; |
+ GetCurrentItem()->m_eNode = CFX_SAXItem::Type::Instruction; |
m_eMode = CFX_SaxMode::TagName; |
return; |
} |
@@ -378,15 +380,16 @@ void CFX_SAXReader::ParseNodeStart() { |
} |
if (m_CurByte > 0x20) { |
m_dwDataOffset = m_File.m_dwBufIndex; |
- m_pCurItem->m_eNode = CFX_SAXItem::Type::Tag; |
+ GetCurrentItem()->m_eNode = CFX_SAXItem::Type::Tag; |
m_eMode = CFX_SaxMode::TagName; |
AppendData(m_CurByte); |
} |
} |
+ |
void CFX_SAXReader::ParseDeclOrComment() { |
if (m_CurByte == '-') { |
m_eMode = CFX_SaxMode::Comment; |
- m_pCurItem->m_eNode = CFX_SAXItem::Type::Comment; |
+ GetCurrentItem()->m_eNode = CFX_SAXItem::Type::Comment; |
if (!m_pCommentContext) |
m_pCommentContext = new CFX_SAXCommentContext; |
@@ -479,18 +482,21 @@ void CFX_SAXReader::ParseTagAttributeName() { |
} |
AppendName(m_CurByte); |
} |
+ |
void CFX_SAXReader::ParseTagAttributeEqual() { |
if (m_CurByte == '=') { |
m_SkipChar = 0; |
m_eMode = CFX_SaxMode::TagAttributeValue; |
return; |
- } else if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
+ } |
+ if (GetCurrentItem()->m_eNode == CFX_SAXItem::Type::Instruction) { |
m_iDataPos = m_iNameLength; |
AppendName(0x20); |
m_eMode = CFX_SaxMode::TargetData; |
ParseTargetData(); |
} |
} |
+ |
void CFX_SAXReader::ParseTagAttributeValue() { |
if (m_SkipChar) { |
if (m_SkipChar == m_CurByte) { |
@@ -517,9 +523,10 @@ void CFX_SAXReader::ParseTagAttributeValue() { |
} |
} |
} |
+ |
void CFX_SAXReader::ParseMaybeClose() { |
if (m_CurByte == '>') { |
- if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
+ if (GetCurrentItem()->m_eNode == CFX_SAXItem::Type::Instruction) { |
m_iNameLength = m_iDataPos; |
m_iDataPos = 0; |
if (m_pHandler) { |
@@ -647,69 +654,79 @@ void CFX_SAXReader::SkipNode() { |
} |
void CFX_SAXReader::NotifyData() { |
- if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag) |
+ CFX_SAXItem* pItem = GetCurrentItem(); |
+ if (!pItem) |
+ return; |
+ |
+ if (pItem->m_eNode == CFX_SAXItem::Type::Tag) |
m_pHandler->OnTagData( |
- m_pCurItem->m_pNode, |
+ pItem->m_pNode, |
m_bCharData ? CFX_SAXItem::Type::CharData : CFX_SAXItem::Type::Text, |
CFX_ByteStringC(m_pszData, m_iDataLength), |
m_File.m_dwCur + m_dwDataOffset); |
} |
void CFX_SAXReader::NotifyEnter() { |
- if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag || |
- m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
- m_pCurItem->m_pNode = |
- m_pHandler->OnTagEnter(CFX_ByteStringC(m_pszData, m_iDataLength), |
- m_pCurItem->m_eNode, m_dwNodePos); |
+ CFX_SAXItem* pItem = GetCurrentItem(); |
+ if (pItem->m_eNode == CFX_SAXItem::Type::Tag || |
+ pItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
+ pItem->m_pNode = m_pHandler->OnTagEnter( |
+ CFX_ByteStringC(m_pszData, m_iDataLength), pItem->m_eNode, m_dwNodePos); |
} |
} |
void CFX_SAXReader::NotifyAttribute() { |
- if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag || |
- m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
- m_pHandler->OnTagAttribute(m_pCurItem->m_pNode, |
+ CFX_SAXItem* pItem = GetCurrentItem(); |
+ if (pItem->m_eNode == CFX_SAXItem::Type::Tag || |
+ pItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
+ m_pHandler->OnTagAttribute(pItem->m_pNode, |
CFX_ByteStringC(m_pszName, m_iNameLength), |
CFX_ByteStringC(m_pszData, m_iDataLength)); |
} |
} |
void CFX_SAXReader::NotifyBreak() { |
- if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag) |
- m_pHandler->OnTagBreak(m_pCurItem->m_pNode); |
+ CFX_SAXItem* pItem = GetCurrentItem(); |
+ if (pItem->m_eNode == CFX_SAXItem::Type::Tag) |
+ m_pHandler->OnTagBreak(pItem->m_pNode); |
} |
void CFX_SAXReader::NotifyClose() { |
- if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag || |
- m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
- m_pHandler->OnTagClose(m_pCurItem->m_pNode, m_dwNodePos); |
+ CFX_SAXItem* pItem = GetCurrentItem(); |
+ if (pItem->m_eNode == CFX_SAXItem::Type::Tag || |
+ pItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
+ m_pHandler->OnTagClose(pItem->m_pNode, m_dwNodePos); |
} |
} |
void CFX_SAXReader::NotifyEnd() { |
- if (m_pCurItem->m_eNode != CFX_SAXItem::Type::Tag) |
+ CFX_SAXItem* pItem = GetCurrentItem(); |
+ if (!pItem || pItem->m_eNode != CFX_SAXItem::Type::Tag) |
return; |
- m_pHandler->OnTagEnd(m_pCurItem->m_pNode, |
+ m_pHandler->OnTagEnd(pItem->m_pNode, |
CFX_ByteStringC(m_pszData, m_iDataLength), m_dwNodePos); |
} |
void CFX_SAXReader::NotifyTargetData() { |
- if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
- m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, |
+ CFX_SAXItem* pItem = GetCurrentItem(); |
+ if (pItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
+ m_pHandler->OnTargetData(pItem->m_pNode, pItem->m_eNode, |
CFX_ByteStringC(m_pszName, m_iNameLength), |
m_dwNodePos); |
- } else if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Comment) { |
- m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, |
+ } else if (pItem->m_eNode == CFX_SAXItem::Type::Comment) { |
+ m_pHandler->OnTargetData(pItem->m_pNode, pItem->m_eNode, |
CFX_ByteStringC(m_pszData, m_iDataLength), |
m_dwNodePos); |
} |
} |
void CFX_SAXReader::SkipCurrentNode() { |
- if (!m_pCurItem) |
+ CFX_SAXItem* pItem = GetCurrentItem(); |
+ if (!pItem) |
return; |
- m_pCurItem->m_bSkip = TRUE; |
+ pItem->m_bSkip = TRUE; |
} |
void CFX_SAXReader::SetHandler(CXFA_SAXReaderHandler* pHandler) { |