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

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

?? markupstl.cpp

?? 解析xml文件的強大包
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
// MarkupSTL.cpp: implementation of the CMarkupSTL class.
//
// Markup Release 8.3
// Copyright (C) 1999-2006 First Objective Software, Inc. All rights reserved
// Go to www.firstobject.com for the latest CMarkup and EDOM documentation
// Use in commercial applications requires written permission
// This software is provided "as is", with no warranty.

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "MarkupSTL.h"

using namespace std;

// Customization
#define x_EOL "\r\n" // can be \r\n or \n or empty
#define x_EOLLEN (sizeof(x_EOL)-1) // string length of x_EOL
#define x_ATTRIBQUOTE "\"" // can be double or single quote


void CMarkupSTL::operator=( const CMarkupSTL& markup )
{
	m_iPosParent = markup.m_iPosParent;
	m_iPos = markup.m_iPos;
	m_iPosChild = markup.m_iPosChild;
	m_iPosFree = markup.m_iPosFree;
	m_iPosDeleted = markup.m_iPosDeleted;
	m_nNodeType = markup.m_nNodeType;
	m_nNodeOffset = markup.m_nNodeOffset;
	m_nNodeLength = markup.m_nNodeLength;
	m_strDoc = markup.m_strDoc;
	m_strError = markup.m_strError;
	m_nFlags = markup.m_nFlags;

	// Copy used part of the index array
	m_aPos.RemoveAll();
	m_aPos.nSize = m_iPosFree;
	if ( m_aPos.nSize < 8 )
		m_aPos.nSize = 8;
	m_aPos.nSegs = m_aPos.SegsUsed();
	if ( m_aPos.nSegs )
	{
		m_aPos.pSegs = (ElemPos**)(new char[m_aPos.nSegs*sizeof(char*)]);
		int nSegSize = 1 << m_aPos.PA_SEGBITS;
		for ( int nSeg=0; nSeg < m_aPos.nSegs; ++nSeg )
		{
			if ( nSeg + 1 == m_aPos.nSegs )
				nSegSize = m_aPos.GetSize() - (nSeg << m_aPos.PA_SEGBITS);
			m_aPos.pSegs[nSeg] = (ElemPos*)(new char[nSegSize*sizeof(ElemPos)]);
			memcpy( m_aPos.pSegs[nSeg], markup.m_aPos.pSegs[nSeg], nSegSize*sizeof(ElemPos) );
		}
	}

	// Copy SavedPos map
	m_mapSavedPos.RemoveAll();
	if ( markup.m_mapSavedPos.pTable )
	{
		m_mapSavedPos.AllocMapTable();
		for ( int nSlot=0; nSlot < SavedPosMap::SPM_SIZE; ++nSlot )
		{
			SavedPos* pCopySavedPos = markup.m_mapSavedPos.pTable[nSlot];
			if ( pCopySavedPos )
			{
				int nCount = 0;
				while ( pCopySavedPos[nCount].nSavedPosFlags & SavedPosMap::SPM_USED )
				{
					++nCount;
					if ( pCopySavedPos[nCount-1].nSavedPosFlags & SavedPosMap::SPM_LAST )
						break;
				}
				if ( nCount )
				{
					SavedPos* pNewSavedPos = new SavedPos[nCount];
					for ( int nCopy=0; nCopy<nCount; ++nCopy )
						pNewSavedPos[nCopy] = pCopySavedPos[nCopy];
					pNewSavedPos[nCount-1].nSavedPosFlags |= SavedPosMap::SPM_LAST;
					m_mapSavedPos.pTable[nSlot] = pNewSavedPos;
				}
			}
		}
	}

	MARKUP_SETDEBUGSTATE;
}

bool CMarkupSTL::SetDoc( const char* szDoc )
{
	// Set document text
	if ( szDoc )
		m_strDoc = szDoc;
	else
		m_strDoc.erase();

	m_strError.erase();
	return x_ParseDoc();
};

bool CMarkupSTL::IsWellFormed()
{
	if ( m_aPos.GetSize()
			&& ! (m_aPos[0].nFlags & MNF_ILLFORMED)
			&& m_aPos[0].iElemChild
			&& ! m_aPos[m_aPos[0].iElemChild].iElemNext )
		return true;
	return false;
}

bool CMarkupSTL::Load( const char* szFileName )
{
	if ( ! ReadTextFile(szFileName, m_strDoc, &m_strError, &m_nFlags) )
		return false;
	return x_ParseDoc();
}

bool CMarkupSTL::ReadTextFile( const char* szFileName, string& strDoc, string* pstrError, int* pnFlags )
{
	// Static utility method to load text file into strDoc
	//
	// Open file to read binary
	FILE* fp = fopen( szFileName, "rb" );
	if ( ! fp )
	{
		if ( pstrError )
			*pstrError = x_GetLastError();
		return false;
	}

	// Set flags to 0 unless flags argument provided
	int nFlags = pnFlags?*pnFlags:0;
	char szDescBOM[20] = {0};
	char szResult[100];
	strDoc.erase();

	// Get file length
	fseek( fp, 0, SEEK_END );
	int nFileByteLen = ftell(fp);
	fseek( fp, 0, SEEK_SET );


	// Read file directly
	if ( nFileByteLen )
	{
		char* pszBuffer = new char[nFileByteLen];
		fread( pszBuffer, nFileByteLen, 1, fp );
		strDoc.assign( pszBuffer, nFileByteLen );
		delete [] pszBuffer;
	}
	sprintf( szResult, "%s%d bytes", szDescBOM, nFileByteLen );
	if ( pstrError )
		*pstrError = szResult;

	fclose( fp );
	if ( pnFlags )
		*pnFlags = nFlags;
	return true;
}

bool CMarkupSTL::Save( const char* szFileName )
{
	return WriteTextFile( szFileName, m_strDoc, &m_strError, &m_nFlags );
}

bool CMarkupSTL::WriteTextFile( const char* szFileName, string& strDoc, string* pstrError, int* pnFlags )
{
	// Static utility method to save strDoc to text file
	//
	// Open file to write binary
	bool bSuccess = true;
	FILE* fp = fopen( szFileName, "wb" );
	if ( ! fp )
	{
		if ( pstrError )
			*pstrError = x_GetLastError();
		return false;
	}

	// Set flags to 0 unless flags argument provided
	int nFlags = pnFlags?*pnFlags:0;
	char szDescBOM[20] = {0};
	char szResult[100];

	// Get document length
	int nDocLength = (int)strDoc.size();


	if ( nDocLength )
		bSuccess = ( fwrite( strDoc.c_str(), nDocLength, 1, fp ) == 1 );
	sprintf( szResult, "%s%d bytes", szDescBOM, nDocLength );
	if ( pstrError )
		*pstrError = szResult;
	
	if ( ! bSuccess && pstrError )
		*pstrError = x_GetLastError();
	fclose(fp);
	if ( pnFlags )
		*pnFlags = nFlags;
	return bSuccess;
}

bool CMarkupSTL::FindElem( const char* szName )
{
	// Change current position only if found
	//
	if ( m_aPos.GetSize() )
	{
		int iPos = x_FindElem( m_iPosParent, m_iPos, szName );
		if ( iPos )
		{
			// Assign new position
			x_SetPos( m_aPos[iPos].iElemParent, iPos, 0 );
			return true;
		}
	}
	return false;
}

bool CMarkupSTL::FindChildElem( const char* szName )
{
	// Change current child position only if found
	//
	// Shorthand: call this with no current main position
	// means find child under root element
	if ( ! m_iPos )
		FindElem();

	int iPosChild = x_FindElem( m_iPos, m_iPosChild, szName );
	if ( iPosChild )
	{
		// Assign new position
		int iPos = m_aPos[iPosChild].iElemParent;
		x_SetPos( m_aPos[iPos].iElemParent, iPos, iPosChild );
		return true;
	}

	return false;
}

string CMarkupSTL::EscapeText( const char* szText, int nFlags )
{
	// Convert text as seen outside XML document to XML friendly
	// replacing special characters with ampersand escape codes
	// E.g. convert "6>7" to "6&gt;7"
	//
	// &lt;   less than
	// &amp;  ampersand
	// &gt;   greater than
	//
	// and for attributes:
	//
	// &apos; apostrophe or single quote
	// &quot; double quote
	//
	static const char* szaReplace[] = { "&lt;","&amp;","&gt;","&apos;","&quot;" };
	const char* pFind = (nFlags&MNF_ESCAPEQUOTES)?"<&>\'\"":"<&>";
	string strText;
	const char* pSource = szText;
	int nDestSize = (int)strlen(pSource);
	nDestSize += nDestSize / 10 + 7;
	strText.reserve( nDestSize );
	char cSource = *pSource;
	const char* pFound;
	while ( cSource )
	{
		if ( (pFound=strchr(pFind,cSource)) != NULL )
		{
			bool bIgnoreAmpersand = false;
			if ( (nFlags&MNF_WITHREFS) && *pFound == '&' )
			{
				// Do not replace ampersand if it is start of any entity reference
				// &[#_:A-Za-zU][_:-.A-Za-z0-9U]*; where U is > 0x7f
				const char* pCheckEntity = pSource;
				++pCheckEntity;
				char c = *pCheckEntity;
				if ( (c>='A'&&c<='Z') || (c>='a'&&c<='z')
						|| c=='#' || c=='_' || c==':' || c>0x7f )
				{
					while ( 1 )
					{
						++pCheckEntity;
						c = *pCheckEntity;
						if ( c == ';' )
						{
							int nEntityLen = (int)(pCheckEntity - pSource) + 1;
							strText.append( pSource, nEntityLen );
							pSource = pCheckEntity;
							bIgnoreAmpersand = true;
						}
						else if ( (c>='A'&&c<='Z') || (c>='a'&&c<='z') || (c>='0'&&c<='9')
								|| c=='_' || c==':' || c=='-' || c=='.' || c>0x7f )
							continue;
						break;
					}
				}
			}
			if ( ! bIgnoreAmpersand )
			{
				pFound = szaReplace[pFound-pFind];
				strText.append( pFound );
			}
		}
		else
		{
			strText += cSource;
		}
		++pSource;
		cSource = *pSource;
	}
	return strText;
}

string CMarkupSTL::UnescapeText( const char* szText, int nTextLength /*=-1*/ )
{
	// Convert XML friendly text to text as seen outside XML document
	// ampersand escape codes replaced with special characters e.g. convert "6&gt;7" to "6>7"
	// ampersand numeric codes replaced with character e.g. convert &#60; to <
	// Conveniently the result is always the same or shorter in byte length
	//
	static const char* szaCode[] = { "lt;","amp;","gt;","apos;","quot;" };
	static int anCodeLen[] = { 3,4,3,5,5 };
	static const char* szSymbol = "<&>\'\"";
	string strText;
	const char* pSource = szText;
	if ( nTextLength == -1 )
		nTextLength = (int)strlen(szText);
	strText.reserve( nTextLength );
	int nChar = 0;
	while ( nChar < nTextLength )
	{
		if ( pSource[nChar] == '&' )
		{
			bool bCodeConverted = false;

			// Is it a numeric character reference?
			if ( pSource[nChar+1] == '#' )
			{
				// Is it a hex number?
				int nBase = 10;
				int nNumericChar = nChar + 2;
				char cChar = pSource[nNumericChar];
				if ( cChar == 'x' )
				{
					++nNumericChar;
					cChar = pSource[nNumericChar];
					nBase = 16;
				}

				// Look for terminating semi-colon within 7 characters
				int nCodeLen = 0;
				while ( nCodeLen < 7 && cChar && cChar != ';' )
				{
					// only ASCII digits 0-9, A-F, a-f expected
					++nCodeLen;
					cChar = pSource[nNumericChar + nCodeLen];
				}

				// Process unicode
				if ( cChar == ';' )
				{
					int nUnicode = strtol( &pSource[nNumericChar], NULL, nBase );
					/* MBCS
					int nMBLen = wctomb( &pDest[nLen], (wchar_t)nUnicode );
					if ( nMBLen > 0 )
						nLen += nMBLen;
					else
						nUnicode = 0;
					*/
					if ( nUnicode < 0x80 )
						strText += (char)nUnicode;
					else if ( nUnicode < 0x800 )
					{
						// Convert to 2-byte UTF-8
						strText += (char)(((nUnicode&0x7c0)>>6) | 0xc0);
						strText += (char)((nUnicode&0x3f) | 0x80);
					}
					else
					{
						// Convert to 3-byte UTF-8
						strText += (char)(((nUnicode&0xf000)>>12) | 0xe0);
						strText += (char)(((nUnicode&0xfc0)>>6) | 0x80);
						strText += (char)((nUnicode&0x3f) | 0x80);
					}
					if ( nUnicode )
					{
						// Increment index past ampersand semi-colon
						nChar = nNumericChar + nCodeLen + 1;
						bCodeConverted = true;
					}
				}
			}
			else // does not start with #
			{
				// Look for matching &code;
				for ( int nMatch = 0; nMatch < 5; ++nMatch )
				{
					if ( nChar < nTextLength - anCodeLen[nMatch]
						&& strncmp(szaCode[nMatch],&pSource[nChar+1],anCodeLen[nMatch]) == 0 )
					{
						// Insert symbol and increment index past ampersand semi-colon
						strText += szSymbol[nMatch];
						nChar += anCodeLen[nMatch] + 1;
						bCodeConverted = true;
						break;
					}
				}
			}

			// If the code is not converted, leave it as is
			if ( ! bCodeConverted )
			{
				strText += '&';
				++nChar;
			}
		}
		else // not &
		{
			strText += pSource[nChar];
			++nChar;
		}
	}
	return strText;
}


int CMarkupSTL::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 )

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品伊人色| 国产电影精品久久禁18| 国内精品免费**视频| 91蜜桃免费观看视频| 日韩午夜在线观看视频| 亚洲视频在线一区| 奇米四色…亚洲| 欧美亚洲国产bt| 成人欧美一区二区三区| 国产乱子轮精品视频| 91麻豆精品国产自产在线观看一区| 国产人伦精品一区二区| 久久精品国产色蜜蜜麻豆| 欧美性猛片aaaaaaa做受| 国产精品丝袜在线| 国产盗摄女厕一区二区三区| 91麻豆精品国产91久久久久久久久 | 久久网站热最新地址| 午夜一区二区三区视频| 91国模大尺度私拍在线视频| 国产精品美女久久久久久久久久久| 韩国在线一区二区| 26uuu另类欧美亚洲曰本| 蜜臀精品久久久久久蜜臀| 91 com成人网| 日韩电影在线免费观看| 欧美精品高清视频| 午夜精品成人在线| 欧美三级日本三级少妇99| 亚洲精品乱码久久久久久 | 国产精品盗摄一区二区三区| 国产999精品久久| 国产欧美日韩麻豆91| 国产成人综合亚洲网站| 中国av一区二区三区| 成人午夜激情视频| 亚洲免费观看高清在线观看| 91在线视频免费观看| 一区二区三区中文字幕在线观看| 91一区二区在线| 亚洲欧美日韩一区二区 | 亚洲高清免费观看| 欧美疯狂做受xxxx富婆| 美女精品一区二区| 国产欧美一区二区精品婷婷| 成人av电影在线| 亚洲最新视频在线观看| 欧美日韩亚洲另类| 经典三级一区二区| 国产精品丝袜91| 欧美日韩国产小视频| 麻豆91在线看| 亚洲欧洲精品天堂一级| 欧美专区亚洲专区| 精品在线播放免费| 国产精品人妖ts系列视频| 欧美日韩一区二区三区在线看| 美国精品在线观看| 亚洲天堂免费看| 日韩午夜小视频| 99在线精品观看| 日韩高清在线不卡| 国产精品卡一卡二卡三| 91精品婷婷国产综合久久竹菊| 国产福利一区二区三区视频 | 亚洲手机成人高清视频| 日本高清视频一区二区| 老司机午夜精品| 最新热久久免费视频| 日韩一区二区三区观看| 成人午夜av影视| 日韩和欧美的一区| 国产精品护士白丝一区av| 91精品国产欧美一区二区18| 国产91综合网| 精品亚洲国内自在自线福利| 日韩毛片高清在线播放| 久久综合狠狠综合| 欧美日韩一区中文字幕| av中文字幕在线不卡| 久久精品国产网站| 五月婷婷综合在线| 国产精品国产三级国产三级人妇 | 日韩欧美激情在线| 色天天综合久久久久综合片| 国产精品18久久久久久久久久久久| 亚洲小说欧美激情另类| 亚洲欧洲在线观看av| 久久一区二区三区四区| 欧美精品视频www在线观看| 91麻豆国产精品久久| 国产在线播放一区| 日本伊人色综合网| 日本视频一区二区三区| 亚洲高清视频在线| 亚洲精品va在线观看| 亚洲天堂免费看| 亚洲欧美在线视频| 国产精品美日韩| 久久精品视频一区| 久久蜜桃香蕉精品一区二区三区| 欧美一区二区三区四区五区| 欧美美女一区二区在线观看| 欧美伊人久久久久久午夜久久久久| 成人avav在线| 91偷拍与自偷拍精品| 99久久精品99国产精品| 国产91富婆露脸刺激对白 | 亚洲成人福利片| 亚洲国产综合色| 亚洲成人精品一区二区| 亚洲大型综合色站| 日韩福利电影在线观看| 免费观看在线色综合| 国产在线一区二区| 国产成人在线看| 国产999精品久久久久久绿帽| 处破女av一区二区| 91在线观看视频| 欧美午夜精品电影| 欧美一区日韩一区| 欧美一区二区三区男人的天堂| 日韩视频免费直播| 欧美精品一区二区三区视频| 久久久久久久久伊人| 国产精品久久国产精麻豆99网站| 中文字幕在线免费不卡| 亚洲午夜精品一区二区三区他趣| 日韩国产欧美视频| 国产精品一区二区久久不卡| 国产精品一区二区三区网站| av午夜精品一区二区三区| 欧美探花视频资源| 日韩三级在线免费观看| 国产欧美日韩在线视频| 综合婷婷亚洲小说| 日本欧美一区二区在线观看| 韩国成人精品a∨在线观看| 成人免费看的视频| 欧美人xxxx| 国产欧美一区二区三区鸳鸯浴| 尤物在线观看一区| 久久精品国产免费看久久精品| av网站免费线看精品| 欧美一级xxx| 国产精品国产三级国产专播品爱网| 亚洲一区二区三区美女| 理论电影国产精品| 91在线精品秘密一区二区| 91麻豆精品久久久久蜜臀| 中文成人综合网| 水蜜桃久久夜色精品一区的特点| 成人性视频网站| 欧美日韩1区2区| 国产精品久久久久久久久搜平片| 亚洲国产综合在线| www.99精品| 日韩欧美不卡在线观看视频| 亚洲免费视频中文字幕| 国产精品自拍毛片| 日韩情涩欧美日韩视频| 一区二区三区成人在线视频| 高清不卡一区二区| 日韩欧美国产精品| 亚洲成a人v欧美综合天堂下载| 成人黄色在线视频| 日韩欧美中文一区二区| 亚洲综合色噜噜狠狠| 99热精品一区二区| 久久久久久夜精品精品免费| 亚洲国产三级在线| av在线播放成人| 国产欧美日韩精品在线| 九九精品一区二区| 91精品国产综合久久久蜜臀粉嫩| 日韩理论片网站| 成人自拍视频在线观看| 欧美大度的电影原声| 亚洲成人福利片| 欧美性极品少妇| 亚洲精品成人精品456| 91香蕉视频污| 国产精品成人免费在线| 成人三级伦理片| 中文字幕不卡在线播放| 国产一区美女在线| xf在线a精品一区二区视频网站| 午夜不卡av在线| 欧美日本精品一区二区三区| 一区二区三国产精华液| 在线视频国内一区二区| 亚洲精品v日韩精品| 欧美自拍偷拍一区| 亚洲国产va精品久久久不卡综合| 欧美在线看片a免费观看| 亚洲男同性视频| 在线影视一区二区三区| 夜夜嗨av一区二区三区四季av| 欧美在线综合视频| 亚洲一区二区五区|