⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tinyxmla.cpp

📁 文字編輯器源碼 Text editor source code
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	return clone;}TiXmlDocumentA::TiXmlDocumentA() : TiXmlNodeA( TiXmlNodeA::DOCUMENT ){	tabsize = 4;	ClearError();}TiXmlDocumentA::TiXmlDocumentA( const char * documentName ) : TiXmlNodeA( TiXmlNodeA::DOCUMENT ){	tabsize = 4;	value = documentName;	ClearError();}bool TiXmlDocumentA::LoadFile(){	// See STL_STRING_BUG below.	StringToBuffer buf( value );	if ( buf.buffer && LoadFile( buf.buffer ) )		return true;	return false;}bool TiXmlDocumentA::SaveFile() const{	// See STL_STRING_BUG below.	StringToBuffer buf( value );	if ( buf.buffer && SaveFile( buf.buffer ) )		return true;	return false;}bool TiXmlDocumentA::LoadFile( const char* filename ){	// Delete the existing data:	Clear();	location.Clear();	// There was a really terrifying little bug here. The code:	//		value = filename	// in the STL case, cause the assignment method of the std::string to	// be called. What is strange, is that the std::string had the same	// address as it's c_str() method, and so bad things happen. Looks	// like a bug in the Microsoft STL implementation.	// See STL_STRING_BUG above.	// Fixed with the StringToBuffer class.	value = filename;	FILE* file = fopen( value.c_str (), "r" );	if ( file )	{		// Get the file size, so we can pre-allocate the string. HUGE speed impact.		long length = 0;		fseek( file, 0, SEEK_END );		length = ftell( file );		fseek( file, 0, SEEK_SET );		// Strange case, but good to handle up front.		if ( length == 0 )		{			fclose( file );			return false;		}		// If we have a file, assume it is all one big XML file, and read it in.		// The document parser may decide the document ends sooner than the entire file, however.		TIXMLA_STRING data;		data.reserve( length );		const int BUF_SIZE = 2048;		char buf[BUF_SIZE];		while( fgets( buf, BUF_SIZE, file ) )		{			data += buf;		}		fclose( file );		Parse( data.c_str(), 0 );		if (  Error() )            return false;        else			return true;	}	SetError( TIXMLA_ERROR_OPENING_FILE, 0, 0 );	return false;}bool TiXmlDocumentA::LoadUnicodeFilePath( const TCHAR* filename ){		// Delete the existing data:	Clear();	location.Clear();	// There was a really terrifying little bug here. The code:	//		value = filename	// in the STL case, cause the assignment method of the std::generic_string to	// be called. What is strange, is that the std::generic_string had the same	// address as it's c_str() method, and so bad things happen. Looks	// like a bug in the Microsoft STL implementation.	// See STL_STRING_BUG above.	// Fixed with the StringToBuffer class.	FILE* file = generic_fopen(filename, TEXT("r"));	if ( file )	{		// Get the file size, so we can pre-allocate the generic_string. HUGE speed impact.		long length = 0;		fseek( file, 0, SEEK_END );		length = ftell( file );		fseek( file, 0, SEEK_SET );		// Strange case, but good to handle up front.		if ( length == 0 )		{			fclose( file );			return false;		}		// If we have a file, assume it is all one big XML file, and read it in.		// The document parser may decide the document ends sooner than the entire file, however.		TIXMLA_STRING data;		data.reserve( length );		const int BUF_SIZE = 2048;		char buf[BUF_SIZE];		while( fgets( buf, BUF_SIZE, file ) )		{			data += buf;		}		fclose( file );		Parse( data.c_str(), 0 );		if (  Error() )            return false;        else			return true;	}	SetError( TIXMLA_ERROR_OPENING_FILE, 0, 0 );	return false;}bool TiXmlDocumentA::SaveFile( const char * filename ) const{	// The old c stuff lives on...	FILE* fp = fopen( filename, "w" );	if ( fp )	{		Print( fp, 0 );		fclose( fp );		return true;	}	return false;}TiXmlNodeA* TiXmlDocumentA::Clone() const{	TiXmlDocumentA* clone = new TiXmlDocumentA();	if ( !clone )		return 0;	CopyToClone( clone );	clone->error = error;	clone->errorDesc = errorDesc.c_str ();	TiXmlNodeA* node = 0;	for ( node = firstChild; node; node = node->NextSibling() )	{		clone->LinkEndChild( node->Clone() );	}	return clone;}void TiXmlDocumentA::Print( FILE* cfile, int depth ) const{	TiXmlNodeA* node;	for ( node=FirstChild(); node; node=node->NextSibling() )	{		node->Print( cfile, depth );		fprintf( cfile, "\n" );	}}void TiXmlDocumentA::StreamOut( TIXMLA_OSTREAM * out ) const{	TiXmlNodeA* node;	for ( node=FirstChild(); node; node=node->NextSibling() )	{		node->StreamOut( out );		// Special rule for streams: stop after the root element.		// The stream in code will only read one element, so don't		// write more than one.		if ( node->ToElement() )			break;	}}TiXmlAttributeA* TiXmlAttributeA::Next() const{	// We are using knowledge of the sentinel. The sentinel	// have a value or name.	if ( next->value.empty() && next->name.empty() )		return 0;	return next;}TiXmlAttributeA* TiXmlAttributeA::Previous() const{	// We are using knowledge of the sentinel. The sentinel	// have a value or name.	if ( prev->value.empty() && prev->name.empty() )		return 0;	return prev;}void TiXmlAttributeA::Print( FILE* cfile, int /*depth*/ ) const{	TIXMLA_STRING n, v;	PutString( Name(), &n );	PutString( Value(), &v );	if (value.find ('\"') == TIXMLA_STRING::npos)		fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() );	else		fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() );}void TiXmlAttributeA::StreamOut( TIXMLA_OSTREAM * stream ) const{	if (value.find( '\"' ) != TIXMLA_STRING::npos)	{		PutString( name, stream );		(*stream) << "=" << "'";		PutString( value, stream );		(*stream) << "'";	}	else	{		PutString( name, stream );		(*stream) << "=" << "\"";		PutString( value, stream );		(*stream) << "\"";	}}int TiXmlAttributeA::QueryIntValue( int* ival ) const{	if ( sscanf( value.c_str(), "%d", ival ) == 1 )		return TIXMLA_SUCCESS;	return TIXMLA_WRONG_TYPE;}int TiXmlAttributeA::QueryDoubleValue( double* dval ) const{	if ( sscanf( value.c_str(), "%lf", dval ) == 1 )		return TIXMLA_SUCCESS;	return TIXMLA_WRONG_TYPE;}void TiXmlAttributeA::SetIntValue( int _value ){	char buf [64];	sprintf (buf, "%d", _value);	SetValue (buf);}void TiXmlAttributeA::SetDoubleValue( double _value ){	char buf [64];	sprintf (buf, "%lf", _value);	SetValue (buf);}const int TiXmlAttributeA::IntValue() const{	return atoi (value.c_str ());}const double  TiXmlAttributeA::DoubleValue() const{	return atof (value.c_str ());}void TiXmlCommentA::Print( FILE* cfile, int depth ) const{	for ( int i=0; i<depth; i++ )	{		fputs( "    ", cfile );	}	fprintf( cfile, "<!--%s-->", value.c_str() );}void TiXmlCommentA::StreamOut( TIXMLA_OSTREAM * stream ) const{	(*stream) << "<!--";	PutString( value, stream );	(*stream) << "-->";}TiXmlNodeA* TiXmlCommentA::Clone() const{	TiXmlCommentA* clone = new TiXmlCommentA();	if ( !clone )		return 0;	CopyToClone( clone );	return clone;}void TiXmlTextA::Print( FILE* cfile, int /*depth*/ ) const{	TIXMLA_STRING buffer;	PutString( value, &buffer );	fprintf( cfile, "%s", buffer.c_str() );}void TiXmlTextA::StreamOut( TIXMLA_OSTREAM * stream ) const{	PutString( value, stream );}TiXmlNodeA* TiXmlTextA::Clone() const{		TiXmlTextA* clone = 0;	clone = new TiXmlTextA( "" );	if ( !clone )		return 0;	CopyToClone( clone );	return clone;}TiXmlDeclarationA::TiXmlDeclarationA( const char * _version,	const char * _encoding,	const char * _standalone ): TiXmlNodeA( TiXmlNodeA::DECLARATION ){	version = _version;	encoding = _encoding;	standalone = _standalone;}void TiXmlDeclarationA::Print( FILE* cfile, int /*depth*/ ) const{	fprintf (cfile, "<?xml ");	if ( !version.empty() )		fprintf (cfile, "version=\"%s\" ", version.c_str ());	if ( !encoding.empty() )		fprintf (cfile, "encoding=\"%s\" ", encoding.c_str ());	if ( !standalone.empty() )		fprintf (cfile, "standalone=\"%s\" ", standalone.c_str ());	fprintf (cfile, "?>");}void TiXmlDeclarationA::StreamOut( TIXMLA_OSTREAM * stream ) const{	(*stream) << "<?xml ";	if ( !version.empty() )	{		(*stream) << "version=\"";		PutString( version, stream );		(*stream) << "\" ";	}	if ( !encoding.empty() )	{		(*stream) << "encoding=\"";		PutString( encoding, stream );		(*stream ) << "\" ";	}	if ( !standalone.empty() )	{		(*stream) << "standalone=\"";		PutString( standalone, stream );		(*stream) << "\" ";	}	(*stream) << "?>";}TiXmlNodeA* TiXmlDeclarationA::Clone() const{		TiXmlDeclarationA* clone = new TiXmlDeclarationA();	if ( !clone )		return 0;	CopyToClone( clone );	clone->version = version;	clone->encoding = encoding;	clone->standalone = standalone;	return clone;}void TiXmlUnknownA::Print( FILE* cfile, int depth ) const{	for ( int i=0; i<depth; i++ )		fprintf( cfile, "    " );	fprintf( cfile, "%s", value.c_str() );}void TiXmlUnknownA::StreamOut( TIXMLA_OSTREAM * stream ) const{	(*stream) << "<" << value << ">";		// Don't use entities hear! It is unknown.}TiXmlNodeA* TiXmlUnknownA::Clone() const{	TiXmlUnknownA* clone = new TiXmlUnknownA();	if ( !clone )		return 0;	CopyToClone( clone );	return clone;}TiXmlAttributeSetA::TiXmlAttributeSetA(){	sentinel.next = &sentinel;	sentinel.prev = &sentinel;}TiXmlAttributeSetA::~TiXmlAttributeSetA(){	assert( sentinel.next == &sentinel );	assert( sentinel.prev == &sentinel );}void TiXmlAttributeSetA::Add( TiXmlAttributeA* addMe ){	assert( !Find( addMe->Name() ) );	// Shouldn't be multiply adding to the set.	addMe->next = &sentinel;	addMe->prev = sentinel.prev;	sentinel.prev->next = addMe;	sentinel.prev      = addMe;}void TiXmlAttributeSetA::Remove( TiXmlAttributeA* removeMe ){	TiXmlAttributeA* node;	for( node = sentinel.next; node != &sentinel; node = node->next )	{		if ( node == removeMe )		{			node->prev->next = node->next;			node->next->prev = node->prev;			node->next = 0;			node->prev = 0;			return;		}	}	assert( 0 );		// we tried to remove a non-linked attribute.}TiXmlAttributeA*	TiXmlAttributeSetA::Find( const char * name ) const{	TiXmlAttributeA* node;	for( node = sentinel.next; node != &sentinel; node = node->next )	{		if ( node->name == name )			return node;	}	return 0;}#ifdef TIXMLA_USE_STL	TIXMLA_ISTREAM & operator >> (TIXMLA_ISTREAM & in, TiXmlNodeA & base){	TIXMLA_STRING tag;	tag.reserve( 8 * 1000 );	base.StreamIn( &in, &tag );	base.Parse( tag.c_str(), 0 );	return in;}#endifTIXMLA_OSTREAM & operator<< (TIXMLA_OSTREAM & out, const TiXmlNodeA & base){	base.StreamOut (& out);	return out;}#ifdef TIXMLA_USE_STL	std::string & operator<< (std::string& out, const TiXmlNodeA& base ){   std::ostringstream os_stream( std::ostringstream::out );   base.StreamOut( &os_stream );      out.append( os_stream.str() );   return out;}#endifTiXmlHandleA TiXmlHandleA::FirstChild() const{	if ( node )	{		TiXmlNodeA* child = node->FirstChild();		if ( child )			return TiXmlHandleA( child );	}	return TiXmlHandleA( 0 );}TiXmlHandleA TiXmlHandleA::FirstChild( const char * value ) const{	if ( node )	{		TiXmlNodeA* child = node->FirstChild( value );		if ( child )			return TiXmlHandleA( child );	}	return TiXmlHandleA( 0 );}TiXmlHandleA TiXmlHandleA::FirstChildElement() const{	if ( node )	{		TiXmlElementA* child = node->FirstChildElement();		if ( child )			return TiXmlHandleA( child );	}	return TiXmlHandleA( 0 );}TiXmlHandleA TiXmlHandleA::FirstChildElement( const char * value ) const{	if ( node )	{		TiXmlElementA* child = node->FirstChildElement( value );		if ( child )			return TiXmlHandleA( child );	}	return TiXmlHandleA( 0 );}TiXmlHandleA TiXmlHandleA::Child( int count ) const{	if ( node )	{		int i;		TiXmlNodeA* child = node->FirstChild();		for (	i=0;				child && i<count;				child = child->NextSibling(), ++i )		{			// nothing		}		if ( child )			return TiXmlHandleA( child );	}	return TiXmlHandleA( 0 );}TiXmlHandleA TiXmlHandleA::Child( const char* value, int count ) const{	if ( node )	{		int i;		TiXmlNodeA* child = node->FirstChild( value );		for (	i=0;				child && i<count;				child = child->NextSibling( value ), ++i )		{			// nothing		}		if ( child )			return TiXmlHandleA( child );	}	return TiXmlHandleA( 0 );}TiXmlHandleA TiXmlHandleA::ChildElement( int count ) const{	if ( node )	{		int i;		TiXmlElementA* child = node->FirstChildElement();		for (	i=0;				child && i<count;				child = child->NextSiblingElement(), ++i )		{			// nothing		}		if ( child )			return TiXmlHandleA( child );	}	return TiXmlHandleA( 0 );}TiXmlHandleA TiXmlHandleA::ChildElement( const char* value, int count ) const{	if ( node )	{		int i;		TiXmlElementA* child = node->FirstChildElement( value );		for (	i=0;				child && i<count;				child = child->NextSiblingElement( value ), ++i )		{			// nothing		}		if ( child )			return TiXmlHandleA( child );	}	return TiXmlHandleA( 0 );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -