summaryrefslogtreecommitdiff
path: root/xfa/fde
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fde')
-rw-r--r--xfa/fde/xml/cfx_saxreader.cpp53
-rw-r--r--xfa/fde/xml/cfx_saxreader.h2
-rw-r--r--xfa/fde/xml/fde_xml_imp.cpp42
-rw-r--r--xfa/fde/xml/fde_xml_imp.h2
4 files changed, 43 insertions, 56 deletions
diff --git a/xfa/fde/xml/cfx_saxreader.cpp b/xfa/fde/xml/cfx_saxreader.cpp
index 458bed52d6..552ec5f5fe 100644
--- a/xfa/fde/xml/cfx_saxreader.cpp
+++ b/xfa/fde/xml/cfx_saxreader.cpp
@@ -10,6 +10,7 @@
#include <utility>
#include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
#include "xfa/fxfa/xfa_checksum.h"
enum class CFX_SaxMode {
@@ -147,11 +148,9 @@ CFX_SAXReader::~CFX_SAXReader() {
void CFX_SAXReader::Reset() {
m_File.Reset();
- while (!m_Stack.empty())
- m_Stack.pop();
-
+ m_Stack = std::stack<std::unique_ptr<CFX_SAXItem>>();
m_dwItemID = 0;
- m_SkipStack.RemoveAll();
+ m_SkipStack = std::stack<char>();
m_SkipChar = 0;
m_iDataLength = 0;
m_iEntityStart = -1;
@@ -397,17 +396,17 @@ void CFX_SAXReader::ParseDeclOrComment() {
GetCurrentItem()->m_eNode = CFX_SAXItem::Type::Comment;
if (!m_pCommentContext)
m_pCommentContext = new CFX_SAXCommentContext;
-
m_pCommentContext->m_iHeaderCount = 1;
m_pCommentContext->m_iTailCount = 0;
- } else {
- m_eMode = CFX_SaxMode::DeclNode;
- m_dwDataOffset = m_File.m_dwBufIndex;
- m_SkipChar = '>';
- m_SkipStack.Add('>');
- SkipNode();
+ return;
}
+ m_eMode = CFX_SaxMode::DeclNode;
+ m_dwDataOffset = m_File.m_dwBufIndex;
+ m_SkipChar = '>';
+ m_SkipStack.push('>');
+ SkipNode();
}
+
void CFX_SAXReader::ParseComment() {
m_pCommentContext->m_iHeaderCount = 2;
m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex;
@@ -591,44 +590,41 @@ void CFX_SAXReader::ParseTargetData() {
}
}
void CFX_SAXReader::SkipNode() {
- int32_t iLen = m_SkipStack.GetSize();
if (m_SkipChar == '\'' || m_SkipChar == '\"') {
- if (m_CurByte != m_SkipChar) {
+ if (m_CurByte != m_SkipChar)
return;
- }
- iLen--;
- ASSERT(iLen > -1);
- m_SkipStack.RemoveAt(iLen, 1);
- m_SkipChar = iLen ? m_SkipStack[iLen - 1] : 0;
+
+ ASSERT(!m_SkipStack.empty());
+ m_SkipStack.pop();
+ m_SkipChar = !m_SkipStack.empty() ? m_SkipStack.top() : 0;
return;
}
switch (m_CurByte) {
case '<':
m_SkipChar = '>';
- m_SkipStack.Add('>');
+ m_SkipStack.push('>');
break;
case '[':
m_SkipChar = ']';
- m_SkipStack.Add(']');
+ m_SkipStack.push(']');
break;
case '(':
m_SkipChar = ')';
- m_SkipStack.Add(')');
+ m_SkipStack.push(')');
break;
case '\'':
m_SkipChar = '\'';
- m_SkipStack.Add('\'');
+ m_SkipStack.push('\'');
break;
case '\"':
m_SkipChar = '\"';
- m_SkipStack.Add('\"');
+ m_SkipStack.push('\"');
break;
default:
if (m_CurByte == m_SkipChar) {
- iLen--;
- m_SkipStack.RemoveAt(iLen, 1);
- m_SkipChar = iLen ? m_SkipStack[iLen - 1] : 0;
- if (iLen == 0 && m_CurByte == '>') {
+ m_SkipStack.pop();
+ m_SkipChar = !m_SkipStack.empty() ? m_SkipStack.top() : 0;
+ if (m_SkipStack.empty() && m_CurByte == '>') {
m_iDataLength = m_iDataPos;
m_iDataPos = 0;
if (m_iDataLength >= 9 &&
@@ -653,9 +649,8 @@ void CFX_SAXReader::SkipNode() {
}
break;
}
- if (iLen > 0) {
+ if (!m_SkipStack.empty())
ParseChar(m_CurByte);
- }
}
void CFX_SAXReader::NotifyData() {
diff --git a/xfa/fde/xml/cfx_saxreader.h b/xfa/fde/xml/cfx_saxreader.h
index 129399d88d..4e36615429 100644
--- a/xfa/fde/xml/cfx_saxreader.h
+++ b/xfa/fde/xml/cfx_saxreader.h
@@ -128,7 +128,7 @@ class CFX_SAXReader {
bool m_bCharData;
uint8_t m_CurByte;
uint32_t m_dwDataOffset;
- CFX_ArrayTemplate<uint8_t> m_SkipStack;
+ std::stack<char> m_SkipStack;
uint8_t m_SkipChar;
uint32_t m_dwNodePos;
uint8_t* m_pszData;
diff --git a/xfa/fde/xml/fde_xml_imp.cpp b/xfa/fde/xml/fde_xml_imp.cpp
index 334410049c..28384451e4 100644
--- a/xfa/fde/xml/fde_xml_imp.cpp
+++ b/xfa/fde/xml/fde_xml_imp.cpp
@@ -1111,26 +1111,25 @@ CFDE_BlockBuffer::~CFDE_BlockBuffer() {
wchar_t* CFDE_BlockBuffer::GetAvailableBlock(int32_t& iIndexInBlock) {
iIndexInBlock = 0;
- if (!m_BlockArray.GetSize()) {
+ if (m_BlockArray.empty())
return nullptr;
- }
+
int32_t iRealIndex = m_iStartPosition + m_iDataLength;
if (iRealIndex == m_iBufferSize) {
- wchar_t* pBlock = FX_Alloc(wchar_t, m_iAllocStep);
- m_BlockArray.Add(pBlock);
+ m_BlockArray.emplace_back(FX_Alloc(wchar_t, m_iAllocStep));
m_iBufferSize += m_iAllocStep;
- return pBlock;
+ return m_BlockArray.back().get();
}
iIndexInBlock = iRealIndex % m_iAllocStep;
- return m_BlockArray[iRealIndex / m_iAllocStep];
+ return m_BlockArray[iRealIndex / m_iAllocStep].get();
}
bool CFDE_BlockBuffer::InitBuffer(int32_t iBufferSize) {
ClearBuffer();
int32_t iNumOfBlock = (iBufferSize - 1) / m_iAllocStep + 1;
- for (int32_t i = 0; i < iNumOfBlock; i++) {
- m_BlockArray.Add(FX_Alloc(wchar_t, m_iAllocStep));
- }
+ for (int32_t i = 0; i < iNumOfBlock; i++)
+ m_BlockArray.emplace_back(FX_Alloc(wchar_t, m_iAllocStep));
+
m_iBufferSize = iNumOfBlock * m_iAllocStep;
return true;
}
@@ -1142,26 +1141,23 @@ void CFDE_BlockBuffer::SetTextChar(int32_t iIndex, wchar_t ch) {
int32_t iRealIndex = m_iStartPosition + iIndex;
int32_t iBlockIndex = iRealIndex / m_iAllocStep;
int32_t iInnerIndex = iRealIndex % m_iAllocStep;
- int32_t iBlockSize = m_BlockArray.GetSize();
+ int32_t iBlockSize = pdfium::CollectionSize<int32_t>(m_BlockArray);
if (iBlockIndex >= iBlockSize) {
int32_t iNewBlocks = iBlockIndex - iBlockSize + 1;
do {
- wchar_t* pBlock = FX_Alloc(wchar_t, m_iAllocStep);
- m_BlockArray.Add(pBlock);
+ m_BlockArray.emplace_back(FX_Alloc(wchar_t, m_iAllocStep));
m_iBufferSize += m_iAllocStep;
} while (--iNewBlocks);
}
- wchar_t* pTextData = m_BlockArray[iBlockIndex];
- *(pTextData + iInnerIndex) = ch;
- if (m_iDataLength <= iIndex) {
- m_iDataLength = iIndex + 1;
- }
+ wchar_t* pTextData = m_BlockArray[iBlockIndex].get();
+ pTextData[iInnerIndex] = ch;
+ m_iDataLength = std::max(m_iDataLength, iIndex + 1);
}
int32_t CFDE_BlockBuffer::DeleteTextChars(int32_t iCount, bool bDirection) {
- if (iCount <= 0) {
+ if (iCount <= 0)
return m_iDataLength;
- }
+
if (iCount >= m_iDataLength) {
Reset(false);
return 0;
@@ -1210,7 +1206,7 @@ void CFDE_BlockBuffer::GetTextData(CFX_WideString& wsTextData,
if (i == iEndBlockIndex) {
iCopyLength -= ((m_iAllocStep - 1) - iEndInnerIndex);
}
- wchar_t* pBlockBuf = m_BlockArray[i];
+ wchar_t* pBlockBuf = m_BlockArray[i].get();
FXSYS_memcpy(pBuf + iPointer, pBlockBuf + iBufferPointer,
iCopyLength * sizeof(wchar_t));
iPointer += iCopyLength;
@@ -1229,11 +1225,7 @@ void CFDE_BlockBuffer::TextDataIndex2BufIndex(const int32_t iIndex,
void CFDE_BlockBuffer::ClearBuffer() {
m_iBufferSize = 0;
- int32_t iSize = m_BlockArray.GetSize();
- for (int32_t i = 0; i < iSize; i++) {
- FX_Free(m_BlockArray[i]);
- }
- m_BlockArray.RemoveAll();
+ m_BlockArray.clear();
}
CFDE_XMLSyntaxParser::CFDE_XMLSyntaxParser()
diff --git a/xfa/fde/xml/fde_xml_imp.h b/xfa/fde/xml/fde_xml_imp.h
index ab5ab9be24..687a0cd416 100644
--- a/xfa/fde/xml/fde_xml_imp.h
+++ b/xfa/fde/xml/fde_xml_imp.h
@@ -243,7 +243,7 @@ class CFDE_BlockBuffer {
int32_t& iInnerIndex) const;
void ClearBuffer();
- CFX_ArrayTemplate<wchar_t*> m_BlockArray;
+ std::vector<std::unique_ptr<wchar_t, FxFreeDeleter>> m_BlockArray;
int32_t m_iDataLength;
int32_t m_iBufferSize;
int32_t m_iAllocStep;