亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? markup.cpp

?? 解析xml文件的強(qiáng)大包
?? CPP
?? 第 1 頁 / 共 5 頁
字號(hào):
			nLen += nCharLen;
			nChar += nCharLen;
		}
	}
	strText.ReleaseBuffer(nLen);
	return strText;
}


int CMarkup::FindNode( int nType )
{
	// Change current node position only if a node is found
	// If nType is 0 find any node, otherwise find node of type nType
	// Return type of node or 0 if not found
	// If found node is an element, change m_iPos

	// Determine where in document to start scanning for node
	int nTypeFound = 0;
	int nNodeOffset = m_nNodeOffset;
	if ( m_nNodeType > 1 )
	{
		// By-pass current node
		nNodeOffset += m_nNodeLength;
	}
	else
	{
		// Set position to begin looking for node
		nNodeOffset = 0; // default to start of document
		if ( m_iPos )
		{
			// After element
			nNodeOffset = m_aPos[m_iPos].StartAfter();
		}
		else if ( m_iPosParent )
		{
			// Immediately after start tag of parent
			if ( m_aPos[m_iPosParent].IsEmptyElement() )
				return 0;
			else
				nNodeOffset = m_aPos[m_iPosParent].StartContent();
		}
	}

	// Get nodes until we find what we're looking for
	int iPosNew = m_iPos;
	TokenPos token( m_strDoc, m_nFlags );
	NodePos node;
	token.nNext = nNodeOffset;
	do
	{
		nNodeOffset = token.nNext;
		nTypeFound = x_ParseNode( token, node );
		if ( nTypeFound == 0 )
		{
			// Check if we have reached the end of the parent element
			// Otherwise it is a lone end tag
			if ( m_iPosParent && nNodeOffset == m_aPos[m_iPosParent].StartContent()
					+ m_aPos[m_iPosParent].ContentLen() )
				return 0;
			nTypeFound = MNT_LONE_END_TAG;
		}
		else if ( nTypeFound < 0 )
		{
			if ( nTypeFound == -2 )
				return 0;
			// -1 is node error
			nTypeFound = MNT_NODE_ERROR;
		}
		else if ( nTypeFound == MNT_ELEMENT )
		{
			if ( iPosNew )
				iPosNew = m_aPos[iPosNew].iElemNext;
			else
				iPosNew = m_aPos[m_iPosParent].iElemChild;
			if ( ! iPosNew )
				return 0;
			if ( ! nType || (nType & nTypeFound) )
			{
				// Found element node, move position to this element
				x_SetPos( m_iPosParent, iPosNew, 0 );
				return m_nNodeType;
			}
			token.nNext = m_aPos[iPosNew].StartAfter();
		}
	}
	while ( nType && ! (nType & nTypeFound) );

	m_iPos = iPosNew;
	m_iPosChild = 0;
	m_nNodeOffset = nNodeOffset;
	m_nNodeLength = token.nNext - nNodeOffset;
	m_nNodeType = nTypeFound;
	MARKUP_SETDEBUGSTATE;
	return m_nNodeType;
}

bool CMarkup::RemoveNode()
{
	if ( m_iPos || m_nNodeLength )
	{
		x_RemoveNode( m_iPosParent, m_iPos, m_nNodeType, m_nNodeOffset, m_nNodeLength );
		m_iPosChild = 0;
		MARKUP_SETDEBUGSTATE;
		return true;
	}
	return false;
}

CString CMarkup::GetTagName() const
{
	// Return the tag name at the current main position
	CString strTagName;

	// This method is primarily for elements, however
	// it does return something for certain other nodes
	if ( m_nNodeLength )
	{
		switch ( m_nNodeType )
		{
		case MNT_PROCESSING_INSTRUCTION:
		case MNT_LONE_END_TAG:
			{
				// <?target or </tagname
				TokenPos token( m_strDoc, m_nFlags );
				token.nNext = m_nNodeOffset + 2;
				if ( x_FindName(token) )
					strTagName = x_GetToken( token );
			}
			break;
		case MNT_COMMENT:
			strTagName = _T("#comment");
			break;
		case MNT_CDATA_SECTION:
			strTagName = _T("#cdata-section");
			break;
		case MNT_DOCUMENT_TYPE:
			{
				// <!DOCTYPE name
				TokenPos token( m_strDoc, m_nFlags );
				token.nNext = m_nNodeOffset + 2;
				if ( x_FindName(token) && x_FindName(token) )
					strTagName = x_GetToken( token );
			}
			break;
		case MNT_TEXT:
		case MNT_WHITESPACE:
			strTagName = _T("#text");
			break;
		}
		return strTagName;
	}

	if ( m_iPos )
		strTagName = x_GetTagName( m_iPos );
	return strTagName;
}

bool CMarkup::IntoElem()
{
	// If there is no child position and IntoElem is called it will succeed in release 6.3
	// (A subsequent call to FindElem will find the first element)
	// The following short-hand behavior was never part of EDOM and was misleading
	// It would find a child element if there was no current child element position and go into it
	// It is removed in release 6.3, this change is NOT backwards compatible!
	// if ( ! m_iPosChild )
	//	FindChildElem();

	if ( m_iPos && m_nNodeType == MNT_ELEMENT )
	{
		x_SetPos( m_iPos, m_iPosChild, 0 );
		return true;
	}
	return false;
}

bool CMarkup::OutOfElem()
{
	// Go to parent element
	if ( m_iPosParent )
	{
		x_SetPos( m_aPos[m_iPosParent].iElemParent, m_iPosParent, m_iPos );
		return true;
	}
	return false;
}

CString CMarkup::GetAttribName( int n ) const
{
	// Return nth attribute name of main position
	TokenPos token( m_strDoc, m_nFlags );
	if ( m_iPos && m_nNodeType == MNT_ELEMENT )
		token.nNext = m_aPos[m_iPos].nStart + 1;
	else if ( m_nNodeLength && m_nNodeType == MNT_PROCESSING_INSTRUCTION )
		token.nNext = m_nNodeOffset + 2;
	else
		return _T("");
	if ( x_FindAttrib(token,NULL,n) )
		return x_GetToken( token );
	return _T("");
}

bool CMarkup::SavePos( LPCTSTR szPosName )
{
	// Save current element position in saved position map
	if ( szPosName )
	{
		SavedPos savedpos;
		if ( szPosName )
			savedpos.strName = szPosName;
		if ( m_iPosChild )
		{
			savedpos.iPos = m_iPosChild;
			savedpos.nSavedPosFlags |= SavedPosMap::SPM_CHILD;
		}
		else if ( m_iPos )
		{
			savedpos.iPos = m_iPos;
			savedpos.nSavedPosFlags |= SavedPosMap::SPM_MAIN;
		}
		else
		{
			savedpos.iPos = m_iPosParent;
		}
		savedpos.nSavedPosFlags |= SavedPosMap::SPM_USED;

		if ( ! m_mapSavedPos.pTable )
			m_mapSavedPos.AllocMapTable();
		int nSlot = m_mapSavedPos.Hash( szPosName );
		SavedPos* pSavedPos = m_mapSavedPos.pTable[nSlot];
		int nOffset = 0;
		if ( ! pSavedPos )
		{
			pSavedPos = new SavedPos[2];
			pSavedPos[1].nSavedPosFlags = SavedPosMap::SPM_LAST;
			m_mapSavedPos.pTable[nSlot] = pSavedPos;
		}
		else
		{
			while ( pSavedPos[nOffset].nSavedPosFlags & SavedPosMap::SPM_USED )
			{
				if ( pSavedPos[nOffset].strName == szPosName )
					break;
				if ( pSavedPos[nOffset].nSavedPosFlags & SavedPosMap::SPM_LAST )
				{
					int nNewSize = (nOffset + 6) * 2;
					SavedPos* pNewSavedPos = new SavedPos[nNewSize];
					for ( int nCopy=0; nCopy<=nOffset; ++nCopy )
						pNewSavedPos[nCopy] = pSavedPos[nCopy];
					pNewSavedPos[nOffset].nSavedPosFlags ^= SavedPosMap::SPM_LAST;
					pNewSavedPos[nNewSize-1].nSavedPosFlags = SavedPosMap::SPM_LAST;
					delete [] pSavedPos;
					pSavedPos = pNewSavedPos;
					m_mapSavedPos.pTable[nSlot] = pSavedPos;
					++nOffset;
					break;
				}
				++nOffset;
			}
		}
		if ( pSavedPos[nOffset].nSavedPosFlags & SavedPosMap::SPM_LAST )
			savedpos.nSavedPosFlags |= SavedPosMap::SPM_LAST;
		pSavedPos[nOffset] = savedpos;

		/*
		// To review hash table balance, uncomment and watch strBalance
		CString strBalance, strSlot;
		for ( nSlot=0; nSlot < SavedPosMap::SPM_SIZE; ++nSlot )
		{
			pSavedPos = m_mapSavedPos.pTable[nSlot];
			int nCount = 0;
			while ( pSavedPos && pSavedPos->nSavedPosFlags & SavedPosMap::SPM_USED )
			{
				++nCount;
				if ( pSavedPos->nSavedPosFlags & SavedPosMap::SPM_LAST )
					break;
				++pSavedPos;
			}
			strSlot.Format( _T("%d "), nCount );
			strBalance += strSlot;
		}
		*/

		return true;
	}
	return false;
}

bool CMarkup::RestorePos( LPCTSTR szPosName )
{
	// Restore element position if found in saved position map
	if ( szPosName && m_mapSavedPos.pTable )
	{
		int nSlot = m_mapSavedPos.Hash( szPosName );
		SavedPos* pSavedPos = m_mapSavedPos.pTable[nSlot];
		if ( pSavedPos )
		{
			int nOffset = 0;
			while ( pSavedPos[nOffset].nSavedPosFlags & SavedPosMap::SPM_USED )
			{
				if ( pSavedPos[nOffset].strName == szPosName )
				{
					int i = pSavedPos[nOffset].iPos;
					if ( pSavedPos[nOffset].nSavedPosFlags & SavedPosMap::SPM_CHILD )
						x_SetPos( m_aPos[m_aPos[i].iElemParent].iElemParent, m_aPos[i].iElemParent, i );
					else if ( pSavedPos[nOffset].nSavedPosFlags & SavedPosMap::SPM_MAIN )
						x_SetPos( m_aPos[i].iElemParent, i, 0 );
					else
						x_SetPos( i, 0, 0 );
					return true;
				}
				if ( pSavedPos[nOffset].nSavedPosFlags & SavedPosMap::SPM_LAST )
					break;
				++nOffset;
			}
		}
	}
	return false;
}

bool CMarkup::RemoveElem()
{
	// Remove current main position element
	if ( m_iPos && m_nNodeType == MNT_ELEMENT )
	{
		int iPos = x_RemoveElem( m_iPos );
		x_SetPos( m_iPosParent, iPos, 0 );
		return true;
	}
	return false;
}

bool CMarkup::RemoveChildElem()
{
	// Remove current child position element
	if ( m_iPosChild )
	{
		int iPosChild = x_RemoveElem( m_iPosChild );
		x_SetPos( m_iPosParent, m_iPos, iPosChild );
		return true;
	}
	return false;
}


//////////////////////////////////////////////////////////////////////
// Private Methods
//////////////////////////////////////////////////////////////////////

CString CMarkup::x_GetLastError()
{
	CString strError;
#ifdef _WIN32_WCE
	strError.ReleaseBuffer( ::FormatMessage(0x1200,0,::GetLastError(),0,strError.GetBuffer(100),100,0) );
#else
	strError = strerror(errno);
#endif
	for ( int nChar=0; nChar<strError.GetLength(); ++nChar )
		if ( strError[nChar] == '\r' || strError[nChar] == '\n' )
		{
			strError = strError.Left( nChar ); // no trailing newline
			break;
		}
	return strError;
}

bool CMarkup::x_AllocPosArray( int nNewSize /*=0*/ )
{
	// Resize m_aPos when the document is created or the array is filled
	// The PosArray class is implemented using segments to reduce contiguous memory requirements
	// It reduces reallocations (copying of memory) since this only occurs within one segment
	// The "Grow By" algorithm ensures there are no reallocations after 2 segments
	//
	if ( ! nNewSize )
		nNewSize = m_iPosFree + (m_iPosFree>>1); // Grow By: multiply size by 1.5
	if ( m_aPos.GetSize() < nNewSize )
	{
		// Grow By: new size can be at most one more complete segment
		int nSeg = (m_aPos.GetSize()?m_aPos.GetSize()-1:0) >> m_aPos.PA_SEGBITS;
		int nNewSeg = (nNewSize-1) >> m_aPos.PA_SEGBITS;
		if ( nNewSeg > nSeg + 1 )
		{
			nNewSeg = nSeg + 1;
			nNewSize = (nNewSeg+1) << m_aPos.PA_SEGBITS;
		}

		// Allocate array of segments
		if ( m_aPos.nSegs <= nNewSeg )
		{
			int nNewSegments = 4 + nNewSeg * 2;
			char* pNewSegments = new char[nNewSegments*sizeof(char*)];
			if ( m_aPos.SegsUsed() )
				memcpy( pNewSegments, m_aPos.pSegs, m_aPos.SegsUsed()*sizeof(char*) );
			if ( m_aPos.pSegs )
				delete[] (char*)m_aPos.pSegs;
			m_aPos.pSegs = (ElemPos**)pNewSegments;
			m_aPos.nSegs = nNewSegments;
		}

		// Calculate segment sizes
		int nSegSize = m_aPos.GetSize() - (nSeg << m_aPos.PA_SEGBITS);
		int nNewSegSize = nNewSize - (nNewSeg << m_aPos.PA_SEGBITS);

		// Complete first segment
		int nFullSegSize = 1 << m_aPos.PA_SEGBITS;
		if ( nSeg < nNewSeg && nSegSize < nFullSegSize )
		{
			char* pNewFirstSeg = new char[ nFullSegSize * sizeof(ElemPos) ];
			if ( nSegSize )
			{
				// Reallocate
				memcpy( pNewFirstSeg, m_aPos.pSegs[nSeg], nSegSize * sizeof(ElemPos) );
				delete[] (char*)m_aPos.pSegs[nSeg];
			}
			m_aPos.pSegs[nSeg] = (ElemPos*)pNewFirstSeg;
		}

		// New segment
		char* pNewSeg = new char[ nNewSegSize * sizeof(ElemPos) ];
		if ( nNewSeg == nSeg && nSegSize )
		{
			// Reallocate
			memcpy( pNewSeg, m_aPos.pSegs[nSeg], nSegSize * sizeof(ElemPos) );
			delete[] (char*)m_aPos.pSegs[nSeg];
		}
		m_aPos.pSegs[nNewSeg] = (ElemPos*)pNewSeg;
		m_aPos.nSize = nNewSize;
	}
	return true;
}

bool CMarkup::x_ParseDoc()
{
	// Preserve pre-parse result
	CString strResult = m_strError;

	// Reset indexes
	ResetPos();
	m_mapSavedPos.RemoveAll();

	// Starting size of position array: 1 element per 64 bytes of document
	// Tight fit when parsing small doc, only 0 to 2 reallocs when parsing large doc
	// Start at 8 when creating new document
	m_iPosFree = 1;
	x_AllocPosArray( m_strDoc.GetLength() / 64 + 8 );
	m_iPosDeleted = 0;

	// Parse document
	m_aPos[0].ClearVirtualParent();
	if ( m_strDoc.GetLength() )
	{
		TokenPos token( m_strDoc, m_nFlags );
		int iPos = x_ParseElem( 0, token );
		m_aPos[0].nLength = m_strDoc.GetLength();
		if ( iPos > 0 )
		{
			m_aPos[0].iElemChild = iPos;
			if ( m_aPos[iPos].iElemNext )
				m_strError = _T("Root element has sibling");
		}
		else
			m_strError = _T("No root element");
	}
	else
		m_strError = _T("Empty document");

	ResetPos();

	// Combine preserved result with parse error
	if ( ! strResult.IsEmpty() )
	{
		if ( m_strError.IsEmpty() )
			m_strError = strResult;
		else
			m_strError = strResult + _T(", ") + m_strError;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久伊99综合婷婷久久伊| 久久精品人人爽人人爽| 国内外精品视频| 一区二区三区国产豹纹内裤在线| 4438成人网| 色综合天天在线| 国产精品羞羞答答xxdd| 日韩成人精品在线| 亚洲欧美电影院| 国产视频一区在线播放| 91精品国产色综合久久不卡电影| 成人看片黄a免费看在线| 奇米影视在线99精品| 亚洲卡通欧美制服中文| 久久久久久久久岛国免费| 欧美男人的天堂一二区| 91亚洲男人天堂| 国产成人av一区二区| 蜜芽一区二区三区| 亚洲曰韩产成在线| 亚洲免费视频中文字幕| 国产日韩欧美在线一区| 日韩欧美国产不卡| 欧美一区二区三区播放老司机| thepron国产精品| 福利电影一区二区三区| 精品无码三级在线观看视频| 亚洲一区中文在线| 自拍偷自拍亚洲精品播放| 国产精品污网站| 国产亚洲自拍一区| 久久女同性恋中文字幕| 日韩三级电影网址| 日韩免费观看高清完整版| 欧美在线看片a免费观看| 一本在线高清不卡dvd| 成人精品gif动图一区| 国产成+人+日韩+欧美+亚洲| 国产剧情一区二区| 成人性生交大片免费看在线播放| 国产精品白丝jk白祙喷水网站| 狠狠色伊人亚洲综合成人| 激情丁香综合五月| 国产在线精品国自产拍免费| 国产一区视频网站| 精品一区二区三区视频| 久99久精品视频免费观看| 久88久久88久久久| 国产成人亚洲综合a∨婷婷图片| 国产成人免费视| 99热这里都是精品| 欧美亚洲国产一区二区三区va| 欧美日韩五月天| 在线不卡免费欧美| 日韩欧美在线123| 国产日韩v精品一区二区| 国产精品久久久久久妇女6080| 亚洲日本乱码在线观看| 一区二区三区高清不卡| 日韩高清欧美激情| 极品销魂美女一区二区三区| 韩国av一区二区三区在线观看| 高清视频一区二区| 色综合天天性综合| 欧美日韩激情一区二区| 精品国产91乱码一区二区三区 | 国产成人免费视频网站高清观看视频| 国产精品综合在线视频| 色综合久久久久综合体| 欧美精品在线观看播放| 久久婷婷国产综合国色天香| 国产精品国产自产拍高清av王其| 一区二区三区四区精品在线视频 | 亚洲综合免费观看高清在线观看| 日韩国产在线观看一区| 国产精品 欧美精品| 91香蕉视频黄| 日韩一级成人av| 国产精品久久久久影视| 亚洲免费在线视频一区 二区| 日韩中文字幕麻豆| 成人激情文学综合网| 欧美日韩国产免费一区二区| 久久九九久久九九| 亚洲一区二区三区激情| 国产福利一区在线| 欧美午夜片在线看| 久久久久国产一区二区三区四区| 亚洲精品高清在线| 国产一区二区三区电影在线观看| 色婷婷精品久久二区二区蜜臂av| 精品欧美一区二区三区精品久久 | 久久精品国产99国产精品| 不卡一二三区首页| 日韩你懂的在线观看| 亚洲三级电影网站| 国产精品一线二线三线精华| 欧美在线不卡一区| 中文av一区特黄| 麻豆高清免费国产一区| 99r国产精品| 久久伊人中文字幕| 人人超碰91尤物精品国产| 91一区二区三区在线播放| 国产亚洲美州欧州综合国| 婷婷开心激情综合| 91免费视频网址| 欧美激情资源网| 久久精品噜噜噜成人88aⅴ| 色狠狠综合天天综合综合| 国产日韩v精品一区二区| 美女mm1313爽爽久久久蜜臀| 欧美在线一二三四区| 国产精品成人免费精品自在线观看 | 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 日本中文字幕不卡| 在线免费视频一区二区| 国产精品久久久久久久久动漫| 韩国一区二区三区| 欧美va亚洲va香蕉在线| 七七婷婷婷婷精品国产| 欧美无砖砖区免费| 亚洲精品成人天堂一二三| 粉嫩欧美一区二区三区高清影视| 精品国产电影一区二区| 美女任你摸久久 | 在线观看91精品国产入口| 中文字幕亚洲区| 播五月开心婷婷综合| 国产欧美中文在线| 国内精品伊人久久久久av影院| 日韩欧美精品在线| 久久99精品久久久| 欧美tickling挠脚心丨vk| 日日摸夜夜添夜夜添国产精品| 欧美狂野另类xxxxoooo| 同产精品九九九| 欧美一区二区三区白人| 麻豆精品一区二区| 精品国产一二三| 国产资源在线一区| 欧美韩国一区二区| 99久久精品国产网站| 亚洲另类春色校园小说| 在线视频中文字幕一区二区| 亚洲国产欧美一区二区三区丁香婷| 91黄色免费版| 亚洲国产精品自拍| 91精品国产综合久久久久久| 日产国产欧美视频一区精品| 777亚洲妇女| 国产麻豆精品一区二区| 国产精品久久久久久一区二区三区| 99r国产精品| 亚洲成av人片在线| 日韩亚洲电影在线| 国产综合色视频| 中国色在线观看另类| 91色porny在线视频| 亚洲午夜电影网| 制服丝袜中文字幕亚洲| 韩国女主播成人在线观看| 国产精品久久久久久久久免费樱桃 | 欧美bbbbb| 国产欧美精品一区二区色综合 | 国产人久久人人人人爽| 99久久综合精品| 日韩专区中文字幕一区二区| 精品国产免费久久| 成人国产亚洲欧美成人综合网| 一区二区高清在线| 日韩美女一区二区三区四区| 成人精品国产免费网站| 丝袜国产日韩另类美女| 久久精品一区八戒影视| 在线观看一区二区精品视频| 久久69国产一区二区蜜臀| 亚洲色图视频网站| 欧美情侣在线播放| 成人午夜伦理影院| 婷婷亚洲久悠悠色悠在线播放| 国产日韩视频一区二区三区| 欧洲色大大久久| 国产精品自产自拍| 无吗不卡中文字幕| 中文字幕一区二区三区精华液 | 美女久久久精品| 亚洲色图欧美在线| 日韩欧美一区二区不卡| 色综合久久综合网欧美综合网 | 成人黄页在线观看| 视频一区中文字幕| 亚洲三级免费电影| 久久久久一区二区三区四区| 欧美性猛交xxxxxx富婆| 粉嫩蜜臀av国产精品网站| 美女免费视频一区二区| 一区二区三区日本| 国产精品伦理在线| 精品国产一区二区三区四区四 |