diff options
| -rw-r--r-- | src/pugixml.cpp | 158 | 
1 files changed, 102 insertions, 56 deletions
| diff --git a/src/pugixml.cpp b/src/pugixml.cpp index a323d32..d98daa8 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -3312,6 +3312,94 @@ PUGI__NS_BEGIN  		}  	} +    // get value with conversion functions +	PUGI__FN int get_value_int(const char_t* value) +	{ +	#ifdef PUGIXML_WCHAR_MODE +		return static_cast<int>(wcstol(value, 0, 10)); +	#else +		return static_cast<int>(strtol(value, 0, 10)); +	#endif +	} + +	PUGI__FN unsigned int get_value_uint(const char_t* value) +	{ +	#ifdef PUGIXML_WCHAR_MODE +		return static_cast<unsigned int>(wcstoul(value, 0, 10)); +	#else +		return static_cast<unsigned int>(strtoul(value, 0, 10)); +	#endif +	} + +	PUGI__FN double get_value_double(const char_t* value) +	{ +	#ifdef PUGIXML_WCHAR_MODE +		return wcstod(value, 0); +	#else +		return strtod(value, 0); +	#endif +	} + +	PUGI__FN float get_value_float(const char_t* value) +	{ +	#ifdef PUGIXML_WCHAR_MODE +		return static_cast<float>(wcstod(value, 0)); +	#else +		return static_cast<float>(strtod(value, 0)); +	#endif +	} + +	PUGI__FN bool get_value_bool(const char_t* value) +	{ +		// only look at first char +		char_t first = *value; + +		// 1*, t* (true), T* (True), y* (yes), Y* (YES) +		return (first == '1' || first == 't' || first == 'T' || first == 'y' || first == 'Y'); +	} + +    // set value with conversion functions +	PUGI__FN bool set_value_buffer(char_t*& dest, uintptr_t& header, uintptr_t header_mask, const char (&buf)[128]) +    { +	#ifdef PUGIXML_WCHAR_MODE +		char_t wbuf[128]; +		impl::widen_ascii(wbuf, buf); + +		return strcpy_insitu(dest, header, header_mask, wbuf); +	#else +		return strcpy_insitu(dest, header, header_mask, buf); +	#endif +    } + +	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, int value) +    { +		char buf[128]; +		sprintf(buf, "%d", value); +	 +        return set_value_buffer(dest, header, header_mask, buf); +    } + +	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, unsigned int value) +	{ +		char buf[128]; +		sprintf(buf, "%u", value); + +        return set_value_buffer(dest, header, header_mask, buf); +	} + +	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, double value) +	{ +		char buf[128]; +		sprintf(buf, "%g", value); + +        return set_value_buffer(dest, header, header_mask, buf); +	} +	 +	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, bool value) +	{ +		return strcpy_insitu(dest, header, header_mask, value ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false")); +	} +  	// 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  	PUGI__FN xml_parse_status get_file_size(FILE* file, size_t& out_result)  	{ @@ -3692,55 +3780,35 @@ namespace pugi  	{  		if (!_attr || !_attr->value) return 0; -	#ifdef PUGIXML_WCHAR_MODE -		return static_cast<int>(wcstol(_attr->value, 0, 10)); -	#else -		return static_cast<int>(strtol(_attr->value, 0, 10)); -	#endif +        return impl::get_value_int(_attr->value);  	}  	PUGI__FN unsigned int xml_attribute::as_uint() const  	{  		if (!_attr || !_attr->value) return 0; -	#ifdef PUGIXML_WCHAR_MODE -		return static_cast<unsigned int>(wcstoul(_attr->value, 0, 10)); -	#else -		return static_cast<unsigned int>(strtoul(_attr->value, 0, 10)); -	#endif +        return impl::get_value_uint(_attr->value);  	}  	PUGI__FN double xml_attribute::as_double() const  	{  		if (!_attr || !_attr->value) return 0; -	#ifdef PUGIXML_WCHAR_MODE -		return wcstod(_attr->value, 0); -	#else -		return strtod(_attr->value, 0); -	#endif +        return impl::get_value_double(_attr->value);  	}  	PUGI__FN float xml_attribute::as_float() const  	{  		if (!_attr || !_attr->value) return 0; -	#ifdef PUGIXML_WCHAR_MODE -		return static_cast<float>(wcstod(_attr->value, 0)); -	#else -		return static_cast<float>(strtod(_attr->value, 0)); -	#endif +        return impl::get_value_float(_attr->value);  	}  	PUGI__FN bool xml_attribute::as_bool() const  	{  		if (!_attr || !_attr->value) return false; -		// only look at first char -		char_t first = *_attr->value; - -		// 1*, t* (true), T* (True), y* (yes), Y* (YES) -		return (first == '1' || first == 't' || first == 'T' || first == 'y' || first == 'Y'); +        return impl::get_value_bool(_attr->value);  	}  	PUGI__FN bool xml_attribute::empty() const @@ -3814,52 +3882,30 @@ namespace pugi  	PUGI__FN bool xml_attribute::set_value(int rhs)  	{ -		char buf[128]; -		sprintf(buf, "%d", rhs); -	 -	#ifdef PUGIXML_WCHAR_MODE -		char_t wbuf[128]; -		impl::widen_ascii(wbuf, buf); +		if (!_attr) return false; -		return set_value(wbuf); -	#else -		return set_value(buf); -	#endif +        return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, 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]; -		impl::widen_ascii(wbuf, buf); +		if (!_attr) return false; -		return set_value(wbuf); -	#else -		return set_value(buf); -	#endif +        return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, 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]; -		impl::widen_ascii(wbuf, buf); +		if (!_attr) return false; -		return set_value(wbuf); -	#else -		return set_value(buf); -	#endif +        return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);  	}  	PUGI__FN bool xml_attribute::set_value(bool rhs)  	{ -		return set_value(rhs ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false")); +		if (!_attr) return false; + +        return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);  	}  #ifdef __BORLANDC__ | 
