diff options
| -rw-r--r-- | src/pugixml.hpp | 18 | ||||
| -rw-r--r-- | src/pugixpath.cpp | 23 | 
2 files changed, 34 insertions, 7 deletions
diff --git a/src/pugixml.hpp b/src/pugixml.hpp index d3dfea6..cb6180c 100644 --- a/src/pugixml.hpp +++ b/src/pugixml.hpp @@ -56,11 +56,6 @@ namespace std  #	endif  #endif -// No XPath without STL -#if !defined(PUGIXML_NO_XPATH) && defined(PUGIXML_NO_STL) -#	define PUGIXML_NO_XPATH -#endif -  // Include exception header for XPath  #if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)  #	include <exception> @@ -2017,6 +2012,7 @@ namespace pugi  		 */  		double evaluate_number(const xml_node& n) const; +	#ifndef PUGIXML_NO_STL  		/**  		 * Evaluate expression as string value for the context node \a n.  		 * If expression does not directly evaluate to string, the expression result is converted @@ -2027,8 +2023,20 @@ namespace pugi  		 * \return evaluation result  		 */  		string_t evaluate_string(const xml_node& n) const; +	#endif  		/** +		 * Evaluate expression as string value for the context node \a n. +		 * If expression does not directly evaluate to string, the expression result is converted +		 * as through string() XPath function call. +		 * Throws std::bad_alloc on out of memory error. +		 * +		 * \param n - context node +		 * \return evaluation result +		 */ +		size_t evaluate_string(char_t* buffer, size_t capacity, const xml_node& n) const; + +		/**  		 * Evaluate expression as node set for the context node \a n.  		 * If expression does not directly evaluate to node set, throws xpath_exception.  		 * Throws std::bad_alloc on out of memory error. diff --git a/src/pugixpath.cpp b/src/pugixpath.cpp index 0a3aadf..378138d 100644 --- a/src/pugixpath.cpp +++ b/src/pugixpath.cpp @@ -28,6 +28,12 @@  #	include <wchar.h>  #endif +#include <new> + +#ifndef PUGIXML_NO_STL +#	include <string> +#endif +  // int32_t  #if !defined(_MSC_VER) || _MSC_VER >= 1600  #	include <stdint.h> @@ -50,8 +56,6 @@ typedef __int32 int32_t;  #	pragma diag_suppress=237 // controlling expression is constant  #endif -#include <string> -  // String utilities prototypes  namespace pugi  { @@ -3762,6 +3766,7 @@ namespace pugi  		return _root->eval_number(c);  	} +#ifndef PUGIXML_NO_STL  	string_t xpath_query::evaluate_string(const xml_node& n) const  	{  		if (!_root) return string_t(); @@ -3770,7 +3775,21 @@ namespace pugi  		return _root->eval_string(c).c_str();  	} +#endif +	size_t xpath_query::evaluate_string(char_t* buffer, size_t capacity, const xml_node& n) const +	{ +		xpath_context c(n, 1, 1); +		xpath_string r = _root ? _root->eval_string(c) : xpath_string(); + +		size_t size = r.length() + 1; +		 +		// $$ zero-terminate? +		if (capacity > 0) memcpy(buffer, r.c_str(), size < capacity ? size : capacity); +		 +		return size; +	} +  	xpath_node_set xpath_query::evaluate_node_set(const xml_node& n) const  	{  		if (!_root) return xpath_node_set();  | 
