Index: xfa/fde/xml/cfx_saxreader.cpp |
diff --git a/xfa/fgas/xml/fgas_sax.cpp b/xfa/fde/xml/cfx_saxreader.cpp |
similarity index 76% |
rename from xfa/fgas/xml/fgas_sax.cpp |
rename to xfa/fde/xml/cfx_saxreader.cpp |
index 1128e1184f90faee49b44ede02e392db6a414722..bbe7ed27c9def7f1ee3e1e5f73c1149b41238168 100644 |
--- a/xfa/fgas/xml/fgas_sax.cpp |
+++ b/xfa/fde/xml/cfx_saxreader.cpp |
@@ -4,16 +4,77 @@ |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
-#include "xfa/fgas/xml/fgas_sax.h" |
+#include "xfa/fde/xml/cfx_saxreader.h" |
#include <algorithm> |
#include "xfa/fxfa/include/xfa_checksum.h" |
+enum class CFX_SaxMode { |
+ Text = 0, |
+ NodeStart, |
+ DeclOrComment, |
+ DeclNode, |
+ Comment, |
+ CommentContent, |
+ TagName, |
+ TagAttributeName, |
+ TagAttributeEqual, |
+ TagAttributeValue, |
+ TagMaybeClose, |
+ TagClose, |
+ TagEnd, |
+ TargetData, |
+ MAX |
+}; |
+ |
+class CFX_SAXItem { |
+ public: |
+ CFX_SAXItem() |
+ : m_pNode(NULL), |
Tom Sepez
2016/05/18 20:14:12
nit: nullptrs
dsinclair
2016/05/18 20:24:52
Done.
|
+ m_eNode(CFX_SaxNode::Unknown), |
+ m_dwID(0), |
+ m_bSkip(FALSE), |
+ m_pPrev(NULL), |
+ m_pNext(NULL) {} |
+ void* m_pNode; |
Tom Sepez
2016/05/18 20:14:12
nit: blank line before
dsinclair
2016/05/18 20:24:52
Done.
|
+ CFX_SaxNode m_eNode; |
+ uint32_t m_dwID; |
+ FX_BOOL m_bSkip; |
+ CFX_SAXItem* m_pPrev; |
+ CFX_SAXItem* m_pNext; |
+}; |
+ |
+class CFX_SAXCommentContext { |
+ public: |
+ CFX_SAXCommentContext() : m_iHeaderCount(0), m_iTailCount(0) {} |
+ int32_t m_iHeaderCount; |
+ int32_t m_iTailCount; |
+}; |
+ |
namespace { |
const uint32_t kSaxFileBufSize = 32768; |
+typedef void (CFX_SAXReader::*FX_SAXReader_LPFParse)(); |
+static const FX_SAXReader_LPFParse |
+ g_FX_SAXReader_LPFParse[static_cast<int>(CFX_SaxMode::MAX)] = { |
+ &CFX_SAXReader::ParseText, |
+ &CFX_SAXReader::ParseNodeStart, |
+ &CFX_SAXReader::ParseDeclOrComment, |
+ &CFX_SAXReader::ParseDeclNode, |
+ &CFX_SAXReader::ParseComment, |
+ &CFX_SAXReader::ParseCommentContent, |
+ &CFX_SAXReader::ParseTagName, |
+ &CFX_SAXReader::ParseTagAttributeName, |
+ &CFX_SAXReader::ParseTagAttributeEqual, |
+ &CFX_SAXReader::ParseTagAttributeValue, |
+ &CFX_SAXReader::ParseMaybeClose, |
+ &CFX_SAXReader::ParseTagClose, |
+ &CFX_SAXReader::ParseTagEnd, |
+ &CFX_SAXReader::ParseTargetData, |
+}; |
+ |
} // namespace |
CFX_SAXFile::CFX_SAXFile() |
@@ -165,7 +226,7 @@ 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) { |
- return (m_dwParseMode & FX_SAXPARSEMODE_NotSkipSpace) == 0 && ch < 0x21; |
+ return (m_dwParseMode & CFX_SaxParseMode_NotSkipSpace) == 0 && ch < 0x21; |
} |
int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile, |
uint32_t dwStart, |
@@ -177,8 +238,8 @@ int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile, |
return -1; |
} |
m_iState = 0; |
- m_eMode = FX_SAXMODE_Text; |
- m_ePrevMode = FX_SAXMODE_Text; |
+ m_eMode = CFX_SaxMode::Text; |
+ m_ePrevMode = CFX_SaxMode::Text; |
m_bCharData = FALSE; |
m_dwDataOffset = 0; |
m_pRoot = m_pCurItem = new CFX_SAXItem; |
@@ -186,23 +247,7 @@ int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile, |
m_dwParseMode = dwParseMode; |
return 0; |
} |
-typedef void (CFX_SAXReader::*FX_SAXReader_LPFParse)(); |
-static const FX_SAXReader_LPFParse g_FX_SAXReader_LPFParse[FX_SAXMODE_MAX] = { |
- &CFX_SAXReader::ParseText, |
- &CFX_SAXReader::ParseNodeStart, |
- &CFX_SAXReader::ParseDeclOrComment, |
- &CFX_SAXReader::ParseDeclNode, |
- &CFX_SAXReader::ParseComment, |
- &CFX_SAXReader::ParseCommentContent, |
- &CFX_SAXReader::ParseTagName, |
- &CFX_SAXReader::ParseTagAttributeName, |
- &CFX_SAXReader::ParseTagAttributeEqual, |
- &CFX_SAXReader::ParseTagAttributeValue, |
- &CFX_SAXReader::ParseMaybeClose, |
- &CFX_SAXReader::ParseTagClose, |
- &CFX_SAXReader::ParseTagEnd, |
- &CFX_SAXReader::ParseTargetData, |
-}; |
+ |
int32_t CFX_SAXReader::ContinueParse(IFX_Pause* pPause) { |
if (m_iState < 0 || m_iState > 99) { |
return m_iState; |
@@ -213,7 +258,7 @@ int32_t CFX_SAXReader::ContinueParse(IFX_Pause* pPause) { |
const uint8_t* pBuf = m_File.m_pBuf; |
while (index < size) { |
m_CurByte = pBuf[index]; |
- (this->*g_FX_SAXReader_LPFParse[m_eMode])(); |
+ (this->*g_FX_SAXReader_LPFParse[static_cast<int>(m_eMode)])(); |
index++; |
} |
m_File.m_dwCur += index; |
@@ -243,7 +288,7 @@ void CFX_SAXReader::ParseChar(uint8_t ch) { |
int32_t iLen = csEntity.GetLength(); |
if (iLen > 0) { |
if (csEntity[0] == '#') { |
- if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_sharp) == 0) { |
+ if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_sharp) == 0) { |
ch = 0; |
uint8_t w; |
if (iLen > 1 && csEntity[1] == 'x') { |
@@ -274,23 +319,23 @@ void CFX_SAXReader::ParseChar(uint8_t ch) { |
} |
} else { |
if (csEntity.Compare("amp") == 0) { |
- if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_amp) == 0) { |
+ if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_amp) == 0) { |
m_pszData[m_iEntityStart++] = '&'; |
} |
} else if (csEntity.Compare("lt") == 0) { |
- if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_lt) == 0) { |
+ if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_lt) == 0) { |
m_pszData[m_iEntityStart++] = '<'; |
} |
} else if (csEntity.Compare("gt") == 0) { |
- if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_gt) == 0) { |
+ if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_gt) == 0) { |
m_pszData[m_iEntityStart++] = '>'; |
} |
} else if (csEntity.Compare("apos") == 0) { |
- if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_apos) == 0) { |
+ if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_apos) == 0) { |
m_pszData[m_iEntityStart++] = '\''; |
} |
} else if (csEntity.Compare("quot") == 0) { |
- if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_quot) == 0) { |
+ if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_quot) == 0) { |
m_pszData[m_iEntityStart++] = '\"'; |
} |
} |
@@ -321,7 +366,7 @@ void CFX_SAXReader::ParseText() { |
} |
Push(); |
m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; |
- m_eMode = FX_SAXMODE_NodeStart; |
+ m_eMode = CFX_SaxMode::NodeStart; |
return; |
} |
if (m_iDataPos < 1 && SkipSpace(m_CurByte)) { |
@@ -331,41 +376,41 @@ void CFX_SAXReader::ParseText() { |
} |
void CFX_SAXReader::ParseNodeStart() { |
if (m_CurByte == '?') { |
- m_pCurItem->m_eNode = FX_SAXNODE_Instruction; |
- m_eMode = FX_SAXMODE_TagName; |
+ m_pCurItem->m_eNode = CFX_SaxNode::Instruction; |
+ m_eMode = CFX_SaxMode::TagName; |
return; |
} |
if (m_CurByte == '!') { |
- m_eMode = FX_SAXMODE_DeclOrComment; |
+ m_eMode = CFX_SaxMode::DeclOrComment; |
return; |
} |
if (m_CurByte == '/') { |
- m_eMode = FX_SAXMODE_TagEnd; |
+ m_eMode = CFX_SaxMode::TagEnd; |
return; |
} |
if (m_CurByte == '>') { |
Pop(); |
- m_eMode = FX_SAXMODE_Text; |
+ m_eMode = CFX_SaxMode::Text; |
return; |
} |
if (m_CurByte > 0x20) { |
m_dwDataOffset = m_File.m_dwBufIndex; |
- m_pCurItem->m_eNode = FX_SAXNODE_Tag; |
- m_eMode = FX_SAXMODE_TagName; |
+ m_pCurItem->m_eNode = CFX_SaxNode::Tag; |
+ m_eMode = CFX_SaxMode::TagName; |
AppendData(m_CurByte); |
} |
} |
void CFX_SAXReader::ParseDeclOrComment() { |
if (m_CurByte == '-') { |
- m_eMode = FX_SAXMODE_Comment; |
- m_pCurItem->m_eNode = FX_SAXNODE_Comment; |
+ m_eMode = CFX_SaxMode::Comment; |
+ m_pCurItem->m_eNode = CFX_SaxNode::Comment; |
if (m_pCommentContext == NULL) { |
m_pCommentContext = new CFX_SAXCommentContext; |
} |
m_pCommentContext->m_iHeaderCount = 1; |
m_pCommentContext->m_iTailCount = 0; |
} else { |
- m_eMode = FX_SAXMODE_DeclNode; |
+ m_eMode = CFX_SaxMode::DeclNode; |
m_dwDataOffset = m_File.m_dwBufIndex; |
m_SkipChar = '>'; |
m_SkipStack.Add('>'); |
@@ -375,7 +420,7 @@ void CFX_SAXReader::ParseDeclOrComment() { |
void CFX_SAXReader::ParseComment() { |
m_pCommentContext->m_iHeaderCount = 2; |
m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; |
- m_eMode = FX_SAXMODE_CommentContent; |
+ m_eMode = CFX_SaxMode::CommentContent; |
} |
void CFX_SAXReader::ParseCommentContent() { |
if (m_CurByte == '-') { |
@@ -387,7 +432,7 @@ void CFX_SAXReader::ParseCommentContent() { |
NotifyTargetData(); |
} |
Pop(); |
- m_eMode = FX_SAXMODE_Text; |
+ m_eMode = CFX_SaxMode::Text; |
} else { |
while (m_pCommentContext->m_iTailCount > 0) { |
AppendData('-'); |
@@ -408,15 +453,15 @@ void CFX_SAXReader::ParseTagName() { |
NotifyEnter(); |
} |
if (m_CurByte < 0x21) { |
- m_eMode = FX_SAXMODE_TagAttributeName; |
+ m_eMode = CFX_SaxMode::TagAttributeName; |
} else if (m_CurByte == '/' || m_CurByte == '?') { |
m_ePrevMode = m_eMode; |
- m_eMode = FX_SAXMODE_TagMaybeClose; |
+ m_eMode = CFX_SaxMode::TagMaybeClose; |
} else { |
if (m_pHandler) { |
NotifyBreak(); |
} |
- m_eMode = FX_SAXMODE_Text; |
+ m_eMode = CFX_SaxMode::Text; |
} |
} else { |
AppendData(m_CurByte); |
@@ -430,19 +475,19 @@ void CFX_SAXReader::ParseTagAttributeName() { |
m_iNameLength = m_iDataPos; |
m_iDataPos = 0; |
m_SkipChar = 0; |
- m_eMode = m_CurByte == '=' ? FX_SAXMODE_TagAttributeValue |
- : FX_SAXMODE_TagAttributeEqual; |
+ m_eMode = m_CurByte == '=' ? CFX_SaxMode::TagAttributeValue |
+ : CFX_SaxMode::TagAttributeEqual; |
return; |
} |
if (m_CurByte == '/' || m_CurByte == '>' || m_CurByte == '?') { |
if (m_CurByte == '/' || m_CurByte == '?') { |
m_ePrevMode = m_eMode; |
- m_eMode = FX_SAXMODE_TagMaybeClose; |
+ m_eMode = CFX_SaxMode::TagMaybeClose; |
} else { |
if (m_pHandler) { |
NotifyBreak(); |
} |
- m_eMode = FX_SAXMODE_Text; |
+ m_eMode = CFX_SaxMode::Text; |
} |
return; |
} |
@@ -454,12 +499,12 @@ void CFX_SAXReader::ParseTagAttributeName() { |
void CFX_SAXReader::ParseTagAttributeEqual() { |
if (m_CurByte == '=') { |
m_SkipChar = 0; |
- m_eMode = FX_SAXMODE_TagAttributeValue; |
+ m_eMode = CFX_SaxMode::TagAttributeValue; |
return; |
- } else if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { |
+ } else if (m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
m_iDataPos = m_iNameLength; |
AppendName(0x20); |
- m_eMode = FX_SAXMODE_TargetData; |
+ m_eMode = CFX_SaxMode::TargetData; |
ParseTargetData(); |
} |
} |
@@ -474,7 +519,7 @@ void CFX_SAXReader::ParseTagAttributeValue() { |
} |
} |
m_SkipChar = 0; |
- m_eMode = FX_SAXMODE_TagAttributeName; |
+ m_eMode = CFX_SaxMode::TagAttributeName; |
return; |
} |
ParseChar(m_CurByte); |
@@ -491,7 +536,7 @@ void CFX_SAXReader::ParseTagAttributeValue() { |
} |
void CFX_SAXReader::ParseMaybeClose() { |
if (m_CurByte == '>') { |
- if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { |
+ if (m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
m_iNameLength = m_iDataPos; |
m_iDataPos = 0; |
if (m_pHandler) { |
@@ -499,21 +544,21 @@ void CFX_SAXReader::ParseMaybeClose() { |
} |
} |
ParseTagClose(); |
- m_eMode = FX_SAXMODE_Text; |
- } else if (m_ePrevMode == FX_SAXMODE_TagName) { |
+ m_eMode = CFX_SaxMode::Text; |
+ } else if (m_ePrevMode == CFX_SaxMode::TagName) { |
AppendData('/'); |
- m_eMode = FX_SAXMODE_TagName; |
- m_ePrevMode = FX_SAXMODE_Text; |
+ m_eMode = CFX_SaxMode::TagName; |
+ m_ePrevMode = CFX_SaxMode::Text; |
ParseTagName(); |
- } else if (m_ePrevMode == FX_SAXMODE_TagAttributeName) { |
+ } else if (m_ePrevMode == CFX_SaxMode::TagAttributeName) { |
AppendName('/'); |
- m_eMode = FX_SAXMODE_TagAttributeName; |
- m_ePrevMode = FX_SAXMODE_Text; |
+ m_eMode = CFX_SaxMode::TagAttributeName; |
+ m_ePrevMode = CFX_SaxMode::Text; |
ParseTagAttributeName(); |
- } else if (m_ePrevMode == FX_SAXMODE_TargetData) { |
+ } else if (m_ePrevMode == CFX_SaxMode::TargetData) { |
AppendName('?'); |
- m_eMode = FX_SAXMODE_TargetData; |
- m_ePrevMode = FX_SAXMODE_Text; |
+ m_eMode = CFX_SaxMode::TargetData; |
+ m_ePrevMode = CFX_SaxMode::Text; |
ParseTargetData(); |
} |
} |
@@ -537,7 +582,7 @@ void CFX_SAXReader::ParseTagEnd() { |
NotifyEnd(); |
} |
Pop(); |
- m_eMode = FX_SAXMODE_Text; |
+ m_eMode = CFX_SaxMode::Text; |
} else { |
ParseChar(m_CurByte); |
} |
@@ -545,7 +590,7 @@ void CFX_SAXReader::ParseTagEnd() { |
void CFX_SAXReader::ParseTargetData() { |
if (m_CurByte == '?') { |
m_ePrevMode = m_eMode; |
- m_eMode = FX_SAXMODE_TagMaybeClose; |
+ m_eMode = CFX_SaxMode::TagMaybeClose; |
} else { |
AppendName(m_CurByte); |
} |
@@ -608,7 +653,7 @@ void CFX_SAXReader::SkipNode() { |
} else { |
Pop(); |
} |
- m_eMode = FX_SAXMODE_Text; |
+ m_eMode = CFX_SaxMode::Text; |
} |
} |
break; |
@@ -619,16 +664,17 @@ void CFX_SAXReader::SkipNode() { |
} |
void CFX_SAXReader::NotifyData() { |
- if (m_pCurItem->m_eNode == FX_SAXNODE_Tag) |
- m_pHandler->OnTagData(m_pCurItem->m_pNode, |
- m_bCharData ? FX_SAXNODE_CharData : FX_SAXNODE_Text, |
- CFX_ByteStringC(m_pszData, m_iDataLength), |
- m_File.m_dwCur + m_dwDataOffset); |
+ if (m_pCurItem->m_eNode == CFX_SaxNode::Tag) |
+ m_pHandler->OnTagData( |
+ m_pCurItem->m_pNode, |
+ m_bCharData ? CFX_SaxNode::CharData : CFX_SaxNode::Text, |
+ CFX_ByteStringC(m_pszData, m_iDataLength), |
+ m_File.m_dwCur + m_dwDataOffset); |
} |
void CFX_SAXReader::NotifyEnter() { |
- if (m_pCurItem->m_eNode == FX_SAXNODE_Tag || |
- m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { |
+ if (m_pCurItem->m_eNode == CFX_SaxNode::Tag || |
+ m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
m_pCurItem->m_pNode = |
m_pHandler->OnTagEnter(CFX_ByteStringC(m_pszData, m_iDataLength), |
m_pCurItem->m_eNode, m_dwNodePos); |
@@ -636,8 +682,8 @@ void CFX_SAXReader::NotifyEnter() { |
} |
void CFX_SAXReader::NotifyAttribute() { |
- if (m_pCurItem->m_eNode == FX_SAXNODE_Tag || |
- m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { |
+ if (m_pCurItem->m_eNode == CFX_SaxNode::Tag || |
+ m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
m_pHandler->OnTagAttribute(m_pCurItem->m_pNode, |
CFX_ByteStringC(m_pszName, m_iNameLength), |
CFX_ByteStringC(m_pszData, m_iDataLength)); |
@@ -645,19 +691,19 @@ void CFX_SAXReader::NotifyAttribute() { |
} |
void CFX_SAXReader::NotifyBreak() { |
- if (m_pCurItem->m_eNode == FX_SAXNODE_Tag) |
+ if (m_pCurItem->m_eNode == CFX_SaxNode::Tag) |
m_pHandler->OnTagBreak(m_pCurItem->m_pNode); |
} |
void CFX_SAXReader::NotifyClose() { |
- if (m_pCurItem->m_eNode == FX_SAXNODE_Tag || |
- m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { |
+ if (m_pCurItem->m_eNode == CFX_SaxNode::Tag || |
+ m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
m_pHandler->OnTagClose(m_pCurItem->m_pNode, m_dwNodePos); |
} |
} |
void CFX_SAXReader::NotifyEnd() { |
- if (m_pCurItem->m_eNode != FX_SAXNODE_Tag) |
+ if (m_pCurItem->m_eNode != CFX_SaxNode::Tag) |
return; |
m_pHandler->OnTagEnd(m_pCurItem->m_pNode, |
@@ -665,11 +711,11 @@ void CFX_SAXReader::NotifyEnd() { |
} |
void CFX_SAXReader::NotifyTargetData() { |
- if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { |
+ if (m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, |
CFX_ByteStringC(m_pszName, m_iNameLength), |
m_dwNodePos); |
- } else if (m_pCurItem->m_eNode == FX_SAXNODE_Comment) { |
+ } else if (m_pCurItem->m_eNode == CFX_SaxNode::Comment) { |
m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, |
CFX_ByteStringC(m_pszData, m_iDataLength), |
m_dwNodePos); |