diff options
| -rw-r--r-- | src/pugiconfig.hpp | 4 | ||||
| -rw-r--r-- | src/pugixml.cpp | 1555 | ||||
| -rw-r--r-- | src/pugixml.hpp | 10 | 
3 files changed, 820 insertions, 749 deletions
| diff --git a/src/pugiconfig.hpp b/src/pugiconfig.hpp index de60816..a5e96a3 100644 --- a/src/pugiconfig.hpp +++ b/src/pugiconfig.hpp @@ -32,6 +32,10 @@  // #define PUGIXML_FUNCTION __fastcall // to set calling conventions to all public functions to fastcall  // In absence of PUGIXML_CLASS/PUGIXML_FUNCTION definitions PUGIXML_API is used instead +// Header-only version +// #define PUGIXML_HEADER_ONLY +// #include "pugixml.cpp" +  #endif  /** diff --git a/src/pugixml.cpp b/src/pugixml.cpp index bcfbbdd..de8af95 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -11,6 +11,9 @@   * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)   */ +#ifndef SOURCE_PUGIXML_CPP +#define SOURCE_PUGIXML_CPP +  #include "pugixml.hpp"  #include <stdlib.h> @@ -37,6 +40,7 @@  #include <new>  #ifdef _MSC_VER +#   pragma warning(push)  #	pragma warning(disable: 4127) // conditional expression is constant  #	pragma warning(disable: 4324) // structure was padded due to __declspec(align())  #	pragma warning(disable: 4611) // interaction between '_setjmp' and C++ object destruction is non-portable @@ -46,6 +50,7 @@  #endif  #ifdef __INTEL_COMPILER +#   pragma warning(push)  #	pragma warning(disable: 177) // function was declared but never referenced   #   pragma warning(disable: 279) // controlling expression is constant  #	pragma warning(disable: 1478 1786) // function was declared "deprecated" @@ -53,78 +58,103 @@  #endif  #ifdef __BORLANDC__ +#   pragma option push  #	pragma warn -8008 // condition is always false  #	pragma warn -8066 // unreachable code  #endif  #ifdef __SNC__ +#   pragma diag_push  #	pragma diag_suppress=178 // function was declared but never referenced  #	pragma diag_suppress=237 // controlling expression is constant  #endif -// uintptr_t -#if !defined(_MSC_VER) || _MSC_VER >= 1600 -#	include <stdint.h> -#else -#	ifndef _UINTPTR_T_DEFINED -// No native uintptr_t in MSVC6 and in some WinCE versions -typedef size_t uintptr_t; -#define _UINTPTR_T_DEFINED -#	endif -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -typedef __int32 int32_t; -#endif -  // Inlining controls  #if defined(_MSC_VER) && _MSC_VER >= 1300 -#	define PUGIXML_NO_INLINE __declspec(noinline) +#	define PUGI__NO_INLINE __declspec(noinline)  #elif defined(__GNUC__) -#	define PUGIXML_NO_INLINE __attribute__((noinline)) +#	define PUGI__NO_INLINE __attribute__((noinline))  #else -#	define PUGIXML_NO_INLINE  +#	define PUGI__NO_INLINE   #endif  // Simple static assertion -#define STATIC_ASSERT(cond) { static const char condition_failed[(cond) ? 1 : -1] = {0}; (void)condition_failed[0]; } +#define PUGI__STATIC_ASSERT(cond) { static const char condition_failed[(cond) ? 1 : -1] = {0}; (void)condition_failed[0]; }  // Digital Mars C++ bug workaround for passing char loaded from memory via stack  #ifdef __DMC__ -#	define DMC_VOLATILE volatile +#	define PUGI__DMC_VOLATILE volatile  #else -#	define DMC_VOLATILE +#	define PUGI__DMC_VOLATILE  #endif  // In some environments MSVC is a compiler but the CRT lacks certain MSVC-specific features  #if defined(_MSC_VER) && !defined(__S3E__) -#	define MSVC_CRT_VERSION _MSC_VER +#	define PUGI__MSVC_CRT_VERSION _MSC_VER  #endif -using namespace pugi; +#ifdef PUGIXML_HEADER_ONLY +#   define PUGI__NS_BEGIN namespace pugi { namespace impl { +#   define PUGI__NS_END } } +#   define PUGI__FN inline +#   define PUGI__FN_NO_INLINE inline +#else +#   if defined(_MSC_VER) && _MSC_VER < 1300 // MSVC6 seems to have an amusing bug with anonymous namespaces inside namespaces +#      define PUGI__NS_BEGIN namespace pugi { namespace impl { +#      define PUGI__NS_END } } +#   else +#      define PUGI__NS_BEGIN namespace pugi { namespace impl { namespace { +#      define PUGI__NS_END } } } +#   endif +#   define PUGI__FN +#   define PUGI__FN_NO_INLINE PUGI__NO_INLINE +#endif + +// uintptr_t +#if !defined(_MSC_VER) || _MSC_VER >= 1600 +#	include <stdint.h> +#else +#	ifndef _UINTPTR_T_DEFINED +// No native uintptr_t in MSVC6 and in some WinCE versions +typedef size_t uintptr_t; +#define _UINTPTR_T_DEFINED +#	endif +PUGI__NS_BEGIN +    typedef unsigned __int8 uint8_t; +    typedef unsigned __int16 uint16_t; +    typedef unsigned __int32 uint32_t; +PUGI__NS_END +#endif  // Memory allocation -namespace -{ -	void* default_allocate(size_t size) +PUGI__NS_BEGIN +	PUGI__FN void* default_allocate(size_t size)  	{  		return malloc(size);  	} -	void default_deallocate(void* ptr) +	PUGI__FN void default_deallocate(void* ptr)  	{  		free(ptr);  	} -	allocation_function global_allocate = default_allocate; -	deallocation_function global_deallocate = default_deallocate; -} +    template <typename T> +    struct xml_memory_management_function_storage +    { +        static allocation_function allocate; +        static deallocation_function deallocate; +    }; + +    template <typename T> allocation_function xml_memory_management_function_storage<T>::allocate = default_allocate; +    template <typename T> deallocation_function xml_memory_management_function_storage<T>::deallocate = default_deallocate; + +    typedef xml_memory_management_function_storage<int> xml_memory; +PUGI__NS_END  // String utilities -namespace -{ +PUGI__NS_BEGIN  	// Get string length -	size_t strlength(const char_t* s) +	PUGI__FN size_t strlength(const char_t* s)  	{  		assert(s); @@ -136,7 +166,7 @@ namespace  	}  	// Compare two strings -	bool strequal(const char_t* src, const char_t* dst) +	PUGI__FN bool strequal(const char_t* src, const char_t* dst)  	{  		assert(src && dst); @@ -148,7 +178,7 @@ namespace  	}  	// Compare lhs with [rhs_begin, rhs_end) -	bool strequalrange(const char_t* lhs, const char_t* rhs, size_t count) +	PUGI__FN bool strequalrange(const char_t* lhs, const char_t* rhs, size_t count)  	{  		for (size_t i = 0; i < count; ++i)  			if (lhs[i] != rhs[i]) @@ -159,18 +189,17 @@ namespace  #ifdef PUGIXML_WCHAR_MODE  	// Convert string to wide string, assuming all symbols are ASCII -	void widen_ascii(wchar_t* dest, const char* source) +	PUGI__FN void widen_ascii(wchar_t* dest, const char* source)  	{  		for (const char* i = source; *i; ++i) *dest++ = *i;  		*dest = 0;  	}  #endif -} +PUGI__NS_END  #if !defined(PUGIXML_NO_STL) || !defined(PUGIXML_NO_XPATH)  // auto_ptr-like buffer holder for exception recovery -namespace -{ +PUGI__NS_BEGIN  	struct buffer_holder  	{  		void* data; @@ -192,11 +221,10 @@ namespace  			return result;  		}  	}; -} +PUGI__NS_END  #endif -namespace -{ +PUGI__NS_BEGIN  	static const size_t xml_memory_page_size = 32768;  	static const uintptr_t xml_memory_page_alignment = 32; @@ -255,7 +283,7 @@ namespace  			size_t size = offsetof(xml_memory_page, data) + data_size;  			// allocate block with some alignment, leaving memory for worst-case padding -			void* memory = global_allocate(size + xml_memory_page_alignment); +			void* memory = xml_memory::allocate(size + xml_memory_page_alignment);  			if (!memory) return 0;  			// align upwards to page boundary @@ -272,7 +300,7 @@ namespace  		static void deallocate_page(xml_memory_page* page)  		{ -			global_deallocate(page->memory); +			xml_memory::deallocate(page->memory);  		}  		void* allocate_memory_oob(size_t size, xml_memory_page*& out_page); @@ -375,11 +403,13 @@ namespace  		size_t _busy_size;  	}; -	PUGIXML_NO_INLINE void* xml_allocator::allocate_memory_oob(size_t size, xml_memory_page*& out_page) +	PUGI__FN_NO_INLINE void* xml_allocator::allocate_memory_oob(size_t size, xml_memory_page*& out_page)  	{  		const size_t large_allocation_threshold = xml_memory_page_size / 4;  		xml_memory_page* page = allocate_page(size <= large_allocation_threshold ? xml_memory_page_size : size); +        out_page = page; +  		if (!page) return 0;  		if (size <= large_allocation_threshold) @@ -409,10 +439,9 @@ namespace  		// allocate inside page  		page->busy_size = size; -		out_page = page;  		return page->data;  	} -} +PUGI__NS_END  namespace pugi  { @@ -420,7 +449,7 @@ namespace pugi  	struct xml_attribute_struct  	{  		/// Default ctor -		xml_attribute_struct(xml_memory_page* page): header(reinterpret_cast<uintptr_t>(page)), name(0), value(0), prev_attribute_c(0), next_attribute(0) +		xml_attribute_struct(impl::xml_memory_page* page): header(reinterpret_cast<uintptr_t>(page)), name(0), value(0), prev_attribute_c(0), next_attribute(0)  		{  		} @@ -438,7 +467,7 @@ namespace pugi  	{  		/// Default ctor  		/// \param type - node type -		xml_node_struct(xml_memory_page* page, xml_node_type type): header(reinterpret_cast<uintptr_t>(page) | (type - 1)), parent(0), name(0), value(0), first_child(0), prev_sibling_c(0), next_sibling(0), first_attribute(0) +		xml_node_struct(impl::xml_memory_page* page, xml_node_type type): header(reinterpret_cast<uintptr_t>(page) | (type - 1)), parent(0), name(0), value(0), first_child(0), prev_sibling_c(0), next_sibling(0), first_attribute(0)  		{  		} @@ -458,8 +487,7 @@ namespace pugi  	};  } -namespace -{ +PUGI__NS_BEGIN  	struct xml_document_struct: public xml_node_struct, public xml_allocator  	{  		xml_document_struct(xml_memory_page* page): xml_node_struct(page, node_document), xml_allocator(page), buffer(0) @@ -469,17 +497,16 @@ namespace  		const char_t* buffer;  	}; -	static inline xml_allocator& get_allocator(const xml_node_struct* node) +	inline xml_allocator& get_allocator(const xml_node_struct* node)  	{  		assert(node);  		return *reinterpret_cast<xml_memory_page*>(node->header & xml_memory_page_pointer_mask)->allocator;  	} -} +PUGI__NS_END  // Low-level DOM operations -namespace -{ +PUGI__NS_BEGIN  	inline xml_attribute_struct* allocate_attribute(xml_allocator& alloc)  	{  		xml_memory_page* page; @@ -500,8 +527,8 @@ namespace  	{  		uintptr_t header = a->header; -		if (header & xml_memory_page_name_allocated_mask) alloc.deallocate_string(a->name); -		if (header & xml_memory_page_value_allocated_mask) alloc.deallocate_string(a->value); +		if (header & impl::xml_memory_page_name_allocated_mask) alloc.deallocate_string(a->name); +		if (header & impl::xml_memory_page_value_allocated_mask) alloc.deallocate_string(a->value);  		alloc.deallocate_memory(a, sizeof(xml_attribute_struct), reinterpret_cast<xml_memory_page*>(header & xml_memory_page_pointer_mask));  	} @@ -510,8 +537,8 @@ namespace  	{  		uintptr_t header = n->header; -		if (header & xml_memory_page_name_allocated_mask) alloc.deallocate_string(n->name); -		if (header & xml_memory_page_value_allocated_mask) alloc.deallocate_string(n->value); +		if (header & impl::xml_memory_page_name_allocated_mask) alloc.deallocate_string(n->name); +		if (header & impl::xml_memory_page_value_allocated_mask) alloc.deallocate_string(n->value);  		for (xml_attribute_struct* attr = n->first_attribute; attr; )  		{ @@ -534,7 +561,7 @@ namespace  		alloc.deallocate_memory(n, sizeof(xml_node_struct), reinterpret_cast<xml_memory_page*>(header & xml_memory_page_pointer_mask));  	} -	PUGIXML_NO_INLINE xml_node_struct* append_node(xml_node_struct* node, xml_allocator& alloc, xml_node_type type = node_element) +	PUGI__FN_NO_INLINE xml_node_struct* append_node(xml_node_struct* node, xml_allocator& alloc, xml_node_type type = node_element)  	{  		xml_node_struct* child = allocate_node(alloc, type);  		if (!child) return 0; @@ -560,7 +587,7 @@ namespace  		return child;  	} -	PUGIXML_NO_INLINE xml_attribute_struct* append_attribute_ll(xml_node_struct* node, xml_allocator& alloc) +	PUGI__FN_NO_INLINE xml_attribute_struct* append_attribute_ll(xml_node_struct* node, xml_allocator& alloc)  	{  		xml_attribute_struct* a = allocate_attribute(alloc);  		if (!a) return 0; @@ -583,11 +610,10 @@ namespace  		return a;  	} -} +PUGI__NS_END  // Helper classes for code generation -namespace -{ +PUGI__NS_BEGIN  	struct opt_false  	{  		enum { value = 0 }; @@ -597,11 +623,10 @@ namespace  	{  		enum { value = 1 };  	}; -} +PUGI__NS_END  // Unicode utilities -namespace -{ +PUGI__NS_BEGIN  	inline uint16_t endian_swap(uint16_t value)  	{  		return static_cast<uint16_t>(((value & 0xff) << 8) | (value >> 8)); @@ -961,21 +986,20 @@ namespace          }  	}; -	template <typename T> inline void convert_utf_endian_swap(T* result, const T* data, size_t length) +	template <typename T> PUGI__FN void convert_utf_endian_swap(T* result, const T* data, size_t length)  	{  		for (size_t i = 0; i < length; ++i) result[i] = endian_swap(data[i]);  	}  #ifdef PUGIXML_WCHAR_MODE -	inline void convert_wchar_endian_swap(wchar_t* result, const wchar_t* data, size_t length) +	PUGI__FN void convert_wchar_endian_swap(wchar_t* result, const wchar_t* data, size_t length)  	{  		for (size_t i = 0; i < length; ++i) result[i] = static_cast<wchar_t>(endian_swap(static_cast<wchar_selector<sizeof(wchar_t)>::type>(data[i])));  	}  #endif -} +PUGI__NS_END -namespace -{	 +PUGI__NS_BEGIN  	enum chartype_t  	{  		ct_parse_pcdata = 1,	// \0, &, \r, < @@ -988,7 +1012,7 @@ namespace  		ct_start_symbol = 128	// Any symbol > 127, a-z, A-Z, _, :  	}; -	const unsigned char chartype_table[256] = +	static const unsigned char chartype_table[256] =  	{  		55,  0,   0,   0,   0,   0,   0,   0,      0,   12,  12,  0,   0,   63,  0,   0,   // 0-15  		0,   0,   0,   0,   0,   0,   0,   0,      0,   0,   0,   0,   0,   0,   0,   0,   // 16-31 @@ -1018,7 +1042,7 @@ namespace  		ctx_symbol = 16			  // Any symbol > 127, a-z, A-Z, 0-9, _, -, .  	}; -	const unsigned char chartypex_table[256] = +	static const unsigned char chartypex_table[256] =  	{  		3,  3,  3,  3,  3,  3,  3,  3,     3,  0,  2,  3,  3,  2,  3,  3,     // 0-15  		3,  3,  3,  3,  3,  3,  3,  3,     3,  3,  3,  3,  3,  3,  3,  3,     // 16-31 @@ -1041,24 +1065,24 @@ namespace  	};  #ifdef PUGIXML_WCHAR_MODE -	#define IS_CHARTYPE_IMPL(c, ct, table) ((static_cast<unsigned int>(c) < 128 ? table[static_cast<unsigned int>(c)] : table[128]) & (ct)) +	#define PUGI__IS_CHARTYPE_IMPL(c, ct, table) ((static_cast<unsigned int>(c) < 128 ? table[static_cast<unsigned int>(c)] : table[128]) & (ct))  #else -	#define IS_CHARTYPE_IMPL(c, ct, table) (table[static_cast<unsigned char>(c)] & (ct)) +	#define PUGI__IS_CHARTYPE_IMPL(c, ct, table) (table[static_cast<unsigned char>(c)] & (ct))  #endif -	#define IS_CHARTYPE(c, ct) IS_CHARTYPE_IMPL(c, ct, chartype_table) -	#define IS_CHARTYPEX(c, ct) IS_CHARTYPE_IMPL(c, ct, chartypex_table) +	#define PUGI__IS_CHARTYPE(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartype_table) +	#define PUGI__IS_CHARTYPEX(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartypex_table) -	bool is_little_endian() +	PUGI__FN bool is_little_endian()  	{  		unsigned int ui = 1;  		return *reinterpret_cast<unsigned char*>(&ui) == 1;  	} -	xml_encoding get_wchar_encoding() +	PUGI__FN xml_encoding get_wchar_encoding()  	{ -		STATIC_ASSERT(sizeof(wchar_t) == 2 || sizeof(wchar_t) == 4); +		PUGI__STATIC_ASSERT(sizeof(wchar_t) == 2 || sizeof(wchar_t) == 4);  		if (sizeof(wchar_t) == 2)  			return is_little_endian() ? encoding_utf16_le : encoding_utf16_be; @@ -1066,7 +1090,7 @@ namespace  			return is_little_endian() ? encoding_utf32_le : encoding_utf32_be;  	} -	xml_encoding guess_buffer_encoding(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) +	PUGI__FN xml_encoding guess_buffer_encoding(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)  	{  		// look for BOM in first few bytes  		if (d0 == 0 && d1 == 0 && d2 == 0xfe && d3 == 0xff) return encoding_utf32_be; @@ -1090,7 +1114,7 @@ namespace  		return encoding_utf8;  	} -	xml_encoding get_buffer_encoding(xml_encoding encoding, const void* contents, size_t size) +	PUGI__FN xml_encoding get_buffer_encoding(xml_encoding encoding, const void* contents, size_t size)  	{  		// replace wchar encoding with utf implementation  		if (encoding == encoding_wchar) return get_wchar_encoding(); @@ -1110,12 +1134,12 @@ namespace  		// try to guess encoding (based on XML specification, Appendix F.1)  		const uint8_t* data = static_cast<const uint8_t*>(contents); -		DMC_VOLATILE uint8_t d0 = data[0], d1 = data[1], d2 = data[2], d3 = data[3]; +		PUGI__DMC_VOLATILE uint8_t d0 = data[0], d1 = data[1], d2 = data[2], d3 = data[3];  		return guess_buffer_encoding(d0, d1, d2, d3);  	} -	bool get_mutable_buffer(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable) +	PUGI__FN bool get_mutable_buffer(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)  	{  		if (is_mutable)  		{ @@ -1123,7 +1147,7 @@ namespace  		}  		else  		{ -			void* buffer = global_allocate(size > 0 ? size : 1); +			void* buffer = xml_memory::allocate(size > 0 ? size : 1);  			if (!buffer) return false;  			memcpy(buffer, contents, size); @@ -1137,13 +1161,13 @@ namespace  	}  #ifdef PUGIXML_WCHAR_MODE -	inline bool need_endian_swap_utf(xml_encoding le, xml_encoding re) +	PUGI__FN bool need_endian_swap_utf(xml_encoding le, xml_encoding re)  	{  		return (le == encoding_utf16_be && re == encoding_utf16_le) || (le == encoding_utf16_le && re == encoding_utf16_be) ||  		       (le == encoding_utf32_be && re == encoding_utf32_le) || (le == encoding_utf32_le && re == encoding_utf32_be);  	} -	bool convert_buffer_endian_swap(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable) +	PUGI__FN bool convert_buffer_endian_swap(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)  	{  		const char_t* data = static_cast<const char_t*>(contents); @@ -1153,7 +1177,7 @@ namespace  		}  		else  		{ -			out_buffer = static_cast<char_t*>(global_allocate(size > 0 ? size : 1)); +			out_buffer = static_cast<char_t*>(xml_memory::allocate(size > 0 ? size : 1));  			if (!out_buffer) return false;  		} @@ -1164,7 +1188,7 @@ namespace  		return true;  	} -	bool convert_buffer_utf8(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size) +	PUGI__FN bool convert_buffer_utf8(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size)  	{  		const uint8_t* data = static_cast<const uint8_t*>(contents); @@ -1172,7 +1196,7 @@ namespace  		out_length = utf_decoder<wchar_counter>::decode_utf8_block(data, size, 0);  		// allocate buffer of suitable length -		out_buffer = static_cast<char_t*>(global_allocate((out_length > 0 ? out_length : 1) * sizeof(char_t))); +		out_buffer = static_cast<char_t*>(xml_memory::allocate((out_length > 0 ? out_length : 1) * sizeof(char_t)));  		if (!out_buffer) return false;  		// second pass: convert utf8 input to wchar_t @@ -1185,7 +1209,7 @@ namespace  		return true;  	} -	template <typename opt_swap> bool convert_buffer_utf16(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap) +	template <typename opt_swap> PUGI__FN bool convert_buffer_utf16(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)  	{  		const uint16_t* data = static_cast<const uint16_t*>(contents);  		size_t length = size / sizeof(uint16_t); @@ -1194,7 +1218,7 @@ namespace  		out_length = utf_decoder<wchar_counter, opt_swap>::decode_utf16_block(data, length, 0);  		// allocate buffer of suitable length -		out_buffer = static_cast<char_t*>(global_allocate((out_length > 0 ? out_length : 1) * sizeof(char_t))); +		out_buffer = static_cast<char_t*>(xml_memory::allocate((out_length > 0 ? out_length : 1) * sizeof(char_t)));  		if (!out_buffer) return false;  		// second pass: convert utf16 input to wchar_t @@ -1207,7 +1231,7 @@ namespace  		return true;  	} -	template <typename opt_swap> bool convert_buffer_utf32(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap) +	template <typename opt_swap> PUGI__FN bool convert_buffer_utf32(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)  	{  		const uint32_t* data = static_cast<const uint32_t*>(contents);  		size_t length = size / sizeof(uint32_t); @@ -1216,7 +1240,7 @@ namespace  		out_length = utf_decoder<wchar_counter, opt_swap>::decode_utf32_block(data, length, 0);  		// allocate buffer of suitable length -		out_buffer = static_cast<char_t*>(global_allocate((out_length > 0 ? out_length : 1) * sizeof(char_t))); +		out_buffer = static_cast<char_t*>(xml_memory::allocate((out_length > 0 ? out_length : 1) * sizeof(char_t)));  		if (!out_buffer) return false;  		// second pass: convert utf32 input to wchar_t @@ -1229,7 +1253,7 @@ namespace  		return true;  	} -	bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size) +	PUGI__FN bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size)  	{  		const uint8_t* data = static_cast<const uint8_t*>(contents); @@ -1237,7 +1261,7 @@ namespace  		out_length = size;  		// allocate buffer of suitable length -		out_buffer = static_cast<char_t*>(global_allocate((out_length > 0 ? out_length : 1) * sizeof(char_t))); +		out_buffer = static_cast<char_t*>(xml_memory::allocate((out_length > 0 ? out_length : 1) * sizeof(char_t)));  		if (!out_buffer) return false;  		// convert latin1 input to wchar_t @@ -1250,7 +1274,7 @@ namespace  		return true;  	} -	bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable) +	PUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable)  	{  		// get native encoding  		xml_encoding wchar_encoding = get_wchar_encoding(); @@ -1291,7 +1315,7 @@ namespace  		return false;  	}  #else -	template <typename opt_swap> bool convert_buffer_utf16(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap) +	template <typename opt_swap> PUGI__FN bool convert_buffer_utf16(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)  	{  		const uint16_t* data = static_cast<const uint16_t*>(contents);  		size_t length = size / sizeof(uint16_t); @@ -1300,7 +1324,7 @@ namespace  		out_length = utf_decoder<utf8_counter, opt_swap>::decode_utf16_block(data, length, 0);  		// allocate buffer of suitable length -		out_buffer = static_cast<char_t*>(global_allocate((out_length > 0 ? out_length : 1) * sizeof(char_t))); +		out_buffer = static_cast<char_t*>(xml_memory::allocate((out_length > 0 ? out_length : 1) * sizeof(char_t)));  		if (!out_buffer) return false;  		// second pass: convert utf16 input to utf8 @@ -1313,7 +1337,7 @@ namespace  		return true;  	} -	template <typename opt_swap> bool convert_buffer_utf32(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap) +	template <typename opt_swap> PUGI__FN bool convert_buffer_utf32(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)  	{  		const uint32_t* data = static_cast<const uint32_t*>(contents);  		size_t length = size / sizeof(uint32_t); @@ -1322,7 +1346,7 @@ namespace  		out_length = utf_decoder<utf8_counter, opt_swap>::decode_utf32_block(data, length, 0);  		// allocate buffer of suitable length -		out_buffer = static_cast<char_t*>(global_allocate((out_length > 0 ? out_length : 1) * sizeof(char_t))); +		out_buffer = static_cast<char_t*>(xml_memory::allocate((out_length > 0 ? out_length : 1) * sizeof(char_t)));  		if (!out_buffer) return false;  		// second pass: convert utf32 input to utf8 @@ -1335,7 +1359,7 @@ namespace  		return true;  	} -    size_t get_latin1_7bit_prefix_length(const uint8_t* data, size_t size) +    PUGI__FN size_t get_latin1_7bit_prefix_length(const uint8_t* data, size_t size)      {          for (size_t i = 0; i < size; ++i)              if (data[i] > 127) @@ -1344,7 +1368,7 @@ namespace          return size;      } -	bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable) +	PUGI__FN bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)  	{  		const uint8_t* data = static_cast<const uint8_t*>(contents); @@ -1362,7 +1386,7 @@ namespace  		out_length = prefix_length + utf_decoder<utf8_counter>::decode_latin1_block(postfix, postfix_length, 0);  		// allocate buffer of suitable length -		out_buffer = static_cast<char_t*>(global_allocate((out_length > 0 ? out_length : 1) * sizeof(char_t))); +		out_buffer = static_cast<char_t*>(xml_memory::allocate((out_length > 0 ? out_length : 1) * sizeof(char_t)));  		if (!out_buffer) return false;  		// second pass: convert latin1 input to utf8 @@ -1377,7 +1401,7 @@ namespace  		return true;  	} -	bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable) +	PUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable)  	{  		// fast path: no conversion required  		if (encoding == encoding_utf8) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable); @@ -1410,13 +1434,13 @@ namespace  	}  #endif -	size_t as_utf8_begin(const wchar_t* str, size_t length) +	PUGI__FN size_t as_utf8_begin(const wchar_t* str, size_t length)  	{  		// get length in utf8 characters          return utf_decoder<utf8_counter>::decode_wchar_block(str, length, 0);      } -    void as_utf8_end(char* buffer, size_t size, const wchar_t* str, size_t length) +    PUGI__FN void as_utf8_end(char* buffer, size_t size, const wchar_t* str, size_t length)      {          // convert to utf8          uint8_t* begin = reinterpret_cast<uint8_t*>(buffer); @@ -1430,7 +1454,7 @@ namespace  	}  #ifndef PUGIXML_NO_STL -    std::string as_utf8_impl(const wchar_t* str, size_t length) +    PUGI__FN std::string as_utf8_impl(const wchar_t* str, size_t length)      {  		// first pass: get length in utf8 characters          size_t size = as_utf8_begin(str, length); @@ -1445,7 +1469,7 @@ namespace  	  	return result;      } -	std::basic_string<wchar_t> as_wide_impl(const char* str, size_t size) +	PUGI__FN std::basic_string<wchar_t> as_wide_impl(const char* str, size_t size)  	{  		const uint8_t* data = reinterpret_cast<const uint8_t*>(str); @@ -1484,7 +1508,7 @@ namespace  		return target_length >= length && (target_length < reuse_threshold || target_length - length < target_length / 2);  	} -	bool strcpy_insitu(char_t*& dest, uintptr_t& header, uintptr_t header_mask, const char_t* source) +	PUGI__FN bool strcpy_insitu(char_t*& dest, uintptr_t& header, uintptr_t header_mask, const char_t* source)  	{  		size_t source_length = strlength(source); @@ -1572,7 +1596,7 @@ namespace  		}  	}; -	char_t* strconv_escape(char_t* s, gap& g) +	PUGI__FN char_t* strconv_escape(char_t* s, gap& g)  	{  		char_t* stre = s + 1; @@ -1715,13 +1739,13 @@ namespace  	// Utility macro for last character handling  	#define ENDSWITH(c, e) ((c) == (e) || ((c) == 0 && endch == (e))) -	char_t* strconv_comment(char_t* s, char_t endch) +	PUGI__FN char_t* strconv_comment(char_t* s, char_t endch)  	{  		gap g;  		while (true)  		{ -			while (!IS_CHARTYPE(*s, ct_parse_comment)) ++s; +			while (!PUGI__IS_CHARTYPE(*s, ct_parse_comment)) ++s;  			if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair  			{ @@ -1743,13 +1767,13 @@ namespace  		}  	} -	char_t* strconv_cdata(char_t* s, char_t endch) +	PUGI__FN char_t* strconv_cdata(char_t* s, char_t endch)  	{  		gap g;  		while (true)  		{ -			while (!IS_CHARTYPE(*s, ct_parse_cdata)) ++s; +			while (!PUGI__IS_CHARTYPE(*s, ct_parse_cdata)) ++s;  			if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair  			{ @@ -1781,7 +1805,7 @@ namespace  			while (true)  			{ -				while (!IS_CHARTYPE(*s, ct_parse_pcdata)) ++s; +				while (!PUGI__IS_CHARTYPE(*s, ct_parse_pcdata)) ++s;  				if (*s == '<') // PCDATA ends here  				{ @@ -1808,9 +1832,9 @@ namespace  		}  	}; -	strconv_pcdata_t get_strconv_pcdata(unsigned int optmask) +	PUGI__FN strconv_pcdata_t get_strconv_pcdata(unsigned int optmask)  	{ -		STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20); +		PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20);  		switch ((optmask >> 4) & 3) // get bitmask for flags (eol escapes)  		{ @@ -1831,37 +1855,37 @@ namespace  			gap g;  			// trim leading whitespaces -			if (IS_CHARTYPE(*s, ct_space)) +			if (PUGI__IS_CHARTYPE(*s, ct_space))  			{  				char_t* str = s;  				do ++str; -				while (IS_CHARTYPE(*str, ct_space)); +				while (PUGI__IS_CHARTYPE(*str, ct_space));  				g.push(s, str - s);  			}  			while (true)  			{ -				while (!IS_CHARTYPE(*s, ct_parse_attr_ws | ct_space)) ++s; +				while (!PUGI__IS_CHARTYPE(*s, ct_parse_attr_ws | ct_space)) ++s;  				if (*s == end_quote)  				{  					char_t* str = g.flush(s);  					do *str-- = 0; -					while (IS_CHARTYPE(*str, ct_space)); +					while (PUGI__IS_CHARTYPE(*str, ct_space));  					return s + 1;  				} -				else if (IS_CHARTYPE(*s, ct_space)) +				else if (PUGI__IS_CHARTYPE(*s, ct_space))  				{  					*s++ = ' '; -					if (IS_CHARTYPE(*s, ct_space)) +					if (PUGI__IS_CHARTYPE(*s, ct_space))  					{  						char_t* str = s + 1; -						while (IS_CHARTYPE(*str, ct_space)) ++str; +						while (PUGI__IS_CHARTYPE(*str, ct_space)) ++str;  						g.push(s, str - s);  					} @@ -1884,7 +1908,7 @@ namespace  			while (true)  			{ -				while (!IS_CHARTYPE(*s, ct_parse_attr_ws)) ++s; +				while (!PUGI__IS_CHARTYPE(*s, ct_parse_attr_ws)) ++s;  				if (*s == end_quote)  				{ @@ -1892,7 +1916,7 @@ namespace  					return s + 1;  				} -				else if (IS_CHARTYPE(*s, ct_space)) +				else if (PUGI__IS_CHARTYPE(*s, ct_space))  				{  					if (*s == '\r')  					{ @@ -1920,7 +1944,7 @@ namespace  			while (true)  			{ -				while (!IS_CHARTYPE(*s, ct_parse_attr)) ++s; +				while (!PUGI__IS_CHARTYPE(*s, ct_parse_attr)) ++s;  				if (*s == end_quote)  				{ @@ -1952,7 +1976,7 @@ namespace  			while (true)  			{ -				while (!IS_CHARTYPE(*s, ct_parse_attr)) ++s; +				while (!PUGI__IS_CHARTYPE(*s, ct_parse_attr)) ++s;  				if (*s == end_quote)  				{ @@ -1973,9 +1997,9 @@ namespace  		}  	}; -	strconv_attribute_t get_strconv_attribute(unsigned int optmask) +	PUGI__FN strconv_attribute_t get_strconv_attribute(unsigned int optmask)  	{ -		STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_wconv_attribute == 0x40 && parse_wnorm_attribute == 0x80); +		PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_wconv_attribute == 0x40 && parse_wnorm_attribute == 0x80);  		switch ((optmask >> 4) & 15) // get bitmask for flags (wconv wnorm eol escapes)  		{ @@ -2015,15 +2039,15 @@ namespace          xml_parse_status error_status;  		// Parser utilities. -		#define SKIPWS()			{ while (IS_CHARTYPE(*s, ct_space)) ++s; } -		#define OPTSET(OPT)			( optmsk & (OPT) ) -		#define PUSHNODE(TYPE)		{ cursor = append_node(cursor, alloc, TYPE); if (!cursor) THROW_ERROR(status_out_of_memory, s); } -		#define POPNODE()			{ cursor = cursor->parent; } -		#define SCANFOR(X)			{ while (*s != 0 && !(X)) ++s; } -		#define SCANWHILE(X)		{ while ((X)) ++s; } -		#define ENDSEG()			{ ch = *s; *s = 0; ++s; } -		#define THROW_ERROR(err, m)	return error_offset = m, error_status = err, static_cast<char_t*>(0) -		#define CHECK_ERROR(err, m)	{ if (*s == 0) THROW_ERROR(err, m); } +		#define PUGI__SKIPWS()			{ while (PUGI__IS_CHARTYPE(*s, ct_space)) ++s; } +		#define PUGI__OPTSET(OPT)			( optmsk & (OPT) ) +		#define PUGI__PUSHNODE(TYPE)		{ cursor = append_node(cursor, alloc, TYPE); if (!cursor) PUGI__THROW_ERROR(status_out_of_memory, s); } +		#define PUGI__POPNODE()			{ cursor = cursor->parent; } +		#define PUGI__SCANFOR(X)			{ while (*s != 0 && !(X)) ++s; } +		#define PUGI__SCANWHILE(X)		{ while ((X)) ++s; } +		#define PUGI__ENDSEG()			{ ch = *s; *s = 0; ++s; } +		#define PUGI__THROW_ERROR(err, m)	return error_offset = m, error_status = err, static_cast<char_t*>(0) +		#define PUGI__CHECK_ERROR(err, m)	{ if (*s == 0) PUGI__THROW_ERROR(err, m); }  		xml_parser(const xml_allocator& alloc_): alloc(alloc_), error_offset(0), error_status(status_ok)  		{ @@ -2042,8 +2066,8 @@ namespace  			{  				// quoted string  				char_t ch = *s++; -				SCANFOR(*s == ch); -				if (!*s) THROW_ERROR(status_bad_doctype, s); +				PUGI__SCANFOR(*s == ch); +				if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);  				s++;  			} @@ -2051,20 +2075,20 @@ namespace  			{  				// <? ... ?>  				s += 2; -				SCANFOR(s[0] == '?' && s[1] == '>'); // no need for ENDSWITH because ?> can't terminate proper doctype -				if (!*s) THROW_ERROR(status_bad_doctype, s); +				PUGI__SCANFOR(s[0] == '?' && s[1] == '>'); // no need for ENDSWITH because ?> can't terminate proper doctype +				if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);  				s += 2;  			}  			else if (s[0] == '<' && s[1] == '!' && s[2] == '-' && s[3] == '-')  			{  				s += 4; -				SCANFOR(s[0] == '-' && s[1] == '-' && s[2] == '>'); // no need for ENDSWITH because --> can't terminate proper doctype -				if (!*s) THROW_ERROR(status_bad_doctype, s); +				PUGI__SCANFOR(s[0] == '-' && s[1] == '-' && s[2] == '>'); // no need for ENDSWITH because --> can't terminate proper doctype +				if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);  				s += 4;  			} -			else THROW_ERROR(status_bad_doctype, s); +			else PUGI__THROW_ERROR(status_bad_doctype, s);  			return s;  		} @@ -2092,7 +2116,7 @@ namespace  				else s++;  			} -			THROW_ERROR(status_bad_doctype, s); +			PUGI__THROW_ERROR(status_bad_doctype, s);  		}  		char_t* parse_doctype_group(char_t* s, char_t endch, bool toplevel) @@ -2132,7 +2156,7 @@ namespace  				else s++;  			} -			if (!toplevel || endch != '>') THROW_ERROR(status_bad_doctype, s); +			if (!toplevel || endch != '>') PUGI__THROW_ERROR(status_bad_doctype, s);  			return s;  		} @@ -2150,31 +2174,31 @@ namespace  				{  					++s; -					if (OPTSET(parse_comments)) +					if (PUGI__OPTSET(parse_comments))  					{ -						PUSHNODE(node_comment); // Append a new node on the tree. +						PUGI__PUSHNODE(node_comment); // Append a new node on the tree.  						cursor->value = s; // Save the offset.  					} -					if (OPTSET(parse_eol) && OPTSET(parse_comments)) +					if (PUGI__OPTSET(parse_eol) && PUGI__OPTSET(parse_comments))  					{  						s = strconv_comment(s, endch); -						if (!s) THROW_ERROR(status_bad_comment, cursor->value); +						if (!s) PUGI__THROW_ERROR(status_bad_comment, cursor->value);  					}  					else  					{  						// Scan for terminating '-->'. -						SCANFOR(s[0] == '-' && s[1] == '-' && ENDSWITH(s[2], '>')); -						CHECK_ERROR(status_bad_comment, s); +						PUGI__SCANFOR(s[0] == '-' && s[1] == '-' && ENDSWITH(s[2], '>')); +						PUGI__CHECK_ERROR(status_bad_comment, s); -						if (OPTSET(parse_comments)) +						if (PUGI__OPTSET(parse_comments))  							*s = 0; // Zero-terminate this segment at the first terminating '-'.  						s += (s[2] == '>' ? 3 : 2); // Step over the '\0->'.  					}  				} -				else THROW_ERROR(status_bad_comment, s); +				else PUGI__THROW_ERROR(status_bad_comment, s);  			}  			else if (*s == '[')  			{ @@ -2183,22 +2207,22 @@ namespace  				{  					++s; -					if (OPTSET(parse_cdata)) +					if (PUGI__OPTSET(parse_cdata))  					{ -						PUSHNODE(node_cdata); // Append a new node on the tree. +						PUGI__PUSHNODE(node_cdata); // Append a new node on the tree.  						cursor->value = s; // Save the offset. -						if (OPTSET(parse_eol)) +						if (PUGI__OPTSET(parse_eol))  						{  							s = strconv_cdata(s, endch); -							if (!s) THROW_ERROR(status_bad_cdata, cursor->value); +							if (!s) PUGI__THROW_ERROR(status_bad_cdata, cursor->value);  						}  						else  						{  							// Scan for terminating ']]>'. -							SCANFOR(s[0] == ']' && s[1] == ']' && ENDSWITH(s[2], '>')); -							CHECK_ERROR(status_bad_cdata, s); +							PUGI__SCANFOR(s[0] == ']' && s[1] == ']' && ENDSWITH(s[2], '>')); +							PUGI__CHECK_ERROR(status_bad_cdata, s);  							*s++ = 0; // Zero-terminate this segment.  						} @@ -2206,44 +2230,44 @@ namespace  					else // Flagged for discard, but we still have to scan for the terminator.  					{  						// Scan for terminating ']]>'. -						SCANFOR(s[0] == ']' && s[1] == ']' && ENDSWITH(s[2], '>')); -						CHECK_ERROR(status_bad_cdata, s); +						PUGI__SCANFOR(s[0] == ']' && s[1] == ']' && ENDSWITH(s[2], '>')); +						PUGI__CHECK_ERROR(status_bad_cdata, s);  						++s;  					}  					s += (s[1] == '>' ? 2 : 1); // Step over the last ']>'.  				} -				else THROW_ERROR(status_bad_cdata, s); +				else PUGI__THROW_ERROR(status_bad_cdata, s);  			}  			else if (s[0] == 'D' && s[1] == 'O' && s[2] == 'C' && s[3] == 'T' && s[4] == 'Y' && s[5] == 'P' && ENDSWITH(s[6], 'E'))  			{  				s -= 2; -                if (cursor->parent) THROW_ERROR(status_bad_doctype, s); +                if (cursor->parent) PUGI__THROW_ERROR(status_bad_doctype, s);                  char_t* mark = s + 9;  				s = parse_doctype_group(s, endch, true);                  if (!s) return s; -                if (OPTSET(parse_doctype)) +                if (PUGI__OPTSET(parse_doctype))                  { -                    while (IS_CHARTYPE(*mark, ct_space)) ++mark; +                    while (PUGI__IS_CHARTYPE(*mark, ct_space)) ++mark; -                    PUSHNODE(node_doctype); +                    PUGI__PUSHNODE(node_doctype);                      cursor->value = mark;                      assert((s[0] == 0 && endch == '>') || s[-1] == '>');                      s[*s == 0 ? 0 : -1] = 0; -                    POPNODE(); +                    PUGI__POPNODE();                  }  			} -			else if (*s == 0 && endch == '-') THROW_ERROR(status_bad_comment, s); -			else if (*s == 0 && endch == '[') THROW_ERROR(status_bad_cdata, s); -			else THROW_ERROR(status_unrecognized_tag, s); +			else if (*s == 0 && endch == '-') PUGI__THROW_ERROR(status_bad_comment, s); +			else if (*s == 0 && endch == '[') PUGI__THROW_ERROR(status_bad_cdata, s); +			else PUGI__THROW_ERROR(status_unrecognized_tag, s);  			return s;  		} @@ -2260,50 +2284,50 @@ namespace  			// read PI target  			char_t* target = s; -			if (!IS_CHARTYPE(*s, ct_start_symbol)) THROW_ERROR(status_bad_pi, s); +			if (!PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_pi, s); -			SCANWHILE(IS_CHARTYPE(*s, ct_symbol)); -			CHECK_ERROR(status_bad_pi, s); +			PUGI__SCANWHILE(PUGI__IS_CHARTYPE(*s, ct_symbol)); +			PUGI__CHECK_ERROR(status_bad_pi, s);  			// determine node type; stricmp / strcasecmp is not portable  			bool declaration = (target[0] | ' ') == 'x' && (target[1] | ' ') == 'm' && (target[2] | ' ') == 'l' && target + 3 == s; -			if (declaration ? OPTSET(parse_declaration) : OPTSET(parse_pi)) +			if (declaration ? PUGI__OPTSET(parse_declaration) : PUGI__OPTSET(parse_pi))  			{  				if (declaration)  				{  					// disallow non top-level declarations -					if (cursor->parent) THROW_ERROR(status_bad_pi, s); +					if (cursor->parent) PUGI__THROW_ERROR(status_bad_pi, s); -					PUSHNODE(node_declaration); +					PUGI__PUSHNODE(node_declaration);  				}  				else  				{ -					PUSHNODE(node_pi); +					PUGI__PUSHNODE(node_pi);  				}  				cursor->name = target; -				ENDSEG(); +				PUGI__ENDSEG();  				// parse value/attributes  				if (ch == '?')  				{  					// empty node -					if (!ENDSWITH(*s, '>')) THROW_ERROR(status_bad_pi, s); +					if (!ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_pi, s);  					s += (*s == '>'); -					POPNODE(); +					PUGI__POPNODE();  				} -				else if (IS_CHARTYPE(ch, ct_space)) +				else if (PUGI__IS_CHARTYPE(ch, ct_space))  				{ -					SKIPWS(); +					PUGI__SKIPWS();  					// scan for tag end  					char_t* value = s; -					SCANFOR(s[0] == '?' && ENDSWITH(s[1], '>')); -					CHECK_ERROR(status_bad_pi, s); +					PUGI__SCANFOR(s[0] == '?' && ENDSWITH(s[1], '>')); +					PUGI__CHECK_ERROR(status_bad_pi, s);  					if (declaration)  					{ @@ -2317,20 +2341,20 @@ namespace  					{  						// store value and step over >  						cursor->value = value; -						POPNODE(); +						PUGI__POPNODE(); -						ENDSEG(); +						PUGI__ENDSEG();  						s += (*s == '>');  					}  				} -				else THROW_ERROR(status_bad_pi, s); +				else PUGI__THROW_ERROR(status_bad_pi, s);  			}  			else  			{  				// scan for tag end -				SCANFOR(s[0] == '?' && ENDSWITH(s[1], '>')); -				CHECK_ERROR(status_bad_pi, s); +				PUGI__SCANFOR(s[0] == '?' && ENDSWITH(s[1], '>')); +				PUGI__CHECK_ERROR(status_bad_pi, s);  				s += (s[1] == '>' ? 2 : 1);  			} @@ -2357,43 +2381,43 @@ namespace  					++s;  				LOC_TAG: -					if (IS_CHARTYPE(*s, ct_start_symbol)) // '<#...' +					if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // '<#...'  					{ -						PUSHNODE(node_element); // Append a new node to the tree. +						PUGI__PUSHNODE(node_element); // Append a new node to the tree.  						cursor->name = s; -						SCANWHILE(IS_CHARTYPE(*s, ct_symbol)); // Scan for a terminator. -						ENDSEG(); // Save char in 'ch', terminate & step over. +						PUGI__SCANWHILE(PUGI__IS_CHARTYPE(*s, ct_symbol)); // Scan for a terminator. +						PUGI__ENDSEG(); // Save char in 'ch', terminate & step over.  						if (ch == '>')  						{  							// end of tag  						} -						else if (IS_CHARTYPE(ch, ct_space)) +						else if (PUGI__IS_CHARTYPE(ch, ct_space))  						{  						LOC_ATTRIBUTES:  						    while (true)  						    { -								SKIPWS(); // Eat any whitespace. +								PUGI__SKIPWS(); // Eat any whitespace. -								if (IS_CHARTYPE(*s, ct_start_symbol)) // <... #... +								if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // <... #...  								{  									xml_attribute_struct* a = append_attribute_ll(cursor, alloc); // Make space for this attribute. -									if (!a) THROW_ERROR(status_out_of_memory, s); +									if (!a) PUGI__THROW_ERROR(status_out_of_memory, s);  									a->name = s; // Save the offset. -									SCANWHILE(IS_CHARTYPE(*s, ct_symbol)); // Scan for a terminator. -									CHECK_ERROR(status_bad_attribute, s); //$ redundant, left for performance +									PUGI__SCANWHILE(PUGI__IS_CHARTYPE(*s, ct_symbol)); // Scan for a terminator. +									PUGI__CHECK_ERROR(status_bad_attribute, s); //$ redundant, left for performance -									ENDSEG(); // Save char in 'ch', terminate & step over. -									CHECK_ERROR(status_bad_attribute, s); //$ redundant, left for performance +									PUGI__ENDSEG(); // Save char in 'ch', terminate & step over. +									PUGI__CHECK_ERROR(status_bad_attribute, s); //$ redundant, left for performance -									if (IS_CHARTYPE(ch, ct_space)) +									if (PUGI__IS_CHARTYPE(ch, ct_space))  									{ -										SKIPWS(); // Eat any whitespace. -										CHECK_ERROR(status_bad_attribute, s); //$ redundant, left for performance +										PUGI__SKIPWS(); // Eat any whitespace. +										PUGI__CHECK_ERROR(status_bad_attribute, s); //$ redundant, left for performance  										ch = *s;  										++s; @@ -2401,7 +2425,7 @@ namespace  									if (ch == '=') // '<... #=...'  									{ -										SKIPWS(); // Eat any whitespace. +										PUGI__SKIPWS(); // Eat any whitespace.  										if (*s == '"' || *s == '\'') // '<... #="...'  										{ @@ -2411,16 +2435,16 @@ namespace  											s = strconv_attribute(s, ch); -											if (!s) THROW_ERROR(status_bad_attribute, a->value); +											if (!s) PUGI__THROW_ERROR(status_bad_attribute, a->value);  											// After this line the loop continues from the start;  											// Whitespaces, / and > are ok, symbols and EOF are wrong,  											// everything else will be detected -											if (IS_CHARTYPE(*s, ct_start_symbol)) THROW_ERROR(status_bad_attribute, s); +											if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_attribute, s);  										} -										else THROW_ERROR(status_bad_attribute, s); +										else PUGI__THROW_ERROR(status_bad_attribute, s);  									} -									else THROW_ERROR(status_bad_attribute, s); +									else PUGI__THROW_ERROR(status_bad_attribute, s);  								}  								else if (*s == '/')  								{ @@ -2428,16 +2452,16 @@ namespace  									if (*s == '>')  									{ -										POPNODE(); +										PUGI__POPNODE();  										s++;  										break;  									}  									else if (*s == 0 && endch == '>')  									{ -										POPNODE(); +										PUGI__POPNODE();  										break;  									} -									else THROW_ERROR(status_bad_start_element, s); +									else PUGI__THROW_ERROR(status_bad_start_element, s);  								}  								else if (*s == '>')  								{ @@ -2449,16 +2473,16 @@ namespace  								{  									break;  								} -								else THROW_ERROR(status_bad_start_element, s); +								else PUGI__THROW_ERROR(status_bad_start_element, s);  							}  							// !!!  						}  						else if (ch == '/') // '<#.../'  						{ -							if (!ENDSWITH(*s, '>')) THROW_ERROR(status_bad_start_element, s); +							if (!ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_start_element, s); -							POPNODE(); // Pop. +							PUGI__POPNODE(); // Pop.  							s += (*s == '>');  						} @@ -2467,39 +2491,39 @@ namespace  							// we stepped over null terminator, backtrack & handle closing tag  							--s; -							if (endch != '>') THROW_ERROR(status_bad_start_element, s); +							if (endch != '>') PUGI__THROW_ERROR(status_bad_start_element, s);  						} -						else THROW_ERROR(status_bad_start_element, s); +						else PUGI__THROW_ERROR(status_bad_start_element, s);  					}  					else if (*s == '/')  					{  						++s;  						char_t* name = cursor->name; -						if (!name) THROW_ERROR(status_end_element_mismatch, s); +						if (!name) PUGI__THROW_ERROR(status_end_element_mismatch, s); -						while (IS_CHARTYPE(*s, ct_symbol)) +						while (PUGI__IS_CHARTYPE(*s, ct_symbol))  						{ -							if (*s++ != *name++) THROW_ERROR(status_end_element_mismatch, s); +							if (*s++ != *name++) PUGI__THROW_ERROR(status_end_element_mismatch, s);  						}  						if (*name)  						{ -							if (*s == 0 && name[0] == endch && name[1] == 0) THROW_ERROR(status_bad_end_element, s); -							else THROW_ERROR(status_end_element_mismatch, s); +							if (*s == 0 && name[0] == endch && name[1] == 0) PUGI__THROW_ERROR(status_bad_end_element, s); +							else PUGI__THROW_ERROR(status_end_element_mismatch, s);  						} -						POPNODE(); // Pop. +						PUGI__POPNODE(); // Pop. -						SKIPWS(); +						PUGI__SKIPWS();  						if (*s == 0)  						{ -							if (endch != '>') THROW_ERROR(status_bad_end_element, s); +							if (endch != '>') PUGI__THROW_ERROR(status_bad_end_element, s);  						}  						else  						{ -							if (*s != '>') THROW_ERROR(status_bad_end_element, s); +							if (*s != '>') PUGI__THROW_ERROR(status_bad_end_element, s);  							++s;  						}  					} @@ -2516,25 +2540,25 @@ namespace  						s = parse_exclamation(s, cursor, optmsk, endch);                          if (!s) return s;  					} -					else if (*s == 0 && endch == '?') THROW_ERROR(status_bad_pi, s); -					else THROW_ERROR(status_unrecognized_tag, s); +					else if (*s == 0 && endch == '?') PUGI__THROW_ERROR(status_bad_pi, s); +					else PUGI__THROW_ERROR(status_unrecognized_tag, s);  				}  				else  				{  					mark = s; // Save this offset while searching for a terminator. -					SKIPWS(); // Eat whitespace if no genuine PCDATA here. +					PUGI__SKIPWS(); // Eat whitespace if no genuine PCDATA here.                      if (*s == '<')                      {                          // We skipped some whitespace characters because otherwise we would take the tag branch instead of PCDATA one                          assert(mark != s); -                        if (!OPTSET(parse_ws_pcdata | parse_ws_pcdata_single)) +                        if (!PUGI__OPTSET(parse_ws_pcdata | parse_ws_pcdata_single))                          {                              continue;                          } -                        else if (OPTSET(parse_ws_pcdata_single)) +                        else if (PUGI__OPTSET(parse_ws_pcdata_single))                          {                              if (s[1] != '/' || cursor->first_child) continue;                          } @@ -2544,18 +2568,18 @@ namespace  					if (cursor->parent)  					{ -						PUSHNODE(node_pcdata); // Append a new node on the tree. +						PUGI__PUSHNODE(node_pcdata); // Append a new node on the tree.  						cursor->value = s; // Save the offset.  						s = strconv_pcdata(s); -						POPNODE(); // Pop since this is a standalone. +						PUGI__POPNODE(); // Pop since this is a standalone.  						if (!*s) break;  					}  					else  					{ -						SCANFOR(*s == '<'); // '...<' +						PUGI__SCANFOR(*s == '<'); // '...<'  						if (!*s) break;  						++s; @@ -2567,7 +2591,7 @@ namespace  			}  			// check that last tag is closed -			if (cursor != xmldoc) THROW_ERROR(status_end_element_mismatch, s); +			if (cursor != xmldoc) PUGI__THROW_ERROR(status_end_element_mismatch, s);              return s;  		} @@ -2610,7 +2634,7 @@ namespace  	};  	// Output facilities -	xml_encoding get_write_native_encoding() +	PUGI__FN xml_encoding get_write_native_encoding()  	{  	#ifdef PUGIXML_WCHAR_MODE  		return get_wchar_encoding(); @@ -2619,7 +2643,7 @@ namespace  	#endif  	} -	xml_encoding get_write_encoding(xml_encoding encoding) +	PUGI__FN xml_encoding get_write_encoding(xml_encoding encoding)  	{  		// replace wchar encoding with utf implementation  		if (encoding == encoding_wchar) return get_wchar_encoding(); @@ -2638,7 +2662,7 @@ namespace  	}  #ifdef PUGIXML_WCHAR_MODE -	size_t get_valid_length(const char_t* data, size_t length) +	PUGI__FN size_t get_valid_length(const char_t* data, size_t length)  	{  		assert(length > 0); @@ -2646,7 +2670,7 @@ namespace  		return (sizeof(wchar_t) == 2 && static_cast<unsigned int>(static_cast<uint16_t>(data[length - 1]) - 0xD800) < 0x400) ? length - 1 : length;  	} -	size_t convert_buffer(void* result, const char_t* data, size_t length, xml_encoding encoding) +	PUGI__FN size_t convert_buffer(void* result, const char_t* data, size_t length, xml_encoding encoding)  	{  		// only endian-swapping is required  		if (need_endian_swap_utf(encoding, get_wchar_encoding())) @@ -2710,7 +2734,7 @@ namespace  		return 0;  	}  #else -	size_t get_valid_length(const char_t* data, size_t length) +	PUGI__FN size_t get_valid_length(const char_t* data, size_t length)  	{  		assert(length > 4); @@ -2726,7 +2750,7 @@ namespace  		return length;  	} -	size_t convert_buffer(void* result, const char_t* data, size_t length, xml_encoding encoding) +	PUGI__FN size_t convert_buffer(void* result, const char_t* data, size_t length, xml_encoding encoding)  	{  		if (encoding == encoding_utf16_be || encoding == encoding_utf16_le)  		{ @@ -2932,7 +2956,7 @@ namespace  		xml_encoding encoding;  	}; -	void write_bom(xml_writer& writer, xml_encoding encoding) +	PUGI__FN void write_bom(xml_writer& writer, xml_encoding encoding)  	{  		switch (encoding)  		{ @@ -2964,14 +2988,14 @@ namespace  		}  	} -	void text_output_escaped(xml_buffered_writer& writer, const char_t* s, chartypex_t type) +	PUGI__FN void text_output_escaped(xml_buffered_writer& writer, const char_t* s, chartypex_t type)  	{  		while (*s)  		{  			const char_t* prev = s;  			// While *s is a usual symbol -			while (!IS_CHARTYPEX(*s, type)) ++s; +			while (!PUGI__IS_CHARTYPEX(*s, type)) ++s;  			writer.write(prev, static_cast<size_t>(s - prev)); @@ -3005,7 +3029,7 @@ namespace  		}  	} -	void text_output(xml_buffered_writer& writer, const char_t* s, chartypex_t type, unsigned int flags) +	PUGI__FN void text_output(xml_buffered_writer& writer, const char_t* s, chartypex_t type, unsigned int flags)      {          if (flags & format_no_escapes)              writer.write(s); @@ -3013,7 +3037,7 @@ namespace              text_output_escaped(writer, s, type);      } -	void text_output_cdata(xml_buffered_writer& writer, const char_t* s) +	PUGI__FN void text_output_cdata(xml_buffered_writer& writer, const char_t* s)  	{  		do  		{ @@ -3035,7 +3059,7 @@ namespace  		while (*s);  	} -	void node_output_attributes(xml_buffered_writer& writer, const xml_node& node, unsigned int flags) +	PUGI__FN void node_output_attributes(xml_buffered_writer& writer, const xml_node& node, unsigned int flags)  	{  		const char_t* default_name = PUGIXML_TEXT(":anonymous"); @@ -3051,7 +3075,7 @@ namespace  		}  	} -	void node_output(xml_buffered_writer& writer, const xml_node& node, const char_t* indent, unsigned int flags, unsigned int depth) +	PUGI__FN void node_output(xml_buffered_writer& writer, const xml_node& node, const char_t* indent, unsigned int flags, unsigned int depth)  	{  		const char_t* default_name = PUGIXML_TEXT(":anonymous"); @@ -3202,7 +3226,7 @@ namespace  		return true;  	} -	void recursive_copy_skip(xml_node& dest, const xml_node& source, const xml_node& skip) +	PUGI__FN void recursive_copy_skip(xml_node& dest, const xml_node& source, const xml_node& skip)  	{  		assert(dest.type() == source.type()); @@ -3256,9 +3280,9 @@ namespace  	}  	// we need to get length of entire file to load it in memory; the only (relatively) sane way to do it is via seek/tell trick -	xml_parse_status get_file_size(FILE* file, size_t& out_result) +	PUGI__FN xml_parse_status get_file_size(FILE* file, size_t& out_result)  	{ -	#if defined(MSVC_CRT_VERSION) && MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE) +	#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE)  		// there are 64-bit versions of fseek/ftell, let's use them  		typedef __int64 length_type; @@ -3295,7 +3319,7 @@ namespace  		return status_ok;  	} -	xml_parse_result load_file_impl(xml_document& doc, FILE* file, unsigned int options, xml_encoding encoding) +	PUGI__FN xml_parse_result load_file_impl(xml_document& doc, FILE* file, unsigned int options, xml_encoding encoding)  	{  		if (!file) return make_parse_result(status_file_not_found); @@ -3310,7 +3334,7 @@ namespace  		}  		// allocate buffer for the whole file -		char* contents = static_cast<char*>(global_allocate(size > 0 ? size : 1)); +		char* contents = static_cast<char*>(xml_memory::allocate(size > 0 ? size : 1));  		if (!contents)  		{ @@ -3324,7 +3348,7 @@ namespace  		if (read_size != size)  		{ -			global_deallocate(contents); +			xml_memory::deallocate(contents);  			return make_parse_result(status_io_error);  		} @@ -3336,7 +3360,7 @@ namespace      {          static xml_stream_chunk* create()          { -            void* memory = global_allocate(sizeof(xml_stream_chunk)); +            void* memory = xml_memory::allocate(sizeof(xml_stream_chunk));              return new (memory) xml_stream_chunk();          } @@ -3349,7 +3373,7 @@ namespace              while (chunk)              {                  xml_stream_chunk* next = chunk->next; -                global_deallocate(chunk); +                xml_memory::deallocate(chunk);                  chunk = next;              }          } @@ -3364,7 +3388,7 @@ namespace          T data[xml_memory_page_size / sizeof(T)];      }; -	template <typename T> xml_parse_status load_stream_data_noseek(std::basic_istream<T>& stream, void** out_buffer, size_t* out_size) +	template <typename T> PUGI__FN xml_parse_status load_stream_data_noseek(std::basic_istream<T>& stream, void** out_buffer, size_t* out_size)      {          buffer_holder chunks(0, xml_stream_chunk<T>::destroy); @@ -3395,7 +3419,7 @@ namespace          }          // copy chunk list to a contiguous buffer -        char* buffer = static_cast<char*>(global_allocate(total)); +        char* buffer = static_cast<char*>(xml_memory::allocate(total));          if (!buffer) return status_out_of_memory;          char* write = buffer; @@ -3416,7 +3440,7 @@ namespace          return status_ok;      } -	template <typename T> xml_parse_status load_stream_data_seek(std::basic_istream<T>& stream, void** out_buffer, size_t* out_size) +	template <typename T> PUGI__FN xml_parse_status load_stream_data_seek(std::basic_istream<T>& stream, void** out_buffer, size_t* out_size)  	{  		// get length of remaining data in stream  		typename std::basic_istream<T>::pos_type pos = stream.tellg(); @@ -3432,7 +3456,7 @@ namespace  		if (static_cast<std::streamsize>(read_length) != length || length < 0) return status_out_of_memory;  		// read stream data into memory (guard against stream exceptions with buffer holder) -		buffer_holder buffer(global_allocate((read_length > 0 ? read_length : 1) * sizeof(T)), global_deallocate); +		buffer_holder buffer(xml_memory::allocate((read_length > 0 ? read_length : 1) * sizeof(T)), xml_memory::deallocate);  		if (!buffer.data) return status_out_of_memory;  		stream.read(static_cast<T*>(buffer.data), static_cast<std::streamsize>(read_length)); @@ -3450,7 +3474,7 @@ namespace          return status_ok;  	} -	template <typename T> xml_parse_result load_stream_impl(xml_document& doc, std::basic_istream<T>& stream, unsigned int options, xml_encoding encoding) +	template <typename T> PUGI__FN xml_parse_result load_stream_impl(xml_document& doc, std::basic_istream<T>& stream, unsigned int options, xml_encoding encoding)  	{          void* buffer = 0;          size_t size = 0; @@ -3463,13 +3487,13 @@ namespace      }  #endif -#if defined(MSVC_CRT_VERSION) || defined(__BORLANDC__) || defined(__MINGW32__) -	FILE* open_file_wide(const wchar_t* path, const wchar_t* mode) +#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) || defined(__MINGW32__) +	PUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode)  	{  		return _wfopen(path, mode);  	}  #else -	char* convert_path_heap(const wchar_t* str) +	PUGI__FN char* convert_path_heap(const wchar_t* str)  	{  		assert(str); @@ -3478,7 +3502,7 @@ namespace          size_t size = as_utf8_begin(str, length);  		// allocate resulting string -		char* result = static_cast<char*>(global_allocate(size + 1)); +		char* result = static_cast<char*>(xml_memory::allocate(size + 1));  		if (!result) return 0;  		// second pass: convert to utf8 @@ -3487,7 +3511,7 @@ namespace  	  	return result;  	} -	FILE* open_file_wide(const wchar_t* path, const wchar_t* mode) +	PUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode)  	{  		// there is no standard function to open wide paths, so our best bet is to try utf8 path  		char* path_utf8 = convert_path_heap(path); @@ -3501,34 +3525,34 @@ namespace  		FILE* result = fopen(path_utf8, mode_ascii);  		// free dummy buffer -		global_deallocate(path_utf8); +		xml_memory::deallocate(path_utf8);  		return result;  	}  #endif -} +PUGI__NS_END  namespace pugi  { -	xml_writer_file::xml_writer_file(void* file_): file(file_) +	PUGI__FN xml_writer_file::xml_writer_file(void* file_): file(file_)  	{  	} -	void xml_writer_file::write(const void* data, size_t size) +	PUGI__FN void xml_writer_file::write(const void* data, size_t size)  	{  		fwrite(data, size, 1, static_cast<FILE*>(file));  	}  #ifndef PUGIXML_NO_STL -	xml_writer_stream::xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream): narrow_stream(&stream), wide_stream(0) +	PUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream): narrow_stream(&stream), wide_stream(0)  	{  	} -	xml_writer_stream::xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream): narrow_stream(0), wide_stream(&stream) +	PUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream): narrow_stream(0), wide_stream(&stream)  	{  	} -	void xml_writer_stream::write(const void* data, size_t size) +	PUGI__FN void xml_writer_stream::write(const void* data, size_t size)  	{  		if (narrow_stream)  		{ @@ -3545,92 +3569,92 @@ namespace pugi  	}  #endif -	xml_tree_walker::xml_tree_walker(): _depth(0) +	PUGI__FN xml_tree_walker::xml_tree_walker(): _depth(0)  	{  	} -	xml_tree_walker::~xml_tree_walker() +	PUGI__FN xml_tree_walker::~xml_tree_walker()  	{  	} -	int xml_tree_walker::depth() const +	PUGI__FN int xml_tree_walker::depth() const  	{  		return _depth;  	} -	bool xml_tree_walker::begin(xml_node&) +	PUGI__FN bool xml_tree_walker::begin(xml_node&)  	{  		return true;  	} -	bool xml_tree_walker::end(xml_node&) +	PUGI__FN bool xml_tree_walker::end(xml_node&)  	{  		return true;  	} -	xml_attribute::xml_attribute(): _attr(0) +	PUGI__FN xml_attribute::xml_attribute(): _attr(0)  	{  	} -	xml_attribute::xml_attribute(xml_attribute_struct* attr): _attr(attr) +	PUGI__FN xml_attribute::xml_attribute(xml_attribute_struct* attr): _attr(attr)  	{  	} -    static void unspecified_bool_xml_attribute(xml_attribute***) +    PUGI__FN static void unspecified_bool_xml_attribute(xml_attribute***)      {      } -	xml_attribute::operator xml_attribute::unspecified_bool_type() const +	PUGI__FN xml_attribute::operator xml_attribute::unspecified_bool_type() const  	{        	return _attr ? unspecified_bool_xml_attribute : 0;     	} -   	bool xml_attribute::operator!() const +   	PUGI__FN bool xml_attribute::operator!() const     	{     		return !_attr;     	} -	bool xml_attribute::operator==(const xml_attribute& r) const +	PUGI__FN bool xml_attribute::operator==(const xml_attribute& r) const  	{  		return (_attr == r._attr);  	} -	bool xml_attribute::operator!=(const xml_attribute& r) const +	PUGI__FN bool xml_attribute::operator!=(const xml_attribute& r) const  	{  		return (_attr != r._attr);  	} -	bool xml_attribute::operator<(const xml_attribute& r) const +	PUGI__FN bool xml_attribute::operator<(const xml_attribute& r) const  	{  		return (_attr < r._attr);  	} -	bool xml_attribute::operator>(const xml_attribute& r) const +	PUGI__FN bool xml_attribute::operator>(const xml_attribute& r) const  	{  		return (_attr > r._attr);  	} -	bool xml_attribute::operator<=(const xml_attribute& r) const +	PUGI__FN bool xml_attribute::operator<=(const xml_attribute& r) const  	{  		return (_attr <= r._attr);  	} -	bool xml_attribute::operator>=(const xml_attribute& r) const +	PUGI__FN bool xml_attribute::operator>=(const xml_attribute& r) const  	{  		return (_attr >= r._attr);  	} -   	xml_attribute xml_attribute::next_attribute() const +   	PUGI__FN xml_attribute xml_attribute::next_attribute() const     	{      	return _attr ? xml_attribute(_attr->next_attribute) : xml_attribute();     	} -    xml_attribute xml_attribute::previous_attribute() const +    PUGI__FN xml_attribute xml_attribute::previous_attribute() const      {      	return _attr && _attr->prev_attribute_c->next_attribute ? xml_attribute(_attr->prev_attribute_c) : xml_attribute();      } -	int xml_attribute::as_int() const +	PUGI__FN int xml_attribute::as_int() const  	{  		if (!_attr || !_attr->value) return 0; @@ -3641,7 +3665,7 @@ namespace pugi  	#endif  	} -	unsigned int xml_attribute::as_uint() const +	PUGI__FN unsigned int xml_attribute::as_uint() const  	{  		if (!_attr || !_attr->value) return 0; @@ -3652,7 +3676,7 @@ namespace pugi  	#endif  	} -	double xml_attribute::as_double() const +	PUGI__FN double xml_attribute::as_double() const  	{  		if (!_attr || !_attr->value) return 0; @@ -3663,7 +3687,7 @@ namespace pugi  	#endif  	} -	float xml_attribute::as_float() const +	PUGI__FN float xml_attribute::as_float() const  	{  		if (!_attr || !_attr->value) return 0; @@ -3674,7 +3698,7 @@ namespace pugi  	#endif  	} -	bool xml_attribute::as_bool() const +	PUGI__FN bool xml_attribute::as_bool() const  	{  		if (!_attr || !_attr->value) return false; @@ -3685,83 +3709,83 @@ namespace pugi  		return (first == '1' || first == 't' || first == 'T' || first == 'y' || first == 'Y');  	} -	bool xml_attribute::empty() const +	PUGI__FN bool xml_attribute::empty() const  	{  		return !_attr;  	} -	const char_t* xml_attribute::name() const +	PUGI__FN const char_t* xml_attribute::name() const  	{  		return (_attr && _attr->name) ? _attr->name : PUGIXML_TEXT("");  	} -	const char_t* xml_attribute::value() const +	PUGI__FN const char_t* xml_attribute::value() const  	{  		return (_attr && _attr->value) ? _attr->value : PUGIXML_TEXT("");  	} -    size_t xml_attribute::hash_value() const +    PUGI__FN size_t xml_attribute::hash_value() const      {          return static_cast<size_t>(reinterpret_cast<uintptr_t>(_attr) / sizeof(xml_attribute_struct));      } -	xml_attribute_struct* xml_attribute::internal_object() const +	PUGI__FN xml_attribute_struct* xml_attribute::internal_object() const  	{          return _attr;  	} -	xml_attribute& xml_attribute::operator=(const char_t* rhs) +	PUGI__FN xml_attribute& xml_attribute::operator=(const char_t* rhs)  	{  		set_value(rhs);  		return *this;  	} -	xml_attribute& xml_attribute::operator=(int rhs) +	PUGI__FN xml_attribute& xml_attribute::operator=(int rhs)  	{  		set_value(rhs);  		return *this;  	} -	xml_attribute& xml_attribute::operator=(unsigned int rhs) +	PUGI__FN xml_attribute& xml_attribute::operator=(unsigned int rhs)  	{  		set_value(rhs);  		return *this;  	} -	xml_attribute& xml_attribute::operator=(double rhs) +	PUGI__FN xml_attribute& xml_attribute::operator=(double rhs)  	{  		set_value(rhs);  		return *this;  	} -	xml_attribute& xml_attribute::operator=(bool rhs) +	PUGI__FN xml_attribute& xml_attribute::operator=(bool rhs)  	{  		set_value(rhs);  		return *this;  	} -	bool xml_attribute::set_name(const char_t* rhs) +	PUGI__FN bool xml_attribute::set_name(const char_t* rhs)  	{  		if (!_attr) return false; -		return strcpy_insitu(_attr->name, _attr->header, xml_memory_page_name_allocated_mask, rhs); +		return impl::strcpy_insitu(_attr->name, _attr->header, impl::xml_memory_page_name_allocated_mask, rhs);  	} -	bool xml_attribute::set_value(const char_t* rhs) +	PUGI__FN bool xml_attribute::set_value(const char_t* rhs)  	{  		if (!_attr) return false; -		return strcpy_insitu(_attr->value, _attr->header, xml_memory_page_value_allocated_mask, rhs); +		return impl::strcpy_insitu(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);  	} -	bool xml_attribute::set_value(int rhs) +	PUGI__FN bool xml_attribute::set_value(int rhs)  	{  		char buf[128];  		sprintf(buf, "%d", rhs);  	#ifdef PUGIXML_WCHAR_MODE  		char_t wbuf[128]; -		widen_ascii(wbuf, buf); +		impl::widen_ascii(wbuf, buf);  		return set_value(wbuf);  	#else @@ -3769,14 +3793,14 @@ namespace pugi  	#endif  	} -	bool xml_attribute::set_value(unsigned int rhs) +	PUGI__FN bool xml_attribute::set_value(unsigned int rhs)  	{  		char buf[128];  		sprintf(buf, "%u", rhs);  	#ifdef PUGIXML_WCHAR_MODE  		char_t wbuf[128]; -		widen_ascii(wbuf, buf); +		impl::widen_ascii(wbuf, buf);  		return set_value(wbuf);  	#else @@ -3784,14 +3808,14 @@ namespace pugi  	#endif  	} -	bool xml_attribute::set_value(double rhs) +	PUGI__FN bool xml_attribute::set_value(double rhs)  	{  		char buf[128];  		sprintf(buf, "%g", rhs);  	#ifdef PUGIXML_WCHAR_MODE  		char_t wbuf[128]; -		widen_ascii(wbuf, buf); +		impl::widen_ascii(wbuf, buf);  		return set_value(wbuf);  	#else @@ -3799,147 +3823,147 @@ namespace pugi  	#endif  	} -	bool xml_attribute::set_value(bool rhs) +	PUGI__FN bool xml_attribute::set_value(bool rhs)  	{  		return set_value(rhs ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false"));  	}  #ifdef __BORLANDC__ -	bool operator&&(const xml_attribute& lhs, bool rhs) +	PUGI__FN bool operator&&(const xml_attribute& lhs, bool rhs)  	{  		return (bool)lhs && rhs;  	} -	bool operator||(const xml_attribute& lhs, bool rhs) +	PUGI__FN bool operator||(const xml_attribute& lhs, bool rhs)  	{  		return (bool)lhs || rhs;  	}  #endif -	xml_node::xml_node(): _root(0) +	PUGI__FN xml_node::xml_node(): _root(0)  	{  	} -	xml_node::xml_node(xml_node_struct* p): _root(p) +	PUGI__FN xml_node::xml_node(xml_node_struct* p): _root(p)  	{  	} -    static void unspecified_bool_xml_node(xml_node***) +    PUGI__FN static void unspecified_bool_xml_node(xml_node***)      {      } -	xml_node::operator xml_node::unspecified_bool_type() const +	PUGI__FN xml_node::operator xml_node::unspecified_bool_type() const  	{        	return _root ? unspecified_bool_xml_node : 0;     	} -   	bool xml_node::operator!() const +   	PUGI__FN bool xml_node::operator!() const     	{     		return !_root;     	} -	xml_node::iterator xml_node::begin() const +	PUGI__FN xml_node::iterator xml_node::begin() const  	{  		return iterator(_root ? _root->first_child : 0, _root);  	} -	xml_node::iterator xml_node::end() const +	PUGI__FN xml_node::iterator xml_node::end() const  	{  		return iterator(0, _root);  	} -	xml_node::attribute_iterator xml_node::attributes_begin() const +	PUGI__FN xml_node::attribute_iterator xml_node::attributes_begin() const  	{  		return attribute_iterator(_root ? _root->first_attribute : 0, _root);  	} -	xml_node::attribute_iterator xml_node::attributes_end() const +	PUGI__FN xml_node::attribute_iterator xml_node::attributes_end() const  	{  		return attribute_iterator(0, _root);  	} -	bool xml_node::operator==(const xml_node& r) const +	PUGI__FN bool xml_node::operator==(const xml_node& r) const  	{  		return (_root == r._root);  	} -	bool xml_node::operator!=(const xml_node& r) const +	PUGI__FN bool xml_node::operator!=(const xml_node& r) const  	{  		return (_root != r._root);  	} -	bool xml_node::operator<(const xml_node& r) const +	PUGI__FN bool xml_node::operator<(const xml_node& r) const  	{  		return (_root < r._root);  	} -	bool xml_node::operator>(const xml_node& r) const +	PUGI__FN bool xml_node::operator>(const xml_node& r) const  	{  		return (_root > r._root);  	} -	bool xml_node::operator<=(const xml_node& r) const +	PUGI__FN bool xml_node::operator<=(const xml_node& r) const  	{  		return (_root <= r._root);  	} -	bool xml_node::operator>=(const xml_node& r) const +	PUGI__FN bool xml_node::operator>=(const xml_node& r) const  	{  		return (_root >= r._root);  	} -	bool xml_node::empty() const +	PUGI__FN bool xml_node::empty() const  	{  		return !_root;  	} -	const char_t* xml_node::name() const +	PUGI__FN const char_t* xml_node::name() const  	{  		return (_root && _root->name) ? _root->name : PUGIXML_TEXT("");  	} -	xml_node_type xml_node::type() const +	PUGI__FN xml_node_type xml_node::type() const  	{ -		return _root ? static_cast<xml_node_type>((_root->header & xml_memory_page_type_mask) + 1) : node_null; +		return _root ? static_cast<xml_node_type>((_root->header & impl::xml_memory_page_type_mask) + 1) : node_null;  	} -	const char_t* xml_node::value() const +	PUGI__FN const char_t* xml_node::value() const  	{  		return (_root && _root->value) ? _root->value : PUGIXML_TEXT("");  	} -	xml_node xml_node::child(const char_t* name_) const +	PUGI__FN xml_node xml_node::child(const char_t* name_) const  	{  		if (!_root) return xml_node();  		for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) -			if (i->name && strequal(name_, i->name)) return xml_node(i); +			if (i->name && impl::strequal(name_, i->name)) return xml_node(i);  		return xml_node();  	} -	xml_attribute xml_node::attribute(const char_t* name_) const +	PUGI__FN xml_attribute xml_node::attribute(const char_t* name_) const  	{  		if (!_root) return xml_attribute();  		for (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute) -			if (i->name && strequal(name_, i->name)) +			if (i->name && impl::strequal(name_, i->name))  				return xml_attribute(i);  		return xml_attribute();  	} -	xml_node xml_node::next_sibling(const char_t* name_) const +	PUGI__FN xml_node xml_node::next_sibling(const char_t* name_) const  	{  		if (!_root) return xml_node();  		for (xml_node_struct* i = _root->next_sibling; i; i = i->next_sibling) -			if (i->name && strequal(name_, i->name)) return xml_node(i); +			if (i->name && impl::strequal(name_, i->name)) return xml_node(i);  		return xml_node();  	} -	xml_node xml_node::next_sibling() const +	PUGI__FN xml_node xml_node::next_sibling() const  	{  		if (!_root) return xml_node(); @@ -3947,17 +3971,17 @@ namespace pugi  		else return xml_node();  	} -	xml_node xml_node::previous_sibling(const char_t* name_) const +	PUGI__FN xml_node xml_node::previous_sibling(const char_t* name_) const  	{  		if (!_root) return xml_node();  		for (xml_node_struct* i = _root->prev_sibling_c; i->next_sibling; i = i->prev_sibling_c) -			if (i->name && strequal(name_, i->name)) return xml_node(i); +			if (i->name && impl::strequal(name_, i->name)) return xml_node(i);  		return xml_node();  	} -	xml_node xml_node::previous_sibling() const +	PUGI__FN xml_node xml_node::previous_sibling() const  	{  		if (!_root) return xml_node(); @@ -3965,27 +3989,27 @@ namespace pugi  		else return xml_node();  	} -	xml_node xml_node::parent() const +	PUGI__FN xml_node xml_node::parent() const  	{  		return _root ? xml_node(_root->parent) : xml_node();  	} -	xml_node xml_node::root() const +	PUGI__FN xml_node xml_node::root() const  	{  		if (!_root) return xml_node(); -		xml_memory_page* page = reinterpret_cast<xml_memory_page*>(_root->header & xml_memory_page_pointer_mask); +		impl::xml_memory_page* page = reinterpret_cast<impl::xml_memory_page*>(_root->header & impl::xml_memory_page_pointer_mask); -		return xml_node(static_cast<xml_document_struct*>(page->allocator)); +		return xml_node(static_cast<impl::xml_document_struct*>(page->allocator));  	} -	const char_t* xml_node::child_value() const +	PUGI__FN const char_t* xml_node::child_value() const  	{  		if (!_root) return PUGIXML_TEXT("");  		for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)  		{ -			xml_node_type type_ = static_cast<xml_node_type>((i->header & xml_memory_page_type_mask) + 1); +			xml_node_type type_ = static_cast<xml_node_type>((i->header & impl::xml_memory_page_type_mask) + 1);  			if (i->value && (type_ == node_pcdata || type_ == node_cdata))  				return i->value; @@ -3994,46 +4018,46 @@ namespace pugi  		return PUGIXML_TEXT("");  	} -	const char_t* xml_node::child_value(const char_t* name_) const +	PUGI__FN const char_t* xml_node::child_value(const char_t* name_) const  	{  		return child(name_).child_value();  	} -	xml_attribute xml_node::first_attribute() const +	PUGI__FN xml_attribute xml_node::first_attribute() const  	{  		return _root ? xml_attribute(_root->first_attribute) : xml_attribute();  	} -	xml_attribute xml_node::last_attribute() const +	PUGI__FN xml_attribute xml_node::last_attribute() const  	{  		return _root && _root->first_attribute ? xml_attribute(_root->first_attribute->prev_attribute_c) : xml_attribute();  	} -	xml_node xml_node::first_child() const +	PUGI__FN xml_node xml_node::first_child() const  	{  		return _root ? xml_node(_root->first_child) : xml_node();  	} -	xml_node xml_node::last_child() const +	PUGI__FN xml_node xml_node::last_child() const  	{  		return _root && _root->first_child ? xml_node(_root->first_child->prev_sibling_c) : xml_node();  	} -	bool xml_node::set_name(const char_t* rhs) +	PUGI__FN bool xml_node::set_name(const char_t* rhs)  	{  		switch (type())  		{  		case node_pi:  		case node_declaration:  		case node_element: -			return strcpy_insitu(_root->name, _root->header, xml_memory_page_name_allocated_mask, rhs); +			return impl::strcpy_insitu(_root->name, _root->header, impl::xml_memory_page_name_allocated_mask, rhs);  		default:  			return false;  		}  	} -	bool xml_node::set_value(const char_t* rhs) +	PUGI__FN bool xml_node::set_value(const char_t* rhs)  	{  		switch (type())  		{ @@ -4042,28 +4066,28 @@ namespace pugi  		case node_pcdata:  		case node_comment:          case node_doctype: -			return strcpy_insitu(_root->value, _root->header, xml_memory_page_value_allocated_mask, rhs); +			return impl::strcpy_insitu(_root->value, _root->header, impl::xml_memory_page_value_allocated_mask, rhs);  		default:  			return false;  		}  	} -	xml_attribute xml_node::append_attribute(const char_t* name_) +	PUGI__FN xml_attribute xml_node::append_attribute(const char_t* name_)  	{  		if (type() != node_element && type() != node_declaration) return xml_attribute(); -		xml_attribute a(append_attribute_ll(_root, get_allocator(_root))); +		xml_attribute a(impl::append_attribute_ll(_root, impl::get_allocator(_root)));  		a.set_name(name_);  		return a;  	} -	xml_attribute xml_node::prepend_attribute(const char_t* name_) +	PUGI__FN xml_attribute xml_node::prepend_attribute(const char_t* name_)  	{  		if (type() != node_element && type() != node_declaration) return xml_attribute(); -		xml_attribute a(allocate_attribute(get_allocator(_root))); +		xml_attribute a(impl::allocate_attribute(impl::get_allocator(_root)));  		if (!a) return xml_attribute();  		a.set_name(name_); @@ -4084,7 +4108,7 @@ namespace pugi  		return a;  	} -	xml_attribute xml_node::insert_attribute_before(const char_t* name_, const xml_attribute& attr) +	PUGI__FN xml_attribute xml_node::insert_attribute_before(const char_t* name_, const xml_attribute& attr)  	{  		if ((type() != node_element && type() != node_declaration) || attr.empty()) return xml_attribute(); @@ -4095,7 +4119,7 @@ namespace pugi  		if (cur != _root->first_attribute) return xml_attribute(); -		xml_attribute a(allocate_attribute(get_allocator(_root))); +		xml_attribute a(impl::allocate_attribute(impl::get_allocator(_root)));  		if (!a) return xml_attribute();  		a.set_name(name_); @@ -4112,7 +4136,7 @@ namespace pugi  		return a;  	} -	xml_attribute xml_node::insert_attribute_after(const char_t* name_, const xml_attribute& attr) +	PUGI__FN xml_attribute xml_node::insert_attribute_after(const char_t* name_, const xml_attribute& attr)  	{  		if ((type() != node_element && type() != node_declaration) || attr.empty()) return xml_attribute(); @@ -4123,7 +4147,7 @@ namespace pugi  		if (cur != _root->first_attribute) return xml_attribute(); -		xml_attribute a(allocate_attribute(get_allocator(_root))); +		xml_attribute a(impl::allocate_attribute(impl::get_allocator(_root)));  		if (!a) return xml_attribute();  		a.set_name(name_); @@ -4140,7 +4164,7 @@ namespace pugi  		return a;  	} -	xml_attribute xml_node::append_copy(const xml_attribute& proto) +	PUGI__FN xml_attribute xml_node::append_copy(const xml_attribute& proto)  	{  		if (!proto) return xml_attribute(); @@ -4150,7 +4174,7 @@ namespace pugi  		return result;  	} -	xml_attribute xml_node::prepend_copy(const xml_attribute& proto) +	PUGI__FN xml_attribute xml_node::prepend_copy(const xml_attribute& proto)  	{  		if (!proto) return xml_attribute(); @@ -4160,7 +4184,7 @@ namespace pugi  		return result;  	} -	xml_attribute xml_node::insert_copy_after(const xml_attribute& proto, const xml_attribute& attr) +	PUGI__FN xml_attribute xml_node::insert_copy_after(const xml_attribute& proto, const xml_attribute& attr)  	{  		if (!proto) return xml_attribute(); @@ -4170,7 +4194,7 @@ namespace pugi  		return result;  	} -	xml_attribute xml_node::insert_copy_before(const xml_attribute& proto, const xml_attribute& attr) +	PUGI__FN xml_attribute xml_node::insert_copy_before(const xml_attribute& proto, const xml_attribute& attr)  	{  		if (!proto) return xml_attribute(); @@ -4180,22 +4204,22 @@ namespace pugi  		return result;  	} -	xml_node xml_node::append_child(xml_node_type type_) +	PUGI__FN xml_node xml_node::append_child(xml_node_type type_)  	{ -		if (!allow_insert_child(this->type(), type_)) return xml_node(); +		if (!impl::allow_insert_child(this->type(), type_)) return xml_node(); -		xml_node n(append_node(_root, get_allocator(_root), type_)); +		xml_node n(impl::append_node(_root, impl::get_allocator(_root), type_));  		if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml"));  		return n;  	} -	xml_node xml_node::prepend_child(xml_node_type type_) +	PUGI__FN xml_node xml_node::prepend_child(xml_node_type type_)  	{ -		if (!allow_insert_child(this->type(), type_)) return xml_node(); +		if (!impl::allow_insert_child(this->type(), type_)) return xml_node(); -		xml_node n(allocate_node(get_allocator(_root), type_)); +		xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));  		if (!n) return xml_node();          n._root->parent = _root; @@ -4218,12 +4242,12 @@ namespace pugi  		return n;  	} -	xml_node xml_node::insert_child_before(xml_node_type type_, const xml_node& node) +	PUGI__FN xml_node xml_node::insert_child_before(xml_node_type type_, const xml_node& node)  	{ -		if (!allow_insert_child(this->type(), type_)) return xml_node(); +		if (!impl::allow_insert_child(this->type(), type_)) return xml_node();  		if (!node._root || node._root->parent != _root) return xml_node(); -		xml_node n(allocate_node(get_allocator(_root), type_)); +		xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));  		if (!n) return xml_node();  		n._root->parent = _root; @@ -4242,12 +4266,12 @@ namespace pugi  		return n;  	} -	xml_node xml_node::insert_child_after(xml_node_type type_, const xml_node& node) +	PUGI__FN xml_node xml_node::insert_child_after(xml_node_type type_, const xml_node& node)  	{ -		if (!allow_insert_child(this->type(), type_)) return xml_node(); +		if (!impl::allow_insert_child(this->type(), type_)) return xml_node();  		if (!node._root || node._root->parent != _root) return xml_node(); -		xml_node n(allocate_node(get_allocator(_root), type_)); +		xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));  		if (!n) return xml_node();  		n._root->parent = _root; @@ -4266,7 +4290,7 @@ namespace pugi  		return n;  	} -    xml_node xml_node::append_child(const char_t* name_) +    PUGI__FN xml_node xml_node::append_child(const char_t* name_)      {          xml_node result = append_child(node_element); @@ -4275,7 +4299,7 @@ namespace pugi          return result;      } -    xml_node xml_node::prepend_child(const char_t* name_) +    PUGI__FN xml_node xml_node::prepend_child(const char_t* name_)      {          xml_node result = prepend_child(node_element); @@ -4284,7 +4308,7 @@ namespace pugi          return result;      } -    xml_node xml_node::insert_child_after(const char_t* name_, const xml_node& node) +    PUGI__FN xml_node xml_node::insert_child_after(const char_t* name_, const xml_node& node)      {          xml_node result = insert_child_after(node_element, node); @@ -4293,7 +4317,7 @@ namespace pugi          return result;      } -    xml_node xml_node::insert_child_before(const char_t* name_, const xml_node& node) +    PUGI__FN xml_node xml_node::insert_child_before(const char_t* name_, const xml_node& node)      {          xml_node result = insert_child_before(node_element, node); @@ -4302,48 +4326,48 @@ namespace pugi          return result;      } -	xml_node xml_node::append_copy(const xml_node& proto) +	PUGI__FN xml_node xml_node::append_copy(const xml_node& proto)  	{  		xml_node result = append_child(proto.type()); -		if (result) recursive_copy_skip(result, proto, result); +		if (result) impl::recursive_copy_skip(result, proto, result);  		return result;  	} -	xml_node xml_node::prepend_copy(const xml_node& proto) +	PUGI__FN xml_node xml_node::prepend_copy(const xml_node& proto)  	{  		xml_node result = prepend_child(proto.type()); -		if (result) recursive_copy_skip(result, proto, result); +		if (result) impl::recursive_copy_skip(result, proto, result);  		return result;  	} -	xml_node xml_node::insert_copy_after(const xml_node& proto, const xml_node& node) +	PUGI__FN xml_node xml_node::insert_copy_after(const xml_node& proto, const xml_node& node)  	{  		xml_node result = insert_child_after(proto.type(), node); -		if (result) recursive_copy_skip(result, proto, result); +		if (result) impl::recursive_copy_skip(result, proto, result);  		return result;  	} -	xml_node xml_node::insert_copy_before(const xml_node& proto, const xml_node& node) +	PUGI__FN xml_node xml_node::insert_copy_before(const xml_node& proto, const xml_node& node)  	{  		xml_node result = insert_child_before(proto.type(), node); -		if (result) recursive_copy_skip(result, proto, result); +		if (result) impl::recursive_copy_skip(result, proto, result);  		return result;  	} -	bool xml_node::remove_attribute(const char_t* name_) +	PUGI__FN bool xml_node::remove_attribute(const char_t* name_)  	{  		return remove_attribute(attribute(name_));  	} -	bool xml_node::remove_attribute(const xml_attribute& a) +	PUGI__FN bool xml_node::remove_attribute(const xml_attribute& a)  	{  		if (!_root || !a._attr) return false; @@ -4360,17 +4384,17 @@ namespace pugi  		if (a._attr->prev_attribute_c->next_attribute) a._attr->prev_attribute_c->next_attribute = a._attr->next_attribute;  		else _root->first_attribute = a._attr->next_attribute; -		destroy_attribute(a._attr, get_allocator(_root)); +		impl::destroy_attribute(a._attr, impl::get_allocator(_root));  		return true;  	} -	bool xml_node::remove_child(const char_t* name_) +	PUGI__FN bool xml_node::remove_child(const char_t* name_)  	{  		return remove_child(child(name_));  	} -	bool xml_node::remove_child(const xml_node& n) +	PUGI__FN bool xml_node::remove_child(const xml_node& n)  	{  		if (!_root || !n._root || n._root->parent != _root) return false; @@ -4380,40 +4404,40 @@ namespace pugi  		if (n._root->prev_sibling_c->next_sibling) n._root->prev_sibling_c->next_sibling = n._root->next_sibling;  		else _root->first_child = n._root->next_sibling; -        destroy_node(n._root, get_allocator(_root)); +        impl::destroy_node(n._root, impl::get_allocator(_root));  		return true;  	} -	xml_node xml_node::find_child_by_attribute(const char_t* name_, const char_t* attr_name, const char_t* attr_value) const +	PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* name_, const char_t* attr_name, const char_t* attr_value) const  	{  		if (!_root) return xml_node();  		for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) -			if (i->name && strequal(name_, i->name)) +			if (i->name && impl::strequal(name_, i->name))  			{  				for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute) -					if (strequal(attr_name, a->name) && strequal(attr_value, a->value)) +					if (impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value))  						return xml_node(i);  			}  		return xml_node();  	} -	xml_node xml_node::find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const +	PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const  	{  		if (!_root) return xml_node();  		for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)  			for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute) -				if (strequal(attr_name, a->name) && strequal(attr_value, a->value)) +				if (impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value))  					return xml_node(i);  		return xml_node();  	}  #ifndef PUGIXML_NO_STL -	string_t xml_node::path(char_t delimiter) const +	PUGI__FN string_t xml_node::path(char_t delimiter) const  	{  		xml_node cursor = *this; // Make a copy. @@ -4433,7 +4457,7 @@ namespace pugi  	}  #endif -	xml_node xml_node::first_element_by_path(const char_t* path_, char_t delimiter) const +	PUGI__FN xml_node xml_node::first_element_by_path(const char_t* path_, char_t delimiter) const  	{  		xml_node found = *this; // Current search context. @@ -4468,7 +4492,7 @@ namespace pugi  		{  			for (xml_node_struct* j = found._root->first_child; j; j = j->next_sibling)  			{ -				if (j->name && strequalrange(j->name, path_segment, static_cast<size_t>(path_segment_end - path_segment))) +				if (j->name && impl::strequalrange(j->name, path_segment, static_cast<size_t>(path_segment_end - path_segment)))  				{  					xml_node subsearch = xml_node(j).first_element_by_path(next_segment, delimiter); @@ -4480,7 +4504,7 @@ namespace pugi  		}  	} -	bool xml_node::traverse(xml_tree_walker& walker) +	PUGI__FN bool xml_node::traverse(xml_tree_walker& walker)  	{  		walker._depth = -1; @@ -4528,34 +4552,34 @@ namespace pugi  		return walker.end(arg_end);  	} -    size_t xml_node::hash_value() const +    PUGI__FN size_t xml_node::hash_value() const      {          return static_cast<size_t>(reinterpret_cast<uintptr_t>(_root) / sizeof(xml_node_struct));      } -	xml_node_struct* xml_node::internal_object() const +	PUGI__FN xml_node_struct* xml_node::internal_object() const  	{          return _root;  	} -	void xml_node::print(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const +	PUGI__FN void xml_node::print(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const  	{  		if (!_root) return; -		xml_buffered_writer buffered_writer(writer, encoding); +		impl::xml_buffered_writer buffered_writer(writer, encoding); -		node_output(buffered_writer, *this, indent, flags, depth); +		impl::node_output(buffered_writer, *this, indent, flags, depth);  	}  #ifndef PUGIXML_NO_STL -	void xml_node::print(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const +	PUGI__FN void xml_node::print(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const  	{  		xml_writer_stream writer(stream);  		print(writer, indent, flags, encoding, depth);  	} -	void xml_node::print(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent, unsigned int flags, unsigned int depth) const +	PUGI__FN void xml_node::print(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent, unsigned int flags, unsigned int depth) const  	{  		xml_writer_stream writer(stream); @@ -4563,13 +4587,13 @@ namespace pugi  	}  #endif -	ptrdiff_t xml_node::offset_debug() const +	PUGI__FN ptrdiff_t xml_node::offset_debug() const  	{  		xml_node_struct* r = root()._root;  		if (!r) return -1; -		const char_t* buffer = static_cast<xml_document_struct*>(r)->buffer; +		const char_t* buffer = static_cast<impl::xml_document_struct*>(r)->buffer;  		if (!buffer) return -1; @@ -4581,13 +4605,13 @@ namespace pugi  		case node_element:  		case node_declaration:  		case node_pi: -			return (_root->header & xml_memory_page_name_allocated_mask) ? -1 : _root->name - buffer; +			return (_root->header & impl::xml_memory_page_name_allocated_mask) ? -1 : _root->name - buffer;  		case node_pcdata:  		case node_cdata:  		case node_comment:  		case node_doctype: -			return (_root->header & xml_memory_page_value_allocated_mask) ? -1 : _root->value - buffer; +			return (_root->header & impl::xml_memory_page_value_allocated_mask) ? -1 : _root->value - buffer;  		default:  			return -1; @@ -4595,149 +4619,149 @@ namespace pugi  	}  #ifdef __BORLANDC__ -	bool operator&&(const xml_node& lhs, bool rhs) +	PUGI__FN bool operator&&(const xml_node& lhs, bool rhs)  	{  		return (bool)lhs && rhs;  	} -	bool operator||(const xml_node& lhs, bool rhs) +	PUGI__FN bool operator||(const xml_node& lhs, bool rhs)  	{  		return (bool)lhs || rhs;  	}  #endif -	xml_node_iterator::xml_node_iterator() +	PUGI__FN xml_node_iterator::xml_node_iterator()  	{  	} -	xml_node_iterator::xml_node_iterator(const xml_node& node): _wrap(node), _parent(node.parent()) +	PUGI__FN xml_node_iterator::xml_node_iterator(const xml_node& node): _wrap(node), _parent(node.parent())  	{  	} -	xml_node_iterator::xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent) +	PUGI__FN xml_node_iterator::xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent)  	{  	} -	bool xml_node_iterator::operator==(const xml_node_iterator& rhs) const +	PUGI__FN bool xml_node_iterator::operator==(const xml_node_iterator& rhs) const  	{  		return _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root;  	} -	bool xml_node_iterator::operator!=(const xml_node_iterator& rhs) const +	PUGI__FN bool xml_node_iterator::operator!=(const xml_node_iterator& rhs) const  	{  		return _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root;  	} -	xml_node& xml_node_iterator::operator*() +	PUGI__FN xml_node& xml_node_iterator::operator*()  	{  		assert(_wrap._root);  		return _wrap;  	} -	xml_node* xml_node_iterator::operator->() +	PUGI__FN xml_node* xml_node_iterator::operator->()  	{  		assert(_wrap._root);  		return &_wrap;  	} -	const xml_node_iterator& xml_node_iterator::operator++() +	PUGI__FN const xml_node_iterator& xml_node_iterator::operator++()  	{  		assert(_wrap._root);  		_wrap._root = _wrap._root->next_sibling;  		return *this;  	} -	xml_node_iterator xml_node_iterator::operator++(int) +	PUGI__FN xml_node_iterator xml_node_iterator::operator++(int)  	{  		xml_node_iterator temp = *this;  		++*this;  		return temp;  	} -	const xml_node_iterator& xml_node_iterator::operator--() +	PUGI__FN const xml_node_iterator& xml_node_iterator::operator--()  	{  		_wrap = _wrap._root ? _wrap.previous_sibling() : _parent.last_child();  		return *this;  	} -	xml_node_iterator xml_node_iterator::operator--(int) +	PUGI__FN xml_node_iterator xml_node_iterator::operator--(int)  	{  		xml_node_iterator temp = *this;  		--*this;  		return temp;  	} -	xml_attribute_iterator::xml_attribute_iterator() +	PUGI__FN xml_attribute_iterator::xml_attribute_iterator()  	{  	} -	xml_attribute_iterator::xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent): _wrap(attr), _parent(parent) +	PUGI__FN xml_attribute_iterator::xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent): _wrap(attr), _parent(parent)  	{  	} -	xml_attribute_iterator::xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent) +	PUGI__FN xml_attribute_iterator::xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent)  	{  	} -	bool xml_attribute_iterator::operator==(const xml_attribute_iterator& rhs) const +	PUGI__FN bool xml_attribute_iterator::operator==(const xml_attribute_iterator& rhs) const  	{  		return _wrap._attr == rhs._wrap._attr && _parent._root == rhs._parent._root;  	} -	bool xml_attribute_iterator::operator!=(const xml_attribute_iterator& rhs) const +	PUGI__FN bool xml_attribute_iterator::operator!=(const xml_attribute_iterator& rhs) const  	{  		return _wrap._attr != rhs._wrap._attr || _parent._root != rhs._parent._root;  	} -	xml_attribute& xml_attribute_iterator::operator*() +	PUGI__FN xml_attribute& xml_attribute_iterator::operator*()  	{  		assert(_wrap._attr);  		return _wrap;  	} -	xml_attribute* xml_attribute_iterator::operator->() +	PUGI__FN xml_attribute* xml_attribute_iterator::operator->()  	{  		assert(_wrap._attr);  		return &_wrap;  	} -	const xml_attribute_iterator& xml_attribute_iterator::operator++() +	PUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator++()  	{  		assert(_wrap._attr);  		_wrap._attr = _wrap._attr->next_attribute;  		return *this;  	} -	xml_attribute_iterator xml_attribute_iterator::operator++(int) +	PUGI__FN xml_attribute_iterator xml_attribute_iterator::operator++(int)  	{  		xml_attribute_iterator temp = *this;  		++*this;  		return temp;  	} -	const xml_attribute_iterator& xml_attribute_iterator::operator--() +	PUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator--()  	{  		_wrap = _wrap._attr ? _wrap.previous_attribute() : _parent.last_attribute();  		return *this;  	} -	xml_attribute_iterator xml_attribute_iterator::operator--(int) +	PUGI__FN xml_attribute_iterator xml_attribute_iterator::operator--(int)  	{  		xml_attribute_iterator temp = *this;  		--*this;  		return temp;  	} -    xml_parse_result::xml_parse_result(): status(status_internal_error), offset(0), encoding(encoding_auto) +    PUGI__FN xml_parse_result::xml_parse_result(): status(status_internal_error), offset(0), encoding(encoding_auto)      {      } -    xml_parse_result::operator bool() const +    PUGI__FN xml_parse_result::operator bool() const      {          return status == status_ok;      } -	const char* xml_parse_result::description() const +	PUGI__FN const char* xml_parse_result::description() const  	{  		switch (status)  		{ @@ -4764,23 +4788,23 @@ namespace pugi  		}  	} -	xml_document::xml_document(): _buffer(0) +	PUGI__FN xml_document::xml_document(): _buffer(0)  	{  		create();  	} -	xml_document::~xml_document() +	PUGI__FN xml_document::~xml_document()  	{  		destroy();  	} -	void xml_document::reset() +	PUGI__FN void xml_document::reset()  	{  		destroy();  		create();  	} -    void xml_document::reset(const xml_document& proto) +    PUGI__FN void xml_document::reset(const xml_document& proto)      {          reset(); @@ -4788,48 +4812,48 @@ namespace pugi              append_copy(cur);      } -	void xml_document::create() +	PUGI__FN void xml_document::create()  	{  		// initialize sentinel page -		STATIC_ASSERT(offsetof(xml_memory_page, data) + sizeof(xml_document_struct) + xml_memory_page_alignment <= sizeof(_memory)); +		PUGI__STATIC_ASSERT(offsetof(impl::xml_memory_page, data) + sizeof(impl::xml_document_struct) + impl::xml_memory_page_alignment <= sizeof(_memory));  		// align upwards to page boundary -		void* page_memory = reinterpret_cast<void*>((reinterpret_cast<uintptr_t>(_memory) + (xml_memory_page_alignment - 1)) & ~(xml_memory_page_alignment - 1)); +		void* page_memory = reinterpret_cast<void*>((reinterpret_cast<uintptr_t>(_memory) + (impl::xml_memory_page_alignment - 1)) & ~(impl::xml_memory_page_alignment - 1));  		// prepare page structure -		xml_memory_page* page = xml_memory_page::construct(page_memory); +		impl::xml_memory_page* page = impl::xml_memory_page::construct(page_memory); -		page->busy_size = xml_memory_page_size; +		page->busy_size = impl::xml_memory_page_size;  		// allocate new root -		_root = new (page->data) xml_document_struct(page); +		_root = new (page->data) impl::xml_document_struct(page);  		_root->prev_sibling_c = _root;  		// setup sentinel page -		page->allocator = static_cast<xml_document_struct*>(_root); +		page->allocator = static_cast<impl::xml_document_struct*>(_root);  	} -	void xml_document::destroy() +	PUGI__FN void xml_document::destroy()  	{  		// destroy static storage  		if (_buffer)  		{ -			global_deallocate(_buffer); +			impl::xml_memory::deallocate(_buffer);  			_buffer = 0;  		}  		// destroy dynamic storage, leave sentinel page (it's in static memory)  		if (_root)  		{ -			xml_memory_page* root_page = reinterpret_cast<xml_memory_page*>(_root->header & xml_memory_page_pointer_mask); +			impl::xml_memory_page* root_page = reinterpret_cast<impl::xml_memory_page*>(_root->header & impl::xml_memory_page_pointer_mask);  			assert(root_page && !root_page->prev && !root_page->memory);  			// destroy all pages -			for (xml_memory_page* page = root_page->next; page; ) +			for (impl::xml_memory_page* page = root_page->next; page; )  			{ -				xml_memory_page* next = page->next; +				impl::xml_memory_page* next = page->next; -				xml_allocator::deallocate_page(page); +				impl::xml_allocator::deallocate_page(page);  				page = next;  			} @@ -4844,22 +4868,22 @@ namespace pugi  	}  #ifndef PUGIXML_NO_STL -	xml_parse_result xml_document::load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options, xml_encoding encoding) +	PUGI__FN xml_parse_result xml_document::load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options, xml_encoding encoding)  	{  		reset(); -		return load_stream_impl(*this, stream, options, encoding); +		return impl::load_stream_impl(*this, stream, options, encoding);  	} -	xml_parse_result xml_document::load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options) +	PUGI__FN xml_parse_result xml_document::load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options)  	{  		reset(); -		return load_stream_impl(*this, stream, options, encoding_wchar); +		return impl::load_stream_impl(*this, stream, options, encoding_wchar);  	}  #endif -	xml_parse_result xml_document::load(const char_t* contents, unsigned int options) +	PUGI__FN xml_parse_result xml_document::load(const char_t* contents, unsigned int options)  	{  		// Force native encoding (skip autodetection)  	#ifdef PUGIXML_WCHAR_MODE @@ -4868,28 +4892,28 @@ namespace pugi  		xml_encoding encoding = encoding_utf8;  	#endif -		return load_buffer(contents, strlength(contents) * sizeof(char_t), options, encoding); +		return load_buffer(contents, impl::strlength(contents) * sizeof(char_t), options, encoding);  	} -	xml_parse_result xml_document::load_file(const char* path_, unsigned int options, xml_encoding encoding) +	PUGI__FN xml_parse_result xml_document::load_file(const char* path_, unsigned int options, xml_encoding encoding)  	{  		reset();  		FILE* file = fopen(path_, "rb"); -		return load_file_impl(*this, file, options, encoding); +		return impl::load_file_impl(*this, file, options, encoding);  	} -	xml_parse_result xml_document::load_file(const wchar_t* path_, unsigned int options, xml_encoding encoding) +	PUGI__FN xml_parse_result xml_document::load_file(const wchar_t* path_, unsigned int options, xml_encoding encoding)  	{  		reset(); -		FILE* file = open_file_wide(path_, L"rb"); +		FILE* file = impl::open_file_wide(path_, L"rb"); -		return load_file_impl(*this, file, options, encoding); +		return impl::load_file_impl(*this, file, options, encoding);  	} -	xml_parse_result xml_document::load_buffer_impl(void* contents, size_t size, unsigned int options, xml_encoding encoding, bool is_mutable, bool own) +	PUGI__FN xml_parse_result xml_document::load_buffer_impl(void* contents, size_t size, unsigned int options, xml_encoding encoding, bool is_mutable, bool own)  	{  		reset(); @@ -4897,19 +4921,19 @@ namespace pugi  		assert(contents || size == 0);  		// get actual encoding -		xml_encoding buffer_encoding = get_buffer_encoding(encoding, contents, size); +		xml_encoding buffer_encoding = impl::get_buffer_encoding(encoding, contents, size);  		// get private buffer  		char_t* buffer = 0;  		size_t length = 0; -		if (!convert_buffer(buffer, length, buffer_encoding, contents, size, is_mutable)) return make_parse_result(status_out_of_memory); +		if (!impl::convert_buffer(buffer, length, buffer_encoding, contents, size, is_mutable)) return impl::make_parse_result(status_out_of_memory);  		// delete original buffer if we performed a conversion -		if (own && buffer != contents && contents) global_deallocate(contents); +		if (own && buffer != contents && contents) impl::xml_memory::deallocate(contents);  		// parse -		xml_parse_result res = xml_parser::parse(buffer, length, _root, options); +		xml_parse_result res = impl::xml_parser::parse(buffer, length, _root, options);  		// remember encoding  		res.encoding = buffer_encoding; @@ -4920,28 +4944,28 @@ namespace pugi  		return res;  	} -	xml_parse_result xml_document::load_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding) +	PUGI__FN xml_parse_result xml_document::load_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding)  	{  		return load_buffer_impl(const_cast<void*>(contents), size, options, encoding, false, false);  	} -	xml_parse_result xml_document::load_buffer_inplace(void* contents, size_t size, unsigned int options, xml_encoding encoding) +	PUGI__FN xml_parse_result xml_document::load_buffer_inplace(void* contents, size_t size, unsigned int options, xml_encoding encoding)  	{  		return load_buffer_impl(contents, size, options, encoding, true, false);  	} -	xml_parse_result xml_document::load_buffer_inplace_own(void* contents, size_t size, unsigned int options, xml_encoding encoding) +	PUGI__FN xml_parse_result xml_document::load_buffer_inplace_own(void* contents, size_t size, unsigned int options, xml_encoding encoding)  	{  		return load_buffer_impl(contents, size, options, encoding, true, true);  	} -	void xml_document::save(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding) const +	PUGI__FN void xml_document::save(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding) const  	{ -		if (flags & format_write_bom) write_bom(writer, get_write_encoding(encoding)); +		if (flags & format_write_bom) impl::write_bom(writer, impl::get_write_encoding(encoding)); -		xml_buffered_writer buffered_writer(writer, encoding); +		impl::xml_buffered_writer buffered_writer(writer, encoding); -		if (!(flags & format_no_declaration) && !has_declaration(*this)) +		if (!(flags & format_no_declaration) && !impl::has_declaration(*this))  		{  			buffered_writer.write(PUGIXML_TEXT("<?xml version=\"1.0\""));              if (encoding == encoding_latin1) buffered_writer.write(PUGIXML_TEXT(" encoding=\"ISO-8859-1\"")); @@ -4949,18 +4973,18 @@ namespace pugi  			if (!(flags & format_raw)) buffered_writer.write('\n');  		} -		node_output(buffered_writer, *this, indent, flags, 0); +		impl::node_output(buffered_writer, *this, indent, flags, 0);  	}  #ifndef PUGIXML_NO_STL -	void xml_document::save(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding) const +	PUGI__FN void xml_document::save(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding) const  	{  		xml_writer_stream writer(stream);  		save(writer, indent, flags, encoding);  	} -	void xml_document::save(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent, unsigned int flags) const +	PUGI__FN void xml_document::save(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent, unsigned int flags) const  	{  		xml_writer_stream writer(stream); @@ -4968,7 +4992,7 @@ namespace pugi  	}  #endif -	bool xml_document::save_file(const char* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const +	PUGI__FN bool xml_document::save_file(const char* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const  	{  		FILE* file = fopen(path_, "wb");  		if (!file) return false; @@ -4981,9 +5005,9 @@ namespace pugi  		return true;  	} -	bool xml_document::save_file(const wchar_t* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const +	PUGI__FN bool xml_document::save_file(const wchar_t* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const  	{ -		FILE* file = open_file_wide(path_, L"wb"); +		FILE* file = impl::open_file_wide(path_, L"wb");  		if (!file) return false;  		xml_writer_file writer(file); @@ -4994,55 +5018,55 @@ namespace pugi  		return true;  	} -    xml_node xml_document::document_element() const +    PUGI__FN xml_node xml_document::document_element() const      {  		for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling) -			if ((i->header & xml_memory_page_type_mask) + 1 == node_element) +			if ((i->header & impl::xml_memory_page_type_mask) + 1 == node_element)                  return xml_node(i);          return xml_node();      }  #ifndef PUGIXML_NO_STL -	std::string PUGIXML_FUNCTION as_utf8(const wchar_t* str) +	PUGI__FN std::string PUGIXML_FUNCTION as_utf8(const wchar_t* str)  	{  		assert(str); -        return as_utf8_impl(str, wcslen(str)); +        return impl::as_utf8_impl(str, wcslen(str));  	} -	std::string PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t>& str) +	PUGI__FN std::string PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t>& str)  	{ -        return as_utf8_impl(str.c_str(), str.size()); +        return impl::as_utf8_impl(str.c_str(), str.size());  	} -	std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const char* str) +	PUGI__FN std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const char* str)  	{  		assert(str); -        return as_wide_impl(str, strlen(str)); +        return impl::as_wide_impl(str, strlen(str));  	} -	std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const std::string& str) +	PUGI__FN std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const std::string& str)  	{ -        return as_wide_impl(str.c_str(), str.size()); +        return impl::as_wide_impl(str.c_str(), str.size());  	}  #endif -    void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate) +    PUGI__FN void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate)      { -    	global_allocate = allocate; -    	global_deallocate = deallocate; +    	impl::xml_memory::allocate = allocate; +    	impl::xml_memory::deallocate = deallocate;      } -    allocation_function PUGIXML_FUNCTION get_memory_allocation_function() +    PUGI__FN allocation_function PUGIXML_FUNCTION get_memory_allocation_function()      { -    	return global_allocate; +    	return impl::xml_memory::allocate;      } -    deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function() +    PUGI__FN deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function()      { -    	return global_deallocate; +    	return impl::xml_memory::deallocate;      }  } @@ -5050,12 +5074,12 @@ namespace pugi  namespace std  {  	// Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier) -	std::bidirectional_iterator_tag _Iter_cat(const xml_node_iterator&) +	PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_node_iterator&)  	{  		return std::bidirectional_iterator_tag();  	} -	std::bidirectional_iterator_tag _Iter_cat(const xml_attribute_iterator&) +	PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_attribute_iterator&)  	{  		return std::bidirectional_iterator_tag();  	} @@ -5066,12 +5090,12 @@ namespace std  namespace std  {  	// Workarounds for (non-standard) iterator category detection -	std::bidirectional_iterator_tag __iterator_category(const xml_node_iterator&) +	PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_node_iterator&)  	{  		return std::bidirectional_iterator_tag();  	} -	std::bidirectional_iterator_tag __iterator_category(const xml_attribute_iterator&) +	PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_attribute_iterator&)  	{  		return std::bidirectional_iterator_tag();  	} @@ -5081,8 +5105,7 @@ namespace std  #ifndef PUGIXML_NO_XPATH  // STL replacements -namespace -{ +PUGI__NS_BEGIN  	struct equal_to  	{  		template <typename T> bool operator()(const T& lhs, const T& rhs) const @@ -5306,11 +5329,10 @@ namespace  		// insertion sort small chunk  		if (begin != end) insertion_sort(begin, end, pred, &*begin);  	} -} +PUGI__NS_END  // Allocator used for AST and evaluation stacks -namespace -{ +PUGI__NS_BEGIN  	struct xpath_memory_block  	{	  		xpath_memory_block* next; @@ -5353,7 +5375,7 @@ namespace  				size_t block_data_size = (size > block_capacity) ? size : block_capacity;  				size_t block_size = block_data_size + offsetof(xpath_memory_block, data); -				xpath_memory_block* block = static_cast<xpath_memory_block*>(global_allocate(block_size)); +				xpath_memory_block* block = static_cast<xpath_memory_block*>(xml_memory::allocate(block_size));  				if (!block) return 0;  				block->next = _root; @@ -5418,7 +5440,7 @@ namespace  					if (next)  					{  						// deallocate the whole page, unless it was the first one -						global_deallocate(_root->next); +						xml_memory::deallocate(_root->next);  						_root->next = next;  					}  				} @@ -5436,7 +5458,7 @@ namespace  			{  				xpath_memory_block* next = cur->next; -				global_deallocate(cur); +				xml_memory::deallocate(cur);  				cur = next;  			} @@ -5455,7 +5477,7 @@ namespace  			{  				xpath_memory_block* next = cur->next; -				global_deallocate(cur); +				xml_memory::deallocate(cur);  				cur = next;  			} @@ -5512,11 +5534,10 @@ namespace  			temp.release();  		}  	}; -} +PUGI__NS_END  // String class -namespace -{ +PUGI__NS_BEGIN  	class xpath_string  	{  		const char_t* _buffer; @@ -5642,15 +5663,14 @@ namespace  		}  	}; -	xpath_string xpath_string_const(const char_t* str) +	PUGI__FN xpath_string xpath_string_const(const char_t* str)  	{  		return xpath_string(str, false);  	} -} +PUGI__NS_END -namespace -{ -	bool starts_with(const char_t* string, const char_t* pattern) +PUGI__NS_BEGIN +	PUGI__FN bool starts_with(const char_t* string, const char_t* pattern)  	{  		while (*pattern && *string == *pattern)  		{ @@ -5661,7 +5681,7 @@ namespace  		return *pattern == 0;  	} -	const char_t* find_char(const char_t* s, char_t c) +	PUGI__FN const char_t* find_char(const char_t* s, char_t c)  	{  	#ifdef PUGIXML_WCHAR_MODE  		return wcschr(s, c); @@ -5670,7 +5690,7 @@ namespace  	#endif  	} -	const char_t* find_substring(const char_t* s, const char_t* p) +	PUGI__FN const char_t* find_substring(const char_t* s, const char_t* p)  	{  	#ifdef PUGIXML_WCHAR_MODE  		// MSVC6 wcsstr bug workaround (if s is empty it always returns 0) @@ -5681,12 +5701,12 @@ namespace  	}  	// Converts symbol to lower case, if it is an ASCII one -	char_t tolower_ascii(char_t ch) +	PUGI__FN char_t tolower_ascii(char_t ch)  	{  		return static_cast<unsigned int>(ch - 'A') < 26 ? static_cast<char_t>(ch | ' ') : ch;  	} -	xpath_string string_value(const xpath_node& na, xpath_allocator* alloc) +	PUGI__FN xpath_string string_value(const xpath_node& na, xpath_allocator* alloc)  	{  		if (na.attribute())  			return xpath_string_const(na.attribute().value()); @@ -5736,7 +5756,7 @@ namespace  		}  	} -	unsigned int node_height(xml_node n) +	PUGI__FN unsigned int node_height(xml_node n)  	{  	    unsigned int result = 0; @@ -5749,7 +5769,7 @@ namespace  	    return result;  	} -	bool node_is_before(xml_node ln, unsigned int lh, xml_node rn, unsigned int rh) +	PUGI__FN bool node_is_before(xml_node ln, unsigned int lh, xml_node rn, unsigned int rh)  	{  		// normalize heights  		for (unsigned int i = rh; i < lh; i++) ln = ln.parent(); @@ -5776,14 +5796,14 @@ namespace          return false;      } -    bool node_is_ancestor(xml_node parent, xml_node node) +    PUGI__FN bool node_is_ancestor(xml_node parent, xml_node node)      {      	while (node && node != parent) node = node.parent();      	return parent && node == parent;      } -    const void* document_order(const xpath_node& xnode) +    PUGI__FN const void* document_order(const xpath_node& xnode)      {          xml_node_struct* node = xnode.node().internal_object(); @@ -5870,10 +5890,10 @@ namespace  		}  	}; -	double gen_nan() +	PUGI__FN double gen_nan()  	{  	#if defined(__STDC_IEC_559__) || ((FLT_RADIX - 0 == 2) && (FLT_MAX_EXP - 0 == 128) && (FLT_MANT_DIG - 0 == 24)) -		union { float f; int32_t i; } u[sizeof(float) == sizeof(int32_t) ? 1 : -1]; +		union { float f; uint32_t i; } u[sizeof(float) == sizeof(uint32_t) ? 1 : -1];  		u[0].i = 0x7fc00000;  		return u[0].f;  	#else @@ -5883,9 +5903,9 @@ namespace  	#endif  	} -	bool is_nan(double value) +	PUGI__FN bool is_nan(double value)  	{ -	#if defined(MSVC_CRT_VERSION) || defined(__BORLANDC__) +	#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__)  		return !!_isnan(value);  	#elif defined(fpclassify) && defined(FP_NAN)  		return fpclassify(value) == FP_NAN; @@ -5896,9 +5916,9 @@ namespace  	#endif  	} -	const char_t* convert_number_to_string_special(double value) +	PUGI__FN const char_t* convert_number_to_string_special(double value)  	{ -	#if defined(MSVC_CRT_VERSION) || defined(__BORLANDC__) +	#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__)  		if (_finite(value)) return (value == 0) ? PUGIXML_TEXT("0") : 0;  		if (_isnan(value)) return PUGIXML_TEXT("NaN");  		return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity"); @@ -5928,12 +5948,12 @@ namespace  	#endif  	} -	bool convert_number_to_boolean(double value) +	PUGI__FN bool convert_number_to_boolean(double value)  	{  		return (value != 0 && !is_nan(value));  	} -	void truncate_zeros(char* begin, char* end) +	PUGI__FN void truncate_zeros(char* begin, char* end)  	{  		while (begin != end && end[-1] == '0') end--; @@ -5941,8 +5961,8 @@ namespace  	}  	// gets mantissa digits in the form of 0.xxxxx with 0. implied and the exponent -#if defined(MSVC_CRT_VERSION) && MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE) -	void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent) +#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE) +	PUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent)  	{  		// get base values  		int sign, exponent; @@ -5956,7 +5976,7 @@ namespace  		*out_exponent = exponent;  	}  #else -	void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent) +	PUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent)  	{  		// get a scientific notation value with IEEE DBL_DIG decimals  		sprintf(buffer, "%.*e", DBL_DIG, value); @@ -5987,7 +6007,7 @@ namespace  	}  #endif -	xpath_string convert_number_to_string(double value, xpath_allocator* alloc) +	PUGI__FN xpath_string convert_number_to_string(double value, xpath_allocator* alloc)  	{  		// try special number conversion  		const char_t* special = convert_number_to_string_special(value); @@ -6050,10 +6070,10 @@ namespace  		return xpath_string(result, alloc);  	} -	bool check_string_to_number_format(const char_t* string) +	PUGI__FN bool check_string_to_number_format(const char_t* string)  	{  		// parse leading whitespace -		while (IS_CHARTYPE(*string, ct_space)) ++string; +		while (PUGI__IS_CHARTYPE(*string, ct_space)) ++string;  		// parse sign  		if (*string == '-') ++string; @@ -6061,26 +6081,26 @@ namespace  		if (!*string) return false;  		// if there is no integer part, there should be a decimal part with at least one digit -		if (!IS_CHARTYPEX(string[0], ctx_digit) && (string[0] != '.' || !IS_CHARTYPEX(string[1], ctx_digit))) return false; +		if (!PUGI__IS_CHARTYPEX(string[0], ctx_digit) && (string[0] != '.' || !PUGI__IS_CHARTYPEX(string[1], ctx_digit))) return false;  		// parse integer part -		while (IS_CHARTYPEX(*string, ctx_digit)) ++string; +		while (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string;  		// parse decimal part  		if (*string == '.')  		{  			++string; -			while (IS_CHARTYPEX(*string, ctx_digit)) ++string; +			while (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string;  		}  		// parse trailing whitespace -		while (IS_CHARTYPE(*string, ct_space)) ++string; +		while (PUGI__IS_CHARTYPE(*string, ct_space)) ++string;  		return *string == 0;  	} -	double convert_string_to_number(const char_t* string) +	PUGI__FN double convert_string_to_number(const char_t* string)  	{  		// check string format  		if (!check_string_to_number_format(string)) return gen_nan(); @@ -6093,7 +6113,7 @@ namespace  	#endif  	} -	bool convert_string_to_number(const char_t* begin, const char_t* end, double* out_result) +	PUGI__FN bool convert_string_to_number(const char_t* begin, const char_t* end, double* out_result)  	{  		char_t buffer[32]; @@ -6103,7 +6123,7 @@ namespace  		if (length >= sizeof(buffer) / sizeof(buffer[0]))  		{  			// need to make dummy on-heap copy -			scratch = static_cast<char_t*>(global_allocate((length + 1) * sizeof(char_t))); +			scratch = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));  			if (!scratch) return false;  		} @@ -6114,29 +6134,29 @@ namespace  		*out_result = convert_string_to_number(scratch);  		// free dummy buffer -		if (scratch != buffer) global_deallocate(scratch); +		if (scratch != buffer) xml_memory::deallocate(scratch);  		return true;  	} -	double round_nearest(double value) +	PUGI__FN double round_nearest(double value)  	{  		return floor(value + 0.5);  	} -	double round_nearest_nzero(double value) +	PUGI__FN double round_nearest_nzero(double value)  	{  		// same as round_nearest, but returns -0 for [-0.5, -0]  		// ceil is used to differentiate between +0 and -0 (we return -0 for [-0.5, -0] and +0 for +0)  		return (value >= -0.5 && value <= 0) ? ceil(value) : floor(value + 0.5);  	} -	const char_t* qualified_name(const xpath_node& node) +	PUGI__FN const char_t* qualified_name(const xpath_node& node)  	{  		return node.attribute() ? node.attribute().name() : node.node().name();  	} -	const char_t* local_name(const xpath_node& node) +	PUGI__FN const char_t* local_name(const xpath_node& node)  	{  		const char_t* name = qualified_name(node);  		const char_t* p = find_char(name, ':'); @@ -6167,7 +6187,7 @@ namespace  		}  	}; -	const char_t* namespace_uri(const xml_node& node) +	PUGI__FN const char_t* namespace_uri(const xml_node& node)  	{  		namespace_uri_predicate pred = node.name(); @@ -6185,7 +6205,7 @@ namespace  		return PUGIXML_TEXT("");  	} -	const char_t* namespace_uri(const xml_attribute& attr, const xml_node& parent) +	PUGI__FN const char_t* namespace_uri(const xml_attribute& attr, const xml_node& parent)  	{  		namespace_uri_predicate pred = attr.name(); @@ -6206,12 +6226,12 @@ namespace  		return PUGIXML_TEXT("");  	} -	const char_t* namespace_uri(const xpath_node& node) +	PUGI__FN const char_t* namespace_uri(const xpath_node& node)  	{  		return node.attribute() ? namespace_uri(node.attribute(), node.parent()) : namespace_uri(node.node());  	} -	void normalize_space(char_t* buffer) +	PUGI__FN void normalize_space(char_t* buffer)  	{  		char_t* write = buffer; @@ -6219,10 +6239,10 @@ namespace  		{  			char_t ch = *it++; -			if (IS_CHARTYPE(ch, ct_space)) +			if (PUGI__IS_CHARTYPE(ch, ct_space))  			{  				// replace whitespace sequence with single space -				while (IS_CHARTYPE(*it, ct_space)) it++; +				while (PUGI__IS_CHARTYPE(*it, ct_space)) it++;  				// avoid leading spaces  				if (write != buffer) *write++ = ' '; @@ -6231,13 +6251,13 @@ namespace  		}  		// remove trailing space -		if (write != buffer && IS_CHARTYPE(write[-1], ct_space)) write--; +		if (write != buffer && PUGI__IS_CHARTYPE(write[-1], ct_space)) write--;  		// zero-terminate  		*write = 0;  	} -	void translate(char_t* buffer, const char_t* from, const char_t* to) +	PUGI__FN void translate(char_t* buffer, const char_t* from, const char_t* to)  	{  		size_t to_length = strlength(to); @@ -6245,7 +6265,7 @@ namespace  		while (*buffer)  		{ -			DMC_VOLATILE char_t ch = *buffer++; +			PUGI__DMC_VOLATILE char_t ch = *buffer++;  			const char_t* pos = find_char(from, ch); @@ -6287,7 +6307,7 @@ namespace  		~xpath_variable_string()  		{ -			if (value) global_deallocate(value); +			if (value) xml_memory::deallocate(value);  		}  		char_t* value; @@ -6300,9 +6320,9 @@ namespace  		char_t name[1];  	}; -	const xpath_node_set dummy_node_set; +	static const xpath_node_set dummy_node_set; -	unsigned int hash_string(const char_t* str) +	PUGI__FN unsigned int hash_string(const char_t* str)  	{  		// Jenkins one-at-a-time hash (http://en.wikipedia.org/wiki/Jenkins_hash_function#one-at-a-time)  		unsigned int result = 0; @@ -6321,13 +6341,13 @@ namespace  		return result;  	} -	template <typename T> T* new_xpath_variable(const char_t* name) +	template <typename T> PUGI__FN T* new_xpath_variable(const char_t* name)  	{  		size_t length = strlength(name);  		if (length == 0) return 0; // empty variable names are invalid  		// $$ we can't use offsetof(T, name) because T is non-POD, so we just allocate additional length characters -		void* memory = global_allocate(sizeof(T) + length * sizeof(char_t)); +		void* memory = xml_memory::allocate(sizeof(T) + length * sizeof(char_t));  		if (!memory) return 0;  		T* result = new (memory) T(); @@ -6337,7 +6357,7 @@ namespace  		return result;  	} -	xpath_variable* new_xpath_variable(xpath_value_type type, const char_t* name) +	PUGI__FN xpath_variable* new_xpath_variable(xpath_value_type type, const char_t* name)  	{  		switch (type)  		{ @@ -6358,13 +6378,13 @@ namespace  		}  	} -	template <typename T> void delete_xpath_variable(T* var) +	template <typename T> PUGI__FN void delete_xpath_variable(T* var)  	{  		var->~T(); -		global_deallocate(var); +		xml_memory::deallocate(var);  	} -	void delete_xpath_variable(xpath_value_type type, xpath_variable* var) +	PUGI__FN void delete_xpath_variable(xpath_value_type type, xpath_variable* var)  	{  		switch (type)  		{ @@ -6389,7 +6409,7 @@ namespace  		}  	} -	xpath_variable* get_variable(xpath_variable_set* set, const char_t* begin, const char_t* end) +	PUGI__FN xpath_variable* get_variable(xpath_variable_set* set, const char_t* begin, const char_t* end)  	{  		char_t buffer[32]; @@ -6399,7 +6419,7 @@ namespace  		if (length >= sizeof(buffer) / sizeof(buffer[0]))  		{  			// need to make dummy on-heap copy -			scratch = static_cast<char_t*>(global_allocate((length + 1) * sizeof(char_t))); +			scratch = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));  			if (!scratch) return 0;  		} @@ -6410,16 +6430,15 @@ namespace  		xpath_variable* result = set->get(scratch);  		// free dummy buffer -		if (scratch != buffer) global_deallocate(scratch); +		if (scratch != buffer) xml_memory::deallocate(scratch);  		return result;  	} -} +PUGI__NS_END  // Internal node set class -namespace -{ -	xpath_node_set::type_t xpath_sort(xpath_node* begin, xpath_node* end, xpath_node_set::type_t type, bool rev) +PUGI__NS_BEGIN +	PUGI__FN xpath_node_set::type_t xpath_sort(xpath_node* begin, xpath_node* end, xpath_node_set::type_t type, bool rev)  	{  		xpath_node_set::type_t order = rev ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_sorted; @@ -6435,7 +6454,7 @@ namespace  		return order;  	} -	xpath_node xpath_first(const xpath_node* begin, const xpath_node* end, xpath_node_set::type_t type) +	PUGI__FN xpath_node xpath_first(const xpath_node* begin, const xpath_node* end, xpath_node_set::type_t type)  	{  		if (begin == end) return xpath_node(); @@ -6455,6 +6474,7 @@ namespace  			return xpath_node();  		}  	} +  	class xpath_node_set_raw  	{  		xpath_node_set::type_t _type; @@ -6567,10 +6587,9 @@ namespace  			_type = value;  		}  	}; -} +PUGI__NS_END -namespace -{ +PUGI__NS_BEGIN  	struct xpath_context  	{  		xpath_node n; @@ -6652,7 +6671,7 @@ namespace  		{  			const char_t* cur = _cur; -			while (IS_CHARTYPE(*cur, ct_space)) ++cur; +			while (PUGI__IS_CHARTYPE(*cur, ct_space)) ++cur;  			// save lexeme position for error reporting  			_cur_lexeme_pos = cur; @@ -6734,17 +6753,17 @@ namespace  			case '$':  				cur += 1; -				if (IS_CHARTYPEX(*cur, ctx_start_symbol)) +				if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol))  				{  					_cur_lexeme_contents.begin = cur; -					while (IS_CHARTYPEX(*cur, ctx_symbol)) cur++; +					while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++; -					if (cur[0] == ':' && IS_CHARTYPEX(cur[1], ctx_symbol)) // qname +					if (cur[0] == ':' && PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // qname  					{  						cur++; // : -						while (IS_CHARTYPEX(*cur, ctx_symbol)) cur++; +						while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;  					}  					_cur_lexeme_contents.end = cur; @@ -6807,13 +6826,13 @@ namespace  					cur += 2;  					_cur_lexeme = lex_double_dot;  				} -				else if (IS_CHARTYPEX(*(cur+1), ctx_digit)) +				else if (PUGI__IS_CHARTYPEX(*(cur+1), ctx_digit))  				{  					_cur_lexeme_contents.begin = cur; // .  					++cur; -					while (IS_CHARTYPEX(*cur, ctx_digit)) cur++; +					while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;  					_cur_lexeme_contents.end = cur; @@ -6867,28 +6886,28 @@ namespace  				break;  			default: -				if (IS_CHARTYPEX(*cur, ctx_digit)) +				if (PUGI__IS_CHARTYPEX(*cur, ctx_digit))  				{  					_cur_lexeme_contents.begin = cur; -					while (IS_CHARTYPEX(*cur, ctx_digit)) cur++; +					while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;  					if (*cur == '.')  					{  						cur++; -						while (IS_CHARTYPEX(*cur, ctx_digit)) cur++; +						while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;  					}  					_cur_lexeme_contents.end = cur;  					_cur_lexeme = lex_number;  				} -				else if (IS_CHARTYPEX(*cur, ctx_start_symbol)) +				else if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol))  				{  					_cur_lexeme_contents.begin = cur; -					while (IS_CHARTYPEX(*cur, ctx_symbol)) cur++; +					while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;  					if (cur[0] == ':')  					{ @@ -6896,11 +6915,11 @@ namespace  						{  							cur += 2; // :*  						} -						else if (IS_CHARTYPEX(cur[1], ctx_symbol)) // namespace test qname +						else if (PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // namespace test qname  						{  							cur++; // : -							while (IS_CHARTYPEX(*cur, ctx_symbol)) cur++; +							while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;  						}  					} @@ -9012,7 +9031,7 @@ namespace  	    			// This is either a function call, or not - if not, we shall proceed with location path  	    			const char_t* state = _lexer.state(); -					while (IS_CHARTYPE(*state, ct_space)) ++state; +					while (PUGI__IS_CHARTYPE(*state, ct_space)) ++state;  	    			if (*state != '(') return parse_location_path(); @@ -9241,7 +9260,7 @@ namespace      {  		static xpath_query_impl* create()  		{ -			void* memory = global_allocate(sizeof(xpath_query_impl)); +			void* memory = xml_memory::allocate(sizeof(xpath_query_impl));              return new (memory) xpath_query_impl();  		} @@ -9254,7 +9273,7 @@ namespace  			static_cast<xpath_query_impl*>(ptr)->alloc.release();  			// free allocator memory (with the first page) -			global_deallocate(ptr); +			xml_memory::deallocate(ptr);  		}          xpath_query_impl(): root(0), alloc(&block) @@ -9267,7 +9286,7 @@ namespace          xpath_memory_block block;      }; -	xpath_string evaluate_string_impl(xpath_query_impl* impl, const xpath_node& n, xpath_stack_data& sd) +	PUGI__FN xpath_string evaluate_string_impl(xpath_query_impl* impl, const xpath_node& n, xpath_stack_data& sd)  	{  		if (!impl) return xpath_string(); @@ -9279,91 +9298,91 @@ namespace  		return impl->root->eval_string(c, sd.stack);  	} -} +PUGI__NS_END  namespace pugi  {  #ifndef PUGIXML_NO_EXCEPTIONS -	xpath_exception::xpath_exception(const xpath_parse_result& result_): _result(result_) +	PUGI__FN xpath_exception::xpath_exception(const xpath_parse_result& result_): _result(result_)  	{  		assert(_result.error);  	} -	const char* xpath_exception::what() const throw() +	PUGI__FN const char* xpath_exception::what() const throw()  	{  		return _result.error;  	} -	const xpath_parse_result& xpath_exception::result() const +	PUGI__FN const xpath_parse_result& xpath_exception::result() const  	{  		return _result;  	}  #endif -	xpath_node::xpath_node() +	PUGI__FN xpath_node::xpath_node()  	{  	} -	xpath_node::xpath_node(const xml_node& node_): _node(node_) +	PUGI__FN xpath_node::xpath_node(const xml_node& node_): _node(node_)  	{  	} -	xpath_node::xpath_node(const xml_attribute& attribute_, const xml_node& parent_): _node(attribute_ ? parent_ : xml_node()), _attribute(attribute_) +	PUGI__FN xpath_node::xpath_node(const xml_attribute& attribute_, const xml_node& parent_): _node(attribute_ ? parent_ : xml_node()), _attribute(attribute_)  	{  	} -	xml_node xpath_node::node() const +	PUGI__FN xml_node xpath_node::node() const  	{  		return _attribute ? xml_node() : _node;  	} -	xml_attribute xpath_node::attribute() const +	PUGI__FN xml_attribute xpath_node::attribute() const  	{  		return _attribute;  	} -	xml_node xpath_node::parent() const +	PUGI__FN xml_node xpath_node::parent() const  	{  		return _attribute ? _node : _node.parent();  	} -    static void unspecified_bool_xpath_node(xpath_node***) +    PUGI__FN static void unspecified_bool_xpath_node(xpath_node***)      {      } -	xpath_node::operator xpath_node::unspecified_bool_type() const +	PUGI__FN xpath_node::operator xpath_node::unspecified_bool_type() const  	{  		return (_node || _attribute) ? unspecified_bool_xpath_node : 0;  	} -	bool xpath_node::operator!() const +	PUGI__FN bool xpath_node::operator!() const  	{  		return !(_node || _attribute);  	} -	bool xpath_node::operator==(const xpath_node& n) const +	PUGI__FN bool xpath_node::operator==(const xpath_node& n) const  	{  		return _node == n._node && _attribute == n._attribute;  	} -	bool xpath_node::operator!=(const xpath_node& n) const +	PUGI__FN bool xpath_node::operator!=(const xpath_node& n) const  	{  		return _node != n._node || _attribute != n._attribute;  	}  #ifdef __BORLANDC__ -	bool operator&&(const xpath_node& lhs, bool rhs) +	PUGI__FN bool operator&&(const xpath_node& lhs, bool rhs)  	{  		return (bool)lhs && rhs;  	} -	bool operator||(const xpath_node& lhs, bool rhs) +	PUGI__FN bool operator||(const xpath_node& lhs, bool rhs)  	{  		return (bool)lhs || rhs;  	}  #endif -	void xpath_node_set::_assign(const_iterator begin_, const_iterator end_) +	PUGI__FN void xpath_node_set::_assign(const_iterator begin_, const_iterator end_)  	{  		assert(begin_ <= end_); @@ -9372,7 +9391,7 @@ namespace pugi  		if (size_ <= 1)  		{  			// deallocate old buffer -			if (_begin != &_storage) global_deallocate(_begin); +			if (_begin != &_storage) impl::xml_memory::deallocate(_begin);  			// use internal buffer  			if (begin_ != end_) _storage = *begin_; @@ -9383,7 +9402,7 @@ namespace pugi  		else  		{  			// make heap copy -			xpath_node* storage = static_cast<xpath_node*>(global_allocate(size_ * sizeof(xpath_node))); +			xpath_node* storage = static_cast<xpath_node*>(impl::xml_memory::allocate(size_ * sizeof(xpath_node)));  			if (!storage)  			{ @@ -9397,7 +9416,7 @@ namespace pugi  			memcpy(storage, begin_, size_ * sizeof(xpath_node));  			// deallocate old buffer -			if (_begin != &_storage) global_deallocate(_begin); +			if (_begin != &_storage) impl::xml_memory::deallocate(_begin);  			// finalize  			_begin = storage; @@ -9405,26 +9424,26 @@ namespace pugi  		}  	} -	xpath_node_set::xpath_node_set(): _type(type_unsorted), _begin(&_storage), _end(&_storage) +	PUGI__FN xpath_node_set::xpath_node_set(): _type(type_unsorted), _begin(&_storage), _end(&_storage)  	{  	} -	xpath_node_set::xpath_node_set(const_iterator begin_, const_iterator end_, type_t type_): _type(type_), _begin(&_storage), _end(&_storage) +	PUGI__FN xpath_node_set::xpath_node_set(const_iterator begin_, const_iterator end_, type_t type_): _type(type_), _begin(&_storage), _end(&_storage)  	{  		_assign(begin_, end_);  	} -	xpath_node_set::~xpath_node_set() +	PUGI__FN xpath_node_set::~xpath_node_set()  	{ -		if (_begin != &_storage) global_deallocate(_begin); +		if (_begin != &_storage) impl::xml_memory::deallocate(_begin);  	} -	xpath_node_set::xpath_node_set(const xpath_node_set& ns): _type(ns._type), _begin(&_storage), _end(&_storage) +	PUGI__FN xpath_node_set::xpath_node_set(const xpath_node_set& ns): _type(ns._type), _begin(&_storage), _end(&_storage)  	{  		_assign(ns._begin, ns._end);  	} -	xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns) +	PUGI__FN xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns)  	{  		if (this == &ns) return *this; @@ -9434,79 +9453,80 @@ namespace pugi  		return *this;  	} -	xpath_node_set::type_t xpath_node_set::type() const +	PUGI__FN xpath_node_set::type_t xpath_node_set::type() const  	{  		return _type;  	} -	size_t xpath_node_set::size() const +	PUGI__FN size_t xpath_node_set::size() const  	{  		return _end - _begin;  	} -	bool xpath_node_set::empty() const +	PUGI__FN bool xpath_node_set::empty() const  	{  		return _begin == _end;  	} -	const xpath_node& xpath_node_set::operator[](size_t index) const +	PUGI__FN const xpath_node& xpath_node_set::operator[](size_t index) const  	{  		assert(index < size());  		return _begin[index];  	} -	xpath_node_set::const_iterator xpath_node_set::begin() const +	PUGI__FN xpath_node_set::const_iterator xpath_node_set::begin() const  	{  		return _begin;  	} -	xpath_node_set::const_iterator xpath_node_set::end() const +	PUGI__FN xpath_node_set::const_iterator xpath_node_set::end() const  	{  		return _end;  	} -	void xpath_node_set::sort(bool reverse) +	PUGI__FN void xpath_node_set::sort(bool reverse)  	{ -		_type = xpath_sort(_begin, _end, _type, reverse); +		_type = impl::xpath_sort(_begin, _end, _type, reverse);  	} -	xpath_node xpath_node_set::first() const +	PUGI__FN xpath_node xpath_node_set::first() const  	{ -		return xpath_first(_begin, _end, _type); +		return impl::xpath_first(_begin, _end, _type);  	} -    xpath_parse_result::xpath_parse_result(): error("Internal error"), offset(0) +    PUGI__FN xpath_parse_result::xpath_parse_result(): error("Internal error"), offset(0)      {      } -    xpath_parse_result::operator bool() const +    PUGI__FN xpath_parse_result::operator bool() const      {          return error == 0;      } -	const char* xpath_parse_result::description() const + +	PUGI__FN const char* xpath_parse_result::description() const  	{  		return error ? error : "No error";  	} -	xpath_variable::xpath_variable() +	PUGI__FN xpath_variable::xpath_variable()      {      } -	const char_t* xpath_variable::name() const +	PUGI__FN const char_t* xpath_variable::name() const  	{  		switch (_type)  		{  		case xpath_type_node_set: -			return static_cast<const xpath_variable_node_set*>(this)->name; +			return static_cast<const impl::xpath_variable_node_set*>(this)->name;  		case xpath_type_number: -			return static_cast<const xpath_variable_number*>(this)->name; +			return static_cast<const impl::xpath_variable_number*>(this)->name;  		case xpath_type_string: -			return static_cast<const xpath_variable_string*>(this)->name; +			return static_cast<const impl::xpath_variable_string*>(this)->name;  		case xpath_type_boolean: -			return static_cast<const xpath_variable_boolean*>(this)->name; +			return static_cast<const impl::xpath_variable_boolean*>(this)->name;  		default:  			assert(!"Invalid variable type"); @@ -9514,83 +9534,83 @@ namespace pugi  		}  	} -	xpath_value_type xpath_variable::type() const +	PUGI__FN xpath_value_type xpath_variable::type() const  	{  		return _type;  	} -	bool xpath_variable::get_boolean() const +	PUGI__FN bool xpath_variable::get_boolean() const  	{ -		return (_type == xpath_type_boolean) ? static_cast<const xpath_variable_boolean*>(this)->value : false; +		return (_type == xpath_type_boolean) ? static_cast<const impl::xpath_variable_boolean*>(this)->value : false;  	} -	double xpath_variable::get_number() const +	PUGI__FN double xpath_variable::get_number() const  	{ -		return (_type == xpath_type_number) ? static_cast<const xpath_variable_number*>(this)->value : gen_nan(); +		return (_type == xpath_type_number) ? static_cast<const impl::xpath_variable_number*>(this)->value : impl::gen_nan();  	} -	const char_t* xpath_variable::get_string() const +	PUGI__FN const char_t* xpath_variable::get_string() const  	{ -		const char_t* value = (_type == xpath_type_string) ? static_cast<const xpath_variable_string*>(this)->value : 0; +		const char_t* value = (_type == xpath_type_string) ? static_cast<const impl::xpath_variable_string*>(this)->value : 0;  		return value ? value : PUGIXML_TEXT("");  	} -	const xpath_node_set& xpath_variable::get_node_set() const +	PUGI__FN const xpath_node_set& xpath_variable::get_node_set() const  	{ -		return (_type == xpath_type_node_set) ? static_cast<const xpath_variable_node_set*>(this)->value : dummy_node_set; +		return (_type == xpath_type_node_set) ? static_cast<const impl::xpath_variable_node_set*>(this)->value : impl::dummy_node_set;  	} -	bool xpath_variable::set(bool value) +	PUGI__FN bool xpath_variable::set(bool value)  	{  		if (_type != xpath_type_boolean) return false; -		static_cast<xpath_variable_boolean*>(this)->value = value; +		static_cast<impl::xpath_variable_boolean*>(this)->value = value;  		return true;  	} -	bool xpath_variable::set(double value) +	PUGI__FN bool xpath_variable::set(double value)  	{  		if (_type != xpath_type_number) return false; -		static_cast<xpath_variable_number*>(this)->value = value; +		static_cast<impl::xpath_variable_number*>(this)->value = value;  		return true;  	} -	bool xpath_variable::set(const char_t* value) +	PUGI__FN bool xpath_variable::set(const char_t* value)  	{  		if (_type != xpath_type_string) return false; -		xpath_variable_string* var = static_cast<xpath_variable_string*>(this); +		impl::xpath_variable_string* var = static_cast<impl::xpath_variable_string*>(this);  		// duplicate string -		size_t size = (strlength(value) + 1) * sizeof(char_t); +		size_t size = (impl::strlength(value) + 1) * sizeof(char_t); -		char_t* copy = static_cast<char_t*>(global_allocate(size)); +		char_t* copy = static_cast<char_t*>(impl::xml_memory::allocate(size));  		if (!copy) return false;  		memcpy(copy, value, size);  		// replace old string -		if (var->value) global_deallocate(var->value); +		if (var->value) impl::xml_memory::deallocate(var->value);  		var->value = copy;  		return true;  	} -	bool xpath_variable::set(const xpath_node_set& value) +	PUGI__FN bool xpath_variable::set(const xpath_node_set& value)  	{  		if (_type != xpath_type_node_set) return false; -		static_cast<xpath_variable_node_set*>(this)->value = value; +		static_cast<impl::xpath_variable_node_set*>(this)->value = value;  		return true;  	} -	xpath_variable_set::xpath_variable_set() +	PUGI__FN xpath_variable_set::xpath_variable_set()  	{  		for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) _data[i] = 0;  	} -	xpath_variable_set::~xpath_variable_set() +	PUGI__FN xpath_variable_set::~xpath_variable_set()  	{  		for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i)  		{ @@ -9600,38 +9620,38 @@ namespace pugi  			{  				xpath_variable* next = var->_next; -				delete_xpath_variable(var->_type, var); +				impl::delete_xpath_variable(var->_type, var);  				var = next;  			}  		}  	} -	xpath_variable* xpath_variable_set::find(const char_t* name) const +	PUGI__FN xpath_variable* xpath_variable_set::find(const char_t* name) const  	{  		const size_t hash_size = sizeof(_data) / sizeof(_data[0]); -		size_t hash = hash_string(name) % hash_size; +		size_t hash = impl::hash_string(name) % hash_size;  		// look for existing variable  		for (xpath_variable* var = _data[hash]; var; var = var->_next) -			if (strequal(var->name(), name)) +			if (impl::strequal(var->name(), name))  				return var;  		return 0;  	} -	xpath_variable* xpath_variable_set::add(const char_t* name, xpath_value_type type) +	PUGI__FN xpath_variable* xpath_variable_set::add(const char_t* name, xpath_value_type type)  	{  		const size_t hash_size = sizeof(_data) / sizeof(_data[0]); -		size_t hash = hash_string(name) % hash_size; +		size_t hash = impl::hash_string(name) % hash_size;  		// look for existing variable  		for (xpath_variable* var = _data[hash]; var; var = var->_next) -			if (strequal(var->name(), name)) +			if (impl::strequal(var->name(), name))  				return var->type() == type ? var : 0;  		// add new variable -		xpath_variable* result = new_xpath_variable(type, name); +		xpath_variable* result = impl::new_xpath_variable(type, name);  		if (result)  		{ @@ -9644,45 +9664,45 @@ namespace pugi  		return result;  	} -	bool xpath_variable_set::set(const char_t* name, bool value) +	PUGI__FN bool xpath_variable_set::set(const char_t* name, bool value)  	{  		xpath_variable* var = add(name, xpath_type_boolean);  		return var ? var->set(value) : false;  	} -	bool xpath_variable_set::set(const char_t* name, double value) +	PUGI__FN bool xpath_variable_set::set(const char_t* name, double value)  	{  		xpath_variable* var = add(name, xpath_type_number);  		return var ? var->set(value) : false;  	} -	bool xpath_variable_set::set(const char_t* name, const char_t* value) +	PUGI__FN bool xpath_variable_set::set(const char_t* name, const char_t* value)  	{  		xpath_variable* var = add(name, xpath_type_string);  		return var ? var->set(value) : false;  	} -	bool xpath_variable_set::set(const char_t* name, const xpath_node_set& value) +	PUGI__FN bool xpath_variable_set::set(const char_t* name, const xpath_node_set& value)  	{  		xpath_variable* var = add(name, xpath_type_node_set);  		return var ? var->set(value) : false;  	} -	xpath_variable* xpath_variable_set::get(const char_t* name) +	PUGI__FN xpath_variable* xpath_variable_set::get(const char_t* name)  	{  		return find(name);  	} -	const xpath_variable* xpath_variable_set::get(const char_t* name) const +	PUGI__FN const xpath_variable* xpath_variable_set::get(const char_t* name) const  	{  		return find(name);  	} -	xpath_query::xpath_query(const char_t* query, xpath_variable_set* variables): _impl(0) +	PUGI__FN xpath_query::xpath_query(const char_t* query, xpath_variable_set* variables): _impl(0)  	{ -		xpath_query_impl* impl = xpath_query_impl::create(); +		impl::xpath_query_impl* qimpl = impl::xpath_query_impl::create(); -		if (!impl) +		if (!qimpl)  		{  		#ifdef PUGIXML_NO_EXCEPTIONS  			_result.error = "Out of memory"; @@ -9692,72 +9712,72 @@ namespace pugi  		}  		else  		{ -			buffer_holder impl_holder(impl, xpath_query_impl::destroy); +			impl::buffer_holder impl_holder(qimpl, impl::xpath_query_impl::destroy); -			impl->root = xpath_parser::parse(query, variables, &impl->alloc, &_result); +			qimpl->root = impl::xpath_parser::parse(query, variables, &qimpl->alloc, &_result); -			if (impl->root) +			if (qimpl->root)  			{ -                _impl = static_cast<xpath_query_impl*>(impl_holder.release()); +                _impl = static_cast<impl::xpath_query_impl*>(impl_holder.release());  				_result.error = 0;  			}  		}  	} -	xpath_query::~xpath_query() +	PUGI__FN xpath_query::~xpath_query()  	{ -		xpath_query_impl::destroy(_impl); +		impl::xpath_query_impl::destroy(_impl);  	} -	xpath_value_type xpath_query::return_type() const +	PUGI__FN xpath_value_type xpath_query::return_type() const  	{  		if (!_impl) return xpath_type_none; -		return static_cast<xpath_query_impl*>(_impl)->root->rettype(); +		return static_cast<impl::xpath_query_impl*>(_impl)->root->rettype();  	} -	bool xpath_query::evaluate_boolean(const xpath_node& n) const +	PUGI__FN bool xpath_query::evaluate_boolean(const xpath_node& n) const  	{  		if (!_impl) return false; -		xpath_context c(n, 1, 1); -		xpath_stack_data sd; +		impl::xpath_context c(n, 1, 1); +		impl::xpath_stack_data sd;  	#ifdef PUGIXML_NO_EXCEPTIONS  		if (setjmp(sd.error_handler)) return false;  	#endif -		return static_cast<xpath_query_impl*>(_impl)->root->eval_boolean(c, sd.stack); +		return static_cast<impl::xpath_query_impl*>(_impl)->root->eval_boolean(c, sd.stack);  	} -	double xpath_query::evaluate_number(const xpath_node& n) const +	PUGI__FN double xpath_query::evaluate_number(const xpath_node& n) const  	{ -		if (!_impl) return gen_nan(); +		if (!_impl) return impl::gen_nan(); -		xpath_context c(n, 1, 1); -		xpath_stack_data sd; +		impl::xpath_context c(n, 1, 1); +		impl::xpath_stack_data sd;  	#ifdef PUGIXML_NO_EXCEPTIONS -		if (setjmp(sd.error_handler)) return gen_nan(); +		if (setjmp(sd.error_handler)) return impl::gen_nan();  	#endif -		return static_cast<xpath_query_impl*>(_impl)->root->eval_number(c, sd.stack); +		return static_cast<impl::xpath_query_impl*>(_impl)->root->eval_number(c, sd.stack);  	}  #ifndef PUGIXML_NO_STL -	string_t xpath_query::evaluate_string(const xpath_node& n) const +	PUGI__FN string_t xpath_query::evaluate_string(const xpath_node& n) const  	{ -		xpath_stack_data sd; +		impl::xpath_stack_data sd; -		return evaluate_string_impl(static_cast<xpath_query_impl*>(_impl), n, sd).c_str(); +		return impl::evaluate_string_impl(static_cast<impl::xpath_query_impl*>(_impl), n, sd).c_str();  	}  #endif -	size_t xpath_query::evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const +	PUGI__FN size_t xpath_query::evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const  	{ -		xpath_stack_data sd; +		impl::xpath_stack_data sd; -		xpath_string r = evaluate_string_impl(static_cast<xpath_query_impl*>(_impl), n, sd); +		impl::xpath_string r = impl::evaluate_string_impl(static_cast<impl::xpath_query_impl*>(_impl), n, sd);  		size_t full_size = r.length() + 1; @@ -9773,11 +9793,11 @@ namespace pugi  		return full_size;  	} -	xpath_node_set xpath_query::evaluate_node_set(const xpath_node& n) const +	PUGI__FN xpath_node_set xpath_query::evaluate_node_set(const xpath_node& n) const  	{  		if (!_impl) return xpath_node_set(); -        xpath_ast_node* root = static_cast<xpath_query_impl*>(_impl)->root; +        impl::xpath_ast_node* root = static_cast<impl::xpath_query_impl*>(_impl)->root;  		if (root->rettype() != xpath_type_node_set)  		{ @@ -9791,56 +9811,56 @@ namespace pugi  		#endif  		} -		xpath_context c(n, 1, 1); -		xpath_stack_data sd; +		impl::xpath_context c(n, 1, 1); +		impl::xpath_stack_data sd;  	#ifdef PUGIXML_NO_EXCEPTIONS  		if (setjmp(sd.error_handler)) return xpath_node_set();  	#endif -		xpath_node_set_raw r = root->eval_node_set(c, sd.stack); +		impl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack);  		return xpath_node_set(r.begin(), r.end(), r.type());  	} -	const xpath_parse_result& xpath_query::result() const +	PUGI__FN const xpath_parse_result& xpath_query::result() const  	{  		return _result;  	} -    static void unspecified_bool_xpath_query(xpath_query***) +    PUGI__FN static void unspecified_bool_xpath_query(xpath_query***)      {      } -	xpath_query::operator xpath_query::unspecified_bool_type() const +	PUGI__FN xpath_query::operator xpath_query::unspecified_bool_type() const  	{  		return _impl ? unspecified_bool_xpath_query : 0;  	} -	bool xpath_query::operator!() const +	PUGI__FN bool xpath_query::operator!() const  	{  		return !_impl;  	} -	xpath_node xml_node::select_single_node(const char_t* query, xpath_variable_set* variables) const +	PUGI__FN xpath_node xml_node::select_single_node(const char_t* query, xpath_variable_set* variables) const  	{  		xpath_query q(query, variables);  		return select_single_node(q);  	} -	xpath_node xml_node::select_single_node(const xpath_query& query) const +	PUGI__FN xpath_node xml_node::select_single_node(const xpath_query& query) const  	{  		xpath_node_set s = query.evaluate_node_set(*this);  		return s.empty() ? xpath_node() : s.first();  	} -	xpath_node_set xml_node::select_nodes(const char_t* query, xpath_variable_set* variables) const +	PUGI__FN xpath_node_set xml_node::select_nodes(const char_t* query, xpath_variable_set* variables) const  	{  		xpath_query q(query, variables);  		return select_nodes(q);  	} -	xpath_node_set xml_node::select_nodes(const xpath_query& query) const +	PUGI__FN xpath_node_set xml_node::select_nodes(const xpath_query& query) const  	{  		return query.evaluate_node_set(*this);  	} @@ -9848,6 +9868,51 @@ namespace pugi  #endif +// SNC seems to have the same bug as Intel (below); I need to test more versions to do a proper check here +// #ifdef __SNC__ +// #   pragma diag_pop +// #endif + +#ifdef __BORLANDC__ +#   pragma option pop +#endif + +// Some Intel C++ versions (9, 10) do not properly keep warning state for function templates, +// so popping warning state at the end of translation unit leads to warnings in the middle. +#if !defined(__INTEL_COMPILER) || __INTEL_COMPILER >= 1100 +#   ifdef __INTEL_COMPILER +#      pragma warning(pop) +#   endif + +#   ifdef _MSC_VER +#      pragma warning(pop) +#   endif +#endif + +// Undefine all local macros (makes sure we're not leaking macros in header-only mode) +#undef PUGI__NO_INLINE +#undef PUGI__STATIC_ASSERT +#undef PUGI__DMC_VOLATILE +#undef PUGI__MSVC_CRT_VERSION +#undef PUGI__NS_BEGIN +#undef PUGI__NS_END +#undef PUGI__FN +#undef PUGI__FN_NO_INLINE +#undef PUGI__IS_CHARTYPE_IMPL +#undef PUGI__IS_CHARTYPE +#undef PUGI__IS_CHARTYPEX +#undef PUGI__SKIPWS +#undef PUGI__OPTSET +#undef PUGI__PUSHNODE +#undef PUGI__POPNODE +#undef PUGI__SCANFOR +#undef PUGI__SCANWHILE +#undef PUGI__ENDSEG +#undef PUGI__THROW_ERROR +#undef PUGI__CHECK_ERROR + +#endif +  /**   * Copyright (c) 2006-2010 Arseny Kapoulkine   * diff --git a/src/pugixml.hpp b/src/pugixml.hpp index d0a8623..b01da4f 100644 --- a/src/pugixml.hpp +++ b/src/pugixml.hpp @@ -11,15 +11,17 @@   * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)   */ -#ifndef HEADER_PUGIXML_HPP -#define HEADER_PUGIXML_HPP - +#ifndef PUGIXML_VERSION  // Define version macro; evaluates to major * 100 + minor so that it's safe to use in less-than comparisons -#define PUGIXML_VERSION 100 +#   define PUGIXML_VERSION 100 +#endif  // Include user configuration file (this can define various configuration macros)  #include "pugiconfig.hpp" +#ifndef HEADER_PUGIXML_HPP +#define HEADER_PUGIXML_HPP +  // Include stddef.h for size_t and ptrdiff_t  #include <stddef.h> | 
