mirror of
https://github.com/enduro2d/enduro2d.git
synced 2026-03-22 04:44:09 +07:00
update pugixml and rapidjson modules
This commit is contained in:
9
headers/3rdparty/pugixml/pugiconfig.hpp
vendored
9
headers/3rdparty/pugixml/pugiconfig.hpp
vendored
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* pugixml parser - version 1.10
|
||||
* pugixml parser - version 1.11
|
||||
* --------------------------------------------------------
|
||||
* Copyright (C) 2006-2019, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
|
||||
* Copyright (C) 2006-2020, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
|
||||
* Report bugs and download new versions at https://pugixml.org/
|
||||
*
|
||||
* This library is distributed under the MIT License. See notice at the end
|
||||
@@ -40,6 +40,9 @@
|
||||
// #define PUGIXML_MEMORY_OUTPUT_STACK 10240
|
||||
// #define PUGIXML_MEMORY_XPATH_PAGE_SIZE 4096
|
||||
|
||||
// Tune this constant to adjust max nesting for XPath queries
|
||||
// #define PUGIXML_XPATH_DEPTH_LIMIT 1024
|
||||
|
||||
// Uncomment this to switch to header-only version
|
||||
// #define PUGIXML_HEADER_ONLY
|
||||
|
||||
@@ -49,7 +52,7 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Copyright (c) 2006-2019 Arseny Kapoulkine
|
||||
* Copyright (c) 2006-2020 Arseny Kapoulkine
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
|
||||
38
headers/3rdparty/pugixml/pugixml.hpp
vendored
38
headers/3rdparty/pugixml/pugixml.hpp
vendored
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* pugixml parser - version 1.10
|
||||
* pugixml parser - version 1.11
|
||||
* --------------------------------------------------------
|
||||
* Copyright (C) 2006-2019, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
|
||||
* Copyright (C) 2006-2020, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
|
||||
* Report bugs and download new versions at https://pugixml.org/
|
||||
*
|
||||
* This library is distributed under the MIT License. See notice at the end
|
||||
@@ -14,7 +14,7 @@
|
||||
#ifndef PUGIXML_VERSION
|
||||
// Define version macro; evaluates to major * 1000 + minor * 10 + patch so that it's safe to use in less-than comparisons
|
||||
// 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
|
||||
# define PUGIXML_VERSION 1100
|
||||
# define PUGIXML_VERSION 1110
|
||||
#endif
|
||||
|
||||
// Include user configuration file (this can define various configuration macros)
|
||||
@@ -111,6 +111,15 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// If C++ is 2011 or higher, use 'nullptr'
|
||||
#ifndef PUGIXML_NULL
|
||||
# if __cplusplus >= 201103
|
||||
# define PUGIXML_NULL nullptr
|
||||
# else
|
||||
# define PUGIXML_NULL 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// Character interface macros
|
||||
#ifdef PUGIXML_WCHAR_MODE
|
||||
# define PUGIXML_TEXT(t) L ## t
|
||||
@@ -263,6 +272,9 @@ namespace pugi
|
||||
// Nodes are indented depending on their depth in DOM tree, a default declaration is output if document has none.
|
||||
const unsigned int format_default = format_indent;
|
||||
|
||||
const int default_double_precision = 17;
|
||||
const int default_float_precision = 9;
|
||||
|
||||
// Forward declarations
|
||||
struct xml_attribute_struct;
|
||||
struct xml_node_struct;
|
||||
@@ -410,7 +422,9 @@ namespace pugi
|
||||
bool set_value(long rhs);
|
||||
bool set_value(unsigned long rhs);
|
||||
bool set_value(double rhs);
|
||||
bool set_value(double rhs, int precision);
|
||||
bool set_value(float rhs);
|
||||
bool set_value(float rhs, int precision);
|
||||
bool set_value(bool rhs);
|
||||
|
||||
#ifdef PUGIXML_HAS_LONG_LONG
|
||||
@@ -576,10 +590,16 @@ namespace pugi
|
||||
bool remove_attribute(const xml_attribute& a);
|
||||
bool remove_attribute(const char_t* name);
|
||||
|
||||
// Remove all attributes
|
||||
bool remove_attributes();
|
||||
|
||||
// Remove specified child
|
||||
bool remove_child(const xml_node& n);
|
||||
bool remove_child(const char_t* name);
|
||||
|
||||
// Remove all children
|
||||
bool remove_children();
|
||||
|
||||
// Parses buffer as an XML document fragment and appends all nodes as children of the current node.
|
||||
// Copies/converts the buffer, so it may be deleted or changed after the function returns.
|
||||
// Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory.
|
||||
@@ -650,15 +670,15 @@ namespace pugi
|
||||
|
||||
#ifndef PUGIXML_NO_XPATH
|
||||
// Select single node by evaluating XPath query. Returns first node from the resulting node set.
|
||||
xpath_node select_node(const char_t* query, xpath_variable_set* variables = 0) const;
|
||||
xpath_node select_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const;
|
||||
xpath_node select_node(const xpath_query& query) const;
|
||||
|
||||
// Select node set by evaluating XPath query
|
||||
xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = 0) const;
|
||||
xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const;
|
||||
xpath_node_set select_nodes(const xpath_query& query) const;
|
||||
|
||||
// (deprecated: use select_node instead) Select single node by evaluating XPath query.
|
||||
PUGIXML_DEPRECATED xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = 0) const;
|
||||
PUGIXML_DEPRECATED xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL) const;
|
||||
PUGIXML_DEPRECATED xpath_node select_single_node(const xpath_query& query) const;
|
||||
|
||||
#endif
|
||||
@@ -761,7 +781,9 @@ namespace pugi
|
||||
bool set(long rhs);
|
||||
bool set(unsigned long rhs);
|
||||
bool set(double rhs);
|
||||
bool set(double rhs, int precision);
|
||||
bool set(float rhs);
|
||||
bool set(float rhs, int precision);
|
||||
bool set(bool rhs);
|
||||
|
||||
#ifdef PUGIXML_HAS_LONG_LONG
|
||||
@@ -1199,7 +1221,7 @@ namespace pugi
|
||||
public:
|
||||
// Construct a compiled object from XPath expression.
|
||||
// If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors.
|
||||
explicit xpath_query(const char_t* query, xpath_variable_set* variables = 0);
|
||||
explicit xpath_query(const char_t* query, xpath_variable_set* variables = PUGIXML_NULL);
|
||||
|
||||
// Constructor
|
||||
xpath_query();
|
||||
@@ -1452,7 +1474,7 @@ namespace std
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Copyright (c) 2006-2019 Arseny Kapoulkine
|
||||
* Copyright (c) 2006-2020 Arseny Kapoulkine
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
|
||||
10
headers/3rdparty/rapidjson/allocators.h
vendored
10
headers/3rdparty/rapidjson/allocators.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
@@ -77,19 +77,19 @@ public:
|
||||
static const bool kNeedFree = true;
|
||||
void* Malloc(size_t size) {
|
||||
if (size) // behavior of malloc(0) is implementation defined.
|
||||
return std::malloc(size);
|
||||
return RAPIDJSON_MALLOC(size);
|
||||
else
|
||||
return NULL; // standardize to returning NULL.
|
||||
}
|
||||
void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) {
|
||||
(void)originalSize;
|
||||
if (newSize == 0) {
|
||||
std::free(originalPtr);
|
||||
RAPIDJSON_FREE(originalPtr);
|
||||
return NULL;
|
||||
}
|
||||
return std::realloc(originalPtr, newSize);
|
||||
return RAPIDJSON_REALLOC(originalPtr, newSize);
|
||||
}
|
||||
static void Free(void *ptr) { std::free(ptr); }
|
||||
static void Free(void *ptr) { RAPIDJSON_FREE(ptr); }
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
29
headers/3rdparty/rapidjson/document.h
vendored
29
headers/3rdparty/rapidjson/document.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
@@ -289,12 +289,14 @@ class GenericMemberIterator;
|
||||
//! non-const GenericMemberIterator
|
||||
template <typename Encoding, typename Allocator>
|
||||
class GenericMemberIterator<false,Encoding,Allocator> {
|
||||
public:
|
||||
//! use plain pointer as iterator type
|
||||
typedef GenericMember<Encoding,Allocator>* Iterator;
|
||||
};
|
||||
//! const GenericMemberIterator
|
||||
template <typename Encoding, typename Allocator>
|
||||
class GenericMemberIterator<true,Encoding,Allocator> {
|
||||
public:
|
||||
//! use plain const pointer as iterator type
|
||||
typedef const GenericMember<Encoding,Allocator>* Iterator;
|
||||
};
|
||||
@@ -2001,17 +2003,18 @@ private:
|
||||
|
||||
// Initial flags of different types.
|
||||
kNullFlag = kNullType,
|
||||
kTrueFlag = kTrueType | kBoolFlag,
|
||||
kFalseFlag = kFalseType | kBoolFlag,
|
||||
kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag,
|
||||
kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag,
|
||||
kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag,
|
||||
kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag,
|
||||
kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag,
|
||||
kNumberAnyFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag,
|
||||
kConstStringFlag = kStringType | kStringFlag,
|
||||
kCopyStringFlag = kStringType | kStringFlag | kCopyFlag,
|
||||
kShortStringFlag = kStringType | kStringFlag | kCopyFlag | kInlineStrFlag,
|
||||
// These casts are added to suppress the warning on MSVC about bitwise operations between enums of different types.
|
||||
kTrueFlag = static_cast<int>(kTrueType) | static_cast<int>(kBoolFlag),
|
||||
kFalseFlag = static_cast<int>(kFalseType) | static_cast<int>(kBoolFlag),
|
||||
kNumberIntFlag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kIntFlag | kInt64Flag),
|
||||
kNumberUintFlag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag),
|
||||
kNumberInt64Flag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kInt64Flag),
|
||||
kNumberUint64Flag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kUint64Flag),
|
||||
kNumberDoubleFlag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kDoubleFlag),
|
||||
kNumberAnyFlag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag),
|
||||
kConstStringFlag = static_cast<int>(kStringType) | static_cast<int>(kStringFlag),
|
||||
kCopyStringFlag = static_cast<int>(kStringType) | static_cast<int>(kStringFlag | kCopyFlag),
|
||||
kShortStringFlag = static_cast<int>(kStringType) | static_cast<int>(kStringFlag | kCopyFlag | kInlineStrFlag),
|
||||
kObjectFlag = kObjectType,
|
||||
kArrayFlag = kArrayType,
|
||||
|
||||
@@ -2609,6 +2612,7 @@ public:
|
||||
GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; }
|
||||
~GenericArray() {}
|
||||
|
||||
operator ValueType&() const { return value_; }
|
||||
SizeType Size() const { return value_.Size(); }
|
||||
SizeType Capacity() const { return value_.Capacity(); }
|
||||
bool Empty() const { return value_.Empty(); }
|
||||
@@ -2664,6 +2668,7 @@ public:
|
||||
GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; }
|
||||
~GenericObject() {}
|
||||
|
||||
operator ValueType&() const { return value_; }
|
||||
SizeType MemberCount() const { return value_.MemberCount(); }
|
||||
SizeType MemberCapacity() const { return value_.MemberCapacity(); }
|
||||
bool ObjectEmpty() const { return value_.ObjectEmpty(); }
|
||||
|
||||
2
headers/3rdparty/rapidjson/encodedstream.h
vendored
2
headers/3rdparty/rapidjson/encodedstream.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/encodings.h
vendored
2
headers/3rdparty/rapidjson/encodings.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/error/en.h
vendored
2
headers/3rdparty/rapidjson/error/en.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/error/error.h
vendored
2
headers/3rdparty/rapidjson/error/error.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/filereadstream.h
vendored
2
headers/3rdparty/rapidjson/filereadstream.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/filewritestream.h
vendored
2
headers/3rdparty/rapidjson/filewritestream.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/fwd.h
vendored
2
headers/3rdparty/rapidjson/fwd.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
8
headers/3rdparty/rapidjson/internal/clzll.h
vendored
8
headers/3rdparty/rapidjson/internal/clzll.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
#include "../rapidjson.h"
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#if defined(_MSC_VER) && !defined(UNDER_CE)
|
||||
#include <intrin.h>
|
||||
#if defined(_WIN64)
|
||||
#pragma intrinsic(_BitScanReverse64)
|
||||
@@ -34,7 +34,7 @@ inline uint32_t clzll(uint64_t x) {
|
||||
// infinite loop in the software implementation.
|
||||
RAPIDJSON_ASSERT(x != 0);
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#if defined(_MSC_VER) && !defined(UNDER_CE)
|
||||
unsigned long r = 0;
|
||||
#if defined(_WIN64)
|
||||
_BitScanReverse64(&r, x);
|
||||
@@ -53,7 +53,7 @@ inline uint32_t clzll(uint64_t x) {
|
||||
return static_cast<uint32_t>(__builtin_clzll(x));
|
||||
#else
|
||||
// naive version
|
||||
uint32_t r;
|
||||
uint32_t r = 0;
|
||||
while (!(x & (static_cast<uint64_t>(1) << 63))) {
|
||||
x <<= 1;
|
||||
++r;
|
||||
|
||||
2
headers/3rdparty/rapidjson/internal/diyfp.h
vendored
2
headers/3rdparty/rapidjson/internal/diyfp.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/internal/dtoa.h
vendored
2
headers/3rdparty/rapidjson/internal/dtoa.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/internal/itoa.h
vendored
2
headers/3rdparty/rapidjson/internal/itoa.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/internal/meta.h
vendored
2
headers/3rdparty/rapidjson/internal/meta.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/internal/pow10.h
vendored
2
headers/3rdparty/rapidjson/internal/pow10.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/internal/regex.h
vendored
2
headers/3rdparty/rapidjson/internal/regex.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/internal/stack.h
vendored
2
headers/3rdparty/rapidjson/internal/stack.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/internal/strtod.h
vendored
2
headers/3rdparty/rapidjson/internal/strtod.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/internal/swap.h
vendored
2
headers/3rdparty/rapidjson/internal/swap.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/istreamwrapper.h
vendored
2
headers/3rdparty/rapidjson/istreamwrapper.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/memorybuffer.h
vendored
2
headers/3rdparty/rapidjson/memorybuffer.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/memorystream.h
vendored
2
headers/3rdparty/rapidjson/memorystream.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/ostreamwrapper.h
vendored
2
headers/3rdparty/rapidjson/ostreamwrapper.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/pointer.h
vendored
2
headers/3rdparty/rapidjson/pointer.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/prettywriter.h
vendored
2
headers/3rdparty/rapidjson/prettywriter.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
18
headers/3rdparty/rapidjson/rapidjson.h
vendored
18
headers/3rdparty/rapidjson/rapidjson.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
@@ -639,6 +639,22 @@ RAPIDJSON_NAMESPACE_END
|
||||
#endif // RAPIDJSON_ASSERT_THROWS
|
||||
#endif // RAPIDJSON_NOEXCEPT_ASSERT
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// malloc/realloc/free
|
||||
|
||||
#ifndef RAPIDJSON_MALLOC
|
||||
///! customization point for global \c malloc
|
||||
#define RAPIDJSON_MALLOC(size) std::malloc(size)
|
||||
#endif
|
||||
#ifndef RAPIDJSON_REALLOC
|
||||
///! customization point for global \c realloc
|
||||
#define RAPIDJSON_REALLOC(ptr, new_size) std::realloc(ptr, new_size)
|
||||
#endif
|
||||
#ifndef RAPIDJSON_FREE
|
||||
///! customization point for global \c free
|
||||
#define RAPIDJSON_FREE(ptr) std::free(ptr)
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// new/delete
|
||||
|
||||
|
||||
26
headers/3rdparty/rapidjson/reader.h
vendored
26
headers/3rdparty/rapidjson/reader.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
@@ -1023,15 +1023,23 @@ private:
|
||||
is.Take();
|
||||
unsigned codepoint = ParseHex4(is, escapeOffset);
|
||||
RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
|
||||
if (RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDBFF)) {
|
||||
// Handle UTF-16 surrogate pair
|
||||
if (RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u')))
|
||||
if (RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDFFF)) {
|
||||
// high surrogate, check if followed by valid low surrogate
|
||||
if (RAPIDJSON_LIKELY(codepoint <= 0xDBFF)) {
|
||||
// Handle UTF-16 surrogate pair
|
||||
if (RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u')))
|
||||
RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset);
|
||||
unsigned codepoint2 = ParseHex4(is, escapeOffset);
|
||||
RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
|
||||
if (RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF))
|
||||
RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset);
|
||||
codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
|
||||
}
|
||||
// single low surrogate
|
||||
else
|
||||
{
|
||||
RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset);
|
||||
unsigned codepoint2 = ParseHex4(is, escapeOffset);
|
||||
RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
|
||||
if (RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF))
|
||||
RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset);
|
||||
codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
|
||||
}
|
||||
}
|
||||
TEncoding::Encode(os, codepoint);
|
||||
}
|
||||
|
||||
2
headers/3rdparty/rapidjson/stream.h
vendored
2
headers/3rdparty/rapidjson/stream.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
2
headers/3rdparty/rapidjson/stringbuffer.h
vendored
2
headers/3rdparty/rapidjson/stringbuffer.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
|
||||
6
headers/3rdparty/rapidjson/writer.h
vendored
6
headers/3rdparty/rapidjson/writer.h
vendored
@@ -1,6 +1,6 @@
|
||||
// Tencent is pleased to support the open source community by making RapidJSON available.
|
||||
//
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
|
||||
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
|
||||
//
|
||||
// Licensed under the MIT License (the "License"); you may not use this file except
|
||||
// in compliance with the License. You may obtain a copy of the License at
|
||||
@@ -283,6 +283,8 @@ public:
|
||||
os_->Flush();
|
||||
}
|
||||
|
||||
static const size_t kDefaultLevelDepth = 32;
|
||||
|
||||
protected:
|
||||
//! Information for each nested level
|
||||
struct Level {
|
||||
@@ -291,8 +293,6 @@ protected:
|
||||
bool inArray; //!< true if in array, otherwise in object
|
||||
};
|
||||
|
||||
static const size_t kDefaultLevelDepth = 32;
|
||||
|
||||
bool WriteNull() {
|
||||
PutReserve(*os_, 4);
|
||||
PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true;
|
||||
|
||||
Submodule modules/pugixml updated: 3c59df555b...08b3433180
Submodule modules/rapidjson updated: 8f4c021fa2...585042c02b
385
sources/3rdparty/pugixml/pugixml.cpp
vendored
385
sources/3rdparty/pugixml/pugixml.cpp
vendored
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* pugixml parser - version 1.10
|
||||
* pugixml parser - version 1.11
|
||||
* --------------------------------------------------------
|
||||
* Copyright (C) 2006-2019, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
|
||||
* Copyright (C) 2006-2020, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
|
||||
* Report bugs and download new versions at https://pugixml.org/
|
||||
*
|
||||
* This library is distributed under the MIT License. See notice at the end
|
||||
@@ -378,7 +378,7 @@ PUGI__NS_BEGIN
|
||||
|
||||
static PUGI__UNSIGNED_OVERFLOW unsigned int hash(const void* key)
|
||||
{
|
||||
unsigned int h = static_cast<unsigned int>(reinterpret_cast<uintptr_t>(key));
|
||||
unsigned int h = static_cast<unsigned int>(reinterpret_cast<uintptr_t>(key) & 0xffffffff);
|
||||
|
||||
// MurmurHash3 32-bit finalizer
|
||||
h ^= h >> 16;
|
||||
@@ -4435,6 +4435,9 @@ PUGI__NS_BEGIN
|
||||
|
||||
while (sit && sit != sn)
|
||||
{
|
||||
// loop invariant: dit is inside the subtree rooted at dn
|
||||
assert(dit);
|
||||
|
||||
// when a tree is copied into one of the descendants, we need to skip that subtree to avoid an infinite loop
|
||||
if (sit != dn)
|
||||
{
|
||||
@@ -4464,9 +4467,14 @@ PUGI__NS_BEGIN
|
||||
|
||||
sit = sit->parent;
|
||||
dit = dit->parent;
|
||||
|
||||
// loop invariant: dit is inside the subtree rooted at dn while sit is inside sn
|
||||
assert(sit == sn || dit);
|
||||
}
|
||||
while (sit != sn);
|
||||
}
|
||||
|
||||
assert(!sit || dit == dn->parent);
|
||||
}
|
||||
|
||||
PUGI__FN void node_copy_attribute(xml_attribute_struct* da, xml_attribute_struct* sa)
|
||||
@@ -4665,19 +4673,19 @@ PUGI__NS_BEGIN
|
||||
}
|
||||
|
||||
template <typename String, typename Header>
|
||||
PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, float value)
|
||||
PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, float value, int precision)
|
||||
{
|
||||
char buf[128];
|
||||
PUGI__SNPRINTF(buf, "%.9g", double(value));
|
||||
PUGI__SNPRINTF(buf, "%.*g", precision, double(value));
|
||||
|
||||
return set_value_ascii(dest, header, header_mask, buf);
|
||||
}
|
||||
|
||||
template <typename String, typename Header>
|
||||
PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, double value)
|
||||
PUGI__FN bool set_value_convert(String& dest, Header& header, uintptr_t header_mask, double value, int precision)
|
||||
{
|
||||
char buf[128];
|
||||
PUGI__SNPRINTF(buf, "%.17g", value);
|
||||
PUGI__SNPRINTF(buf, "%.*g", precision, value);
|
||||
|
||||
return set_value_ascii(dest, header, header_mask, buf);
|
||||
}
|
||||
@@ -4973,7 +4981,12 @@ PUGI__NS_BEGIN
|
||||
#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) || (defined(__MINGW32__) && (!defined(__STRICT_ANSI__) || defined(__MINGW64_VERSION_MAJOR)))
|
||||
PUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode)
|
||||
{
|
||||
#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400
|
||||
FILE* file = 0;
|
||||
return _wfopen_s(&file, path, mode) == 0 ? file : 0;
|
||||
#else
|
||||
return _wfopen(path, mode);
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
PUGI__FN char* convert_path_heap(const wchar_t* str)
|
||||
@@ -5017,6 +5030,16 @@ PUGI__NS_BEGIN
|
||||
}
|
||||
#endif
|
||||
|
||||
PUGI__FN FILE* open_file(const char* path, const char* mode)
|
||||
{
|
||||
#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400
|
||||
FILE* file = 0;
|
||||
return fopen_s(&file, path, mode) == 0 ? file : 0;
|
||||
#else
|
||||
return fopen(path, mode);
|
||||
#endif
|
||||
}
|
||||
|
||||
PUGI__FN bool save_file_impl(const xml_document& doc, FILE* file, const char_t* indent, unsigned int flags, xml_encoding encoding)
|
||||
{
|
||||
if (!file) return false;
|
||||
@@ -5342,14 +5365,28 @@ namespace pugi
|
||||
{
|
||||
if (!_attr) return false;
|
||||
|
||||
return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
|
||||
return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, default_double_precision);
|
||||
}
|
||||
|
||||
PUGI__FN bool xml_attribute::set_value(double rhs, int precision)
|
||||
{
|
||||
if (!_attr) return false;
|
||||
|
||||
return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, precision);
|
||||
}
|
||||
|
||||
PUGI__FN bool xml_attribute::set_value(float rhs)
|
||||
{
|
||||
if (!_attr) return false;
|
||||
|
||||
return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
|
||||
return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, default_float_precision);
|
||||
}
|
||||
|
||||
PUGI__FN bool xml_attribute::set_value(float rhs, int precision)
|
||||
{
|
||||
if (!_attr) return false;
|
||||
|
||||
return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs, precision);
|
||||
}
|
||||
|
||||
PUGI__FN bool xml_attribute::set_value(bool rhs)
|
||||
@@ -6059,6 +6096,27 @@ namespace pugi
|
||||
return true;
|
||||
}
|
||||
|
||||
PUGI__FN bool xml_node::remove_attributes()
|
||||
{
|
||||
if (!_root) return false;
|
||||
|
||||
impl::xml_allocator& alloc = impl::get_allocator(_root);
|
||||
if (!alloc.reserve()) return false;
|
||||
|
||||
for (xml_attribute_struct* attr = _root->first_attribute; attr; )
|
||||
{
|
||||
xml_attribute_struct* next = attr->next_attribute;
|
||||
|
||||
impl::destroy_attribute(attr, alloc);
|
||||
|
||||
attr = next;
|
||||
}
|
||||
|
||||
_root->first_attribute = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
PUGI__FN bool xml_node::remove_child(const char_t* name_)
|
||||
{
|
||||
return remove_child(child(name_));
|
||||
@@ -6077,6 +6135,27 @@ namespace pugi
|
||||
return true;
|
||||
}
|
||||
|
||||
PUGI__FN bool xml_node::remove_children()
|
||||
{
|
||||
if (!_root) return false;
|
||||
|
||||
impl::xml_allocator& alloc = impl::get_allocator(_root);
|
||||
if (!alloc.reserve()) return false;
|
||||
|
||||
for (xml_node_struct* cur = _root->first_child; cur; )
|
||||
{
|
||||
xml_node_struct* next = cur->next_sibling;
|
||||
|
||||
impl::destroy_node(cur, alloc);
|
||||
|
||||
cur = next;
|
||||
}
|
||||
|
||||
_root->first_child = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
PUGI__FN xml_parse_result xml_node::append_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding)
|
||||
{
|
||||
// append_buffer is only valid for elements/documents
|
||||
@@ -6177,16 +6256,9 @@ namespace pugi
|
||||
|
||||
PUGI__FN xml_node xml_node::first_element_by_path(const char_t* path_, char_t delimiter) const
|
||||
{
|
||||
xml_node found = *this; // Current search context.
|
||||
xml_node context = path_[0] == delimiter ? root() : *this;
|
||||
|
||||
if (!_root || !path_[0]) return found;
|
||||
|
||||
if (path_[0] == delimiter)
|
||||
{
|
||||
// Absolute path; e.g. '/foo/bar'
|
||||
found = found.root();
|
||||
++path_;
|
||||
}
|
||||
if (!context._root) return xml_node();
|
||||
|
||||
const char_t* path_segment = path_;
|
||||
|
||||
@@ -6196,19 +6268,19 @@ namespace pugi
|
||||
|
||||
while (*path_segment_end && *path_segment_end != delimiter) ++path_segment_end;
|
||||
|
||||
if (path_segment == path_segment_end) return found;
|
||||
if (path_segment == path_segment_end) return context;
|
||||
|
||||
const char_t* next_segment = path_segment_end;
|
||||
|
||||
while (*next_segment == delimiter) ++next_segment;
|
||||
|
||||
if (*path_segment == '.' && path_segment + 1 == path_segment_end)
|
||||
return found.first_element_by_path(next_segment, delimiter);
|
||||
return context.first_element_by_path(next_segment, delimiter);
|
||||
else if (*path_segment == '.' && *(path_segment+1) == '.' && path_segment + 2 == path_segment_end)
|
||||
return found.parent().first_element_by_path(next_segment, delimiter);
|
||||
return context.parent().first_element_by_path(next_segment, delimiter);
|
||||
else
|
||||
{
|
||||
for (xml_node_struct* j = found._root->first_child; j; j = j->next_sibling)
|
||||
for (xml_node_struct* j = context._root->first_child; j; j = j->next_sibling)
|
||||
{
|
||||
if (j->name && impl::strequalrange(j->name, path_segment, static_cast<size_t>(path_segment_end - path_segment)))
|
||||
{
|
||||
@@ -6503,14 +6575,28 @@ namespace pugi
|
||||
{
|
||||
xml_node_struct* dn = _data_new();
|
||||
|
||||
return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
|
||||
return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, default_float_precision) : false;
|
||||
}
|
||||
|
||||
PUGI__FN bool xml_text::set(float rhs, int precision)
|
||||
{
|
||||
xml_node_struct* dn = _data_new();
|
||||
|
||||
return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, precision) : false;
|
||||
}
|
||||
|
||||
PUGI__FN bool xml_text::set(double rhs)
|
||||
{
|
||||
xml_node_struct* dn = _data_new();
|
||||
|
||||
return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
|
||||
return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, default_double_precision) : false;
|
||||
}
|
||||
|
||||
PUGI__FN bool xml_text::set(double rhs, int precision)
|
||||
{
|
||||
xml_node_struct* dn = _data_new();
|
||||
|
||||
return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs, precision) : false;
|
||||
}
|
||||
|
||||
PUGI__FN bool xml_text::set(bool rhs)
|
||||
@@ -6886,8 +6972,7 @@ namespace pugi
|
||||
{
|
||||
reset();
|
||||
|
||||
for (xml_node cur = proto.first_child(); cur; cur = cur.next_sibling())
|
||||
append_copy(cur);
|
||||
impl::node_copy_tree(_root, proto._root);
|
||||
}
|
||||
|
||||
PUGI__FN void xml_document::_create()
|
||||
@@ -7117,7 +7202,7 @@ namespace pugi
|
||||
reset();
|
||||
|
||||
using impl::auto_deleter; // MSVC7 workaround
|
||||
auto_deleter<FILE> file(fopen(path_, "rb"), impl::close_file);
|
||||
auto_deleter<FILE> file(impl::open_file(path_, "rb"), impl::close_file);
|
||||
|
||||
return impl::load_file_impl(static_cast<impl::xml_document_struct*>(_root), file.data, options, encoding, &_buffer);
|
||||
}
|
||||
@@ -7200,7 +7285,7 @@ namespace pugi
|
||||
PUGI__FN bool xml_document::save_file(const char* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const
|
||||
{
|
||||
using impl::auto_deleter; // MSVC7 workaround
|
||||
auto_deleter<FILE> file(fopen(path_, (flags & format_save_file_text) ? "w" : "wb"), impl::close_file);
|
||||
auto_deleter<FILE> file(impl::open_file(path_, (flags & format_save_file_text) ? "w" : "wb"), impl::close_file);
|
||||
|
||||
return impl::save_file_impl(*this, file.data, indent, flags, encoding);
|
||||
}
|
||||
@@ -9686,7 +9771,7 @@ PUGI__NS_BEGIN
|
||||
{
|
||||
xpath_context c(*it, i, size);
|
||||
|
||||
if (expr->eval_number(c, stack) == i)
|
||||
if (expr->eval_number(c, stack) == static_cast<double>(i))
|
||||
{
|
||||
*last++ = *it;
|
||||
|
||||
@@ -9710,11 +9795,11 @@ PUGI__NS_BEGIN
|
||||
|
||||
double er = expr->eval_number(c, stack);
|
||||
|
||||
if (er >= 1.0 && er <= size)
|
||||
if (er >= 1.0 && er <= static_cast<double>(size))
|
||||
{
|
||||
size_t eri = static_cast<size_t>(er);
|
||||
|
||||
if (er == eri)
|
||||
if (er == static_cast<double>(eri))
|
||||
{
|
||||
xpath_node r = last[eri - 1];
|
||||
|
||||
@@ -10351,35 +10436,38 @@ PUGI__NS_BEGIN
|
||||
|
||||
if (_rettype == xpath_type_boolean)
|
||||
return _data.variable->get_boolean();
|
||||
|
||||
// variable needs to be converted to the correct type, this is handled by the fallthrough block below
|
||||
break;
|
||||
}
|
||||
|
||||
// fallthrough
|
||||
default:
|
||||
{
|
||||
switch (_rettype)
|
||||
{
|
||||
case xpath_type_number:
|
||||
return convert_number_to_boolean(eval_number(c, stack));
|
||||
|
||||
case xpath_type_string:
|
||||
{
|
||||
xpath_allocator_capture cr(stack.result);
|
||||
|
||||
return !eval_string(c, stack).empty();
|
||||
}
|
||||
|
||||
case xpath_type_node_set:
|
||||
{
|
||||
xpath_allocator_capture cr(stack.result);
|
||||
|
||||
return !eval_node_set(c, stack, nodeset_eval_any).empty();
|
||||
}
|
||||
|
||||
default:
|
||||
assert(false && "Wrong expression for return type boolean"); // unreachable
|
||||
return false;
|
||||
}
|
||||
;
|
||||
}
|
||||
|
||||
// none of the ast types that return the value directly matched, we need to perform type conversion
|
||||
switch (_rettype)
|
||||
{
|
||||
case xpath_type_number:
|
||||
return convert_number_to_boolean(eval_number(c, stack));
|
||||
|
||||
case xpath_type_string:
|
||||
{
|
||||
xpath_allocator_capture cr(stack.result);
|
||||
|
||||
return !eval_string(c, stack).empty();
|
||||
}
|
||||
|
||||
case xpath_type_node_set:
|
||||
{
|
||||
xpath_allocator_capture cr(stack.result);
|
||||
|
||||
return !eval_node_set(c, stack, nodeset_eval_any).empty();
|
||||
}
|
||||
|
||||
default:
|
||||
assert(false && "Wrong expression for return type boolean"); // unreachable
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10486,36 +10574,38 @@ PUGI__NS_BEGIN
|
||||
|
||||
if (_rettype == xpath_type_number)
|
||||
return _data.variable->get_number();
|
||||
|
||||
// variable needs to be converted to the correct type, this is handled by the fallthrough block below
|
||||
break;
|
||||
}
|
||||
|
||||
// fallthrough
|
||||
default:
|
||||
{
|
||||
switch (_rettype)
|
||||
{
|
||||
case xpath_type_boolean:
|
||||
return eval_boolean(c, stack) ? 1 : 0;
|
||||
|
||||
case xpath_type_string:
|
||||
{
|
||||
xpath_allocator_capture cr(stack.result);
|
||||
|
||||
return convert_string_to_number(eval_string(c, stack).c_str());
|
||||
}
|
||||
|
||||
case xpath_type_node_set:
|
||||
{
|
||||
xpath_allocator_capture cr(stack.result);
|
||||
|
||||
return convert_string_to_number(eval_string(c, stack).c_str());
|
||||
}
|
||||
|
||||
default:
|
||||
assert(false && "Wrong expression for return type number"); // unreachable
|
||||
return 0;
|
||||
}
|
||||
|
||||
;
|
||||
}
|
||||
|
||||
// none of the ast types that return the value directly matched, we need to perform type conversion
|
||||
switch (_rettype)
|
||||
{
|
||||
case xpath_type_boolean:
|
||||
return eval_boolean(c, stack) ? 1 : 0;
|
||||
|
||||
case xpath_type_string:
|
||||
{
|
||||
xpath_allocator_capture cr(stack.result);
|
||||
|
||||
return convert_string_to_number(eval_string(c, stack).c_str());
|
||||
}
|
||||
|
||||
case xpath_type_node_set:
|
||||
{
|
||||
xpath_allocator_capture cr(stack.result);
|
||||
|
||||
return convert_string_to_number(eval_string(c, stack).c_str());
|
||||
}
|
||||
|
||||
default:
|
||||
assert(false && "Wrong expression for return type number"); // unreachable
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10672,7 +10762,7 @@ PUGI__NS_BEGIN
|
||||
double first = round_nearest(_right->eval_number(c, stack));
|
||||
|
||||
if (is_nan(first)) return xpath_string(); // NaN
|
||||
else if (first >= s_length + 1) return xpath_string();
|
||||
else if (first >= static_cast<double>(s_length + 1)) return xpath_string();
|
||||
|
||||
size_t pos = first < 1 ? 1 : static_cast<size_t>(first);
|
||||
assert(1 <= pos && pos <= s_length + 1);
|
||||
@@ -10696,12 +10786,12 @@ PUGI__NS_BEGIN
|
||||
double last = first + round_nearest(_right->_next->eval_number(c, stack));
|
||||
|
||||
if (is_nan(first) || is_nan(last)) return xpath_string();
|
||||
else if (first >= s_length + 1) return xpath_string();
|
||||
else if (first >= static_cast<double>(s_length + 1)) return xpath_string();
|
||||
else if (first >= last) return xpath_string();
|
||||
else if (last < 1) return xpath_string();
|
||||
|
||||
size_t pos = first < 1 ? 1 : static_cast<size_t>(first);
|
||||
size_t end = last >= s_length + 1 ? s_length + 1 : static_cast<size_t>(last);
|
||||
size_t end = last >= static_cast<double>(s_length + 1) ? s_length + 1 : static_cast<size_t>(last);
|
||||
|
||||
assert(1 <= pos && pos <= end && end <= s_length + 1);
|
||||
const char_t* rbegin = s.c_str() + (pos - 1);
|
||||
@@ -10770,34 +10860,37 @@ PUGI__NS_BEGIN
|
||||
|
||||
if (_rettype == xpath_type_string)
|
||||
return xpath_string::from_const(_data.variable->get_string());
|
||||
|
||||
// variable needs to be converted to the correct type, this is handled by the fallthrough block below
|
||||
break;
|
||||
}
|
||||
|
||||
// fallthrough
|
||||
default:
|
||||
{
|
||||
switch (_rettype)
|
||||
{
|
||||
case xpath_type_boolean:
|
||||
return xpath_string::from_const(eval_boolean(c, stack) ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false"));
|
||||
|
||||
case xpath_type_number:
|
||||
return convert_number_to_string(eval_number(c, stack), stack.result);
|
||||
|
||||
case xpath_type_node_set:
|
||||
{
|
||||
xpath_allocator_capture cr(stack.temp);
|
||||
|
||||
xpath_stack swapped_stack = {stack.temp, stack.result};
|
||||
|
||||
xpath_node_set_raw ns = eval_node_set(c, swapped_stack, nodeset_eval_first);
|
||||
return ns.empty() ? xpath_string() : string_value(ns.first(), stack.result);
|
||||
}
|
||||
|
||||
default:
|
||||
assert(false && "Wrong expression for return type string"); // unreachable
|
||||
return xpath_string();
|
||||
}
|
||||
;
|
||||
}
|
||||
|
||||
// none of the ast types that return the value directly matched, we need to perform type conversion
|
||||
switch (_rettype)
|
||||
{
|
||||
case xpath_type_boolean:
|
||||
return xpath_string::from_const(eval_boolean(c, stack) ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false"));
|
||||
|
||||
case xpath_type_number:
|
||||
return convert_number_to_string(eval_number(c, stack), stack.result);
|
||||
|
||||
case xpath_type_node_set:
|
||||
{
|
||||
xpath_allocator_capture cr(stack.temp);
|
||||
|
||||
xpath_stack swapped_stack = {stack.temp, stack.result};
|
||||
|
||||
xpath_node_set_raw ns = eval_node_set(c, swapped_stack, nodeset_eval_first);
|
||||
return ns.empty() ? xpath_string() : string_value(ns.first(), stack.result);
|
||||
}
|
||||
|
||||
default:
|
||||
assert(false && "Wrong expression for return type string"); // unreachable
|
||||
return xpath_string();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10919,13 +11012,18 @@ PUGI__NS_BEGIN
|
||||
|
||||
return ns;
|
||||
}
|
||||
|
||||
// variable needs to be converted to the correct type, this is handled by the fallthrough block below
|
||||
break;
|
||||
}
|
||||
|
||||
// fallthrough
|
||||
default:
|
||||
assert(false && "Wrong expression for return type node set"); // unreachable
|
||||
return xpath_node_set_raw();
|
||||
;
|
||||
}
|
||||
|
||||
// none of the ast types that return the value directly matched, but conversions to node set are invalid
|
||||
assert(false && "Wrong expression for return type node set"); // unreachable
|
||||
return xpath_node_set_raw();
|
||||
}
|
||||
|
||||
void optimize(xpath_allocator* alloc)
|
||||
@@ -11060,6 +11158,14 @@ PUGI__NS_BEGIN
|
||||
}
|
||||
};
|
||||
|
||||
static const size_t xpath_ast_depth_limit =
|
||||
#ifdef PUGIXML_XPATH_DEPTH_LIMIT
|
||||
PUGIXML_XPATH_DEPTH_LIMIT
|
||||
#else
|
||||
1024
|
||||
#endif
|
||||
;
|
||||
|
||||
struct xpath_parser
|
||||
{
|
||||
xpath_allocator* _alloc;
|
||||
@@ -11072,6 +11178,8 @@ PUGI__NS_BEGIN
|
||||
|
||||
char_t _scratch[32];
|
||||
|
||||
size_t _depth;
|
||||
|
||||
xpath_ast_node* error(const char* message)
|
||||
{
|
||||
_result->error = message;
|
||||
@@ -11088,6 +11196,11 @@ PUGI__NS_BEGIN
|
||||
return 0;
|
||||
}
|
||||
|
||||
xpath_ast_node* error_rec()
|
||||
{
|
||||
return error("Exceeded maximum allowed query depth");
|
||||
}
|
||||
|
||||
void* alloc_node()
|
||||
{
|
||||
return _alloc->allocate(sizeof(xpath_ast_node));
|
||||
@@ -11443,6 +11556,8 @@ PUGI__NS_BEGIN
|
||||
return error("Unrecognized function call");
|
||||
_lexer.next();
|
||||
|
||||
size_t old_depth = _depth;
|
||||
|
||||
while (_lexer.current() != lex_close_brace)
|
||||
{
|
||||
if (argc > 0)
|
||||
@@ -11452,6 +11567,9 @@ PUGI__NS_BEGIN
|
||||
_lexer.next();
|
||||
}
|
||||
|
||||
if (++_depth > xpath_ast_depth_limit)
|
||||
return error_rec();
|
||||
|
||||
xpath_ast_node* n = parse_expression();
|
||||
if (!n) return 0;
|
||||
|
||||
@@ -11464,6 +11582,8 @@ PUGI__NS_BEGIN
|
||||
|
||||
_lexer.next();
|
||||
|
||||
_depth = old_depth;
|
||||
|
||||
return parse_function(function, argc, args);
|
||||
}
|
||||
|
||||
@@ -11480,10 +11600,15 @@ PUGI__NS_BEGIN
|
||||
xpath_ast_node* n = parse_primary_expression();
|
||||
if (!n) return 0;
|
||||
|
||||
size_t old_depth = _depth;
|
||||
|
||||
while (_lexer.current() == lex_open_square_brace)
|
||||
{
|
||||
_lexer.next();
|
||||
|
||||
if (++_depth > xpath_ast_depth_limit)
|
||||
return error_rec();
|
||||
|
||||
if (n->rettype() != xpath_type_node_set)
|
||||
return error("Predicate has to be applied to node set");
|
||||
|
||||
@@ -11499,6 +11624,8 @@ PUGI__NS_BEGIN
|
||||
_lexer.next();
|
||||
}
|
||||
|
||||
_depth = old_depth;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
@@ -11650,12 +11777,17 @@ PUGI__NS_BEGIN
|
||||
xpath_ast_node* n = alloc_node(ast_step, set, axis, nt_type, nt_name_copy);
|
||||
if (!n) return 0;
|
||||
|
||||
size_t old_depth = _depth;
|
||||
|
||||
xpath_ast_node* last = 0;
|
||||
|
||||
while (_lexer.current() == lex_open_square_brace)
|
||||
{
|
||||
_lexer.next();
|
||||
|
||||
if (++_depth > xpath_ast_depth_limit)
|
||||
return error_rec();
|
||||
|
||||
xpath_ast_node* expr = parse_expression();
|
||||
if (!expr) return 0;
|
||||
|
||||
@@ -11672,6 +11804,8 @@ PUGI__NS_BEGIN
|
||||
last = pred;
|
||||
}
|
||||
|
||||
_depth = old_depth;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
@@ -11681,11 +11815,16 @@ PUGI__NS_BEGIN
|
||||
xpath_ast_node* n = parse_step(set);
|
||||
if (!n) return 0;
|
||||
|
||||
size_t old_depth = _depth;
|
||||
|
||||
while (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash)
|
||||
{
|
||||
lexeme_t l = _lexer.current();
|
||||
_lexer.next();
|
||||
|
||||
if (++_depth > xpath_ast_depth_limit)
|
||||
return error_rec();
|
||||
|
||||
if (l == lex_double_slash)
|
||||
{
|
||||
n = alloc_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0);
|
||||
@@ -11696,6 +11835,8 @@ PUGI__NS_BEGIN
|
||||
if (!n) return 0;
|
||||
}
|
||||
|
||||
_depth = old_depth;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
@@ -11881,6 +12022,9 @@ PUGI__NS_BEGIN
|
||||
{
|
||||
_lexer.next();
|
||||
|
||||
if (++_depth > xpath_ast_depth_limit)
|
||||
return error_rec();
|
||||
|
||||
xpath_ast_node* rhs = parse_path_or_unary_expression();
|
||||
if (!rhs) return 0;
|
||||
|
||||
@@ -11926,13 +12070,22 @@ PUGI__NS_BEGIN
|
||||
// | MultiplicativeExpr 'mod' UnaryExpr
|
||||
xpath_ast_node* parse_expression(int limit = 0)
|
||||
{
|
||||
size_t old_depth = _depth;
|
||||
|
||||
if (++_depth > xpath_ast_depth_limit)
|
||||
return error_rec();
|
||||
|
||||
xpath_ast_node* n = parse_path_or_unary_expression();
|
||||
if (!n) return 0;
|
||||
|
||||
return parse_expression_rec(n, limit);
|
||||
n = parse_expression_rec(n, limit);
|
||||
|
||||
_depth = old_depth;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
xpath_parser(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result): _alloc(alloc), _lexer(query), _query(query), _variables(variables), _result(result)
|
||||
xpath_parser(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result): _alloc(alloc), _lexer(query), _query(query), _variables(variables), _result(result), _depth(0)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -11941,6 +12094,8 @@ PUGI__NS_BEGIN
|
||||
xpath_ast_node* n = parse_expression();
|
||||
if (!n) return 0;
|
||||
|
||||
assert(_depth == 0);
|
||||
|
||||
// check if there are unparsed tokens left
|
||||
if (_lexer.current() != lex_eof)
|
||||
return error("Incorrect query");
|
||||
@@ -12840,7 +12995,7 @@ namespace pugi
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Copyright (c) 2006-2019 Arseny Kapoulkine
|
||||
* Copyright (c) 2006-2020 Arseny Kapoulkine
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
|
||||
Reference in New Issue
Block a user