summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2010-08-05 04:52:07 +0000
committerarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2010-08-05 04:52:07 +0000
commita8e5f0ecf0b511cc3d191ad10193e7d7f0c1ba9a (patch)
tree2988a017c36e86fa42063e4562310399b049e9b3 /src
parenta9bc2d88736cc4d2f2963915e3de66b93585f479 (diff)
Removed some redundant code from pugixml.cpp, added internal xml_document::reset() function
git-svn-id: http://pugixml.googlecode.com/svn/trunk@630 99668b35-9821-0410-8761-19e4c4f06640
Diffstat (limited to 'src')
-rw-r--r--src/pugixml.cpp63
-rw-r--r--src/pugixml.hpp1
2 files changed, 21 insertions, 43 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index 76745e2..4efb259 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -17,8 +17,8 @@
#include <stdio.h>
#include <string.h>
#include <assert.h>
-#include <wchar.h>
#include <setjmp.h>
+#include <wchar.h>
#ifndef PUGIXML_NO_STL
# include <istream>
@@ -415,7 +415,8 @@ namespace pugi
}
else
{
- // insert page before the end of linked list
+ // insert page before the end of linked list, so that it is deleted as soon as possible
+ // the last page is not deleted even if it's empty (see deallocate_memory)
assert(_root->prev);
page->prev = _root->prev;
@@ -943,8 +944,6 @@ namespace
namespace
{
- using namespace pugi;
-
enum chartype_t
{
ct_parse_pcdata = 1, // \0, &, \r, <
@@ -1510,8 +1509,6 @@ namespace
char_t* strconv_comment(char_t* s, char_t endch)
{
- if (!*s) return 0;
-
gap g;
while (true)
@@ -1540,8 +1537,6 @@ namespace
char_t* strconv_cdata(char_t* s, char_t endch)
{
- if (!*s) return 0;
-
gap g;
while (true)
@@ -1962,11 +1957,6 @@ namespace
s += (s[2] == '>' ? 3 : 2); // Step over the '\0->'.
}
-
- if (OPTSET(parse_comments))
- {
- POPNODE(); // Pop since this is a standalone.
- }
}
else THROW_ERROR(status_bad_comment, s);
}
@@ -1996,8 +1986,6 @@ namespace
*s++ = 0; // Zero-terminate this segment.
}
-
- POPNODE(); // Pop since this is a standalone.
}
else // Flagged for discard, but we still have to scan for the terminator.
{
@@ -2014,8 +2002,6 @@ namespace
}
else if (s[0] == 'D' && s[1] == 'O' && s[2] == 'C' && s[3] == 'T' && s[4] == 'Y' && s[5] == 'P' && ENDSWITH(s[6], 'E'))
{
- if (s[6] != 'E') THROW_ERROR(status_bad_doctype, s);
-
s -= 2;
parse_doctype(s, endch, true);
@@ -2165,15 +2151,15 @@ namespace
a->name = s; // Save the offset.
SCANWHILE(IS_CHARTYPE(*s, ct_symbol)); // Scan for a terminator.
- CHECK_ERROR(status_bad_attribute, s);
+ CHECK_ERROR(status_bad_attribute, s); //$ redundant, left for performance
ENDSEG(); // Save char in 'ch', terminate & step over.
- CHECK_ERROR(status_bad_attribute, s);
+ CHECK_ERROR(status_bad_attribute, s); //$ redundant, left for performance
if (IS_CHARTYPE(ch, ct_space))
{
SKIPWS(); // Eat any whitespace.
- CHECK_ERROR(status_bad_attribute, s);
+ CHECK_ERROR(status_bad_attribute, s); //$ redundant, left for performance
ch = *s;
++s;
@@ -3010,8 +2996,6 @@ namespace
template <typename T> xml_parse_result load_stream_impl(xml_document& doc, std::basic_istream<T>& stream, unsigned int options, xml_encoding encoding)
{
- if (stream.fail()) return make_parse_result(status_io_error);
-
// get length of remaining data in stream
typename std::basic_istream<T>::pos_type pos = stream.tellg();
stream.seekg(0, std::ios::end);
@@ -3639,8 +3623,6 @@ namespace pugi
if (type() != node_element && type() != node_declaration) return xml_attribute();
xml_attribute a(append_attribute_ll(_root, get_allocator(_root)));
- if (!a) return xml_attribute();
-
a.set_name(name);
return a;
@@ -3737,7 +3719,6 @@ namespace pugi
if (!allow_insert_child(this->type(), type)) return xml_node();
xml_node n(append_node(_root, get_allocator(_root), type));
- if (!n) return xml_node();
if (type == node_declaration) n.set_name(PUGIXML_TEXT("xml"));
@@ -3952,7 +3933,7 @@ namespace pugi
if (path[0] == delimiter)
{
// Absolute path; e.g. '/foo/bar'
- while (found.parent()) found = found.parent();
+ found = found.root();
++path;
}
@@ -4060,8 +4041,6 @@ namespace pugi
#ifndef PUGIXML_NO_STL
void xml_node::print(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const
{
- if (!_root) return;
-
xml_writer_stream writer(stream);
print(writer, indent, flags, encoding, depth);
@@ -4069,8 +4048,6 @@ namespace pugi
void xml_node::print(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent, unsigned int flags, unsigned int depth) const
{
- if (!_root) return;
-
xml_writer_stream writer(stream);
print(writer, indent, flags, encoding_wchar, depth);
@@ -4280,10 +4257,14 @@ namespace pugi
destroy();
}
- void xml_document::create()
+ void xml_document::reset()
{
destroy();
+ create();
+ }
+ void xml_document::create()
+ {
// initialize sentinel page
STATIC_ASSERT(offsetof(xml_memory_page, data) + sizeof(xml_document_struct) + xml_memory_page_alignment <= sizeof(_memory));
@@ -4344,14 +4325,14 @@ namespace pugi
#ifndef PUGIXML_NO_STL
xml_parse_result xml_document::load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options, xml_encoding encoding)
{
- create();
+ reset();
return load_stream_impl(*this, stream, options, encoding);
}
xml_parse_result xml_document::load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options)
{
- create();
+ reset();
return load_stream_impl(*this, stream, options, encoding_wchar);
}
@@ -4359,8 +4340,6 @@ namespace pugi
xml_parse_result xml_document::load(const char_t* contents, unsigned int options)
{
- create();
-
// Force native encoding (skip autodetection)
#ifdef PUGIXML_WCHAR_MODE
xml_encoding encoding = encoding_wchar;
@@ -4383,7 +4362,7 @@ namespace pugi
xml_parse_result xml_document::load_file(const char* path, unsigned int options, xml_encoding encoding)
{
- create();
+ reset();
FILE* file = fopen(path, "rb");
if (!file) return make_parse_result(status_file_not_found);
@@ -4420,7 +4399,7 @@ namespace pugi
xml_parse_result xml_document::load_buffer_impl(void* contents, size_t size, unsigned int options, xml_encoding encoding, bool is_mutable, bool own)
{
- create();
+ reset();
// get actual encoding
xml_encoding buffer_encoding = get_buffer_encoding(encoding, contents, size);
@@ -4535,9 +4514,8 @@ namespace pugi
utf_decoder<utf8_writer>::decode_utf16_block(reinterpret_cast<const uint16_t*>(str), length, begin) :
utf_decoder<utf8_writer>::decode_utf32_block(reinterpret_cast<const uint32_t*>(str), length, begin);
- // truncate invalid output
- assert(begin <= end && static_cast<size_t>(end - begin) <= result.size());
- result.resize(static_cast<size_t>(end - begin));
+ assert(begin + result.size() == end);
+ (void)!end;
}
return result;
@@ -4568,9 +4546,8 @@ namespace pugi
wchar_writer::value_type begin = reinterpret_cast<wchar_writer::value_type>(&result[0]);
wchar_writer::value_type end = utf_decoder<wchar_writer>::decode_utf8_block(data, size, begin);
- // truncate invalid output
- assert(begin <= end && static_cast<size_t>(end - begin) <= result.size());
- result.resize(static_cast<size_t>(end - begin));
+ assert(begin + result.size() == end);
+ (void)!end;
}
return result;
diff --git a/src/pugixml.hpp b/src/pugixml.hpp
index d79d128..28e9a34 100644
--- a/src/pugixml.hpp
+++ b/src/pugixml.hpp
@@ -1842,6 +1842,7 @@ namespace pugi
xml_document(const xml_document&);
const xml_document& operator=(const xml_document&);
+ void reset();
void create();
void destroy();