From e73b54e60d5b8bc4234d6c4cf4fa978e175d68cb Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Wed, 30 Jun 2010 12:47:19 +0000 Subject: docs: Fixed sample comment, adding load error handling sample, added custom writer sample git-svn-id: http://pugixml.googlecode.com/svn/trunk@552 99668b35-9821-0410-8761-19e4c4f06640 --- docs/samples/load_error_handling.cpp | 29 +++++++++ docs/samples/load_memory.cpp | 2 +- docs/samples/save_custom_writer.cpp | 112 +++++++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 docs/samples/load_error_handling.cpp create mode 100644 docs/samples/save_custom_writer.cpp diff --git a/docs/samples/load_error_handling.cpp b/docs/samples/load_error_handling.cpp new file mode 100644 index 0000000..9b274ba --- /dev/null +++ b/docs/samples/load_error_handling.cpp @@ -0,0 +1,29 @@ +#include "pugixml.hpp" + +#include + +void check_xml(const char* source) +{ +//[code_load_error_handling + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load(source); + + if (result) + std::cout << "XML [" << source << "] parsed without errors, attr value: [" << doc.child("node").attribute("attr").value() << "]\n\n"; + else + { + std::cout << "XML [" << source << "] parsed with errors, attr value: [" << doc.child("node").attribute("attr").value() << "]\n"; + std::cout << "Error description: " << result.description() << "\n"; + std::cout << "Error offset: " << result.offset << " (error at [..." << (source + result.offset) << "]\n\n"; + } +//] +} + +int main() +{ + check_xml("text"); + check_xml("text"); + check_xml("text"); + check_xml("<#tag />"); +} diff --git a/docs/samples/load_memory.cpp b/docs/samples/load_memory.cpp index b8d898f..5f975b2 100644 --- a/docs/samples/load_memory.cpp +++ b/docs/samples/load_memory.cpp @@ -22,7 +22,7 @@ int main() { //[code_load_memory_buffer_inplace - // You can use load_buffer_inplace to load document from mutable memory block; memory blocks lifetime must exceed that of document + // You can use load_buffer_inplace to load document from mutable memory block; the block's lifetime must exceed that of document char* buffer = new char[size]; memcpy(buffer, source, size); diff --git a/docs/samples/save_custom_writer.cpp b/docs/samples/save_custom_writer.cpp new file mode 100644 index 0000000..978c583 --- /dev/null +++ b/docs/samples/save_custom_writer.cpp @@ -0,0 +1,112 @@ +#include "pugixml.hpp" + +#include + +#include + +struct xml_string_writer: pugi::xml_writer +{ + std::string result; + + virtual void write(const void* data, size_t size) + { + result += std::string(static_cast(data), size); + } +}; + +struct xml_memory_writer: pugi::xml_writer +{ + char* buffer; + size_t capacity; + + size_t result; + + xml_memory_writer(): buffer(0), capacity(0), result(0) + { + } + + xml_memory_writer(char* buffer, size_t capacity): buffer(buffer), capacity(capacity), result(0) + { + } + + size_t written_size() const + { + return result < capacity ? result : capacity; + } + + virtual void write(const void* data, size_t size) + { + if (result < capacity) + { + size_t chunk = (capacity - result < size) ? capacity - result : size; + + memcpy(buffer + result, data, chunk); + } + + result += size; + } +}; + +std::string node_to_string(pugi::xml_node node) +{ + xml_string_writer writer; + node.print(writer); + + return writer.result; +} + +char* node_to_buffer(pugi::xml_node node, char* buffer, size_t size) +{ + if (size == 0) return buffer; + + // leave one character for null terminator + xml_memory_writer writer(buffer, size - 1); + node.print(writer); + + // null terminate + buffer[writer.written_size()] = 0; + + return buffer; +} + +char* node_to_buffer_heap(pugi::xml_node node) +{ + // first pass: get required memory size + xml_memory_writer counter; + node.print(counter); + + // allocate necessary size (+1 for null termination) + char* buffer = new char[counter.result + 1]; + + // second pass: actual printing + xml_memory_writer writer(buffer, counter.result); + node.print(writer); + + // null terminate + buffer[writer.written_size()] = 0; + + return buffer; +} + +int main() +{ + // get a test document + pugi::xml_document doc; + doc.load("hey"); + + // get contents as std::string (single pass) + printf("contents: [%s]\n", node_to_string(doc).c_str()); + + // get contents into fixed-size buffer (single pass) + char large_buf[128]; + printf("contents: [%s]\n", node_to_buffer(doc, large_buf, sizeof(large_buf))); + + // get contents into fixed-size buffer (single pass, shows truncating behavior) + char small_buf[22]; + printf("contents: [%s]\n", node_to_buffer(doc, small_buf, sizeof(small_buf))); + + // get contents into heap-allocated buffer (two passes) + char* heap_buf = node_to_buffer_heap(doc); + printf("contents: [%s]\n", heap_buf); + delete[] heap_buf; +} -- cgit v1.2.3