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

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

?? markupstl.cpp

?? 解析xml文件的強(qiáng)大包
?? CPP
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
						break;
					token.nTokenFlags |= MDF_IGNORECASE;
				}
				*/
				--nMatchDepth;
				iPosMatch = m_aPos[iPosMatch].iElemParent;
			}
			if ( nMatchDepth == 0 )
			{
				// Not matched at all, it is a lone end tag, a non-element node
				m_aPos[iVirtualParent].nFlags |= MNF_ILLFORMED;
				m_aPos[iPos].nFlags |= MNF_ILLDATA;
				if ( m_strError.empty() )
				{
					char* szError = new char[token.Length()+100];
					sprintf( szError, "No start tag for end tag '%s' at offset %d",
						x_GetToken(token).c_str(), aNodes.Top().nStart );
					m_strError = szError;
					delete [] szError;
				}
			}
			else
			{
				pElem = &m_aPos[iPosMatch];
				pElem->nLength = aNodes.Top().nStart - pElem->nStart + aNodes.Top().nLength;
				pElem->SetEndTagLen( aNodes.Top().nLength );
			}
		}
		else if ( nTypeFound == -1 )
		{
			m_aPos[iVirtualParent].nFlags |= MNF_ILLFORMED;
			m_aPos[iPos].nFlags |= MNF_ILLDATA;
			if ( m_strError.empty() )
				m_strError = aNodes.Top().strMeta;
		}

		// Matched end tag, or end of document
		if ( nMatchDepth || nTypeFound == -2 )
		{
			if ( nDepth > nMatchDepth )
				m_aPos[iVirtualParent].nFlags |= MNF_ILLFORMED;

			// Process any non-ended elements
			while ( nDepth > nMatchDepth )
			{
				// Element with no end tag
				pElem = &m_aPos[iPos];
				iPosChild = pElem->iElemChild;
				iPosParent = pElem->iElemParent;
				pElem->SetEndTagLen( 0 );
				pElem->nFlags |= MNF_NONENDED;
				pElem->iElemChild = 0;
				pElem->nLength = pElem->StartTagLen();
				if ( pElem->nFlags & MNF_ILLDATA )
				{
					pElem->nFlags ^= MNF_ILLDATA;
					m_aPos[iPosParent].nFlags |= MNF_ILLDATA;
				}
				while ( iPosChild )
				{
					m_aPos[iPosChild].iElemParent = iPosParent;
					m_aPos[iPosChild].iElemPrev = iPos;
					m_aPos[iPos].iElemNext = iPosChild;
					iPos = iPosChild;
					iPosChild = m_aPos[iPosChild].iElemNext;
				}
				iPos = iPosParent;
				aNodes.Remove();
				--nDepth;

				// Error string
				// if end tag did not match, top node is end tag that did not match pElem
				// if end of document, any nodes below top have no end tag
				if ( m_strError.empty() )
				{
					if ( nTypeFound == 0 )
					{
						char* szError = new char[aNodes.Top().strMeta.size()+token.Length()+100];
						sprintf( szError, "End tag '%s' at offset %d does not match start tag '%s' at offset %d",
							x_GetToken(token).c_str(), token.nL-1, aNodes.Top().strMeta.c_str(), pElem->nStart );
						m_strError = szError;
						delete [] szError;
					}
					else
					{
						char* szError = new char[aNodes.Top().strMeta.size()+100];
						sprintf( szError, "Element '%s' at offset %d not ended",
							aNodes.Top().strMeta.c_str(), aNodes.Top().nStart );
						m_strError = szError;
						delete [] szError;
					}
				}
			}
			if ( nTypeFound == -2 )
				break;
			iPosParent = m_aPos[iPos].iElemParent;
			iPos = iPosParent;
			aNodes.Remove();
			--nDepth;
		}
	}
	return iElemRoot;
}

bool CMarkupSTL::x_FindAny( const char* szDoc, int& nChar )
{
	// Starting at nChar, find a non-whitespace char
	// return false if no non-whitespace before end of document, nChar points to end
	// otherwise return true and nChar points to non-whitespace char
	while ( szDoc[nChar] && strchr(" \t\n\r",szDoc[nChar]) )
		++nChar;
	return szDoc[nChar] != '\0';
}

bool CMarkupSTL::x_FindName( CMarkupSTL::TokenPos& token )
{
	// Starting at token.nNext, bypass whitespace and find the next name
	// returns true on success, members of token point to token
	// returns false on end of document, members point to end of document
	const char* szDoc = token.szDoc;
	int nChar = token.nNext;

	// By-pass leading whitespace
	if ( ! x_FindAny(szDoc,nChar) )
	{
		// No token was found before end of document
		token.nL = nChar;
		token.nR = nChar - 1;
		token.nNext = nChar;
		return false;
	}

	// Go until special char or whitespace
	token.nL = nChar;
	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;
	return true;
}

string CMarkupSTL::x_GetToken( const CMarkupSTL::TokenPos& token )
{
	// The token contains indexes into the document identifying a small substring
	// Build the substring from those indexes and return it
	if ( token.nL > token.nR )
		return "";
	string strToken( &token.szDoc[token.nL], token.Length() );
	return strToken;
}

int CMarkupSTL::x_FindElem( int iPosParent, int iPos, const char* szPath ) const
{
	// If szPath is NULL or empty, go to next sibling element
	// Otherwise go to next sibling element with matching path
	//
	if ( iPos )
		iPos = m_aPos[iPos].iElemNext;
	else
		iPos = m_aPos[iPosParent].iElemChild;

	// Finished here if szPath not specified
	if ( szPath == NULL || !szPath[0] )
		return iPos;

	// Search
	TokenPos token( m_strDoc, m_nFlags );
	while ( iPos )
	{
		// Compare tag name
		token.nNext = m_aPos[iPos].nStart + 1;
		x_FindName( token ); // Locate tag name
		if ( token.Match(szPath) )
			return iPos;
		iPos = m_aPos[iPos].iElemNext;
	}
	return 0;

}

int CMarkupSTL::x_ParseNode( CMarkupSTL::TokenPos& token, CMarkupSTL::NodePos& node )
{
	// Call this with token.nNext set to the start of the node or tag
	// Upon return token.nNext points to the char after the node or tag
	// 
	// <!--...--> comment
	// <!DOCTYPE ...> dtd
	// <?target ...?> processing instruction
	// <![CDATA[...]]> cdata section
	// <NAME ...> element start tag
	// </NAME ...> element end tag
	//
	// returns the nodetype or
	// 0 for end tag
	// -1 for bad node
	// -2 for end of document
	//
	enum ParseBits
	{
		PD_OPENTAG = 1,
		PD_BANG = 2,
		PD_DASH = 4,
		PD_BRACKET = 8,
		PD_TEXTORWS = 16,
		PD_DOCTYPE = 32,
		PD_INQUOTE_S = 64,
		PD_INQUOTE_D = 128,
	};
	int nParseFlags = 0;

	const char* szFindEnd = NULL;
	int nNodeType = -1;
	int nEndLen = 0;
	int nName = 0;
	unsigned int cDminus1 = 0, cDminus2 = 0;
	#define FINDNODETYPE(e,t,n) { szFindEnd=e; nEndLen=(sizeof(e)-1); nNodeType=t; if(n) nName=(int)(pDoc-token.szDoc)+n-1; }
	#define FINDNODEBAD(e) { szFindEnd=">"; nEndLen=1; char szE[100]; sprintf(szE,"Incorrect %s at offset %d",e,nR); node.strMeta=szE; nNodeType=-1; }

	node.nStart = token.nNext;
	node.nFlags = 0;

	int nR = token.nNext;
	const char* pDoc = &token.szDoc[nR];
	register unsigned int cD = (unsigned int)*pDoc;
	if ( ! cD )
	{
		node.nLength = 0;
		node.nNodeType = 0;
		return -2; // end of document
	}

	while ( 1 )
	{
		cD = (unsigned int)*pDoc;
		if ( ! cD )
		{
			nR = (int)(pDoc - token.szDoc) - 1;
			if ( nNodeType != MNT_WHITESPACE && nNodeType != MNT_TEXT )
			{
				const char* szType = "tag";
				if ( (nParseFlags & PD_DOCTYPE) || nNodeType == MNT_DOCUMENT_TYPE )
					szType = "Doctype";
				else if ( nNodeType == MNT_ELEMENT )
					szType = "Element tag";
				else if ( nNodeType == 0 )
					szType = "Element end tag";
				else if ( nNodeType == MNT_CDATA_SECTION )
					szType = "CDATA Section";
				else if ( nNodeType == MNT_PROCESSING_INSTRUCTION )
					szType = "Processing instruction";
				else if ( nNodeType == MNT_COMMENT )
					szType = "Comment";
				nNodeType = -1;
				char szError[100];
				sprintf( szError, "%s at offset %d unterminated", szType, node.nStart );
				node.strMeta = szError;
			}
			break;
		}

		if ( nName )
		{
			if ( strchr(" \t\n\r/>",(char)cD) )
			{
				int nNameLen = (int)(pDoc - token.szDoc) - nName;
				if ( nNodeType == 0 )
				{
					token.nL = nName;
					token.nR = nName + nNameLen - 1;
				}
				else
				{
					node.strMeta.assign( &token.szDoc[nName], nNameLen );
				}
				nName = 0;
				cDminus2 = 0;
				cDminus1 = 0;
			}
			else
			{
				++pDoc;
				continue;
			}
		}

		if ( szFindEnd )
		{
			if ( cD == '>' && ! (nParseFlags & (PD_INQUOTE_S|PD_INQUOTE_D)) )
			{
				nR = (int)(pDoc - token.szDoc);
				if ( nEndLen == 1 )
				{
					szFindEnd = NULL;
					if ( nNodeType == MNT_ELEMENT && cDminus1 == '/' )
					{
						if ( (! cDminus2) || strchr(" \t\n\r\'\"",(char)cDminus2) )
							node.nFlags |= MNF_EMPTY;
					}
				}
				else if ( nR > nEndLen )
				{
					// Test for end of PI or comment
					const char* pEnd = pDoc - nEndLen + 1;
					const char* pFindEnd = szFindEnd;
					int nLen = nEndLen;
					while ( --nLen && *pEnd++ == *pFindEnd++ );
					if ( nLen == 0 )
						szFindEnd = NULL;
				}
				if ( ! szFindEnd && ! (nParseFlags & PD_DOCTYPE) )
					break;
			}
			else if ( cD == '<' && (nNodeType == MNT_TEXT || nNodeType == -1) )
			{
				nR = (int)(pDoc - token.szDoc) - 1;
				break;
			}
			else if ( nNodeType & (MNT_ELEMENT|MNT_DOCUMENT_TYPE) )
			{
				if ( cD == '\"' && ! (nParseFlags&PD_INQUOTE_S) )
					nParseFlags ^= PD_INQUOTE_D;
				else if ( cD == '\'' && ! (nParseFlags&PD_INQUOTE_D) )
					nParseFlags ^= PD_INQUOTE_S;
				if ( nNodeType == MNT_ELEMENT )
				{
					cDminus2 = cDminus1;
					cDminus1 = cD;
				}
			}
		}
		else if ( nParseFlags )
		{
			if ( nParseFlags & PD_TEXTORWS )
			{
				if ( cD == '<' )
				{
					nR = (int)(pDoc - token.szDoc) - 1;
					nNodeType = MNT_WHITESPACE;
					break;
				}
				else if ( ! strchr(" \t\n\r",(char)cD) )
				{
					nParseFlags ^= PD_TEXTORWS;
					FINDNODETYPE( "<", MNT_TEXT, 0 )
				}
			}
			else if ( nParseFlags & PD_OPENTAG )
			{
				nParseFlags ^= PD_OPENTAG;
				if ( cD > 0x60 || ( cD > 0x40 && cD < 0x5b ) || cD == 0x5f || cD == 0x3a )
					FINDNODETYPE( ">", MNT_ELEMENT, 1 )
				else if ( cD == '/' )
					FINDNODETYPE( ">", 0, 2 )
				else if ( cD == '!' )
					nParseFlags |= PD_BANG;
				else if ( cD == '?' )
					FINDNODETYPE( "?>", MNT_PROCESSING_INSTRUCTION, 2 )
				else
					FINDNODEBAD( "tag name character" )
			}
			else if ( nParseFlags & PD_BANG )
			{
				nParseFlags ^= PD_BANG;
				if ( cD == '-' )
					nParseFlags |= PD_DASH;
				else if ( cD == '[' && !(nParseFlags & PD_DOCTYPE) )
					nParseFlags |= PD_BRACKET;
				else if ( cD == 'D' && !(nParseFlags & PD_DOCTYPE) )
					nParseFlags |= PD_DOCTYPE;
				else if ( strchr("EAN",(char)cD) ) // <!ELEMENT ATTLIST ENTITY NOTATION
					FINDNODETYPE( ">", MNT_DOCUMENT_TYPE, 0 )
				else
					FINDNODEBAD( "! tag" )
			}
			else if ( nParseFlags & PD_DASH )
			{
				nParseFlags ^= PD_DASH;
				if ( cD == '-' )
					FINDNODETYPE( "-->", MNT_COMMENT, 0 )
				else
					FINDNODEBAD( "comment tag" )
			}
			else if ( nParseFlags & PD_BRACKET )
			{
				nParseFlags ^= PD_BRACKET;
				if ( cD == 'C' )
					FINDNODETYPE( "]]>", MNT_CDATA_SECTION, 0 )
				else
					FINDNODEBAD( "tag" )
			}
			else if ( nParseFlags & PD_DOCTYPE )
			{
				if ( cD == '<' )
					nParseFlags |= PD_OPENTAG;
				else if ( cD == '>' )
				{
					nR = (int)(pDoc - token.szDoc);
					nNodeType = MNT_DOCUMENT_TYPE;
					break;
				}
			}
		}
		else if ( cD == '<' )
		{
			nParseFlags |= PD_OPENTAG;
		}
		else
		{
			nNodeType = MNT_WHITESPACE;
			if ( strchr(" \t\n\r",(char)cD) )
				nParseFlags |= PD_TEXTORWS;
			else
				FINDNODETYPE( "<", MNT_TEXT, 0 )
		}
		++pDoc;
	}
	token.nNext = nR + 1;
	node.nLength = token.nNext - node.nStart;
	node.nNodeType = nNodeType;
	return nNodeType;
}

string CMarkupSTL::x_GetPath( int iPos ) const
{
	string strPath;
	while ( iPos )
	{
		string strTagName = x_GetTagName( iPos );
		int iPosParent = m_aPos[iPos].iElemParent;
		int iPosSib = 0;
		int nCount = 0;
		while ( iPosSib != iPos )
		{
			iPosSib = x_FindElem( iPosParent, iPosSib, strTagName.c_str() );
			++nCount;
		}
		if ( nCount > 1 )
		{
			char szPred[25];
			sprintf( szPred, "[%d]", nCount );
			strPath = "/" + strTagName + szPred + strPath;
		}
		else
			strPath = "/" + strTagName + strPath;
		iPos = iPosParent;
	}
	return strPath;
}

string CMarkupSTL::x_GetTagName( int iPos ) const
{
	// Return the tag name at specified element
	TokenPos token( m_strDoc, m_nFlags );
	token.nNext = m_aPos[iPos].nStart + 1;
	if ( ! iPos || ! x_FindName( token ) )
		return "";

	// Return substring of document
	return x_GetToken( token );
}

bool CMarkupSTL::x_FindAttrib( CMarkupSTL::TokenPos& token, const char* szAttrib, int n/*=0*/ )
{
	// Return true if found, otherwise false and token.nNext is new insertion point
	// If szAttrib is NULL find attrib n and leave token at attrib name
	// If szAttrib is given, find matching attrib and leave token at value
	// support non-well-formed attributes e.g. href=/advanced_search?hl=en, nowrap
	// token also holds start and length of preceeding whitespace to support remove
	//
	int nPreSpaceStart;
	int nPreSpaceLength;
	int nChar;
	char cFirstChar;
	const char* szDoc = token.szDoc;
	int nAttrib = -1; // starts at tag name
	int nFoundAttribNameR = 0;
	bool bAfterEqual = false;
	while ( 1 )

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩美女视频一区二区| 亚洲四区在线观看| 欧美性色黄大片| 成人激情免费网站| 国产乱码精品一区二区三区忘忧草| 亚洲最大成人网4388xx| 中文字幕制服丝袜成人av| 26uuu国产日韩综合| 日韩一区二区高清| 日韩欧美一二三区| 精品国产乱码久久| 久久日一线二线三线suv| 久久老女人爱爱| 精品国产一区二区国模嫣然| 久久午夜色播影院免费高清| 精品第一国产综合精品aⅴ| 精品黑人一区二区三区久久| 久久综合九色欧美综合狠狠| 久久久久国产免费免费| 国产精品久久久久三级| 国产精品电影院| 亚洲女同ⅹxx女同tv| 一区二区三区中文字幕精品精品| 一区二区三区精品视频| 日韩国产高清在线| 精品一区二区三区在线观看 | 亚洲日本欧美天堂| 亚洲久草在线视频| 亚洲午夜久久久| 日本成人中文字幕在线视频| 国产麻豆午夜三级精品| 白白色 亚洲乱淫| 欧美性生活久久| 欧美日韩在线亚洲一区蜜芽| 欧美不卡激情三级在线观看| 国产三区在线成人av| 一区二区中文视频| 丝袜亚洲另类欧美| 国产原创一区二区| 色av综合在线| 精品日本一线二线三线不卡| 一区二区中文视频| 天使萌一区二区三区免费观看| 国产在线精品免费| 日本精品一区二区三区四区的功能| 91精品国产综合久久久久| 久久久久亚洲蜜桃| 夜夜精品浪潮av一区二区三区| 日本午夜一本久久久综合| 成人丝袜18视频在线观看| 欧美日免费三级在线| 欧美精品一区二区高清在线观看| 日韩美女精品在线| 韩国一区二区视频| 一本到不卡精品视频在线观看 | 一区二区三区在线免费观看| 美女免费视频一区| 色综合久久综合中文综合网| 精品欧美一区二区久久| 亚洲美女视频在线观看| 精品在线一区二区三区| 欧美色图在线观看| 国产精品天干天干在线综合| 日韩高清一区在线| 色综合欧美在线视频区| 国产午夜精品一区二区| 视频一区二区三区中文字幕| 成人永久aaa| 日韩精品一区二区三区中文不卡| 亚洲狼人国产精品| 成人免费电影视频| 精品国产91久久久久久久妲己 | 91麻豆swag| 久久综合色婷婷| 午夜欧美电影在线观看| av成人老司机| 久久午夜羞羞影院免费观看| 日韩中文字幕麻豆| 色综合天天综合在线视频| 日韩欧美一区电影| 亚洲资源在线观看| 成人av在线影院| 久久精品人人做人人爽人人| 肉色丝袜一区二区| 欧美视频在线一区| 综合激情网...| 成人免费视频国产在线观看| 欧美电影免费观看完整版| 亚洲第一成人在线| 欧美视频一区二区在线观看| 亚洲欧洲日韩一区二区三区| 处破女av一区二区| 国产日韩欧美精品一区| 久久国产麻豆精品| 欧美精品九九99久久| 亚洲在线免费播放| 欧美在线视频全部完| 一区二区三区欧美| 97se狠狠狠综合亚洲狠狠| 国产人妖乱国产精品人妖| 精品一区二区三区免费视频| 欧美一区二区三区四区高清 | 91美女福利视频| 国产精品午夜久久| 国产a精品视频| 国产视频一区在线观看| 国产.欧美.日韩| 国产亚洲短视频| 国产精品一区二区久久精品爱涩| 337p粉嫩大胆色噜噜噜噜亚洲| 国内精品久久久久影院薰衣草| 精品欧美乱码久久久久久1区2区| 精品一二线国产| 亚洲精品一区二区三区在线观看| 精品一区二区三区欧美| 26uuu欧美日本| 高清久久久久久| 中文字幕一区二区三区四区 | 欧美丰满美乳xxx高潮www| 日韩国产欧美在线播放| 欧美精品自拍偷拍| 老司机午夜精品99久久| 欧美精品一区二区三区蜜桃视频| 国产精品一区二区视频| 中文字幕乱码久久午夜不卡| 99久久免费精品高清特色大片| 亚洲欧美日韩一区| 色噜噜狠狠色综合中国| 一二三四社区欧美黄| 欧美在线不卡视频| 欧美亚洲精品一区| 国产午夜亚洲精品午夜鲁丝片| 国产黑丝在线一区二区三区| 亚洲欧洲日韩综合一区二区| 欧美日韩专区在线| 美女网站一区二区| 日本一区二区三区国色天香| 色视频一区二区| 夜夜亚洲天天久久| 日韩欧美中文字幕公布| 久久精品国产999大香线蕉| 欧美国产精品专区| 在线欧美小视频| 首页综合国产亚洲丝袜| 日韩欧美www| 成人在线视频一区二区| 亚洲国产日韩av| 日韩一级黄色片| 国产福利一区二区三区视频在线| 国产日本亚洲高清| 色系网站成人免费| 久久精品国产99国产精品| 国产精品丝袜一区| 欧美美女黄视频| 国产精品一区免费视频| 亚洲精品菠萝久久久久久久| 欧美日韩在线不卡| 国产99精品国产| 亚洲精品一二三| 日韩欧美二区三区| 国产91丝袜在线播放九色| 亚洲国产精品久久艾草纯爱 | 亚洲成av人片观看| 久久综合色8888| 欧洲精品中文字幕| 国产一区二区精品久久| 亚洲视频小说图片| 日韩欧美在线综合网| 91丨porny丨在线| 免费成人美女在线观看.| 亚洲欧美另类久久久精品| 欧美丰满美乳xxx高潮www| 国产精品亚洲第一区在线暖暖韩国| 亚洲精品国久久99热| 欧美丰满美乳xxx高潮www| av电影在线观看一区| 精品无人码麻豆乱码1区2区 | 色噜噜狠狠色综合中国| 九一九一国产精品| 亚洲免费伊人电影| 久久精品亚洲乱码伦伦中文| 欧美日韩高清影院| 91网页版在线| 91原创在线视频| 极品少妇一区二区三区精品视频| 亚洲一区二区中文在线| 精品播放一区二区| 777精品伊人久久久久大香线蕉| 国产成人8x视频一区二区| 日韩av中文字幕一区二区| 亚洲伊人伊色伊影伊综合网| 国产无人区一区二区三区| 日韩免费视频一区| 日韩视频免费观看高清在线视频| 欧美在线999| www.日本不卡| 黑人巨大精品欧美一区| 亚洲欧美成人一区二区三区| 国产网红主播福利一区二区| 日韩一区二区电影在线|