diff --git a/doc/developer-guide/api/functions/TSRPCRegister.en.rst b/doc/developer-guide/api/functions/TSRPCRegister.en.rst index 8bb2ce3dafe..0f4a53c2fe1 100644 --- a/doc/developer-guide/api/functions/TSRPCRegister.en.rst +++ b/doc/developer-guide/api/functions/TSRPCRegister.en.rst @@ -79,7 +79,7 @@ Description .. code-block:: cpp - TSRPCProviderHandle info = TSRPCRegister("FooBar's Plugin!", 16, "0.7.0", 5); + TSRPCProviderHandle info = TSRPCRegister("FooBar's Plugin!", 16, "0.8.0", 5); ... TSRPCHandlerOptions opt{{true}}; TSRPCRegisterMethodHandler("my_join_string_handler", 22, func, info, &opt); diff --git a/doc/developer-guide/jsonrpc/jsonrpc-handler-development.en.rst b/doc/developer-guide/jsonrpc/jsonrpc-handler-development.en.rst index c87f8e455f8..18cb9d68137 100644 --- a/doc/developer-guide/jsonrpc/jsonrpc-handler-development.en.rst +++ b/doc/developer-guide/jsonrpc/jsonrpc-handler-development.en.rst @@ -202,7 +202,7 @@ RPC method registration and implementation examples #include namespace { - static const std::string MY_YAML_VERSION{"0.7.0"}; + static const std::string MY_YAML_VERSION{"0.8.0"}; } void @@ -231,7 +231,7 @@ RPC method registration and implementation examples { ... // Check-in to make sure we are compliant with the YAML version in TS. - TSRPCProviderHandle rpcRegistrationInfo = TSRPCRegister("My plugin's info", "0.7.0"); + TSRPCProviderHandle rpcRegistrationInfo = TSRPCRegister("My plugin's info", "0.8.0"); if (rpcRegistrationInfo == nullptr) { TSError("[%s] RPC handler registration failed, yaml version not supported.", PLUGIN_NAME); } @@ -250,7 +250,7 @@ RPC method registration and implementation examples #include namespace { - static const std::string MY_YAML_VERSION{"0.7.0"}; + static const std::string MY_YAML_VERSION{"0.8.0"}; } int @@ -286,7 +286,7 @@ RPC method registration and implementation examples { // ... // Check-in to make sure we are compliant with the YAML version in TS. - TSRPCProviderHandle rpcRegistrationInfo = TSRPCRegister("My plugin's info", "0.7.0"); + TSRPCProviderHandle rpcRegistrationInfo = TSRPCRegister("My plugin's info", "0.8.0"); if (rpcRegistrationInfo == nullptr) { TSError("[%s] RPC handler registration failed, yaml version not supported.", PLUGIN_NAME); } diff --git a/lib/yamlcpp/BUILD.bazel b/lib/yamlcpp/BUILD.bazel index b0b90160672..23e847e772e 100644 --- a/lib/yamlcpp/BUILD.bazel +++ b/lib/yamlcpp/BUILD.bazel @@ -1,3 +1,9 @@ +yaml_cpp_defines = select({ + # On Windows, ensure static linking is used. + "@platforms//os:windows": ["YAML_CPP_STATIC_DEFINE", "YAML_CPP_NO_CONTRIB"], + "//conditions:default": [], +}) + cc_library( name = "yaml-cpp_internal", visibility = ["//:__subpackages__"], @@ -11,4 +17,5 @@ cc_library( includes = ["include"], hdrs = glob(["include/**/*.h"]), srcs = glob(["src/**/*.cpp", "src/**/*.h"]), + defines = yaml_cpp_defines, ) diff --git a/lib/yamlcpp/CMakeLists.txt b/lib/yamlcpp/CMakeLists.txt index 3092e64336a..2d26ed1faf3 100644 --- a/lib/yamlcpp/CMakeLists.txt +++ b/lib/yamlcpp/CMakeLists.txt @@ -7,7 +7,12 @@ if(POLICY CMP0091) cmake_policy(SET CMP0091 NEW) endif() -project(YAML_CPP VERSION 0.7.0 LANGUAGES CXX) +project(YAML_CPP VERSION 0.8.0 LANGUAGES CXX) + +set(YAML_CPP_MAIN_PROJECT OFF) +if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) + set(YAML_CPP_MAIN_PROJECT ON) +endif() include(CMakePackageConfigHelpers) include(CMakeDependentOption) @@ -15,27 +20,28 @@ include(CheckCXXCompilerFlag) include(GNUInstallDirs) include(CTest) -find_program(YAML_CPP_CLANG_FORMAT_EXE NAMES clang-format) - option(YAML_CPP_BUILD_CONTRIB "Enable yaml-cpp contrib in library" ON) option(YAML_CPP_BUILD_TOOLS "Enable parse tools" ON) option(YAML_BUILD_SHARED_LIBS "Build yaml-cpp shared library" ${BUILD_SHARED_LIBS}) - +option(YAML_CPP_INSTALL "Enable generation of yaml-cpp install targets" ${YAML_CPP_MAIN_PROJECT}) +option(YAML_CPP_FORMAT_SOURCE "Format source" ON) cmake_dependent_option(YAML_CPP_BUILD_TESTS - "Enable yaml-cpp tests" ON - "BUILD_TESTING;CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF) -cmake_dependent_option(YAML_CPP_INSTALL - "Enable generation of yaml-cpp install targets" ON - "CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF) + "Enable yaml-cpp tests" OFF + "BUILD_TESTING;YAML_CPP_MAIN_PROJECT" OFF) cmake_dependent_option(YAML_MSVC_SHARED_RT "MSVC: Build yaml-cpp with shared runtime libs (/MD)" ON - "MSVC" OFF) + "CMAKE_SYSTEM_NAME MATCHES Windows" OFF) + +if (YAML_CPP_FORMAT_SOURCE) + find_program(YAML_CPP_CLANG_FORMAT_EXE NAMES clang-format) +endif() -set(yaml-cpp-type STATIC) -set(yaml-cpp-label-postfix "static") if (YAML_BUILD_SHARED_LIBS) set(yaml-cpp-type SHARED) set(yaml-cpp-label-postfix "shared") +else() + set(yaml-cpp-type STATIC) + set(yaml-cpp-label-postfix "static") endif() set(build-shared $) @@ -78,6 +84,10 @@ set_property(TARGET yaml-cpp PROPERTY CXX_STANDARD_REQUIRED ON) +if (NOT YAML_BUILD_SHARED_LIBS) + set_property(TARGET yaml-cpp PROPERTY POSITION_INDEPENDENT_CODE ON) +endif() + target_include_directories(yaml-cpp PUBLIC $ @@ -91,11 +101,15 @@ if (NOT DEFINED CMAKE_CXX_STANDARD) CXX_STANDARD 11) endif() +if(YAML_CPP_MAIN_PROJECT) + target_compile_options(yaml-cpp + PRIVATE + $<${not-msvc}:-Wall -Wextra -Weffc++ -Wno-long-long> + $<${not-msvc}:-pedantic -pedantic-errors>) +endif() + target_compile_options(yaml-cpp PRIVATE - $<${not-msvc}:-Wall -Wextra -Weffc++ -Wno-long-long> - $<${not-msvc}:-pedantic -pedantic-errors> - $<$:-MTd> $<$:-MT> $<$:-MDd> @@ -108,6 +122,8 @@ target_compile_options(yaml-cpp $<$:/W3 /wd4127 /wd4355>) target_compile_definitions(yaml-cpp + PUBLIC + $<$>:YAML_CPP_STATIC_DEFINE> PRIVATE $<${build-windows-dll}:${PROJECT_NAME}_DLL> $<$>:YAML_CPP_NO_CONTRIB>) @@ -127,10 +143,14 @@ set_target_properties(yaml-cpp PROPERTIES PROJECT_LABEL "yaml-cpp ${yaml-cpp-label-postfix}" DEBUG_POSTFIX "${CMAKE_DEBUG_POSTFIX}") +set(CONFIG_EXPORT_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/yaml-cpp") +set(EXPORT_TARGETS yaml-cpp) configure_package_config_file( "${PROJECT_SOURCE_DIR}/yaml-cpp-config.cmake.in" "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake" - INSTALL_DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/yaml-cpp") + INSTALL_DESTINATION "${CONFIG_EXPORT_DIR}" + PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR CONFIG_EXPORT_DIR YAML_BUILD_SHARED_LIBS) +unset(EXPORT_TARGETS) write_basic_package_version_file( "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" @@ -139,36 +159,49 @@ write_basic_package_version_file( configure_file(yaml-cpp.pc.in yaml-cpp.pc @ONLY) if (YAML_CPP_INSTALL) - install(TARGETS yaml-cpp + install(TARGETS yaml-cpp EXPORT yaml-cpp-targets RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) - install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ + install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - FILES_MATCHING PATTERN "*.h") + FILES_MATCHING PATTERN "*.h") install(EXPORT yaml-cpp-targets - DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/yaml-cpp") - install(FILES - "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake" - "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" - DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/yaml-cpp") + NAMESPACE yaml-cpp:: + DESTINATION "${CONFIG_EXPORT_DIR}") + install(FILES + "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake" + "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" + DESTINATION "${CONFIG_EXPORT_DIR}") install(FILES "${PROJECT_BINARY_DIR}/yaml-cpp.pc" - DESTINATION ${CMAKE_INSTALL_DATADIR}/pkgconfig) + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) endif() +unset(CONFIG_EXPORT_DIR) if(YAML_CPP_BUILD_TESTS) - add_subdirectory(test) + add_subdirectory(test) endif() if(YAML_CPP_BUILD_TOOLS) - add_subdirectory(util) + add_subdirectory(util) endif() -if (YAML_CPP_CLANG_FORMAT_EXE) +if (YAML_CPP_FORMAT_SOURCE AND YAML_CPP_CLANG_FORMAT_EXE) add_custom_target(format COMMAND clang-format --style=file -i $ COMMAND_EXPAND_LISTS COMMENT "Running clang-format" VERBATIM) endif() + +# uninstall target +if(NOT TARGET uninstall) + configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + IMMEDIATE @ONLY) + + add_custom_target(uninstall + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) +endif() diff --git a/lib/yamlcpp/CONTRIBUTING.md b/lib/yamlcpp/CONTRIBUTING.md index cd09a1aca80..5705fe2bcf7 100644 --- a/lib/yamlcpp/CONTRIBUTING.md +++ b/lib/yamlcpp/CONTRIBUTING.md @@ -17,7 +17,7 @@ Commit messages should be in the imperative mood, as described in the [Git contr # Tests -Please verify the tests pass by running the target `tests/run_tests`. +Please verify the tests pass by running the target `test/yaml-cpp-tests`. If you are adding functionality, add tests accordingly. diff --git a/lib/yamlcpp/README.md b/lib/yamlcpp/README.md index 627d44125d2..70c231445d3 100644 --- a/lib/yamlcpp/README.md +++ b/lib/yamlcpp/README.md @@ -1,56 +1,52 @@ -# yaml-cpp [![Build Status](https://travis-ci.org/jbeder/yaml-cpp.svg?branch=master)](https://travis-ci.org/jbeder/yaml-cpp) [![Documentation](https://codedocs.xyz/jbeder/yaml-cpp.svg)](https://codedocs.xyz/jbeder/yaml-cpp/) +# yaml-cpp ![Build Status](https://github.com/jbeder/yaml-cpp/actions/workflows/build.yml/badge.svg) [![Documentation](https://codedocs.xyz/jbeder/yaml-cpp.svg)](https://codedocs.xyz/jbeder/yaml-cpp/) -yaml-cpp is a [YAML](http://www.yaml.org/) parser and emitter in C++ matching the [YAML 1.2 spec](http://www.yaml.org/spec/1.2/spec.html). +`yaml-cpp` is a [YAML](http://www.yaml.org/) parser and emitter in C++ matching the [YAML 1.2 spec](http://www.yaml.org/spec/1.2/spec.html). -To get a feel for how it can be used, see the [Tutorial](https://github.com/jbeder/yaml-cpp/wiki/Tutorial) or [How to Emit YAML](https://github.com/jbeder/yaml-cpp/wiki/How-To-Emit-YAML). For the old API (version < 0.5.0), see [How To Parse A Document](https://github.com/jbeder/yaml-cpp/wiki/How-To-Parse-A-Document-(Old-API)). +## Usage -# Problems? # +See [Tutorial](https://github.com/jbeder/yaml-cpp/wiki/Tutorial) and [How to Emit YAML](https://github.com/jbeder/yaml-cpp/wiki/How-To-Emit-YAML) for reference. For the old API (until 0.5.0), see [How To Parse A Document](https://github.com/jbeder/yaml-cpp/wiki/How-To-Parse-A-Document-(Old-API)). -If you find a bug, post an [issue](https://github.com/jbeder/yaml-cpp/issues)! If you have questions about how to use yaml-cpp, please post it on http://stackoverflow.com and tag it [`yaml-cpp`](http://stackoverflow.com/questions/tagged/yaml-cpp). +## Any Problems? -# How to Build # +If you find a bug, post an [issue](https://github.com/jbeder/yaml-cpp/issues)! If you have questions about how to use yaml-cpp, please post it on http://stackoverflow.com and tag it [`yaml-cpp`](http://stackoverflow.com/questions/tagged/yaml-cpp). -yaml-cpp uses [CMake](http://www.cmake.org) to support cross-platform building. The basic steps to build are: +## How to Build -1. Download and install [CMake](http://www.cmake.org) (Resources -> Download). +`yaml-cpp` uses [CMake](http://www.cmake.org) to support cross-platform building. Install [CMake](http://www.cmake.org) _(Resources -> Download)_ before proceeding. The basic steps to build are: -**Note:** If you don't use the provided installer for your platform, make sure that you add CMake's bin folder to your path. +**Note:** If you don't use the provided installer for your platform, make sure that you add `CMake`'s bin folder to your path. -2. Navigate into the source directory, and type: +#### 1. Navigate into the source directory, create build folder and run `CMake`: -``` +```sh mkdir build cd build +cmake [-G generator] [-DYAML_BUILD_SHARED_LIBS=on|OFF] .. ``` -3. Run CMake. The basic syntax is: - -``` -cmake [-G generator] [-DYAML_BUILD_SHARED_LIBS=ON|OFF] .. -``` - - * The `generator` is whatever type of build system you'd like to use. To see a full list of generators on your platform, just run `cmake` (with no arguments). For example: - * On Windows, you might use "Visual Studio 12 2013" to generate a Visual Studio 2013 solution or "Visual Studio 14 2015 Win64" to generate a 64-bit Visual Studio 2015 solution. - * On OS X, you might use "Xcode" to generate an Xcode project - * On a UNIX-y system, simply omit the option to generate a makefile + * The `generator` option is the build system you'd like to use. Run `cmake` without arguments to see a full list of available generators. + * On Windows, you might use "Visual Studio 12 2013" (VS 2013 32-bits), or "Visual Studio 14 2015 Win64" (VS 2015 64-bits). + * On OS X, you might use "Xcode". + * On a UNIX-like system, omit the option (for a Makefile). - * yaml-cpp defaults to building a static library, but you may build a shared library by specifying `-DYAML_BUILD_SHARED_LIBS=ON`. + * `yaml-cpp` builds a static library by default, you may want to build a shared library by specifying `-DYAML_BUILD_SHARED_LIBS=ON`. * For more options on customizing the build, see the [CMakeLists.txt](https://github.com/jbeder/yaml-cpp/blob/master/CMakeLists.txt) file. -4. Build it! +#### 2. Build it! + * The command you'll need to run depends on the generator you chose earlier. -5. To clean up, just remove the `build` directory. +**Note:** To clean up, just remove the `build` directory. -# Recent Release # +## Recent Releases -[yaml-cpp 0.6.0](https://github.com/jbeder/yaml-cpp/releases/tag/yaml-cpp-0.6.0) has been released! This release requires C++11, and no longer depends on Boost. +[yaml-cpp 0.6.0](https://github.com/jbeder/yaml-cpp/releases/tag/yaml-cpp-0.6.0) released! This release requires C++11, and no longer depends on Boost. [yaml-cpp 0.3.0](https://github.com/jbeder/yaml-cpp/releases/tag/release-0.3.0) is still available if you want the old API. **The old API will continue to be supported, and will still receive bugfixes!** The 0.3.x and 0.4.x versions will be old API releases, and 0.5.x and above will all be new API releases. -# API Documentation +# API Documentation The autogenerated API reference is hosted on [CodeDocs](https://codedocs.xyz/jbeder/yaml-cpp/index.html) @@ -59,3 +55,4 @@ The autogenerated API reference is hosted on [CodeDocs](https://codedocs.xyz/jbe The following projects are not officially supported: - [Qt wrapper](https://gist.github.com/brcha/d392b2fe5f1e427cc8a6) +- [UnrealEngine Wrapper](https://github.com/jwindgassen/UnrealYAML) diff --git a/lib/yamlcpp/SECURITY.md b/lib/yamlcpp/SECURITY.md new file mode 100644 index 00000000000..06a17511b95 --- /dev/null +++ b/lib/yamlcpp/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Supported Versions + +Security updates are applied only to the latest release. + +## Reporting a Vulnerability + +If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. + +Please disclose it at [security advisory](https://github.com/jbeder/yaml-cpp/security/advisories/new). + +This project is maintained by a team of volunteers on a reasonable-effort basis. As such, vulnerabilities will be disclosed in a best effort base. diff --git a/lib/yamlcpp/appveyor.yml b/lib/yamlcpp/appveyor.yml deleted file mode 100644 index 54bcc80c5ce..00000000000 --- a/lib/yamlcpp/appveyor.yml +++ /dev/null @@ -1,28 +0,0 @@ -version: 1.0.{build} - -environment: - matrix: - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - CMAKE_GENERATOR: Visual Studio 14 2015 - CMAKE_PLATFORM: win32 - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - CMAKE_GENERATOR: Visual Studio 14 2015 - CMAKE_PLATFORM: x64 - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - CMAKE_GENERATOR: Visual Studio 15 2017 - CMAKE_PLATFORM: win32 - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - CMAKE_GENERATOR: Visual Studio 15 2017 - CMAKE_PLATFORM: x64 - -before_build: - - cmd: mkdir build - - cmd: cd build - - cmd: cmake .. -G "%CMAKE_GENERATOR%" -DCMAKE_GENERATOR_PLATFORM=%CMAKE_PLATFORM% - - cmd: cd .. - -build_script: - - cmake --build build -test_script: - - cmd: cd build - - ctest diff --git a/lib/yamlcpp/cmake_uninstall.cmake.in b/lib/yamlcpp/cmake_uninstall.cmake.in new file mode 100644 index 00000000000..c2d34d4796d --- /dev/null +++ b/lib/yamlcpp/cmake_uninstall.cmake.in @@ -0,0 +1,21 @@ +if(NOT EXISTS "@CMAKE_BINARY_DIR@/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: @CMAKE_BINARY_DIR@/install_manifest.txt") +endif() + +file(READ "@CMAKE_BINARY_DIR@/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach(file ${files}) + message(STATUS "Uninstalling $ENV{DESTDIR}${file}") + if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + exec_program( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") + endif() + else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + message(STATUS "File $ENV{DESTDIR}${file} does not exist.") + endif() +endforeach() diff --git a/lib/yamlcpp/include/yaml-cpp/dll.h b/lib/yamlcpp/include/yaml-cpp/dll.h index a32c06b2e30..eabdda1d95c 100644 --- a/lib/yamlcpp/include/yaml-cpp/dll.h +++ b/lib/yamlcpp/include/yaml-cpp/dll.h @@ -1,33 +1,61 @@ #ifndef DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 -#if defined(_MSC_VER) || \ - (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \ - (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 -#pragma once +// Definition YAML_CPP_STATIC_DEFINE using to building YAML-CPP as static +// library (definition created by CMake or defined manually) + +// Definition yaml_cpp_EXPORTS using to building YAML-CPP as dll/so library +// (definition created by CMake or defined manually) + +#ifdef YAML_CPP_STATIC_DEFINE +# define YAML_CPP_API +# define YAML_CPP_NO_EXPORT +#else +# if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) +# ifndef YAML_CPP_API +# ifdef yaml_cpp_EXPORTS + /* We are building this library */ +# pragma message( "Defining YAML_CPP_API for DLL export" ) +# define YAML_CPP_API __declspec(dllexport) +# else + /* We are using this library */ +# pragma message( "Defining YAML_CPP_API for DLL import" ) +# define YAML_CPP_API __declspec(dllimport) +# endif +# endif +# ifndef YAML_CPP_NO_EXPORT +# define YAML_CPP_NO_EXPORT +# endif +# else /* No _MSC_VER */ +# ifndef YAML_CPP_API +# ifdef yaml_cpp_EXPORTS + /* We are building this library */ +# define YAML_CPP_API __attribute__((visibility("default"))) +# else + /* We are using this library */ +# define YAML_CPP_API __attribute__((visibility("default"))) +# endif +# endif +# ifndef YAML_CPP_NO_EXPORT +# define YAML_CPP_NO_EXPORT __attribute__((visibility("hidden"))) +# endif +# endif /* _MSC_VER */ +#endif /* YAML_CPP_STATIC_DEFINE */ + +#ifndef YAML_CPP_DEPRECATED +# ifdef _MSC_VER +# define YAML_CPP_DEPRECATED __declspec(deprecated) +# else +# define YAML_CPP_DEPRECATED __attribute__ ((__deprecated__)) +# endif #endif -// The following ifdef block is the standard way of creating macros which make -// exporting from a DLL simpler. All files within this DLL are compiled with the -// yaml_cpp_EXPORTS symbol defined on the command line. This symbol should not -// be defined on any project that uses this DLL. This way any other project -// whose source files include this file see YAML_CPP_API functions as being -// imported from a DLL, whereas this DLL sees symbols defined with this macro as -// being exported. -#undef YAML_CPP_API +#ifndef YAML_CPP_DEPRECATED_EXPORT +# define YAML_CPP_DEPRECATED_EXPORT YAML_CPP_API YAML_CPP_DEPRECATED +#endif -#ifdef YAML_CPP_DLL // Using or Building YAML-CPP DLL (definition defined - // manually) -#ifdef yaml_cpp_EXPORTS // Building YAML-CPP DLL (definition created by CMake - // or defined manually) -// #pragma message( "Defining YAML_CPP_API for DLL export" ) -#define YAML_CPP_API __declspec(dllexport) -#else // yaml_cpp_EXPORTS -// #pragma message( "Defining YAML_CPP_API for DLL import" ) -#define YAML_CPP_API __declspec(dllimport) -#endif // yaml_cpp_EXPORTS -#else // YAML_CPP_DLL -#define YAML_CPP_API -#endif // YAML_CPP_DLL +#ifndef YAML_CPP_DEPRECATED_NO_EXPORT +# define YAML_CPP_DEPRECATED_NO_EXPORT YAML_CPP_NO_EXPORT YAML_CPP_DEPRECATED +#endif -#endif // DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 +#endif /* DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 */ diff --git a/lib/yamlcpp/include/yaml-cpp/exceptions.h b/lib/yamlcpp/include/yaml-cpp/exceptions.h index c3f44747e2c..f6b2602ae1c 100644 --- a/lib/yamlcpp/include/yaml-cpp/exceptions.h +++ b/lib/yamlcpp/include/yaml-cpp/exceptions.h @@ -65,7 +65,7 @@ const char* const ZERO_INDENT_IN_BLOCK = const char* const CHAR_IN_BLOCK = "unexpected character in block scalar"; const char* const AMBIGUOUS_ANCHOR = "cannot assign the same alias to multiple nodes"; -const char* const UNKNOWN_ANCHOR = "the referenced anchor is not defined"; +const char* const UNKNOWN_ANCHOR = "the referenced anchor is not defined: "; const char* const INVALID_NODE = "invalid node; this may result from using a map iterator as a sequence " diff --git a/lib/yamlcpp/include/yaml-cpp/node/convert.h b/lib/yamlcpp/include/yaml-cpp/node/convert.h index 596898da60a..d0eb450f731 100644 --- a/lib/yamlcpp/include/yaml-cpp/node/convert.h +++ b/lib/yamlcpp/include/yaml-cpp/node/convert.h @@ -12,10 +12,16 @@ #include #include #include +#include #include #include +#include #include +#if __cplusplus >= 201703L +#include +#endif + #include "yaml-cpp/binary.h" #include "yaml-cpp/node/impl.h" #include "yaml-cpp/node/iterator.h" @@ -87,6 +93,20 @@ struct convert { static Node encode(const char* rhs) { return Node(rhs); } }; +#if __cplusplus >= 201703L +template <> +struct convert { + static Node encode(std::string_view rhs) { return Node(std::string(rhs)); } + + static bool decode(const Node& node, std::string_view& rhs) { + if (!node.IsScalar()) + return false; + rhs = node.Scalar(); + return true; + } +}; +#endif + template <> struct convert<_Null> { static Node encode(const _Null& /* rhs */) { return Node(); } @@ -127,7 +147,7 @@ ConvertStreamTo(std::stringstream& stream, T& rhs) { if ((stream >> std::noskipws >> num) && (stream >> std::ws).eof()) { if (num >= (std::numeric_limits::min)() && num <= (std::numeric_limits::max)()) { - rhs = (T)num; + rhs = static_cast(num); return true; } } @@ -251,6 +271,32 @@ struct convert> { } }; +// std::unordered_map +template +struct convert> { + static Node encode(const std::unordered_map& rhs) { + Node node(NodeType::Map); + for (const auto& element : rhs) + node.force_insert(element.first, element.second); + return node; + } + + static bool decode(const Node& node, std::unordered_map& rhs) { + if (!node.IsMap()) + return false; + + rhs.clear(); + for (const auto& element : node) +#if defined(__GNUC__) && __GNUC__ < 4 + // workaround for GCC 3: + rhs[element.first.template as()] = element.second.template as(); +#else + rhs[element.first.as()] = element.second.as(); +#endif + return true; + } +}; + // std::vector template struct convert> { @@ -336,6 +382,37 @@ struct convert> { } }; + +// std::valarray +template +struct convert> { + static Node encode(const std::valarray& rhs) { + Node node(NodeType::Sequence); + for (const auto& element : rhs) { + node.push_back(element); + } + return node; + } + + static bool decode(const Node& node, std::valarray& rhs) { + if (!node.IsSequence()) { + return false; + } + + rhs.resize(node.size()); + for (auto i = 0u; i < node.size(); ++i) { +#if defined(__GNUC__) && __GNUC__ < 4 + // workaround for GCC 3: + rhs[i] = node[i].template as(); +#else + rhs[i] = node[i].as(); +#endif + } + return true; + } +}; + + // std::pair template struct convert> { diff --git a/lib/yamlcpp/include/yaml-cpp/node/detail/node.h b/lib/yamlcpp/include/yaml-cpp/node/detail/node.h index b881c2c5ee9..acf60ffb6df 100644 --- a/lib/yamlcpp/include/yaml-cpp/node/detail/node.h +++ b/lib/yamlcpp/include/yaml-cpp/node/detail/node.h @@ -169,7 +169,7 @@ class node { using nodes = std::set; nodes m_dependencies; size_t m_index; - static std::atomic m_amount; + static YAML_CPP_API std::atomic m_amount; }; } // namespace detail } // namespace YAML diff --git a/lib/yamlcpp/include/yaml-cpp/node/impl.h b/lib/yamlcpp/include/yaml-cpp/node/impl.h index 97dc282d9c2..312281f18cc 100644 --- a/lib/yamlcpp/include/yaml-cpp/node/impl.h +++ b/lib/yamlcpp/include/yaml-cpp/node/impl.h @@ -42,7 +42,7 @@ inline Node::Node(const detail::iterator_value& rhs) m_pMemory(rhs.m_pMemory), m_pNode(rhs.m_pNode) {} -inline Node::Node(const Node& rhs) = default; +inline Node::Node(const Node&) = default; inline Node::Node(Zombie) : m_isValid(false), m_invalidKey{}, m_pMemory{}, m_pNode(nullptr) {} diff --git a/lib/yamlcpp/include/yaml-cpp/node/iterator.h b/lib/yamlcpp/include/yaml-cpp/node/iterator.h index b4472381792..1fcf6e400ff 100644 --- a/lib/yamlcpp/include/yaml-cpp/node/iterator.h +++ b/lib/yamlcpp/include/yaml-cpp/node/iterator.h @@ -15,6 +15,9 @@ #include #include +// Assert in place so gcc + libc++ combination properly builds +static_assert(std::is_constructible::value, "Node must be copy constructable"); + namespace YAML { namespace detail { struct iterator_value : public Node, std::pair { diff --git a/lib/yamlcpp/include/yaml-cpp/node/ptr.h b/lib/yamlcpp/include/yaml-cpp/node/ptr.h index 062d77ea0fa..f55d95ed9ca 100644 --- a/lib/yamlcpp/include/yaml-cpp/node/ptr.h +++ b/lib/yamlcpp/include/yaml-cpp/node/ptr.h @@ -7,7 +7,6 @@ #pragma once #endif -#include "yaml-cpp/dll.h" #include namespace YAML { diff --git a/lib/yamlcpp/include/yaml-cpp/traits.h b/lib/yamlcpp/include/yaml-cpp/traits.h index 9a62db257a8..ffe9999f191 100644 --- a/lib/yamlcpp/include/yaml-cpp/traits.h +++ b/lib/yamlcpp/include/yaml-cpp/traits.h @@ -107,9 +107,9 @@ struct disable_if : public disable_if_c {}; template struct is_streamable { - template + template static auto test(int) - -> decltype(std::declval() << std::declval(), std::true_type()); + -> decltype(std::declval() << std::declval(), std::true_type()); template static auto test(...) -> std::false_type; diff --git a/lib/yamlcpp/src/binary.cpp b/lib/yamlcpp/src/binary.cpp index 4311a2d063e..d27762a2436 100644 --- a/lib/yamlcpp/src/binary.cpp +++ b/lib/yamlcpp/src/binary.cpp @@ -75,11 +75,11 @@ std::vector DecodeBase64(const std::string &input) { unsigned value = 0; for (std::size_t i = 0, cnt = 0; i < input.size(); i++) { - if (std::isspace(input[i])) { + if (std::isspace(static_cast(input[i]))) { // skip newlines continue; } - unsigned char d = decoding[static_cast(input[i])]; + unsigned char d = decoding[static_cast(input[i])]; if (d == 255) return ret_type(); diff --git a/lib/yamlcpp/src/contrib/graphbuilderadapter.h b/lib/yamlcpp/src/contrib/graphbuilderadapter.h index 9078cdfdacd..c1cbcffdca1 100644 --- a/lib/yamlcpp/src/contrib/graphbuilderadapter.h +++ b/lib/yamlcpp/src/contrib/graphbuilderadapter.h @@ -13,7 +13,6 @@ #include "yaml-cpp/anchor.h" #include "yaml-cpp/contrib/anchordict.h" -#include "yaml-cpp/contrib/graphbuilder.h" #include "yaml-cpp/emitterstyle.h" #include "yaml-cpp/eventhandler.h" diff --git a/lib/yamlcpp/src/directives.cpp b/lib/yamlcpp/src/directives.cpp index f6e9587c6ea..4c1dc201d7f 100644 --- a/lib/yamlcpp/src/directives.cpp +++ b/lib/yamlcpp/src/directives.cpp @@ -3,7 +3,7 @@ namespace YAML { Directives::Directives() : version{true, 1, 2}, tags{} {} -const std::string Directives::TranslateTagHandle( +std::string Directives::TranslateTagHandle( const std::string& handle) const { auto it = tags.find(handle); if (it == tags.end()) { diff --git a/lib/yamlcpp/src/directives.h b/lib/yamlcpp/src/directives.h index 333af26e374..18d14c9c0b7 100644 --- a/lib/yamlcpp/src/directives.h +++ b/lib/yamlcpp/src/directives.h @@ -19,7 +19,7 @@ struct Version { struct Directives { Directives(); - const std::string TranslateTagHandle(const std::string& handle) const; + std::string TranslateTagHandle(const std::string& handle) const; Version version; std::map tags; diff --git a/lib/yamlcpp/src/emitter.cpp b/lib/yamlcpp/src/emitter.cpp index 644b3129b78..4d483075bde 100644 --- a/lib/yamlcpp/src/emitter.cpp +++ b/lib/yamlcpp/src/emitter.cpp @@ -533,7 +533,8 @@ void Emitter::BlockMapPrepareNode(EmitterNodeType::value child) { if (m_pState->GetMapKeyFormat() == LongKey) m_pState->SetLongKey(); if (child == EmitterNodeType::BlockSeq || - child == EmitterNodeType::BlockMap) + child == EmitterNodeType::BlockMap || + child == EmitterNodeType::Property) m_pState->SetLongKey(); if (m_pState->CurGroupLongKey()) diff --git a/lib/yamlcpp/src/emitterutils.cpp b/lib/yamlcpp/src/emitterutils.cpp index c6ad5e5d930..6cdf6de7e29 100644 --- a/lib/yamlcpp/src/emitterutils.cpp +++ b/lib/yamlcpp/src/emitterutils.cpp @@ -176,11 +176,11 @@ bool IsValidPlainScalar(const std::string& str, FlowType::value flowType, static const RegEx& disallowed_flow = Exp::EndScalarInFlow() | (Exp::BlankOrBreak() + Exp::Comment()) | Exp::NotPrintable() | Exp::Utf8_ByteOrderMark() | Exp::Break() | - Exp::Tab(); + Exp::Tab() | Exp::Ampersand(); static const RegEx& disallowed_block = Exp::EndScalar() | (Exp::BlankOrBreak() + Exp::Comment()) | Exp::NotPrintable() | Exp::Utf8_ByteOrderMark() | Exp::Break() | - Exp::Tab(); + Exp::Tab() | Exp::Ampersand(); const RegEx& disallowed = flowType == FlowType::Flow ? disallowed_flow : disallowed_block; diff --git a/lib/yamlcpp/src/exp.h b/lib/yamlcpp/src/exp.h index 301449e8f8e..c8837f0f825 100644 --- a/lib/yamlcpp/src/exp.h +++ b/lib/yamlcpp/src/exp.h @@ -37,7 +37,7 @@ inline const RegEx& Blank() { return e; } inline const RegEx& Break() { - static const RegEx e = RegEx('\n') | RegEx("\r\n"); + static const RegEx e = RegEx('\n') | RegEx("\r\n") | RegEx('\r'); return e; } inline const RegEx& BlankOrBreak() { @@ -117,6 +117,10 @@ inline const RegEx& ValueInJSONFlow() { static const RegEx e = RegEx(':'); return e; } +inline const RegEx& Ampersand() { + static const RegEx e = RegEx('&'); + return e; +} inline const RegEx Comment() { static const RegEx e = RegEx('#'); return e; diff --git a/lib/yamlcpp/src/node_data.cpp b/lib/yamlcpp/src/node_data.cpp index da2aefce94b..8f5422ae6e1 100644 --- a/lib/yamlcpp/src/node_data.cpp +++ b/lib/yamlcpp/src/node_data.cpp @@ -13,7 +13,7 @@ namespace YAML { namespace detail { -std::atomic node::m_amount{0}; +YAML_CPP_API std::atomic node::m_amount{0}; const std::string& node_data::empty_scalar() { static const std::string svalue; diff --git a/lib/yamlcpp/src/scanner.h b/lib/yamlcpp/src/scanner.h index c653ac69ff6..4af938e69c3 100644 --- a/lib/yamlcpp/src/scanner.h +++ b/lib/yamlcpp/src/scanner.h @@ -9,9 +9,7 @@ #include #include -#include #include -#include #include #include diff --git a/lib/yamlcpp/src/singledocparser.cpp b/lib/yamlcpp/src/singledocparser.cpp index 6bad448d901..22913d198c2 100644 --- a/lib/yamlcpp/src/singledocparser.cpp +++ b/lib/yamlcpp/src/singledocparser.cpp @@ -93,8 +93,8 @@ void SingleDocParser::HandleNode(EventHandler& eventHandler) { // add non-specific tags if (tag.empty()) tag = (token.type == Token::NON_PLAIN_SCALAR ? "!" : "?"); - - if (token.type == Token::PLAIN_SCALAR + + if (token.type == Token::PLAIN_SCALAR && tag.compare("?") == 0 && IsNullString(token.value)) { eventHandler.OnNull(mark, anchor); m_scanner.pop(); @@ -424,8 +424,11 @@ anchor_t SingleDocParser::RegisterAnchor(const std::string& name) { anchor_t SingleDocParser::LookupAnchor(const Mark& mark, const std::string& name) const { auto it = m_anchors.find(name); - if (it == m_anchors.end()) - throw ParserException(mark, ErrorMsg::UNKNOWN_ANCHOR); + if (it == m_anchors.end()) { + std::stringstream ss; + ss << ErrorMsg::UNKNOWN_ANCHOR << name; + throw ParserException(mark, ss.str()); + } return it->second; } diff --git a/lib/yamlcpp/src/tag.cpp b/lib/yamlcpp/src/tag.cpp index df8a2cf4613..35a1b465604 100644 --- a/lib/yamlcpp/src/tag.cpp +++ b/lib/yamlcpp/src/tag.cpp @@ -29,7 +29,7 @@ Tag::Tag(const Token& token) } } -const std::string Tag::Translate(const Directives& directives) { +std::string Tag::Translate(const Directives& directives) { switch (type) { case VERBATIM: return value; diff --git a/lib/yamlcpp/src/tag.h b/lib/yamlcpp/src/tag.h index ac30673b9e8..c811f395597 100644 --- a/lib/yamlcpp/src/tag.h +++ b/lib/yamlcpp/src/tag.h @@ -23,7 +23,7 @@ struct Tag { }; Tag(const Token& token); - const std::string Translate(const Directives& directives); + std::string Translate(const Directives& directives); TYPE type; std::string handle, value; diff --git a/lib/yamlcpp/test/CMakeLists.txt b/lib/yamlcpp/test/CMakeLists.txt index 5ebc1a6b34a..351b03f8109 100644 --- a/lib/yamlcpp/test/CMakeLists.txt +++ b/lib/yamlcpp/test/CMakeLists.txt @@ -5,10 +5,10 @@ set(BUILD_MOCK ON CACHE BOOL "" FORCE) set(CMAKE_POLICY_DEFAULT_CMP0048 NEW) add_subdirectory( - "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.10.0" + "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.11.0" "${CMAKE_CURRENT_BINARY_DIR}/prefix") -include_directories(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.10.0/googletest/include") +include_directories(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.11.0/googletest/include") set(test-new-api-pattern "new-api/*.cpp") set(test-source-pattern "*.cpp" "integration/*.cpp" "node/*.cpp") @@ -46,4 +46,11 @@ if (NOT DEFINED CMAKE_CXX_STANDARD) endif() -add_test(yaml-cpp::test yaml-cpp-tests) +add_test(NAME yaml-cpp::test COMMAND yaml-cpp-tests) + +if (build-windows-dll) + add_custom_command( + TARGET yaml-cpp-tests + POST_BUILD COMMAND ${CMAKE_COMMAND} -E + copy_if_different "$" "$") +endif() diff --git a/lib/yamlcpp/test/binary_test.cpp b/lib/yamlcpp/test/binary_test.cpp new file mode 100644 index 00000000000..7b17823f89f --- /dev/null +++ b/lib/yamlcpp/test/binary_test.cpp @@ -0,0 +1,14 @@ +#include "gtest/gtest.h" +#include + +TEST(BinaryTest, DecodingSimple) { + std::string input{90, 71, 86, 104, 90, 71, 74, 108, 90, 87, 89, 61}; + const std::vector &result = YAML::DecodeBase64(input); + EXPECT_EQ(std::string(result.begin(), result.end()), "deadbeef"); +} + +TEST(BinaryTest, DecodingNoCrashOnNegative) { + std::string input{-58, -1, -99, 109}; + const std::vector &result = YAML::DecodeBase64(input); + EXPECT_TRUE(result.empty()); +} diff --git a/lib/yamlcpp/test/create-emitter-tests.py b/lib/yamlcpp/test/create-emitter-tests.py index eb753791ec8..7295544f1be 100644 --- a/lib/yamlcpp/test/create-emitter-tests.py +++ b/lib/yamlcpp/test/create-emitter-tests.py @@ -133,7 +133,7 @@ def expand(template): for car in expand(template[:1]): for cdr in expand(template[1:]): yield car + cdr - + def gen_events(): for template in gen_templates(): @@ -153,7 +153,7 @@ class Writer(object): def __init__(self, out): self.out = out self.indent = 0 - + def writeln(self, s): self.out.write('%s%s\n' % (' ' * self.indent, s)) @@ -166,14 +166,14 @@ def __init__(self, writer, name, indent): def __enter__(self): self.writer.writeln('%s {' % self.name) self.writer.indent += self.indent - + def __exit__(self, type, value, traceback): self.writer.indent -= self.indent self.writer.writeln('}') def create_emitter_tests(out): out = Writer(out) - + includes = [ 'handler_test.h', 'yaml-cpp/yaml.h', diff --git a/lib/yamlcpp/test/integration/emitter_test.cpp b/lib/yamlcpp/test/integration/emitter_test.cpp index 0ddc67006dc..b277d571718 100644 --- a/lib/yamlcpp/test/integration/emitter_test.cpp +++ b/lib/yamlcpp/test/integration/emitter_test.cpp @@ -431,6 +431,38 @@ TEST_F(EmitterTest, BlockMapAsKey) { ExpectEmit("? key: value\n next key: next value\n: total value"); } +TEST_F(EmitterTest, TaggedBlockMapAsKey) { + out << BeginMap; + out << Key; + out << LocalTag("innerMap"); + out << BeginMap; + out << Key << "key" << Value << "value"; + out << EndMap; + out << Value; + out << "outerValue"; + out << EndMap; + + ExpectEmit(R"(? !innerMap + key: value +: outerValue)"); +} + +TEST_F(EmitterTest, TaggedBlockListAsKey) { + out << BeginMap; + out << Key; + out << LocalTag("innerList"); + out << BeginSeq; + out << "listItem"; + out << EndSeq; + out << Value; + out << "outerValue"; + out << EndMap; + + ExpectEmit(R"(? !innerList + - listItem +: outerValue)"); +} + TEST_F(EmitterTest, AliasAndAnchor) { out << BeginSeq; out << Anchor("fred"); @@ -520,7 +552,7 @@ TEST_F(EmitterTest, VerbatimTagInBlockMap) { out << Value << VerbatimTag("!waz") << "baz"; out << EndMap; - ExpectEmit("! bar: ! baz"); + ExpectEmit("? ! bar\n: ! baz"); } TEST_F(EmitterTest, VerbatimTagInFlowMap) { @@ -899,7 +931,7 @@ TEST_F(EmitterTest, Unicode) { TEST_F(EmitterTest, DoubleQuotedUnicode) { out << DoubleQuoted << "\x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2"; - ExpectEmit("\"\x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2\""); + ExpectEmit("\"\x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2\""); } TEST_F(EmitterTest, EscapedJsonString) { @@ -918,7 +950,7 @@ TEST_F(EmitterTest, EscapedJsonString) { } TEST_F(EmitterTest, EscapedCharacters) { - out << BeginSeq + out << BeginSeq << '\x00' << '\x0C' << '\x0D' @@ -968,6 +1000,14 @@ TEST_F(EmitterTest, UserType) { ExpectEmit("- x: 5\n bar: hello\n- x: 3\n bar: goodbye"); } +TEST_F(EmitterTest, UserType2) { + out << BeginSeq; + out << Foo(5, "\r"); + out << EndSeq; + + ExpectEmit("- x: 5\n bar: \"\\r\""); +} + TEST_F(EmitterTest, UserTypeInContainer) { std::vector fv; fv.push_back(Foo(5, "hello")); @@ -1398,7 +1438,7 @@ TEST_F(EmitterTest, NaN) { "bar: .nan"); } -TEST_F(EmitterTest, ComplexFlowSeqEmbeddingAMapWithNewLine) { +TEST_F(EmitterTest, ComplexFlowSeqEmbeddingAMapWithNewLine) { out << YAML::BeginMap; out << YAML::Key << "NodeA" << YAML::Value << YAML::BeginMap; @@ -1616,6 +1656,15 @@ TEST_F(EmitterTest, ComplexFlowSeqEmbeddingAMapUsingAliases3b) { k: [*k0, *k1])"); } +TEST_F(EmitterTest, AnchorEncoding) { + Node node; + node["--- &$ [*$]1"] = 1; + out << node; + ExpectEmit("\"--- &$ [*$]1\": 1"); + Node reparsed = YAML::Load(out.c_str()); + EXPECT_EQ(reparsed["--- &$ [*$]1"].as(), 1); +} + class EmitterErrorTest : public ::testing::Test { protected: void ExpectEmitError(const std::string& expectedError) { @@ -1686,5 +1735,6 @@ TEST_F(EmitterErrorTest, InvalidAlias) { ExpectEmitError(ErrorMsg::INVALID_ALIAS); } + } // namespace } // namespace YAML diff --git a/lib/yamlcpp/test/integration/error_messages_test.cpp b/lib/yamlcpp/test/integration/error_messages_test.cpp index 16d51c71040..64ab6b9e5e8 100644 --- a/lib/yamlcpp/test/integration/error_messages_test.cpp +++ b/lib/yamlcpp/test/integration/error_messages_test.cpp @@ -23,7 +23,7 @@ TEST(ErrorMessageTest, BadSubscriptErrorMessage) { // Test that printable key is part of error message EXPECT_THROW_EXCEPTION(YAML::BadSubscript, doc["first"]["second"]["fourth"], "operator[] call on a scalar (key: \"fourth\")"); - + EXPECT_THROW_EXCEPTION(YAML::BadSubscript, doc["first"]["second"][37], "operator[] call on a scalar (key: \"37\")"); @@ -47,15 +47,15 @@ TEST(ErrorMessageTest, Ex9_1_InvalidNodeErrorMessage) { // Test that printable key is part of error message EXPECT_THROW_EXCEPTION(YAML::InvalidNode, doc["first"]["fourth"].as(), "invalid node; first invalid key: \"fourth\""); - + EXPECT_THROW_EXCEPTION(YAML::InvalidNode, doc["first"][37].as(), "invalid node; first invalid key: \"37\""); - + // Non-printable key is not included in error message EXPECT_THROW_EXCEPTION(YAML::InvalidNode, doc["first"][std::vector()].as(), "invalid node; this may result from using a map " "iterator as a sequence iterator, or vice-versa"); } -} +} } diff --git a/lib/yamlcpp/test/integration/load_node_test.cpp b/lib/yamlcpp/test/integration/load_node_test.cpp index 958e7351218..9d0c790fd18 100644 --- a/lib/yamlcpp/test/integration/load_node_test.cpp +++ b/lib/yamlcpp/test/integration/load_node_test.cpp @@ -345,5 +345,20 @@ TEST(NodeTest, LoadTagWithNullScalar) { EXPECT_TRUE(node.IsNull()); } +TEST(LoadNodeTest, BlockCRNLEncoded) { + Node node = Load( + "blockText: |\r\n" + " some arbitrary text \r\n" + " spanning some \r\n" + " lines, that are split \r\n" + " by CR and NL\r\n" + "followup: 1"); + EXPECT_EQ( + "some arbitrary text \nspanning some \nlines, that are split \nby CR and " + "NL\n", + node["blockText"].as()); + EXPECT_EQ(1, node["followup"].as()); +} + } // namespace } // namespace YAML diff --git a/lib/yamlcpp/test/node/node_test.cpp b/lib/yamlcpp/test/node/node_test.cpp index 4f577c84619..5f41ef25560 100644 --- a/lib/yamlcpp/test/node/node_test.cpp +++ b/lib/yamlcpp/test/node/node_test.cpp @@ -40,6 +40,7 @@ class CustomAllocator : public std::allocator { template using CustomVector = std::vector>; template using CustomList = std::list>; template > using CustomMap = std::map>>; +template , class P=std::equal_to> using CustomUnorderedMap = std::unordered_map>>; } // anonymous namespace @@ -322,6 +323,47 @@ TEST(NodeTest, IteratorOnConstUndefinedNode) { } EXPECT_EQ(0, count); } + +TEST(NodeTest, InteratorOnSequence) { + Node node; + node[0] = "a"; + node[1] = "b"; + node[2] = "c"; + EXPECT_TRUE(node.IsSequence()); + + std::size_t count = 0; + for (iterator it = node.begin(); it != node.end(); ++it) + { + EXPECT_FALSE(it->IsNull()); + count++; + } + EXPECT_EQ(3, count); +} + +TEST(NodeTest, ConstInteratorOnSequence) { + Node node; + node[0] = "a"; + node[1] = "b"; + node[2] = "c"; + EXPECT_TRUE(node.IsSequence()); + + std::size_t count = 0; + for (const_iterator it = node.begin(); it != node.end(); ++it) + { + EXPECT_FALSE(it->IsNull()); + count++; + } + EXPECT_EQ(3, count); +} + +#if __cplusplus >= 201703L +TEST(NodeTest, StdStringViewAsKey) { + Node node; + std::string_view key = "username"; + node[key] = "monkey"; + EXPECT_EQ("monkey", node[key].as()); +} +#endif TEST(NodeTest, SimpleSubkeys) { Node node; @@ -351,6 +393,16 @@ TEST(NodeTest, StdArrayWrongSize) { (node["evens"].as>()), ErrorMsg::BAD_CONVERSION); } +TEST(NodeTest, StdValrray) { + std::valarray evens{{2, 4, 6, 8, 10}}; + Node node; + node["evens"] = evens; + std::valarray actualEvens = node["evens"].as>(); + for (int i = 0; i < evens.size(); ++i) { + EXPECT_EQ(evens[i], actualEvens[i]); + } +} + TEST(NodeTest, StdVector) { std::vector primes; primes.push_back(2); @@ -435,6 +487,34 @@ TEST(NodeTest, StdMapWithCustomAllocator) { EXPECT_EQ(squares, actualSquares); } +TEST(NodeTest, StdUnorderedMap) { + std::unordered_map squares; + squares[0] = 0; + squares[1] = 1; + squares[2] = 4; + squares[3] = 9; + squares[4] = 16; + + Node node; + node["squares"] = squares; + std::unordered_map actualSquares = node["squares"].as>(); + EXPECT_EQ(squares, actualSquares); +} + +TEST(NodeTest, StdUnorderedMapWithCustomAllocator) { + CustomUnorderedMap squares; + squares[0] = 0; + squares[1] = 1; + squares[2] = 4; + squares[3] = 9; + squares[4] = 16; + + Node node; + node["squares"] = squares; + CustomUnorderedMap actualSquares = node["squares"].as>(); + EXPECT_EQ(squares, actualSquares); +} + TEST(NodeTest, StdPair) { std::pair p; p.first = 5; diff --git a/lib/yamlcpp/util/parse.cpp b/lib/yamlcpp/util/parse.cpp index f3f0279ce5e..ea4295a67a0 100644 --- a/lib/yamlcpp/util/parse.cpp +++ b/lib/yamlcpp/util/parse.cpp @@ -5,19 +5,6 @@ #include "yaml-cpp/eventhandler.h" #include "yaml-cpp/yaml.h" // IWYU pragma: keep -struct Params { - bool hasFile; - std::string fileName; -}; - -Params ParseArgs(int argc, char** argv) { - Params p; - - std::vector args(argv + 1, argv + argc); - - return p; -} - class NullEventHandler : public YAML::EventHandler { public: void OnDocumentStart(const YAML::Mark&) override {} @@ -47,8 +34,6 @@ void parse(std::istream& input) { } int main(int argc, char** argv) { - Params p = ParseArgs(argc, argv); - if (argc > 1) { std::ifstream fin; fin.open(argv[1]); diff --git a/lib/yamlcpp/yaml-cpp-config.cmake.in b/lib/yamlcpp/yaml-cpp-config.cmake.in index 7b41e3f30cf..799b9b41806 100644 --- a/lib/yamlcpp/yaml-cpp-config.cmake.in +++ b/lib/yamlcpp/yaml-cpp-config.cmake.in @@ -1,14 +1,22 @@ # - Config file for the yaml-cpp package # It defines the following variables -# YAML_CPP_INCLUDE_DIR - include directory -# YAML_CPP_LIBRARIES - libraries to link against +# YAML_CPP_INCLUDE_DIR - include directory +# YAML_CPP_LIBRARY_DIR - directory containing libraries +# YAML_CPP_SHARED_LIBS_BUILT - whether we have built shared libraries or not +# YAML_CPP_LIBRARIES - libraries to link against -# Compute paths -get_filename_component(YAML_CPP_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -set(YAML_CPP_INCLUDE_DIR "@CONFIG_INCLUDE_DIRS@") +@PACKAGE_INIT@ + +set_and_check(YAML_CPP_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@") +set_and_check(YAML_CPP_LIBRARY_DIR "@PACKAGE_CMAKE_INSTALL_LIBDIR@") + +# Are we building shared libraries? +set(YAML_CPP_SHARED_LIBS_BUILT "@PACKAGE_YAML_BUILD_SHARED_LIBS@") # Our library dependencies (contains definitions for IMPORTED targets) -include("${YAML_CPP_CMAKE_DIR}/yaml-cpp-targets.cmake") +include(@PACKAGE_CONFIG_EXPORT_DIR@/yaml-cpp-targets.cmake) # These are IMPORTED targets created by yaml-cpp-targets.cmake set(YAML_CPP_LIBRARIES "@EXPORT_TARGETS@") + +check_required_components(@EXPORT_TARGETS@) diff --git a/lib/yamlcpp/yaml-cpp.pc.in b/lib/yamlcpp/yaml-cpp.pc.in index f713de636a1..d02dc9e5698 100644 --- a/lib/yamlcpp/yaml-cpp.pc.in +++ b/lib/yamlcpp/yaml-cpp.pc.in @@ -1,7 +1,7 @@ prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix} -includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ -libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ Name: Yaml-cpp Description: A YAML parser and emitter for C++ diff --git a/m4/yaml-cpp.m4 b/m4/yaml-cpp.m4 index 2f618f442a8..baf36fa8fab 100644 --- a/m4/yaml-cpp.m4 +++ b/m4/yaml-cpp.m4 @@ -82,7 +82,7 @@ fi AC_SUBST([YAMLCPP_INCLUDES]) AC_SUBST([YAMLCPP_LIBS]) AC_SUBST([YAMLCPP_LDFLAGS]) -AC_DEFINE([YAMLCPP_LIB_VERSION], ["0.7.0"], [yamlcpp library version]) +AC_DEFINE([YAMLCPP_LIB_VERSION], ["0.8.0"], [yamlcpp library version]) ]) diff --git a/tests/gold_tests/jsonrpc/plugins/jsonrpc_plugin_handler_test.cc b/tests/gold_tests/jsonrpc/plugins/jsonrpc_plugin_handler_test.cc index f90dee016ea..8a8dbe52bf2 100644 --- a/tests/gold_tests/jsonrpc/plugins/jsonrpc_plugin_handler_test.cc +++ b/tests/gold_tests/jsonrpc/plugins/jsonrpc_plugin_handler_test.cc @@ -38,7 +38,7 @@ namespace { constexpr char PLUGIN_NAME[] = "jsonrpc_plugin_handler_test"; -const std::string MY_YAML_VERSION{"0.7.0"}; +const std::string MY_YAML_VERSION{"0.8.0"}; const std::string RPC_PROVIDER_NAME{"RPC Plugin test"}; } // namespace diff --git a/tools/git/pre-commit b/tools/git/pre-commit index 701cecbee62..40a05119be6 100755 --- a/tools/git/pre-commit +++ b/tools/git/pre-commit @@ -56,7 +56,7 @@ autopep8_patch_file=$(mktemp -t autopep8.XXXXXXXXXX) trap "rm -f $clang_patch_file $autopep8_patch_file" 0 1 2 3 5 15 # Loop over all files that are changed, and produce a diff file -git diff-index --cached --diff-filter=ACMR --name-only HEAD | grep -vE "lib/(?:yamlcpp|swoc)" | while read file; do +git diff-index --cached --diff-filter=ACMR --name-only HEAD | grep -vE "lib/(yamlcpp|swoc)" | while read file; do case "$file" in *.cc | *.c | *.h | *.h.in) ${FORMAT} "$file" | diff -u "$file" - >>"$clang_patch_file"