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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? markup.cpp

?? 解析xml文件的強大包
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
	while ( iPosChild )
	{
		m_aPos[iPosChild].iElemParent = iPos;
		iPosChild = m_aPos[iPosChild].iElemNext;
	}
	x_ReleasePos( iPosVirtual );

	int nAdjust = node.strMeta.GetLength() - nReplace;
	x_Adjust( iPos, nAdjust, true );
	m_aPos[iPos].nLength += nAdjust;

	x_SetPos( m_iPosParent, m_iPos, 0 );
	return bWellFormed;
}

void CMarkup::x_DocChange( int nLeft, int nReplace, const CString& strInsert )
{
	// Insert strInsert int m_strDoc at nLeft replacing nReplace chars
	// Do this with only one buffer reallocation if it grows
	//
	int nDocLength = m_strDoc.GetLength();
	int nInsLength = strInsert.GetLength();
	int nNewLength = nInsLength + nDocLength - nReplace;

	// When creating a document, reduce reallocs by reserving string space
	// Allow for 1.5 times the current allocation
	int nBufferLen = nNewLength;
	int nAllocLen = ((CStringData*)((LPCTSTR)m_strDoc)-1)->nAllocLength;
	if ( nNewLength > nAllocLen )
	{
		nBufferLen += nBufferLen/2 + 128;
		if ( nBufferLen < nNewLength )
			nBufferLen = nNewLength;
	}
	_TCHAR* pDoc = m_strDoc.GetBuffer( nBufferLen );

	// Move part of old doc that goes after insert, then copy insert into it
	if ( nLeft+nReplace < nDocLength )
		memmove( &pDoc[nLeft+nInsLength], &pDoc[nLeft+nReplace], (nDocLength-nLeft-nReplace)*sizeof(_TCHAR) );
	memcpy( &pDoc[nLeft], strInsert, nInsLength*sizeof(_TCHAR) );
	m_strDoc.ReleaseBuffer( nNewLength );

}

void CMarkup::x_Adjust( int iPos, int nShift, bool bAfterPos /*=false*/ )
{
	// Loop through affected elements and adjust indexes
	// Algorithm:
	// 1. update children unless bAfterPos
	//    (if no children or bAfterPos is true, length of iPos not affected)
	// 2. update starts of next siblings and their children
	// 3. go up until there is a next sibling of a parent and update starts
	// 4. step 2
	int iPosTop = m_aPos[iPos].iElemParent;
	bool bPosFirst = bAfterPos; // mark as first to skip its children

	// Stop when we've reached the virtual parent (which has no tags)
	while ( m_aPos[iPos].StartTagLen() )
	{
		// Were we at containing parent of affected position?
		bool bPosTop = false;
		if ( iPos == iPosTop )
		{
			// Move iPosTop up one towards root
			iPosTop = m_aPos[iPos].iElemParent;
			bPosTop = true;
		}

		// Traverse to the next update position
		if ( ! bPosTop && ! bPosFirst && m_aPos[iPos].iElemChild )
		{
			// Depth first
			iPos = m_aPos[iPos].iElemChild;
		}
		else if ( m_aPos[iPos].iElemNext )
		{
			iPos = m_aPos[iPos].iElemNext;
		}
		else
		{
			// Look for next sibling of a parent of iPos
			// When going back up, parents have already been done except iPosTop
			while ( 1 )
			{
				iPos = m_aPos[iPos].iElemParent;
				if ( iPos == iPosTop )
					break;
				if ( m_aPos[iPos].iElemNext )
				{
					iPos = m_aPos[iPos].iElemNext;
					break;
				}
			}
		}
		bPosFirst = false;

		// Shift indexes at iPos
		if ( iPos != iPosTop )
			m_aPos[iPos].nStart += nShift;
		else
			m_aPos[iPos].nLength += nShift;
	}
}

int CMarkup::x_InsertNew( int iPosParent, int& iPosRel, CMarkup::NodePos& node )
{
	// Parent empty tag or tags with no content?
	bool bEmptyParentTag = iPosParent && m_aPos[iPosParent].IsEmptyElement();
	bool bNoContentParentTags = iPosParent && ! m_aPos[iPosParent].ContentLen();
	if ( node.nLength )
	{
		// Located at a non-element node
		if ( ! (node.nFlags & MNF_INSERT) )
			node.nStart += node.nLength;
	}
	else if ( iPosRel )
	{
		// Located at an element
		node.nStart = m_aPos[iPosRel].nStart;
		if ( ! (node.nFlags & MNF_INSERT) ) // follow iPosRel
			node.nStart += m_aPos[iPosRel].nLength;
	}
	else if ( bEmptyParentTag )
	{
		// Parent has no separate end tag, so split empty element
		if ( m_aPos[iPosParent].nFlags & MNF_NONENDED )
			node.nStart = m_aPos[iPosParent].StartContent();
		else
			node.nStart = m_aPos[iPosParent].StartContent() - 1;
	}
	else
	{
		if ( node.nFlags & (MNF_INSERT|MNF_REPLACE) )
			node.nStart = m_aPos[iPosParent].StartContent();
		else // before end tag
			node.nStart = m_aPos[iPosParent].StartAfter() - m_aPos[iPosParent].EndTagLen();
	}

	// Go up to start of next node, unless its splitting an empty element
	if ( ! (node.nFlags&(MNF_WITHNOLINES|MNF_REPLACE)) && ! bEmptyParentTag )
	{
		LPCTSTR szDoc = (LPCTSTR)m_strDoc;
		int nChar = node.nStart;
		if ( ! x_FindAny(szDoc,nChar) || szDoc[nChar] == _T('<') )
			node.nStart = nChar;
	}

	// Is insert relative to element position? (i.e. not other kind of node)
	if ( ! node.nLength )
	{
		// Modify iPosRel to reflect position before
		if ( iPosRel )
		{
			if ( node.nFlags & MNF_INSERT )
			{
				if ( ! (m_aPos[iPosRel].nFlags & MNF_FIRST) )
					iPosRel = m_aPos[iPosRel].iElemPrev;
				else
					iPosRel = 0;
			}
		}
		else if ( ! (node.nFlags & MNF_INSERT) )
		{
			// If parent has a child, add after last child
			if ( m_aPos[iPosParent].iElemChild )
				iPosRel = m_aPos[m_aPos[iPosParent].iElemChild].iElemPrev;
		}
	}

	// Get node length (used only by x_AddNode)
	node.nLength = node.strMeta.GetLength();

	// Prepare end of lines
	if ( (! (node.nFlags & MNF_WITHNOLINES)) && (bEmptyParentTag || bNoContentParentTags) )
		node.nStart += x_EOLLEN;
	if ( ! (node.nFlags & MNF_WITHNOLINES) )
		node.strMeta += x_EOL;

	// Calculate insert offset and replace length
	int nReplace = 0;
	int nInsertAt = node.nStart;
	if ( bEmptyParentTag )
	{
		CString strTagName = x_GetTagName( iPosParent );
		CString strFormat;
		if ( node.nFlags & MNF_WITHNOLINES )
			strFormat = _T(">");
		else
			strFormat = _T(">") x_EOL;
		strFormat += node.strMeta;
		strFormat += _T("</");
		strFormat += strTagName;
		node.strMeta = strFormat;
		if ( m_aPos[iPosParent].nFlags & MNF_NONENDED )
		{
			nInsertAt = m_aPos[iPosParent].StartAfter() - 1;
			nReplace = 0;
			m_aPos[iPosParent].nFlags ^= MNF_NONENDED;
		}
		else
		{
			nInsertAt = m_aPos[iPosParent].StartAfter() - 2;
			nReplace = 1;
			m_aPos[iPosParent].AdjustStartTagLen( -1 );
		}
		m_aPos[iPosParent].SetEndTagLen( 3 + strTagName.GetLength() );
	}
	else
	{
		if ( node.nFlags & MNF_REPLACE )
		{
			nInsertAt = m_aPos[iPosParent].StartContent();
			nReplace = m_aPos[iPosParent].ContentLen();
		}
		else if ( bNoContentParentTags )
		{
			node.strMeta = x_EOL + node.strMeta;
			nInsertAt = m_aPos[iPosParent].StartContent();
		}
	}
	x_DocChange( nInsertAt, nReplace, node.strMeta );
	return nReplace;
}

bool CMarkup::x_AddElem( LPCTSTR szName, int nValue, int nFlags )
{
	// Convert integer to string
	_TCHAR szVal[25];
	_stprintf( szVal, _T("%d"), nValue );
	return x_AddElem( szName, szVal, nFlags );
}

bool CMarkup::x_AddElem( LPCTSTR szName, LPCTSTR szValue, int nFlags )
{
	if ( nFlags & MNF_CHILD )
	{
		// Adding a child element under main position
		if ( ! m_iPos )
			return false;
	}

	// Locate where to add element relative to current node
	NodePos node( nFlags );
	int iPosParent, iPosBefore;
	if ( nFlags & MNF_CHILD )
	{
		iPosParent = m_iPos;
		iPosBefore = m_iPosChild;
	}
	else
	{
		iPosParent = m_iPosParent;
		iPosBefore = m_iPos;
		node.nStart = m_nNodeOffset;
		node.nLength = m_nNodeLength;
	}

	// Cannot have data in non-ended element
	if ( (nFlags&MNF_WITHNOEND) && szValue && szValue[0] )
		return false;

	// Allocate ElemPos structure for this element
	int iPos = x_GetFreePos();

	// Create string for insert
	// If no szValue is specified, an empty element is created
	// i.e. either <NAME>value</NAME> or <NAME/>
	//
	ElemPos* pElem = &m_aPos[iPos];
	int nLenName = (int)_tcslen(szName);
	if ( ! szValue || ! szValue[0] )
	{
		// <NAME/> empty element
		node.strMeta = _T("<");
		node.strMeta += szName;
		if ( nFlags & MNF_WITHNOEND )
		{
			node.strMeta += _T(">");
			pElem->SetStartTagLen( nLenName + 2 );
			pElem->nLength = nLenName + 2;
		}
		else
		{
			if ( nFlags & MNF_WITHXHTMLSPACE )
			{
				node.strMeta += _T(" />");
				pElem->SetStartTagLen( nLenName + 4 );
				pElem->nLength = nLenName + 4;
			}
			else
			{
				node.strMeta += _T("/>");
				pElem->SetStartTagLen( nLenName + 3 );
				pElem->nLength = nLenName + 3;
			}
		}
		pElem->SetEndTagLen( 0 );
	}
	else
	{
		// <NAME>value</NAME>
		CString strValue;
		if ( nFlags & MNF_WITHCDATA )
			strValue = x_EncodeCDATASection( szValue );
		else
			strValue = EscapeText( szValue, nFlags );
		int nLenValue = strValue.GetLength();
		node.strMeta = _T("<");
		node.strMeta += szName;
		node.strMeta += _T(">");
		node.strMeta += strValue;
		node.strMeta += _T("</");
		node.strMeta += szName;
		node.strMeta += _T(">");
		pElem->SetEndTagLen( nLenName + 3 );
		pElem->nLength = nLenName * 2 + nLenValue + 5;
		pElem->SetStartTagLen( nLenName + 2 );
	}

	// Insert
	int nReplace = x_InsertNew( iPosParent, iPosBefore, node );

	pElem->nStart = node.nStart;
	pElem->iElemChild = 0;
	if ( nFlags & MNF_WITHNOEND )
		pElem->nFlags = MNF_NONENDED;
	else
		pElem->nFlags = 0;
	x_LinkElem( iPosParent, iPosBefore, iPos );

	x_Adjust( iPos, node.strMeta.GetLength() - nReplace );

	if ( nFlags & MNF_CHILD )
		x_SetPos( m_iPosParent, iPosParent, iPos );
	else
		x_SetPos( iPosParent, iPos, 0 );
	return true;
}

CString CMarkup::x_GetSubDoc( int iPos ) const
{
	if ( iPos )
	{
		int nStart = m_aPos[iPos].nStart;
		int nNext = nStart + m_aPos[iPos].nLength;
		LPCTSTR szDoc = (LPCTSTR)m_strDoc;
		int nChar = nNext;
		if ( ! x_FindAny(szDoc,nChar) || szDoc[nChar] == _T('<') )
			nNext = nChar;
		return m_strDoc.Mid( nStart, nNext - nStart );
	}
	return _T("");
}

bool CMarkup::x_AddSubDoc( LPCTSTR szSubDoc, int nFlags )
{
	// Add subdocument, parse, and modify positions of affected elements
	//
	NodePos node( nFlags );
	int iPosParent, iPosBefore;
	if ( nFlags & MNF_CHILD )
	{
		// Add a subdocument under main position, before or after child
		if ( ! m_iPos )
			return false;
		iPosParent = m_iPos;
		iPosBefore = m_iPosChild;
	}
	else
	{
		// Add a subdocument under parent position, before or after main
		iPosParent = m_iPosParent;
		iPosBefore = m_iPos;
		node.nStart = m_nNodeOffset;
		node.nLength = m_nNodeLength;
	}

	// Parse subdocument
	bool bWellFormed = true;
	TokenPos token( szSubDoc, m_nFlags );
	int iPosVirtual = x_GetFreePos();
	m_aPos[iPosVirtual].ClearVirtualParent();
	m_aPos[iPosVirtual].SetLevel( m_aPos[iPosParent].Level() + 1 );
	int iPos = x_ParseElem( iPosVirtual, token );
	if ( (!iPos) || m_aPos[iPosVirtual].nFlags & MNF_ILLFORMED )
		bWellFormed = false;
	if ( m_aPos[iPosVirtual].nFlags & MNF_ILLDATA )
		m_aPos[iPosParent].nFlags |= MNF_ILLDATA;

	// Extract subdocument without leading/trailing nodes
	int nExtractStart = 0;
	int iPosLast = m_aPos[iPos].iElemPrev;
	if ( bWellFormed )
	{
		nExtractStart = m_aPos[iPos].nStart;
		int nExtractLength = m_aPos[iPos].nLength;
		if ( iPos != iPosLast )
		{
			nExtractLength = m_aPos[iPosLast].nStart - nExtractStart + m_aPos[iPosLast].nLength;
			bWellFormed = false; // treat as subdoc here, but return not well-formed
		}
		memcpy( node.strMeta.GetBuffer(nExtractLength+x_EOLLEN), &szSubDoc[nExtractStart], nExtractLength*sizeof(_TCHAR) );
		node.strMeta.ReleaseBuffer( nExtractLength );
	}
	else
	{
		node.strMeta = szSubDoc;
		node.nFlags |= MNF_WITHNOLINES;
	}

	// Insert
	int nReplace = x_InsertNew( iPosParent, iPosBefore, node );

	// Adjust and link in the inserted elements
	// iPosVirtual will stop it from affecting rest of document
	int nAdjust = node.nStart - nExtractStart;
	if ( iPos && nAdjust )
	{
		x_Adjust( iPos, nAdjust );
		m_aPos[iPos].nStart += nAdjust;
	}
	int iPosChild = iPos;
	while ( iPosChild )
	{
		int iPosNext = m_aPos[iPosChild].iElemNext;
		x_LinkElem( iPosParent, iPosBefore, iPosChild );
		iPosBefore = iPosChild;
		iPosChild = iPosNext;
	}
	x_ReleasePos( iPosVirtual );

	// Now adjust remainder of document
	x_Adjust( iPosLast, node.strMeta.GetLength() - nReplace, true );

	// Set position to top element of subdocument
	if ( nFlags & MNF_CHILD )
		x_SetPos( m_iPosParent, iPosParent, iPos );
	else // Main
		x_SetPos( m_iPosParent, iPos, 0 );
	return bWellFormed;
}

int CMarkup::x_RemoveElem( int iPos )
{
	// Remove element and all contained elements
	// Return new position
	//
	if ( ! iPos )
		return 0;

	// Determine whether any whitespace up to next tag
	int nAfterEnd = m_aPos[iPos].StartAfter();
	LPCTSTR szDoc = (LPCTSTR)m_strDoc;
	int nChar = nAfterEnd;
	if ( ! x_FindAny(szDoc,nChar) || szDoc[nChar] == _T('<') )
		nAfterEnd = nChar;

	// Remove from document, adjust affected indexes, and unlink
	int nLen = nAfterEnd - m_aPos[iPos].nStart;
	x_DocChange( m_aPos[iPos].nStart, nLen, CString() );
	x_Adjust( iPos, - nLen, true );
	int iPosPrev = x_UnlinkElem( iPos );
	x_CheckSavedPos();
	return iPosPrev;
}

void CMarkup::x_LinkElem( int iPosParent, int iPosBefore, int iPos )
{
	// Link in element, and initialize nFlags, and iElem indexes
	ElemPos* pElem = &m_aPos[iPos];
	pElem->iElemParent = iPosParen

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕在线观看不卡视频| 久久精品夜色噜噜亚洲aⅴ| k8久久久一区二区三区| 国产一区二区免费看| 国产乱妇无码大片在线观看| 国内久久精品视频| 国产河南妇女毛片精品久久久| 韩国v欧美v日本v亚洲v| 国产成人亚洲精品青草天美| 99在线精品一区二区三区| 色婷婷久久99综合精品jk白丝| 91国产成人在线| 欧美老肥妇做.爰bbww| 日韩一区二区免费电影| 精品欧美乱码久久久久久| 久久久久国产一区二区三区四区| 国产精品无码永久免费888| 亚洲人精品一区| 亚洲成人精品在线观看| 久久成人av少妇免费| 国产福利精品导航| 91福利国产成人精品照片| 制服丝袜在线91| 日韩免费视频一区| 最新日韩av在线| 日韩中文字幕91| 国产iv一区二区三区| 91国偷自产一区二区使用方法| 欧美一二三区精品| 国产精品久久久久一区二区三区| 一区二区理论电影在线观看| 极品瑜伽女神91| 在线观看亚洲成人| 久久蜜桃一区二区| 亚洲小说欧美激情另类| 国产99一区视频免费| 欧美日韩国产成人在线91| 欧美激情艳妇裸体舞| 亚洲国产成人av好男人在线观看| 国产一区二区免费看| 欧美日韩国产免费| 1区2区3区欧美| 狠狠久久亚洲欧美| 欧美久久久久久久久久| ㊣最新国产の精品bt伙计久久| 免费人成精品欧美精品 | 91精品免费在线观看| 国产欧美精品国产国产专区| 青娱乐精品视频在线| 在线观看视频一区二区 | 亚洲欧美视频在线观看视频| 精品在线观看免费| 欧美人狂配大交3d怪物一区| 亚洲人成在线观看一区二区| 国产麻豆成人传媒免费观看| 欧美一区二区国产| 肉丝袜脚交视频一区二区| 91麻豆视频网站| 国产精品国产三级国产| 国产精品一区一区| 久久综合狠狠综合久久综合88| 日日夜夜免费精品视频| 欧美日韩午夜影院| 亚洲国产综合人成综合网站| 一本高清dvd不卡在线观看| 亚洲欧洲精品一区二区三区| 国产99精品国产| 国产三级三级三级精品8ⅰ区| 麻豆精品一区二区三区| 日韩精品一区二| 久草精品在线观看| 337p日本欧洲亚洲大胆色噜噜| 麻豆国产欧美一区二区三区| 91麻豆精品国产自产在线观看一区 | 欧美视频完全免费看| 亚洲国产成人va在线观看天堂| 欧美午夜宅男影院| 亚洲综合精品自拍| 欧美剧在线免费观看网站| 日韩精品乱码av一区二区| 日韩欧美在线网站| 国产成人免费视频精品含羞草妖精| 精品毛片乱码1区2区3区| 国产精品一区二区三区99| 国产视频视频一区| av不卡免费在线观看| 亚洲男女一区二区三区| 欧美色老头old∨ideo| 日日骚欧美日韩| 日韩女优视频免费观看| 国产91在线观看| 一区二区三区不卡在线观看 | 99在线精品观看| 亚洲精品国产成人久久av盗摄| 欧美喷潮久久久xxxxx| 免费观看91视频大全| 久久久www成人免费无遮挡大片 | 欧美日韩免费高清一区色橹橹 | 97精品国产露脸对白| 亚洲成人av电影| 国产亚洲精品7777| 91成人看片片| 国产自产视频一区二区三区| 中文字幕成人在线观看| 精品视频999| 国产精品一二一区| 亚洲自拍与偷拍| 久久久精品一品道一区| 欧美午夜精品久久久久久孕妇| 蜜桃视频一区二区三区在线观看| 国产精品天干天干在观线| 欧美三级日韩三级国产三级| 国产精品99久久久久久有的能看 | 色综合中文字幕国产 | 成人精品一区二区三区四区| 亚洲aaa精品| 中文字幕第一区二区| 在线不卡一区二区| 成人教育av在线| 免费成人结看片| 亚洲国产va精品久久久不卡综合| 国产人伦精品一区二区| 欧美一区二区三区四区视频| 91亚洲大成网污www| 久久国产三级精品| 亚洲一二三级电影| 亚洲欧美在线视频观看| 久久嫩草精品久久久久| 91精品国产欧美一区二区18| 色综合天天狠狠| av在线不卡电影| 国产成人免费9x9x人网站视频| 免费观看在线色综合| 亚洲国产你懂的| 一区二区三区成人| 亚洲人123区| 成人免费小视频| 国产精品欧美经典| 国产日产欧产精品推荐色| 精品人在线二区三区| 欧美一二三区在线观看| 日韩午夜在线播放| 日韩一级精品视频在线观看| 欧美日韩黄色一区二区| 欧美日韩一二三区| 欧美日韩成人在线| 欧美区在线观看| 欧美日韩精品一区二区天天拍小说| 日本高清不卡一区| 色综合一区二区| 欧美视频一区二区三区四区 | 日韩一区和二区| 欧美电影免费观看高清完整版在线 | 欧美成人一区二区三区在线观看| 在线成人av影院| 日韩欧美一级精品久久| 日韩美一区二区三区| www国产亚洲精品久久麻豆| 精品国精品国产| 中文字幕不卡三区| 亚洲图片激情小说| 亚洲一区二区高清| 日韩黄色片在线观看| 久久精品国产久精国产爱| 国产精品一区二区无线| 北条麻妃国产九九精品视频| 色综合夜色一区| 777亚洲妇女| 久久精品日韩一区二区三区| 国产精品成人免费精品自在线观看| 亚洲视频小说图片| 日韩av中文在线观看| 国产精品一品视频| 91丨porny丨国产入口| 4438成人网| 国产欧美精品一区aⅴ影院| 亚洲黄色免费网站| 久久精品久久精品| 91片黄在线观看| 欧美tickling网站挠脚心| 国产精品国产馆在线真实露脸 | 激情综合五月天| 99视频在线精品| 日韩一级片在线播放| 亚洲国产精品激情在线观看| 亚洲国产精品久久久久婷婷884| 久久国产精品无码网站| 色屁屁一区二区| 2020国产精品自拍| 亚洲成人先锋电影| 成人一二三区视频| 欧美放荡的少妇| 亚洲欧洲99久久| 久久99精品国产.久久久久 | 偷拍一区二区三区四区| 国产成人aaaa| 欧美一级午夜免费电影| 亚洲欧美日韩在线播放| 国产精品2024| 日韩欧美亚洲一区二区|