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

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

?? markup.cpp.svn-base

?? QT寫的自動更新程序 自認(rèn)為不錯 請大家參考
?? SVN-BASE
?? 第 1 頁 / 共 5 頁
字號:
	}

	return IsWellFormed();
};

int CMarkup::x_ParseElem( int iPosParent, TokenPos& token )
{
	// This is either called by x_ParseDoc or x_AddSubDoc or x_SetElemContent
	// Returns index of the first element encountered or zero if no elements
	//
	int iElemRoot = 0;
	int iPos = iPosParent;
	int iVirtualParent = iPosParent;
	int nRootDepth = m_aPos[iPos].Level();
	token.nNext = 0;
	m_strError.Empty();

	// Loop through the nodes of the document
	NodeStack aNodes;
	aNodes.Add();
	int nDepth = 0;
	int nMatchDepth;
	int iPosChild;
	int iPosMatch;
	int nTypeFound = 0;
	ElemPos* pElem;
	int iElemFirst, iElemLast;
	while ( 1 )
	{
		nTypeFound = x_ParseNode( token, aNodes.Top() );
		nMatchDepth = 0;
		if ( nTypeFound == MNT_ELEMENT ) // start tag
		{
			iPos = x_GetFreePos();
			if ( ! iElemRoot )
				iElemRoot = iPos;
			pElem = &m_aPos[iPos];
			pElem->iElemParent = iPosParent;
			pElem->iElemNext = 0;
			if ( m_aPos[iPosParent].iElemChild )
			{
				iElemFirst = m_aPos[iPosParent].iElemChild;
				iElemLast = m_aPos[iElemFirst].iElemPrev;
				m_aPos[iElemLast].iElemNext = iPos;
				pElem->iElemPrev = iElemLast;
				m_aPos[iElemFirst].iElemPrev = iPos;
				pElem->nFlags = 0;
			}
			else
			{
				m_aPos[iPosParent].iElemChild = iPos;
				pElem->iElemPrev = iPos;
				pElem->nFlags = MNF_FIRST;
			}
			pElem->SetLevel( nRootDepth + nDepth );
			pElem->iElemChild = 0;
			pElem->nStart = aNodes.Top().nStart;
			pElem->SetStartTagLen( aNodes.Top().nLength );
			if ( aNodes.Top().nFlags & MNF_EMPTY )
			{
				iPos = iPosParent;
				pElem->SetEndTagLen( 0 );
				pElem->nLength = aNodes.Top().nLength;
			}
			else
			{
				iPosParent = iPos;
				++nDepth;
				aNodes.Add();
			}
		}
		else if ( nTypeFound == 0 ) // end tag
		{
			nMatchDepth = nDepth;
			iPosMatch = iPos;
			while ( nMatchDepth && ! token.Match(aNodes.At(nMatchDepth-1).strMeta) )
			{
				/*
				// Auto-switch case sensitivity
				if ( ! (token.nTokenFlags & MDF_IGNORECASE ) )
				{
					token.nTokenFlags |= MDF_IGNORECASE;
					if ( token.Match(aNodes.At(nMatchDepth-1).strMeta) )
						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.IsEmpty() )
				{
					m_strError.Format( _T("No start tag for end tag '%s' at offset %d"),
						x_GetToken(token), aNodes.Top().nStart );
				}
			}
			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.IsEmpty() )
				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.IsEmpty() )
				{
					if ( nTypeFound == 0 )
						m_strError.Format( _T("End tag '%s' at offset %d does not match start tag '%s' at offset %d"),
							x_GetToken(token), token.nL-1, aNodes.Top().strMeta, pElem->nStart );
					else
						m_strError.Format( _T("Element '%s' at offset %d not ended"),
							aNodes.Top().strMeta, aNodes.Top().nStart );
				}
			}
			if ( nTypeFound == -2 )
				break;
			iPosParent = m_aPos[iPos].iElemParent;
			iPos = iPosParent;
			aNodes.Remove();
			--nDepth;
		}
	}
	return iElemRoot;
}

bool CMarkup::x_FindAny( LPCTSTR 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] && _tcschr(_T(" \t\n\r"),szDoc[nChar]) )
		++nChar;
	return szDoc[nChar] != _T('\0');
}

bool CMarkup::x_FindName( CMarkup::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
	LPCTSTR 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] && ! _tcschr(_T(" \t\n\r<>=\\/?!"),szDoc[nChar]) )
		nChar += (int)_tclen(&szDoc[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;
}

CString CMarkup::x_GetToken( const CMarkup::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 _T("");
	CString strToken( &token.szDoc[token.nL], token.Length() );
	return strToken;
}

int CMarkup::x_FindElem( int iPosParent, int iPos, LPCTSTR 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 CMarkup::x_ParseNode( CMarkup::TokenPos& token, CMarkup::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;

	LPCTSTR 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)/sizeof(_TCHAR); nNodeType=t; if(n) nName=(int)(pDoc-token.szDoc)+n-1; }
	#define FINDNODEBAD(e) { szFindEnd=_T(">"); nEndLen=1; node.strMeta.Format(_T("Incorrect %s at offset %d"),e,nR); nNodeType=-1; }

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

	int nR = token.nNext;
	LPCTSTR 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 )
			{
				LPCTSTR szType = _T("tag");
				if ( (nParseFlags & PD_DOCTYPE) || nNodeType == MNT_DOCUMENT_TYPE )
					szType = _T("Doctype");
				else if ( nNodeType == MNT_ELEMENT )
					szType = _T("Element tag");
				else if ( nNodeType == 0 )
					szType = _T("Element end tag");
				else if ( nNodeType == MNT_CDATA_SECTION )
					szType = _T("CDATA Section");
				else if ( nNodeType == MNT_PROCESSING_INSTRUCTION )
					szType = _T("Processing instruction");
				else if ( nNodeType == MNT_COMMENT )
					szType = _T("Comment");
				nNodeType = -1;
				node.strMeta.Format( _T("%s at offset %d unterminated"), szType, node.nStart );
			}
			break;
		}

		if ( nName )
		{
			if ( _tcschr(_T(" \t\n\r/>"),(_TCHAR)cD) )
			{
				int nNameLen = (int)(pDoc - token.szDoc) - nName;
				if ( nNodeType == 0 )
				{
					token.nL = nName;
					token.nR = nName + nNameLen - 1;
				}
				else
				{
					memcpy( node.strMeta.GetBuffer(nNameLen), &token.szDoc[nName], nNameLen*sizeof(_TCHAR) );
					node.strMeta.ReleaseBuffer( nNameLen );
				}
				nName = 0;
				cDminus2 = 0;
				cDminus1 = 0;
			}
			else
			{
				++pDoc;
				continue;
			}
		}

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

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕av一区二区三区高| 欧美亚洲愉拍一区二区| 中文字幕一区二区三区蜜月| 日韩电影在线免费观看| 国产精品电影一区二区| 日韩视频一区二区| 91麻豆国产在线观看| 久久99在线观看| 久久综合久色欧美综合狠狠| av福利精品导航| 欧美日韩夫妻久久| 国产a视频精品免费观看| 日韩精品一区二区三区swag | av在线播放成人| 日本不卡1234视频| 欧美一区二区三区免费观看视频| 国内外成人在线| 一区二区三区免费网站| 久久九九国产精品| 欧美大片顶级少妇| 欧美精品xxxxbbbb| 色综合网站在线| 色婷婷久久久亚洲一区二区三区| 午夜日韩在线电影| 亚洲欧美电影院| 亚洲私人影院在线观看| 久久久久国产精品麻豆ai换脸 | 午夜不卡av在线| 玉米视频成人免费看| 91精品国产乱码久久蜜臀| 91视频观看免费| 欧美性极品少妇| 欧美日韩国产另类一区| 91丨九色丨国产丨porny| 美女一区二区在线观看| 久久国产精品色婷婷| 日韩av电影天堂| 亚洲精品乱码久久久久| 丝袜美腿亚洲一区| 日本亚洲电影天堂| 亚洲最新视频在线观看| 亚洲电影一级片| 精品一区二区在线播放| 亚洲www啪成人一区二区麻豆| 精品国产一区二区亚洲人成毛片 | 久久精品国产一区二区三| 亚洲精选视频在线| 亚洲国产日产av| 在线观看国产日韩| 91丝袜呻吟高潮美腿白嫩在线观看| 777欧美精品| 欧美写真视频网站| 久久久久久久av麻豆果冻| 亚洲精品第1页| 亚洲欧美日韩一区二区| 亚洲卡通欧美制服中文| 青青草原综合久久大伊人精品优势 | 日韩精彩视频在线观看| 成人激情午夜影院| 粉嫩aⅴ一区二区三区四区五区| 亚洲电影激情视频网站| 国产一区久久久| 国产精品白丝jk黑袜喷水| 一区二区三区成人在线视频| 天堂午夜影视日韩欧美一区二区| 国产精品一区专区| 波多野结衣中文字幕一区二区三区| 日本亚洲免费观看| 色婷婷激情一区二区三区| 欧美一卡2卡3卡4卡| 欧美xxxxxxxx| 亚洲精品美腿丝袜| 波多野结衣欧美| 91国产免费观看| 制服丝袜亚洲精品中文字幕| 亚洲va中文字幕| 色先锋资源久久综合| 欧美精品精品一区| 天堂va蜜桃一区二区三区| 欧美日韩国产高清一区二区| 亚洲伦在线观看| 丁香一区二区三区| 久久久久久久久97黄色工厂| 激情都市一区二区| 色悠久久久久综合欧美99| 国产精品久久久久久久久免费桃花| 激情五月播播久久久精品| 久久综合九色综合欧美98| caoporen国产精品视频| 一本一道久久a久久精品 | 91在线丨porny丨国产| 国产欧美日韩卡一| 久久久久国色av免费看影院| 国产91丝袜在线播放| 日韩一级完整毛片| 国产精品久久久久久久久快鸭 | 欧美老人xxxx18| 国产欧美一区二区在线| 日韩和欧美一区二区三区| 91精品国产乱码| 国产精品一区二区在线播放 | 欧美伦理电影网| 国产呦精品一区二区三区网站| 久久精品人人做人人综合| 国产露脸91国语对白| 亚洲一区二区三区免费视频| 精品国产精品网麻豆系列| 亚洲国产一区视频| 国产一区二区按摩在线观看| 一区二区三区在线免费播放| 欧美日韩在线播放| 中文字幕免费不卡| 91精品国产综合久久蜜臀| 老司机精品视频导航| 国产情人综合久久777777| 91黄视频在线| 国产精品一区二区91| 国产精品久久久久久久岛一牛影视 | 在线一区二区三区四区| 亚洲乱码国产乱码精品精小说| 精品久久一二三区| 色香蕉成人二区免费| 久久久久久久久岛国免费| 欧美一区二区视频免费观看| 成人美女视频在线看| 亚洲在线一区二区三区| 中文字幕一区二区在线观看| 欧美三级电影精品| 国产成人免费在线观看| 日本成人在线视频网站| 日本不卡一二三| 中文成人综合网| 国产精品久久久久久久久快鸭| 国产一区二区在线观看免费| 国产激情视频一区二区三区欧美| 国产一区 二区 三区一级| 99久久久久免费精品国产| 精品视频一区二区不卡| 欧美精品一区二| 亚洲欧美成人一区二区三区| 日韩电影网1区2区| 成人综合在线观看| 欧美日韩国产电影| 国产日韩精品视频一区| 一区二区三区视频在线观看| 亚洲第一搞黄网站| 成人中文字幕在线| 欧美精品在线一区二区| 国产日韩成人精品| 午夜视频一区在线观看| 成人爱爱电影网址| 精品裸体舞一区二区三区| 亚洲精品久久嫩草网站秘色| 久久91精品国产91久久小草| 欧美亚男人的天堂| 国产精品国产a级| 国产一区免费电影| 欧美日韩一区二区三区在线| 国产三级精品三级| 狠狠色狠狠色综合日日91app| 91免费视频网址| 亚洲国产精品二十页| 韩国一区二区视频| 国产精品福利影院| 黄色精品一二区| 久久综合久久99| 国产乱人伦偷精品视频不卡| 精品少妇一区二区三区视频免付费| 亚洲在线免费播放| 欧美熟乱第一页| 午夜成人免费电影| 欧美一区二区三区公司| 天堂在线一区二区| 欧美成人精品福利| 另类的小说在线视频另类成人小视频在线| 在线观看91视频| 亚洲午夜激情av| 日韩欧美在线影院| 国内成+人亚洲+欧美+综合在线 | 男女男精品网站| 精品国产99国产精品| 丰满亚洲少妇av| 亚洲乱码国产乱码精品精的特点| 色婷婷激情一区二区三区| 亚洲午夜国产一区99re久久| 日韩久久久久久| 色国产综合视频| 免费观看91视频大全| 久久精品视频免费观看| 欧美伊人久久大香线蕉综合69| 日本不卡视频在线观看| 国产欧美一区二区在线观看| 日本精品裸体写真集在线观看| 热久久一区二区| 亚洲精品久久嫩草网站秘色| 欧美调教femdomvk| 国产成人综合在线播放| 亚洲www啪成人一区二区麻豆| 26uuu国产在线精品一区二区| 色妞www精品视频|