diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/pugiconfig.hpp | 2 | ||||
| -rw-r--r-- | src/pugixml.cpp | 790 | ||||
| -rw-r--r-- | src/pugixml.hpp | 94 | 
3 files changed, 443 insertions, 443 deletions
| diff --git a/src/pugiconfig.hpp b/src/pugiconfig.hpp index a5167b8..59a3a32 100644 --- a/src/pugiconfig.hpp +++ b/src/pugiconfig.hpp @@ -62,7 +62,7 @@   *   * The above copyright notice and this permission notice shall be   * included in all copies or substantial portions of the Software. - *  + *   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES   * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND diff --git a/src/pugixml.cpp b/src/pugixml.cpp index e234926..ad6fbc2 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -54,7 +54,7 @@  #endif  #ifdef __INTEL_COMPILER -#	pragma warning(disable: 177) // function was declared but never referenced  +#	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"  #	pragma warning(disable: 1684) // conversion from pointer to same-sized integral type @@ -82,7 +82,7 @@  #elif defined(__GNUC__)  #	define PUGI__NO_INLINE __attribute__((noinline))  #else -#	define PUGI__NO_INLINE  +#	define PUGI__NO_INLINE  #endif  // Branch weight controls @@ -213,7 +213,7 @@ PUGI__NS_BEGIN  		for (size_t i = 0; i < count; ++i)  			if (lhs[i] != rhs[i])  				return false; -	 +  		return lhs[count] == 0;  	} @@ -617,7 +617,7 @@ PUGI__NS_BEGIN  			// allocate memory for string and header block  			size_t size = sizeof(xml_memory_string_header) + length * sizeof(char_t); -			 +  			// round size up to block alignment boundary  			size_t full_size = (size + (xml_memory_block_alignment - 1)) & ~(xml_memory_block_alignment - 1); @@ -1844,7 +1844,7 @@ PUGI__NS_BEGIN  		ctx_digit = 8,			  // 0-9  		ctx_symbol = 16			  // Any symbol > 127, a-z, A-Z, 0-9, _, -, .  	}; -	 +  	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 @@ -1866,7 +1866,7 @@ PUGI__NS_BEGIN  		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,  		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20  	}; -	 +  #ifdef PUGIXML_WCHAR_MODE  	#define PUGI__IS_CHARTYPE_IMPL(c, ct, table) ((static_cast<unsigned int>(c) < 128 ? table[static_cast<unsigned int>(c)] : table[128]) & (ct))  #else @@ -1889,7 +1889,7 @@ PUGI__NS_BEGIN  		if (sizeof(wchar_t) == 2)  			return is_little_endian() ? encoding_utf16_le : encoding_utf16_be; -		else  +		else  			return is_little_endian() ? encoding_utf32_le : encoding_utf32_be;  	} @@ -2193,12 +2193,12 @@ PUGI__NS_BEGIN  		// convert to utf8  		uint8_t* begin = reinterpret_cast<uint8_t*>(buffer);  		uint8_t* end = wchar_decoder::process(str, length, begin, utf8_writer()); -	 +  		assert(begin + size == end);  		(void)!end;  		(void)!size;  	} -	 +  #ifndef PUGIXML_NO_STL  	PUGI__FN std::string as_utf8_impl(const wchar_t* str, size_t length)  	{ @@ -2266,7 +2266,7 @@ PUGI__NS_BEGIN  			xml_allocator* alloc = PUGI__GETPAGE_IMPL(header)->allocator;  			if (header & header_mask) alloc->deallocate_string(dest); -			 +  			// mark the string as not allocated  			dest = 0;  			header &= ~header_mask; @@ -2278,7 +2278,7 @@ PUGI__NS_BEGIN  			// we can reuse old buffer, so just copy the new data (including zero terminator)  			memcpy(dest, source, source_length * sizeof(char_t));  			dest[source_length] = 0; -			 +  			return true;  		}  		else @@ -2297,7 +2297,7 @@ PUGI__NS_BEGIN  			// deallocate old buffer (*after* the above to protect against overlapping memory and/or allocation failures)  			if (header & header_mask) alloc->deallocate_string(dest); -			 +  			// the string is now allocated, so set the flag  			dest = buf;  			header |= header_mask; @@ -2310,11 +2310,11 @@ PUGI__NS_BEGIN  	{  		char_t* end;  		size_t size; -			 +  		gap(): end(0), size(0)  		{  		} -			 +  		// Push new gap, move s count bytes further (skipping the gap).  		// Collapse previous gap.  		void push(char_t*& s, size_t count) @@ -2325,14 +2325,14 @@ PUGI__NS_BEGIN  				assert(s >= end);  				memmove(end - size, end, reinterpret_cast<char*>(s) - reinterpret_cast<char*>(end));  			} -				 +  			s += count; // end of current gap -				 +  			// "merge" two gaps  			end = s;  			size += count;  		} -			 +  		// Collapse all gaps, return past-the-end pointer  		char_t* flush(char_t* s)  		{ @@ -2347,7 +2347,7 @@ PUGI__NS_BEGIN  			else return s;  		}  	}; -	 +  	PUGI__FN char_t* strconv_escape(char_t* s, gap& g)  	{  		char_t* stre = s + 1; @@ -2379,7 +2379,7 @@ PUGI__NS_BEGIN  						ch = *++stre;  					} -					 +  					++stre;  				}  				else	// &#... (dec code) @@ -2399,7 +2399,7 @@ PUGI__NS_BEGIN  						ch = *++stre;  					} -					 +  					++stre;  				} @@ -2408,7 +2408,7 @@ PUGI__NS_BEGIN  			#else  				s = reinterpret_cast<char_t*>(utf8_writer::any(reinterpret_cast<uint8_t*>(s), ucsc));  			#endif -					 +  				g.push(s, stre - s);  				return stre;  			} @@ -2423,7 +2423,7 @@ PUGI__NS_BEGIN  					{  						*s++ = '&';  						++stre; -							 +  						g.push(s, stre - s);  						return stre;  					} @@ -2448,7 +2448,7 @@ PUGI__NS_BEGIN  				{  					*s++ = '>';  					++stre; -					 +  					g.push(s, stre - s);  					return stre;  				} @@ -2461,7 +2461,7 @@ PUGI__NS_BEGIN  				{  					*s++ = '<';  					++stre; -						 +  					g.push(s, stre - s);  					return stre;  				} @@ -2474,7 +2474,7 @@ PUGI__NS_BEGIN  				{  					*s++ = '"';  					++stre; -					 +  					g.push(s, stre - s);  					return stre;  				} @@ -2484,7 +2484,7 @@ PUGI__NS_BEGIN  			default:  				break;  		} -		 +  		return stre;  	} @@ -2504,21 +2504,21 @@ PUGI__NS_BEGIN  	PUGI__FN char_t* strconv_comment(char_t* s, char_t endch)  	{  		gap g; -		 +  		while (true)  		{  			PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_comment)); -		 +  			if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair  			{  				*s++ = '\n'; // replace first one with 0x0a -				 +  				if (*s == '\n') g.push(s, 1);  			}  			else if (s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>')) // comment ends here  			{  				*g.flush(s) = 0; -				 +  				return s + (s[2] == '>' ? 3 : 2);  			}  			else if (*s == 0) @@ -2532,21 +2532,21 @@ PUGI__NS_BEGIN  	PUGI__FN char_t* strconv_cdata(char_t* s, char_t endch)  	{  		gap g; -			 +  		while (true)  		{  			PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_cdata)); -			 +  			if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair  			{  				*s++ = '\n'; // replace first one with 0x0a -				 +  				if (*s == '\n') g.push(s, 1);  			}  			else if (s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>')) // CDATA ends here  			{  				*g.flush(s) = 0; -				 +  				return s + 1;  			}  			else if (*s == 0) @@ -2556,9 +2556,9 @@ PUGI__NS_BEGIN  			else ++s;  		}  	} -	 +  	typedef char_t* (*strconv_pcdata_t)(char_t*); -		 +  	template <typename opt_trim, typename opt_eol, typename opt_escape> struct strconv_pcdata_impl  	{  		static char_t* parse(char_t* s) @@ -2580,13 +2580,13 @@ PUGI__NS_BEGIN  							--end;  					*end = 0; -					 +  					return s + 1;  				}  				else if (opt_eol::value && *s == '\r') // Either a single 0x0d or 0x0d 0x0a pair  				{  					*s++ = '\n'; // replace first one with 0x0a -					 +  					if (*s == '\n') g.push(s, 1);  				}  				else if (opt_escape::value && *s == '&') @@ -2609,7 +2609,7 @@ PUGI__NS_BEGIN  			}  		}  	}; -	 +  	PUGI__FN strconv_pcdata_t get_strconv_pcdata(unsigned int optmask)  	{  		PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_trim_pcdata == 0x0800); @@ -2629,7 +2629,7 @@ PUGI__NS_BEGIN  	}  	typedef char_t* (*strconv_attribute_t)(char_t*, char_t); -	 +  	template <typename opt_escape> struct strconv_attribute_impl  	{  		static char_t* parse_wnorm(char_t* s, char_t end_quote) @@ -2640,35 +2640,35 @@ PUGI__NS_BEGIN  			if (PUGI__IS_CHARTYPE(*s, ct_space))  			{  				char_t* str = s; -				 +  				do ++str;  				while (PUGI__IS_CHARTYPE(*str, ct_space)); -				 +  				g.push(s, str - s);  			}  			while (true)  			{  				PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws | ct_space)); -				 +  				if (*s == end_quote)  				{  					char_t* str = g.flush(s); -					 +  					do *str-- = 0;  					while (PUGI__IS_CHARTYPE(*str, ct_space)); -				 +  					return s + 1;  				}  				else if (PUGI__IS_CHARTYPE(*s, ct_space))  				{  					*s++ = ' '; -		 +  					if (PUGI__IS_CHARTYPE(*s, ct_space))  					{  						char_t* str = s + 1;  						while (PUGI__IS_CHARTYPE(*str, ct_space)) ++str; -						 +  						g.push(s, str - s);  					}  				} @@ -2691,11 +2691,11 @@ PUGI__NS_BEGIN  			while (true)  			{  				PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws)); -				 +  				if (*s == end_quote)  				{  					*g.flush(s) = 0; -				 +  					return s + 1;  				}  				else if (PUGI__IS_CHARTYPE(*s, ct_space)) @@ -2703,7 +2703,7 @@ PUGI__NS_BEGIN  					if (*s == '\r')  					{  						*s++ = ' '; -				 +  						if (*s == '\n') g.push(s, 1);  					}  					else *s++ = ' '; @@ -2727,17 +2727,17 @@ PUGI__NS_BEGIN  			while (true)  			{  				PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr)); -				 +  				if (*s == end_quote)  				{  					*g.flush(s) = 0; -				 +  					return s + 1;  				}  				else if (*s == '\r')  				{  					*s++ = '\n'; -					 +  					if (*s == '\n') g.push(s, 1);  				}  				else if (opt_escape::value && *s == '&') @@ -2759,11 +2759,11 @@ PUGI__NS_BEGIN  			while (true)  			{  				PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr)); -				 +  				if (*s == end_quote)  				{  					*g.flush(s) = 0; -				 +  					return s + 1;  				}  				else if (opt_escape::value && *s == '&') @@ -2782,7 +2782,7 @@ PUGI__NS_BEGIN  	PUGI__FN strconv_attribute_t get_strconv_attribute(unsigned int optmask)  	{  		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)  		{  		case 0:  return strconv_attribute_impl<opt_false>::parse_simple; @@ -2820,7 +2820,7 @@ PUGI__NS_BEGIN  		xml_allocator* alloc_state;  		char_t* error_offset;  		xml_parse_status error_status; -		 +  		xml_parser(xml_allocator* alloc_): alloc(*alloc_), alloc_state(alloc_), error_offset(0), error_status(status_ok)  		{  		} @@ -3154,7 +3154,7 @@ PUGI__NS_BEGIN  		{  			strconv_attribute_t strconv_attribute = get_strconv_attribute(optmsk);  			strconv_pcdata_t strconv_pcdata = get_strconv_pcdata(optmsk); -			 +  			char_t ch = 0;  			xml_node_struct* cursor = root;  			char_t* mark = s; @@ -3185,7 +3185,7 @@ PUGI__NS_BEGIN  							while (true)  							{  								PUGI__SKIPWS(); // Eat any whitespace. -						 +  								if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // <... #...  								{  									xml_attribute_struct* a = append_new_attribute(cursor, alloc); // Make space for this attribute. @@ -3203,7 +3203,7 @@ PUGI__NS_BEGIN  										ch = *s;  										++s;  									} -									 +  									if (ch == '=') // '<... #=...'  									{  										PUGI__SKIPWS(); // Eat any whitespace. @@ -3215,7 +3215,7 @@ PUGI__NS_BEGIN  											a->value = s; // Save the offset.  											s = strconv_attribute(s, ch); -										 +  											if (!s) PUGI__THROW_ERROR(status_bad_attribute, a->value);  											// After this line the loop continues from the start; @@ -3230,7 +3230,7 @@ PUGI__NS_BEGIN  								else if (*s == '/')  								{  									++s; -									 +  									if (*s == '>')  									{  										PUGI__POPNODE(); @@ -3271,7 +3271,7 @@ PUGI__NS_BEGIN  						{  							// we stepped over null terminator, backtrack & handle closing tag  							--s; -							 +  							if (endch != '>') PUGI__THROW_ERROR(status_bad_start_element, s);  						}  						else PUGI__THROW_ERROR(status_bad_start_element, s); @@ -3282,7 +3282,7 @@ PUGI__NS_BEGIN  						char_t* name = cursor->name;  						if (!name) PUGI__THROW_ERROR(status_end_element_mismatch, s); -						 +  						while (PUGI__IS_CHARTYPE(*s, ct_symbol))  						{  							if (*s++ != *name++) PUGI__THROW_ERROR(status_end_element_mismatch, s); @@ -3293,7 +3293,7 @@ PUGI__NS_BEGIN  							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);  						} -							 +  						PUGI__POPNODE(); // Pop.  						PUGI__SKIPWS(); @@ -3347,7 +3347,7 @@ PUGI__NS_BEGIN  					if (!PUGI__OPTSET(parse_trim_pcdata))  						s = mark; -							 +  					if (cursor->parent || PUGI__OPTSET(parse_fragment))  					{  						if (PUGI__OPTSET(parse_embed_pcdata) && cursor->parent && !cursor->first_child && !cursor->value) @@ -3364,14 +3364,14 @@ PUGI__NS_BEGIN  						}  						s = strconv_pcdata(s); -								 +  						if (!*s) break;  					}  					else  					{  						PUGI__SCANFOR(*s == '<'); // '...<'  						if (!*s) break; -						 +  						++s;  					} @@ -3419,14 +3419,14 @@ PUGI__NS_BEGIN  			// get last child of the root before parsing  			xml_node_struct* last_root_child = root->first_child ? root->first_child->prev_sibling_c + 0 : 0; -	 +  			// create parser on stack  			xml_parser parser(static_cast<xml_allocator*>(xmldoc));  			// save last character and make buffer zero-terminated (speeds up parsing)  			char_t endch = buffer[length - 1];  			buffer[length - 1] = 0; -			 +  			// skip BOM to make sure it does not end up as part of parse output  			char_t* buffer_data = parse_skip_bom(buffer); @@ -3516,7 +3516,7 @@ PUGI__NS_BEGIN  	{  		if (length < 1) return 0; -		// discard last character if it's the lead of a surrogate pair  +		// discard last character if it's the lead of a surrogate pair  		return (sizeof(wchar_t) == 2 && static_cast<unsigned int>(static_cast<uint16_t>(data[length - 1]) - 0xD800) < 0x400) ? length - 1 : length;  	} @@ -3529,7 +3529,7 @@ PUGI__NS_BEGIN  			return length * sizeof(char_t);  		} -	 +  		// convert to utf8  		if (encoding == encoding_utf8)  			return convert_buffer_output_generic(r_u8, data, length, wchar_decoder(), utf8_writer()); @@ -3817,10 +3817,10 @@ PUGI__NS_BEGIN  		while (*s)  		{  			const char_t* prev = s; -			 +  			// While *s is a usual symbol  			PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPEX(ss, type)); -		 +  			writer.write_buffer(prev, static_cast<size_t>(s - prev));  			switch (*s) @@ -4567,7 +4567,7 @@ PUGI__NS_BEGIN  		return set_value_ascii(dest, header, header_mask, buf);  	} -	 +  	template <typename String, typename Header>  	PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, bool value)  	{ @@ -4656,7 +4656,7 @@ PUGI__NS_BEGIN  		// check for I/O errors  		if (length < 0) return status_io_error; -		 +  		// check for overflow  		size_t result = static_cast<size_t>(length); @@ -4669,7 +4669,7 @@ PUGI__NS_BEGIN  	}  	// This function assumes that buffer has extra sizeof(char_t) writable bytes after size -	PUGI__FN size_t zero_terminate_buffer(void* buffer, size_t size, xml_encoding encoding)  +	PUGI__FN size_t zero_terminate_buffer(void* buffer, size_t size, xml_encoding encoding)  	{  		// We only need to zero-terminate if encoding conversion does not do it for us  	#ifdef PUGIXML_WCHAR_MODE @@ -4701,7 +4701,7 @@ PUGI__NS_BEGIN  		size_t size = 0;  		xml_parse_status size_status = get_file_size(file, size);  		if (size_status != status_ok) return make_parse_result(size_status); -		 +  		size_t max_suffix_size = sizeof(char_t);  		// allocate buffer for the whole file @@ -4729,7 +4729,7 @@ PUGI__NS_BEGIN  		{  			void* memory = xml_memory::allocate(sizeof(xml_stream_chunk));  			if (!memory) return 0; -			 +  			return new (memory) xml_stream_chunk();  		} @@ -4839,7 +4839,7 @@ PUGI__NS_BEGIN  		// return buffer  		size_t actual_length = static_cast<size_t>(stream.gcount());  		assert(actual_length <= read_length); -		 +  		*out_buffer = buffer.release();  		*out_size = actual_length * sizeof(T); @@ -4867,7 +4867,7 @@ PUGI__NS_BEGIN  		if (status != status_ok) return make_parse_result(status);  		xml_encoding real_encoding = get_buffer_encoding(encoding, buffer, size); -		 +  		return load_buffer_impl(doc, doc, buffer, zero_terminate_buffer(buffer, size, real_encoding), options, real_encoding, true, true, out_buffer);  	}  #endif @@ -4987,7 +4987,7 @@ namespace pugi  	PUGI__FN xml_tree_walker::xml_tree_walker(): _depth(0)  	{  	} -	 +  	PUGI__FN xml_tree_walker::~xml_tree_walker()  	{  	} @@ -5033,7 +5033,7 @@ namespace pugi  	{  		return (_attr == r._attr);  	} -	 +  	PUGI__FN bool xml_attribute::operator!=(const xml_attribute& r) const  	{  		return (_attr != r._attr); @@ -5043,17 +5043,17 @@ namespace pugi  	{  		return (_attr < r._attr);  	} -	 +  	PUGI__FN bool xml_attribute::operator>(const xml_attribute& r) const  	{  		return (_attr > r._attr);  	} -	 +  	PUGI__FN bool xml_attribute::operator<=(const xml_attribute& r) const  	{  		return (_attr <= r._attr);  	} -	 +  	PUGI__FN bool xml_attribute::operator>=(const xml_attribute& r) const  	{  		return (_attr >= r._attr); @@ -5141,7 +5141,7 @@ namespace pugi  		set_value(rhs);  		return *this;  	} -	 +  	PUGI__FN xml_attribute& xml_attribute::operator=(int rhs)  	{  		set_value(rhs); @@ -5159,7 +5159,7 @@ namespace pugi  		set_value(rhs);  		return *this;  	} -	 +  	PUGI__FN xml_attribute& xml_attribute::operator=(float rhs)  	{  		set_value(rhs); @@ -5189,10 +5189,10 @@ namespace pugi  	PUGI__FN bool xml_attribute::set_name(const char_t* rhs)  	{  		if (!_attr) return false; -		 +  		return impl::strcpy_insitu(_attr->name, _attr->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs));  	} -		 +  	PUGI__FN bool xml_attribute::set_value(const char_t* rhs)  	{  		if (!_attr) return false; @@ -5220,7 +5220,7 @@ namespace pugi  		return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);  	} -	 +  	PUGI__FN bool xml_attribute::set_value(float rhs)  	{  		if (!_attr) return false; @@ -5270,7 +5270,7 @@ namespace pugi  	PUGI__FN xml_node::xml_node(xml_node_struct* p): _root(p)  	{  	} -	 +  	PUGI__FN static void unspecified_bool_xml_node(xml_node***)  	{  	} @@ -5294,7 +5294,7 @@ namespace pugi  	{  		return iterator(0, _root);  	} -	 +  	PUGI__FN xml_node::attribute_iterator xml_node::attributes_begin() const  	{  		return attribute_iterator(_root ? _root->first_attribute + 0 : 0, _root); @@ -5304,7 +5304,7 @@ namespace pugi  	{  		return attribute_iterator(0, _root);  	} -	 +  	PUGI__FN xml_object_range<xml_node_iterator> xml_node::children() const  	{  		return xml_object_range<xml_node_iterator>(begin(), end()); @@ -5334,17 +5334,17 @@ namespace pugi  	{  		return (_root < r._root);  	} -	 +  	PUGI__FN bool xml_node::operator>(const xml_node& r) const  	{  		return (_root > r._root);  	} -	 +  	PUGI__FN bool xml_node::operator<=(const xml_node& r) const  	{  		return (_root <= r._root);  	} -	 +  	PUGI__FN bool xml_node::operator>=(const xml_node& r) const  	{  		return (_root >= r._root); @@ -5354,7 +5354,7 @@ namespace pugi  	{  		return !_root;  	} -	 +  	PUGI__FN const char_t* xml_node::name() const  	{  		return (_root && _root->name) ? _root->name + 0 : PUGIXML_TEXT(""); @@ -5364,12 +5364,12 @@ namespace pugi  	{  		return _root ? PUGI__NODETYPE(_root) : node_null;  	} -	 +  	PUGI__FN const char_t* xml_node::value() const  	{  		return (_root && _root->value) ? _root->value + 0 : PUGIXML_TEXT("");  	} -	 +  	PUGI__FN xml_node xml_node::child(const char_t* name_) const  	{  		if (!_root) return xml_node(); @@ -5387,14 +5387,14 @@ namespace pugi  		for (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute)  			if (i->name && impl::strequal(name_, i->name))  				return xml_attribute(i); -		 +  		return xml_attribute();  	} -	 +  	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 && impl::strequal(name_, i->name)) return xml_node(i); @@ -5409,7 +5409,7 @@ namespace pugi  	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 && impl::strequal(name_, i->name)) return xml_node(i); @@ -5452,7 +5452,7 @@ namespace pugi  	PUGI__FN xml_node xml_node::previous_sibling() const  	{  		if (!_root) return xml_node(); -		 +  		if (_root->prev_sibling_c->next_sibling) return xml_node(_root->prev_sibling_c);  		else return xml_node();  	} @@ -5475,7 +5475,7 @@ namespace pugi  	PUGI__FN const char_t* xml_node::child_value() const  	{  		if (!_root) return PUGIXML_TEXT(""); -		 +  		// element nodes can have value if parse_embed_pcdata was used  		if (PUGI__NODETYPE(_root) == node_element && _root->value)  			return _root->value; @@ -5521,7 +5521,7 @@ namespace pugi  		return impl::strcpy_insitu(_root->name, _root->header, impl::xml_memory_page_name_allocated_mask, rhs, impl::strlength(rhs));  	} -		 +  	PUGI__FN bool xml_node::set_value(const char_t* rhs)  	{  		xml_node_type type_ = _root ? PUGI__NODETYPE(_root) : node_null; @@ -5535,7 +5535,7 @@ namespace pugi  	PUGI__FN xml_attribute xml_node::append_attribute(const char_t* name_)  	{  		if (!impl::allow_insert_attribute(type())) return xml_attribute(); -		 +  		impl::xml_allocator& alloc = impl::get_allocator(_root);  		if (!alloc.reserve()) return xml_attribute(); @@ -5545,14 +5545,14 @@ namespace pugi  		impl::append_attribute(a._attr, _root);  		a.set_name(name_); -		 +  		return a;  	}  	PUGI__FN xml_attribute xml_node::prepend_attribute(const char_t* name_)  	{  		if (!impl::allow_insert_attribute(type())) return xml_attribute(); -		 +  		impl::xml_allocator& alloc = impl::get_allocator(_root);  		if (!alloc.reserve()) return xml_attribute(); @@ -5570,7 +5570,7 @@ namespace pugi  	{  		if (!impl::allow_insert_attribute(type())) return xml_attribute();  		if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); -		 +  		impl::xml_allocator& alloc = impl::get_allocator(_root);  		if (!alloc.reserve()) return xml_attribute(); @@ -5588,7 +5588,7 @@ namespace pugi  	{  		if (!impl::allow_insert_attribute(type())) return xml_attribute();  		if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute(); -		 +  		impl::xml_allocator& alloc = impl::get_allocator(_root);  		if (!alloc.reserve()) return xml_attribute(); @@ -5675,7 +5675,7 @@ namespace pugi  	PUGI__FN xml_node xml_node::append_child(xml_node_type type_)  	{  		if (!impl::allow_insert_child(type(), type_)) return xml_node(); -		 +  		impl::xml_allocator& alloc = impl::get_allocator(_root);  		if (!alloc.reserve()) return xml_node(); @@ -5695,12 +5695,12 @@ namespace pugi  		impl::xml_allocator& alloc = impl::get_allocator(_root);  		if (!alloc.reserve()) return xml_node(); -		 +  		xml_node n(impl::allocate_node(alloc, type_));  		if (!n) return xml_node();  		impl::prepend_node(n._root, _root); -				 +  		if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml"));  		return n; @@ -5713,7 +5713,7 @@ namespace pugi  		impl::xml_allocator& alloc = impl::get_allocator(_root);  		if (!alloc.reserve()) return xml_node(); -	 +  		xml_node n(impl::allocate_node(alloc, type_));  		if (!n) return xml_node(); @@ -5731,7 +5731,7 @@ namespace pugi  		impl::xml_allocator& alloc = impl::get_allocator(_root);  		if (!alloc.reserve()) return xml_node(); -	 +  		xml_node n(impl::allocate_node(alloc, type_));  		if (!n) return xml_node(); @@ -5963,7 +5963,7 @@ namespace pugi  		// disable document_buffer_order optimization since in a document with multiple buffers comparing buffer pointers does not make sense  		doc->header |= impl::xml_memory_page_contents_shared_mask; -		 +  		// get extra buffer element (we'll store the document fragment buffer there so that we can deallocate it later)  		impl::xml_memory_page* page = 0;  		impl::xml_extra_buffer* extra = static_cast<impl::xml_extra_buffer*>(doc->allocate_memory(sizeof(impl::xml_extra_buffer), page)); @@ -5985,7 +5985,7 @@ namespace pugi  	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 && impl::strequal(name_, i->name))  			{ @@ -6000,7 +6000,7 @@ namespace pugi  	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 (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value + 0 : PUGIXML_TEXT(""))) @@ -6095,22 +6095,22 @@ namespace pugi  	PUGI__FN bool xml_node::traverse(xml_tree_walker& walker)  	{  		walker._depth = -1; -		 +  		xml_node arg_begin = *this;  		if (!walker.begin(arg_begin)) return false;  		xml_node cur = first_child(); -				 +  		if (cur)  		{  			++walker._depth; -			do  +			do  			{  				xml_node arg_for_each = cur;  				if (!walker.for_each(arg_for_each))  					return false; -						 +  				if (cur.first_child())  				{  					++walker._depth; @@ -6126,7 +6126,7 @@ namespace pugi  						--walker._depth;  						cur = cur.parent();  					} -						 +  					if (cur != *this)  						cur = cur.next_sibling();  				} @@ -6475,7 +6475,7 @@ namespace pugi  	{  		return _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root;  	} -	 +  	PUGI__FN bool xml_node_iterator::operator!=(const xml_node_iterator& rhs) const  	{  		return _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root; @@ -6536,7 +6536,7 @@ namespace pugi  	{  		return _wrap._attr == rhs._wrap._attr && _parent._root == rhs._parent._root;  	} -	 +  	PUGI__FN bool xml_attribute_iterator::operator!=(const xml_attribute_iterator& rhs) const  	{  		return _wrap._attr != rhs._wrap._attr || _parent._root != rhs._parent._root; @@ -6952,14 +6952,14 @@ namespace pugi  	{  		return impl::as_utf8_impl(str.c_str(), str.size());  	} -	 +  	PUGI__FN std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const char* str)  	{  		assert(str);  		return impl::as_wide_impl(str, strlen(str));  	} -	 +  	PUGI__FN std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const std::string& str)  	{  		return impl::as_wide_impl(str.c_str(), str.size()); @@ -7091,7 +7091,7 @@ PUGI__NS_BEGIN  		if (begin == end) return begin;  		// last written element -		I write = begin++;  +		I write = begin++;  		// merge unique elements  		while (begin != end) @@ -7266,7 +7266,7 @@ PUGI__NS_BEGIN  	static const uintptr_t xpath_memory_block_alignment = sizeof(double) > sizeof(void*) ? sizeof(double) : sizeof(void*);  	struct xpath_memory_block -	{	 +	{  		xpath_memory_block* next;  		size_t capacity; @@ -7276,7 +7276,7 @@ PUGI__NS_BEGIN  			double alignment;  		};  	}; -		 +  	class xpath_allocator  	{  		xpath_memory_block* _root; @@ -7293,7 +7293,7 @@ PUGI__NS_BEGIN  			error_handler = 0;  		#endif  		} -		 +  		void* allocate_nothrow(size_t size)  		{  			// round size up to block alignment boundary @@ -7316,13 +7316,13 @@ PUGI__NS_BEGIN  				xpath_memory_block* block = static_cast<xpath_memory_block*>(xml_memory::allocate(block_size));  				if (!block) return 0; -				 +  				block->next = _root;  				block->capacity = block_capacity; -				 +  				_root = block;  				_root_size = size; -				 +  				return block->data;  			}  		} @@ -7570,7 +7570,7 @@ PUGI__NS_BEGIN  		{  			return _uses_heap ? _length_heap : strlength(_buffer);  		} -		 +  		char_t* data(xpath_allocator* alloc)  		{  			// make private heap copy @@ -7660,7 +7660,7 @@ PUGI__NS_BEGIN  			case node_comment:  			case node_pi:  				return xpath_string::from_const(n.value()); -			 +  			case node_document:  			case node_element:  			{ @@ -7671,7 +7671,7 @@ PUGI__NS_BEGIN  					result.append(xpath_string::from_const(n.value()), alloc);  				xml_node cur = n.first_child(); -				 +  				while (cur && cur != n)  				{  					if (cur.type() == node_pcdata || cur.type() == node_cdata) @@ -7689,16 +7689,16 @@ PUGI__NS_BEGIN  						if (cur != n) cur = cur.next_sibling();  					}  				} -				 +  				return result;  			} -			 +  			default:  				return xpath_string();  			}  		}  	} -	 +  	PUGI__FN bool node_is_before_sibling(xml_node_struct* ln, xml_node_struct* rn)  	{  		assert(ln->parent == rn->parent); @@ -7722,7 +7722,7 @@ PUGI__NS_BEGIN  		// if rn sibling chain ended ln must be before rn  		return !rs;  	} -	 +  	PUGI__FN bool node_is_before(xml_node_struct* ln, xml_node_struct* rn)  	{  		// find common ancestor at the same depth, if any @@ -7803,7 +7803,7 @@ PUGI__NS_BEGIN  		return 0;  	} -	 +  	struct document_order_comparator  	{  		bool operator()(const xpath_node& lhs, const xpath_node& rhs) const @@ -7827,10 +7827,10 @@ PUGI__NS_BEGIN  					for (xml_attribute a = lhs.attribute(); a; a = a.next_attribute())  						if (a == rhs.attribute())  							return true; -					 +  					return false;  				} -				 +  				// compare attribute parents  				ln = lhs.parent();  				rn = rhs.parent(); @@ -7839,21 +7839,21 @@ PUGI__NS_BEGIN  			{  				// attributes go after the parent element  				if (lhs.parent() == rhs.node()) return false; -				 +  				ln = lhs.parent();  			}  			else if (rhs.attribute())  			{  				// attributes go after the parent element  				if (rhs.parent() == lhs.node()) return true; -				 +  				rn = rhs.parent();  			}  			if (ln == rn) return false;  			if (!ln || !rn) return ln < rn; -			 +  			return node_is_before(ln.internal_object(), rn.internal_object());  		}  	}; @@ -7866,7 +7866,7 @@ PUGI__NS_BEGIN  			else return rhs.attribute() ? false : lhs.node() < rhs.node();  		}  	}; -	 +  	PUGI__FN double gen_nan()  	{  	#if defined(__STDC_IEC_559__) || ((FLT_RADIX - 0 == 2) && (FLT_MAX_EXP - 0 == 128) && (FLT_MANT_DIG - 0 == 24)) @@ -7881,7 +7881,7 @@ PUGI__NS_BEGIN  		return zero / zero;  	#endif  	} -	 +  	PUGI__FN bool is_nan(double value)  	{  	#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) @@ -7894,7 +7894,7 @@ PUGI__NS_BEGIN  		return v != v;  	#endif  	} -	 +  	PUGI__FN const char_t* convert_number_to_string_special(double value)  	{  	#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) @@ -7926,12 +7926,12 @@ PUGI__NS_BEGIN  		return 0;  	#endif  	} -	 +  	PUGI__FN bool convert_number_to_boolean(double value)  	{  		return (value != 0 && !is_nan(value));  	} -	 +  	PUGI__FN void truncate_zeros(char* begin, char* end)  	{  		while (begin != end && end[-1] == '0') end--; @@ -8052,7 +8052,7 @@ PUGI__NS_BEGIN  		return xpath_string::from_heap_preallocated(result, s);  	} -	 +  	PUGI__FN bool check_string_to_number_format(const char_t* string)  	{  		// parse leading whitespace @@ -8119,7 +8119,7 @@ PUGI__NS_BEGIN  		return true;  	} -	 +  	PUGI__FN double round_nearest(double value)  	{  		return floor(value + 0.5); @@ -8131,17 +8131,17 @@ PUGI__NS_BEGIN  		// 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);  	} -	 +  	PUGI__FN const char_t* qualified_name(const xpath_node& node)  	{  		return node.attribute() ? node.attribute().name() : node.node().name();  	} -	 +  	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, ':'); -		 +  		return p ? p + 1 : name;  	} @@ -8171,39 +8171,39 @@ PUGI__NS_BEGIN  	PUGI__FN const char_t* namespace_uri(xml_node node)  	{  		namespace_uri_predicate pred = node.name(); -		 +  		xml_node p = node; -		 +  		while (p)  		{  			xml_attribute a = p.find_attribute(pred); -			 +  			if (a) return a.value(); -			 +  			p = p.parent();  		} -		 +  		return PUGIXML_TEXT("");  	}  	PUGI__FN const char_t* namespace_uri(xml_attribute attr, xml_node parent)  	{  		namespace_uri_predicate pred = attr.name(); -		 +  		// Default namespace does not apply to attributes  		if (!pred.prefix) return PUGIXML_TEXT(""); -		 +  		xml_node p = parent; -		 +  		while (p)  		{  			xml_attribute a = p.find_attribute(pred); -			 +  			if (a) return a.value(); -			 +  			p = p.parent();  		} -		 +  		return PUGIXML_TEXT("");  	} @@ -8389,11 +8389,11 @@ PUGI__NS_BEGIN  			result += result << 10;  			result ^= result >> 6;  		} -	 +  		result += result << 3;  		result ^= result >> 11;  		result += result << 15; -	 +  		return result;  	} @@ -8547,9 +8547,9 @@ PUGI__NS_BEGIN  			else  				type = sorted;  		} -		 +  		if (type != order) reverse(begin, end); -			 +  		return order;  	} @@ -8662,7 +8662,7 @@ PUGI__NS_BEGIN  		{  			if (_type == xpath_node_set::type_unsorted)  				sort(_begin, _end, duplicate_comparator()); -		 +  			_end = unique(_begin, _end);  		} @@ -8770,12 +8770,12 @@ PUGI__NS_BEGIN  		{  			next();  		} -		 +  		const char_t* state() const  		{  			return _cur;  		} -		 +  		void next()  		{  			const char_t* cur = _cur; @@ -8790,7 +8790,7 @@ PUGI__NS_BEGIN  			case 0:  				_cur_lexeme = lex_eof;  				break; -			 +  			case '>':  				if (*(cur+1) == '=')  				{ @@ -8834,7 +8834,7 @@ PUGI__NS_BEGIN  				_cur_lexeme = lex_equal;  				break; -			 +  			case '+':  				cur += 1;  				_cur_lexeme = lex_plus; @@ -8858,7 +8858,7 @@ PUGI__NS_BEGIN  				_cur_lexeme = lex_union;  				break; -			 +  			case '$':  				cur += 1; @@ -8876,7 +8876,7 @@ PUGI__NS_BEGIN  					}  					_cur_lexeme_contents.end = cur; -				 +  					_cur_lexeme = lex_var_ref;  				}  				else @@ -8897,7 +8897,7 @@ PUGI__NS_BEGIN  				_cur_lexeme = lex_close_brace;  				break; -			 +  			case '[':  				cur += 1;  				_cur_lexeme = lex_open_square_brace; @@ -8928,7 +8928,7 @@ PUGI__NS_BEGIN  					_cur_lexeme = lex_slash;  				}  				break; -		 +  			case '.':  				if (*(cur+1) == '.')  				{ @@ -8944,7 +8944,7 @@ PUGI__NS_BEGIN  					while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;  					_cur_lexeme_contents.end = cur; -					 +  					_cur_lexeme = lex_number;  				}  				else @@ -8970,7 +8970,7 @@ PUGI__NS_BEGIN  				_cur_lexeme_contents.begin = cur;  				while (*cur && *cur != terminator) cur++;  				_cur_lexeme_contents.end = cur; -				 +  				if (!*cur)  					_cur_lexeme = lex_none;  				else @@ -9000,7 +9000,7 @@ PUGI__NS_BEGIN  					_cur_lexeme_contents.begin = cur;  					while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++; -				 +  					if (*cur == '.')  					{  						cur++; @@ -9033,7 +9033,7 @@ PUGI__NS_BEGIN  					}  					_cur_lexeme_contents.end = cur; -				 +  					_cur_lexeme = lex_string;  				}  				else @@ -9144,7 +9144,7 @@ PUGI__NS_BEGIN  		axis_preceding_sibling,  		axis_self  	}; -	 +  	enum nodetest_t  	{  		nodetest_none, @@ -9179,7 +9179,7 @@ PUGI__NS_BEGIN  	};  	template <axis_t N> const axis_t axis_to_type<N>::axis = N; -		 +  	class xpath_ast_node  	{  	private: @@ -9498,7 +9498,7 @@ PUGI__NS_BEGIN  					return true;  				}  				break; -				 +  			case nodetest_type_node:  			case nodetest_all:  				if (is_xpath_attribute(name)) @@ -9507,7 +9507,7 @@ PUGI__NS_BEGIN  					return true;  				}  				break; -				 +  			case nodetest_all_in_namespace:  				if (starts_with(name, _data.nodetest) && is_xpath_attribute(name))  				{ @@ -9515,14 +9515,14 @@ PUGI__NS_BEGIN  					return true;  				}  				break; -			 +  			default:  				;  			}  			return false;  		} -		 +  		bool step_push(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc)  		{  			assert(n); @@ -9538,11 +9538,11 @@ PUGI__NS_BEGIN  					return true;  				}  				break; -				 +  			case nodetest_type_node:  				ns.push_back(xml_node(n), alloc);  				return true; -				 +  			case nodetest_type_comment:  				if (type == node_comment)  				{ @@ -9550,7 +9550,7 @@ PUGI__NS_BEGIN  					return true;  				}  				break; -				 +  			case nodetest_type_text:  				if (type == node_pcdata || type == node_cdata)  				{ @@ -9558,7 +9558,7 @@ PUGI__NS_BEGIN  					return true;  				}  				break; -				 +  			case nodetest_type_pi:  				if (type == node_pi)  				{ @@ -9566,7 +9566,7 @@ PUGI__NS_BEGIN  					return true;  				}  				break; -									 +  			case nodetest_pi:  				if (type == node_pi && n->name && strequal(n->name, _data.nodetest))  				{ @@ -9574,7 +9574,7 @@ PUGI__NS_BEGIN  					return true;  				}  				break; -				 +  			case nodetest_all:  				if (type == node_element)  				{ @@ -9582,7 +9582,7 @@ PUGI__NS_BEGIN  					return true;  				}  				break; -				 +  			case nodetest_all_in_namespace:  				if (type == node_element && n->name && starts_with(n->name, _data.nodetest))  				{ @@ -9609,33 +9609,33 @@ PUGI__NS_BEGIN  				for (xml_attribute_struct* a = n->first_attribute; a; a = a->next_attribute)  					if (step_push(ns, a, n, alloc) & once)  						return; -				 +  				break;  			} -			 +  			case axis_child:  			{  				for (xml_node_struct* c = n->first_child; c; c = c->next_sibling)  					if (step_push(ns, c, alloc) & once)  						return; -					 +  				break;  			} -			 +  			case axis_descendant:  			case axis_descendant_or_self:  			{  				if (axis == axis_descendant_or_self)  					if (step_push(ns, n, alloc) & once)  						return; -					 +  				xml_node_struct* cur = n->first_child; -				 +  				while (cur)  				{  					if (step_push(ns, cur, alloc) & once)  						return; -					 +  					if (cur->first_child)  						cur = cur->first_child;  					else @@ -9646,32 +9646,32 @@ PUGI__NS_BEGIN  							if (cur == n) return;  						} -					 +  						cur = cur->next_sibling;  					}  				} -				 +  				break;  			} -			 +  			case axis_following_sibling:  			{  				for (xml_node_struct* c = n->next_sibling; c; c = c->next_sibling)  					if (step_push(ns, c, alloc) & once)  						return; -				 +  				break;  			} -			 +  			case axis_preceding_sibling:  			{  				for (xml_node_struct* c = n->prev_sibling_c; c->next_sibling; c = c->prev_sibling_c)  					if (step_push(ns, c, alloc) & once)  						return; -				 +  				break;  			} -			 +  			case axis_following:  			{  				xml_node_struct* cur = n; @@ -9750,7 +9750,7 @@ PUGI__NS_BEGIN  				break;  			} -			 +  			case axis_ancestor:  			case axis_ancestor_or_self:  			{ @@ -9759,15 +9759,15 @@ PUGI__NS_BEGIN  						return;  				xml_node_struct* cur = n->parent; -				 +  				while (cur)  				{  					if (step_push(ns, cur, alloc) & once)  						return; -					 +  					cur = cur->parent;  				} -				 +  				break;  			} @@ -9785,12 +9785,12 @@ PUGI__NS_BEGIN  				break;  			} -				 +  			default:  				assert(false && "Unimplemented axis");  			}  		} -		 +  		template <class T> void step_fill(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* p, xpath_allocator* alloc, bool once, T v)  		{  			const axis_t axis = T::axis; @@ -9805,15 +9805,15 @@ PUGI__NS_BEGIN  						return;  				xml_node_struct* cur = p; -				 +  				while (cur)  				{  					if (step_push(ns, cur, alloc) & once)  						return; -					 +  					cur = cur->parent;  				} -				 +  				break;  			} @@ -9829,7 +9829,7 @@ PUGI__NS_BEGIN  			case axis_following:  			{  				xml_node_struct* cur = p; -				 +  				while (cur)  				{  					if (cur->first_child) @@ -9866,7 +9866,7 @@ PUGI__NS_BEGIN  				step_fill(ns, p, alloc, once, v);  				break;  			} -			 +  			default:  				assert(false && "Unimplemented axis");  			} @@ -9910,7 +9910,7 @@ PUGI__NS_BEGIN  					// in general, all axes generate elements in a particular order, but there is no order guarantee if axis is applied to two nodes  					if (axis != axis_self && size != 0) ns.set_type(xpath_node_set::type_unsorted); -					 +  					step_fill(ns, *it, stack.result, once, v);  					if (_right) apply_predicates(ns, size, stack, eval);  				} @@ -9928,7 +9928,7 @@ PUGI__NS_BEGIN  			return ns;  		} -		 +  	public:  		xpath_ast_node(ast_type_t type, xpath_value_type rettype_, const char_t* value):  			_type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0) @@ -9943,14 +9943,14 @@ PUGI__NS_BEGIN  			assert(type == ast_number_constant);  			_data.number = value;  		} -		 +  		xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_variable* value):  			_type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0)  		{  			assert(type == ast_variable);  			_data.variable = value;  		} -		 +  		xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_ast_node* left = 0, xpath_ast_node* right = 0):  			_type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(left), _right(right), _next(0)  		{ @@ -9985,25 +9985,25 @@ PUGI__NS_BEGIN  			{  			case ast_op_or:  				return _left->eval_boolean(c, stack) || _right->eval_boolean(c, stack); -				 +  			case ast_op_and:  				return _left->eval_boolean(c, stack) && _right->eval_boolean(c, stack); -				 +  			case ast_op_equal:  				return compare_eq(_left, _right, c, stack, equal_to());  			case ast_op_not_equal:  				return compare_eq(_left, _right, c, stack, not_equal_to()); -	 +  			case ast_op_less:  				return compare_rel(_left, _right, c, stack, less()); -			 +  			case ast_op_greater:  				return compare_rel(_right, _left, c, stack, less());  			case ast_op_less_or_equal:  				return compare_rel(_left, _right, c, stack, less_equal()); -			 +  			case ast_op_greater_or_equal:  				return compare_rel(_right, _left, c, stack, less_equal()); @@ -10029,43 +10029,43 @@ PUGI__NS_BEGIN  			case ast_func_boolean:  				return _left->eval_boolean(c, stack); -				 +  			case ast_func_not:  				return !_left->eval_boolean(c, stack); -				 +  			case ast_func_true:  				return true; -				 +  			case ast_func_false:  				return false;  			case ast_func_lang:  			{  				if (c.n.attribute()) return false; -				 +  				xpath_allocator_capture cr(stack.result);  				xpath_string lang = _left->eval_string(c, stack); -				 +  				for (xml_node n = c.n.node(); n; n = n.parent())  				{  					xml_attribute a = n.attribute(PUGIXML_TEXT("xml:lang")); -					 +  					if (a)  					{  						const char_t* value = a.value(); -						 +  						// strnicmp / strncasecmp is not portable  						for (const char_t* lit = lang.c_str(); *lit; ++lit)  						{  							if (tolower_ascii(*lit) != tolower_ascii(*value)) return false;  							++value;  						} -						 +  						return *value == 0 || *value == '-';  					}  				} -				 +  				return false;  			} @@ -10094,15 +10094,15 @@ PUGI__NS_BEGIN  				{  				case xpath_type_number:  					return convert_number_to_boolean(eval_number(c, stack)); -					 +  				case xpath_type_string:  				{  					xpath_allocator_capture cr(stack.result);  					return !eval_string(c, stack).empty();  				} -					 -				case xpath_type_node_set:				 + +				case xpath_type_node_set:  				{  					xpath_allocator_capture cr(stack.result); @@ -10123,7 +10123,7 @@ PUGI__NS_BEGIN  			{  			case ast_op_add:  				return _left->eval_number(c, stack) + _right->eval_number(c, stack); -				 +  			case ast_op_subtract:  				return _left->eval_number(c, stack) - _right->eval_number(c, stack); @@ -10144,7 +10144,7 @@ PUGI__NS_BEGIN  			case ast_func_last:  				return static_cast<double>(c.size); -			 +  			case ast_func_position:  				return static_cast<double>(c.position); @@ -10154,28 +10154,28 @@ PUGI__NS_BEGIN  				return static_cast<double>(_left->eval_node_set(c, stack, nodeset_eval_all).size());  			} -			 +  			case ast_func_string_length_0:  			{  				xpath_allocator_capture cr(stack.result);  				return static_cast<double>(string_value(c.n, stack.result).length());  			} -			 +  			case ast_func_string_length_1:  			{  				xpath_allocator_capture cr(stack.result);  				return static_cast<double>(_left->eval_string(c, stack).length());  			} -			 +  			case ast_func_number_0:  			{  				xpath_allocator_capture cr(stack.result);  				return convert_string_to_number(string_value(c.n, stack.result).c_str());  			} -			 +  			case ast_func_number_1:  				return _left->eval_number(c, stack); @@ -10184,36 +10184,36 @@ PUGI__NS_BEGIN  				xpath_allocator_capture cr(stack.result);  				double r = 0; -				 +  				xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_all); -				 +  				for (const xpath_node* it = ns.begin(); it != ns.end(); ++it)  				{  					xpath_allocator_capture cri(stack.result);  					r += convert_string_to_number(string_value(*it, stack.result).c_str());  				} -			 +  				return r;  			}  			case ast_func_floor:  			{  				double r = _left->eval_number(c, stack); -				 +  				return r == r ? floor(r) : r;  			}  			case ast_func_ceiling:  			{  				double r = _left->eval_number(c, stack); -				 +  				return r == r ? ceil(r) : r;  			}  			case ast_func_round:  				return round_nearest_nzero(_left->eval_number(c, stack)); -			 +  			case ast_variable:  			{  				assert(_rettype == _data.variable->type()); @@ -10230,30 +10230,30 @@ PUGI__NS_BEGIN  				{  				case xpath_type_boolean:  					return eval_boolean(c, stack) ? 1 : 0; -					 +  				case xpath_type_string:  				{  					xpath_allocator_capture cr(stack.result);  					return convert_string_to_number(eval_string(c, stack).c_str());  				} -					 +  				case xpath_type_node_set:  				{  					xpath_allocator_capture cr(stack.result);  					return convert_string_to_number(eval_string(c, stack).c_str());  				} -					 +  				default:  					assert(false && "Wrong expression for return type number");  					return 0;  				} -				 +  			}  			}  		} -		 +  		xpath_string eval_string_concat(const xpath_context& c, const xpath_stack& stack)  		{  			assert(_type == ast_func_concat); @@ -10309,11 +10309,11 @@ PUGI__NS_BEGIN  			{  			case ast_string_constant:  				return xpath_string::from_const(_data.string); -			 +  			case ast_func_local_name_0:  			{  				xpath_node na = c.n; -				 +  				return xpath_string::from_const(local_name(na));  			} @@ -10323,14 +10323,14 @@ PUGI__NS_BEGIN  				xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);  				xpath_node na = ns.first(); -				 +  				return xpath_string::from_const(local_name(na));  			}  			case ast_func_name_0:  			{  				xpath_node na = c.n; -				 +  				return xpath_string::from_const(qualified_name(na));  			} @@ -10340,14 +10340,14 @@ PUGI__NS_BEGIN  				xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);  				xpath_node na = ns.first(); -				 +  				return xpath_string::from_const(qualified_name(na));  			}  			case ast_func_namespace_uri_0:  			{  				xpath_node na = c.n; -				 +  				return xpath_string::from_const(namespace_uri(na));  			} @@ -10357,7 +10357,7 @@ PUGI__NS_BEGIN  				xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);  				xpath_node na = ns.first(); -				 +  				return xpath_string::from_const(namespace_uri(na));  			} @@ -10380,10 +10380,10 @@ PUGI__NS_BEGIN  				xpath_string p = _right->eval_string(c, swapped_stack);  				const char_t* pos = find_substring(s.c_str(), p.c_str()); -				 +  				return pos ? xpath_string::from_heap(s.c_str(), pos, stack.result) : xpath_string();  			} -			 +  			case ast_func_substring_after:  			{  				xpath_allocator_capture cr(stack.temp); @@ -10392,7 +10392,7 @@ PUGI__NS_BEGIN  				xpath_string s = _left->eval_string(c, swapped_stack);  				xpath_string p = _right->eval_string(c, swapped_stack); -				 +  				const char_t* pos = find_substring(s.c_str(), p.c_str());  				if (!pos) return xpath_string(); @@ -10412,19 +10412,19 @@ PUGI__NS_BEGIN  				size_t s_length = s.length();  				double first = round_nearest(_right->eval_number(c, stack)); -				 +  				if (is_nan(first)) return xpath_string(); // NaN  				else if (first >= s_length + 1) return xpath_string(); -				 +  				size_t pos = first < 1 ? 1 : static_cast<size_t>(first);  				assert(1 <= pos && pos <= s_length + 1);  				const char_t* rbegin = s.c_str() + (pos - 1);  				const char_t* rend = s.c_str() + s.length(); -				 +  				return s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin);  			} -			 +  			case ast_func_substring_3:  			{  				xpath_allocator_capture cr(stack.temp); @@ -10436,12 +10436,12 @@ PUGI__NS_BEGIN  				double first = round_nearest(_right->eval_number(c, stack));  				double last = first + round_nearest(_right->_next->eval_number(c, stack)); -				 +  				if (is_nan(first) || is_nan(last)) return xpath_string();  				else if (first >= s_length + 1) return xpath_string();  				else if (first >= last) return xpath_string();  				else if (last < 1) return xpath_string(); -				 +  				size_t pos = first < 1 ? 1 : static_cast<size_t>(first);  				size_t end = last >= s_length + 1 ? s_length + 1 : static_cast<size_t>(last); @@ -10468,7 +10468,7 @@ PUGI__NS_BEGIN  				char_t* begin = s.data(stack.result);  				char_t* end = normalize_space(begin); -			 +  				return xpath_string::from_heap_preallocated(begin, end);  			} @@ -10514,10 +10514,10 @@ PUGI__NS_BEGIN  				{  				case xpath_type_boolean:  					return xpath_string::from_const(eval_boolean(c, stack) ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false")); -					 +  				case xpath_type_number:  					return convert_number_to_string(eval_number(c, stack), stack.result); -					 +  				case xpath_type_node_set:  				{  					xpath_allocator_capture cr(stack.temp); @@ -10527,7 +10527,7 @@ PUGI__NS_BEGIN  					xpath_node_set_raw ns = eval_node_set(c, swapped_stack, nodeset_eval_first);  					return ns.empty() ? xpath_string() : string_value(ns.first(), stack.result);  				} -				 +  				default:  					assert(false && "Wrong expression for return type string");  					return xpath_string(); @@ -10568,20 +10568,20 @@ PUGI__NS_BEGIN  				bool once = eval_once(set.type(), eval);  				apply_predicate(set, 0, stack, once); -			 +  				return set;  			} -			 +  			case ast_func_id:  				return xpath_node_set_raw(); -			 +  			case ast_step:  			{  				switch (_axis)  				{  				case axis_ancestor:  					return step_do(c, stack, eval, axis_to_type<axis_ancestor>()); -					 +  				case axis_ancestor_or_self:  					return step_do(c, stack, eval, axis_to_type<axis_ancestor_or_self>()); @@ -10590,7 +10590,7 @@ PUGI__NS_BEGIN  				case axis_child:  					return step_do(c, stack, eval, axis_to_type<axis_child>()); -				 +  				case axis_descendant:  					return step_do(c, stack, eval, axis_to_type<axis_descendant>()); @@ -10599,23 +10599,23 @@ PUGI__NS_BEGIN  				case axis_following:  					return step_do(c, stack, eval, axis_to_type<axis_following>()); -				 +  				case axis_following_sibling:  					return step_do(c, stack, eval, axis_to_type<axis_following_sibling>()); -				 +  				case axis_namespace:  					// namespaced axis is not supported  					return xpath_node_set_raw(); -				 +  				case axis_parent:  					return step_do(c, stack, eval, axis_to_type<axis_parent>()); -				 +  				case axis_preceding:  					return step_do(c, stack, eval, axis_to_type<axis_preceding>());  				case axis_preceding_sibling:  					return step_do(c, stack, eval, axis_to_type<axis_preceding_sibling>()); -				 +  				case axis_self:  					return step_do(c, stack, eval, axis_to_type<axis_self>()); @@ -10732,7 +10732,7 @@ PUGI__NS_BEGIN  				_type = ast_opt_compare_attribute;  			}  		} -		 +  		bool is_posinv_expr() const  		{  			switch (_type) @@ -10756,10 +10756,10 @@ PUGI__NS_BEGIN  			default:  				if (_left && !_left->is_posinv_expr()) return false; -				 +  				for (xpath_ast_node* n = _right; n; n = n->_next)  					if (!n->is_posinv_expr()) return false; -					 +  				return true;  			}  		} @@ -10865,9 +10865,9 @@ PUGI__NS_BEGIN  			case 'b':  				if (name == PUGIXML_TEXT("boolean") && argc == 1)  					return new (alloc_node()) xpath_ast_node(ast_func_boolean, xpath_type_boolean, args[0]); -					 +  				break; -			 +  			case 'c':  				if (name == PUGIXML_TEXT("count") && argc == 1)  				{ @@ -10880,23 +10880,23 @@ PUGI__NS_BEGIN  					return new (alloc_node()) xpath_ast_node(ast_func_concat, xpath_type_string, args[0], args[1]);  				else if (name == PUGIXML_TEXT("ceiling") && argc == 1)  					return new (alloc_node()) xpath_ast_node(ast_func_ceiling, xpath_type_number, args[0]); -					 +  				break; -			 +  			case 'f':  				if (name == PUGIXML_TEXT("false") && argc == 0)  					return new (alloc_node()) xpath_ast_node(ast_func_false, xpath_type_boolean);  				else if (name == PUGIXML_TEXT("floor") && argc == 1)  					return new (alloc_node()) xpath_ast_node(ast_func_floor, xpath_type_number, args[0]); -					 +  				break; -			 +  			case 'i':  				if (name == PUGIXML_TEXT("id") && argc == 1)  					return new (alloc_node()) xpath_ast_node(ast_func_id, xpath_type_node_set, args[0]); -					 +  				break; -			 +  			case 'l':  				if (name == PUGIXML_TEXT("last") && argc == 0)  					return new (alloc_node()) xpath_ast_node(ast_func_last, xpath_type_number); @@ -10904,9 +10904,9 @@ PUGI__NS_BEGIN  					return new (alloc_node()) xpath_ast_node(ast_func_lang, xpath_type_boolean, args[0]);  				else if (name == PUGIXML_TEXT("local-name") && argc <= 1)  					return parse_function_helper(ast_func_local_name_0, ast_func_local_name_1, argc, args); -			 +  				break; -			 +  			case 'n':  				if (name == PUGIXML_TEXT("name") && argc <= 1)  					return parse_function_helper(ast_func_name_0, ast_func_name_1, argc, args); @@ -10918,21 +10918,21 @@ PUGI__NS_BEGIN  					return new (alloc_node()) xpath_ast_node(ast_func_not, xpath_type_boolean, args[0]);  				else if (name == PUGIXML_TEXT("number") && argc <= 1)  					return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_number_0 : ast_func_number_1, xpath_type_number, args[0]); -			 +  				break; -			 +  			case 'p':  				if (name == PUGIXML_TEXT("position") && argc == 0)  					return new (alloc_node()) xpath_ast_node(ast_func_position, xpath_type_number); -				 +  				break; -			 +  			case 'r':  				if (name == PUGIXML_TEXT("round") && argc == 1)  					return new (alloc_node()) xpath_ast_node(ast_func_round, xpath_type_number, args[0]);  				break; -			 +  			case 's':  				if (name == PUGIXML_TEXT("string") && argc <= 1)  					return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_string_0 : ast_func_string_1, xpath_type_string, args[0]); @@ -10953,13 +10953,13 @@ PUGI__NS_BEGIN  				}  				break; -			 +  			case 't':  				if (name == PUGIXML_TEXT("translate") && argc == 3)  					return new (alloc_node()) xpath_ast_node(ast_func_translate, xpath_type_string, args[0], args[1]);  				else if (name == PUGIXML_TEXT("true") && argc == 0)  					return new (alloc_node()) xpath_ast_node(ast_func_true, xpath_type_boolean); -					 +  				break;  			default: @@ -10984,37 +10984,37 @@ PUGI__NS_BEGIN  					return axis_ancestor_or_self;  				else if (name == PUGIXML_TEXT("attribute"))  					return axis_attribute; -				 +  				break; -			 +  			case 'c':  				if (name == PUGIXML_TEXT("child"))  					return axis_child; -				 +  				break; -			 +  			case 'd':  				if (name == PUGIXML_TEXT("descendant"))  					return axis_descendant;  				else if (name == PUGIXML_TEXT("descendant-or-self"))  					return axis_descendant_or_self; -				 +  				break; -			 +  			case 'f':  				if (name == PUGIXML_TEXT("following"))  					return axis_following;  				else if (name == PUGIXML_TEXT("following-sibling"))  					return axis_following_sibling; -				 +  				break; -			 +  			case 'n':  				if (name == PUGIXML_TEXT("namespace"))  					return axis_namespace; -				 +  				break; -			 +  			case 'p':  				if (name == PUGIXML_TEXT("parent"))  					return axis_parent; @@ -11022,13 +11022,13 @@ PUGI__NS_BEGIN  					return axis_preceding;  				else if (name == PUGIXML_TEXT("preceding-sibling"))  					return axis_preceding_sibling; -				 +  				break; -			 +  			case 's':  				if (name == PUGIXML_TEXT("self"))  					return axis_self; -				 +  				break;  			default: @@ -11066,7 +11066,7 @@ PUGI__NS_BEGIN  					return nodetest_type_text;  				break; -			 +  			default:  				break;  			} @@ -11139,12 +11139,12 @@ PUGI__NS_BEGIN  			{  				xpath_ast_node* args[2] = {0};  				size_t argc = 0; -				 +  				xpath_lexer_string function = _lexer.contents();  				_lexer.next(); -				 +  				xpath_ast_node* last_arg = 0; -				 +  				if (_lexer.current() != lex_open_brace)  					throw_error("Unrecognized function call");  				_lexer.next(); @@ -11157,16 +11157,16 @@ PUGI__NS_BEGIN  					if (_lexer.current() != lex_comma)  						throw_error("No comma between function arguments");  					_lexer.next(); -					 +  					xpath_ast_node* n = parse_expression(); -					 +  					if (argc < 2) args[argc] = n;  					else last_arg->set_next(n);  					argc++;  					last_arg = n;  				} -				 +  				_lexer.next();  				return parse_function(function, argc, args); @@ -11178,7 +11178,7 @@ PUGI__NS_BEGIN  				return 0;  			}  		} -		 +  		// FilterExpr ::= PrimaryExpr | FilterExpr Predicate  		// Predicate ::= '[' PredicateExpr ']'  		// PredicateExpr ::= Expr @@ -11198,13 +11198,13 @@ PUGI__NS_BEGIN  				if (_lexer.current() != lex_close_square_brace)  					throw_error("Unmatched square brace"); -			 +  				_lexer.next();  			} -			 +  			return n;  		} -		 +  		// Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep  		// AxisSpecifier ::= AxisName '::' | '@'?  		// NodeTest ::= NameTest | NodeType '(' ')' | 'processing-instruction' '(' Literal ')' @@ -11222,25 +11222,25 @@ PUGI__NS_BEGIN  			{  				axis = axis_attribute;  				axis_specified = true; -				 +  				_lexer.next();  			}  			else if (_lexer.current() == lex_dot)  			{  				_lexer.next(); -				 +  				return new (alloc_node()) xpath_ast_node(ast_step, set, axis_self, nodetest_type_node, 0);  			}  			else if (_lexer.current() == lex_double_dot)  			{  				_lexer.next(); -				 +  				return new (alloc_node()) xpath_ast_node(ast_step, set, axis_parent, nodetest_type_node, 0);  			} -		 +  			nodetest_t nt_type = nodetest_none;  			xpath_lexer_string nt_name; -			 +  			if (_lexer.current() == lex_string)  			{  				// node name test @@ -11273,14 +11273,14 @@ PUGI__NS_BEGIN  					}  					else throw_error("Unrecognized node test");  				} -				 +  				if (nt_type == nodetest_none)  				{  					// node type test or processing-instruction  					if (_lexer.current() == lex_open_brace)  					{  						_lexer.next(); -						 +  						if (_lexer.current() == lex_close_brace)  						{  							_lexer.next(); @@ -11288,18 +11288,18 @@ PUGI__NS_BEGIN  							nt_type = parse_node_test_type(nt_name);  							if (nt_type == nodetest_none) throw_error("Unrecognized node type"); -							 +  							nt_name = xpath_lexer_string();  						}  						else if (nt_name == PUGIXML_TEXT("processing-instruction"))  						{  							if (_lexer.current() != lex_quoted_string)  								throw_error("Only literals are allowed as arguments to processing-instruction()"); -						 +  							nt_type = nodetest_pi;  							nt_name = _lexer.contents();  							_lexer.next(); -							 +  							if (_lexer.current() != lex_close_brace)  								throw_error("Unmatched brace near processing-instruction()");  							_lexer.next(); @@ -11314,7 +11314,7 @@ PUGI__NS_BEGIN  						if (nt_name.end - nt_name.begin > 2 && nt_name.end[-2] == ':' && nt_name.end[-1] == '*') // NCName:*  						{  							nt_name.end--; // erase * -							 +  							nt_type = nodetest_all_in_namespace;  						}  						else nt_type = nodetest_name; @@ -11327,37 +11327,37 @@ PUGI__NS_BEGIN  				_lexer.next();  			}  			else throw_error("Unrecognized node test"); -			 +  			xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step, set, axis, nt_type, alloc_string(nt_name)); -			 +  			xpath_ast_node* last = 0; -			 +  			while (_lexer.current() == lex_open_square_brace)  			{  				_lexer.next(); -				 +  				xpath_ast_node* expr = parse_expression();  				xpath_ast_node* pred = new (alloc_node()) xpath_ast_node(ast_predicate, 0, expr, predicate_default); -				 +  				if (_lexer.current() != lex_close_square_brace)  					throw_error("Unmatched square brace");  				_lexer.next(); -				 +  				if (last) last->set_next(pred);  				else n->set_right(pred); -				 +  				last = pred;  			}  			return n;  		} -		 +  		// RelativeLocationPath ::= Step | RelativeLocationPath '/' Step | RelativeLocationPath '//' Step  		xpath_ast_node* parse_relative_location_path(xpath_ast_node* set)  		{  			xpath_ast_node* n = parse_step(set); -			 +  			while (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash)  			{  				lexeme_t l = _lexer.current(); @@ -11365,13 +11365,13 @@ PUGI__NS_BEGIN  				if (l == lex_double_slash)  					n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); -				 +  				n = parse_step(n);  			} -			 +  			return n;  		} -		 +  		// LocationPath ::= RelativeLocationPath | AbsoluteLocationPath  		// AbsoluteLocationPath ::= '/' RelativeLocationPath? | '//' RelativeLocationPath  		xpath_ast_node* parse_location_path() @@ -11379,7 +11379,7 @@ PUGI__NS_BEGIN  			if (_lexer.current() == lex_slash)  			{  				_lexer.next(); -				 +  				xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set);  				// relative location path can start from axis_attribute, dot, double_dot, multiply and string lexemes; any other lexeme means standalone root path @@ -11393,17 +11393,17 @@ PUGI__NS_BEGIN  			else if (_lexer.current() == lex_double_slash)  			{  				_lexer.next(); -				 +  				xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set);  				n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0); -				 +  				return parse_relative_location_path(n);  			}  			// else clause moved outside of if because of bogus warning 'control may reach end of non-void function being inlined' in gcc 4.0.1  			return parse_relative_location_path(0);  		} -		 +  		// PathExpr ::= LocationPath  		//				| FilterExpr  		//				| FilterExpr '/' RelativeLocationPath @@ -11419,7 +11419,7 @@ PUGI__NS_BEGIN  			// '(' in case of it being an expression, string literal, number constant or  			// function call. -			if (_lexer.current() == lex_var_ref || _lexer.current() == lex_open_brace ||  +			if (_lexer.current() == lex_var_ref || _lexer.current() == lex_open_brace ||  				_lexer.current() == lex_quoted_string || _lexer.current() == lex_number ||  				_lexer.current() == lex_string)  			{ @@ -11427,29 +11427,29 @@ PUGI__NS_BEGIN  				{  					// This is either a function call, or not - if not, we shall proceed with location path  					const char_t* state = _lexer.state(); -					 +  					while (PUGI__IS_CHARTYPE(*state, ct_space)) ++state; -					 +  					if (*state != '(') return parse_location_path();  					// This looks like a function call; however this still can be a node-test. Check it.  					if (parse_node_test_type(_lexer.contents()) != nodetest_none) return parse_location_path();  				} -				 +  				xpath_ast_node* n = parse_filter_expression();  				if (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash)  				{  					lexeme_t l = _lexer.current();  					_lexer.next(); -					 +  					if (l == lex_double_slash)  					{  						if (n->rettype() != xpath_type_node_set) throw_error("Step has to be applied to node set");  						n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0);  					} -	 +  					// select from location path  					return parse_relative_location_path(n);  				} @@ -11595,13 +11595,13 @@ PUGI__NS_BEGIN  		xpath_ast_node* parse()  		{  			xpath_ast_node* result = parse_expression(); -			 +  			if (_lexer.current() != lex_eof)  			{  				// there are still unparsed tokens left, error  				throw_error("Incorrect query");  			} -			 +  			return result;  		} @@ -11689,7 +11689,7 @@ namespace pugi  	{  		assert(_result.error);  	} -	 +  	PUGI__FN const char* xpath_exception::what() const throw()  	{  		return _result.error; @@ -11700,15 +11700,15 @@ namespace pugi  		return _result;  	}  #endif -	 +  	PUGI__FN xpath_node::xpath_node()  	{  	} -		 +  	PUGI__FN xpath_node::xpath_node(const xml_node& node_): _node(node_)  	{  	} -		 +  	PUGI__FN xpath_node::xpath_node(const xml_attribute& attribute_, const xml_node& parent_): _node(attribute_ ? parent_ : xml_node()), _attribute(attribute_)  	{  	} @@ -11717,12 +11717,12 @@ namespace pugi  	{  		return _attribute ? xml_node() : _node;  	} -		 +  	PUGI__FN xml_attribute xpath_node::attribute() const  	{  		return _attribute;  	} -	 +  	PUGI__FN xml_node xpath_node::parent() const  	{  		return _attribute ? _node : _node.parent(); @@ -11736,7 +11736,7 @@ namespace pugi  	{  		return (_node || _attribute) ? unspecified_bool_xpath_node : 0;  	} -	 +  	PUGI__FN bool xpath_node::operator!() const  	{  		return !(_node || _attribute); @@ -11746,7 +11746,7 @@ namespace pugi  	{  		return _node == n._node && _attribute == n._attribute;  	} -	 +  	PUGI__FN bool xpath_node::operator!=(const xpath_node& n) const  	{  		return _node != n._node || _attribute != n._attribute; @@ -11797,7 +11797,7 @@ namespace pugi  			}  			memcpy(storage, begin_, size_ * sizeof(xpath_node)); -			 +  			// deallocate old buffer  			if (_begin != &_storage) impl::xml_memory::deallocate(_begin); @@ -11836,12 +11836,12 @@ namespace pugi  		if (_begin != &_storage)  			impl::xml_memory::deallocate(_begin);  	} -		 +  	PUGI__FN xpath_node_set::xpath_node_set(const xpath_node_set& ns): _type(type_unsorted), _begin(&_storage), _end(&_storage)  	{  		_assign(ns._begin, ns._end, ns._type);  	} -	 +  	PUGI__FN xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns)  	{  		if (this == &ns) return *this; @@ -11874,17 +11874,17 @@ namespace pugi  	{  		return _type;  	} -		 +  	PUGI__FN size_t xpath_node_set::size() const  	{  		return _end - _begin;  	} -		 +  	PUGI__FN bool xpath_node_set::empty() const  	{  		return _begin == _end;  	} -		 +  	PUGI__FN const xpath_node& xpath_node_set::operator[](size_t index) const  	{  		assert(index < size()); @@ -11895,12 +11895,12 @@ namespace pugi  	{  		return _begin;  	} -		 +  	PUGI__FN xpath_node_set::const_iterator xpath_node_set::end() const  	{  		return _end;  	} -	 +  	PUGI__FN void xpath_node_set::sort(bool reverse)  	{  		_type = impl::xpath_sort(_begin, _end, _type, reverse); @@ -12280,21 +12280,21 @@ namespace pugi  	PUGI__FN bool xpath_query::evaluate_boolean(const xpath_node& n) const  	{  		if (!_impl) return false; -		 +  		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<impl::xpath_query_impl*>(_impl)->root->eval_boolean(c, sd.stack);  	} -	 +  	PUGI__FN double xpath_query::evaluate_number(const xpath_node& n) const  	{  		if (!_impl) return impl::gen_nan(); -		 +  		impl::xpath_context c(n, 1, 1);  		impl::xpath_stack_data sd; @@ -12323,7 +12323,7 @@ namespace pugi  		impl::xpath_string r = impl::evaluate_string_impl(static_cast<impl::xpath_query_impl*>(_impl), n, sd);  		size_t full_size = r.length() + 1; -		 +  		if (capacity > 0)  		{  			size_t size = (full_size < capacity) ? full_size : capacity; @@ -12332,7 +12332,7 @@ namespace pugi  			memcpy(buffer, r.c_str(), (size - 1) * sizeof(char_t));  			buffer[size - 1] = 0;  		} -		 +  		return full_size;  	} @@ -12480,7 +12480,7 @@ namespace pugi   *   * The above copyright notice and this permission notice shall be   * included in all copies or substantial portions of the Software. - *  + *   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES   * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND diff --git a/src/pugixml.hpp b/src/pugixml.hpp index e561490..5d5fe2b 100644 --- a/src/pugixml.hpp +++ b/src/pugixml.hpp @@ -133,13 +133,13 @@ namespace pugi  	// This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default.  	const unsigned int parse_eol = 0x0020; -	 +  	// This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default.  	const unsigned int parse_wconv_attribute = 0x0040;  	// This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default.  	const unsigned int parse_wnorm_attribute = 0x0080; -	 +  	// This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default.  	const unsigned int parse_declaration = 0x0100; @@ -189,16 +189,16 @@ namespace pugi  	};  	// Formatting flags -	 +  	// Indent the nodes that are written to output stream with as many indentation strings as deep the node is in DOM tree. This flag is on by default.  	const unsigned int format_indent = 0x01; -	 +  	// Write encoding-specific BOM to the output stream. This flag is off by default.  	const unsigned int format_write_bom = 0x02;  	// Use raw output mode (no indentation and no line breaks are written). This flag is off by default.  	const unsigned int format_raw = 0x04; -	 +  	// Omit default XML declaration even if there is no declaration in the document. This flag is off by default.  	const unsigned int format_no_declaration = 0x08; @@ -230,7 +230,7 @@ namespace pugi  	class xml_node;  	class xml_text; -	 +  	#ifndef PUGIXML_NO_XPATH  	class xpath_node;  	class xpath_node_set; @@ -304,13 +304,13 @@ namespace pugi  	private:  		xml_attribute_struct* _attr; -	 +  		typedef void (*unspecified_bool_type)(xml_attribute***);  	public:  		// Default constructor. Constructs an empty attribute.  		xml_attribute(); -		 +  		// Constructs attribute from internal pointer  		explicit xml_attribute(xml_attribute_struct* attr); @@ -422,7 +422,7 @@ namespace pugi  		// Borland C++ workaround  		bool operator!() const; -	 +  		// Comparison operators (compares wrapped node pointers)  		bool operator==(const xml_node& r) const;  		bool operator!=(const xml_node& r) const; @@ -443,7 +443,7 @@ namespace pugi  		// Get node value, or "" if node is empty or it has no value  		// Note: For <node>text</node> node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes.  		const char_t* value() const; -	 +  		// Get attribute list  		xml_attribute first_attribute() const;  		xml_attribute last_attribute() const; @@ -455,7 +455,7 @@ namespace pugi  		// Get next/previous sibling in the children list of the parent node  		xml_node next_sibling() const;  		xml_node previous_sibling() const; -		 +  		// Get parent node  		xml_node parent() const; @@ -483,7 +483,7 @@ namespace pugi  		// Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value)  		bool set_name(const char_t* rhs);  		bool set_value(const char_t* rhs); -		 +  		// Add attribute with specified name. Returns added attribute, or empty attribute on errors.  		xml_attribute append_attribute(const char_t* name);  		xml_attribute prepend_attribute(const char_t* name); @@ -537,11 +537,11 @@ namespace pugi  		template <typename Predicate> xml_attribute find_attribute(Predicate pred) const  		{  			if (!_root) return xml_attribute(); -			 +  			for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute())  				if (pred(attrib))  					return attrib; -		 +  			return xml_attribute();  		} @@ -549,11 +549,11 @@ namespace pugi  		template <typename Predicate> xml_node find_child(Predicate pred) const  		{  			if (!_root) return xml_node(); -	 +  			for (xml_node node = first_child(); node; node = node.next_sibling())  				if (pred(node))  					return node; -		 +  			return xml_node();  		} @@ -563,7 +563,7 @@ namespace pugi  			if (!_root) return xml_node();  			xml_node cur = first_child(); -			 +  			while (cur._root && cur._root != _root)  			{  				if (pred(cur)) return cur; @@ -595,7 +595,7 @@ namespace pugi  		// Recursively traverse subtree with xml_tree_walker  		bool traverse(xml_tree_walker& walker); -	 +  	#ifndef PUGIXML_NO_XPATH  		// Select single node by evaluating XPath query. Returns first node from the resulting node set.  		xpath_node select_node(const char_t* query, xpath_variable_set* variables = 0) const; @@ -610,7 +610,7 @@ namespace pugi  		xpath_node select_single_node(const xpath_query& query) const;  	#endif -		 +  		// Print subtree using a writer object  		void print(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; @@ -872,11 +872,11 @@ namespace pugi  	private:  		int _depth; -	 +  	protected:  		// Get current traversal depth  		int depth() const; -	 +  	public:  		xml_tree_walker();  		virtual ~xml_tree_walker(); @@ -947,7 +947,7 @@ namespace pugi  		char_t* _buffer;  		char _memory[192]; -		 +  		// Non-copyable semantics  		xml_document(const xml_document&);  		xml_document& operator=(const xml_document&); @@ -1056,7 +1056,7 @@ namespace pugi  		// Non-copyable semantics  		xpath_variable(const xpath_variable&);  		xpath_variable& operator=(const xpath_variable&); -		 +  	public:  		// Get variable name  		const char_t* name() const; @@ -1152,21 +1152,21 @@ namespace pugi  		// Get query expression return type  		xpath_value_type return_type() const; -		 +  		// Evaluate expression as boolean value in the specified context; performs type conversion if necessary.  		// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.  		bool evaluate_boolean(const xpath_node& n) const; -		 +  		// Evaluate expression as double value in the specified context; performs type conversion if necessary.  		// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.  		double evaluate_number(const xpath_node& n) const; -		 +  	#ifndef PUGIXML_NO_STL  		// Evaluate expression as string value in the specified context; performs type conversion if necessary.  		// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.  		string_t evaluate_string(const xpath_node& n) const;  	#endif -		 +  		// Evaluate expression as string value in the specified context; performs type conversion if necessary.  		// At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero).  		// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. @@ -1193,7 +1193,7 @@ namespace pugi  		// Borland C++ workaround  		bool operator!() const;  	}; -	 +  	#ifndef PUGIXML_NO_EXCEPTIONS  	// XPath exception class  	class PUGIXML_CLASS xpath_exception: public std::exception @@ -1212,20 +1212,20 @@ namespace pugi  		const xpath_parse_result& result() const;  	};  	#endif -	 +  	// XPath node class (either xml_node or xml_attribute)  	class PUGIXML_CLASS xpath_node  	{  	private:  		xml_node _node;  		xml_attribute _attribute; -	 +  		typedef void (*unspecified_bool_type)(xpath_node***);  	public:  		// Default constructor; constructs empty XPath node  		xpath_node(); -		 +  		// Construct XPath node from XML node/attribute  		xpath_node(const xml_node& node);  		xpath_node(const xml_attribute& attribute, const xml_node& parent); @@ -1233,13 +1233,13 @@ namespace pugi  		// Get node/attribute, if any  		xml_node node() const;  		xml_attribute attribute() const; -		 +  		// Get parent of contained node/attribute  		xml_node parent() const;  		// Safe bool conversion operator  		operator unspecified_bool_type() const; -		 +  		// Borland C++ workaround  		bool operator!() const; @@ -1265,13 +1265,13 @@ namespace pugi  			type_sorted,			// Sorted by document order (ascending)  			type_sorted_reverse		// Sorted by document order (descending)  		}; -		 +  		// Constant iterator type  		typedef const xpath_node* const_iterator;  		// We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work  		typedef const xpath_node* iterator; -	 +  		// Default constructor. Constructs empty set.  		xpath_node_set(); @@ -1280,7 +1280,7 @@ namespace pugi  		// Destructor  		~xpath_node_set(); -		 +  		// Copy constructor/assignment operator  		xpath_node_set(const xpath_node_set& ns);  		xpath_node_set& operator=(const xpath_node_set& ns); @@ -1293,31 +1293,31 @@ namespace pugi  		// Get collection type  		type_t type() const; -		 +  		// Get collection size  		size_t size() const;  		// Indexing operator  		const xpath_node& operator[](size_t index) const; -		 +  		// Collection iterators  		const_iterator begin() const;  		const_iterator end() const;  		// Sort the collection in ascending/descending order by document order  		void sort(bool reverse = false); -		 +  		// Get first node in the collection by document order  		xpath_node first() const; -		 +  		// Check if collection is empty  		bool empty() const; -	 +  	private:  		type_t _type; -		 +  		xpath_node _storage; -		 +  		xpath_node* _begin;  		xpath_node* _end; @@ -1330,7 +1330,7 @@ namespace pugi  	// Convert wide string to UTF8  	std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const wchar_t* str);  	std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >& str); -	 +  	// Convert UTF8 to wide string  	std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const char* str);  	std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >& str); @@ -1338,13 +1338,13 @@ namespace pugi  	// Memory allocation function interface; returns pointer to allocated memory or NULL on failure  	typedef void* (*allocation_function)(size_t size); -	 +  	// Memory deallocation function interface  	typedef void (*deallocation_function)(void* ptr);  	// Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions.  	void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate); -	 +  	// Get current memory management functions  	allocation_function PUGIXML_FUNCTION get_memory_allocation_function();  	deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function(); @@ -1393,7 +1393,7 @@ namespace std   *   * The above copyright notice and this permission notice shall be   * included in all copies or substantial portions of the Software. - *  + *   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES   * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 
