From 9ee4c1db5294a7245920bbbf93e85aa47e646595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Fri, 13 Jul 2018 20:27:00 +0200 Subject: [PATCH] Allow disabling the implementation of the new output capture As it turns out, some platforms do not provide things like `dup`, or `std::tmpfile`, but they do provide streams... Closes #1335 Related to #1311 --- .../internal/catch_compiler_capabilities.h | 13 +++++++++ include/internal/catch_output_redirect.cpp | 29 ++++++++++++------- include/internal/catch_output_redirect.h | 3 ++ 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/include/internal/catch_compiler_capabilities.h b/include/internal/catch_compiler_capabilities.h index fa915be4..2276dd36 100644 --- a/include/internal/catch_compiler_capabilities.h +++ b/include/internal/catch_compiler_capabilities.h @@ -95,6 +95,12 @@ # define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH #endif +//////////////////////////////////////////////////////////////////////////////// +// PS4 +#if defined(__ORBIS__) +# define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE +#endif + //////////////////////////////////////////////////////////////////////////////// // Cygwin #ifdef __CYGWIN__ @@ -165,6 +171,13 @@ # define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS #endif +#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) +# define CATCH_INTERNAL_CONFIG_NEW_CAPTURE +#endif + +#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE) +# define CATCH_CONFIG_NEW_CAPTURE +#endif #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS diff --git a/include/internal/catch_output_redirect.cpp b/include/internal/catch_output_redirect.cpp index c43dca04..5965b7fc 100644 --- a/include/internal/catch_output_redirect.cpp +++ b/include/internal/catch_output_redirect.cpp @@ -15,15 +15,18 @@ #include #include -#if defined(_MSC_VER) -#include //_dup and _dup2 -#define dup _dup -#define dup2 _dup2 -#define fileno _fileno -#else -#include // dup and dup2 +#if defined(CATCH_CONFIG_NEW_CAPTURE) + #if defined(_MSC_VER) + #include //_dup and _dup2 + #define dup _dup + #define dup2 _dup2 + #define fileno _fileno + #else + #include // dup and dup2 + #endif #endif + namespace Catch { RedirectedStream::RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream ) @@ -48,6 +51,7 @@ namespace Catch { auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); } +#if defined(CATCH_CONFIG_NEW_CAPTURE) #if defined(_MSC_VER) TempFile::TempFile() { @@ -122,11 +126,14 @@ namespace Catch { m_stderrDest += m_stderrFile.getContents(); } +#endif // CATCH_CONFIG_NEW_CAPTURE } // namespace Catch -#if defined(_MSC_VER) -#undef dup -#undef dup2 -#undef fileno +#if defined(CATCH_CONFIG_NEW_CAPTURE) + #if defined(_MSC_VER) + #undef dup + #undef dup2 + #undef fileno + #endif #endif diff --git a/include/internal/catch_output_redirect.h b/include/internal/catch_output_redirect.h index f052bd2b..ac040405 100644 --- a/include/internal/catch_output_redirect.h +++ b/include/internal/catch_output_redirect.h @@ -47,6 +47,8 @@ namespace Catch { }; +#if defined(CATCH_CONFIG_NEW_CAPTURE) + // Windows's implementation of std::tmpfile is terrible (it tries // to create a file inside system folder, thus requiring elevated // privileges for the binary), so we have to use tmpnam(_s) and @@ -92,6 +94,7 @@ namespace Catch { std::string& m_stderrDest; }; +#endif } // end namespace Catch