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

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

?? markupstl.cpp

?? 解析xml文件的強大包
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
	{
		// Starting at token.nNext, bypass whitespace and find the next token
		nChar = token.nNext;
		nPreSpaceStart = nChar;
		if ( ! x_FindAny(szDoc,nChar) )
			break;
		nPreSpaceLength = nChar - nPreSpaceStart;

		// Is it an opening quote?
		cFirstChar = szDoc[nChar];
		if ( cFirstChar == '\"' || cFirstChar == '\'' )
		{
			token.nTokenFlags |= MNF_QUOTED;

			// Move past opening quote
			++nChar;
			token.nL = nChar;

			// Look for closing quote
			while ( szDoc[nChar] && szDoc[nChar] != cFirstChar )
				++nChar;

			// Set right to before closing quote
			token.nR = nChar - 1;

			// Set nChar past closing quote unless at end of document
			if ( szDoc[nChar] )
				++nChar;
		}
		else
		{
			token.nTokenFlags &= ~MNF_QUOTED;

			// Go until special char or whitespace
			token.nL = nChar;
			if ( bAfterEqual )
			{
				while ( szDoc[nChar] && ! strchr(" \t\n\r>",szDoc[nChar]) )
					++nChar;
			}
			else
			{
				while ( szDoc[nChar] && ! strchr("= \t\n\r>/?",szDoc[nChar]) )
					++nChar;
			}

			// Adjust end position if it is one special char
			if ( nChar == token.nL )
				++nChar; // it is a special char
			token.nR = nChar - 1;
		}

		// nNext points to one past last char of token
		token.nNext = nChar;

		if ( ! bAfterEqual && ! (token.nTokenFlags&MNF_QUOTED) )
		{
			// Is it an equal sign?
			char cChar = szDoc[token.nL];
			if ( cChar == '=' )
			{
				bAfterEqual = true;
				continue;
			}

			// Is it the right angle bracket?
			if ( cChar == '>' || cChar == '/' || cChar == '?' )
			{
				token.nNext = nPreSpaceStart;
				break; // attrib not found
			}

			if ( nFoundAttribNameR )
				break;

			// Attribute name
			if ( nAttrib != -1 )
			{
				if ( ! szAttrib )
				{
					if ( nAttrib == n )
						return true; // found by number
				}
				else if ( token.Match(szAttrib) )
				{
					// Matched attrib name, go forward to value
					nFoundAttribNameR = token.nR;
					token.nPreSpaceStart = nPreSpaceStart;
					token.nPreSpaceLength = nPreSpaceLength;
				}
			}
			++nAttrib;
		}
		else if ( nFoundAttribNameR )
			break;
		bAfterEqual = false;
	}

	if ( nFoundAttribNameR )
	{
		if ( ! bAfterEqual )
		{
			// when attribute has no value the value is the attribute name
			token.nL = token.nPreSpaceStart + token.nPreSpaceLength;
			token.nR = nFoundAttribNameR;
			token.nNext = nFoundAttribNameR + 1;
		}
		return true; // found by name
	}
	return false; // not found
}

string CMarkupSTL::x_GetAttrib( int iPos, const char* szAttrib ) const
{
	// Return the value of the attrib
	TokenPos token( m_strDoc, m_nFlags );
	if ( iPos && m_nNodeType == MNT_ELEMENT )
		token.nNext = m_aPos[iPos].nStart + 1;
	else if ( iPos == m_iPos && m_nNodeLength && m_nNodeType == MNT_PROCESSING_INSTRUCTION )
		token.nNext = m_nNodeOffset + 2;
	else
		return "";

	if ( szAttrib && x_FindAttrib( token, szAttrib ) )
		return UnescapeText( &token.szDoc[token.nL], token.Length() );
	return "";
}

bool CMarkupSTL::x_SetAttrib( int iPos, const char* szAttrib, int nValue )
{
	// Convert integer to string and call SetChildAttrib
	char szVal[25];
	sprintf( szVal, "%d", nValue );
	return x_SetAttrib( iPos, szAttrib, szVal );
}

bool CMarkupSTL::x_SetAttrib( int iPos, const char* szAttrib, const char* szValue )
{
	// Set attribute in iPos element
	TokenPos token( m_strDoc, m_nFlags );
	if ( iPos && m_nNodeType == MNT_ELEMENT )
		token.nNext = m_aPos[iPos].nStart + 1;
	else if ( iPos == m_iPos && m_nNodeLength && m_nNodeType == MNT_PROCESSING_INSTRUCTION )
		token.nNext = m_nNodeOffset + 2;
	else
		return false;

	// Create insertion text depending on whether attribute already exists
	// Decision: for empty value leaving attrib="" instead of removing attrib
	int nReplace = 0;
	int nInsertAt;
	string strInsert;
	strInsert += x_ATTRIBQUOTE;
	strInsert += EscapeText( szValue, MNF_ESCAPEQUOTES );
	strInsert += x_ATTRIBQUOTE;
	if ( x_FindAttrib( token, szAttrib ) )
	{
		// Replace value
		nInsertAt = token.nL - ((token.nTokenFlags&MNF_QUOTED)?1:0);
		nReplace = token.Length() + ((token.nTokenFlags&MNF_QUOTED)?2:0);
	}
	else
	{
		// Insert string name value pair
		string strFormat;
		strFormat = " ";
		strFormat += szAttrib;
		strFormat += "=";
		strFormat += strInsert;
		strInsert = strFormat;
		nInsertAt = token.nNext;
	}

	x_DocChange( nInsertAt, nReplace, strInsert );
	int nAdjust = (int)strInsert.size() - nReplace;
	if ( m_nNodeType == MNT_PROCESSING_INSTRUCTION )
	{
		x_AdjustForNode( m_iPosParent, m_iPos, nAdjust );
		m_nNodeLength += nAdjust;
		MARKUP_SETDEBUGSTATE;
		return true;
	}
	m_aPos[iPos].AdjustStartTagLen( nAdjust );
	m_aPos[iPos].nLength += nAdjust;
	x_Adjust( iPos, nAdjust );
	MARKUP_SETDEBUGSTATE;
	return true;
}


bool CMarkupSTL::x_CreateNode( string& strNode, int nNodeType, const char* szText )
{
	// Set strNode based on nNodeType and szData
	// Return false if szData would jeopardize well-formed document
	//
	switch ( nNodeType )
	{
	case MNT_PROCESSING_INSTRUCTION:
		strNode = "<?";
		strNode += szText;
		strNode += "?>";
		break;
	case MNT_COMMENT:
		strNode = "<!--";
		strNode += szText;
		strNode += "-->";
		break;
	case MNT_ELEMENT:
		strNode = "<";
		strNode += szText;
		strNode += "/>";
		break;
	case MNT_TEXT:
	case MNT_WHITESPACE:
		strNode = EscapeText( szText );
		break;
	case MNT_DOCUMENT_TYPE:
		strNode = szText;
		break;
	case MNT_LONE_END_TAG:
		return false;
	case MNT_CDATA_SECTION:
		if ( strstr(szText,"]]>") != NULL )
			return false;
		strNode = "<![CDATA[";
		strNode += szText;
		strNode += "]]>";
		break;
	}
	return true;
}

string CMarkupSTL::x_EncodeCDATASection( const char* szData )
{
	// Split CDATA Sections if there are any end delimiters
	string strData = "<![CDATA[";
	const char* pszNextStart = szData;
	const char* pszEnd = strstr( szData, "]]>" );
	while ( pszEnd )
	{
		strData += string( pszNextStart, (int)(pszEnd - pszNextStart) );
		strData += "]]]]><![CDATA[>";
		pszNextStart = pszEnd + 3;
		pszEnd = strstr( pszNextStart, "]]>" );
	}
	strData += pszNextStart;
	strData += "]]>";
	return strData;
}

bool CMarkupSTL::x_SetData( int iPos, int nValue )
{
	// Convert integer to string
	char szVal[25];
	sprintf( szVal, "%d", nValue );
	return x_SetData( iPos, szVal, 0 );
}

bool CMarkupSTL::x_SetData( int iPos, const char* szData, int nFlags )
{
	// Set data at specified position
	// if nFlags==1, set content of element to a CDATA Section
	string strInsert;

	if ( iPos == m_iPos && m_nNodeLength )
	{
		// Not an element
		if ( ! x_CreateNode(strInsert, m_nNodeType, szData) )
			return false;
		x_DocChange( m_nNodeOffset, m_nNodeLength, strInsert );
		x_AdjustForNode( m_iPosParent, iPos, (int)strInsert.size() - m_nNodeLength );
		m_nNodeLength = (int)strInsert.size();
		MARKUP_SETDEBUGSTATE;
		return true;
	}

	// Set data in iPos element
	if ( ! iPos || m_aPos[iPos].iElemChild )
		return false;

	// Build strInsert from szData based on nFlags
	if ( nFlags & MNF_WITHCDATA )
		strInsert = x_EncodeCDATASection( szData );
	else
		strInsert = EscapeText( szData, nFlags );

	// Insert
	NodePos node( MNF_WITHNOLINES|MNF_REPLACE );
	node.strMeta = strInsert;
	int iPosBefore = 0;
	int nReplace = x_InsertNew( iPos, iPosBefore, node );
	int nAdjust = (int)node.strMeta.size() - nReplace;
	x_Adjust( iPos, nAdjust );
	m_aPos[iPos].nLength += nAdjust;
	if ( m_aPos[iPos].nFlags & MNF_ILLDATA )
		m_aPos[iPos].nFlags &= ~MNF_ILLDATA;
	MARKUP_SETDEBUGSTATE;
	return true;
}

string CMarkupSTL::x_GetData( int iPos ) const
{
	if ( iPos == m_iPos && m_nNodeLength )
	{
		if ( m_nNodeType == MNT_COMMENT )
			return m_strDoc.substr( m_nNodeOffset+4, m_nNodeLength-7 );
		else if ( m_nNodeType == MNT_PROCESSING_INSTRUCTION )
			return m_strDoc.substr( m_nNodeOffset+2, m_nNodeLength-4 );
		else if ( m_nNodeType == MNT_CDATA_SECTION )
			return m_strDoc.substr( m_nNodeOffset+9, m_nNodeLength-12 );
		else if ( m_nNodeType == MNT_TEXT )
			return UnescapeText( &(m_strDoc.c_str())[m_nNodeOffset], m_nNodeLength );
		else if ( m_nNodeType == MNT_LONE_END_TAG )
			return m_strDoc.substr( m_nNodeOffset+2, m_nNodeLength-3 );
		else
			return m_strDoc.substr( m_nNodeOffset, m_nNodeLength );
	}

	// Return a string representing data between start and end tag
	// Return empty string if there are any children elements
	string strData;
	if ( ! m_aPos[iPos].iElemChild && ! m_aPos[iPos].IsEmptyElement() )
	{
		// Quick scan for any tags inside content
		int nContentLen = m_aPos[iPos].ContentLen();
		int nStartContent = m_aPos[iPos].StartContent();
		const char* pszContent = &(m_strDoc.c_str())[nStartContent];
		const char* pszTag = strchr( pszContent, '<' );
		if ( pszTag && ((int)(pszTag-pszContent) < nContentLen) )
		{
			// Concatenate all CDATA Sections and text nodes, ignore other nodes
			TokenPos token( m_strDoc, m_nFlags );
			token.nNext = nStartContent;
			NodePos node;
			while ( token.nNext < nStartContent + nContentLen )
			{
				x_ParseNode( token, node );
				if ( node.nNodeType == MNT_TEXT )
					strData += UnescapeText( &token.szDoc[node.nStart], node.nLength );
				else if ( node.nNodeType == MNT_CDATA_SECTION )
					strData += m_strDoc.substr( node.nStart+9, node.nLength-12 );
			}
		}
		else // no tags
			strData = UnescapeText( &(m_strDoc.c_str())[nStartContent], nContentLen );
	}
	return strData;
}

string CMarkupSTL::x_GetElemContent( int iPos ) const
{
	if ( iPos && m_aPos[iPos].ContentLen() )
		return m_strDoc.substr( m_aPos[iPos].StartContent(), m_aPos[iPos].ContentLen() );
	return "";
}

bool CMarkupSTL::x_SetElemContent( const char* szContent )
{
	// Set data in iPos element only
	if ( ! m_iPos )
		return false;

	if ( m_nNodeLength )
		return false; // not an element

	// Unlink all children
	int iPos = m_iPos;
	int iPosChild = m_aPos[iPos].iElemChild;
	bool bHadChild = (iPosChild != 0);
	while ( iPosChild )
		iPosChild = x_ReleaseSubDoc( iPosChild );
	if ( bHadChild )
		x_CheckSavedPos();

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

	// Prepare insert and adjust offsets
	NodePos node( MNF_WITHNOLINES|MNF_REPLACE );
	node.strMeta = szContent;
	int iPosBefore = 0;
	int nReplace = x_InsertNew( iPos, iPosBefore, node );
	
	// Adjust and link in the inserted elements
	x_Adjust( iPosChild, node.nStart );
	m_aPos[iPosChild].nStart += node.nStart;
	m_aPos[iPos].iElemChild = iPosChild;
	while ( iPosChild )
	{
		m_aPos[iPosChild].iElemParent = iPos;
		iPosChild = m_aPos[iPosChild].iElemNext;
	}
	x_ReleasePos( iPosVirtual );

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

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

void CMarkupSTL::x_DocChange( int nLeft, int nReplace, const string& strInsert )
{
	// Insert strInsert int m_strDoc at nLeft replacing nReplace chars
	// Do this with only one buffer reallocation if it grows
	//
	int nDocLength = (int)m_strDoc.size();
	int nInsLength = (int)strInsert.size();
	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 = (int)m_strDoc.capacity();
	if ( nNewLength > nAllocLen )
	{
		nBufferLen += nBufferLen/2 + 128;
		if ( nBufferLen < nNewLength )
			nBufferLen = nNewLength;
		m_strDoc.reserve( nBufferLen );
	}

	m_strDoc.replace( nLeft, nReplace, strInsert );

}

void CMarkupSTL::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;
				}
			}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美国欧美日韩国产在线播放| 欧美mv和日韩mv国产网站| 欧美日韩三级一区| 久久精品人人做| 午夜欧美一区二区三区在线播放| 99麻豆久久久国产精品免费优播| 日韩一区二区三区电影在线观看| 亚洲自拍与偷拍| 成人黄色电影在线 | 国产麻豆视频一区二区| 91电影在线观看| 中文字幕一区二区三区色视频| 蜜臀av一区二区在线免费观看| 在线免费观看一区| 综合久久给合久久狠狠狠97色| 国产成人免费在线视频| 精品电影一区二区三区| 久久国产综合精品| 日韩欧美第一区| 天天色综合天天| 欧美高清性hdvideosex| 亚洲成人自拍一区| 欧美日韩一区 二区 三区 久久精品| 中文字幕一区二区三区精华液| 国产成人99久久亚洲综合精品| 2021国产精品久久精品| 极品少妇xxxx精品少妇| 精品成人a区在线观看| 韩国女主播成人在线观看| 欧美videossexotv100| 精久久久久久久久久久| 精品久久久久久最新网址| 奇米精品一区二区三区在线观看| 91精品国产高清一区二区三区| 日韩成人免费电影| 欧美一级爆毛片| 国产一区二区三区美女| 国产视频一区在线播放| 成人美女视频在线观看18| 国产精品美女久久久久高潮| 91论坛在线播放| 亚洲一区视频在线| 欧美丰满少妇xxxxx高潮对白| 免费在线一区观看| 欧美精品一区二区在线观看| 国产一区二区不卡| 国产精品你懂的在线| av激情亚洲男人天堂| 亚洲综合丝袜美腿| 日韩精品一区二区三区四区视频| 国产精品综合一区二区| 亚洲婷婷在线视频| 欧美精品丝袜中出| 国产精品一区免费在线观看| 综合激情网...| 正在播放亚洲一区| 国产精品一区二区三区网站| 亚洲欧美日韩小说| 欧美精品色一区二区三区| 国产一区二区导航在线播放| 综合亚洲深深色噜噜狠狠网站| 欧美日韩国产片| 国产电影精品久久禁18| 亚洲成人激情社区| 欧美国产日韩精品免费观看| 91成人在线观看喷潮| 精品亚洲免费视频| 亚洲欧美激情视频在线观看一区二区三区| 欧美精品123区| 不卡高清视频专区| 美女视频黄免费的久久| 18成人在线视频| 精品国产乱码久久久久久老虎 | 国产99久久久国产精品免费看| 亚洲精品欧美激情| 久久品道一品道久久精品| 欧洲在线/亚洲| 国产成人在线免费观看| 爽好久久久欧美精品| 亚洲欧洲av一区二区三区久久| 日韩午夜在线观看| 欧美中文字幕一区| 国产99久久久久| 精品在线免费观看| 亚洲成人自拍偷拍| 亚洲男女毛片无遮挡| 久久久久久久性| 777午夜精品免费视频| 91小视频免费观看| 成年人国产精品| 国产成人综合在线| 精品一区二区三区日韩| 五月婷婷久久综合| 一区二区三区四区在线| 中文字幕一区二| 国产婷婷色一区二区三区| 日韩精品中文字幕在线不卡尤物| 精品视频在线免费观看| 91成人免费电影| 一本色道久久综合亚洲精品按摩 | 欧美国产视频在线| 久久影院视频免费| 欧美精品一区二区三区高清aⅴ | 91精品国产乱码久久蜜臀| 一本久道中文字幕精品亚洲嫩| 成人午夜电影网站| 国产a精品视频| 大桥未久av一区二区三区中文| 国内外精品视频| 激情伊人五月天久久综合| 久久精品噜噜噜成人88aⅴ| 日本最新不卡在线| 美女国产一区二区| 激情综合色丁香一区二区| 蜜臂av日日欢夜夜爽一区| 日本人妖一区二区| 国产一区二区三区四区五区美女| 激情综合网激情| 国产·精品毛片| av成人动漫在线观看| 在线观看区一区二| 欧美老年两性高潮| 欧美不卡123| 国产精品无圣光一区二区| 国产精品第13页| 夜夜揉揉日日人人青青一国产精品| 亚洲制服丝袜在线| 日本美女一区二区三区| 国产一区91精品张津瑜| 99久久精品国产导航| 欧美日韩一区二区三区在线| 日韩欧美资源站| 国产欧美va欧美不卡在线| 亚洲激情男女视频| 免费av网站大全久久| 成人免费视频一区二区| 一本色道久久综合狠狠躁的推荐| 欧美日本在线视频| 久久青草国产手机看片福利盒子| 中文字幕中文乱码欧美一区二区| 亚洲亚洲精品在线观看| 久久国产精品无码网站| 99re热这里只有精品免费视频 | 亚洲国产日韩一区二区| 男男gaygay亚洲| av在线不卡网| 日韩精品一区在线观看| 136国产福利精品导航| 奇米四色…亚洲| 97久久精品人人做人人爽50路| 91精品综合久久久久久| 国产亚洲美州欧州综合国| 午夜欧美电影在线观看| 成人视屏免费看| 3751色影院一区二区三区| 国产精品网站在线播放| 丝袜a∨在线一区二区三区不卡| 国产福利一区二区三区视频在线| 欧美日韩免费高清一区色橹橹| 久久亚洲精品小早川怜子| 亚洲妇熟xx妇色黄| 成人av综合在线| 亚洲精品在线电影| 亚洲成a人v欧美综合天堂下载| 国产剧情一区二区| 日韩欧美自拍偷拍| 久久精品99国产精品| av中文字幕一区| 精品国产一区二区精华| 亚洲国产欧美日韩另类综合| 成人美女在线视频| 久久一区二区视频| 久久精品噜噜噜成人88aⅴ | 91麻豆国产在线观看| 久久麻豆一区二区| 卡一卡二国产精品| 在线播放中文一区| 亚洲综合精品久久| 波波电影院一区二区三区| 精品sm捆绑视频| 日本不卡视频在线观看| 欧美日韩精品一区二区在线播放| 亚洲人成电影网站色mp4| 福利视频网站一区二区三区| 精品国产一区二区在线观看| 蜜桃av一区二区| 日韩三级精品电影久久久| 奇米影视一区二区三区小说| 制服.丝袜.亚洲.另类.中文| 亚洲国产精品尤物yw在线观看| 欧洲亚洲精品在线| 亚洲精品国久久99热| 91福利国产精品| 亚洲电影第三页| 这里是久久伊人| 另类中文字幕网| 26uuu精品一区二区| 九九精品一区二区| 久久九九久久九九| www.欧美日韩国产在线|