diff options
| author | Arseny Kapoulkine <arseny.kapoulkine@gmail.com> | 2014-02-08 20:36:09 +0000 | 
|---|---|---|
| committer | Arseny Kapoulkine <arseny.kapoulkine@gmail.com> | 2014-02-08 20:36:09 +0000 | 
| commit | f9bbc39bd9a14124c1cba696c99d051a39e34b60 (patch) | |
| tree | a870b80a24fc0a49a51d6a6df47e38f375c4cdb0 /src | |
| parent | c3550de72b83bf70aa82f63b7395f1a0b41a4b0d (diff) | |
Implement long long support if PUGIXML_HAS_LONG_LONG is defined (autodetection is not implemented yet)
git-svn-id: http://pugixml.googlecode.com/svn/trunk@962 99668b35-9821-0410-8761-19e4c4f06640
Diffstat (limited to 'src')
| -rw-r--r-- | src/pugixml.cpp | 134 | ||||
| -rw-r--r-- | src/pugixml.hpp | 30 | 
2 files changed, 164 insertions, 0 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 78fe50a..874d611 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -3386,6 +3386,34 @@ PUGI__NS_BEGIN  		return (first == '1' || first == 't' || first == 'T' || first == 'y' || first == 'Y');  	} +#ifdef PUGIXML_HAS_LONG_LONG +	PUGI__FN long long get_value_llong(const char_t* value, long long def) +	{ +		if (!value) return def; + +		int base = get_integer_base(value); + +	#ifdef PUGIXML_WCHAR_MODE +		return wcstoll(value, 0, base); +	#else +		return strtoll(value, 0, base); +	#endif +	} + +	PUGI__FN unsigned long long get_value_ullong(const char_t* value, unsigned long long def) +	{ +		if (!value) return def; + +		int base = get_integer_base(value); + +	#ifdef PUGIXML_WCHAR_MODE +		return wcstoull(value, 0, base); +	#else +		return strtoull(value, 0, base); +	#endif +	} +#endif +  	// set value with conversion functions  	PUGI__FN bool set_value_buffer(char_t*& dest, uintptr_t& header, uintptr_t header_mask, char (&buf)[128])  	{ @@ -3428,6 +3456,24 @@ PUGI__NS_BEGIN  		return strcpy_insitu(dest, header, header_mask, value ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false"));  	} +#ifdef PUGIXML_HAS_LONG_LONG +	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, long long value) +	{ +		char buf[128]; +		sprintf(buf, "%lld", 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 long long value) +	{ +		char buf[128]; +		sprintf(buf, "%llu", value); +	 +		return set_value_buffer(dest, header, header_mask, buf); +	} +#endif +  	// 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)  	{ @@ -3891,6 +3937,18 @@ namespace pugi  		return impl::get_value_bool(_attr ? _attr->value : 0, def);  	} +#ifdef PUGIXML_HAS_LONG_LONG +	PUGI__FN long long xml_attribute::as_llong(long long def) const +	{ +		return impl::get_value_llong(_attr ? _attr->value : 0, def); +	} + +	PUGI__FN unsigned long long xml_attribute::as_ullong(unsigned long long def) const +	{ +		return impl::get_value_ullong(_attr ? _attr->value : 0, def); +	} +#endif +  	PUGI__FN bool xml_attribute::empty() const  	{  		return !_attr; @@ -3946,6 +4004,20 @@ namespace pugi  		return *this;  	} +#ifdef PUGIXML_HAS_LONG_LONG +	PUGI__FN xml_attribute& xml_attribute::operator=(long long rhs) +	{ +		set_value(rhs); +		return *this; +	} + +	PUGI__FN xml_attribute& xml_attribute::operator=(unsigned long long rhs) +	{ +		set_value(rhs); +		return *this; +	} +#endif +  	PUGI__FN bool xml_attribute::set_name(const char_t* rhs)  	{  		if (!_attr) return false; @@ -3988,6 +4060,22 @@ namespace pugi  		return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);  	} +#ifdef PUGIXML_HAS_LONG_LONG +	PUGI__FN bool xml_attribute::set_value(long long rhs) +	{ +		if (!_attr) return false; + +		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 long long rhs) +	{ +		if (!_attr) return false; + +		return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs); +	} +#endif +  #ifdef __BORLANDC__  	PUGI__FN bool operator&&(const xml_attribute& lhs, bool rhs)  	{ @@ -4936,6 +5024,22 @@ namespace pugi  		return impl::get_value_bool(d ? d->value : 0, def);  	} +#ifdef PUGIXML_HAS_LONG_LONG +	PUGI__FN long long xml_text::as_llong(long long def) const +	{ +		xml_node_struct* d = _data(); + +		return impl::get_value_llong(d ? d->value : 0, def); +	} + +	PUGI__FN unsigned long long xml_text::as_ullong(unsigned long long def) const +	{ +		xml_node_struct* d = _data(); + +		return impl::get_value_ullong(d ? d->value : 0, def); +	} +#endif +  	PUGI__FN bool xml_text::set(const char_t* rhs)  	{  		xml_node_struct* dn = _data_new(); @@ -4971,6 +5075,22 @@ namespace pugi  		return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;  	} +#ifdef PUGIXML_HAS_LONG_LONG +	PUGI__FN bool xml_text::set(long long rhs) +	{ +		xml_node_struct* dn = _data_new(); + +		return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; +	} + +	PUGI__FN bool xml_text::set(unsigned long long rhs) +	{ +		xml_node_struct* dn = _data_new(); + +		return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false; +	} +#endif +  	PUGI__FN xml_text& xml_text::operator=(const char_t* rhs)  	{  		set(rhs); @@ -5001,6 +5121,20 @@ namespace pugi  		return *this;  	} +#ifdef PUGIXML_HAS_LONG_LONG +	PUGI__FN xml_text& xml_text::operator=(long long rhs) +	{ +		set(rhs); +		return *this; +	} + +	PUGI__FN xml_text& xml_text::operator=(unsigned long long rhs) +	{ +		set(rhs); +		return *this; +	} +#endif +  	PUGI__FN xml_node xml_text::data() const  	{  		return xml_node(_data()); diff --git a/src/pugixml.hpp b/src/pugixml.hpp index db1507a..ae43fd2 100644 --- a/src/pugixml.hpp +++ b/src/pugixml.hpp @@ -320,6 +320,11 @@ namespace pugi  		double as_double(double def = 0) const;  		float as_float(float def = 0) const; +	#ifdef PUGIXML_HAS_LONG_LONG +		long long as_llong(long long def = 0) const; +		unsigned long long as_ullong(unsigned long long def = 0) const; +	#endif +  		// Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty  		bool as_bool(bool def = false) const; @@ -333,6 +338,11 @@ namespace pugi  		bool set_value(double rhs);  		bool set_value(bool rhs); +	#ifdef PUGIXML_HAS_LONG_LONG +		bool set_value(long long rhs); +		bool set_value(unsigned long long rhs); +	#endif +  		// Set attribute value (equivalent to set_value without error checking)  		xml_attribute& operator=(const char_t* rhs);  		xml_attribute& operator=(int rhs); @@ -340,6 +350,11 @@ namespace pugi  		xml_attribute& operator=(double rhs);  		xml_attribute& operator=(bool rhs); +	#ifdef PUGIXML_HAS_LONG_LONG +		xml_attribute& operator=(long long rhs); +		xml_attribute& operator=(unsigned long long rhs); +	#endif +  		// Get next/previous attribute in the attribute list of the parent node  		xml_attribute next_attribute() const;  		xml_attribute previous_attribute() const; @@ -637,6 +652,11 @@ namespace pugi  		double as_double(double def = 0) const;  		float as_float(float def = 0) const; +	#ifdef PUGIXML_HAS_LONG_LONG +		long long as_llong(long long def = 0) const; +		unsigned long long as_ullong(unsigned long long def = 0) const; +	#endif +  		// Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty  		bool as_bool(bool def = false) const; @@ -649,6 +669,11 @@ namespace pugi  		bool set(double rhs);  		bool set(bool rhs); +	#ifdef PUGIXML_HAS_LONG_LONG +		bool set(long long rhs); +		bool set(unsigned long long rhs); +	#endif +  		// Set text (equivalent to set without error checking)  		xml_text& operator=(const char_t* rhs);  		xml_text& operator=(int rhs); @@ -656,6 +681,11 @@ namespace pugi  		xml_text& operator=(double rhs);  		xml_text& operator=(bool rhs); +	#ifdef PUGIXML_HAS_LONG_LONG +		xml_text& operator=(long long rhs); +		xml_text& operator=(unsigned long long rhs); +	#endif +  		// Get the data node (node_pcdata or node_cdata) for this object  		xml_node data() const;  	};  | 
