Mercurial > minori
comparison dep/pugixml/src/pugixml.hpp @ 55:d10b6c6b432e
add xml lib, we will need to use it eventually
| author | Paper <mrpapersonic@gmail.com> | 
|---|---|
| date | Tue, 26 Sep 2023 12:37:08 -0400 | 
| parents | |
| children | a45edd073f9e | 
   comparison
  equal
  deleted
  inserted
  replaced
| 54:466ac9870df9 | 55:d10b6c6b432e | 
|---|---|
| 1 /** | |
| 2 * pugixml parser - version 1.13 | |
| 3 * -------------------------------------------------------- | |
| 4 * Copyright (C) 2006-2022, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) | |
| 5 * Report bugs and download new versions at https://pugixml.org/ | |
| 6 * | |
| 7 * This library is distributed under the MIT License. See notice at the end | |
| 8 * of this file. | |
| 9 * | |
| 10 * This work is based on the pugxml parser, which is: | |
| 11 * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) | |
| 12 */ | |
| 13 | |
| 14 // Define version macro; evaluates to major * 1000 + minor * 10 + patch so that it's safe to use in less-than comparisons | |
| 15 // Note: pugixml used major * 100 + minor * 10 + patch format up until 1.9 (which had version identifier 190); starting from pugixml 1.10, the minor version number is two digits | |
| 16 #ifndef PUGIXML_VERSION | |
| 17 # define PUGIXML_VERSION 1130 // 1.13 | |
| 18 #endif | |
| 19 | |
| 20 // Include user configuration file (this can define various configuration macros) | |
| 21 #include "pugiconfig.hpp" | |
| 22 | |
| 23 #ifndef HEADER_PUGIXML_HPP | |
| 24 #define HEADER_PUGIXML_HPP | |
| 25 | |
| 26 // Include stddef.h for size_t and ptrdiff_t | |
| 27 #include <stddef.h> | |
| 28 | |
| 29 // Include exception header for XPath | |
| 30 #if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS) | |
| 31 # include <exception> | |
| 32 #endif | |
| 33 | |
| 34 // Include STL headers | |
| 35 #ifndef PUGIXML_NO_STL | |
| 36 # include <iterator> | |
| 37 # include <iosfwd> | |
| 38 # include <string> | |
| 39 #endif | |
| 40 | |
| 41 // Macro for deprecated features | |
| 42 #ifndef PUGIXML_DEPRECATED | |
| 43 # if defined(__GNUC__) | |
| 44 # define PUGIXML_DEPRECATED __attribute__((deprecated)) | |
| 45 # elif defined(_MSC_VER) && _MSC_VER >= 1300 | |
| 46 # define PUGIXML_DEPRECATED __declspec(deprecated) | |
| 47 # else | |
| 48 # define PUGIXML_DEPRECATED | |
| 49 # endif | |
| 50 #endif | |
| 51 | |
| 52 // If no API is defined, assume default | |
| 53 #ifndef PUGIXML_API | |
| 54 # define PUGIXML_API | |
| 55 #endif | |
| 56 | |
| 57 // If no API for classes is defined, assume default | |
| 58 #ifndef PUGIXML_CLASS | |
| 59 # define PUGIXML_CLASS PUGIXML_API | |
| 60 #endif | |
| 61 | |
| 62 // If no API for functions is defined, assume default | |
| 63 #ifndef PUGIXML_FUNCTION | |
| 64 # define PUGIXML_FUNCTION PUGIXML_API | |
| 65 #endif | |
| 66 | |
| 67 // If the platform is known to have long long support, enable long long functions | |
| 68 #ifndef PUGIXML_HAS_LONG_LONG | |
| 69 # if __cplusplus >= 201103 | |
| 70 # define PUGIXML_HAS_LONG_LONG | |
| 71 # elif defined(_MSC_VER) && _MSC_VER >= 1400 | |
| 72 # define PUGIXML_HAS_LONG_LONG | |
| 73 # endif | |
| 74 #endif | |
| 75 | |
| 76 // If the platform is known to have move semantics support, compile move ctor/operator implementation | |
| 77 #ifndef PUGIXML_HAS_MOVE | |
| 78 # if __cplusplus >= 201103 | |
| 79 # define PUGIXML_HAS_MOVE | |
| 80 # elif defined(_MSC_VER) && _MSC_VER >= 1600 | |
| 81 # define PUGIXML_HAS_MOVE | |
| 82 # endif | |
| 83 #endif | |
| 84 | |
| 85 // If C++ is 2011 or higher, add 'noexcept' specifiers | |
| 86 #ifndef PUGIXML_NOEXCEPT | |
| 87 # if __cplusplus >= 201103 | |
| 88 # define PUGIXML_NOEXCEPT noexcept | |
| 89 # elif defined(_MSC_VER) && _MSC_VER >= 1900 | |
| 90 # define PUGIXML_NOEXCEPT noexcept | |
| 91 # else | |
| 92 # define PUGIXML_NOEXCEPT | |
| 93 # endif | |
| 94 #endif | |
| 95 | |
| 96 // Some functions can not be noexcept in compact mode | |
| 97 #ifdef PUGIXML_COMPACT | |
| 98 # define PUGIXML_NOEXCEPT_IF_NOT_COMPACT | |
| 99 #else | |
| 100 # define PUGIXML_NOEXCEPT_IF_NOT_COMPACT PUGIXML_NOEXCEPT | |
| 101 #endif | |
| 102 | |
| 103 // If C++ is 2011 or higher, add 'override' qualifiers | |
| 104 #ifndef PUGIXML_OVERRIDE | |
| 105 # if __cplusplus >= 201103 | |
| 106 # define PUGIXML_OVERRIDE override | |
| 107 # elif defined(_MSC_VER) && _MSC_VER >= 1700 | |
| 108 # define PUGIXML_OVERRIDE override | |
| 109 # else | |
| 110 # define PUGIXML_OVERRIDE | |
| 111 # endif | |
| 112 #endif | |
| 113 | |
| 114 // If C++ is 2011 or higher, use 'nullptr' | |
| 115 #ifndef PUGIXML_NULL | |
| 116 # if __cplusplus >= 201103 | |
| 117 # define PUGIXML_NULL nullptr | |
| 118 # elif defined(_MSC_VER) && _MSC_VER >= 1600 | |
| 119 # define PUGIXML_NULL nullptr | |
| 120 # else | |
| 121 # define PUGIXML_NULL 0 | |
| 122 # endif | |
| 123 #endif | |
| 124 | |
| 125 // Character interface macros | |
| 126 #ifdef PUGIXML_WCHAR_MODE | |
| 127 # define PUGIXML_TEXT(t) L ## t | |
| 128 # define PUGIXML_CHAR wchar_t | |
| 129 #else | |
| 130 # define PUGIXML_TEXT(t) t | |
| 131 # define PUGIXML_CHAR char | |
| 132 #endif | |
| 133 | |
| 134 namespace pugi | |
| 135 { | |
| 136 // Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE | |
| 137 typedef PUGIXML_CHAR char_t; | |
| 138 | |
| 139 #ifndef PUGIXML_NO_STL | |
| 140 // String type used for operations that work with STL string; depends on PUGIXML_WCHAR_MODE | |
| 141 typedef std::basic_string<PUGIXML_CHAR, std::char_traits<PUGIXML_CHAR>, std::allocator<PUGIXML_CHAR> > string_t; | |
| 142 #endif | |
| 143 } | |
| 144 | |
| 145 // The PugiXML namespace | |
| 146 namespace pugi | |
| 147 { | |
| 148 // Tree node types | |
| 149 enum xml_node_type | |
| 150 { | |
| 151 node_null, // Empty (null) node handle | |
| 152 node_document, // A document tree's absolute root | |
| 153 node_element, // Element tag, i.e. '<node/>' | |
| 154 node_pcdata, // Plain character data, i.e. 'text' | |
| 155 node_cdata, // Character data, i.e. '<![CDATA[text]]>' | |
| 156 node_comment, // Comment tag, i.e. '<!-- text -->' | |
| 157 node_pi, // Processing instruction, i.e. '<?name?>' | |
| 158 node_declaration, // Document declaration, i.e. '<?xml version="1.0"?>' | |
| 159 node_doctype // Document type declaration, i.e. '<!DOCTYPE doc>' | |
| 160 }; | |
| 161 | |
| 162 // Parsing options | |
| 163 | |
| 164 // Minimal parsing mode (equivalent to turning all other flags off). | |
| 165 // Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed. | |
| 166 const unsigned int parse_minimal = 0x0000; | |
| 167 | |
| 168 // This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default. | |
| 169 const unsigned int parse_pi = 0x0001; | |
| 170 | |
| 171 // This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default. | |
| 172 const unsigned int parse_comments = 0x0002; | |
| 173 | |
| 174 // This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default. | |
| 175 const unsigned int parse_cdata = 0x0004; | |
| 176 | |
| 177 // This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree. | |
| 178 // This flag is off by default; turning it on usually results in slower parsing and more memory consumption. | |
| 179 const unsigned int parse_ws_pcdata = 0x0008; | |
| 180 | |
| 181 // This flag determines if character and entity references are expanded during parsing. This flag is on by default. | |
| 182 const unsigned int parse_escapes = 0x0010; | |
| 183 | |
| 184 // This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default. | |
| 185 const unsigned int parse_eol = 0x0020; | |
| 186 | |
| 187 // This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default. | |
| 188 const unsigned int parse_wconv_attribute = 0x0040; | |
| 189 | |
| 190 // This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default. | |
| 191 const unsigned int parse_wnorm_attribute = 0x0080; | |
| 192 | |
| 193 // This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default. | |
| 194 const unsigned int parse_declaration = 0x0100; | |
| 195 | |
| 196 // This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default. | |
| 197 const unsigned int parse_doctype = 0x0200; | |
| 198 | |
| 199 // This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only | |
| 200 // of whitespace is added to the DOM tree. | |
| 201 // This flag is off by default; turning it on may result in slower parsing and more memory consumption. | |
| 202 const unsigned int parse_ws_pcdata_single = 0x0400; | |
| 203 | |
| 204 // This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default. | |
| 205 const unsigned int parse_trim_pcdata = 0x0800; | |
| 206 | |
| 207 // This flag determines if plain character data that does not have a parent node is added to the DOM tree, and if an empty document | |
| 208 // is a valid document. This flag is off by default. | |
| 209 const unsigned int parse_fragment = 0x1000; | |
| 210 | |
| 211 // This flag determines if plain character data is be stored in the parent element's value. This significantly changes the structure of | |
| 212 // the document; this flag is only recommended for parsing documents with many PCDATA nodes in memory-constrained environments. | |
| 213 // This flag is off by default. | |
| 214 const unsigned int parse_embed_pcdata = 0x2000; | |
| 215 | |
| 216 // The default parsing mode. | |
| 217 // Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded, | |
| 218 // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. | |
| 219 const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol; | |
| 220 | |
| 221 // The full parsing mode. | |
| 222 // Nodes of all types are added to the DOM tree, character/reference entities are expanded, | |
| 223 // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. | |
| 224 const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype; | |
| 225 | |
| 226 // These flags determine the encoding of input data for XML document | |
| 227 enum xml_encoding | |
| 228 { | |
| 229 encoding_auto, // Auto-detect input encoding using BOM or < / <? detection; use UTF8 if BOM is not found | |
| 230 encoding_utf8, // UTF8 encoding | |
| 231 encoding_utf16_le, // Little-endian UTF16 | |
| 232 encoding_utf16_be, // Big-endian UTF16 | |
| 233 encoding_utf16, // UTF16 with native endianness | |
| 234 encoding_utf32_le, // Little-endian UTF32 | |
| 235 encoding_utf32_be, // Big-endian UTF32 | |
| 236 encoding_utf32, // UTF32 with native endianness | |
| 237 encoding_wchar, // The same encoding wchar_t has (either UTF16 or UTF32) | |
| 238 encoding_latin1 | |
| 239 }; | |
| 240 | |
| 241 // Formatting flags | |
| 242 | |
| 243 // Indent the nodes that are written to output stream with as many indentation strings as deep the node is in DOM tree. This flag is on by default. | |
| 244 const unsigned int format_indent = 0x01; | |
| 245 | |
| 246 // Write encoding-specific BOM to the output stream. This flag is off by default. | |
| 247 const unsigned int format_write_bom = 0x02; | |
| 248 | |
| 249 // Use raw output mode (no indentation and no line breaks are written). This flag is off by default. | |
| 250 const unsigned int format_raw = 0x04; | |
| 251 | |
| 252 // Omit default XML declaration even if there is no declaration in the document. This flag is off by default. | |
| 253 const unsigned int format_no_declaration = 0x08; | |
| 254 | |
| 255 // Don't escape attribute values and PCDATA contents. This flag is off by default. | |
| 256 const unsigned int format_no_escapes = 0x10; | |
| 257 | |
| 258 // Open file using text mode in xml_document::save_file. This enables special character (i.e. new-line) conversions on some systems. This flag is off by default. | |
| 259 const unsigned int format_save_file_text = 0x20; | |
| 260 | |
| 261 // Write every attribute on a new line with appropriate indentation. This flag is off by default. | |
| 262 const unsigned int format_indent_attributes = 0x40; | |
| 263 | |
| 264 // Don't output empty element tags, instead writing an explicit start and end tag even if there are no children. This flag is off by default. | |
| 265 const unsigned int format_no_empty_element_tags = 0x80; | |
| 266 | |
| 267 // Skip characters belonging to range [0; 32) instead of "&#xNN;" encoding. This flag is off by default. | |
| 268 const unsigned int format_skip_control_chars = 0x100; | |
| 269 | |
| 270 // Use single quotes ' instead of double quotes " for enclosing attribute values. This flag is off by default. | |
| 271 const unsigned int format_attribute_single_quote = 0x200; | |
| 272 | |
| 273 // The default set of formatting flags. | |
| 274 // Nodes are indented depending on their depth in DOM tree, a default declaration is output if document has none. | |
| 275 const unsigned int format_default = format_indent; | |
| 276 | |
| 277 const int default_double_precision = 17; | |
| 278 const int default_float_precision = 9; | |
| 279 | |
| 280 // Forward declarations | |
| 281 struct xml_attribute_struct; | |
| 282 struct xml_node_struct; | |
| 283 | |
| 284 class xml_node_iterator; | |
| 285 class xml_attribute_iterator; | |
| 286 class xml_named_node_iterator; | |
| 287 | |
| 288 class xml_tree_walker; | |
| 289 | |
| 290 struct xml_parse_result; | |
| 291 | |
| 292 class xml_node; | |
| 293 | |
| 294 class xml_text; | |
| 295 | |
| 296 #ifndef PUGIXML_NO_XPATH | |
| 297 class xpath_node; | |
| 298 class xpath_node_set; | |
| 299 class xpath_query; | |
| 300 class xpath_variable_set; | |
| 301 #endif | |
| 302 | |
| 303 // Range-based for loop support | |
| 304 template <typename It> class xml_object_range | |
| 305 { | |
| 306 public: | |
| 307 typedef It const_iterator; | |
| 308 typedef It iterator; | |
| 309 | |
| 310 xml_object_range(It b, It e): _begin(b), _end(e) | |
| 311 { | |
| 312 } | |
| 313 | |
| 314 It begin() const { return _begin; } | |
| 315 It end() const { return _end; } | |
| 316 | |
| 317 bool empty() const { return _begin == _end; } | |
| 318 | |
| 319 private: | |
| 320 It _begin, _end; | |
| 321 }; | |
| 322 | |
| 323 // Writer interface for node printing (see xml_node::print) | |
| 324 class PUGIXML_CLASS xml_writer | |
| 325 { | |
| 326 public: | |
| 327 virtual ~xml_writer() {} | |
| 328 | |
| 329 // Write memory chunk into stream/file/whatever | |
| 330 virtual void write(const void* data, size_t size) = 0; | |
| 331 }; | |
| 332 | |
| 333 // xml_writer implementation for FILE* | |
| 334 class PUGIXML_CLASS xml_writer_file: public xml_writer | |
| 335 { | |
| 336 public: | |
| 337 // Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio | |
| 338 xml_writer_file(void* file); | |
| 339 | |
| 340 virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE; | |
| 341 | |
| 342 private: | |
| 343 void* file; | |
| 344 }; | |
| 345 | |
| 346 #ifndef PUGIXML_NO_STL | |
| 347 // xml_writer implementation for streams | |
| 348 class PUGIXML_CLASS xml_writer_stream: public xml_writer | |
| 349 { | |
| 350 public: | |
| 351 // Construct writer from an output stream object | |
| 352 xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream); | |
| 353 xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream); | |
| 354 | |
| 355 virtual void write(const void* data, size_t size) PUGIXML_OVERRIDE; | |
| 356 | |
| 357 private: | |
| 358 std::basic_ostream<char, std::char_traits<char> >* narrow_stream; | |
| 359 std::basic_ostream<wchar_t, std::char_traits<wchar_t> >* wide_stream; | |
| 360 }; | |
| 361 #endif | |
| 362 | |
| 363 // A light-weight handle for manipulating attributes in DOM tree | |
| 364 class PUGIXML_CLASS xml_attribute | |
| 365 { | |
| 366 friend class xml_attribute_iterator; | |
| 367 friend class xml_node; | |
| 368 | |
| 369 private: | |
| 370 xml_attribute_struct* _attr; | |
| 371 | |
| 372 typedef void (*unspecified_bool_type)(xml_attribute***); | |
| 373 | |
| 374 public: | |
| 375 // Default constructor. Constructs an empty attribute. | |
| 376 xml_attribute(); | |
| 377 | |
| 378 // Constructs attribute from internal pointer | |
| 379 explicit xml_attribute(xml_attribute_struct* attr); | |
| 380 | |
| 381 // Safe bool conversion operator | |
| 382 operator unspecified_bool_type() const; | |
| 383 | |
| 384 // Borland C++ workaround | |
| 385 bool operator!() const; | |
| 386 | |
| 387 // Comparison operators (compares wrapped attribute pointers) | |
| 388 bool operator==(const xml_attribute& r) const; | |
| 389 bool operator!=(const xml_attribute& r) const; | |
| 390 bool operator<(const xml_attribute& r) const; | |
| 391 bool operator>(const xml_attribute& r) const; | |
| 392 bool operator<=(const xml_attribute& r) const; | |
| 393 bool operator>=(const xml_attribute& r) const; | |
| 394 | |
| 395 // Check if attribute is empty | |
| 396 bool empty() const; | |
| 397 | |
| 398 // Get attribute name/value, or "" if attribute is empty | |
| 399 const char_t* name() const; | |
| 400 const char_t* value() const; | |
| 401 | |
| 402 // Get attribute value, or the default value if attribute is empty | |
| 403 const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const; | |
| 404 | |
| 405 // Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty | |
| 406 int as_int(int def = 0) const; | |
| 407 unsigned int as_uint(unsigned int def = 0) const; | |
| 408 double as_double(double def = 0) const; | |
| 409 float as_float(float def = 0) const; | |
| 410 | |
| 411 #ifdef PUGIXML_HAS_LONG_LONG | |
| 412 long long as_llong(long long def = 0) const; | |
| 413 unsigned long long as_ullong(unsigned long long def = 0) const; | |
| 414 #endif | |
| 415 | |
| 416 // Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty | |
| 417 bool as_bool(bool def = false) const; | |
| 418 | |
| 419 // Set attribute name/value (returns false if attribute is empty or there is not enough memory) | |
| 420 bool set_name(const char_t* rhs); | |
| 421 bool set_value(const char_t* rhs, size_t sz); | |
| 422 bool set_value(const char_t* rhs); | |
| 423 | |
| 424 // Set attribute value with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") | |
| 425 bool set_value(int rhs); | |
| 426 bool set_value(unsigned int rhs); | |
| 427 bool set_value(long rhs); | |
| 428 bool set_value(unsigned long rhs); | |
| 429 bool set_value(double rhs); | |
| 430 bool set_value(double rhs, int precision); | |
| 431 bool set_value(float rhs); | |
| 432 bool set_value(float rhs, int precision); | |
| 433 bool set_value(bool rhs); | |
| 434 | |
| 435 #ifdef PUGIXML_HAS_LONG_LONG | |
| 436 bool set_value(long long rhs); | |
| 437 bool set_value(unsigned long long rhs); | |
| 438 #endif | |
| 439 | |
| 440 // Set attribute value (equivalent to set_value without error checking) | |
| 441 xml_attribute& operator=(const char_t* rhs); | |
| 442 xml_attribute& operator=(int rhs); | |
| 443 xml_attribute& operator=(unsigned int rhs); | |
| 444 xml_attribute& operator=(long rhs); | |
| 445 xml_attribute& operator=(unsigned long rhs); | |
| 446 xml_attribute& operator=(double rhs); | |
| 447 xml_attribute& operator=(float rhs); | |
| 448 xml_attribute& operator=(bool rhs); | |
| 449 | |
| 450 #ifdef PUGIXML_HAS_LONG_LONG | |
| 451 xml_attribute& operator=(long long rhs); | |
| 452 xml_attribute& operator=(unsigned long long rhs); | |
| 453 #endif | |
| 454 | |
| 455 // Get next/previous attribute in the attribute list of the parent node | |
| 456 xml_attribute next_attribute() const; | |
| 457 xml_attribute previous_attribute() const; | |
| 458 | |
| 459 // Get hash value (unique for handles to the same object) | |
| 460 size_t hash_value() const; | |
| 461 | |
| 462 // Get internal pointer | |
| 463 xml_attribute_struct* internal_object() const; | |
| 464 }; | |
| 465 | |
| 466 #ifdef __BORLANDC__ | |
| 467 // Borland C++ workaround | |
| 468 bool PUGIXML_FUNCTION operator&&(const xml_attribute& lhs, bool rhs); | |
| 469 bool PUGIXML_FUNCTION operator||(const xml_attribute& lhs, bool rhs); | |
| 470 #endif | |
| 471 | |
| 472 // A light-weight handle for manipulating nodes in DOM tree | |
| 473 class PUGIXML_CLASS xml_node | |
| 474 { | |
| 475 friend class xml_attribute_iterator; | |
| 476 friend class xml_node_iterator; | |
| 477 friend class xml_named_node_iterator; | |
| 478 | |
| 479 protected: | |
| 480 xml_node_struct* _root; | |
| 481 | |
| 482 typedef void (*unspecified_bool_type)(xml_node***); | |
| 483 | |
| 484 public: | |
| 485 // Default constructor. Constructs an empty node. | |
| 486 xml_node(); | |
| 487 | |
| 488 // Constructs node from internal pointer | |
| 489 explicit xml_node(xml_node_struct* p); | |
| 490 | |
| 491 // Safe bool conversion operator | |
| 492 operator unspecified_bool_type() const; | |
| 493 | |
| 494 // Borland C++ workaround | |
| 495 bool operator!() const; | |
| 496 | |
| 497 // Comparison operators (compares wrapped node pointers) | |
| 498 bool operator==(const xml_node& r) const; | |
| 499 bool operator!=(const xml_node& r) const; | |
| 500 bool operator<(const xml_node& r) const; | |
| 501 bool operator>(const xml_node& r) const; | |
| 502 bool operator<=(const xml_node& r) const; | |
| 503 bool operator>=(const xml_node& r) const; | |
| 504 | |
| 505 // Check if node is empty. | |
| 506 bool empty() const; | |
| 507 | |
| 508 // Get node type | |
| 509 xml_node_type type() const; | |
| 510 | |
| 511 // Get node name, or "" if node is empty or it has no name | |
| 512 const char_t* name() const; | |
| 513 | |
| 514 // Get node value, or "" if node is empty or it has no value | |
| 515 // Note: For <node>text</node> node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes. | |
| 516 const char_t* value() const; | |
| 517 | |
| 518 // Get attribute list | |
| 519 xml_attribute first_attribute() const; | |
| 520 xml_attribute last_attribute() const; | |
| 521 | |
| 522 // Get children list | |
| 523 xml_node first_child() const; | |
| 524 xml_node last_child() const; | |
| 525 | |
| 526 // Get next/previous sibling in the children list of the parent node | |
| 527 xml_node next_sibling() const; | |
| 528 xml_node previous_sibling() const; | |
| 529 | |
| 530 // Get parent node | |
| 531 xml_node parent() const; | |
| 532 | |
| 533 // Get root of DOM tree this node belongs to | |
| 534 xml_node root() const; | |
| 535 | |
| 536 // Get text object for the current node | |
| 537 xml_text text() const; | |
| 538 | |
| 539 // Get child, attribute or next/previous sibling with the specified name | |
| 540 xml_node child(const char_t* name) const; | |
| 541 xml_attribute attribute(const char_t* name) const; | |
| 542 xml_node next_sibling(const char_t* name) const; | |
| 543 xml_node previous_sibling(const char_t* name) const; | |
| 544 | |
| 545 // Get attribute, starting the search from a hint (and updating hint so that searching for a sequence of attributes is fast) | |
| 546 xml_attribute attribute(const char_t* name, xml_attribute& hint) const; | |
| 547 | |
| 548 // Get child value of current node; that is, value of the first child node of type PCDATA/CDATA | |
| 549 const char_t* child_value() const; | |
| 550 | |
| 551 // Get child value of child with specified name. Equivalent to child(name).child_value(). | |
| 552 const char_t* child_value(const char_t* name) const; | |
| 553 | |
| 554 // Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value) | |
| 555 bool set_name(const char_t* rhs); | |
| 556 bool set_value(const char_t* rhs, size_t sz); | |
| 557 bool set_value(const char_t* rhs); | |
| 558 | |
| 559 // Add attribute with specified name. Returns added attribute, or empty attribute on errors. | |
| 560 xml_attribute append_attribute(const char_t* name); | |
| 561 xml_attribute prepend_attribute(const char_t* name); | |
| 562 xml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr); | |
| 563 xml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr); | |
| 564 | |
| 565 // Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors. | |
| 566 xml_attribute append_copy(const xml_attribute& proto); | |
| 567 xml_attribute prepend_copy(const xml_attribute& proto); | |
| 568 xml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr); | |
| 569 xml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr); | |
| 570 | |
| 571 // Add child node with specified type. Returns added node, or empty node on errors. | |
| 572 xml_node append_child(xml_node_type type = node_element); | |
| 573 xml_node prepend_child(xml_node_type type = node_element); | |
| 574 xml_node insert_child_after(xml_node_type type, const xml_node& node); | |
| 575 xml_node insert_child_before(xml_node_type type, const xml_node& node); | |
| 576 | |
| 577 // Add child element with specified name. Returns added node, or empty node on errors. | |
| 578 xml_node append_child(const char_t* name); | |
| 579 xml_node prepend_child(const char_t* name); | |
| 580 xml_node insert_child_after(const char_t* name, const xml_node& node); | |
| 581 xml_node insert_child_before(const char_t* name, const xml_node& node); | |
| 582 | |
| 583 // Add a copy of the specified node as a child. Returns added node, or empty node on errors. | |
| 584 xml_node append_copy(const xml_node& proto); | |
| 585 xml_node prepend_copy(const xml_node& proto); | |
| 586 xml_node insert_copy_after(const xml_node& proto, const xml_node& node); | |
| 587 xml_node insert_copy_before(const xml_node& proto, const xml_node& node); | |
| 588 | |
| 589 // Move the specified node to become a child of this node. Returns moved node, or empty node on errors. | |
| 590 xml_node append_move(const xml_node& moved); | |
| 591 xml_node prepend_move(const xml_node& moved); | |
| 592 xml_node insert_move_after(const xml_node& moved, const xml_node& node); | |
| 593 xml_node insert_move_before(const xml_node& moved, const xml_node& node); | |
| 594 | |
| 595 // Remove specified attribute | |
| 596 bool remove_attribute(const xml_attribute& a); | |
| 597 bool remove_attribute(const char_t* name); | |
| 598 | |
| 599 // Remove all attributes | |
| 600 bool remove_attributes(); | |
| 601 | |
| 602 // Remove specified child | |
| 603 bool remove_child(const xml_node& n); | |
| 604 bool remove_child(const char_t* name); | |
| 605 | |
| 606 // Remove all children | |
| 607 bool remove_children(); | |
| 608 | |
| 609 // Parses buffer as an XML document fragment and appends all nodes as children of the current node. | |
| 610 // Copies/converts the buffer, so it may be deleted or changed after the function returns. | |
| 611 // Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory. | |
| 612 xml_parse_result append_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); | |
| 613 | |
| 614 // Find attribute using predicate. Returns first attribute for which predicate returned true. | |
| 615 template <typename Predicate> xml_attribute find_attribute(Predicate pred) const | |
| 616 { | |
| 617 if (!_root) return xml_attribute(); | |
| 618 | |
| 619 for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute()) | |
| 620 if (pred(attrib)) | |
| 621 return attrib; | |
| 622 | |
| 623 return xml_attribute(); | |
| 624 } | |
| 625 | |
| 626 // Find child node using predicate. Returns first child for which predicate returned true. | |
| 627 template <typename Predicate> xml_node find_child(Predicate pred) const | |
| 628 { | |
| 629 if (!_root) return xml_node(); | |
| 630 | |
| 631 for (xml_node node = first_child(); node; node = node.next_sibling()) | |
| 632 if (pred(node)) | |
| 633 return node; | |
| 634 | |
| 635 return xml_node(); | |
| 636 } | |
| 637 | |
| 638 // Find node from subtree using predicate. Returns first node from subtree (depth-first), for which predicate returned true. | |
| 639 template <typename Predicate> xml_node find_node(Predicate pred) const | |
| 640 { | |
| 641 if (!_root) return xml_node(); | |
| 642 | |
| 643 xml_node cur = first_child(); | |
| 644 | |
| 645 while (cur._root && cur._root != _root) | |
| 646 { | |
| 647 if (pred(cur)) return cur; | |
| 648 | |
| 649 if (cur.first_child()) cur = cur.first_child(); | |
| 650 else if (cur.next_sibling()) cur = cur.next_sibling(); | |
| 651 else | |
| 652 { | |
| 653 while (!cur.next_sibling() && cur._root != _root) cur = cur.parent(); | |
| 654 | |
| 655 if (cur._root != _root) cur = cur.next_sibling(); | |
| 656 } | |
| 657 } | |
| 658 | |
| 659 return xml_node(); | |
| 660 } | |
| 661 | |
| 662 // Find child node by attribute name/value | |
| 663 xml_node find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const; | |
| 664 xml_node find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const; | |
| 665 | |
| 666 #ifndef PUGIXML_NO_STL | |
| 667 // Get the absolute node path from root as a text string. | |
| 668 string_t path(char_t delimiter = '/') const; | |
| 669 #endif | |
| 670 | |
| 671 // Search for a node by path consisting of node names and . or .. elements. | |
| 672 xml_node first_element_by_path(const char_t* path, char_t delimiter = '/') const; | |
| 673 | |
| 674 // Recursively traverse subtree with xml_tree_walker | |
| 675 bool traverse(xml_tree_walker& walker); | |
| 676 | |
| 677 #ifndef PUGIXML_NO_XPATH | |
| 678 // Select single node by evaluating XPath query. Returns first node from the resulting node set. | |
| 679 xpath_node select_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; | |
| 680 xpath_node select_node(const xpath_query& query) const; | |
| 681 | |
| 682 // Select node set by evaluating XPath query | |
| 683 xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; | |
| 684 xpath_node_set select_nodes(const xpath_query& query) const; | |
| 685 | |
| 686 // (deprecated: use select_node instead) Select single node by evaluating XPath query. | |
| 687 PUGIXML_DEPRECATED xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const; | |
| 688 PUGIXML_DEPRECATED xpath_node select_single_node(const xpath_query& query) const; | |
| 689 | |
| 690 #endif | |
| 691 | |
| 692 // Print subtree using a writer object | |
| 693 void print(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; | |
| 694 | |
| 695 #ifndef PUGIXML_NO_STL | |
| 696 // Print subtree to stream | |
| 697 void print(std::basic_ostream<char, std::char_traits<char> >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const; | |
| 698 void print(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, unsigned int depth = 0) const; | |
| 699 #endif | |
| 700 | |
| 701 // Child nodes iterators | |
| 702 typedef xml_node_iterator iterator; | |
| 703 | |
| 704 iterator begin() const; | |
| 705 iterator end() const; | |
| 706 | |
| 707 // Attribute iterators | |
| 708 typedef xml_attribute_iterator attribute_iterator; | |
| 709 | |
| 710 attribute_iterator attributes_begin() const; | |
| 711 attribute_iterator attributes_end() const; | |
| 712 | |
| 713 // Range-based for support | |
| 714 xml_object_range<xml_node_iterator> children() const; | |
| 715 xml_object_range<xml_named_node_iterator> children(const char_t* name) const; | |
| 716 xml_object_range<xml_attribute_iterator> attributes() const; | |
| 717 | |
| 718 // Get node offset in parsed file/string (in char_t units) for debugging purposes | |
| 719 ptrdiff_t offset_debug() const; | |
| 720 | |
| 721 // Get hash value (unique for handles to the same object) | |
| 722 size_t hash_value() const; | |
| 723 | |
| 724 // Get internal pointer | |
| 725 xml_node_struct* internal_object() const; | |
| 726 }; | |
| 727 | |
| 728 #ifdef __BORLANDC__ | |
| 729 // Borland C++ workaround | |
| 730 bool PUGIXML_FUNCTION operator&&(const xml_node& lhs, bool rhs); | |
| 731 bool PUGIXML_FUNCTION operator||(const xml_node& lhs, bool rhs); | |
| 732 #endif | |
| 733 | |
| 734 // A helper for working with text inside PCDATA nodes | |
| 735 class PUGIXML_CLASS xml_text | |
| 736 { | |
| 737 friend class xml_node; | |
| 738 | |
| 739 xml_node_struct* _root; | |
| 740 | |
| 741 typedef void (*unspecified_bool_type)(xml_text***); | |
| 742 | |
| 743 explicit xml_text(xml_node_struct* root); | |
| 744 | |
| 745 xml_node_struct* _data_new(); | |
| 746 xml_node_struct* _data() const; | |
| 747 | |
| 748 public: | |
| 749 // Default constructor. Constructs an empty object. | |
| 750 xml_text(); | |
| 751 | |
| 752 // Safe bool conversion operator | |
| 753 operator unspecified_bool_type() const; | |
| 754 | |
| 755 // Borland C++ workaround | |
| 756 bool operator!() const; | |
| 757 | |
| 758 // Check if text object is empty | |
| 759 bool empty() const; | |
| 760 | |
| 761 // Get text, or "" if object is empty | |
| 762 const char_t* get() const; | |
| 763 | |
| 764 // Get text, or the default value if object is empty | |
| 765 const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const; | |
| 766 | |
| 767 // Get text as a number, or the default value if conversion did not succeed or object is empty | |
| 768 int as_int(int def = 0) const; | |
| 769 unsigned int as_uint(unsigned int def = 0) const; | |
| 770 double as_double(double def = 0) const; | |
| 771 float as_float(float def = 0) const; | |
| 772 | |
| 773 #ifdef PUGIXML_HAS_LONG_LONG | |
| 774 long long as_llong(long long def = 0) const; | |
| 775 unsigned long long as_ullong(unsigned long long def = 0) const; | |
| 776 #endif | |
| 777 | |
| 778 // Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty | |
| 779 bool as_bool(bool def = false) const; | |
| 780 | |
| 781 // Set text (returns false if object is empty or there is not enough memory) | |
| 782 bool set(const char_t* rhs, size_t sz); | |
| 783 bool set(const char_t* rhs); | |
| 784 | |
| 785 // Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false") | |
| 786 bool set(int rhs); | |
| 787 bool set(unsigned int rhs); | |
| 788 bool set(long rhs); | |
| 789 bool set(unsigned long rhs); | |
| 790 bool set(double rhs); | |
| 791 bool set(double rhs, int precision); | |
| 792 bool set(float rhs); | |
| 793 bool set(float rhs, int precision); | |
| 794 bool set(bool rhs); | |
| 795 | |
| 796 #ifdef PUGIXML_HAS_LONG_LONG | |
| 797 bool set(long long rhs); | |
| 798 bool set(unsigned long long rhs); | |
| 799 #endif | |
| 800 | |
| 801 // Set text (equivalent to set without error checking) | |
| 802 xml_text& operator=(const char_t* rhs); | |
| 803 xml_text& operator=(int rhs); | |
| 804 xml_text& operator=(unsigned int rhs); | |
| 805 xml_text& operator=(long rhs); | |
| 806 xml_text& operator=(unsigned long rhs); | |
| 807 xml_text& operator=(double rhs); | |
| 808 xml_text& operator=(float rhs); | |
| 809 xml_text& operator=(bool rhs); | |
| 810 | |
| 811 #ifdef PUGIXML_HAS_LONG_LONG | |
| 812 xml_text& operator=(long long rhs); | |
| 813 xml_text& operator=(unsigned long long rhs); | |
| 814 #endif | |
| 815 | |
| 816 // Get the data node (node_pcdata or node_cdata) for this object | |
| 817 xml_node data() const; | |
| 818 }; | |
| 819 | |
| 820 #ifdef __BORLANDC__ | |
| 821 // Borland C++ workaround | |
| 822 bool PUGIXML_FUNCTION operator&&(const xml_text& lhs, bool rhs); | |
| 823 bool PUGIXML_FUNCTION operator||(const xml_text& lhs, bool rhs); | |
| 824 #endif | |
| 825 | |
| 826 // Child node iterator (a bidirectional iterator over a collection of xml_node) | |
| 827 class PUGIXML_CLASS xml_node_iterator | |
| 828 { | |
| 829 friend class xml_node; | |
| 830 | |
| 831 private: | |
| 832 mutable xml_node _wrap; | |
| 833 xml_node _parent; | |
| 834 | |
| 835 xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent); | |
| 836 | |
| 837 public: | |
| 838 // Iterator traits | |
| 839 typedef ptrdiff_t difference_type; | |
| 840 typedef xml_node value_type; | |
| 841 typedef xml_node* pointer; | |
| 842 typedef xml_node& reference; | |
| 843 | |
| 844 #ifndef PUGIXML_NO_STL | |
| 845 typedef std::bidirectional_iterator_tag iterator_category; | |
| 846 #endif | |
| 847 | |
| 848 // Default constructor | |
| 849 xml_node_iterator(); | |
| 850 | |
| 851 // Construct an iterator which points to the specified node | |
| 852 xml_node_iterator(const xml_node& node); | |
| 853 | |
| 854 // Iterator operators | |
| 855 bool operator==(const xml_node_iterator& rhs) const; | |
| 856 bool operator!=(const xml_node_iterator& rhs) const; | |
| 857 | |
| 858 xml_node& operator*() const; | |
| 859 xml_node* operator->() const; | |
| 860 | |
| 861 xml_node_iterator& operator++(); | |
| 862 xml_node_iterator operator++(int); | |
| 863 | |
| 864 xml_node_iterator& operator--(); | |
| 865 xml_node_iterator operator--(int); | |
| 866 }; | |
| 867 | |
| 868 // Attribute iterator (a bidirectional iterator over a collection of xml_attribute) | |
| 869 class PUGIXML_CLASS xml_attribute_iterator | |
| 870 { | |
| 871 friend class xml_node; | |
| 872 | |
| 873 private: | |
| 874 mutable xml_attribute _wrap; | |
| 875 xml_node _parent; | |
| 876 | |
| 877 xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent); | |
| 878 | |
| 879 public: | |
| 880 // Iterator traits | |
| 881 typedef ptrdiff_t difference_type; | |
| 882 typedef xml_attribute value_type; | |
| 883 typedef xml_attribute* pointer; | |
| 884 typedef xml_attribute& reference; | |
| 885 | |
| 886 #ifndef PUGIXML_NO_STL | |
| 887 typedef std::bidirectional_iterator_tag iterator_category; | |
| 888 #endif | |
| 889 | |
| 890 // Default constructor | |
| 891 xml_attribute_iterator(); | |
| 892 | |
| 893 // Construct an iterator which points to the specified attribute | |
| 894 xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent); | |
| 895 | |
| 896 // Iterator operators | |
| 897 bool operator==(const xml_attribute_iterator& rhs) const; | |
| 898 bool operator!=(const xml_attribute_iterator& rhs) const; | |
| 899 | |
| 900 xml_attribute& operator*() const; | |
| 901 xml_attribute* operator->() const; | |
| 902 | |
| 903 xml_attribute_iterator& operator++(); | |
| 904 xml_attribute_iterator operator++(int); | |
| 905 | |
| 906 xml_attribute_iterator& operator--(); | |
| 907 xml_attribute_iterator operator--(int); | |
| 908 }; | |
| 909 | |
| 910 // Named node range helper | |
| 911 class PUGIXML_CLASS xml_named_node_iterator | |
| 912 { | |
| 913 friend class xml_node; | |
| 914 | |
| 915 public: | |
| 916 // Iterator traits | |
| 917 typedef ptrdiff_t difference_type; | |
| 918 typedef xml_node value_type; | |
| 919 typedef xml_node* pointer; | |
| 920 typedef xml_node& reference; | |
| 921 | |
| 922 #ifndef PUGIXML_NO_STL | |
| 923 typedef std::bidirectional_iterator_tag iterator_category; | |
| 924 #endif | |
| 925 | |
| 926 // Default constructor | |
| 927 xml_named_node_iterator(); | |
| 928 | |
| 929 // Construct an iterator which points to the specified node | |
| 930 xml_named_node_iterator(const xml_node& node, const char_t* name); | |
| 931 | |
| 932 // Iterator operators | |
| 933 bool operator==(const xml_named_node_iterator& rhs) const; | |
| 934 bool operator!=(const xml_named_node_iterator& rhs) const; | |
| 935 | |
| 936 xml_node& operator*() const; | |
| 937 xml_node* operator->() const; | |
| 938 | |
| 939 xml_named_node_iterator& operator++(); | |
| 940 xml_named_node_iterator operator++(int); | |
| 941 | |
| 942 xml_named_node_iterator& operator--(); | |
| 943 xml_named_node_iterator operator--(int); | |
| 944 | |
| 945 private: | |
| 946 mutable xml_node _wrap; | |
| 947 xml_node _parent; | |
| 948 const char_t* _name; | |
| 949 | |
| 950 xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name); | |
| 951 }; | |
| 952 | |
| 953 // Abstract tree walker class (see xml_node::traverse) | |
| 954 class PUGIXML_CLASS xml_tree_walker | |
| 955 { | |
| 956 friend class xml_node; | |
| 957 | |
| 958 private: | |
| 959 int _depth; | |
| 960 | |
| 961 protected: | |
| 962 // Get current traversal depth | |
| 963 int depth() const; | |
| 964 | |
| 965 public: | |
| 966 xml_tree_walker(); | |
| 967 virtual ~xml_tree_walker(); | |
| 968 | |
| 969 // Callback that is called when traversal begins | |
| 970 virtual bool begin(xml_node& node); | |
| 971 | |
| 972 // Callback that is called for each node traversed | |
| 973 virtual bool for_each(xml_node& node) = 0; | |
| 974 | |
| 975 // Callback that is called when traversal ends | |
| 976 virtual bool end(xml_node& node); | |
| 977 }; | |
| 978 | |
| 979 // Parsing status, returned as part of xml_parse_result object | |
| 980 enum xml_parse_status | |
| 981 { | |
| 982 status_ok = 0, // No error | |
| 983 | |
| 984 status_file_not_found, // File was not found during load_file() | |
| 985 status_io_error, // Error reading from file/stream | |
| 986 status_out_of_memory, // Could not allocate memory | |
| 987 status_internal_error, // Internal error occurred | |
| 988 | |
| 989 status_unrecognized_tag, // Parser could not determine tag type | |
| 990 | |
| 991 status_bad_pi, // Parsing error occurred while parsing document declaration/processing instruction | |
| 992 status_bad_comment, // Parsing error occurred while parsing comment | |
| 993 status_bad_cdata, // Parsing error occurred while parsing CDATA section | |
| 994 status_bad_doctype, // Parsing error occurred while parsing document type declaration | |
| 995 status_bad_pcdata, // Parsing error occurred while parsing PCDATA section | |
| 996 status_bad_start_element, // Parsing error occurred while parsing start element tag | |
| 997 status_bad_attribute, // Parsing error occurred while parsing element attribute | |
| 998 status_bad_end_element, // Parsing error occurred while parsing end element tag | |
| 999 status_end_element_mismatch,// There was a mismatch of start-end tags (closing tag had incorrect name, some tag was not closed or there was an excessive closing tag) | |
| 1000 | |
| 1001 status_append_invalid_root, // Unable to append nodes since root type is not node_element or node_document (exclusive to xml_node::append_buffer) | |
| 1002 | |
| 1003 status_no_document_element // Parsing resulted in a document without element nodes | |
| 1004 }; | |
| 1005 | |
| 1006 // Parsing result | |
| 1007 struct PUGIXML_CLASS xml_parse_result | |
| 1008 { | |
| 1009 // Parsing status (see xml_parse_status) | |
| 1010 xml_parse_status status; | |
| 1011 | |
| 1012 // Last parsed offset (in char_t units from start of input data) | |
| 1013 ptrdiff_t offset; | |
| 1014 | |
| 1015 // Source document encoding | |
| 1016 xml_encoding encoding; | |
| 1017 | |
| 1018 // Default constructor, initializes object to failed state | |
| 1019 xml_parse_result(); | |
| 1020 | |
| 1021 // Cast to bool operator | |
| 1022 operator bool() const; | |
| 1023 | |
| 1024 // Get error description | |
| 1025 const char* description() const; | |
| 1026 }; | |
| 1027 | |
| 1028 // Document class (DOM tree root) | |
| 1029 class PUGIXML_CLASS xml_document: public xml_node | |
| 1030 { | |
| 1031 private: | |
| 1032 char_t* _buffer; | |
| 1033 | |
| 1034 char _memory[192]; | |
| 1035 | |
| 1036 // Non-copyable semantics | |
| 1037 xml_document(const xml_document&); | |
| 1038 xml_document& operator=(const xml_document&); | |
| 1039 | |
| 1040 void _create(); | |
| 1041 void _destroy(); | |
| 1042 void _move(xml_document& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; | |
| 1043 | |
| 1044 public: | |
| 1045 // Default constructor, makes empty document | |
| 1046 xml_document(); | |
| 1047 | |
| 1048 // Destructor, invalidates all node/attribute handles to this document | |
| 1049 ~xml_document(); | |
| 1050 | |
| 1051 #ifdef PUGIXML_HAS_MOVE | |
| 1052 // Move semantics support | |
| 1053 xml_document(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; | |
| 1054 xml_document& operator=(xml_document&& rhs) PUGIXML_NOEXCEPT_IF_NOT_COMPACT; | |
| 1055 #endif | |
| 1056 | |
| 1057 // Removes all nodes, leaving the empty document | |
| 1058 void reset(); | |
| 1059 | |
| 1060 // Removes all nodes, then copies the entire contents of the specified document | |
| 1061 void reset(const xml_document& proto); | |
| 1062 | |
| 1063 #ifndef PUGIXML_NO_STL | |
| 1064 // Load document from stream. | |
| 1065 xml_parse_result load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); | |
| 1066 xml_parse_result load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options = parse_default); | |
| 1067 #endif | |
| 1068 | |
| 1069 // (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied. | |
| 1070 PUGIXML_DEPRECATED xml_parse_result load(const char_t* contents, unsigned int options = parse_default); | |
| 1071 | |
| 1072 // Load document from zero-terminated string. No encoding conversions are applied. | |
| 1073 xml_parse_result load_string(const char_t* contents, unsigned int options = parse_default); | |
| 1074 | |
| 1075 // Load document from file | |
| 1076 xml_parse_result load_file(const char* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); | |
| 1077 xml_parse_result load_file(const wchar_t* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); | |
| 1078 | |
| 1079 // Load document from buffer. Copies/converts the buffer, so it may be deleted or changed after the function returns. | |
| 1080 xml_parse_result load_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); | |
| 1081 | |
| 1082 // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data). | |
| 1083 // You should ensure that buffer data will persist throughout the document's lifetime, and free the buffer memory manually once document is destroyed. | |
| 1084 xml_parse_result load_buffer_inplace(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); | |
| 1085 | |
| 1086 // Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data). | |
| 1087 // You should allocate the buffer with pugixml allocation function; document will free the buffer when it is no longer needed (you can't use it anymore). | |
| 1088 xml_parse_result load_buffer_inplace_own(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto); | |
| 1089 | |
| 1090 // Save XML document to writer (semantics is slightly different from xml_node::print, see documentation for details). | |
| 1091 void save(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; | |
| 1092 | |
| 1093 #ifndef PUGIXML_NO_STL | |
| 1094 // Save XML document to stream (semantics is slightly different from xml_node::print, see documentation for details). | |
| 1095 void save(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; | |
| 1096 void save(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default) const; | |
| 1097 #endif | |
| 1098 | |
| 1099 // Save XML to file | |
| 1100 bool save_file(const char* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; | |
| 1101 bool save_file(const wchar_t* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const; | |
| 1102 | |
| 1103 // Get document element | |
| 1104 xml_node document_element() const; | |
| 1105 }; | |
| 1106 | |
| 1107 #ifndef PUGIXML_NO_XPATH | |
| 1108 // XPath query return type | |
| 1109 enum xpath_value_type | |
| 1110 { | |
| 1111 xpath_type_none, // Unknown type (query failed to compile) | |
| 1112 xpath_type_node_set, // Node set (xpath_node_set) | |
| 1113 xpath_type_number, // Number | |
| 1114 xpath_type_string, // String | |
| 1115 xpath_type_boolean // Boolean | |
| 1116 }; | |
| 1117 | |
| 1118 // XPath parsing result | |
| 1119 struct PUGIXML_CLASS xpath_parse_result | |
| 1120 { | |
| 1121 // Error message (0 if no error) | |
| 1122 const char* error; | |
| 1123 | |
| 1124 // Last parsed offset (in char_t units from string start) | |
| 1125 ptrdiff_t offset; | |
| 1126 | |
| 1127 // Default constructor, initializes object to failed state | |
| 1128 xpath_parse_result(); | |
| 1129 | |
| 1130 // Cast to bool operator | |
| 1131 operator bool() const; | |
| 1132 | |
| 1133 // Get error description | |
| 1134 const char* description() const; | |
| 1135 }; | |
| 1136 | |
| 1137 // A single XPath variable | |
| 1138 class PUGIXML_CLASS xpath_variable | |
| 1139 { | |
| 1140 friend class xpath_variable_set; | |
| 1141 | |
| 1142 protected: | |
| 1143 xpath_value_type _type; | |
| 1144 xpath_variable* _next; | |
| 1145 | |
| 1146 xpath_variable(xpath_value_type type); | |
| 1147 | |
| 1148 // Non-copyable semantics | |
| 1149 xpath_variable(const xpath_variable&); | |
| 1150 xpath_variable& operator=(const xpath_variable&); | |
| 1151 | |
| 1152 public: | |
| 1153 // Get variable name | |
| 1154 const char_t* name() const; | |
| 1155 | |
| 1156 // Get variable type | |
| 1157 xpath_value_type type() const; | |
| 1158 | |
| 1159 // Get variable value; no type conversion is performed, default value (false, NaN, empty string, empty node set) is returned on type mismatch error | |
| 1160 bool get_boolean() const; | |
| 1161 double get_number() const; | |
| 1162 const char_t* get_string() const; | |
| 1163 const xpath_node_set& get_node_set() const; | |
| 1164 | |
| 1165 // Set variable value; no type conversion is performed, false is returned on type mismatch error | |
| 1166 bool set(bool value); | |
| 1167 bool set(double value); | |
| 1168 bool set(const char_t* value); | |
| 1169 bool set(const xpath_node_set& value); | |
| 1170 }; | |
| 1171 | |
| 1172 // A set of XPath variables | |
| 1173 class PUGIXML_CLASS xpath_variable_set | |
| 1174 { | |
| 1175 private: | |
| 1176 xpath_variable* _data[64]; | |
| 1177 | |
| 1178 void _assign(const xpath_variable_set& rhs); | |
| 1179 void _swap(xpath_variable_set& rhs); | |
| 1180 | |
| 1181 xpath_variable* _find(const char_t* name) const; | |
| 1182 | |
| 1183 static bool _clone(xpath_variable* var, xpath_variable** out_result); | |
| 1184 static void _destroy(xpath_variable* var); | |
| 1185 | |
| 1186 public: | |
| 1187 // Default constructor/destructor | |
| 1188 xpath_variable_set(); | |
| 1189 ~xpath_variable_set(); | |
| 1190 | |
| 1191 // Copy constructor/assignment operator | |
| 1192 xpath_variable_set(const xpath_variable_set& rhs); | |
| 1193 xpath_variable_set& operator=(const xpath_variable_set& rhs); | |
| 1194 | |
| 1195 #ifdef PUGIXML_HAS_MOVE | |
| 1196 // Move semantics support | |
| 1197 xpath_variable_set(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT; | |
| 1198 xpath_variable_set& operator=(xpath_variable_set&& rhs) PUGIXML_NOEXCEPT; | |
| 1199 #endif | |
| 1200 | |
| 1201 // Add a new variable or get the existing one, if the types match | |
| 1202 xpath_variable* add(const char_t* name, xpath_value_type type); | |
| 1203 | |
| 1204 // Set value of an existing variable; no type conversion is performed, false is returned if there is no such variable or if types mismatch | |
| 1205 bool set(const char_t* name, bool value); | |
| 1206 bool set(const char_t* name, double value); | |
| 1207 bool set(const char_t* name, const char_t* value); | |
| 1208 bool set(const char_t* name, const xpath_node_set& value); | |
| 1209 | |
| 1210 // Get existing variable by name | |
| 1211 xpath_variable* get(const char_t* name); | |
| 1212 const xpath_variable* get(const char_t* name) const; | |
| 1213 }; | |
| 1214 | |
| 1215 // A compiled XPath query object | |
| 1216 class PUGIXML_CLASS xpath_query | |
| 1217 { | |
| 1218 private: | |
| 1219 void* _impl; | |
| 1220 xpath_parse_result _result; | |
| 1221 | |
| 1222 typedef void (*unspecified_bool_type)(xpath_query***); | |
| 1223 | |
| 1224 // Non-copyable semantics | |
| 1225 xpath_query(const xpath_query&); | |
| 1226 xpath_query& operator=(const xpath_query&); | |
| 1227 | |
| 1228 public: | |
| 1229 // Construct a compiled object from XPath expression. | |
| 1230 // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors. | |
| 1231 explicit xpath_query(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL); | |
| 1232 | |
| 1233 // Constructor | |
| 1234 xpath_query(); | |
| 1235 | |
| 1236 // Destructor | |
| 1237 ~xpath_query(); | |
| 1238 | |
| 1239 #ifdef PUGIXML_HAS_MOVE | |
| 1240 // Move semantics support | |
| 1241 xpath_query(xpath_query&& rhs) PUGIXML_NOEXCEPT; | |
| 1242 xpath_query& operator=(xpath_query&& rhs) PUGIXML_NOEXCEPT; | |
| 1243 #endif | |
| 1244 | |
| 1245 // Get query expression return type | |
| 1246 xpath_value_type return_type() const; | |
| 1247 | |
| 1248 // Evaluate expression as boolean value in the specified context; performs type conversion if necessary. | |
| 1249 // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. | |
| 1250 bool evaluate_boolean(const xpath_node& n) const; | |
| 1251 | |
| 1252 // Evaluate expression as double value in the specified context; performs type conversion if necessary. | |
| 1253 // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. | |
| 1254 double evaluate_number(const xpath_node& n) const; | |
| 1255 | |
| 1256 #ifndef PUGIXML_NO_STL | |
| 1257 // Evaluate expression as string value in the specified context; performs type conversion if necessary. | |
| 1258 // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. | |
| 1259 string_t evaluate_string(const xpath_node& n) const; | |
| 1260 #endif | |
| 1261 | |
| 1262 // Evaluate expression as string value in the specified context; performs type conversion if necessary. | |
| 1263 // At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero). | |
| 1264 // If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors. | |
| 1265 // If PUGIXML_NO_EXCEPTIONS is defined, returns empty set instead. | |
| 1266 size_t evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const; | |
| 1267 | |
| 1268 // Evaluate expression as node set in the specified context. | |
| 1269 // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors. | |
| 1270 // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node set instead. | |
| 1271 xpath_node_set evaluate_node_set(const xpath_node& n) const; | |
| 1272 | |
| 1273 // Evaluate expression as node set in the specified context. | |
| 1274 // Return first node in document order, or empty node if node set is empty. | |
| 1275 // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors. | |
| 1276 // If PUGIXML_NO_EXCEPTIONS is defined, returns empty node instead. | |
| 1277 xpath_node evaluate_node(const xpath_node& n) const; | |
| 1278 | |
| 1279 // Get parsing result (used to get compilation errors in PUGIXML_NO_EXCEPTIONS mode) | |
| 1280 const xpath_parse_result& result() const; | |
| 1281 | |
| 1282 // Safe bool conversion operator | |
| 1283 operator unspecified_bool_type() const; | |
| 1284 | |
| 1285 // Borland C++ workaround | |
| 1286 bool operator!() const; | |
| 1287 }; | |
| 1288 | |
| 1289 #ifndef PUGIXML_NO_EXCEPTIONS | |
| 1290 #if defined(_MSC_VER) | |
| 1291 // C4275 can be ignored in Visual C++ if you are deriving | |
| 1292 // from a type in the Standard C++ Library | |
| 1293 #pragma warning(push) | |
| 1294 #pragma warning(disable: 4275) | |
| 1295 #endif | |
| 1296 // XPath exception class | |
| 1297 class PUGIXML_CLASS xpath_exception: public std::exception | |
| 1298 { | |
| 1299 private: | |
| 1300 xpath_parse_result _result; | |
| 1301 | |
| 1302 public: | |
| 1303 // Construct exception from parse result | |
| 1304 explicit xpath_exception(const xpath_parse_result& result); | |
| 1305 | |
| 1306 // Get error message | |
| 1307 virtual const char* what() const throw() PUGIXML_OVERRIDE; | |
| 1308 | |
| 1309 // Get parse result | |
| 1310 const xpath_parse_result& result() const; | |
| 1311 }; | |
| 1312 #if defined(_MSC_VER) | |
| 1313 #pragma warning(pop) | |
| 1314 #endif | |
| 1315 #endif | |
| 1316 | |
| 1317 // XPath node class (either xml_node or xml_attribute) | |
| 1318 class PUGIXML_CLASS xpath_node | |
| 1319 { | |
| 1320 private: | |
| 1321 xml_node _node; | |
| 1322 xml_attribute _attribute; | |
| 1323 | |
| 1324 typedef void (*unspecified_bool_type)(xpath_node***); | |
| 1325 | |
| 1326 public: | |
| 1327 // Default constructor; constructs empty XPath node | |
| 1328 xpath_node(); | |
| 1329 | |
| 1330 // Construct XPath node from XML node/attribute | |
| 1331 xpath_node(const xml_node& node); | |
| 1332 xpath_node(const xml_attribute& attribute, const xml_node& parent); | |
| 1333 | |
| 1334 // Get node/attribute, if any | |
| 1335 xml_node node() const; | |
| 1336 xml_attribute attribute() const; | |
| 1337 | |
| 1338 // Get parent of contained node/attribute | |
| 1339 xml_node parent() const; | |
| 1340 | |
| 1341 // Safe bool conversion operator | |
| 1342 operator unspecified_bool_type() const; | |
| 1343 | |
| 1344 // Borland C++ workaround | |
| 1345 bool operator!() const; | |
| 1346 | |
| 1347 // Comparison operators | |
| 1348 bool operator==(const xpath_node& n) const; | |
| 1349 bool operator!=(const xpath_node& n) const; | |
| 1350 }; | |
| 1351 | |
| 1352 #ifdef __BORLANDC__ | |
| 1353 // Borland C++ workaround | |
| 1354 bool PUGIXML_FUNCTION operator&&(const xpath_node& lhs, bool rhs); | |
| 1355 bool PUGIXML_FUNCTION operator||(const xpath_node& lhs, bool rhs); | |
| 1356 #endif | |
| 1357 | |
| 1358 // A fixed-size collection of XPath nodes | |
| 1359 class PUGIXML_CLASS xpath_node_set | |
| 1360 { | |
| 1361 public: | |
| 1362 // Collection type | |
| 1363 enum type_t | |
| 1364 { | |
| 1365 type_unsorted, // Not ordered | |
| 1366 type_sorted, // Sorted by document order (ascending) | |
| 1367 type_sorted_reverse // Sorted by document order (descending) | |
| 1368 }; | |
| 1369 | |
| 1370 // Constant iterator type | |
| 1371 typedef const xpath_node* const_iterator; | |
| 1372 | |
| 1373 // We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work | |
| 1374 typedef const xpath_node* iterator; | |
| 1375 | |
| 1376 // Default constructor. Constructs empty set. | |
| 1377 xpath_node_set(); | |
| 1378 | |
| 1379 // Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful | |
| 1380 xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted); | |
| 1381 | |
| 1382 // Destructor | |
| 1383 ~xpath_node_set(); | |
| 1384 | |
| 1385 // Copy constructor/assignment operator | |
| 1386 xpath_node_set(const xpath_node_set& ns); | |
| 1387 xpath_node_set& operator=(const xpath_node_set& ns); | |
| 1388 | |
| 1389 #ifdef PUGIXML_HAS_MOVE | |
| 1390 // Move semantics support | |
| 1391 xpath_node_set(xpath_node_set&& rhs) PUGIXML_NOEXCEPT; | |
| 1392 xpath_node_set& operator=(xpath_node_set&& rhs) PUGIXML_NOEXCEPT; | |
| 1393 #endif | |
| 1394 | |
| 1395 // Get collection type | |
| 1396 type_t type() const; | |
| 1397 | |
| 1398 // Get collection size | |
| 1399 size_t size() const; | |
| 1400 | |
| 1401 // Indexing operator | |
| 1402 const xpath_node& operator[](size_t index) const; | |
| 1403 | |
| 1404 // Collection iterators | |
| 1405 const_iterator begin() const; | |
| 1406 const_iterator end() const; | |
| 1407 | |
| 1408 // Sort the collection in ascending/descending order by document order | |
| 1409 void sort(bool reverse = false); | |
| 1410 | |
| 1411 // Get first node in the collection by document order | |
| 1412 xpath_node first() const; | |
| 1413 | |
| 1414 // Check if collection is empty | |
| 1415 bool empty() const; | |
| 1416 | |
| 1417 private: | |
| 1418 type_t _type; | |
| 1419 | |
| 1420 xpath_node _storage[1]; | |
| 1421 | |
| 1422 xpath_node* _begin; | |
| 1423 xpath_node* _end; | |
| 1424 | |
| 1425 void _assign(const_iterator begin, const_iterator end, type_t type); | |
| 1426 void _move(xpath_node_set& rhs) PUGIXML_NOEXCEPT; | |
| 1427 }; | |
| 1428 #endif | |
| 1429 | |
| 1430 #ifndef PUGIXML_NO_STL | |
| 1431 // Convert wide string to UTF8 | |
| 1432 std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const wchar_t* str); | |
| 1433 std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >& str); | |
| 1434 | |
| 1435 // Convert UTF8 to wide string | |
| 1436 std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const char* str); | |
| 1437 std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >& str); | |
| 1438 #endif | |
| 1439 | |
| 1440 // Memory allocation function interface; returns pointer to allocated memory or NULL on failure | |
| 1441 typedef void* (*allocation_function)(size_t size); | |
| 1442 | |
| 1443 // Memory deallocation function interface | |
| 1444 typedef void (*deallocation_function)(void* ptr); | |
| 1445 | |
| 1446 // Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions. | |
| 1447 void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate); | |
| 1448 | |
| 1449 // Get current memory management functions | |
| 1450 allocation_function PUGIXML_FUNCTION get_memory_allocation_function(); | |
| 1451 deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function(); | |
| 1452 } | |
| 1453 | |
| 1454 #if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC)) | |
| 1455 namespace std | |
| 1456 { | |
| 1457 // Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier) | |
| 1458 std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_node_iterator&); | |
| 1459 std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_attribute_iterator&); | |
| 1460 std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_named_node_iterator&); | |
| 1461 } | |
| 1462 #endif | |
| 1463 | |
| 1464 #if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC) | |
| 1465 namespace std | |
| 1466 { | |
| 1467 // Workarounds for (non-standard) iterator category detection | |
| 1468 std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_node_iterator&); | |
| 1469 std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_attribute_iterator&); | |
| 1470 std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_named_node_iterator&); | |
| 1471 } | |
| 1472 #endif | |
| 1473 | |
| 1474 #endif | |
| 1475 | |
| 1476 // Make sure implementation is included in header-only mode | |
| 1477 // Use macro expansion in #include to work around QMake (QTBUG-11923) | |
| 1478 #if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE) | |
| 1479 # define PUGIXML_SOURCE "pugixml.cpp" | |
| 1480 # include PUGIXML_SOURCE | |
| 1481 #endif | |
| 1482 | |
| 1483 /** | |
| 1484 * Copyright (c) 2006-2022 Arseny Kapoulkine | |
| 1485 * | |
| 1486 * Permission is hereby granted, free of charge, to any person | |
| 1487 * obtaining a copy of this software and associated documentation | |
| 1488 * files (the "Software"), to deal in the Software without | |
| 1489 * restriction, including without limitation the rights to use, | |
| 1490 * copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| 1491 * copies of the Software, and to permit persons to whom the | |
| 1492 * Software is furnished to do so, subject to the following | |
| 1493 * conditions: | |
| 1494 * | |
| 1495 * The above copyright notice and this permission notice shall be | |
| 1496 * included in all copies or substantial portions of the Software. | |
| 1497 * | |
| 1498 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
| 1499 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | |
| 1500 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
| 1501 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |
| 1502 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
| 1503 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
| 1504 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
| 1505 * OTHER DEALINGS IN THE SOFTWARE. | |
| 1506 */ | 
