mirror of
				https://github.com/Clortox/dashboard.git
				synced 2025-07-17 14:02:10 +00:00 
			
		
		
		
	Add rapidxml dependency to source tree
This commit is contained in:
		
							parent
							
								
									ddb2f11bc3
								
							
						
					
					
						commit
						91bd452184
					
				
							
								
								
									
										2596
									
								
								src/util/rapidxml/rapidxml.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2596
									
								
								src/util/rapidxml/rapidxml.hpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										174
									
								
								src/util/rapidxml/rapidxml_iterators.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								src/util/rapidxml/rapidxml_iterators.hpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,174 @@ | ||||
| #ifndef RAPIDXML_ITERATORS_HPP_INCLUDED | ||||
| #define RAPIDXML_ITERATORS_HPP_INCLUDED | ||||
| 
 | ||||
| // Copyright (C) 2006, 2009 Marcin Kalicinski
 | ||||
| // Version 1.13
 | ||||
| // Revision $DateTime: 2009/05/13 01:46:17 $
 | ||||
| //! \file rapidxml_iterators.hpp This file contains rapidxml iterators
 | ||||
| 
 | ||||
| #include "rapidxml.hpp" | ||||
| 
 | ||||
| namespace rapidxml | ||||
| { | ||||
| 
 | ||||
|     //! Iterator of child nodes of xml_node
 | ||||
|     template<class Ch> | ||||
|     class node_iterator | ||||
|     { | ||||
|      | ||||
|     public: | ||||
| 
 | ||||
|         typedef typename xml_node<Ch> value_type; | ||||
|         typedef typename xml_node<Ch> &reference; | ||||
|         typedef typename xml_node<Ch> *pointer; | ||||
|         typedef std::ptrdiff_t difference_type; | ||||
|         typedef std::bidirectional_iterator_tag iterator_category; | ||||
|          | ||||
|         node_iterator() | ||||
|             : m_node(0) | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         node_iterator(xml_node<Ch> *node) | ||||
|             : m_node(node->first_node()) | ||||
|         { | ||||
|         } | ||||
|          | ||||
|         reference operator *() const | ||||
|         { | ||||
|             assert(m_node); | ||||
|             return *m_node; | ||||
|         } | ||||
| 
 | ||||
|         pointer operator->() const | ||||
|         { | ||||
|             assert(m_node); | ||||
|             return m_node; | ||||
|         } | ||||
| 
 | ||||
|         node_iterator& operator++() | ||||
|         { | ||||
|             assert(m_node); | ||||
|             m_node = m_node->next_sibling(); | ||||
|             return *this; | ||||
|         } | ||||
| 
 | ||||
|         node_iterator operator++(int) | ||||
|         { | ||||
|             node_iterator tmp = *this; | ||||
|             ++this; | ||||
|             return tmp; | ||||
|         } | ||||
| 
 | ||||
|         node_iterator& operator--() | ||||
|         { | ||||
|             assert(m_node && m_node->previous_sibling()); | ||||
|             m_node = m_node->previous_sibling(); | ||||
|             return *this; | ||||
|         } | ||||
| 
 | ||||
|         node_iterator operator--(int) | ||||
|         { | ||||
|             node_iterator tmp = *this; | ||||
|             ++this; | ||||
|             return tmp; | ||||
|         } | ||||
| 
 | ||||
|         bool operator ==(const node_iterator<Ch> &rhs) | ||||
|         { | ||||
|             return m_node == rhs.m_node; | ||||
|         } | ||||
| 
 | ||||
|         bool operator !=(const node_iterator<Ch> &rhs) | ||||
|         { | ||||
|             return m_node != rhs.m_node; | ||||
|         } | ||||
| 
 | ||||
|     private: | ||||
| 
 | ||||
|         xml_node<Ch> *m_node; | ||||
| 
 | ||||
|     }; | ||||
| 
 | ||||
|     //! Iterator of child attributes of xml_node
 | ||||
|     template<class Ch> | ||||
|     class attribute_iterator | ||||
|     { | ||||
|      | ||||
|     public: | ||||
| 
 | ||||
|         typedef typename xml_attribute<Ch> value_type; | ||||
|         typedef typename xml_attribute<Ch> &reference; | ||||
|         typedef typename xml_attribute<Ch> *pointer; | ||||
|         typedef std::ptrdiff_t difference_type; | ||||
|         typedef std::bidirectional_iterator_tag iterator_category; | ||||
|          | ||||
|         attribute_iterator() | ||||
|             : m_attribute(0) | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         attribute_iterator(xml_node<Ch> *node) | ||||
|             : m_attribute(node->first_attribute()) | ||||
|         { | ||||
|         } | ||||
|          | ||||
|         reference operator *() const | ||||
|         { | ||||
|             assert(m_attribute); | ||||
|             return *m_attribute; | ||||
|         } | ||||
| 
 | ||||
|         pointer operator->() const | ||||
|         { | ||||
|             assert(m_attribute); | ||||
|             return m_attribute; | ||||
|         } | ||||
| 
 | ||||
|         attribute_iterator& operator++() | ||||
|         { | ||||
|             assert(m_attribute); | ||||
|             m_attribute = m_attribute->next_attribute(); | ||||
|             return *this; | ||||
|         } | ||||
| 
 | ||||
|         attribute_iterator operator++(int) | ||||
|         { | ||||
|             attribute_iterator tmp = *this; | ||||
|             ++this; | ||||
|             return tmp; | ||||
|         } | ||||
| 
 | ||||
|         attribute_iterator& operator--() | ||||
|         { | ||||
|             assert(m_attribute && m_attribute->previous_attribute()); | ||||
|             m_attribute = m_attribute->previous_attribute(); | ||||
|             return *this; | ||||
|         } | ||||
| 
 | ||||
|         attribute_iterator operator--(int) | ||||
|         { | ||||
|             attribute_iterator tmp = *this; | ||||
|             ++this; | ||||
|             return tmp; | ||||
|         } | ||||
| 
 | ||||
|         bool operator ==(const attribute_iterator<Ch> &rhs) | ||||
|         { | ||||
|             return m_attribute == rhs.m_attribute; | ||||
|         } | ||||
| 
 | ||||
|         bool operator !=(const attribute_iterator<Ch> &rhs) | ||||
|         { | ||||
|             return m_attribute != rhs.m_attribute; | ||||
|         } | ||||
| 
 | ||||
|     private: | ||||
| 
 | ||||
|         xml_attribute<Ch> *m_attribute; | ||||
| 
 | ||||
|     }; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										421
									
								
								src/util/rapidxml/rapidxml_print.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										421
									
								
								src/util/rapidxml/rapidxml_print.hpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,421 @@ | ||||
| #ifndef RAPIDXML_PRINT_HPP_INCLUDED | ||||
| #define RAPIDXML_PRINT_HPP_INCLUDED | ||||
| 
 | ||||
| // Copyright (C) 2006, 2009 Marcin Kalicinski
 | ||||
| // Version 1.13
 | ||||
| // Revision $DateTime: 2009/05/13 01:46:17 $
 | ||||
| //! \file rapidxml_print.hpp This file contains rapidxml printer implementation
 | ||||
| 
 | ||||
| #include "rapidxml.hpp" | ||||
| 
 | ||||
| // Only include streams if not disabled
 | ||||
| #ifndef RAPIDXML_NO_STREAMS | ||||
|     #include <ostream> | ||||
|     #include <iterator> | ||||
| #endif | ||||
| 
 | ||||
| namespace rapidxml | ||||
| { | ||||
| 
 | ||||
|     ///////////////////////////////////////////////////////////////////////
 | ||||
|     // Printing flags
 | ||||
| 
 | ||||
|     const int print_no_indenting = 0x1;   //!< Printer flag instructing the printer to suppress indenting of XML. See print() function.
 | ||||
| 
 | ||||
|     ///////////////////////////////////////////////////////////////////////
 | ||||
|     // Internal
 | ||||
| 
 | ||||
|     //! \cond internal
 | ||||
|     namespace internal | ||||
|     { | ||||
|          | ||||
|         ///////////////////////////////////////////////////////////////////////////
 | ||||
|         // Internal character operations
 | ||||
|      | ||||
|         // Copy characters from given range to given output iterator
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt copy_chars(const Ch *begin, const Ch *end, OutIt out) | ||||
|         { | ||||
|             while (begin != end) | ||||
|                 *out++ = *begin++; | ||||
|             return out; | ||||
|         } | ||||
|          | ||||
|         // Copy characters from given range to given output iterator and expand
 | ||||
|         // characters into references (< > ' " &)
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt copy_and_expand_chars(const Ch *begin, const Ch *end, Ch noexpand, OutIt out) | ||||
|         { | ||||
|             while (begin != end) | ||||
|             { | ||||
|                 if (*begin == noexpand) | ||||
|                 { | ||||
|                     *out++ = *begin;    // No expansion, copy character
 | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     switch (*begin) | ||||
|                     { | ||||
|                     case Ch('<'): | ||||
|                         *out++ = Ch('&'); *out++ = Ch('l'); *out++ = Ch('t'); *out++ = Ch(';'); | ||||
|                         break; | ||||
|                     case Ch('>'):  | ||||
|                         *out++ = Ch('&'); *out++ = Ch('g'); *out++ = Ch('t'); *out++ = Ch(';'); | ||||
|                         break; | ||||
|                     case Ch('\''):  | ||||
|                         *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('p'); *out++ = Ch('o'); *out++ = Ch('s'); *out++ = Ch(';'); | ||||
|                         break; | ||||
|                     case Ch('"'):  | ||||
|                         *out++ = Ch('&'); *out++ = Ch('q'); *out++ = Ch('u'); *out++ = Ch('o'); *out++ = Ch('t'); *out++ = Ch(';'); | ||||
|                         break; | ||||
|                     case Ch('&'):  | ||||
|                         *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('m'); *out++ = Ch('p'); *out++ = Ch(';');  | ||||
|                         break; | ||||
|                     default: | ||||
|                         *out++ = *begin;    // No expansion, copy character
 | ||||
|                     } | ||||
|                 } | ||||
|                 ++begin;    // Step to next character
 | ||||
|             } | ||||
|             return out; | ||||
|         } | ||||
| 
 | ||||
|         // Fill given output iterator with repetitions of the same character
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt fill_chars(OutIt out, int n, Ch ch) | ||||
|         { | ||||
|             for (int i = 0; i < n; ++i) | ||||
|                 *out++ = ch; | ||||
|             return out; | ||||
|         } | ||||
| 
 | ||||
|         // Find character
 | ||||
|         template<class Ch, Ch ch> | ||||
|         inline bool find_char(const Ch *begin, const Ch *end) | ||||
|         { | ||||
|             while (begin != end) | ||||
|                 if (*begin++ == ch) | ||||
|                     return true; | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         ///////////////////////////////////////////////////////////////////////////
 | ||||
|         // Internal printing operations
 | ||||
|      | ||||
|         // Print node
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) | ||||
|         { | ||||
|             // Print proper node type
 | ||||
|             switch (node->type()) | ||||
|             { | ||||
| 
 | ||||
|             // Document
 | ||||
|             case node_document: | ||||
|                 out = print_children(out, node, flags, indent); | ||||
|                 break; | ||||
| 
 | ||||
|             // Element
 | ||||
|             case node_element: | ||||
|                 out = print_element_node(out, node, flags, indent); | ||||
|                 break; | ||||
|              | ||||
|             // Data
 | ||||
|             case node_data: | ||||
|                 out = print_data_node(out, node, flags, indent); | ||||
|                 break; | ||||
|              | ||||
|             // CDATA
 | ||||
|             case node_cdata: | ||||
|                 out = print_cdata_node(out, node, flags, indent); | ||||
|                 break; | ||||
| 
 | ||||
|             // Declaration
 | ||||
|             case node_declaration: | ||||
|                 out = print_declaration_node(out, node, flags, indent); | ||||
|                 break; | ||||
| 
 | ||||
|             // Comment
 | ||||
|             case node_comment: | ||||
|                 out = print_comment_node(out, node, flags, indent); | ||||
|                 break; | ||||
|              | ||||
|             // Doctype
 | ||||
|             case node_doctype: | ||||
|                 out = print_doctype_node(out, node, flags, indent); | ||||
|                 break; | ||||
| 
 | ||||
|             // Pi
 | ||||
|             case node_pi: | ||||
|                 out = print_pi_node(out, node, flags, indent); | ||||
|                 break; | ||||
| 
 | ||||
|                 // Unknown
 | ||||
|             default: | ||||
|                 assert(0); | ||||
|                 break; | ||||
|             } | ||||
|              | ||||
|             // If indenting not disabled, add line break after node
 | ||||
|             if (!(flags & print_no_indenting)) | ||||
|                 *out = Ch('\n'), ++out; | ||||
| 
 | ||||
|             // Return modified iterator
 | ||||
|             return out; | ||||
|         } | ||||
|          | ||||
|         // Print children of the node                               
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt print_children(OutIt out, const xml_node<Ch> *node, int flags, int indent) | ||||
|         { | ||||
|             for (xml_node<Ch> *child = node->first_node(); child; child = child->next_sibling()) | ||||
|                 out = print_node(out, child, flags, indent); | ||||
|             return out; | ||||
|         } | ||||
| 
 | ||||
|         // Print attributes of the node
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt print_attributes(OutIt out, const xml_node<Ch> *node, int flags) | ||||
|         { | ||||
|             for (xml_attribute<Ch> *attribute = node->first_attribute(); attribute; attribute = attribute->next_attribute()) | ||||
|             { | ||||
|                 if (attribute->name() && attribute->value()) | ||||
|                 { | ||||
|                     // Print attribute name
 | ||||
|                     *out = Ch(' '), ++out; | ||||
|                     out = copy_chars(attribute->name(), attribute->name() + attribute->name_size(), out); | ||||
|                     *out = Ch('='), ++out; | ||||
|                     // Print attribute value using appropriate quote type
 | ||||
|                     if (find_char<Ch, Ch('"')>(attribute->value(), attribute->value() + attribute->value_size())) | ||||
|                     { | ||||
|                         *out = Ch('\''), ++out; | ||||
|                         out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('"'), out); | ||||
|                         *out = Ch('\''), ++out; | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         *out = Ch('"'), ++out; | ||||
|                         out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('\''), out); | ||||
|                         *out = Ch('"'), ++out; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             return out; | ||||
|         } | ||||
| 
 | ||||
|         // Print data node
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt print_data_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) | ||||
|         { | ||||
|             assert(node->type() == node_data); | ||||
|             if (!(flags & print_no_indenting)) | ||||
|                 out = fill_chars(out, indent, Ch('\t')); | ||||
|             out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); | ||||
|             return out; | ||||
|         } | ||||
| 
 | ||||
|         // Print data node
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt print_cdata_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) | ||||
|         { | ||||
|             assert(node->type() == node_cdata); | ||||
|             if (!(flags & print_no_indenting)) | ||||
|                 out = fill_chars(out, indent, Ch('\t')); | ||||
|             *out = Ch('<'); ++out; | ||||
|             *out = Ch('!'); ++out; | ||||
|             *out = Ch('['); ++out; | ||||
|             *out = Ch('C'); ++out; | ||||
|             *out = Ch('D'); ++out; | ||||
|             *out = Ch('A'); ++out; | ||||
|             *out = Ch('T'); ++out; | ||||
|             *out = Ch('A'); ++out; | ||||
|             *out = Ch('['); ++out; | ||||
|             out = copy_chars(node->value(), node->value() + node->value_size(), out); | ||||
|             *out = Ch(']'); ++out; | ||||
|             *out = Ch(']'); ++out; | ||||
|             *out = Ch('>'); ++out; | ||||
|             return out; | ||||
|         } | ||||
| 
 | ||||
|         // Print element node
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt print_element_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) | ||||
|         { | ||||
|             assert(node->type() == node_element); | ||||
| 
 | ||||
|             // Print element name and attributes, if any
 | ||||
|             if (!(flags & print_no_indenting)) | ||||
|                 out = fill_chars(out, indent, Ch('\t')); | ||||
|             *out = Ch('<'), ++out; | ||||
|             out = copy_chars(node->name(), node->name() + node->name_size(), out); | ||||
|             out = print_attributes(out, node, flags); | ||||
|              | ||||
|             // If node is childless
 | ||||
|             if (node->value_size() == 0 && !node->first_node()) | ||||
|             { | ||||
|                 // Print childless node tag ending
 | ||||
|                 *out = Ch('/'), ++out; | ||||
|                 *out = Ch('>'), ++out; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 // Print normal node tag ending
 | ||||
|                 *out = Ch('>'), ++out; | ||||
| 
 | ||||
|                 // Test if node contains a single data node only (and no other nodes)
 | ||||
|                 xml_node<Ch> *child = node->first_node(); | ||||
|                 if (!child) | ||||
|                 { | ||||
|                     // If node has no children, only print its value without indenting
 | ||||
|                     out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); | ||||
|                 } | ||||
|                 else if (child->next_sibling() == 0 && child->type() == node_data) | ||||
|                 { | ||||
|                     // If node has a sole data child, only print its value without indenting
 | ||||
|                     out = copy_and_expand_chars(child->value(), child->value() + child->value_size(), Ch(0), out); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     // Print all children with full indenting
 | ||||
|                     if (!(flags & print_no_indenting)) | ||||
|                         *out = Ch('\n'), ++out; | ||||
|                     out = print_children(out, node, flags, indent + 1); | ||||
|                     if (!(flags & print_no_indenting)) | ||||
|                         out = fill_chars(out, indent, Ch('\t')); | ||||
|                 } | ||||
| 
 | ||||
|                 // Print node end
 | ||||
|                 *out = Ch('<'), ++out; | ||||
|                 *out = Ch('/'), ++out; | ||||
|                 out = copy_chars(node->name(), node->name() + node->name_size(), out); | ||||
|                 *out = Ch('>'), ++out; | ||||
|             } | ||||
|             return out; | ||||
|         } | ||||
| 
 | ||||
|         // Print declaration node
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt print_declaration_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) | ||||
|         { | ||||
|             // Print declaration start
 | ||||
|             if (!(flags & print_no_indenting)) | ||||
|                 out = fill_chars(out, indent, Ch('\t')); | ||||
|             *out = Ch('<'), ++out; | ||||
|             *out = Ch('?'), ++out; | ||||
|             *out = Ch('x'), ++out; | ||||
|             *out = Ch('m'), ++out; | ||||
|             *out = Ch('l'), ++out; | ||||
| 
 | ||||
|             // Print attributes
 | ||||
|             out = print_attributes(out, node, flags); | ||||
|              | ||||
|             // Print declaration end
 | ||||
|             *out = Ch('?'), ++out; | ||||
|             *out = Ch('>'), ++out; | ||||
|              | ||||
|             return out; | ||||
|         } | ||||
| 
 | ||||
|         // Print comment node
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt print_comment_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) | ||||
|         { | ||||
|             assert(node->type() == node_comment); | ||||
|             if (!(flags & print_no_indenting)) | ||||
|                 out = fill_chars(out, indent, Ch('\t')); | ||||
|             *out = Ch('<'), ++out; | ||||
|             *out = Ch('!'), ++out; | ||||
|             *out = Ch('-'), ++out; | ||||
|             *out = Ch('-'), ++out; | ||||
|             out = copy_chars(node->value(), node->value() + node->value_size(), out); | ||||
|             *out = Ch('-'), ++out; | ||||
|             *out = Ch('-'), ++out; | ||||
|             *out = Ch('>'), ++out; | ||||
|             return out; | ||||
|         } | ||||
| 
 | ||||
|         // Print doctype node
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt print_doctype_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) | ||||
|         { | ||||
|             assert(node->type() == node_doctype); | ||||
|             if (!(flags & print_no_indenting)) | ||||
|                 out = fill_chars(out, indent, Ch('\t')); | ||||
|             *out = Ch('<'), ++out; | ||||
|             *out = Ch('!'), ++out; | ||||
|             *out = Ch('D'), ++out; | ||||
|             *out = Ch('O'), ++out; | ||||
|             *out = Ch('C'), ++out; | ||||
|             *out = Ch('T'), ++out; | ||||
|             *out = Ch('Y'), ++out; | ||||
|             *out = Ch('P'), ++out; | ||||
|             *out = Ch('E'), ++out; | ||||
|             *out = Ch(' '), ++out; | ||||
|             out = copy_chars(node->value(), node->value() + node->value_size(), out); | ||||
|             *out = Ch('>'), ++out; | ||||
|             return out; | ||||
|         } | ||||
| 
 | ||||
|         // Print pi node
 | ||||
|         template<class OutIt, class Ch> | ||||
|         inline OutIt print_pi_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) | ||||
|         { | ||||
|             assert(node->type() == node_pi); | ||||
|             if (!(flags & print_no_indenting)) | ||||
|                 out = fill_chars(out, indent, Ch('\t')); | ||||
|             *out = Ch('<'), ++out; | ||||
|             *out = Ch('?'), ++out; | ||||
|             out = copy_chars(node->name(), node->name() + node->name_size(), out); | ||||
|             *out = Ch(' '), ++out; | ||||
|             out = copy_chars(node->value(), node->value() + node->value_size(), out); | ||||
|             *out = Ch('?'), ++out; | ||||
|             *out = Ch('>'), ++out; | ||||
|             return out; | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
|     //! \endcond
 | ||||
| 
 | ||||
|     ///////////////////////////////////////////////////////////////////////////
 | ||||
|     // Printing
 | ||||
| 
 | ||||
|     //! Prints XML to given output iterator.
 | ||||
|     //! \param out Output iterator to print to.
 | ||||
|     //! \param node Node to be printed. Pass xml_document to print entire document.
 | ||||
|     //! \param flags Flags controlling how XML is printed.
 | ||||
|     //! \return Output iterator pointing to position immediately after last character of printed text.
 | ||||
|     template<class OutIt, class Ch>  | ||||
|     inline OutIt print(OutIt out, const xml_node<Ch> &node, int flags = 0) | ||||
|     { | ||||
|         return internal::print_node(out, &node, flags, 0); | ||||
|     } | ||||
| 
 | ||||
| #ifndef RAPIDXML_NO_STREAMS | ||||
| 
 | ||||
|     //! Prints XML to given output stream.
 | ||||
|     //! \param out Output stream to print to.
 | ||||
|     //! \param node Node to be printed. Pass xml_document to print entire document.
 | ||||
|     //! \param flags Flags controlling how XML is printed.
 | ||||
|     //! \return Output stream.
 | ||||
|     template<class Ch>  | ||||
|     inline std::basic_ostream<Ch> &print(std::basic_ostream<Ch> &out, const xml_node<Ch> &node, int flags = 0) | ||||
|     { | ||||
|         print(std::ostream_iterator<Ch>(out), node, flags); | ||||
|         return out; | ||||
|     } | ||||
| 
 | ||||
|     //! Prints formatted XML to given output stream. Uses default printing flags. Use print() function to customize printing process.
 | ||||
|     //! \param out Output stream to print to.
 | ||||
|     //! \param node Node to be printed.
 | ||||
|     //! \return Output stream.
 | ||||
|     template<class Ch>  | ||||
|     inline std::basic_ostream<Ch> &operator <<(std::basic_ostream<Ch> &out, const xml_node<Ch> &node) | ||||
|     { | ||||
|         return print(out, node); | ||||
|     } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										122
									
								
								src/util/rapidxml/rapidxml_utils.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								src/util/rapidxml/rapidxml_utils.hpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | ||||
| #ifndef RAPIDXML_UTILS_HPP_INCLUDED | ||||
| #define RAPIDXML_UTILS_HPP_INCLUDED | ||||
| 
 | ||||
| // Copyright (C) 2006, 2009 Marcin Kalicinski
 | ||||
| // Version 1.13
 | ||||
| // Revision $DateTime: 2009/05/13 01:46:17 $
 | ||||
| //! \file rapidxml_utils.hpp This file contains high-level rapidxml utilities that can be useful
 | ||||
| //! in certain simple scenarios. They should probably not be used if maximizing performance is the main objective.
 | ||||
| 
 | ||||
| #include "rapidxml.hpp" | ||||
| #include <vector> | ||||
| #include <string> | ||||
| #include <fstream> | ||||
| #include <stdexcept> | ||||
| 
 | ||||
| namespace rapidxml | ||||
| { | ||||
| 
 | ||||
|     //! Represents data loaded from a file
 | ||||
|     template<class Ch = char> | ||||
|     class file | ||||
|     { | ||||
|          | ||||
|     public: | ||||
|          | ||||
|         //! Loads file into the memory. Data will be automatically destroyed by the destructor.
 | ||||
|         //! \param filename Filename to load.
 | ||||
|         file(const char *filename) | ||||
|         { | ||||
|             using namespace std; | ||||
| 
 | ||||
|             // Open stream
 | ||||
|             basic_ifstream<Ch> stream(filename, ios::binary); | ||||
|             if (!stream) | ||||
|                 throw runtime_error(string("cannot open file ") + filename); | ||||
|             stream.unsetf(ios::skipws); | ||||
|              | ||||
|             // Determine stream size
 | ||||
|             stream.seekg(0, ios::end); | ||||
|             size_t size = stream.tellg(); | ||||
|             stream.seekg(0);    | ||||
|              | ||||
|             // Load data and add terminating 0
 | ||||
|             m_data.resize(size + 1); | ||||
|             stream.read(&m_data.front(), static_cast<streamsize>(size)); | ||||
|             m_data[size] = 0; | ||||
|         } | ||||
| 
 | ||||
|         //! Loads file into the memory. Data will be automatically destroyed by the destructor
 | ||||
|         //! \param stream Stream to load from
 | ||||
|         file(std::basic_istream<Ch> &stream) | ||||
|         { | ||||
|             using namespace std; | ||||
| 
 | ||||
|             // Load data and add terminating 0
 | ||||
|             stream.unsetf(ios::skipws); | ||||
|             m_data.assign(istreambuf_iterator<Ch>(stream), istreambuf_iterator<Ch>()); | ||||
|             if (stream.fail() || stream.bad()) | ||||
|                 throw runtime_error("error reading stream"); | ||||
|             m_data.push_back(0); | ||||
|         } | ||||
|          | ||||
|         //! Gets file data.
 | ||||
|         //! \return Pointer to data of file.
 | ||||
|         Ch *data() | ||||
|         { | ||||
|             return &m_data.front(); | ||||
|         } | ||||
| 
 | ||||
|         //! Gets file data.
 | ||||
|         //! \return Pointer to data of file.
 | ||||
|         const Ch *data() const | ||||
|         { | ||||
|             return &m_data.front(); | ||||
|         } | ||||
| 
 | ||||
|         //! Gets file data size.
 | ||||
|         //! \return Size of file data, in characters.
 | ||||
|         std::size_t size() const | ||||
|         { | ||||
|             return m_data.size(); | ||||
|         } | ||||
| 
 | ||||
|     private: | ||||
| 
 | ||||
|         std::vector<Ch> m_data;   // File data
 | ||||
| 
 | ||||
|     }; | ||||
| 
 | ||||
|     //! Counts children of node. Time complexity is O(n).
 | ||||
|     //! \return Number of children of node
 | ||||
|     template<class Ch> | ||||
|     inline std::size_t count_children(xml_node<Ch> *node) | ||||
|     { | ||||
|         xml_node<Ch> *child = node->first_node(); | ||||
|         std::size_t count = 0; | ||||
|         while (child) | ||||
|         { | ||||
|             ++count; | ||||
|             child = child->next_sibling(); | ||||
|         } | ||||
|         return count; | ||||
|     } | ||||
| 
 | ||||
|     //! Counts attributes of node. Time complexity is O(n).
 | ||||
|     //! \return Number of attributes of node
 | ||||
|     template<class Ch> | ||||
|     inline std::size_t count_attributes(xml_node<Ch> *node) | ||||
|     { | ||||
|         xml_attribute<Ch> *attr = node->first_attribute(); | ||||
|         std::size_t count = 0; | ||||
|         while (attr) | ||||
|         { | ||||
|             ++count; | ||||
|             attr = attr->next_attribute(); | ||||
|         } | ||||
|         return count; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| @ -17,8 +17,8 @@ | ||||
| #include <iostream> | ||||
| #include <stdexcept> | ||||
| 
 | ||||
| #include <rapidxml/rapidxml.hpp> | ||||
| #include <rapidxml/rapidxml_print.hpp> | ||||
| #include "rapidxml/rapidxml.hpp" | ||||
| #include "rapidxml/rapidxml_print.hpp" | ||||
| #include <curl/curl.h> | ||||
| 
 | ||||
| namespace rss_utils { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tyler Perkins
						Tyler Perkins